コード例 #1
0
static int pm800_get_voltage(struct regulator_dev *rdev)
{
	struct pm800_regulator_info *info = rdev_get_drvdata(rdev);
	struct pm800_regulator_volt_range *range;
	int i, val, max_val, volt = -EINVAL;

	if (info->volt == NULL)
		return -EINVAL;

	val = regulator_get_voltage_sel_regmap(rdev);
	if (val < 0)
		return val;

	if (info->desc.id == PM800_ID_VOUTSW)
		return 0;

	/* get the voltage via the register value */
	for (i = 0; i < info->ranges; i++) {
		range = &info->volt[i];
		max_val = (range->max_uv - range->min_uv) / range->step_uv
				+ range->min_val;

		if (val >= range->min_val && val <= max_val) {
			volt = (val - range->min_val) * range->step_uv
				+ range->min_uv;
			break;
		}
	}

	return volt;
}
コード例 #2
0
static int max77650_regulator_set_voltage_sel(struct regulator_dev *rdev,
					      unsigned int sel)
{
	struct max77650_regulator_desc *rdesc = rdev_get_drvdata(rdev);
	int rv = 0, curr, diff;
	bool ascending;

	/*
	 * If the regulator is disabled, we can program the desired
	 * voltage right away.
	 */
	if (!max77650_regulator_is_enabled(rdev)) {
		if (rdesc == &max77651_SBB1_desc)
			return regulator_set_voltage_sel_pickable_regmap(rdev,
									 sel);
		else
			return regulator_set_voltage_sel_regmap(rdev, sel);
	}

	/*
	 * Otherwise we need to manually ramp the output voltage up/down
	 * one step at a time.
	 */

	if (rdesc == &max77651_SBB1_desc)
		curr = regulator_get_voltage_sel_pickable_regmap(rdev);
	else
		curr = regulator_get_voltage_sel_regmap(rdev);

	if (curr < 0)
		return curr;

	diff = curr - sel;
	if (diff == 0)
		return 0; /* Already there. */
	else if (diff > 0)
		ascending = false;
	else
		ascending = true;

	/*
	 * Make sure we'll get to the right voltage and break the loop even if
	 * the selector equals 0.
	 */
	for (ascending ? curr++ : curr--;; ascending ? curr++ : curr--) {
		if (rdesc == &max77651_SBB1_desc)
			rv = regulator_set_voltage_sel_pickable_regmap(rdev,
								       curr);
		else
			rv = regulator_set_voltage_sel_regmap(rdev, curr);

		if (rv)
			return rv;

		if (curr == sel)
			break;
	}

	return 0;
}
コード例 #3
0
static int rc5t583_regulator_enable_time(struct regulator_dev *rdev)
{
	struct rc5t583_regulator *reg = rdev_get_drvdata(rdev);
	int vsel = regulator_get_voltage_sel_regmap(rdev);
	int curr_uV = regulator_list_voltage_linear(rdev, vsel);

	return DIV_ROUND_UP(curr_uV, reg->reg_info->enable_uv_per_us);
}
コード例 #4
0
static int anatop_regmap_get_voltage_sel(struct regulator_dev *reg)
{
	struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg);

	if (!anatop_reg->control_reg)
		return -ENOTSUPP;

	return regulator_get_voltage_sel_regmap(reg);
}
コード例 #5
0
ファイル: tps65023-regulator.c プロジェクト: 19Dan01/linux
static int tps65023_dcdc_get_voltage_sel(struct regulator_dev *dev)
{
	struct tps_pmic *tps = rdev_get_drvdata(dev);
	int dcdc = rdev_get_id(dev);

	if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3)
		return -EINVAL;

	if (dcdc != tps->core_regulator)
		return 0;

	return regulator_get_voltage_sel_regmap(dev);
}
コード例 #6
0
ファイル: arizona-ldo1.c プロジェクト: Anjali05/linux
static int arizona_ldo1_hc_get_voltage_sel(struct regulator_dev *rdev)
{
	struct regmap *regmap = rdev_get_regmap(rdev);
	unsigned int val;
	int ret;

	ret = regmap_read(regmap, ARIZONA_LDO1_CONTROL_2, &val);
	if (ret != 0)
		return ret;

	if (val & ARIZONA_LDO1_HI_PWR)
		return rdev->desc->n_voltages - 1;

	return regulator_get_voltage_sel_regmap(rdev);
}
コード例 #7
0
static int pm800_get_voltage(struct regulator_dev *rdev)
{
	struct pm800_regulator_info *info = rdev_get_drvdata(rdev);
	int sel, ret;

	if (!info)
		return -EINVAL;

	if (info->desc.id == PM800_ID_VOUTSW)
		return 0;

	sel = regulator_get_voltage_sel_regmap(rdev);
	if (sel < 0)
		return sel;

	ret = rdev->desc->ops->list_voltage(rdev, sel);

	return ret;
}