Lines Matching +full:vref +full:- +full:source
44 #define DRIVER_NAME "vf610-adc"
175 struct regulator *vref; member
191 struct vf610_adc_feature *adc_feature = &info->adc_feature; in vf610_adc_calculate_rates()
192 unsigned long adck_rate, ipg_rate = clk_get_rate(info->clk); in vf610_adc_calculate_rates()
196 adck_rate = info->max_adck_rate[adc_feature->conv_mode]; in vf610_adc_calculate_rates()
201 adc_feature->clk_div = 1 << fls(divisor + 1); in vf610_adc_calculate_rates()
203 /* fall-back value using a safe divisor */ in vf610_adc_calculate_rates()
204 adc_feature->clk_div = 8; in vf610_adc_calculate_rates()
207 adck_rate = ipg_rate / adc_feature->clk_div; in vf610_adc_calculate_rates()
214 lst_addr_min = adc_feature->default_sample_time / adck_period; in vf610_adc_calculate_rates()
217 adc_feature->lst_adder_index = i; in vf610_adc_calculate_rates()
224 * Sample time unit is ADCK cycles. ADCK clk source is ipg clock, in vf610_adc_calculate_rates()
234 info->sample_freq_avail[i] = in vf610_adc_calculate_rates()
236 (25 + vf610_lst_adder[adc_feature->lst_adder_index])); in vf610_adc_calculate_rates()
241 struct vf610_adc_feature *adc_feature = &info->adc_feature; in vf610_adc_cfg_init()
244 adc_feature->clk_sel = VF610_ADCIOC_BUSCLK_SET; in vf610_adc_cfg_init()
245 adc_feature->vol_ref = VF610_ADCIOC_VR_VREF_SET; in vf610_adc_cfg_init()
247 adc_feature->calibration = true; in vf610_adc_cfg_init()
248 adc_feature->ovwren = true; in vf610_adc_cfg_init()
250 adc_feature->res_mode = 12; in vf610_adc_cfg_init()
251 adc_feature->sample_rate = 1; in vf610_adc_cfg_init()
253 adc_feature->conv_mode = VF610_ADC_CONV_LOW_POWER; in vf610_adc_cfg_init()
260 struct vf610_adc_feature *adc_feature = &info->adc_feature; in vf610_adc_cfg_post_set()
264 switch (adc_feature->clk_sel) { in vf610_adc_cfg_post_set()
282 switch (adc_feature->vol_ref) { in vf610_adc_cfg_post_set()
292 dev_err(info->dev, "error voltage reference\n"); in vf610_adc_cfg_post_set()
296 if (adc_feature->ovwren) in vf610_adc_cfg_post_set()
299 writel(cfg_data, info->regs + VF610_REG_ADC_CFG); in vf610_adc_cfg_post_set()
300 writel(gc_data, info->regs + VF610_REG_ADC_GC); in vf610_adc_cfg_post_set()
307 if (!info->adc_feature.calibration) in vf610_adc_calibration()
312 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_adc_calibration()
314 adc_gc = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_calibration()
315 writel(adc_gc | VF610_ADC_CAL, info->regs + VF610_REG_ADC_GC); in vf610_adc_calibration()
317 if (!wait_for_completion_timeout(&info->completion, VF610_ADC_TIMEOUT)) in vf610_adc_calibration()
318 dev_err(info->dev, "Timeout for adc calibration\n"); in vf610_adc_calibration()
320 adc_gc = readl(info->regs + VF610_REG_ADC_GS); in vf610_adc_calibration()
322 dev_err(info->dev, "ADC calibration failed\n"); in vf610_adc_calibration()
324 info->adc_feature.calibration = false; in vf610_adc_calibration()
329 struct vf610_adc_feature *adc_feature = &(info->adc_feature); in vf610_adc_cfg_set()
332 cfg_data = readl(info->regs + VF610_REG_ADC_CFG); in vf610_adc_cfg_set()
335 if (adc_feature->conv_mode == VF610_ADC_CONV_LOW_POWER) in vf610_adc_cfg_set()
339 if (adc_feature->conv_mode == VF610_ADC_CONV_HIGH_SPEED) in vf610_adc_cfg_set()
342 writel(cfg_data, info->regs + VF610_REG_ADC_CFG); in vf610_adc_cfg_set()
347 struct vf610_adc_feature *adc_feature = &(info->adc_feature); in vf610_adc_sample_set()
350 cfg_data = readl(info->regs + VF610_REG_ADC_CFG); in vf610_adc_sample_set()
351 gc_data = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_sample_set()
355 switch (adc_feature->res_mode) { in vf610_adc_sample_set()
366 dev_err(info->dev, "error resolution mode\n"); in vf610_adc_sample_set()
372 switch (adc_feature->clk_div) { in vf610_adc_sample_set()
385 switch (adc_feature->clk_sel) { in vf610_adc_sample_set()
390 dev_err(info->dev, "error clk divider\n"); in vf610_adc_sample_set()
400 switch (adc_feature->lst_adder_index) { in vf610_adc_sample_set()
428 dev_err(info->dev, "error in sample time select\n"); in vf610_adc_sample_set()
434 switch (adc_feature->sample_rate) { in vf610_adc_sample_set()
453 dev_err(info->dev, in vf610_adc_sample_set()
457 writel(cfg_data, info->regs + VF610_REG_ADC_CFG); in vf610_adc_sample_set()
458 writel(gc_data, info->regs + VF610_REG_ADC_GC); in vf610_adc_sample_set()
480 mutex_lock(&indio_dev->mlock); in vf610_set_conversion_mode()
481 info->adc_feature.conv_mode = mode; in vf610_set_conversion_mode()
484 mutex_unlock(&indio_dev->mlock); in vf610_set_conversion_mode()
494 return info->adc_feature.conv_mode; in vf610_get_conversion_mode()
497 static const char * const vf610_conv_modes[] = { "normal", "high-speed",
498 "low-power" };
566 result = readl(info->regs + VF610_REG_ADC_R0); in vf610_adc_read_data()
568 switch (info->adc_feature.res_mode) { in vf610_adc_read_data()
591 coco = readl(info->regs + VF610_REG_ADC_HS); in vf610_adc_isr()
593 info->value = vf610_adc_read_data(info); in vf610_adc_isr()
595 info->buffer[0] = info->value; in vf610_adc_isr()
597 info->buffer, in vf610_adc_isr()
599 iio_trigger_notify_done(indio_dev->trig); in vf610_adc_isr()
601 complete(&info->completion); in vf610_adc_isr()
614 for (i = 0; i < ARRAY_SIZE(info->sample_freq_avail); i++) in vf610_show_samp_freq_avail()
615 len += scnprintf(buf + len, PAGE_SIZE - len, in vf610_show_samp_freq_avail()
616 "%u ", info->sample_freq_avail[i]); in vf610_show_samp_freq_avail()
619 buf[len - 1] = '\n'; in vf610_show_samp_freq_avail()
648 mutex_lock(&indio_dev->mlock); in vf610_read_raw()
650 mutex_unlock(&indio_dev->mlock); in vf610_read_raw()
651 return -EBUSY; in vf610_read_raw()
654 reinit_completion(&info->completion); in vf610_read_raw()
655 hc_cfg = VF610_ADC_ADCHC(chan->channel); in vf610_read_raw()
657 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_read_raw()
659 (&info->completion, VF610_ADC_TIMEOUT); in vf610_read_raw()
661 mutex_unlock(&indio_dev->mlock); in vf610_read_raw()
662 return -ETIMEDOUT; in vf610_read_raw()
665 mutex_unlock(&indio_dev->mlock); in vf610_read_raw()
669 switch (chan->type) { in vf610_read_raw()
671 *val = info->value; in vf610_read_raw()
679 *val = 25000 - ((int)info->value - VF610_VTEMP25_3V3) * in vf610_read_raw()
684 mutex_unlock(&indio_dev->mlock); in vf610_read_raw()
685 return -EINVAL; in vf610_read_raw()
688 mutex_unlock(&indio_dev->mlock); in vf610_read_raw()
692 *val = info->vref_uv / 1000; in vf610_read_raw()
693 *val2 = info->adc_feature.res_mode; in vf610_read_raw()
697 *val = info->sample_freq_avail[info->adc_feature.sample_rate]; in vf610_read_raw()
705 return -EINVAL; in vf610_read_raw()
720 i < ARRAY_SIZE(info->sample_freq_avail); in vf610_write_raw()
722 if (val == info->sample_freq_avail[i]) { in vf610_write_raw()
723 info->adc_feature.sample_rate = i; in vf610_write_raw()
733 return -EINVAL; in vf610_write_raw()
747 val = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_postenable()
749 writel(val, info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_postenable()
751 channel = find_first_bit(indio_dev->active_scan_mask, in vf610_adc_buffer_postenable()
752 indio_dev->masklength); in vf610_adc_buffer_postenable()
757 writel(val, info->regs + VF610_REG_ADC_HC0); in vf610_adc_buffer_postenable()
768 val = readl(info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_predisable()
770 writel(val, info->regs + VF610_REG_ADC_GC); in vf610_adc_buffer_predisable()
775 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_adc_buffer_predisable()
794 return -EINVAL; in vf610_adc_reg_access()
796 *readval = readl(info->regs + reg); in vf610_adc_reg_access()
809 { .compatible = "fsl,vf610-adc", },
822 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(struct vf610_adc)); in vf610_adc_probe()
824 dev_err(&pdev->dev, "Failed allocating iio device\n"); in vf610_adc_probe()
825 return -ENOMEM; in vf610_adc_probe()
829 info->dev = &pdev->dev; in vf610_adc_probe()
832 info->regs = devm_ioremap_resource(&pdev->dev, mem); in vf610_adc_probe()
833 if (IS_ERR(info->regs)) in vf610_adc_probe()
834 return PTR_ERR(info->regs); in vf610_adc_probe()
838 dev_err(&pdev->dev, "no irq resource?\n"); in vf610_adc_probe()
842 ret = devm_request_irq(info->dev, irq, in vf610_adc_probe()
844 dev_name(&pdev->dev), indio_dev); in vf610_adc_probe()
846 dev_err(&pdev->dev, "failed requesting irq, irq = %d\n", irq); in vf610_adc_probe()
850 info->clk = devm_clk_get(&pdev->dev, "adc"); in vf610_adc_probe()
851 if (IS_ERR(info->clk)) { in vf610_adc_probe()
852 dev_err(&pdev->dev, "failed getting clock, err = %ld\n", in vf610_adc_probe()
853 PTR_ERR(info->clk)); in vf610_adc_probe()
854 return PTR_ERR(info->clk); in vf610_adc_probe()
857 info->vref = devm_regulator_get(&pdev->dev, "vref"); in vf610_adc_probe()
858 if (IS_ERR(info->vref)) in vf610_adc_probe()
859 return PTR_ERR(info->vref); in vf610_adc_probe()
861 ret = regulator_enable(info->vref); in vf610_adc_probe()
865 info->vref_uv = regulator_get_voltage(info->vref); in vf610_adc_probe()
867 of_property_read_u32_array(pdev->dev.of_node, "fsl,adck-max-frequency", in vf610_adc_probe()
868 info->max_adck_rate, 3); in vf610_adc_probe()
870 ret = of_property_read_u32(pdev->dev.of_node, "min-sample-time", in vf610_adc_probe()
871 &info->adc_feature.default_sample_time); in vf610_adc_probe()
873 info->adc_feature.default_sample_time = DEFAULT_SAMPLE_TIME; in vf610_adc_probe()
877 init_completion(&info->completion); in vf610_adc_probe()
879 indio_dev->name = dev_name(&pdev->dev); in vf610_adc_probe()
880 indio_dev->dev.parent = &pdev->dev; in vf610_adc_probe()
881 indio_dev->dev.of_node = pdev->dev.of_node; in vf610_adc_probe()
882 indio_dev->info = &vf610_adc_iio_info; in vf610_adc_probe()
883 indio_dev->modes = INDIO_DIRECT_MODE; in vf610_adc_probe()
884 indio_dev->channels = vf610_adc_iio_channels; in vf610_adc_probe()
885 indio_dev->num_channels = ARRAY_SIZE(vf610_adc_iio_channels); in vf610_adc_probe()
887 ret = clk_prepare_enable(info->clk); in vf610_adc_probe()
889 dev_err(&pdev->dev, in vf610_adc_probe()
900 dev_err(&pdev->dev, "Couldn't initialise the buffer\n"); in vf610_adc_probe()
906 dev_err(&pdev->dev, "Couldn't register the device.\n"); in vf610_adc_probe()
915 clk_disable_unprepare(info->clk); in vf610_adc_probe()
917 regulator_disable(info->vref); in vf610_adc_probe()
929 regulator_disable(info->vref); in vf610_adc_remove()
930 clk_disable_unprepare(info->clk); in vf610_adc_remove()
943 hc_cfg = readl(info->regs + VF610_REG_ADC_HC0); in vf610_adc_suspend()
945 writel(hc_cfg, info->regs + VF610_REG_ADC_HC0); in vf610_adc_suspend()
947 clk_disable_unprepare(info->clk); in vf610_adc_suspend()
948 regulator_disable(info->vref); in vf610_adc_suspend()
959 ret = regulator_enable(info->vref); in vf610_adc_resume()
963 ret = clk_prepare_enable(info->clk); in vf610_adc_resume()
972 regulator_disable(info->vref); in vf610_adc_resume()