regulator: wm8350: Use wm8350_ldo_list_voltage instead of open code to verify selected voltage
PATCH 1/2 regulator: wm8350: Use wm8350_ldo_list_voltage instead of open code to verify selected voltage
Call wm8350_ldo_list_voltage() instead of open code to verify selected voltage falls within specified range.
Use wm8350_ldo_list_voltage() here is less error prone.
wm8350_ldo_val_to_mvolts() is only used in wm8350_ldo_list_voltage now, so remove it and move the implementation to wm8350_ldo_list_voltage().
This patch also include below small changes in wm8350_ldo_map_voltage:
1. wm8350_ldo_map_voltage() returns selector, thus rename variable mV to sel.
2. Use DIV_ROUND_UP macro to calculate selector.
--- drivers/regulator/wm8350-regulator.c | 52 ++++++++++++++-------------------- 1 file changed, 21 insertions(+), 31 deletions(-)
drivers/regulator/wm8350-regulator.c +21 -31
@@ -108,15 +108,6 @@ static int get_isink_val(int min_uA, int max_uA, u16 *setting)return -EINVAL ; } -static inline int wm8350_ldo_val_to_mvolts (unsigned int val) -{ -if (val <16 ) -return (val *50 ) +900 ; -else -return ((val -16 ) *100 ) +1800 ; - -} -static inline unsigned int wm8350_ldo_mvolts_to_val (int mV) {if (mV <1800 )
@@ -671,10 +662,22 @@ static int wm8350_ldo_set_suspend_disable(struct regulator_dev *rdev)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 mV; +int volt, sel;int min_mV = min_uV /1000 ;int max_mV = max_uV /1000 ;
@@ -683,29 +686,16 @@ static int wm8350_ldo_map_voltage(struct regulator_dev *rdev, int min_uV,if (max_mV <900 || max_mV >3300 )return -EINVAL ; -if (min_mV <1800 ) { -/* step size is 50mV < 1800mV */ - mV = (min_mV -851 ) /50 ; -if (wm8350_ldo_val_to_mvolts (mV) > max_mV) -return -EINVAL ; -BUG_ON (wm8350_ldo_val_to_mvolts (mV) < min_mV); - }else { -/* step size is 100mV > 1800mV */ - mV = ((min_mV -1701 ) /100 ) +16 ; -if (wm8350_ldo_val_to_mvolts (mV) > max_mV) -return -EINVAL ; -BUG_ON (wm8350_ldo_val_to_mvolts (mV) < min_mV); - } - -return mV; -} +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 ; -static int wm8350_ldo_list_voltage (struct regulator_dev *rdev, -unsigned selector) -{ -if (selector >WM8350_LDO1_VSEL_MASK ) + volt =wm8350_ldo_list_voltage (rdev, sel); +if (volt < min_uV || volt > max_uV)return -EINVAL ; -return wm8350_ldo_val_to_mvolts (selector) *1000 ; + +return sel; } int wm8350_dcdc_set_slot(struct wm8350 *wm8350, int dcdc, u16 start,
Signature · 1 line
1.7.9.5
PATCH 2/2 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.
--- drivers/regulator/wm8350-regulator.c | 127 +++++++++++++--------------------- 1 file changed, 50 insertions(+), 77 deletions(-)
drivers/regulator/wm8350-regulator.c +50 -77
@@ -108,24 +108,6 @@ static int get_isink_val(int min_uA, int max_uA, u16 *setting)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,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) {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; -dev_dbg (wm8350->dev,"%s %d mV %d\n" , __func__, dcdc, mV); - -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 ; +dev_dbg (wm8350->dev,"%s %d mV %d\n" , __func__, dcdc, uV /1000 );switch (dcdc) {case WM8350_DCDC_1 :
@@ -386,10 +359,13 @@ static int wm8350_dcdc_set_suspend_voltage(struct regulator_dev *rdev, int uV)return -EINVAL ; } + sel =regulator_map_voltage_linear (rdev, uV, uV); +if (sel <0 ) +return -EINVAL ; +/* all DCDCs have same mV bits */ val =wm8350_reg_read (wm8350, volt_reg) & ~WM8350_DC1_VSEL_MASK ; -wm8350_reg_write (wm8350, volt_reg, - val |wm8350_dcdc_mvolts_to_val (mV)); +wm8350_reg_write (wm8350, volt_reg, val | sel);return 0 ; }
@@ -566,19 +542,49 @@ static int wm8350_dcdc_set_suspend_mode(struct regulator_dev *rdev,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) {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; -dev_dbg (wm8350->dev,"%s %d mV %d\n" , __func__, ldo, mV); - -if (mV <900 || mV >3300 ) { -dev_err (wm8350->dev,"LDO%d voltage %d mV out of range\n" , - ldo, mV); -return -EINVAL ; - } +dev_dbg (wm8350->dev,"%s %d mV %d\n" , __func__, ldo, uV /1000 );switch (ldo) {case WM8350_LDO_1 :
@@ -597,10 +603,13 @@ static int wm8350_ldo_set_suspend_voltage(struct regulator_dev *rdev, int uV)return -EINVAL ; } + sel =wm8350_ldo_map_voltage (rdev, uV, uV); +if (sel <0 ) +return -EINVAL ; +/* all LDOs have same mV bits */ val =wm8350_reg_read (wm8350, volt_reg) & ~WM8350_LDO1_VSEL_MASK ; -wm8350_reg_write (wm8350, volt_reg, - val |wm8350_ldo_mvolts_to_val (mV)); +wm8350_reg_write (wm8350, volt_reg, val | sel);return 0 ; }
@@ -662,42 +671,6 @@ static int wm8350_ldo_set_suspend_disable(struct regulator_dev *rdev)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,u16 stop,u16 fault) {
Signature · 1 line
1.7.9.5
Mark Brown
AppliedRe: [PATCH RFT 2/2] regulator: wm8350: Reuse map_voltage() to get selector of a given uV
Quoted 4 lines · Axel Lin
Reuse
map_voltage()to get the selector of a given uV.Then we can remove
wm8350_ldo_mvolts_to_val()andwm8350_dcdc_mvolts_to_val(). Also remove unusedwm8350_dcdc_val_to_mvolts()function.
Applied, thanks.
Mark Brown
AppliedQuoted 3 lines · Axel Lin
Call
wm8350_ldo_list_voltage()instead of open code to verify selected voltage falls within specified range.
Usewm8350_ldo_list_voltage()here is less error prone.
Applied, thanks.