Commit 60432176 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab Committed by Greg Kroah-Hartman
Browse files

staging: regulator: hi6421v600-regulator: convert to use get/set voltage_sel



As the supported LDOs on this driver are all using a selector,
change the implementation to use get_voltage_sel and
set_voltage_sel ops.

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Link: https://lore.kernel.org/r/1cf4f26540e65ffbb561c7d52e53f6be5bd63ac4.1597647359.git.mchehab+huawei@kernel.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c22aeb94
Loading
Loading
Loading
Loading
+22 −36
Original line number Diff line number Diff line
@@ -109,64 +109,49 @@ static int hi6421_spmi_regulator_disable(struct regulator_dev *rdev)
	return 0;
}

static int hi6421_spmi_regulator_get_voltage(struct regulator_dev *rdev)
static int hi6421_spmi_regulator_get_voltage_sel(struct regulator_dev *rdev)
{
	struct hi6421v600_regulator *sreg = rdev_get_drvdata(rdev);
	struct hi6421_spmi_pmic *pmic = sreg->pmic;
	u32 reg_val, selector;
	int vol;

	/* get voltage selector */
	reg_val = hi6421_spmi_pmic_read(pmic, rdev->desc->vsel_reg);
	selector = (reg_val & rdev->desc->vsel_mask) >>
				(ffs(rdev->desc->vsel_mask) - 1);

	vol = rdev->desc->ops->list_voltage(rdev, selector);
	selector = (reg_val & rdev->desc->vsel_mask) >>	(ffs(rdev->desc->vsel_mask) - 1);

	dev_dbg(&rdev->dev,
		"%s: vsel_reg=0x%x, val=0x%x, entry=0x%x, voltage=%d mV\n",
		 __func__, rdev->desc->vsel_reg, reg_val, selector, vol/ 1000);
		"%s: vsel_reg=0x%x, value=0x%x, entry=0x%x, voltage=%d mV\n",
		 __func__, rdev->desc->vsel_reg, reg_val, selector,
		rdev->desc->ops->list_voltage(rdev, selector) / 1000);

	return vol;
	return selector;
}

static int hi6421_spmi_regulator_set_voltage(struct regulator_dev *rdev,
				      int min_uV, int max_uV, unsigned int *selector)
static int hi6421_spmi_regulator_set_voltage_sel(struct regulator_dev *rdev,
						 unsigned int selector)
{
	struct hi6421v600_regulator *sreg = rdev_get_drvdata(rdev);
	struct hi6421_spmi_pmic *pmic = sreg->pmic;
	u32 vsel;
	int uV, ret = 0;

	for (vsel = 0; vsel < rdev->desc->n_voltages; vsel++) {
		uV = rdev->desc->volt_table[vsel];
		dev_dbg(&rdev->dev,
			"%s: min %d, max %d, value[%u] = %d\n",
			__func__, min_uV, max_uV, vsel, uV);

		/* Break at the first in-range value */
		if (min_uV <= uV && uV <= max_uV)
			break;
	}
	u32 reg_val;

	/* unlikely to happen. sanity test done by regulator core */
	if (unlikely(vsel == rdev->desc->n_voltages))
	if (unlikely(selector >= rdev->desc->n_voltages))
		return -EINVAL;

	*selector = vsel;
	reg_val = selector << (ffs(rdev->desc->vsel_mask) - 1);

	/* set voltage selector */
	hi6421_spmi_pmic_rmw(pmic, rdev->desc->vsel_reg,
		      rdev->desc->vsel_mask,
		      vsel << (ffs(rdev->desc->vsel_mask) - 1));
			     rdev->desc->vsel_mask, reg_val);

	dev_dbg(&rdev->dev,
		"%s: vsel_reg=0x%x, vsel_mask=0x%x, value=0x%x, voltage=%d mV\n",
		"%s: vsel_reg=0x%x, mask=0x%x, value=0x%x, voltage=%d mV\n",
		 __func__,
		 rdev->desc->vsel_reg,
		 rdev->desc->vsel_mask,
		 vsel << (ffs(rdev->desc->vsel_mask) - 1), uV / 1000);
		 rdev->desc->vsel_reg, rdev->desc->vsel_mask, reg_val,
		 rdev->desc->ops->list_voltage(rdev, selector) / 1000);

	return ret;
	return 0;
}

static unsigned int hi6421_spmi_regulator_get_mode(struct regulator_dev *rdev)
@@ -315,8 +300,9 @@ static struct regulator_ops hi6421_spmi_ldo_rops = {
	.enable = hi6421_spmi_regulator_enable,
	.disable = hi6421_spmi_regulator_disable,
	.list_voltage = regulator_list_voltage_table,
	.get_voltage = hi6421_spmi_regulator_get_voltage,
	.set_voltage = hi6421_spmi_regulator_set_voltage,
	.map_voltage = regulator_map_voltage_iterate,
	.get_voltage_sel = hi6421_spmi_regulator_get_voltage_sel,
	.set_voltage_sel = hi6421_spmi_regulator_set_voltage_sel,
	.get_mode = hi6421_spmi_regulator_get_mode,
	.set_mode = hi6421_spmi_regulator_set_mode,
	.get_optimum_mode = hi6421_spmi_regulator_get_optimum_mode,