Lines Matching +full:vref +full:- +full:p
1 // SPDX-License-Identifier: GPL-2.0-or-later
70 struct regulator *vref; member
93 writel_relaxed(8, info->regs + SARADC_DLY_PU_SOC); in rockchip_saradc_start_v1()
96 SARADC_CTRL_IRQ_ENABLE, info->regs + SARADC_CTRL); in rockchip_saradc_start_v1()
107 if (info->reset) in rockchip_saradc_start_v2()
108 rockchip_saradc_reset_controller(info->reset); in rockchip_saradc_start_v2()
110 writel_relaxed(0xc, info->regs + SARADC_T_DAS_SOC); in rockchip_saradc_start_v2()
111 writel_relaxed(0x20, info->regs + SARADC_T_PD_SOC); in rockchip_saradc_start_v2()
113 writel_relaxed(val, info->regs + SARADC2_END_INT_EN); in rockchip_saradc_start_v2()
115 writel(val << 16 | val, info->regs + SARADC2_CONV_CON); in rockchip_saradc_start_v2()
121 info->data->start(info, chn); in rockchip_saradc_start()
126 return readl_relaxed(info->regs + SARADC_DATA); in rockchip_saradc_read_v1()
135 writel_relaxed(0x1, info->regs + SARADC2_END_INT_ST); in rockchip_saradc_read_v2()
138 channel = info->chn; in rockchip_saradc_read_v2()
140 channel = info->last_chan->channel; in rockchip_saradc_read_v2()
145 return readl_relaxed(info->regs + offset); in rockchip_saradc_read_v2()
150 return info->data->read(info); in rockchip_saradc_read()
155 writel_relaxed(0, info->regs + SARADC_CTRL); in rockchip_saradc_power_down_v1()
160 if (info->data->power_down) in rockchip_saradc_power_down()
161 info->data->power_down(info); in rockchip_saradc_power_down()
167 reinit_completion(&info->completion); in rockchip_saradc_conversion()
170 info->last_chan = chan; in rockchip_saradc_conversion()
171 rockchip_saradc_start(info, chan->channel); in rockchip_saradc_conversion()
173 if (!wait_for_completion_timeout(&info->completion, SARADC_TIMEOUT)) in rockchip_saradc_conversion()
174 return -ETIMEDOUT; in rockchip_saradc_conversion()
187 if (info->test) in rockchip_saradc_read_raw()
192 mutex_lock(&indio_dev->mlock); in rockchip_saradc_read_raw()
194 if (info->suspended) { in rockchip_saradc_read_raw()
195 mutex_unlock(&indio_dev->mlock); in rockchip_saradc_read_raw()
196 return -EBUSY; in rockchip_saradc_read_raw()
202 mutex_unlock(&indio_dev->mlock); in rockchip_saradc_read_raw()
206 *val = info->last_val; in rockchip_saradc_read_raw()
207 mutex_unlock(&indio_dev->mlock); in rockchip_saradc_read_raw()
211 if (info->uv_vref < 0) in rockchip_saradc_read_raw()
212 return info->uv_vref; in rockchip_saradc_read_raw()
214 *val = info->uv_vref / 1000; in rockchip_saradc_read_raw()
215 *val2 = chan->scan_type.realbits; in rockchip_saradc_read_raw()
218 return -EINVAL; in rockchip_saradc_read_raw()
230 info->last_val = rockchip_saradc_read(info); in rockchip_saradc_isr()
232 info->last_val &= GENMASK(info->last_chan->scan_type.realbits - 1, 0); in rockchip_saradc_isr()
237 complete(&info->completion); in rockchip_saradc_isr()
239 spin_lock_irqsave(&info->lock, flags); in rockchip_saradc_isr()
240 if (info->test) { in rockchip_saradc_isr()
241 pr_info("chn[%d] val = %d\n", info->chn, info->last_val); in rockchip_saradc_isr()
242 mod_delayed_work(info->wq, &info->work, msecs_to_jiffies(100)); in rockchip_saradc_isr()
244 spin_unlock_irqrestore(&info->lock, flags); in rockchip_saradc_isr()
407 .compatible = "rockchip,rk3066-tsadc",
410 .compatible = "rockchip,rk3399-saradc",
413 .compatible = "rockchip,rk3528-saradc",
416 .compatible = "rockchip,rk3562-saradc",
419 .compatible = "rockchip,rk3568-saradc",
422 .compatible = "rockchip,rk3588-saradc",
425 .compatible = "rockchip,rv1106-saradc",
446 clk_disable_unprepare(info->clk); in rockchip_saradc_clk_disable()
453 clk_disable_unprepare(info->pclk); in rockchip_saradc_pclk_disable()
460 regulator_disable(info->vref); in rockchip_saradc_regulator_disable()
463 static irqreturn_t rockchip_saradc_trigger_handler(int irq, void *p) in rockchip_saradc_trigger_handler() argument
465 struct iio_poll_func *pf = p; in rockchip_saradc_trigger_handler()
466 struct iio_dev *i_dev = pf->indio_dev; in rockchip_saradc_trigger_handler()
470 * @timestamp: will be 8-byte aligned automatically in rockchip_saradc_trigger_handler()
479 mutex_lock(&i_dev->mlock); in rockchip_saradc_trigger_handler()
481 for_each_set_bit(i, i_dev->active_scan_mask, i_dev->masklength) { in rockchip_saradc_trigger_handler()
482 const struct iio_chan_spec *chan = &i_dev->channels[i]; in rockchip_saradc_trigger_handler()
490 data.values[j] = info->last_val; in rockchip_saradc_trigger_handler()
496 mutex_unlock(&i_dev->mlock); in rockchip_saradc_trigger_handler()
498 iio_trigger_notify_done(i_dev->trig); in rockchip_saradc_trigger_handler()
511 info->uv_vref = (unsigned long)data; in rockchip_saradc_volt_notify()
520 regulator_unregister_notifier(info->vref, &info->nb); in rockchip_saradc_regulator_unreg_notifier()
538 spin_lock_irqsave(&info->lock, flags); in saradc_test_chn_store()
540 if (val > SARADC_CTRL_CHN_MASK && info->test) { in saradc_test_chn_store()
541 info->test = false; in saradc_test_chn_store()
542 spin_unlock_irqrestore(&info->lock, flags); in saradc_test_chn_store()
543 cancel_delayed_work_sync(&info->work); in saradc_test_chn_store()
547 if (!info->test && val <= SARADC_CTRL_CHN_MASK) { in saradc_test_chn_store()
548 info->test = true; in saradc_test_chn_store()
549 info->chn = val; in saradc_test_chn_store()
550 mod_delayed_work(info->wq, &info->work, msecs_to_jiffies(100)); in saradc_test_chn_store()
553 spin_unlock_irqrestore(&info->lock, flags); in saradc_test_chn_store()
573 sysfs_remove_group(&pdev->dev.kobj, &rockchip_saradc_attr_group); in rockchip_saradc_remove_sysgroup()
580 destroy_workqueue(info->wq); in rockchip_saradc_destroy_wq()
588 rockchip_saradc_start(info, info->chn); in rockchip_saradc_test_work()
595 struct device_node *np = pdev->dev.of_node; in rockchip_saradc_probe()
603 return -ENODEV; in rockchip_saradc_probe()
605 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info)); in rockchip_saradc_probe()
607 dev_err(&pdev->dev, "failed allocating iio device\n"); in rockchip_saradc_probe()
608 return -ENOMEM; in rockchip_saradc_probe()
612 match = of_match_device(rockchip_saradc_match, &pdev->dev); in rockchip_saradc_probe()
614 dev_err(&pdev->dev, "failed to match device\n"); in rockchip_saradc_probe()
615 return -ENODEV; in rockchip_saradc_probe()
618 info->data = match->data; in rockchip_saradc_probe()
621 if (info->data->num_channels > SARADC_MAX_CHANNELS) { in rockchip_saradc_probe()
622 dev_err(&pdev->dev, "max channels exceeded"); in rockchip_saradc_probe()
623 return -EINVAL; in rockchip_saradc_probe()
627 info->regs = devm_ioremap_resource(&pdev->dev, mem); in rockchip_saradc_probe()
628 if (IS_ERR(info->regs)) in rockchip_saradc_probe()
629 return PTR_ERR(info->regs); in rockchip_saradc_probe()
635 info->reset = devm_reset_control_get_exclusive(&pdev->dev, in rockchip_saradc_probe()
636 "saradc-apb"); in rockchip_saradc_probe()
637 if (IS_ERR(info->reset)) { in rockchip_saradc_probe()
638 ret = PTR_ERR(info->reset); in rockchip_saradc_probe()
639 if (ret != -ENOENT) in rockchip_saradc_probe()
642 dev_dbg(&pdev->dev, "no reset control found\n"); in rockchip_saradc_probe()
643 info->reset = NULL; in rockchip_saradc_probe()
646 init_completion(&info->completion); in rockchip_saradc_probe()
652 ret = devm_request_irq(&pdev->dev, irq, rockchip_saradc_isr, in rockchip_saradc_probe()
653 0, dev_name(&pdev->dev), info); in rockchip_saradc_probe()
655 dev_err(&pdev->dev, "failed requesting irq %d\n", irq); in rockchip_saradc_probe()
659 info->pclk = devm_clk_get(&pdev->dev, "apb_pclk"); in rockchip_saradc_probe()
660 if (IS_ERR(info->pclk)) { in rockchip_saradc_probe()
661 dev_err(&pdev->dev, "failed to get pclk\n"); in rockchip_saradc_probe()
662 return PTR_ERR(info->pclk); in rockchip_saradc_probe()
665 info->clk = devm_clk_get(&pdev->dev, "saradc"); in rockchip_saradc_probe()
666 if (IS_ERR(info->clk)) { in rockchip_saradc_probe()
667 dev_err(&pdev->dev, "failed to get adc clock\n"); in rockchip_saradc_probe()
668 return PTR_ERR(info->clk); in rockchip_saradc_probe()
671 info->vref = devm_regulator_get(&pdev->dev, "vref"); in rockchip_saradc_probe()
672 if (IS_ERR(info->vref)) { in rockchip_saradc_probe()
673 dev_err(&pdev->dev, "failed to get regulator, %ld\n", in rockchip_saradc_probe()
674 PTR_ERR(info->vref)); in rockchip_saradc_probe()
675 return PTR_ERR(info->vref); in rockchip_saradc_probe()
678 if (info->reset) in rockchip_saradc_probe()
679 rockchip_saradc_reset_controller(info->reset); in rockchip_saradc_probe()
683 * This may become user-configurable in the future. in rockchip_saradc_probe()
685 ret = clk_set_rate(info->clk, info->data->clk_rate); in rockchip_saradc_probe()
687 dev_err(&pdev->dev, "failed to set adc clk rate, %d\n", ret); in rockchip_saradc_probe()
691 ret = regulator_enable(info->vref); in rockchip_saradc_probe()
693 dev_err(&pdev->dev, "failed to enable vref regulator\n"); in rockchip_saradc_probe()
696 ret = devm_add_action_or_reset(&pdev->dev, in rockchip_saradc_probe()
699 dev_err(&pdev->dev, "failed to register devm action, %d\n", in rockchip_saradc_probe()
704 ret = regulator_get_voltage(info->vref); in rockchip_saradc_probe()
706 dev_err(&pdev->dev, "failed to get voltage\n"); in rockchip_saradc_probe()
710 info->uv_vref = ret; in rockchip_saradc_probe()
712 ret = clk_prepare_enable(info->pclk); in rockchip_saradc_probe()
714 dev_err(&pdev->dev, "failed to enable pclk\n"); in rockchip_saradc_probe()
717 ret = devm_add_action_or_reset(&pdev->dev, in rockchip_saradc_probe()
720 dev_err(&pdev->dev, "failed to register devm action, %d\n", in rockchip_saradc_probe()
725 ret = clk_prepare_enable(info->clk); in rockchip_saradc_probe()
727 dev_err(&pdev->dev, "failed to enable converter clock\n"); in rockchip_saradc_probe()
730 ret = devm_add_action_or_reset(&pdev->dev, in rockchip_saradc_probe()
733 dev_err(&pdev->dev, "failed to register devm action, %d\n", in rockchip_saradc_probe()
740 indio_dev->name = dev_name(&pdev->dev); in rockchip_saradc_probe()
741 indio_dev->info = &rockchip_saradc_iio_info; in rockchip_saradc_probe()
742 indio_dev->modes = INDIO_DIRECT_MODE; in rockchip_saradc_probe()
744 indio_dev->channels = info->data->channels; in rockchip_saradc_probe()
745 indio_dev->num_channels = info->data->num_channels; in rockchip_saradc_probe()
746 ret = devm_iio_triggered_buffer_setup(&indio_dev->dev, indio_dev, NULL, in rockchip_saradc_probe()
752 info->nb.notifier_call = rockchip_saradc_volt_notify; in rockchip_saradc_probe()
753 ret = regulator_register_notifier(info->vref, &info->nb); in rockchip_saradc_probe()
757 ret = devm_add_action_or_reset(&pdev->dev, in rockchip_saradc_probe()
764 info->wq = create_singlethread_workqueue("adc_wq"); in rockchip_saradc_probe()
765 INIT_DELAYED_WORK(&info->work, rockchip_saradc_test_work); in rockchip_saradc_probe()
766 spin_lock_init(&info->lock); in rockchip_saradc_probe()
767 ret = sysfs_create_group(&pdev->dev.kobj, &rockchip_saradc_attr_group); in rockchip_saradc_probe()
771 ret = devm_add_action_or_reset(&pdev->dev, in rockchip_saradc_probe()
774 dev_err(&pdev->dev, "failed to register devm action, %d\n", in rockchip_saradc_probe()
779 ret = devm_add_action_or_reset(&pdev->dev, in rockchip_saradc_probe()
782 dev_err(&pdev->dev, "failed to register destroy_wq, %d\n", in rockchip_saradc_probe()
787 return devm_iio_device_register(&pdev->dev, indio_dev); in rockchip_saradc_probe()
797 mutex_lock(&indio_dev->mlock); in rockchip_saradc_suspend()
799 clk_disable_unprepare(info->clk); in rockchip_saradc_suspend()
800 clk_disable_unprepare(info->pclk); in rockchip_saradc_suspend()
801 regulator_disable(info->vref); in rockchip_saradc_suspend()
803 info->suspended = true; in rockchip_saradc_suspend()
804 mutex_unlock(&indio_dev->mlock); in rockchip_saradc_suspend()
815 ret = regulator_enable(info->vref); in rockchip_saradc_resume()
819 ret = clk_prepare_enable(info->pclk); in rockchip_saradc_resume()
823 ret = clk_prepare_enable(info->clk); in rockchip_saradc_resume()
825 clk_disable_unprepare(info->pclk); in rockchip_saradc_resume()
827 info->suspended = false; in rockchip_saradc_resume()
839 .name = "rockchip-saradc",