static int wm8350_dcdc_list_voltage(struct regulator_dev *rdev, unsigned selector) { if (selector > WM8350_DCDC_MAX_VSEL) return -EINVAL; return wm8350_dcdc_val_to_mvolts(selector) * 1000; }
static int wm8350_dcdc_get_voltage(struct regulator_dev *rdev) { struct wm8350 *wm8350 = rdev_get_drvdata(rdev); int volt_reg, dcdc = rdev_get_id(rdev); u16 val; switch (dcdc) { case WM8350_DCDC_1: volt_reg = WM8350_DCDC1_CONTROL; break; case WM8350_DCDC_3: volt_reg = WM8350_DCDC3_CONTROL; break; case WM8350_DCDC_4: volt_reg = WM8350_DCDC4_CONTROL; break; case WM8350_DCDC_6: volt_reg = WM8350_DCDC6_CONTROL; break; case WM8350_DCDC_2: case WM8350_DCDC_5: default: return -EINVAL; } /* all DCDCs have same mV bits */ val = wm8350_reg_read(wm8350, volt_reg) & WM8350_DC1_VSEL_MASK; return wm8350_dcdc_val_to_mvolts(val) * 1000; }
static int wm8350_dcdc_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, unsigned *selector) { struct wm8350 *wm8350 = rdev_get_drvdata(rdev); int volt_reg, dcdc = rdev_get_id(rdev), mV, min_mV = min_uV / 1000, max_mV = max_uV / 1000; u16 val; if (min_mV < 850 || min_mV > 4025) return -EINVAL; if (max_mV < 850 || max_mV > 4025) return -EINVAL; /* step size is 25mV */ mV = (min_mV - 826) / 25; if (wm8350_dcdc_val_to_mvolts(mV) > max_mV) return -EINVAL; BUG_ON(wm8350_dcdc_val_to_mvolts(mV) < min_mV); switch (dcdc) { case WM8350_DCDC_1: volt_reg = WM8350_DCDC1_CONTROL; break; case WM8350_DCDC_3: volt_reg = WM8350_DCDC3_CONTROL; break; case WM8350_DCDC_4: volt_reg = WM8350_DCDC4_CONTROL; break; case WM8350_DCDC_6: volt_reg = WM8350_DCDC6_CONTROL; break; case WM8350_DCDC_2: case WM8350_DCDC_5: default: return -EINVAL; } *selector = mV; /* all DCDCs have same mV bits */ val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_DC1_VSEL_MASK; wm8350_reg_write(wm8350, volt_reg, val | mV); return 0; }