Lines Matching refs:adc
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()
117 static void imx93_adc_power_up(struct imx93_adc *adc) in imx93_adc_power_up() argument
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
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
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()
245 mutex_lock(&adc->lock); in imx93_adc_read_raw()
246 ret = imx93_adc_read_channel_conversion(adc, chan->channel, val); in imx93_adc_read_raw()
247 mutex_unlock(&adc->lock); in imx93_adc_read_raw()
256 ret = vref_uv = regulator_get_voltage(adc->vref); in imx93_adc_read_raw()
264 *val = clk_get_rate(adc->ipg_clk); in imx93_adc_read_raw()
274 struct imx93_adc *adc = dev_id; in imx93_adc_isr() local
277 isr = readl(adc->regs + IMX93_ADC_ISR); in imx93_adc_isr()
281 writel(eoc, adc->regs + IMX93_ADC_ISR); in imx93_adc_isr()
282 complete(&adc->completion); in imx93_adc_isr()
287 writel(unexpected, adc->regs + IMX93_ADC_ISR); in imx93_adc_isr()
288 dev_err(adc->dev, "Unexpected interrupt 0x%08x.\n", unexpected); in imx93_adc_isr()
301 struct imx93_adc *adc; in imx93_adc_probe() local
306 indio_dev = devm_iio_device_alloc(dev, sizeof(*adc)); in imx93_adc_probe()
311 adc = iio_priv(indio_dev); in imx93_adc_probe()
312 adc->dev = dev; in imx93_adc_probe()
314 mutex_init(&adc->lock); in imx93_adc_probe()
315 adc->regs = devm_platform_ioremap_resource(pdev, 0); in imx93_adc_probe()
316 if (IS_ERR(adc->regs)) in imx93_adc_probe()
317 return dev_err_probe(dev, PTR_ERR(adc->regs), in imx93_adc_probe()
321 adc->irq = platform_get_irq(pdev, 2); in imx93_adc_probe()
322 if (adc->irq < 0) in imx93_adc_probe()
323 return adc->irq; in imx93_adc_probe()
325 adc->ipg_clk = devm_clk_get(dev, "ipg"); in imx93_adc_probe()
326 if (IS_ERR(adc->ipg_clk)) in imx93_adc_probe()
327 return dev_err_probe(dev, PTR_ERR(adc->ipg_clk), in imx93_adc_probe()
330 adc->vref = devm_regulator_get(dev, "vref"); in imx93_adc_probe()
331 if (IS_ERR(adc->vref)) in imx93_adc_probe()
332 return dev_err_probe(dev, PTR_ERR(adc->vref), in imx93_adc_probe()
335 ret = regulator_enable(adc->vref); in imx93_adc_probe()
342 init_completion(&adc->completion); in imx93_adc_probe()
350 ret = clk_prepare_enable(adc->ipg_clk); in imx93_adc_probe()
357 ret = request_irq(adc->irq, imx93_adc_isr, 0, IMX93_ADC_DRIVER_NAME, adc); in imx93_adc_probe()
360 "Failed requesting irq, irq = %d\n", adc->irq); in imx93_adc_probe()
364 ret = imx93_adc_calibration(adc); in imx93_adc_probe()
368 imx93_adc_config_ad_clk(adc); in imx93_adc_probe()
385 imx93_adc_power_down(adc); in imx93_adc_probe()
387 free_irq(adc->irq, adc); in imx93_adc_probe()
389 clk_disable_unprepare(adc->ipg_clk); in imx93_adc_probe()
391 regulator_disable(adc->vref); in imx93_adc_probe()
399 struct imx93_adc *adc = iio_priv(indio_dev); in imx93_adc_remove() local
400 struct device *dev = adc->dev; in imx93_adc_remove()
410 imx93_adc_power_down(adc); in imx93_adc_remove()
411 free_irq(adc->irq, adc); in imx93_adc_remove()
412 clk_disable_unprepare(adc->ipg_clk); in imx93_adc_remove()
413 regulator_disable(adc->vref); in imx93_adc_remove()
421 struct imx93_adc *adc = iio_priv(indio_dev); in imx93_adc_runtime_suspend() local
423 imx93_adc_power_down(adc); in imx93_adc_runtime_suspend()
424 clk_disable_unprepare(adc->ipg_clk); in imx93_adc_runtime_suspend()
425 regulator_disable(adc->vref); in imx93_adc_runtime_suspend()
433 struct imx93_adc *adc = iio_priv(indio_dev); in imx93_adc_runtime_resume() local
436 ret = regulator_enable(adc->vref); in imx93_adc_runtime_resume()
444 ret = clk_prepare_enable(adc->ipg_clk); in imx93_adc_runtime_resume()
450 imx93_adc_power_up(adc); in imx93_adc_runtime_resume()
455 regulator_disable(adc->vref); in imx93_adc_runtime_resume()