Lines Matching refs:vctrl
48 static int vctrl_calc_ctrl_voltage(struct vctrl_data *vctrl, int out_uV)
50 struct vctrl_voltage_range *ctrl = &vctrl->vrange.ctrl;
51 struct vctrl_voltage_range *out = &vctrl->vrange.out;
59 static int vctrl_calc_output_voltage(struct vctrl_data *vctrl, int ctrl_uV)
61 struct vctrl_voltage_range *ctrl = &vctrl->vrange.ctrl;
62 struct vctrl_voltage_range *out = &vctrl->vrange.out;
65 pr_err("vctrl: failed to get control voltage\n");
83 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
91 return vctrl_calc_output_voltage(vctrl, ctrl_uV);
98 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
107 uV = vctrl_calc_output_voltage(vctrl, orig_ctrl_uV);
109 if (req_min_uV >= uV || !vctrl->ovp_threshold)
112 vctrl_calc_ctrl_voltage(vctrl, req_min_uV),
113 vctrl_calc_ctrl_voltage(vctrl, req_max_uV),
117 int max_drop_uV = (uV * vctrl->ovp_threshold) / 100;
127 next_ctrl_uV = vctrl_calc_ctrl_voltage(vctrl, next_uV);
136 delay = DIV_ROUND_UP(uV - next_uV, vctrl->min_slew_down_rate);
154 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
156 return vctrl->sel;
162 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
163 unsigned int orig_sel = vctrl->sel;
172 if (selector >= vctrl->sel || !vctrl->ovp_threshold) {
175 vctrl->vtable[selector].ctrl,
176 vctrl->vtable[selector].ctrl,
179 vctrl->sel = selector;
184 while (vctrl->sel != selector) {
188 next_sel = max_t(unsigned int, selector, vctrl->vtable[vctrl->sel].ovp_min_sel);
191 vctrl->vtable[next_sel].ctrl,
192 vctrl->vtable[next_sel].ctrl,
197 vctrl->vtable[next_sel].ctrl);
200 vctrl->sel = next_sel;
202 delay = DIV_ROUND_UP(vctrl->vtable[vctrl->sel].out -
203 vctrl->vtable[next_sel].out,
204 vctrl->min_slew_down_rate);
211 if (vctrl->sel != orig_sel) {
214 vctrl->vtable[orig_sel].ctrl,
215 vctrl->vtable[orig_sel].ctrl,
217 vctrl->sel = orig_sel;
229 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
234 return vctrl->vtable[selector].out;
238 struct vctrl_data *vctrl)
247 vctrl->ovp_threshold = pval;
248 if (vctrl->ovp_threshold > 100) {
251 vctrl->ovp_threshold);
258 vctrl->min_slew_down_rate = pval;
261 if (vctrl->min_slew_down_rate == 0) {
265 } else if (vctrl->min_slew_down_rate > INT_MAX) {
267 vctrl->min_slew_down_rate);
272 if (vctrl->ovp_threshold && !vctrl->min_slew_down_rate) {
284 vctrl->vrange.out.min_uV = pval;
292 vctrl->vrange.out.max_uV = pval;
308 vctrl->vrange.ctrl.min_uV = vrange_ctrl[0];
309 vctrl->vrange.ctrl.max_uV = vrange_ctrl[1];
325 struct vctrl_data *vctrl = platform_get_drvdata(pdev);
326 struct regulator_desc *rdesc = &vctrl->desc;
327 struct vctrl_voltage_range *vrange_ctrl = &vctrl->vrange.ctrl;
336 /* determine number of steps within the range of the vctrl regulator */
350 vctrl->vtable = devm_kcalloc(&pdev->dev, rdesc->n_voltages,
353 if (!vctrl->vtable)
364 vctrl->vtable[idx_vt].ctrl = ctrl_uV;
365 vctrl->vtable[idx_vt].out =
366 vctrl_calc_output_voltage(vctrl, ctrl_uV);
371 sort(vctrl->vtable, rdesc->n_voltages,
378 int ovp_min_uV = (vctrl->vtable[i].out *
379 (100 - vctrl->ovp_threshold)) / 100;
382 if (vctrl->vtable[j].out >= ovp_min_uV) {
383 vctrl->vtable[i].ovp_min_sel = j;
390 vctrl->vtable[i].out);
392 vctrl->vtable[i].ovp_min_sel = i - 1;
401 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
403 vctrl->enabled = true;
410 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
412 vctrl->enabled = false;
419 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
421 return vctrl->enabled;
445 struct vctrl_data *vctrl;
454 vctrl = devm_kzalloc(&pdev->dev, sizeof(struct vctrl_data),
456 if (!vctrl)
459 platform_set_drvdata(pdev, vctrl);
461 ret = vctrl_parse_dt(pdev, vctrl);
469 vrange_ctrl = &vctrl->vrange.ctrl;
471 rdesc = &vctrl->desc;
472 rdesc->name = "vctrl";
491 cfg.driver_data = vctrl;
508 vctrl->sel = 0;
510 vctrl->sel = rdesc->n_voltages - 1;
515 if (ctrl_uV == vctrl->vtable[i].ctrl) {
516 vctrl->sel = i;
526 vctrl->rdev = devm_regulator_register(&pdev->dev, rdesc, &cfg);
527 if (IS_ERR(vctrl->rdev)) {
528 ret = PTR_ERR(vctrl->rdev);
537 { .compatible = "vctrl-regulator", },
545 .name = "vctrl-regulator",