Lines Matching +full:vref +full:- +full:source
1 // SPDX-License-Identifier: GPL-2.0-or-later
31 #define DRIVER_NAME "vf610-adc"
162 struct regulator *vref; member
182 struct vf610_adc_feature *adc_feature = &info->adc_feature; in vf610_adc_calculate_rates()
183 unsigned long adck_rate, ipg_rate = clk_get_rate(info->clk); in vf610_adc_calculate_rates()
187 adck_rate = info->max_adck_rate[adc_feature->conv_mode]; in vf610_adc_calculate_rates()
192 adc_feature->clk_div = 1 << fls(divisor + 1); in vf610_adc_calculate_rates()
194 /* fall-back value using a safe divisor */ in vf610_adc_calculate_rates()
195 adc_feature->clk_div = 8; in vf610_adc_calculate_rates()
198 adck_rate = ipg_rate / adc_feature->clk_div; in vf610_adc_calculate_rates()
205 lst_addr_min = adc_feature->default_sample_time / adck_period; in vf610_adc_calculate_rates()
208 adc_feature->lst_adder_index = i; in vf610_adc_calculate_rates()
215 * Sample time unit is ADCK cycles. ADCK clk source is ipg clock, in vf610_adc_calculate_rates()
225 info->sample_freq_avail[i] = in vf610_adc_calculate_rates()
227 (25 + vf610_lst_adder[adc_feature->lst_adder_index])); in vf610_adc_calculate_rates()
232 struct vf610_adc_feature *adc_feature = &info->adc_feature; in vf610_adc_cfg_init()
235 adc_feature->clk_sel = VF610_ADCIOC_BUSCLK_SET; in vf610_adc_cfg_init()
236 adc_feature->vol_ref = VF610_ADCIOC_VR_VREF_SET; in vf610_adc_cfg_init()
238 adc_feature->calibration = true; in vf610_adc_cfg_init()
239 adc_feature->ovwren = true; in vf610_adc_cfg_init()
241 adc_feature->res_mode = 12; in vf610_adc_cfg_init()
242 adc_feature->sample_rate = 1; in vf610_adc_cfg_init()
244 adc_feature->conv_mode = VF610_ADC_CONV_LOW_POWER; in vf610_adc_cfg_init()
251 struct vf610_adc_feature *adc_feature = &info->adc_feature; in vf610_adc_cfg_post_set()
255 switch (adc_feature->clk_sel) { in vf610_adc_cfg_post_set()
273 switch (adc_feature->vol_ref) { in vf610_adc_cfg_post_set()
283 dev_err(info->dev, "error voltage reference\n"); in vf610_adc_cfg_post_set()
287 if (adc_feature->ovwren) in vf610_adc_cfg_post_set()
290 writel(cfg_data, info->regs + VF610_REG_ADC_CFG); in vf610_adc_cfg_post_set()
291 writel(gc_data, info->regs + VF610_REG_ADC_GC); in vf610_adc_cfg_post_set()
298 if (!info->adc_feature.calibration) in vf610_adc_calibration()
303 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_adc_calibration()
305 adc_gc = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_calibration()
306 writel(adc_gc | VF610_ADC_CAL, info->regs + VF610_REG_ADC_GC); in vf610_adc_calibration()
308 if (!wait_for_completion_timeout(&info->completion, VF610_ADC_TIMEOUT)) in vf610_adc_calibration()
309 dev_err(info->dev, "Timeout for adc calibration\n"); in vf610_adc_calibration()
311 adc_gc = readl(info->regs + VF610_REG_ADC_GS); in vf610_adc_calibration()
313 dev_err(info->dev, "ADC calibration failed\n"); in vf610_adc_calibration()
315 info->adc_feature.calibration = false; in vf610_adc_calibration()
320 struct vf610_adc_feature *adc_feature = &(info->adc_feature); in vf610_adc_cfg_set()
323 cfg_data = readl(info->regs + VF610_REG_ADC_CFG); in vf610_adc_cfg_set()
326 if (adc_feature->conv_mode == VF610_ADC_CONV_LOW_POWER) in vf610_adc_cfg_set()
330 if (adc_feature->conv_mode == VF610_ADC_CONV_HIGH_SPEED) in vf610_adc_cfg_set()
333 writel(cfg_data, info->regs + VF610_REG_ADC_CFG); in vf610_adc_cfg_set()
338 struct vf610_adc_feature *adc_feature = &(info->adc_feature); in vf610_adc_sample_set()
341 cfg_data = readl(info->regs + VF610_REG_ADC_CFG); in vf610_adc_sample_set()
342 gc_data = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_sample_set()
346 switch (adc_feature->res_mode) { in vf610_adc_sample_set()
357 dev_err(info->dev, "error resolution mode\n"); in vf610_adc_sample_set()
363 switch (adc_feature->clk_div) { in vf610_adc_sample_set()
376 switch (adc_feature->clk_sel) { in vf610_adc_sample_set()
381 dev_err(info->dev, "error clk divider\n"); in vf610_adc_sample_set()
391 switch (adc_feature->lst_adder_index) { in vf610_adc_sample_set()
419 dev_err(info->dev, "error in sample time select\n"); in vf610_adc_sample_set()
425 switch (adc_feature->sample_rate) { in vf610_adc_sample_set()
444 dev_err(info->dev, in vf610_adc_sample_set()
448 writel(cfg_data, info->regs + VF610_REG_ADC_CFG); in vf610_adc_sample_set()
449 writel(gc_data, info->regs + VF610_REG_ADC_GC); in vf610_adc_sample_set()
471 mutex_lock(&indio_dev->mlock); in vf610_set_conversion_mode()
472 info->adc_feature.conv_mode = mode; in vf610_set_conversion_mode()
475 mutex_unlock(&indio_dev->mlock); in vf610_set_conversion_mode()
485 return info->adc_feature.conv_mode; in vf610_get_conversion_mode()
488 static const char * const vf610_conv_modes[] = { "normal", "high-speed",
489 "low-power" };
557 result = readl(info->regs + VF610_REG_ADC_R0); in vf610_adc_read_data()
559 switch (info->adc_feature.res_mode) { in vf610_adc_read_data()
582 coco = readl(info->regs + VF610_REG_ADC_HS); in vf610_adc_isr()
584 info->value = vf610_adc_read_data(info); in vf610_adc_isr()
586 info->scan.chan = info->value; in vf610_adc_isr()
588 &info->scan, in vf610_adc_isr()
590 iio_trigger_notify_done(indio_dev->trig); in vf610_adc_isr()
592 complete(&info->completion); in vf610_adc_isr()
605 for (i = 0; i < ARRAY_SIZE(info->sample_freq_avail); i++) in vf610_show_samp_freq_avail()
606 len += scnprintf(buf + len, PAGE_SIZE - len, in vf610_show_samp_freq_avail()
607 "%u ", info->sample_freq_avail[i]); in vf610_show_samp_freq_avail()
610 buf[len - 1] = '\n'; in vf610_show_samp_freq_avail()
639 mutex_lock(&indio_dev->mlock); in vf610_read_raw()
641 mutex_unlock(&indio_dev->mlock); in vf610_read_raw()
642 return -EBUSY; in vf610_read_raw()
645 reinit_completion(&info->completion); in vf610_read_raw()
646 hc_cfg = VF610_ADC_ADCHC(chan->channel); in vf610_read_raw()
648 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_read_raw()
650 (&info->completion, VF610_ADC_TIMEOUT); in vf610_read_raw()
652 mutex_unlock(&indio_dev->mlock); in vf610_read_raw()
653 return -ETIMEDOUT; in vf610_read_raw()
656 mutex_unlock(&indio_dev->mlock); in vf610_read_raw()
660 switch (chan->type) { in vf610_read_raw()
662 *val = info->value; in vf610_read_raw()
670 *val = 25000 - ((int)info->value - VF610_VTEMP25_3V3) * in vf610_read_raw()
675 mutex_unlock(&indio_dev->mlock); in vf610_read_raw()
676 return -EINVAL; in vf610_read_raw()
679 mutex_unlock(&indio_dev->mlock); in vf610_read_raw()
683 *val = info->vref_uv / 1000; in vf610_read_raw()
684 *val2 = info->adc_feature.res_mode; in vf610_read_raw()
688 *val = info->sample_freq_avail[info->adc_feature.sample_rate]; in vf610_read_raw()
696 return -EINVAL; in vf610_read_raw()
711 i < ARRAY_SIZE(info->sample_freq_avail); in vf610_write_raw()
713 if (val == info->sample_freq_avail[i]) { in vf610_write_raw()
714 info->adc_feature.sample_rate = i; in vf610_write_raw()
724 return -EINVAL; in vf610_write_raw()
733 val = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_postenable()
735 writel(val, info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_postenable()
737 channel = find_first_bit(indio_dev->active_scan_mask, in vf610_adc_buffer_postenable()
738 indio_dev->masklength); in vf610_adc_buffer_postenable()
743 writel(val, info->regs + VF610_REG_ADC_HC0); in vf610_adc_buffer_postenable()
754 val = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_predisable()
756 writel(val, info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_predisable()
761 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_adc_buffer_predisable()
780 return -EINVAL; in vf610_adc_reg_access()
782 *readval = readl(info->regs + reg); in vf610_adc_reg_access()
795 { .compatible = "fsl,vf610-adc", },
807 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(struct vf610_adc)); in vf610_adc_probe()
809 dev_err(&pdev->dev, "Failed allocating iio device\n"); in vf610_adc_probe()
810 return -ENOMEM; in vf610_adc_probe()
814 info->dev = &pdev->dev; in vf610_adc_probe()
816 info->regs = devm_platform_ioremap_resource(pdev, 0); in vf610_adc_probe()
817 if (IS_ERR(info->regs)) in vf610_adc_probe()
818 return PTR_ERR(info->regs); in vf610_adc_probe()
824 ret = devm_request_irq(info->dev, irq, in vf610_adc_probe()
826 dev_name(&pdev->dev), indio_dev); in vf610_adc_probe()
828 dev_err(&pdev->dev, "failed requesting irq, irq = %d\n", irq); in vf610_adc_probe()
832 info->clk = devm_clk_get(&pdev->dev, "adc"); in vf610_adc_probe()
833 if (IS_ERR(info->clk)) { in vf610_adc_probe()
834 dev_err(&pdev->dev, "failed getting clock, err = %ld\n", in vf610_adc_probe()
835 PTR_ERR(info->clk)); in vf610_adc_probe()
836 return PTR_ERR(info->clk); in vf610_adc_probe()
839 info->vref = devm_regulator_get(&pdev->dev, "vref"); in vf610_adc_probe()
840 if (IS_ERR(info->vref)) in vf610_adc_probe()
841 return PTR_ERR(info->vref); in vf610_adc_probe()
843 ret = regulator_enable(info->vref); in vf610_adc_probe()
847 info->vref_uv = regulator_get_voltage(info->vref); in vf610_adc_probe()
849 of_property_read_u32_array(pdev->dev.of_node, "fsl,adck-max-frequency", in vf610_adc_probe()
850 info->max_adck_rate, 3); in vf610_adc_probe()
852 ret = of_property_read_u32(pdev->dev.of_node, "min-sample-time", in vf610_adc_probe()
853 &info->adc_feature.default_sample_time); in vf610_adc_probe()
855 info->adc_feature.default_sample_time = DEFAULT_SAMPLE_TIME; in vf610_adc_probe()
859 init_completion(&info->completion); in vf610_adc_probe()
861 indio_dev->name = dev_name(&pdev->dev); in vf610_adc_probe()
862 indio_dev->info = &vf610_adc_iio_info; in vf610_adc_probe()
863 indio_dev->modes = INDIO_DIRECT_MODE; in vf610_adc_probe()
864 indio_dev->channels = vf610_adc_iio_channels; in vf610_adc_probe()
865 indio_dev->num_channels = ARRAY_SIZE(vf610_adc_iio_channels); in vf610_adc_probe()
867 ret = clk_prepare_enable(info->clk); in vf610_adc_probe()
869 dev_err(&pdev->dev, in vf610_adc_probe()
880 dev_err(&pdev->dev, "Couldn't initialise the buffer\n"); in vf610_adc_probe()
886 dev_err(&pdev->dev, "Couldn't register the device.\n"); in vf610_adc_probe()
895 clk_disable_unprepare(info->clk); in vf610_adc_probe()
897 regulator_disable(info->vref); in vf610_adc_probe()
909 regulator_disable(info->vref); in vf610_adc_remove()
910 clk_disable_unprepare(info->clk); in vf610_adc_remove()
923 hc_cfg = readl(info->regs + VF610_REG_ADC_HC0); in vf610_adc_suspend()
925 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_adc_suspend()
927 clk_disable_unprepare(info->clk); in vf610_adc_suspend()
928 regulator_disable(info->vref); in vf610_adc_suspend()
939 ret = regulator_enable(info->vref); in vf610_adc_resume()
943 ret = clk_prepare_enable(info->clk); in vf610_adc_resume()
952 regulator_disable(info->vref); in vf610_adc_resume()