Ejemplo n.º 1
0
static int pm8607_set_voltage(struct regulator_dev *rdev,
			      int min_uV, int max_uV)
{
	struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
	uint8_t val, mask;
	int ret;

	if (check_range(info, min_uV, max_uV)) {
		pr_err("invalid voltage range (%d, %d) uV\n", min_uV, max_uV);
		return -EINVAL;
	}

	ret = choose_voltage(rdev, min_uV, max_uV);
	if (ret < 0)
		return -EINVAL;
	val = (uint8_t)(ret << info->vol_shift);
	mask = ((1 << info->vol_nbits) - 1)  << info->vol_shift;

	ret = pm860x_set_bits(info->i2c, info->vol_reg, mask, val);
	if (ret)
		return ret;
	switch (info->desc.id) {
	case PM8607_ID_BUCK1:
	case PM8607_ID_BUCK3:
		ret = pm860x_set_bits(info->i2c, info->update_reg,
				      1 << info->update_bit,
				      1 << info->update_bit);
		break;
	}
	return ret;
}
Ejemplo n.º 2
0
static int pm822_set_voltage(struct regulator_dev *rdev,
			     int min_uV, int max_uV, unsigned *selector)
{
	struct pm822_regulator_info *info = rdev_get_drvdata(rdev);
	uint8_t mask;
	int ret, reg;
	unsigned int value;

	if (min_uV > max_uV) {
		dev_err(info->chip->dev,
			"invalid voltage range (%d, %d) uV\n", min_uV, max_uV);
		return -EINVAL;
	}

	if (info->dvc)
		reg = info->vol_reg + info->dvc_val;
	else
		reg = info->vol_reg;

	ret = choose_voltage(rdev, min_uV, max_uV);
	if (ret < 0)
		return -EINVAL;
	*selector = ret;
	value = ret << info->vol_shift;
	mask = ((1 << info->vol_nbits) - 1) << info->vol_shift;
	return regmap_update_bits(info->map, reg, mask, value);
}