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 if (selector >= vctrl->vtable[vctrl->sel].ovp_min_sel)
191 next_sel = vctrl->vtable[vctrl->sel].ovp_min_sel;
194 vctrl->vtable[next_sel].ctrl,
195 vctrl->vtable[next_sel].ctrl,
200 vctrl->vtable[next_sel].ctrl);
203 vctrl->sel = next_sel;
205 delay = DIV_ROUND_UP(vctrl->vtable[vctrl->sel].out -
206 vctrl->vtable[next_sel].out,
207 vctrl->min_slew_down_rate);
214 if (vctrl->sel != orig_sel) {
217 vctrl->vtable[orig_sel].ctrl,
218 vctrl->vtable[orig_sel].ctrl,
220 vctrl->sel = orig_sel;
232 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
237 return vctrl->vtable[selector].out;
241 struct vctrl_data *vctrl)
250 vctrl->ovp_threshold = pval;
251 if (vctrl->ovp_threshold > 100) {
254 vctrl->ovp_threshold);
261 vctrl->min_slew_down_rate = pval;
264 if (vctrl->min_slew_down_rate == 0) {
268 } else if (vctrl->min_slew_down_rate > INT_MAX) {
270 vctrl->min_slew_down_rate);
275 if (vctrl->ovp_threshold && !vctrl->min_slew_down_rate) {
287 vctrl->vrange.out.min_uV = pval;
295 vctrl->vrange.out.max_uV = pval;
311 vctrl->vrange.ctrl.min_uV = vrange_ctrl[0];
312 vctrl->vrange.ctrl.max_uV = vrange_ctrl[1];
328 struct vctrl_data *vctrl = platform_get_drvdata(pdev);
329 struct regulator_desc *rdesc = &vctrl->desc;
330 struct vctrl_voltage_range *vrange_ctrl = &vctrl->vrange.ctrl;
339 /* determine number of steps within the range of the vctrl regulator */
353 vctrl->vtable = devm_kcalloc(&pdev->dev, rdesc->n_voltages,
356 if (!vctrl->vtable)
367 vctrl->vtable[idx_vt].ctrl = ctrl_uV;
368 vctrl->vtable[idx_vt].out =
369 vctrl_calc_output_voltage(vctrl, ctrl_uV);
374 sort(vctrl->vtable, rdesc->n_voltages,
381 int ovp_min_uV = (vctrl->vtable[i].out *
382 (100 - vctrl->ovp_threshold)) / 100;
385 if (vctrl->vtable[j].out >= ovp_min_uV) {
386 vctrl->vtable[i].ovp_min_sel = j;
393 vctrl->vtable[i].out);
395 vctrl->vtable[i].ovp_min_sel = i - 1;
404 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
406 vctrl->enabled = true;
413 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
415 vctrl->enabled = false;
422 struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
424 return vctrl->enabled;
448 struct vctrl_data *vctrl;
457 vctrl = devm_kzalloc(&pdev->dev, sizeof(struct vctrl_data),
459 if (!vctrl)
462 platform_set_drvdata(pdev, vctrl);
464 ret = vctrl_parse_dt(pdev, vctrl);
472 vrange_ctrl = &vctrl->vrange.ctrl;
474 rdesc = &vctrl->desc;
475 rdesc->name = "vctrl";
494 cfg.driver_data = vctrl;
511 vctrl->sel = 0;
513 vctrl->sel = rdesc->n_voltages - 1;
518 if (ctrl_uV == vctrl->vtable[i].ctrl) {
519 vctrl->sel = i;
529 vctrl->rdev = devm_regulator_register(&pdev->dev, rdesc, &cfg);
530 if (IS_ERR(vctrl->rdev)) {
531 ret = PTR_ERR(vctrl->rdev);
540 { .compatible = "vctrl-regulator", },
548 .name = "vctrl-regulator",