Lines Matching +full:adc +full:- +full:clk
2 * Driver for ADC module on the Cirrus Logic EP93xx series of SoCs
17 #include <linux/clk.h>
30 * lower ADC conversion rate down to CONFIG_HZ, so we fallback to busy wait
33 * HR Timers-based version loads CPU only up to 10% during back to back ADC
34 * conversion, while busy wait-based version consumes whole CPU power.
48 struct clk *clk; member
91 mutex_lock(&priv->lock); in ep93xx_read_raw()
92 if (priv->lastch != channel->channel) { in ep93xx_read_raw()
93 priv->lastch = channel->channel; in ep93xx_read_raw()
95 * Switch register is software-locked, unlocking must be in ep93xx_read_raw()
99 writel_relaxed(0xAA, priv->base + EP93XX_ADC_SW_LOCK); in ep93xx_read_raw()
100 writel_relaxed(channel->address, in ep93xx_read_raw()
101 priv->base + EP93XX_ADC_SWITCH); in ep93xx_read_raw()
110 readl_relaxed(priv->base + EP93XX_ADC_RESULT); in ep93xx_read_raw()
120 t = readl_relaxed(priv->base + EP93XX_ADC_RESULT); in ep93xx_read_raw()
127 dev_err(&iiodev->dev, "Conversion timeout\n"); in ep93xx_read_raw()
128 ret = -ETIMEDOUT; in ep93xx_read_raw()
134 mutex_unlock(&priv->lock); in ep93xx_read_raw()
138 /* According to datasheet, range is -25000..25000 */ in ep93xx_read_raw()
149 return -EINVAL; in ep93xx_read_raw()
161 struct clk *pclk; in ep93xx_adc_probe()
164 iiodev = devm_iio_device_alloc(&pdev->dev, sizeof(*priv)); in ep93xx_adc_probe()
166 return -ENOMEM; in ep93xx_adc_probe()
170 priv->base = devm_ioremap_resource(&pdev->dev, res); in ep93xx_adc_probe()
171 if (IS_ERR(priv->base)) { in ep93xx_adc_probe()
172 dev_err(&pdev->dev, "Cannot map memory resource\n"); in ep93xx_adc_probe()
173 return PTR_ERR(priv->base); in ep93xx_adc_probe()
176 iiodev->dev.parent = &pdev->dev; in ep93xx_adc_probe()
177 iiodev->name = dev_name(&pdev->dev); in ep93xx_adc_probe()
178 iiodev->modes = INDIO_DIRECT_MODE; in ep93xx_adc_probe()
179 iiodev->info = &ep93xx_adc_info; in ep93xx_adc_probe()
180 iiodev->num_channels = ARRAY_SIZE(ep93xx_adc_channels); in ep93xx_adc_probe()
181 iiodev->channels = ep93xx_adc_channels; in ep93xx_adc_probe()
183 priv->lastch = -1; in ep93xx_adc_probe()
184 mutex_init(&priv->lock); in ep93xx_adc_probe()
188 priv->clk = devm_clk_get(&pdev->dev, NULL); in ep93xx_adc_probe()
189 if (IS_ERR(priv->clk)) { in ep93xx_adc_probe()
190 dev_err(&pdev->dev, "Cannot obtain clock\n"); in ep93xx_adc_probe()
191 return PTR_ERR(priv->clk); in ep93xx_adc_probe()
194 pclk = clk_get_parent(priv->clk); in ep93xx_adc_probe()
196 dev_warn(&pdev->dev, "Cannot obtain parent clock\n"); in ep93xx_adc_probe()
200 * EP93xx ADC supports two clock divisors -- 4 and 16, in ep93xx_adc_probe()
205 ret = clk_set_rate(priv->clk, clk_get_rate(pclk) / 16); in ep93xx_adc_probe()
207 dev_warn(&pdev->dev, "Cannot set clock rate\n"); in ep93xx_adc_probe()
214 ret = clk_enable(priv->clk); in ep93xx_adc_probe()
216 dev_err(&pdev->dev, "Cannot enable clock\n"); in ep93xx_adc_probe()
222 clk_disable(priv->clk); in ep93xx_adc_probe()
233 clk_disable(priv->clk); in ep93xx_adc_remove()
240 .name = "ep93xx-adc",
248 MODULE_DESCRIPTION("Cirrus Logic EP93XX ADC driver");
250 MODULE_ALIAS("platform:ep93xx-adc");