Lines Matching +full:adc +full:- +full:clk
2 * ST SPEAr ADC driver
6 * Licensed under the GPL-2.
16 #include <linux/clk.h>
41 #define SPEAR_ADC_MOD_NAME "spear-adc"
52 u32 clk; /* Not avail for 1340 & 1310 */ member
65 u32 clk; member
77 struct clk *clk; member
87 * Functions to access some SPEAr ADC register. Abstracted into
93 __raw_writel(val, &st->adc_base_spear6xx->status); in spear_adc_set_status()
99 u32 apb_clk = clk_get_rate(st->clk); in spear_adc_set_clk()
103 clk_high = count - clk_low; in spear_adc_set_clk()
104 st->current_clk = apb_clk / count; in spear_adc_set_clk()
107 &st->adc_base_spear6xx->clk); in spear_adc_set_clk()
113 __raw_writel(val, &st->adc_base_spear6xx->ch_ctrl[n]); in spear_adc_set_ctrl()
118 if (of_device_is_compatible(st->np, "st,spear600-adc")) { in spear_adc_get_average()
119 return __raw_readl(&st->adc_base_spear6xx->average.msb) & in spear_adc_get_average()
122 return __raw_readl(&st->adc_base_spear3xx->average) & in spear_adc_get_average()
129 if (of_device_is_compatible(st->np, "st,spear600-adc")) { in spear_adc_set_scanrate()
131 &st->adc_base_spear6xx->scan_rate_lo); in spear_adc_set_scanrate()
133 &st->adc_base_spear6xx->scan_rate_hi); in spear_adc_set_scanrate()
135 __raw_writel(rate, &st->adc_base_spear3xx->scan_rate); in spear_adc_set_scanrate()
150 mutex_lock(&indio_dev->mlock); in spear_adc_read_raw()
152 status = SPEAR_ADC_STATUS_CHANNEL_NUM(chan->channel) | in spear_adc_read_raw()
153 SPEAR_ADC_STATUS_AVG_SAMPLE(st->avg_samples) | in spear_adc_read_raw()
156 if (st->vref_external == 0) in spear_adc_read_raw()
160 wait_for_completion(&st->completion); /* set by ISR */ in spear_adc_read_raw()
161 *val = st->value; in spear_adc_read_raw()
163 mutex_unlock(&indio_dev->mlock); in spear_adc_read_raw()
168 *val = st->vref_external; in spear_adc_read_raw()
172 *val = st->current_clk; in spear_adc_read_raw()
176 return -EINVAL; in spear_adc_read_raw()
189 return -EINVAL; in spear_adc_write_raw()
191 mutex_lock(&indio_dev->mlock); in spear_adc_write_raw()
196 ret = -EINVAL; in spear_adc_write_raw()
203 mutex_unlock(&indio_dev->mlock); in spear_adc_write_raw()
232 st->value = spear_adc_get_average(st); in spear_adc_isr()
233 complete(&st->completion); in spear_adc_isr()
242 /* Reset ADC core */ in spear_adc_configure()
244 __raw_writel(0, &st->adc_base_spear6xx->clk); in spear_adc_configure()
249 spear_adc_set_clk(st, st->sampling_freq); in spear_adc_configure()
261 struct device_node *np = pdev->dev.of_node; in spear_adc_probe()
262 struct device *dev = &pdev->dev; in spear_adc_probe()
266 int ret = -ENODEV; in spear_adc_probe()
272 return -ENOMEM; in spear_adc_probe()
276 st->np = np; in spear_adc_probe()
281 * to support multi-arch kernels. in spear_adc_probe()
284 st->adc_base_spear6xx = devm_ioremap_resource(&pdev->dev, res); in spear_adc_probe()
285 if (IS_ERR(st->adc_base_spear6xx)) in spear_adc_probe()
286 return PTR_ERR(st->adc_base_spear6xx); in spear_adc_probe()
288 st->adc_base_spear3xx = in spear_adc_probe()
289 (struct adc_regs_spear3xx __iomem *)st->adc_base_spear6xx; in spear_adc_probe()
291 st->clk = devm_clk_get(dev, NULL); in spear_adc_probe()
292 if (IS_ERR(st->clk)) { in spear_adc_probe()
294 return PTR_ERR(st->clk); in spear_adc_probe()
297 ret = clk_prepare_enable(st->clk); in spear_adc_probe()
306 ret = -EINVAL; in spear_adc_probe()
317 if (of_property_read_u32(np, "sampling-frequency", in spear_adc_probe()
318 &st->sampling_freq)) { in spear_adc_probe()
319 dev_err(dev, "sampling-frequency missing in DT\n"); in spear_adc_probe()
320 ret = -EINVAL; in spear_adc_probe()
328 of_property_read_u32(np, "average-samples", &st->avg_samples); in spear_adc_probe()
334 of_property_read_u32(np, "vref-external", &st->vref_external); in spear_adc_probe()
340 init_completion(&st->completion); in spear_adc_probe()
342 indio_dev->name = SPEAR_ADC_MOD_NAME; in spear_adc_probe()
343 indio_dev->dev.parent = dev; in spear_adc_probe()
344 indio_dev->info = &spear_adc_info; in spear_adc_probe()
345 indio_dev->modes = INDIO_DIRECT_MODE; in spear_adc_probe()
346 indio_dev->channels = spear_adc_iio_channels; in spear_adc_probe()
347 indio_dev->num_channels = ARRAY_SIZE(spear_adc_iio_channels); in spear_adc_probe()
353 dev_info(dev, "SPEAR ADC driver loaded, IRQ %d\n", irq); in spear_adc_probe()
358 clk_disable_unprepare(st->clk); in spear_adc_probe()
368 clk_disable_unprepare(st->clk); in spear_adc_remove()
375 { .compatible = "st,spear600-adc", },
393 MODULE_DESCRIPTION("SPEAr ADC driver");