static int wm8350_ldo_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, unsigned *selector) { struct wm8350 *wm8350 = rdev_get_drvdata(rdev); int volt_reg, ldo = rdev_get_id(rdev), mV, min_mV = min_uV / 1000, max_mV = max_uV / 1000; u16 val; if (min_mV < 900 || min_mV > 3300) return -EINVAL; if (max_mV < 900 || max_mV > 3300) return -EINVAL; if (min_mV < 1800) { /* step size is 50mV < 1800mV */ mV = (min_mV - 851) / 50; if (wm8350_ldo_val_to_mvolts(mV) > max_mV) return -EINVAL; BUG_ON(wm8350_ldo_val_to_mvolts(mV) < min_mV); } else { /* step size is 100mV > 1800mV */ mV = ((min_mV - 1701) / 100) + 16; if (wm8350_ldo_val_to_mvolts(mV) > max_mV) return -EINVAL; BUG_ON(wm8350_ldo_val_to_mvolts(mV) < min_mV); } switch (ldo) { case WM8350_LDO_1: volt_reg = WM8350_LDO1_CONTROL; break; case WM8350_LDO_2: volt_reg = WM8350_LDO2_CONTROL; break; case WM8350_LDO_3: volt_reg = WM8350_LDO3_CONTROL; break; case WM8350_LDO_4: volt_reg = WM8350_LDO4_CONTROL; break; default: return -EINVAL; } *selector = mV; /* all LDOs have same mV bits */ val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_VSEL_MASK; wm8350_reg_write(wm8350, volt_reg, val | mV); return 0; }
static int wm8350_ldo_list_voltage(struct regulator_dev *rdev, unsigned selector) { if (selector > WM8350_LDO1_VSEL_MASK) return -EINVAL; return wm8350_ldo_val_to_mvolts(selector) * 1000; }
static int wm8350_ldo_get_voltage(struct regulator_dev *rdev) { struct wm8350 *wm8350 = rdev_get_drvdata(rdev); int volt_reg, ldo = rdev_get_id(rdev); u16 val; switch (ldo) { case WM8350_LDO_1: volt_reg = WM8350_LDO1_CONTROL; break; case WM8350_LDO_2: volt_reg = WM8350_LDO2_CONTROL; break; case WM8350_LDO_3: volt_reg = WM8350_LDO3_CONTROL; break; case WM8350_LDO_4: volt_reg = WM8350_LDO4_CONTROL; break; default: return -EINVAL; } /* all LDOs have same mV bits */ val = wm8350_reg_read(wm8350, volt_reg) & WM8350_LDO1_VSEL_MASK; return wm8350_ldo_val_to_mvolts(val) * 1000; }