Lines Matching full:adc
7 #include <linux/iio/adc-helpers.h>
49 static void rzt2h_adc_start(struct rzt2h_adc *adc, unsigned int conversion_type) in rzt2h_adc_start() argument
53 reg = readw(adc->base + RZT2H_ADCSR_REG); in rzt2h_adc_start()
61 writew(reg, adc->base + RZT2H_ADCSR_REG); in rzt2h_adc_start()
64 static void rzt2h_adc_stop(struct rzt2h_adc *adc) in rzt2h_adc_stop() argument
68 reg = readw(adc->base + RZT2H_ADCSR_REG); in rzt2h_adc_stop()
73 writew(reg, adc->base + RZT2H_ADCSR_REG); in rzt2h_adc_stop()
76 static int rzt2h_adc_read_single(struct rzt2h_adc *adc, unsigned int ch, int *val) in rzt2h_adc_read_single() argument
80 ret = pm_runtime_resume_and_get(adc->dev); in rzt2h_adc_read_single()
84 mutex_lock(&adc->lock); in rzt2h_adc_read_single()
86 reinit_completion(&adc->completion); in rzt2h_adc_read_single()
89 writew(RZT2H_ADANSA0_CH_MASK(ch), adc->base + RZT2H_ADANSA0_REG); in rzt2h_adc_read_single()
91 rzt2h_adc_start(adc, RZT2H_ADCSR_ADCS_SINGLE); in rzt2h_adc_read_single()
97 ret = wait_for_completion_timeout(&adc->completion, usecs_to_jiffies(1)); in rzt2h_adc_read_single()
103 *val = readw(adc->base + RZT2H_ADDR_REG(ch)); in rzt2h_adc_read_single()
107 rzt2h_adc_stop(adc); in rzt2h_adc_read_single()
109 mutex_unlock(&adc->lock); in rzt2h_adc_read_single()
111 pm_runtime_put_autosuspend(adc->dev); in rzt2h_adc_read_single()
116 static void rzt2h_adc_set_cal(struct rzt2h_adc *adc, bool cal) in rzt2h_adc_set_cal() argument
120 val = readw(adc->base + RZT2H_ADCALCTL_REG); in rzt2h_adc_set_cal()
126 writew(val, adc->base + RZT2H_ADCALCTL_REG); in rzt2h_adc_set_cal()
129 static int rzt2h_adc_calibrate(struct rzt2h_adc *adc) in rzt2h_adc_calibrate() argument
134 rzt2h_adc_set_cal(adc, true); in rzt2h_adc_calibrate()
137 200, 1000, true, adc->base + RZT2H_ADCALCTL_REG); in rzt2h_adc_calibrate()
139 dev_err(adc->dev, "Calibration timed out: %d\n", ret); in rzt2h_adc_calibrate()
143 rzt2h_adc_set_cal(adc, false); in rzt2h_adc_calibrate()
146 dev_err(adc->dev, "Calibration failed\n"); in rzt2h_adc_calibrate()
157 struct rzt2h_adc *adc = iio_priv(indio_dev); in rzt2h_adc_read_raw() local
161 return rzt2h_adc_read_single(adc, chan->channel, val); in rzt2h_adc_read_raw()
177 struct rzt2h_adc *adc = private; in rzt2h_adc_isr() local
179 complete(&adc->completion); in rzt2h_adc_isr()
191 static int rzt2h_adc_parse_properties(struct rzt2h_adc *adc) in rzt2h_adc_parse_properties() argument
197 ret = devm_iio_adc_device_alloc_chaninfo_se(adc->dev, in rzt2h_adc_parse_properties()
202 return dev_err_probe(adc->dev, ret, "Failed to read channel info"); in rzt2h_adc_parse_properties()
204 adc->num_channels = ret; in rzt2h_adc_parse_properties()
205 adc->channels = chan_array; in rzt2h_adc_parse_properties()
207 for (i = 0; i < adc->num_channels; i++) in rzt2h_adc_parse_properties()
208 if (chan_array[i].channel + 1 > adc->max_channels) in rzt2h_adc_parse_properties()
209 adc->max_channels = chan_array[i].channel + 1; in rzt2h_adc_parse_properties()
218 struct rzt2h_adc *adc; in rzt2h_adc_probe() local
221 indio_dev = devm_iio_device_alloc(dev, sizeof(*adc)); in rzt2h_adc_probe()
225 adc = iio_priv(indio_dev); in rzt2h_adc_probe()
226 adc->dev = dev; in rzt2h_adc_probe()
227 init_completion(&adc->completion); in rzt2h_adc_probe()
229 ret = devm_mutex_init(dev, &adc->lock); in rzt2h_adc_probe()
233 platform_set_drvdata(pdev, adc); in rzt2h_adc_probe()
235 ret = rzt2h_adc_parse_properties(adc); in rzt2h_adc_probe()
239 adc->base = devm_platform_ioremap_resource(pdev, 0); in rzt2h_adc_probe()
240 if (IS_ERR(adc->base)) in rzt2h_adc_probe()
241 return PTR_ERR(adc->base); in rzt2h_adc_probe()
253 ret = devm_request_irq(dev, irq, rzt2h_adc_isr, 0, dev_name(dev), adc); in rzt2h_adc_probe()
257 indio_dev->name = "rzt2h-adc"; in rzt2h_adc_probe()
260 indio_dev->channels = adc->channels; in rzt2h_adc_probe()
261 indio_dev->num_channels = adc->num_channels; in rzt2h_adc_probe()
267 { .compatible = "renesas,r9a09g077-adc" },
274 struct rzt2h_adc *adc = dev_get_drvdata(dev); in rzt2h_adc_pm_runtime_resume() local
283 return rzt2h_adc_calibrate(adc); in rzt2h_adc_pm_runtime_resume()
293 .name = "rzt2h-adc",
302 MODULE_DESCRIPTION("Renesas RZ/T2H / RZ/N2H ADC driver");