static int wm8350_ldo_set_suspend_voltage(struct regulator_dev *rdev, int uV) { struct wm8350 *wm8350 = rdev_get_drvdata(rdev); int sel, volt_reg, ldo = rdev_get_id(rdev); u16 val; dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, ldo, uV / 1000); switch (ldo) { case WM8350_LDO_1: volt_reg = WM8350_LDO1_LOW_POWER; break; case WM8350_LDO_2: volt_reg = WM8350_LDO2_LOW_POWER; break; case WM8350_LDO_3: volt_reg = WM8350_LDO3_LOW_POWER; break; case WM8350_LDO_4: volt_reg = WM8350_LDO4_LOW_POWER; break; default: return -EINVAL; } sel = regulator_map_voltage_linear_range(rdev, uV, uV); if (sel < 0) return sel; /* all LDOs have same mV bits */ val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_VSEL_MASK; wm8350_reg_write(wm8350, volt_reg, val | sel); return 0; }
static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev, int uV) { struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); struct wm831x *wm831x = ldo->wm831x; int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL; sel = regulator_map_voltage_linear_range(rdev, uV, uV); if (sel < 0) return sel; return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, sel); }
int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv) { unsigned int reg; int sel = regulator_map_voltage_linear_range(rdev, uv, uv); if (sel < 0) return -EINVAL; reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET; return regmap_update_bits(rdev->regmap, reg, rdev->desc->vsel_mask, sel); }
static int pm800_set_suspend_voltage(struct regulator_dev *rdev, int uv) { int ret, sel, rid; struct pm800_regulator_info *info = rdev_get_drvdata(rdev); if (!info || !info->desc.ops) return -EINVAL; if (!info->desc.ops->set_suspend_mode) return 0; /* only handle pm860 buck1 audio mode */ rid = rdev_get_id(rdev); if ((rid != PM800_ID_BUCK1) && (rid != PM800_ID_BUCK1A)) return -EINVAL; /* * two steps: * 1) set the suspend voltage to *_set_slp register * 2) set regulator mode via set_suspend_mode() interface to enable output */ sel = regulator_map_voltage_linear_range(rdev, uv, uv); if (sel < 0) return -EINVAL; sel <<= ffs(PM800_BUCK1_AUDIO_SET_MSK) - 1; ret = regmap_update_bits(rdev->regmap, PM800_BUCK1_AUDIO_SET, PM800_BUCK1_AUDIO_SET_MSK, sel); if (ret < 0) return -EINVAL; /* TODO: do we need this? */ ret = pm800_set_suspend_mode(rdev, REGULATOR_MODE_IDLE); return ret; }