예제 #1
0
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);
}
예제 #3
0
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);
}
예제 #4
0
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;
}