regulator: wm8350: Reuse map_voltage() to get selector of a given uV
Reuse map_voltage() to get the selector of a given uV. Then we can remove wm8350_ldo_mvolts_to_val() and wm8350_dcdc_mvolts_to_val(). Also remove unused wm8350_dcdc_val_to_mvolts() function. Signed-off-by: Axel Lin <axel.lin@gmail.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
@ -108,24 +108,6 @@ static int get_isink_val(int min_uA, int max_uA, u16 *setting)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int wm8350_ldo_mvolts_to_val(int mV)
|
|
||||||
{
|
|
||||||
if (mV < 1800)
|
|
||||||
return (mV - 900) / 50;
|
|
||||||
else
|
|
||||||
return ((mV - 1800) / 100) + 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int wm8350_dcdc_val_to_mvolts(unsigned int val)
|
|
||||||
{
|
|
||||||
return (val * 25) + 850;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned int wm8350_dcdc_mvolts_to_val(int mV)
|
|
||||||
{
|
|
||||||
return (mV - 850) / 25;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int wm8350_isink_set_current(struct regulator_dev *rdev, int min_uA,
|
static int wm8350_isink_set_current(struct regulator_dev *rdev, int min_uA,
|
||||||
int max_uA)
|
int max_uA)
|
||||||
{
|
{
|
||||||
@ -353,19 +335,10 @@ EXPORT_SYMBOL_GPL(wm8350_isink_set_flash);
|
|||||||
static int wm8350_dcdc_set_suspend_voltage(struct regulator_dev *rdev, int uV)
|
static int wm8350_dcdc_set_suspend_voltage(struct regulator_dev *rdev, int uV)
|
||||||
{
|
{
|
||||||
struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
|
struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
|
||||||
int volt_reg, mV = uV / 1000, dcdc = rdev_get_id(rdev);
|
int sel, volt_reg, dcdc = rdev_get_id(rdev);
|
||||||
u16 val;
|
u16 val;
|
||||||
|
|
||||||
dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, dcdc, mV);
|
dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, dcdc, uV / 1000);
|
||||||
|
|
||||||
if (mV && (mV < 850 || mV > 4025)) {
|
|
||||||
dev_err(wm8350->dev,
|
|
||||||
"DCDC%d suspend voltage %d mV out of range\n",
|
|
||||||
dcdc, mV);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
if (mV == 0)
|
|
||||||
mV = 850;
|
|
||||||
|
|
||||||
switch (dcdc) {
|
switch (dcdc) {
|
||||||
case WM8350_DCDC_1:
|
case WM8350_DCDC_1:
|
||||||
@ -386,10 +359,13 @@ static int wm8350_dcdc_set_suspend_voltage(struct regulator_dev *rdev, int uV)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sel = regulator_map_voltage_linear(rdev, uV, uV);
|
||||||
|
if (sel < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/* all DCDCs have same mV bits */
|
/* all DCDCs have same mV bits */
|
||||||
val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_DC1_VSEL_MASK;
|
val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_DC1_VSEL_MASK;
|
||||||
wm8350_reg_write(wm8350, volt_reg,
|
wm8350_reg_write(wm8350, volt_reg, val | sel);
|
||||||
val | wm8350_dcdc_mvolts_to_val(mV));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -566,19 +542,49 @@ static int wm8350_dcdc_set_suspend_mode(struct regulator_dev *rdev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int wm8350_ldo_list_voltage(struct regulator_dev *rdev,
|
||||||
|
unsigned selector)
|
||||||
|
{
|
||||||
|
if (selector > WM8350_LDO1_VSEL_MASK)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (selector < 16)
|
||||||
|
return (selector * 50000) + 900000;
|
||||||
|
else
|
||||||
|
return ((selector - 16) * 100000) + 1800000;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int wm8350_ldo_map_voltage(struct regulator_dev *rdev, int min_uV,
|
||||||
|
int max_uV)
|
||||||
|
{
|
||||||
|
int volt, sel;
|
||||||
|
int min_mV = min_uV / 1000;
|
||||||
|
int max_mV = max_uV / 1000;
|
||||||
|
|
||||||
|
if (min_mV < 900 || min_mV > 3300)
|
||||||
|
return -EINVAL;
|
||||||
|
if (max_mV < 900 || max_mV > 3300)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (min_mV < 1800) /* step size is 50mV < 1800mV */
|
||||||
|
sel = DIV_ROUND_UP(min_uV - 900, 50);
|
||||||
|
else /* step size is 100mV > 1800mV */
|
||||||
|
sel = DIV_ROUND_UP(min_uV - 1800, 100) + 16;
|
||||||
|
|
||||||
|
volt = wm8350_ldo_list_voltage(rdev, sel);
|
||||||
|
if (volt < min_uV || volt > max_uV)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return sel;
|
||||||
|
}
|
||||||
|
|
||||||
static int wm8350_ldo_set_suspend_voltage(struct regulator_dev *rdev, int uV)
|
static int wm8350_ldo_set_suspend_voltage(struct regulator_dev *rdev, int uV)
|
||||||
{
|
{
|
||||||
struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
|
struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
|
||||||
int volt_reg, mV = uV / 1000, ldo = rdev_get_id(rdev);
|
int sel, volt_reg, ldo = rdev_get_id(rdev);
|
||||||
u16 val;
|
u16 val;
|
||||||
|
|
||||||
dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, ldo, mV);
|
dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, ldo, uV / 1000);
|
||||||
|
|
||||||
if (mV < 900 || mV > 3300) {
|
|
||||||
dev_err(wm8350->dev, "LDO%d voltage %d mV out of range\n",
|
|
||||||
ldo, mV);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (ldo) {
|
switch (ldo) {
|
||||||
case WM8350_LDO_1:
|
case WM8350_LDO_1:
|
||||||
@ -597,10 +603,13 @@ static int wm8350_ldo_set_suspend_voltage(struct regulator_dev *rdev, int uV)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sel = wm8350_ldo_map_voltage(rdev, uV, uV);
|
||||||
|
if (sel < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/* all LDOs have same mV bits */
|
/* all LDOs have same mV bits */
|
||||||
val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_VSEL_MASK;
|
val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_VSEL_MASK;
|
||||||
wm8350_reg_write(wm8350, volt_reg,
|
wm8350_reg_write(wm8350, volt_reg, val | sel);
|
||||||
val | wm8350_ldo_mvolts_to_val(mV));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -662,42 +671,6 @@ static int wm8350_ldo_set_suspend_disable(struct regulator_dev *rdev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wm8350_ldo_list_voltage(struct regulator_dev *rdev,
|
|
||||||
unsigned selector)
|
|
||||||
{
|
|
||||||
if (selector > WM8350_LDO1_VSEL_MASK)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (selector < 16)
|
|
||||||
return (selector * 50000) + 900000;
|
|
||||||
else
|
|
||||||
return ((selector - 16) * 100000) + 1800000;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int wm8350_ldo_map_voltage(struct regulator_dev *rdev, int min_uV,
|
|
||||||
int max_uV)
|
|
||||||
{
|
|
||||||
int volt, sel;
|
|
||||||
int min_mV = min_uV / 1000;
|
|
||||||
int max_mV = max_uV / 1000;
|
|
||||||
|
|
||||||
if (min_mV < 900 || min_mV > 3300)
|
|
||||||
return -EINVAL;
|
|
||||||
if (max_mV < 900 || max_mV > 3300)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (min_mV < 1800) /* step size is 50mV < 1800mV */
|
|
||||||
sel = DIV_ROUND_UP(min_uV - 900, 50);
|
|
||||||
else /* step size is 100mV > 1800mV */
|
|
||||||
sel = DIV_ROUND_UP(min_uV - 1800, 100) + 16;
|
|
||||||
|
|
||||||
volt = wm8350_ldo_list_voltage(rdev, sel);
|
|
||||||
if (volt < min_uV || volt > max_uV)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
return sel;
|
|
||||||
}
|
|
||||||
|
|
||||||
int wm8350_dcdc_set_slot(struct wm8350 *wm8350, int dcdc, u16 start,
|
int wm8350_dcdc_set_slot(struct wm8350 *wm8350, int dcdc, u16 start,
|
||||||
u16 stop, u16 fault)
|
u16 stop, u16 fault)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user