|
@@ -267,23 +267,6 @@ static int wm831x_buckv_select_min_voltage(struct regulator_dev *rdev,
|
|
|
return vsel;
|
|
|
}
|
|
|
|
|
|
-static int wm831x_buckv_select_max_voltage(struct regulator_dev *rdev,
|
|
|
- int min_uV, int max_uV)
|
|
|
-{
|
|
|
- u16 vsel;
|
|
|
-
|
|
|
- if (max_uV < 600000 || max_uV > 1800000)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- vsel = ((max_uV - 600000) / 12500) + 8;
|
|
|
-
|
|
|
- if (wm831x_buckv_list_voltage(rdev, vsel) < min_uV ||
|
|
|
- wm831x_buckv_list_voltage(rdev, vsel) < max_uV)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- return vsel;
|
|
|
-}
|
|
|
-
|
|
|
static int wm831x_buckv_set_dvs(struct regulator_dev *rdev, int state)
|
|
|
{
|
|
|
struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
|
|
@@ -338,28 +321,23 @@ static int wm831x_buckv_set_voltage(struct regulator_dev *rdev,
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
|
|
|
- /* Set the high voltage as the DVS voltage. This is optimised
|
|
|
- * for CPUfreq usage, most processors will keep the maximum
|
|
|
- * voltage constant and lower the minimum with the frequency. */
|
|
|
- vsel = wm831x_buckv_select_max_voltage(rdev, min_uV, max_uV);
|
|
|
- if (vsel < 0) {
|
|
|
- /* This should never happen - at worst the same vsel
|
|
|
- * should be chosen */
|
|
|
- WARN_ON(vsel < 0);
|
|
|
- return 0;
|
|
|
+ /*
|
|
|
+ * If this VSEL is higher than the last one we've seen then
|
|
|
+ * remember it as the DVS VSEL. This is optimised for CPUfreq
|
|
|
+ * usage where we want to get to the highest voltage very
|
|
|
+ * quickly.
|
|
|
+ */
|
|
|
+ if (vsel > dcdc->dvs_vsel) {
|
|
|
+ ret = wm831x_set_bits(wm831x, dvs_reg,
|
|
|
+ WM831X_DC1_DVS_VSEL_MASK,
|
|
|
+ dcdc->dvs_vsel);
|
|
|
+ if (ret == 0)
|
|
|
+ dcdc->dvs_vsel = vsel;
|
|
|
+ else
|
|
|
+ dev_warn(wm831x->dev,
|
|
|
+ "Failed to set DCDC DVS VSEL: %d\n", ret);
|
|
|
}
|
|
|
|
|
|
- /* Don't bother if it's the same VSEL we're already using */
|
|
|
- if (vsel == dcdc->on_vsel)
|
|
|
- return 0;
|
|
|
-
|
|
|
- ret = wm831x_set_bits(wm831x, dvs_reg, WM831X_DC1_DVS_VSEL_MASK, vsel);
|
|
|
- if (ret == 0)
|
|
|
- dcdc->dvs_vsel = vsel;
|
|
|
- else
|
|
|
- dev_warn(wm831x->dev, "Failed to set DCDC DVS VSEL: %d\n",
|
|
|
- ret);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|