Lines Matching +full:rst +full:- +full:ctrl
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"
66 u32 ctrl; in sun20i_gpadc_adc_read() local
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()
86 ctrl = readl(info->regs + SUN20I_GPADC_CTRL); in sun20i_gpadc_adc_read()
87 ctrl |= FIELD_PREP(SUN20I_GPADC_CTRL_ADC_EN_MASK, 1); 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()
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()
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()
148 struct reset_control *rst = data; in sun20i_gpadc_reset_assert() local
150 reset_control_assert(rst); in sun20i_gpadc_reset_assert()
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()
182 struct reset_control *rst; in sun20i_gpadc_probe() local
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()
212 rst = devm_reset_control_get_exclusive(dev, NULL); in sun20i_gpadc_probe()
213 if (IS_ERR(rst)) in sun20i_gpadc_probe()
214 return dev_err_probe(dev, PTR_ERR(rst), "failed to get reset control\n"); in sun20i_gpadc_probe()
216 ret = reset_control_deassert(rst); in sun20i_gpadc_probe()
220 ret = devm_add_action_or_reset(dev, sun20i_gpadc_reset_assert, rst); in sun20i_gpadc_probe()
235 info->regs + SUN20I_GPADC_CTRL); in sun20i_gpadc_probe()
245 { .compatible = "allwinner,sun20i-d1-gpadc" },