Lines Matching +full:imx7d +full:- +full:adc
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Freescale i.MX7D ADC driver
22 /* ADC register */
178 info->adc_feature.clk_pre_div = IMX7D_ADC_ANALOG_CLK_PRE_DIV_4; in imx7d_adc_feature_config()
179 info->adc_feature.avg_num = IMX7D_ADC_AVERAGE_NUM_32; in imx7d_adc_feature_config()
180 info->adc_feature.core_time_unit = 1; in imx7d_adc_feature_config()
185 struct imx7d_adc_feature *adc_feature = &info->adc_feature; in imx7d_adc_sample_rate_set()
197 readl(info->regs + i * IMX7D_EACH_CHANNEL_REG_OFFSET); in imx7d_adc_sample_rate_set()
200 info->regs + i * IMX7D_EACH_CHANNEL_REG_OFFSET); in imx7d_adc_sample_rate_set()
203 adc_analogure_clk = imx7d_adc_analogue_clk[adc_feature->clk_pre_div]; in imx7d_adc_sample_rate_set()
205 info->pre_div_num = adc_analogure_clk.pre_div; in imx7d_adc_sample_rate_set()
207 sample_rate |= adc_feature->core_time_unit; in imx7d_adc_sample_rate_set()
208 writel(sample_rate, info->regs + IMX7D_REG_ADC_TIMER_UNIT); in imx7d_adc_sample_rate_set()
215 /* power up and enable adc analogue core */ in imx7d_adc_hw_init()
216 cfg = readl(info->regs + IMX7D_REG_ADC_ADC_CFG); in imx7d_adc_hw_init()
220 writel(cfg, info->regs + IMX7D_REG_ADC_ADC_CFG); in imx7d_adc_hw_init()
224 info->regs + IMX7D_REG_ADC_INT_SIG_EN); in imx7d_adc_hw_init()
226 info->regs + IMX7D_REG_ADC_INT_EN); in imx7d_adc_hw_init()
237 channel = info->channel; in imx7d_adc_channel_set()
256 cfg2 = readl(info->regs + IMX7D_EACH_CHANNEL_REG_OFFSET * channel + in imx7d_adc_channel_set()
259 cfg2 |= imx7d_adc_average_num[info->adc_feature.avg_num]; in imx7d_adc_channel_set()
265 writel(cfg2, info->regs + IMX7D_EACH_CHANNEL_REG_OFFSET * channel + in imx7d_adc_channel_set()
267 writel(cfg1, info->regs + IMX7D_EACH_CHANNEL_REG_OFFSET * channel); in imx7d_adc_channel_set()
273 u32 core_time_unit = info->adc_feature.core_time_unit; in imx7d_adc_get_sample_rate()
276 analogue_core_clk = IMX7D_ADC_INPUT_CLK / info->pre_div_num; in imx7d_adc_get_sample_rate()
295 mutex_lock(&indio_dev->mlock); in imx7d_adc_read_raw()
296 reinit_completion(&info->completion); in imx7d_adc_read_raw()
298 channel = chan->channel & 0x03; in imx7d_adc_read_raw()
299 info->channel = channel; in imx7d_adc_read_raw()
303 (&info->completion, IMX7D_ADC_TIMEOUT); in imx7d_adc_read_raw()
305 mutex_unlock(&indio_dev->mlock); in imx7d_adc_read_raw()
306 return -ETIMEDOUT; in imx7d_adc_read_raw()
309 mutex_unlock(&indio_dev->mlock); in imx7d_adc_read_raw()
313 *val = info->value; in imx7d_adc_read_raw()
314 mutex_unlock(&indio_dev->mlock); in imx7d_adc_read_raw()
318 info->vref_uv = regulator_get_voltage(info->vref); in imx7d_adc_read_raw()
319 *val = info->vref_uv / 1000; in imx7d_adc_read_raw()
328 return -EINVAL; in imx7d_adc_read_raw()
337 channel = info->channel & 0x03; in imx7d_adc_read_data()
346 value = readl(info->regs + IMX7D_REG_ADC_CHA_B_CNV_RSLT); in imx7d_adc_read_data()
348 value = readl(info->regs + IMX7D_REG_ADC_CHC_D_CNV_RSLT); in imx7d_adc_read_data()
362 status = readl(info->regs + IMX7D_REG_ADC_INT_STATUS); in imx7d_adc_isr()
364 info->value = imx7d_adc_read_data(info); in imx7d_adc_isr()
365 complete(&info->completion); in imx7d_adc_isr()
374 writel(status, info->regs + IMX7D_REG_ADC_INT_STATUS); in imx7d_adc_isr()
382 dev_err(info->dev, in imx7d_adc_isr()
383 "ADC got conversion time out interrupt: 0x%08x\n", in imx7d_adc_isr()
386 writel(status, info->regs + IMX7D_REG_ADC_INT_STATUS); in imx7d_adc_isr()
399 return -EINVAL; in imx7d_adc_reg_access()
401 *readval = readl(info->regs + reg); in imx7d_adc_reg_access()
412 { .compatible = "fsl,imx7d-adc", },
421 adc_cfg = readl(info->regs + IMX7D_REG_ADC_ADC_CFG); in imx7d_adc_power_down()
425 writel(adc_cfg, info->regs + IMX7D_REG_ADC_ADC_CFG); in imx7d_adc_power_down()
434 ret = regulator_enable(info->vref); in imx7d_adc_enable()
436 dev_err(info->dev, in imx7d_adc_enable()
437 "Can't enable adc reference top voltage, err = %d\n", in imx7d_adc_enable()
442 ret = clk_prepare_enable(info->clk); in imx7d_adc_enable()
444 dev_err(info->dev, in imx7d_adc_enable()
446 regulator_disable(info->vref); in imx7d_adc_enable()
462 clk_disable_unprepare(info->clk); in imx7d_adc_disable()
463 regulator_disable(info->vref); in imx7d_adc_disable()
477 struct device *dev = &pdev->dev; in imx7d_adc_probe()
483 dev_err(&pdev->dev, "Failed allocating iio device\n"); in imx7d_adc_probe()
484 return -ENOMEM; in imx7d_adc_probe()
488 info->dev = dev; in imx7d_adc_probe()
490 info->regs = devm_platform_ioremap_resource(pdev, 0); in imx7d_adc_probe()
491 if (IS_ERR(info->regs)) in imx7d_adc_probe()
492 return PTR_ERR(info->regs); in imx7d_adc_probe()
498 info->clk = devm_clk_get(dev, "adc"); in imx7d_adc_probe()
499 if (IS_ERR(info->clk)) { in imx7d_adc_probe()
500 ret = PTR_ERR(info->clk); in imx7d_adc_probe()
505 info->vref = devm_regulator_get(dev, "vref"); in imx7d_adc_probe()
506 if (IS_ERR(info->vref)) { in imx7d_adc_probe()
507 ret = PTR_ERR(info->vref); in imx7d_adc_probe()
515 init_completion(&info->completion); in imx7d_adc_probe()
517 indio_dev->name = dev_name(dev); in imx7d_adc_probe()
518 indio_dev->info = &imx7d_adc_iio_info; in imx7d_adc_probe()
519 indio_dev->modes = INDIO_DIRECT_MODE; in imx7d_adc_probe()
520 indio_dev->channels = imx7d_adc_iio_channels; in imx7d_adc_probe()
521 indio_dev->num_channels = ARRAY_SIZE(imx7d_adc_iio_channels); in imx7d_adc_probe()
531 ret = imx7d_adc_enable(&indio_dev->dev); in imx7d_adc_probe()
536 &indio_dev->dev); in imx7d_adc_probe()
542 dev_err(&pdev->dev, "Couldn't register the device.\n"); in imx7d_adc_probe()
563 MODULE_DESCRIPTION("Freescale IMX7D ADC driver");