• Home
  • Raw
  • Download

Lines Matching +full:adc +full:- +full:clk

2  * Copyright (C) 2014-2015 Pengutronix, Markus Pargmann <mpa@pengutronix.de>
9 #include <linux/clk.h>
15 #include <linux/mfd/imx25-tsadc.h>
38 regmap_read(tsadc->regs, MX25_TSC_TGSR, &status); in mx25_tsadc_irq_handler()
41 generic_handle_irq(irq_find_mapping(tsadc->domain, 1)); in mx25_tsadc_irq_handler()
44 generic_handle_irq(irq_find_mapping(tsadc->domain, 0)); in mx25_tsadc_irq_handler()
52 struct mx25_tsadc *tsadc = d->host_data; in mx25_tsadc_domain_map()
70 struct device *dev = &pdev->dev; in mx25_tsadc_setup_irq()
71 struct device_node *np = dev->of_node; in mx25_tsadc_setup_irq()
80 tsadc->domain = irq_domain_add_simple(np, 2, 0, &mx25_tsadc_domain_ops, in mx25_tsadc_setup_irq()
82 if (!tsadc->domain) { in mx25_tsadc_setup_irq()
84 return -ENOMEM; in mx25_tsadc_setup_irq()
98 * According to the datasheet the ADC clock should never in mx25_tsadc_setup_clk()
99 * exceed 1,75 MHz. Base clock is the IPG and the ADC unit uses in mx25_tsadc_setup_clk()
100 * a funny clock divider. To keep the ADC conversion time constant in mx25_tsadc_setup_clk()
101 * adapt the ADC internal clock divider to the IPG clock rate. in mx25_tsadc_setup_clk()
104 dev_dbg(&pdev->dev, "Found master clock at %lu Hz\n", in mx25_tsadc_setup_clk()
105 clk_get_rate(tsadc->clk)); in mx25_tsadc_setup_clk()
107 clk_div = DIV_ROUND_UP(clk_get_rate(tsadc->clk), 1750000); in mx25_tsadc_setup_clk()
108 dev_dbg(&pdev->dev, "Setting up ADC clock divider to %u\n", clk_div); in mx25_tsadc_setup_clk()
110 /* adc clock = IPG clock / (2 * div + 2) */ in mx25_tsadc_setup_clk()
111 clk_div -= 2; in mx25_tsadc_setup_clk()
115 * the ADC clock divider changes its behaviour when values below 4 in mx25_tsadc_setup_clk()
120 dev_dbg(&pdev->dev, "Resulting ADC conversion clock at %lu Hz\n", in mx25_tsadc_setup_clk()
121 clk_get_rate(tsadc->clk) / (2 * clk_div + 2)); in mx25_tsadc_setup_clk()
123 regmap_update_bits(tsadc->regs, MX25_TSC_TGCR, in mx25_tsadc_setup_clk()
130 struct device *dev = &pdev->dev; in mx25_tsadc_probe()
138 return -ENOMEM; in mx25_tsadc_probe()
145 tsadc->regs = devm_regmap_init_mmio(dev, iomem, in mx25_tsadc_probe()
147 if (IS_ERR(tsadc->regs)) { in mx25_tsadc_probe()
149 return PTR_ERR(tsadc->regs); in mx25_tsadc_probe()
152 tsadc->clk = devm_clk_get(dev, "ipg"); in mx25_tsadc_probe()
153 if (IS_ERR(tsadc->clk)) { in mx25_tsadc_probe()
155 return PTR_ERR(tsadc->clk); in mx25_tsadc_probe()
162 regmap_update_bits(tsadc->regs, MX25_TSC_TGCR, MX25_TGCR_CLK_EN, in mx25_tsadc_probe()
164 regmap_update_bits(tsadc->regs, MX25_TSC_TGCR, MX25_TGCR_TSC_RST, in mx25_tsadc_probe()
168 regmap_update_bits(tsadc->regs, MX25_TSC_TGCR, MX25_TGCR_POWERMODE_MASK, in mx25_tsadc_probe()
170 regmap_update_bits(tsadc->regs, MX25_TSC_TGCR, MX25_TGCR_INTREFEN, in mx25_tsadc_probe()
189 irq_domain_remove(tsadc->domain); in mx25_tsadc_remove()
196 { .compatible = "fsl,imx25-tsadc" },
203 .name = "mx25-tsadc",
211 MODULE_DESCRIPTION("MFD for ADC/TSC for Freescale mx25");
214 MODULE_ALIAS("platform:mx25-tsadc");