Lines Matching full:adc

3  * NXP i.MX93 ADC driver
22 #define IMX93_ADC_DRIVER_NAME "imx93-adc"
42 /* ADC bit shift */
61 /* ADC status */
98 static void imx93_adc_power_down(struct imx93_adc *adc) in imx93_adc_power_down() argument
103 mcr = readl(adc->regs + IMX93_ADC_MCR); in imx93_adc_power_down()
105 writel(mcr, adc->regs + IMX93_ADC_MCR); in imx93_adc_power_down()
107 ret = readl_poll_timeout(adc->regs + IMX93_ADC_MSR, msr, in imx93_adc_power_down()
112 dev_warn(adc->dev, in imx93_adc_power_down()
113 "ADC do not in power down mode, current MSR is %x\n", in imx93_adc_power_down()
117 static void imx93_adc_power_up(struct imx93_adc *adc) in imx93_adc_power_up() argument
121 /* bring ADC out of power down state, in idle state */ in imx93_adc_power_up()
122 mcr = readl(adc->regs + IMX93_ADC_MCR); in imx93_adc_power_up()
124 writel(mcr, adc->regs + IMX93_ADC_MCR); in imx93_adc_power_up()
127 static void imx93_adc_config_ad_clk(struct imx93_adc *adc) in imx93_adc_config_ad_clk() argument
131 /* put adc in power down mode */ in imx93_adc_config_ad_clk()
132 imx93_adc_power_down(adc); in imx93_adc_config_ad_clk()
135 mcr = readl(adc->regs + IMX93_ADC_MCR); in imx93_adc_config_ad_clk()
137 writel(mcr, adc->regs + IMX93_ADC_MCR); in imx93_adc_config_ad_clk()
139 imx93_adc_power_up(adc); in imx93_adc_config_ad_clk()
142 static int imx93_adc_calibration(struct imx93_adc *adc) in imx93_adc_calibration() argument
147 /* make sure ADC in power down mode */ in imx93_adc_calibration()
148 imx93_adc_power_down(adc); in imx93_adc_calibration()
151 mcr = readl(adc->regs + IMX93_ADC_MCR); in imx93_adc_calibration()
153 writel(mcr, adc->regs + IMX93_ADC_MCR); in imx93_adc_calibration()
155 imx93_adc_power_up(adc); in imx93_adc_calibration()
163 mcr = readl(adc->regs + IMX93_ADC_MCR); in imx93_adc_calibration()
165 writel(mcr, adc->regs + IMX93_ADC_MCR); in imx93_adc_calibration()
168 ret = readl_poll_timeout(adc->regs + IMX93_ADC_MSR, msr, in imx93_adc_calibration()
171 dev_warn(adc->dev, "ADC do not finish calibration in 2 min!\n"); in imx93_adc_calibration()
172 imx93_adc_power_down(adc); in imx93_adc_calibration()
177 msr = readl(adc->regs + IMX93_ADC_MSR); in imx93_adc_calibration()
179 dev_warn(adc->dev, "ADC calibration failed!\n"); in imx93_adc_calibration()
180 imx93_adc_power_down(adc); in imx93_adc_calibration()
187 static int imx93_adc_read_channel_conversion(struct imx93_adc *adc, in imx93_adc_read_channel_conversion() argument
195 reinit_completion(&adc->completion); in imx93_adc_read_channel_conversion()
199 writel(channel, adc->regs + IMX93_ADC_NCMR0); in imx93_adc_read_channel_conversion()
205 writel(imr, adc->regs + IMX93_ADC_IMR); in imx93_adc_read_channel_conversion()
206 writel(channel, adc->regs + IMX93_ADC_CIMR0); in imx93_adc_read_channel_conversion()
209 mcr = readl(adc->regs + IMX93_ADC_MCR); in imx93_adc_read_channel_conversion()
211 writel(mcr, adc->regs + IMX93_ADC_MCR); in imx93_adc_read_channel_conversion()
214 mcr = readl(adc->regs + IMX93_ADC_MCR); in imx93_adc_read_channel_conversion()
216 writel(mcr, adc->regs + IMX93_ADC_MCR); in imx93_adc_read_channel_conversion()
218 ret = wait_for_completion_interruptible_timeout(&adc->completion, in imx93_adc_read_channel_conversion()
226 pcda = readl(adc->regs + IMX93_ADC_PCDR0 + channel_number * 4); in imx93_adc_read_channel_conversion()
237 struct imx93_adc *adc = iio_priv(indio_dev); in imx93_adc_read_raw() local
238 struct device *dev = adc->dev; in imx93_adc_read_raw()
244 mutex_lock(&adc->lock); in imx93_adc_read_raw()
245 ret = imx93_adc_read_channel_conversion(adc, chan->channel, val); in imx93_adc_read_raw()
246 mutex_unlock(&adc->lock); in imx93_adc_read_raw()
255 ret = regulator_get_voltage(adc->vref); in imx93_adc_read_raw()
263 *val = clk_get_rate(adc->ipg_clk); in imx93_adc_read_raw()
273 struct imx93_adc *adc = dev_id; in imx93_adc_isr() local
276 isr = readl(adc->regs + IMX93_ADC_ISR); in imx93_adc_isr()
280 writel(eoc, adc->regs + IMX93_ADC_ISR); in imx93_adc_isr()
281 complete(&adc->completion); in imx93_adc_isr()
286 writel(unexpected, adc->regs + IMX93_ADC_ISR); in imx93_adc_isr()
287 dev_err(adc->dev, "Unexpected interrupt 0x%08x.\n", unexpected); in imx93_adc_isr()
300 struct imx93_adc *adc; in imx93_adc_probe() local
305 indio_dev = devm_iio_device_alloc(dev, sizeof(*adc)); in imx93_adc_probe()
310 adc = iio_priv(indio_dev); in imx93_adc_probe()
311 adc->dev = dev; in imx93_adc_probe()
313 mutex_init(&adc->lock); in imx93_adc_probe()
314 adc->regs = devm_platform_ioremap_resource(pdev, 0); in imx93_adc_probe()
315 if (IS_ERR(adc->regs)) in imx93_adc_probe()
316 return dev_err_probe(dev, PTR_ERR(adc->regs), in imx93_adc_probe()
319 /* The third irq is for ADC conversion usage */ in imx93_adc_probe()
320 adc->irq = platform_get_irq(pdev, 2); in imx93_adc_probe()
321 if (adc->irq < 0) in imx93_adc_probe()
322 return adc->irq; in imx93_adc_probe()
324 adc->ipg_clk = devm_clk_get(dev, "ipg"); in imx93_adc_probe()
325 if (IS_ERR(adc->ipg_clk)) in imx93_adc_probe()
326 return dev_err_probe(dev, PTR_ERR(adc->ipg_clk), in imx93_adc_probe()
329 adc->vref = devm_regulator_get(dev, "vref"); in imx93_adc_probe()
330 if (IS_ERR(adc->vref)) in imx93_adc_probe()
331 return dev_err_probe(dev, PTR_ERR(adc->vref), in imx93_adc_probe()
334 ret = regulator_enable(adc->vref); in imx93_adc_probe()
341 init_completion(&adc->completion); in imx93_adc_probe()
343 indio_dev->name = "imx93-adc"; in imx93_adc_probe()
349 ret = clk_prepare_enable(adc->ipg_clk); in imx93_adc_probe()
356 ret = request_irq(adc->irq, imx93_adc_isr, 0, IMX93_ADC_DRIVER_NAME, adc); in imx93_adc_probe()
359 "Failed requesting irq, irq = %d\n", adc->irq); in imx93_adc_probe()
363 ret = imx93_adc_calibration(adc); in imx93_adc_probe()
367 imx93_adc_config_ad_clk(adc); in imx93_adc_probe()
384 imx93_adc_power_down(adc); in imx93_adc_probe()
386 free_irq(adc->irq, adc); in imx93_adc_probe()
388 clk_disable_unprepare(adc->ipg_clk); in imx93_adc_probe()
390 regulator_disable(adc->vref); in imx93_adc_probe()
398 struct imx93_adc *adc = iio_priv(indio_dev); in imx93_adc_remove() local
399 struct device *dev = adc->dev; in imx93_adc_remove()
401 /* adc power down need clock on */ in imx93_adc_remove()
409 imx93_adc_power_down(adc); in imx93_adc_remove()
410 free_irq(adc->irq, adc); in imx93_adc_remove()
411 clk_disable_unprepare(adc->ipg_clk); in imx93_adc_remove()
412 regulator_disable(adc->vref); in imx93_adc_remove()
420 struct imx93_adc *adc = iio_priv(indio_dev); in imx93_adc_runtime_suspend() local
422 imx93_adc_power_down(adc); in imx93_adc_runtime_suspend()
423 clk_disable_unprepare(adc->ipg_clk); in imx93_adc_runtime_suspend()
424 regulator_disable(adc->vref); in imx93_adc_runtime_suspend()
432 struct imx93_adc *adc = iio_priv(indio_dev); in imx93_adc_runtime_resume() local
435 ret = regulator_enable(adc->vref); in imx93_adc_runtime_resume()
438 "Can't enable adc reference top voltage, err = %d\n", in imx93_adc_runtime_resume()
443 ret = clk_prepare_enable(adc->ipg_clk); in imx93_adc_runtime_resume()
449 imx93_adc_power_up(adc); in imx93_adc_runtime_resume()
454 regulator_disable(adc->vref); in imx93_adc_runtime_resume()
464 { .compatible = "nxp,imx93-adc", },
481 MODULE_DESCRIPTION("NXP i.MX93 ADC driver");