Lines Matching +full:vf610 +full:- +full:adc

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Freescale Vybrid vf610 ADC driver
31 #define DRIVER_NAME "vf610-adc"
33 /* Vybrid/IMX ADC registers */
189 struct vf610_adc_feature *adc_feature = &info->adc_feature; in vf610_adc_calculate_rates()
190 unsigned long adck_rate, ipg_rate = clk_get_rate(info->clk); in vf610_adc_calculate_rates()
194 adck_rate = info->max_adck_rate[adc_feature->conv_mode]; in vf610_adc_calculate_rates()
199 adc_feature->clk_div = 1 << fls(divisor + 1); in vf610_adc_calculate_rates()
201 /* fall-back value using a safe divisor */ in vf610_adc_calculate_rates()
202 adc_feature->clk_div = 8; in vf610_adc_calculate_rates()
205 adck_rate = ipg_rate / adc_feature->clk_div; in vf610_adc_calculate_rates()
212 lst_addr_min = adc_feature->default_sample_time / adck_period; in vf610_adc_calculate_rates()
215 adc_feature->lst_adder_index = i; in vf610_adc_calculate_rates()
221 * Calculate ADC sample frequencies in vf610_adc_calculate_rates()
225 * ADC conversion time = SFCAdder + AverageNum x (BCT + LSTAdder) in vf610_adc_calculate_rates()
232 info->sample_freq_avail[i] = in vf610_adc_calculate_rates()
234 (25 + vf610_lst_adder[adc_feature->lst_adder_index])); in vf610_adc_calculate_rates()
239 struct vf610_adc_feature *adc_feature = &info->adc_feature; in vf610_adc_cfg_init()
241 /* set default Configuration for ADC controller */ in vf610_adc_cfg_init()
242 adc_feature->clk_sel = VF610_ADCIOC_BUSCLK_SET; in vf610_adc_cfg_init()
243 adc_feature->vol_ref = VF610_ADCIOC_VR_VREF_SET; in vf610_adc_cfg_init()
245 adc_feature->calibration = true; in vf610_adc_cfg_init()
246 adc_feature->ovwren = true; in vf610_adc_cfg_init()
248 adc_feature->res_mode = 12; in vf610_adc_cfg_init()
249 adc_feature->sample_rate = 1; in vf610_adc_cfg_init()
251 adc_feature->conv_mode = VF610_ADC_CONV_LOW_POWER; in vf610_adc_cfg_init()
258 struct vf610_adc_feature *adc_feature = &info->adc_feature; in vf610_adc_cfg_post_set()
262 switch (adc_feature->clk_sel) { in vf610_adc_cfg_post_set()
280 switch (adc_feature->vol_ref) { in vf610_adc_cfg_post_set()
290 dev_err(info->dev, "error voltage reference\n"); in vf610_adc_cfg_post_set()
294 if (adc_feature->ovwren) in vf610_adc_cfg_post_set()
297 writel(cfg_data, info->regs + VF610_REG_ADC_CFG); in vf610_adc_cfg_post_set()
298 writel(gc_data, info->regs + VF610_REG_ADC_GC); in vf610_adc_cfg_post_set()
305 if (!info->adc_feature.calibration) in vf610_adc_calibration()
310 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_adc_calibration()
312 adc_gc = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_calibration()
313 writel(adc_gc | VF610_ADC_CAL, info->regs + VF610_REG_ADC_GC); in vf610_adc_calibration()
315 if (!wait_for_completion_timeout(&info->completion, VF610_ADC_TIMEOUT)) in vf610_adc_calibration()
316 dev_err(info->dev, "Timeout for adc calibration\n"); in vf610_adc_calibration()
318 adc_gc = readl(info->regs + VF610_REG_ADC_GS); in vf610_adc_calibration()
320 dev_err(info->dev, "ADC calibration failed\n"); in vf610_adc_calibration()
322 info->adc_feature.calibration = false; in vf610_adc_calibration()
327 struct vf610_adc_feature *adc_feature = &(info->adc_feature); in vf610_adc_cfg_set()
330 cfg_data = readl(info->regs + VF610_REG_ADC_CFG); in vf610_adc_cfg_set()
333 if (adc_feature->conv_mode == VF610_ADC_CONV_LOW_POWER) in vf610_adc_cfg_set()
337 if (adc_feature->conv_mode == VF610_ADC_CONV_HIGH_SPEED) in vf610_adc_cfg_set()
340 writel(cfg_data, info->regs + VF610_REG_ADC_CFG); in vf610_adc_cfg_set()
345 struct vf610_adc_feature *adc_feature = &(info->adc_feature); in vf610_adc_sample_set()
348 cfg_data = readl(info->regs + VF610_REG_ADC_CFG); in vf610_adc_sample_set()
349 gc_data = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_sample_set()
353 switch (adc_feature->res_mode) { in vf610_adc_sample_set()
364 dev_err(info->dev, "error resolution mode\n"); in vf610_adc_sample_set()
370 switch (adc_feature->clk_div) { in vf610_adc_sample_set()
383 switch (adc_feature->clk_sel) { in vf610_adc_sample_set()
388 dev_err(info->dev, "error clk divider\n"); in vf610_adc_sample_set()
398 switch (adc_feature->lst_adder_index) { in vf610_adc_sample_set()
426 dev_err(info->dev, "error in sample time select\n"); in vf610_adc_sample_set()
432 switch (adc_feature->sample_rate) { in vf610_adc_sample_set()
451 dev_err(info->dev, in vf610_adc_sample_set()
455 writel(cfg_data, info->regs + VF610_REG_ADC_CFG); in vf610_adc_sample_set()
456 writel(gc_data, info->regs + VF610_REG_ADC_GC); in vf610_adc_sample_set()
465 /* adc calibration */ in vf610_adc_hw_init()
478 mutex_lock(&info->lock); in vf610_set_conversion_mode()
479 info->adc_feature.conv_mode = mode; in vf610_set_conversion_mode()
482 mutex_unlock(&info->lock); in vf610_set_conversion_mode()
492 return info->adc_feature.conv_mode; in vf610_get_conversion_mode()
495 static const char * const vf610_conv_modes[] = { "normal", "high-speed",
496 "low-power" };
564 result = readl(info->regs + VF610_REG_ADC_R0); in vf610_adc_read_data()
566 switch (info->adc_feature.res_mode) { in vf610_adc_read_data()
589 coco = readl(info->regs + VF610_REG_ADC_HS); in vf610_adc_isr()
591 info->value = vf610_adc_read_data(info); in vf610_adc_isr()
593 info->scan.chan = info->value; in vf610_adc_isr()
595 &info->scan, in vf610_adc_isr()
597 iio_trigger_notify_done(indio_dev->trig); in vf610_adc_isr()
599 complete(&info->completion); in vf610_adc_isr()
612 for (i = 0; i < ARRAY_SIZE(info->sample_freq_avail); i++) in vf610_show_samp_freq_avail()
613 len += scnprintf(buf + len, PAGE_SIZE - len, in vf610_show_samp_freq_avail()
614 "%u ", info->sample_freq_avail[i]); in vf610_show_samp_freq_avail()
617 buf[len - 1] = '\n'; in vf610_show_samp_freq_avail()
644 mutex_lock(&info->lock); in vf610_read_sample()
645 reinit_completion(&info->completion); in vf610_read_sample()
646 hc_cfg = VF610_ADC_ADCHC(chan->channel); in vf610_read_sample()
648 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_read_sample()
649 ret = wait_for_completion_interruptible_timeout(&info->completion, in vf610_read_sample()
652 ret = -ETIMEDOUT; in vf610_read_sample()
659 switch (chan->type) { in vf610_read_sample()
661 *val = info->value; in vf610_read_sample()
669 *val = 25000 - ((int)info->value - VF610_VTEMP25_3V3) * in vf610_read_sample()
674 ret = -EINVAL; in vf610_read_sample()
679 mutex_unlock(&info->lock); in vf610_read_sample()
704 *val = info->vref_uv / 1000; in vf610_read_raw()
705 *val2 = info->adc_feature.res_mode; in vf610_read_raw()
709 *val = info->sample_freq_avail[info->adc_feature.sample_rate]; in vf610_read_raw()
717 return -EINVAL; in vf610_read_raw()
732 i < ARRAY_SIZE(info->sample_freq_avail); in vf610_write_raw()
734 if (val == info->sample_freq_avail[i]) { in vf610_write_raw()
735 info->adc_feature.sample_rate = i; in vf610_write_raw()
745 return -EINVAL; in vf610_write_raw()
754 val = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_postenable()
756 writel(val, info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_postenable()
758 channel = find_first_bit(indio_dev->active_scan_mask, in vf610_adc_buffer_postenable()
764 writel(val, info->regs + VF610_REG_ADC_HC0); in vf610_adc_buffer_postenable()
775 val = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_predisable()
777 writel(val, info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_predisable()
782 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_adc_buffer_predisable()
801 return -EINVAL; in vf610_adc_reg_access()
803 *readval = readl(info->regs + reg); in vf610_adc_reg_access()
824 { .compatible = "fsl,imx6sx-adc", .data = &imx6sx_chip_info},
825 { .compatible = "fsl,vf610-adc", .data = &vf610_chip_info},
834 regulator_disable(info->vref); in vf610_adc_action_remove()
840 struct device *dev = &pdev->dev; in vf610_adc_probe()
846 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(struct vf610_adc)); in vf610_adc_probe()
848 return dev_err_probe(&pdev->dev, -ENOMEM, "Failed allocating iio device\n"); in vf610_adc_probe()
851 info->dev = &pdev->dev; in vf610_adc_probe()
853 info->regs = devm_platform_ioremap_resource(pdev, 0); in vf610_adc_probe()
854 if (IS_ERR(info->regs)) in vf610_adc_probe()
855 return PTR_ERR(info->regs); in vf610_adc_probe()
863 ret = devm_request_irq(info->dev, irq, in vf610_adc_probe()
865 dev_name(&pdev->dev), indio_dev); in vf610_adc_probe()
867 return dev_err_probe(&pdev->dev, ret, "failed requesting irq, irq = %d\n", irq); in vf610_adc_probe()
869 info->clk = devm_clk_get_enabled(&pdev->dev, "adc"); in vf610_adc_probe()
870 if (IS_ERR(info->clk)) in vf610_adc_probe()
871 return dev_err_probe(&pdev->dev, PTR_ERR(info->clk), "failed getting clock\n"); in vf610_adc_probe()
873 info->vref = devm_regulator_get(&pdev->dev, "vref"); in vf610_adc_probe()
874 if (IS_ERR(info->vref)) in vf610_adc_probe()
875 return PTR_ERR(info->vref); in vf610_adc_probe()
877 ret = regulator_enable(info->vref); in vf610_adc_probe()
881 ret = devm_add_action_or_reset(&pdev->dev, vf610_adc_action_remove, info); in vf610_adc_probe()
885 info->vref_uv = regulator_get_voltage(info->vref); in vf610_adc_probe()
887 device_property_read_u32_array(dev, "fsl,adck-max-frequency", info->max_adck_rate, 3); in vf610_adc_probe()
889 info->adc_feature.default_sample_time = DEFAULT_SAMPLE_TIME; in vf610_adc_probe()
890 device_property_read_u32(dev, "min-sample-time", &info->adc_feature.default_sample_time); in vf610_adc_probe()
894 init_completion(&info->completion); in vf610_adc_probe()
896 indio_dev->name = dev_name(&pdev->dev); in vf610_adc_probe()
897 indio_dev->info = &vf610_adc_iio_info; in vf610_adc_probe()
898 indio_dev->modes = INDIO_DIRECT_MODE; in vf610_adc_probe()
899 indio_dev->channels = vf610_adc_iio_channels; in vf610_adc_probe()
900 indio_dev->num_channels = chip_info->num_channels; in vf610_adc_probe()
905 ret = devm_iio_triggered_buffer_setup(&pdev->dev, indio_dev, &iio_pollfunc_store_time, in vf610_adc_probe()
908 return dev_err_probe(&pdev->dev, ret, "Couldn't initialise the buffer\n"); in vf610_adc_probe()
910 mutex_init(&info->lock); in vf610_adc_probe()
912 ret = devm_iio_device_register(&pdev->dev, indio_dev); in vf610_adc_probe()
914 return dev_err_probe(&pdev->dev, ret, "Couldn't register the device.\n"); in vf610_adc_probe()
925 /* ADC controller enters to stop mode */ in vf610_adc_suspend()
926 hc_cfg = readl(info->regs + VF610_REG_ADC_HC0); in vf610_adc_suspend()
928 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_adc_suspend()
930 clk_disable_unprepare(info->clk); in vf610_adc_suspend()
931 regulator_disable(info->vref); in vf610_adc_suspend()
942 ret = regulator_enable(info->vref); in vf610_adc_resume()
946 ret = clk_prepare_enable(info->clk); in vf610_adc_resume()
955 regulator_disable(info->vref); in vf610_adc_resume()
974 MODULE_DESCRIPTION("Freescale VF610 ADC driver");