Lines Matching +full:adc +full:- +full:chan

1 // SPDX-License-Identifier: GPL-2.0
3 * GPADC driver for sunxi platforms (D1, T113-S3 and R329)
18 #include <linux/iio/adc-helpers.h>
21 #define SUN20I_GPADC_DRIVER_NAME "sun20i-gpadc"
64 struct iio_chan_spec const *chan, int *val) in sun20i_gpadc_adc_read() argument
69 mutex_lock(&info->lock); in sun20i_gpadc_adc_read()
71 reinit_completion(&info->completion); in sun20i_gpadc_adc_read()
73 if (info->last_channel != chan->channel) { in sun20i_gpadc_adc_read()
74 info->last_channel = chan->channel; in sun20i_gpadc_adc_read()
77 writel(SUN20I_GPADC_CS_EN_ADC_CH(chan->channel), in sun20i_gpadc_adc_read()
78 info->regs + SUN20I_GPADC_CS_EN); in sun20i_gpadc_adc_read()
81 writel(SUN20I_GPADC_DATA_INTC_CH_DATA_IRQ_EN(chan->channel), in sun20i_gpadc_adc_read()
82 info->regs + SUN20I_GPADC_DATA_INTC); in sun20i_gpadc_adc_read()
85 /* enable the ADC function */ in sun20i_gpadc_adc_read()
86 ctrl = readl(info->regs + SUN20I_GPADC_CTRL); in sun20i_gpadc_adc_read()
88 writel(ctrl, info->regs + SUN20I_GPADC_CTRL); in sun20i_gpadc_adc_read()
97 if (!wait_for_completion_timeout(&info->completion, msecs_to_jiffies(10))) { in sun20i_gpadc_adc_read()
98 ret = -ETIMEDOUT; in sun20i_gpadc_adc_read()
102 /* read the ADC data */ in sun20i_gpadc_adc_read()
103 *val = readl(info->regs + SUN20I_GPADC_CH_DATA(chan->channel)); in sun20i_gpadc_adc_read()
106 mutex_unlock(&info->lock); in sun20i_gpadc_adc_read()
112 struct iio_chan_spec const *chan, int *val, in sun20i_gpadc_read_raw() argument
119 return sun20i_gpadc_adc_read(info, chan, val); in sun20i_gpadc_read_raw()
126 return -EINVAL; in sun20i_gpadc_read_raw()
135 writel(GENMASK(31, 0), info->regs + SUN20I_GPADC_DATA_INTS); in sun20i_gpadc_irq_handler()
137 complete(&info->completion); in sun20i_gpadc_irq_handler()
167 &sun20i_gpadc_chan_template, -1, &channels); in sun20i_gpadc_alloc_channels()
171 indio_dev->channels = channels; in sun20i_gpadc_alloc_channels()
172 indio_dev->num_channels = num_channels; in sun20i_gpadc_alloc_channels()
179 struct device *dev = &pdev->dev; in sun20i_gpadc_probe()
189 return -ENOMEM; in sun20i_gpadc_probe()
192 info->last_channel = -1; in sun20i_gpadc_probe()
194 mutex_init(&info->lock); in sun20i_gpadc_probe()
195 init_completion(&info->completion); in sun20i_gpadc_probe()
201 indio_dev->info = &sun20i_gpadc_iio_info; in sun20i_gpadc_probe()
202 indio_dev->name = SUN20I_GPADC_DRIVER_NAME; in sun20i_gpadc_probe()
204 info->regs = devm_platform_ioremap_resource(pdev, 0); in sun20i_gpadc_probe()
205 if (IS_ERR(info->regs)) in sun20i_gpadc_probe()
206 return PTR_ERR(info->regs); in sun20i_gpadc_probe()
235 info->regs + SUN20I_GPADC_CTRL); in sun20i_gpadc_probe()
245 { .compatible = "allwinner,sun20i-d1-gpadc" },
259 MODULE_DESCRIPTION("ADC driver for sunxi platforms");