Lines Matching +full:imx7d +full:- +full:adc
2 * Freescale i.MX7D ADC driver
26 /* ADC register */
183 info->adc_feature.clk_pre_div = IMX7D_ADC_ANALOG_CLK_PRE_DIV_4; in imx7d_adc_feature_config()
184 info->adc_feature.avg_num = IMX7D_ADC_AVERAGE_NUM_32; in imx7d_adc_feature_config()
185 info->adc_feature.core_time_unit = 1; in imx7d_adc_feature_config()
186 info->adc_feature.average_en = true; in imx7d_adc_feature_config()
191 struct imx7d_adc_feature *adc_feature = &info->adc_feature; in imx7d_adc_sample_rate_set()
203 readl(info->regs + i * IMX7D_EACH_CHANNEL_REG_OFFSET); in imx7d_adc_sample_rate_set()
206 info->regs + i * IMX7D_EACH_CHANNEL_REG_OFFSET); in imx7d_adc_sample_rate_set()
209 adc_analogure_clk = imx7d_adc_analogue_clk[adc_feature->clk_pre_div]; in imx7d_adc_sample_rate_set()
211 info->pre_div_num = adc_analogure_clk.pre_div; in imx7d_adc_sample_rate_set()
213 sample_rate |= adc_feature->core_time_unit; in imx7d_adc_sample_rate_set()
214 writel(sample_rate, info->regs + IMX7D_REG_ADC_TIMER_UNIT); in imx7d_adc_sample_rate_set()
221 /* power up and enable adc analogue core */ in imx7d_adc_hw_init()
222 cfg = readl(info->regs + IMX7D_REG_ADC_ADC_CFG); in imx7d_adc_hw_init()
226 writel(cfg, info->regs + IMX7D_REG_ADC_ADC_CFG); in imx7d_adc_hw_init()
230 info->regs + IMX7D_REG_ADC_INT_SIG_EN); in imx7d_adc_hw_init()
232 info->regs + IMX7D_REG_ADC_INT_EN); in imx7d_adc_hw_init()
243 channel = info->channel; in imx7d_adc_channel_set()
248 if (info->adc_feature.average_en) in imx7d_adc_channel_set()
263 cfg2 = readl(info->regs + IMX7D_EACH_CHANNEL_REG_OFFSET * channel + in imx7d_adc_channel_set()
266 cfg2 |= imx7d_adc_average_num[info->adc_feature.avg_num]; in imx7d_adc_channel_set()
272 writel(cfg2, info->regs + IMX7D_EACH_CHANNEL_REG_OFFSET * channel + in imx7d_adc_channel_set()
274 writel(cfg1, info->regs + IMX7D_EACH_CHANNEL_REG_OFFSET * channel); in imx7d_adc_channel_set()
282 u32 core_time_unit = info->adc_feature.core_time_unit; in imx7d_adc_get_sample_rate()
285 analogue_core_clk = input_clk / info->pre_div_num; in imx7d_adc_get_sample_rate()
304 mutex_lock(&indio_dev->mlock); in imx7d_adc_read_raw()
305 reinit_completion(&info->completion); in imx7d_adc_read_raw()
307 channel = chan->channel & 0x03; in imx7d_adc_read_raw()
308 info->channel = channel; in imx7d_adc_read_raw()
312 (&info->completion, IMX7D_ADC_TIMEOUT); in imx7d_adc_read_raw()
314 mutex_unlock(&indio_dev->mlock); in imx7d_adc_read_raw()
315 return -ETIMEDOUT; in imx7d_adc_read_raw()
318 mutex_unlock(&indio_dev->mlock); in imx7d_adc_read_raw()
322 *val = info->value; in imx7d_adc_read_raw()
323 mutex_unlock(&indio_dev->mlock); in imx7d_adc_read_raw()
327 info->vref_uv = regulator_get_voltage(info->vref); in imx7d_adc_read_raw()
328 *val = info->vref_uv / 1000; in imx7d_adc_read_raw()
337 return -EINVAL; in imx7d_adc_read_raw()
346 channel = info->channel & 0x03; in imx7d_adc_read_data()
355 value = readl(info->regs + IMX7D_REG_ADC_CHA_B_CNV_RSLT); in imx7d_adc_read_data()
357 value = readl(info->regs + IMX7D_REG_ADC_CHC_D_CNV_RSLT); in imx7d_adc_read_data()
371 status = readl(info->regs + IMX7D_REG_ADC_INT_STATUS); in imx7d_adc_isr()
373 info->value = imx7d_adc_read_data(info); in imx7d_adc_isr()
374 complete(&info->completion); in imx7d_adc_isr()
383 writel(status, info->regs + IMX7D_REG_ADC_INT_STATUS); in imx7d_adc_isr()
391 pr_err("%s: ADC got conversion time out interrupt: 0x%08x\n", in imx7d_adc_isr()
392 dev_name(info->dev), status); in imx7d_adc_isr()
394 writel(status, info->regs + IMX7D_REG_ADC_INT_STATUS); in imx7d_adc_isr()
407 return -EINVAL; in imx7d_adc_reg_access()
409 *readval = readl(info->regs + reg); in imx7d_adc_reg_access()
420 { .compatible = "fsl,imx7d-adc", },
429 adc_cfg = readl(info->regs + IMX7D_REG_ADC_ADC_CFG); in imx7d_adc_power_down()
433 writel(adc_cfg, info->regs + IMX7D_REG_ADC_ADC_CFG); in imx7d_adc_power_down()
444 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info)); in imx7d_adc_probe()
446 dev_err(&pdev->dev, "Failed allocating iio device\n"); in imx7d_adc_probe()
447 return -ENOMEM; in imx7d_adc_probe()
451 info->dev = &pdev->dev; in imx7d_adc_probe()
454 info->regs = devm_ioremap_resource(&pdev->dev, mem); in imx7d_adc_probe()
455 if (IS_ERR(info->regs)) { in imx7d_adc_probe()
456 ret = PTR_ERR(info->regs); in imx7d_adc_probe()
457 dev_err(&pdev->dev, in imx7d_adc_probe()
458 "Failed to remap adc memory, err = %d\n", ret); in imx7d_adc_probe()
464 dev_err(&pdev->dev, "No irq resource?\n"); in imx7d_adc_probe()
468 info->clk = devm_clk_get(&pdev->dev, "adc"); in imx7d_adc_probe()
469 if (IS_ERR(info->clk)) { in imx7d_adc_probe()
470 ret = PTR_ERR(info->clk); in imx7d_adc_probe()
471 dev_err(&pdev->dev, "Failed getting clock, err = %d\n", ret); in imx7d_adc_probe()
475 info->vref = devm_regulator_get(&pdev->dev, "vref"); in imx7d_adc_probe()
476 if (IS_ERR(info->vref)) { in imx7d_adc_probe()
477 ret = PTR_ERR(info->vref); in imx7d_adc_probe()
478 dev_err(&pdev->dev, in imx7d_adc_probe()
483 ret = regulator_enable(info->vref); in imx7d_adc_probe()
485 dev_err(&pdev->dev, in imx7d_adc_probe()
486 "Can't enable adc reference top voltage, err = %d\n", in imx7d_adc_probe()
493 init_completion(&info->completion); in imx7d_adc_probe()
495 indio_dev->name = dev_name(&pdev->dev); in imx7d_adc_probe()
496 indio_dev->dev.parent = &pdev->dev; in imx7d_adc_probe()
497 indio_dev->info = &imx7d_adc_iio_info; in imx7d_adc_probe()
498 indio_dev->modes = INDIO_DIRECT_MODE; in imx7d_adc_probe()
499 indio_dev->channels = imx7d_adc_iio_channels; in imx7d_adc_probe()
500 indio_dev->num_channels = ARRAY_SIZE(imx7d_adc_iio_channels); in imx7d_adc_probe()
502 ret = clk_prepare_enable(info->clk); in imx7d_adc_probe()
504 dev_err(&pdev->dev, in imx7d_adc_probe()
509 ret = devm_request_irq(info->dev, irq, in imx7d_adc_probe()
511 dev_name(&pdev->dev), info); in imx7d_adc_probe()
513 dev_err(&pdev->dev, "Failed requesting irq, irq = %d\n", irq); in imx7d_adc_probe()
523 dev_err(&pdev->dev, "Couldn't register the device.\n"); in imx7d_adc_probe()
530 clk_disable_unprepare(info->clk); in imx7d_adc_probe()
532 regulator_disable(info->vref); in imx7d_adc_probe()
546 clk_disable_unprepare(info->clk); in imx7d_adc_remove()
547 regulator_disable(info->vref); in imx7d_adc_remove()
559 clk_disable_unprepare(info->clk); in imx7d_adc_suspend()
560 regulator_disable(info->vref); in imx7d_adc_suspend()
571 ret = regulator_enable(info->vref); in imx7d_adc_resume()
573 dev_err(info->dev, in imx7d_adc_resume()
574 "Can't enable adc reference top voltage, err = %d\n", in imx7d_adc_resume()
579 ret = clk_prepare_enable(info->clk); in imx7d_adc_resume()
581 dev_err(info->dev, in imx7d_adc_resume()
583 regulator_disable(info->vref); in imx7d_adc_resume()
607 MODULE_DESCRIPTION("Freescale IMX7D ADC driver");