regulator: core: Allow drivers to set voltage mapping table in regulator_desc
PATCH 1/7 regulator: core: Allow drivers to set voltage mapping table in regulator_desc
Some regulator hardware use table based mapping can set volt_table in regulator_desc and use regulator_list_voltage_table() for their list_voltage callback.
--- drivers/regulator/core.c | 25 +++++++++++++++++++++++++ include/linux/regulator/driver.h | 5 +++++ 2 files changed, 30 insertions(+), 0 deletions(-)
drivers/regulator/core.c +25 -0
@@ -1880,6 +1880,31 @@ int regulator_list_voltage_linear(struct regulator_dev *rdev,EXPORT_SYMBOL_GPL (regulator_list_voltage_linear);/** +* regulator_list_voltage_table - List voltages with table based mapping +* +* @rdev: Regulator device +* @selector: Selector to convert into a voltage +* +* Regulators with table based mapping between voltages and +* selectors can set volt_table in the regulator descriptor +* and then use this function as their list_voltage() operation. +*/ +int regulator_list_voltage_table (struct regulator_dev *rdev, +unsigned int selector) +{ +if (!rdev->desc->volt_table) { +BUG_ON (!rdev->desc->volt_table); +return -EINVAL ; + } + +if (selector >= rdev->desc->n_voltages) +return -EINVAL ; + +return rdev->desc->volt_table[selector]; +} +EXPORT_SYMBOL_GPL (regulator_list_voltage_table); + +/** * regulator_list_voltage - enumerate supported voltages * @regulator: regulator source * @selector: identify voltage to list
include/linux/regulator/driver.h +5 -0
@@ -170,6 +170,7 @@ enum regulator_type {* * @min_uV: Voltage given by the lowest selector (if linear mapping) * @uV_step: Voltage increase with each selector (if linear mapping) +* @volt_table: Voltage mapping table (if table based mapping) * * @vsel_reg: Register for selector when using regulator_regmap_X_voltage_ * @vsel_mask: Mask for register bitfield used for selector
@@ -189,6 +190,8 @@ struct regulator_desc {unsigned int min_uV;unsigned int uV_step; +const unsigned int *volt_table; +unsigned int vsel_reg;unsigned int vsel_mask;unsigned int enable_reg;
@@ -271,6 +274,8 @@ int regulator_mode_to_status(unsigned int);int regulator_list_voltage_linear (struct regulator_dev *rdev,unsigned int selector); +int regulator_list_voltage_table (struct regulator_dev *rdev, +unsigned int selector);int regulator_map_voltage_linear (struct regulator_dev *rdev,int min_uV,int max_uV); int regulator_map_voltage_iterate(struct regulator_dev *rdev,
Signature · 1 line
1.7.5.4
PATCH 2/7 regulator: ab3100: Use regulator_list_voltage_table()
--- drivers/regulator/ab3100.c | 50 ++++++++++++------------------------------- 1 files changed, 14 insertions(+), 36 deletions(-)
drivers/regulator/ab3100.c +14 -36
@@ -45,9 +45,6 @@* @regreg: regulator register number in the AB3100 * @fixed_voltage: a fixed voltage for this regulator, if this * 0 the voltages array is used instead. -* @typ_voltages: an array of available typical voltages for -* this regulator -* @voltages_len: length of the array of available voltages */ struct ab3100_regulator {struct regulator_dev *rdev;
@@ -55,8 +52,6 @@ struct ab3100_regulator {struct ab3100_platform_data *plfdata;u8 regreg;int fixed_voltage; -int const *typ_voltages; -u8 voltages_len; };/* The order in which registers are initialized */
@@ -80,7 +75,7 @@ static const u8 ab3100_reg_init_order[AB3100_NUM_REGULATORS+2] = {#define LDO_C_VOLTAGE 2650000#define LDO_D_VOLTAGE 2650000 -static const int ldo_e_buck_typ_voltages[] = { +static const unsigned int ldo_e_buck_typ_voltages[] = {1800000 ,1400000 ,1300000 ,
@@ -90,7 +85,7 @@ static const int ldo_e_buck_typ_voltages[] = { 900000, }; -static const int ldo_f_typ_voltages[] = { +static const unsigned int ldo_f_typ_voltages[] = {1800000 ,1400000 ,1300000 ,
@@ -101,21 +96,21 @@ static const int ldo_f_typ_voltages[] = { 2650000, }; -static const int ldo_g_typ_voltages[] = { +static const unsigned int ldo_g_typ_voltages[] = {2850000 ,2750000 ,1800000 ,1500000 , }; -static const int ldo_h_typ_voltages[] = { +static const unsigned int ldo_h_typ_voltages[] = {2750000 ,1800000 ,1500000 ,1200000 , }; -static const int ldo_k_typ_voltages[] = { +static const unsigned int ldo_k_typ_voltages[] = {2750000 ,1800000 , };
@@ -138,28 +133,18 @@ ab3100_regulators[AB3100_NUM_REGULATORS] = { }, { .regreg = AB3100_LDO_E, - .typ_voltages = ldo_e_buck_typ_voltages, - .voltages_len = ARRAY_SIZE(ldo_e_buck_typ_voltages), }, { .regreg = AB3100_LDO_F, - .typ_voltages = ldo_f_typ_voltages, - .voltages_len = ARRAY_SIZE(ldo_f_typ_voltages), }, { .regreg = AB3100_LDO_G, - .typ_voltages = ldo_g_typ_voltages, - .voltages_len = ARRAY_SIZE(ldo_g_typ_voltages), }, { .regreg = AB3100_LDO_H, - .typ_voltages = ldo_h_typ_voltages, - .voltages_len = ARRAY_SIZE(ldo_h_typ_voltages), }, { .regreg = AB3100_LDO_K, - .typ_voltages = ldo_k_typ_voltages, - .voltages_len = ARRAY_SIZE(ldo_k_typ_voltages), }, { .regreg = AB3100_LDO_EXT,
@@ -167,8 +152,6 @@ ab3100_regulators[AB3100_NUM_REGULATORS] = { }, { .regreg = AB3100_BUCK, - .typ_voltages = ldo_e_buck_typ_voltages, - .voltages_len = ARRAY_SIZE(ldo_e_buck_typ_voltages), }, };
@@ -257,16 +240,6 @@ static int ab3100_is_enabled_regulator(struct regulator_dev *reg)return regval &AB3100_REG_ON_MASK ; } -static int ab3100_list_voltage_regulator (struct regulator_dev *reg, -unsigned selector) -{ -struct ab3100_regulator *abreg = reg->reg_data; - -if (selector >= abreg->voltages_len) -return -EINVAL ; -return abreg->typ_voltages[selector]; -} -static int ab3100_get_voltage_regulator (struct regulator_dev *reg) {struct ab3100_regulator *abreg = reg->reg_data;
@@ -294,14 +267,14 @@ static int ab3100_get_voltage_regulator(struct regulator_dev *reg) regval &=0xE0 ; regval >>=5 ; -if (regval >= abreg->voltages_len) { +if (regval >= reg->desc->n_voltages) {dev_err (®->dev,"regulator register %02x contains an illegal voltage setting\n" , abreg->regreg);return -EINVAL ; } -return abreg->typ_voltages[regval]; +return reg->desc->volt_table[regval]; } static int ab3100_set_voltage_regulator_sel(struct regulator_dev *reg,
@@ -423,7 +396,7 @@ static struct regulator_ops regulator_ops_variable = { .is_enabled = ab3100_is_enabled_regulator, .get_voltage = ab3100_get_voltage_regulator, .set_voltage_sel = ab3100_set_voltage_regulator_sel, - .list_voltage = ab3100_list_voltage_regulator, + .list_voltage = regulator_list_voltage_table, .enable_time = ab3100_enable_time_regulator, };
@@ -434,7 +407,7 @@ static struct regulator_ops regulator_ops_variable_sleepable = { .get_voltage = ab3100_get_voltage_regulator, .set_voltage_sel = ab3100_set_voltage_regulator_sel, .set_suspend_voltage = ab3100_set_suspend_voltage_regulator, - .list_voltage = ab3100_list_voltage_regulator, + .list_voltage = regulator_list_voltage_table, .enable_time = ab3100_enable_time_regulator, };
@@ -479,6 +452,7 @@ ab3100_regulator_desc[AB3100_NUM_REGULATORS] = { .id = AB3100_LDO_E, .ops = ®ulator_ops_variable_sleepable, .n_voltages = ARRAY_SIZE(ldo_e_buck_typ_voltages), + .volt_table = ldo_e_buck_typ_voltages, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -487,6 +461,7 @@ ab3100_regulator_desc[AB3100_NUM_REGULATORS] = { .id = AB3100_LDO_F, .ops = ®ulator_ops_variable, .n_voltages = ARRAY_SIZE(ldo_f_typ_voltages), + .volt_table = ldo_f_typ_voltages, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -495,6 +470,7 @@ ab3100_regulator_desc[AB3100_NUM_REGULATORS] = { .id = AB3100_LDO_G, .ops = ®ulator_ops_variable, .n_voltages = ARRAY_SIZE(ldo_g_typ_voltages), + .volt_table = ldo_g_typ_voltages, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -503,6 +479,7 @@ ab3100_regulator_desc[AB3100_NUM_REGULATORS] = { .id = AB3100_LDO_H, .ops = ®ulator_ops_variable, .n_voltages = ARRAY_SIZE(ldo_h_typ_voltages), + .volt_table = ldo_h_typ_voltages, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -511,6 +488,7 @@ ab3100_regulator_desc[AB3100_NUM_REGULATORS] = { .id = AB3100_LDO_K, .ops = ®ulator_ops_variable, .n_voltages = ARRAY_SIZE(ldo_k_typ_voltages), + .volt_table = ldo_k_typ_voltages, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
Signature · 1 line
1.7.5.4
Re: [PATCH RFC/RFT 2/7] regulator: ab3100: Use regulator_list_voltage_table()
Quoted 4 lines · Axel Lin
Signed-off-by Axel Lin <[email protected]>---
drivers/regulator/ab3100.c | 50 ++++++++++++-------------------------------1 files changed, 14 insertions(+), 36 deletions(-)
Thanks,
Linus Walleij
PATCH 3/7 regulator: ab8500: Use regulator_list_voltage_table()
In reply to Axel Lin--- drivers/regulator/ab8500.c | 64 ++++++++++++++++--------------------------- 1 files changed, 24 insertions(+), 40 deletions(-)
drivers/regulator/ab8500.c +24 -40
@@ -40,8 +40,6 @@* @voltage_bank: bank to control regulator voltage * @voltage_reg: register to control regulator voltage * @voltage_mask: mask to control regulator voltage -* @voltages: supported voltage table -* @voltages_len: number of supported voltages for the regulator * @delay: startup/set voltage delay in us */ struct ab8500_regulator_info {
@@ -58,13 +56,11 @@ struct ab8500_regulator_info {u8 voltage_bank;u8 voltage_reg;u8 voltage_mask; -int const *voltages; -int voltages_len;unsigned int delay; };/* voltage tables for the vauxn/vintcore supplies */ -static const int ldo_vauxn_voltages[] = { +static const unsigned int ldo_vauxn_voltages[] = {1100000 ,1200000 ,1300000 ,
@@ -83,7 +79,7 @@ static const int ldo_vauxn_voltages[] = { 3300000, }; -static const int ldo_vaux3_voltages[] = { +static const unsigned int ldo_vaux3_voltages[] = {1200000 ,1500000 ,1800000 ,
@@ -94,7 +90,7 @@ static const int ldo_vaux3_voltages[] = { 2910000, }; -static const int ldo_vintcore_voltages[] = { +static const unsigned int ldo_vintcore_voltages[] = {1200000 ,1225000 ,1250000 ,
@@ -185,25 +181,6 @@ static int ab8500_regulator_is_enabled(struct regulator_dev *rdev)return false; } -static int ab8500_list_voltage (struct regulator_dev *rdev,unsigned selector) -{ -struct ab8500_regulator_info *info =rdev_get_drvdata (rdev); - -if (info ==NULL ) { -dev_err (rdev_get_dev (rdev),"regulator info null pointer\n" ); -return -EINVAL ; - } - -/* return the uV for the fixed regulators */ -if (info->fixed_uV) -return info->fixed_uV; - -if (selector >= info->voltages_len) -return -EINVAL ; - -return info->voltages[selector]; -} -static int ab8500_regulator_get_voltage_sel (struct regulator_dev *rdev) {int ret, val;
@@ -296,11 +273,24 @@ static struct regulator_ops ab8500_regulator_ops = { .is_enabled = ab8500_regulator_is_enabled, .get_voltage_sel = ab8500_regulator_get_voltage_sel, .set_voltage_sel = ab8500_regulator_set_voltage_sel, - .list_voltage = ab8500_list_voltage, + .list_voltage = regulator_list_voltage_table, .enable_time = ab8500_regulator_enable_time, .set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel, }; +static int ab8500_fixed_list_voltage (struct regulator_dev *rdev, +unsigned selector) +{ +struct ab8500_regulator_info *info =rdev_get_drvdata (rdev); + +if (info ==NULL ) { +dev_err (rdev_get_dev (rdev),"regulator info null pointer\n" ); +return -EINVAL ; + } + +return info->fixed_uV; +} +static int ab8500_fixed_get_voltage (struct regulator_dev *rdev) {struct ab8500_regulator_info *info =rdev_get_drvdata (rdev);
@@ -318,7 +308,7 @@ static struct regulator_ops ab8500_regulator_fixed_ops = { .disable = ab8500_regulator_disable, .is_enabled = ab8500_regulator_is_enabled, .get_voltage = ab8500_fixed_get_voltage, - .list_voltage = ab8500_list_voltage, + .list_voltage = ab8500_fixed_list_voltage, .enable_time = ab8500_regulator_enable_time, .set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel, };
@@ -329,7 +319,7 @@ static struct ab8500_regulator_info* Variable Voltage Regulators * name, min mV, max mV, * update bank, reg, mask, enable val -* volt bank, reg, mask, table, table length +* volt bank, reg, mask */ [AB8500_LDO_AUX1] = { .desc = {
@@ -339,6 +329,7 @@ static struct ab8500_regulator_info .id = AB8500_LDO_AUX1, .owner = THIS_MODULE, .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages), + .volt_table = ldo_vauxn_voltages, }, .min_uV = 1100000, .max_uV = 3300000,
@@ -349,8 +340,6 @@ static struct ab8500_regulator_info .voltage_bank = 0x04, .voltage_reg = 0x1f, .voltage_mask = 0x0f, - .voltages = ldo_vauxn_voltages, - .voltages_len = ARRAY_SIZE(ldo_vauxn_voltages), }, [AB8500_LDO_AUX2] = { .desc = {
@@ -360,6 +349,7 @@ static struct ab8500_regulator_info .id = AB8500_LDO_AUX2, .owner = THIS_MODULE, .n_voltages = ARRAY_SIZE(ldo_vauxn_voltages), + .volt_table = ldo_vauxn_voltages, }, .min_uV = 1100000, .max_uV = 3300000,
@@ -370,8 +360,6 @@ static struct ab8500_regulator_info .voltage_bank = 0x04, .voltage_reg = 0x20, .voltage_mask = 0x0f, - .voltages = ldo_vauxn_voltages, - .voltages_len = ARRAY_SIZE(ldo_vauxn_voltages), }, [AB8500_LDO_AUX3] = { .desc = {
@@ -381,6 +369,7 @@ static struct ab8500_regulator_info .id = AB8500_LDO_AUX3, .owner = THIS_MODULE, .n_voltages = ARRAY_SIZE(ldo_vaux3_voltages), + .volt_table = ldo_vaux3_voltages, }, .min_uV = 1100000, .max_uV = 3300000,
@@ -391,8 +380,6 @@ static struct ab8500_regulator_info .voltage_bank = 0x04, .voltage_reg = 0x21, .voltage_mask = 0x07, - .voltages = ldo_vaux3_voltages, - .voltages_len = ARRAY_SIZE(ldo_vaux3_voltages), }, [AB8500_LDO_INTCORE] = { .desc = {
@@ -402,6 +389,7 @@ static struct ab8500_regulator_info .id = AB8500_LDO_INTCORE, .owner = THIS_MODULE, .n_voltages = ARRAY_SIZE(ldo_vintcore_voltages), + .volt_table = ldo_vintcore_voltages, }, .min_uV = 1100000, .max_uV = 3300000,
@@ -412,8 +400,6 @@ static struct ab8500_regulator_info .voltage_bank = 0x03, .voltage_reg = 0x80, .voltage_mask = 0x38, - .voltages = ldo_vintcore_voltages, - .voltages_len = ARRAY_SIZE(ldo_vintcore_voltages), },/*
@@ -769,9 +755,7 @@ static __devinit int ab8500_regulator_register(struct platform_device *pdev,if (info->desc.id ==AB8500_LDO_AUX3 ) { info->desc.n_voltages =ARRAY_SIZE (ldo_vauxn_voltages); - info->voltages = ldo_vauxn_voltages; - info->voltages_len = -ARRAY_SIZE (ldo_vauxn_voltages); + info->desc.volt_table = ldo_vauxn_voltages; info->voltage_mask =0xf ; } }
Signature · 1 line
1.7.5.4
Re: [PATCH RFC/RFT 3/7] regulator: ab8500: Use regulator_list_voltage_table()
Quoted 3 lines · Axel Lin
Signed-off-by Axel Lin <[email protected]>---
drivers/regulator/ab8500.c | 64 ++++++++++++++++---------------------------
Hm, probably also already applied, whatever.
Yours,
Linus Walleij
Re: [PATCH RFC/RFT 3/7] regulator: ab8500: Use regulator_list_voltage_table()
Quoted 3 lines · Linus Walleij
Acked-by Linus Walleij <[email protected]>Hm, probably also already applied, whatever.
It was but it's not made 3.5 so I'll add your ack - review for the ab8500 has been a bit patchy so I have been tending to apply things fairly quickly rather than waiting.
PATCH 4/7 regulator: lp3971: Use regulator_list_voltage_table()
In reply to Axel Lin--- drivers/regulator/lp3971.c | 64 +++++++++++++++---------------------------- 1 files changed, 22 insertions(+), 42 deletions(-)
drivers/regulator/lp3971.c +22 -42
@@ -65,11 +65,11 @@ static const int buck_base_addr[] = {#define LP3971_BUCK_TARGET_VOL1_REG (x) (buck_base_addr[x])#define LP3971_BUCK_TARGET_VOL2_REG (x) (buck_base_addr[x]+1) -static const int buck_voltage_map[] = { -0 ,800 ,850 ,900 ,950 ,1000 ,1050 ,1100 , -1150 ,1200 ,1250 ,1300 ,1350 ,1400 ,1450 ,1500 , -1550 ,1600 ,1650 ,1700 ,1800 ,1900 ,2500 ,2800 , -3000 ,3300 , +static const unsigned int buck_voltage_map[] = { +0 ,800000 ,850000 ,900000 ,950000 ,1000000 ,1050000 ,1100000 , +1150000 ,1200000 ,1250000 ,1300000 ,1350000 ,1400000 ,1450000 ,1500000 , +1550000 ,1600000 ,1650000 ,1700000 ,1800000 ,1900000 ,2500000 ,2800000 , +3000000 ,3300000 , };#define BUCK_TARGET_VOL_MASK 0x3f
@@ -98,39 +98,19 @@ static const int buck_voltage_map[] = {#define LDO_VOL_CONTR_SHIFT (x) ((x & 1) << 2)#define LDO_VOL_CONTR_MASK 0x0f -static const int ldo45_voltage_map[] = { -1000 ,1050 ,1100 ,1150 ,1200 ,1250 ,1300 ,1350 , -1400 ,1500 ,1800 ,1900 ,2500 ,2800 ,3000 ,3300 , +static const unsigned int ldo45_voltage_map[] = { +1000000 ,1050000 ,1100000 ,1150000 ,1200000 ,1250000 ,1300000 ,1350000 , +1400000 ,1500000 ,1800000 ,1900000 ,2500000 ,2800000 ,3000000 ,3300000 , }; -static const int ldo123_voltage_map[] = { -1800 ,1900 ,2000 ,2100 ,2200 ,2300 ,2400 ,2500 , -2600 ,2700 ,2800 ,2900 ,3000 ,3100 ,3200 ,3300 , +static const unsigned int ldo123_voltage_map[] = { +1800000 ,1900000 ,2000000 ,2100000 ,2200000 ,2300000 ,2400000 ,2500000 , +2600000 ,2700000 ,2800000 ,2900000 ,3000000 ,3100000 ,3200000 ,3300000 , }; -static const int *ldo_voltage_map[] = { - ldo123_voltage_map,/* LDO1 */ - ldo123_voltage_map,/* LDO2 */ - ldo123_voltage_map,/* LDO3 */ - ldo45_voltage_map,/* LDO4 */ - ldo45_voltage_map,/* LDO5 */ -}; - -#define LDO_VOL_VALUE_MAP (x) (ldo_voltage_map[(x - LP3971_LDO1)]) -#define LDO_VOL_MIN_IDX 0x00#define LDO_VOL_MAX_IDX 0x0f -static int lp3971_ldo_list_voltage (struct regulator_dev *dev,unsigned index) -{ -int ldo =rdev_get_id (dev) -LP3971_LDO1 ; - -if (index >LDO_VOL_MAX_IDX ) -return -EINVAL ; - -return 1000 *LDO_VOL_VALUE_MAP (ldo)[index]; -} -static int lp3971_ldo_is_enabled (struct regulator_dev *dev) {struct lp3971 *lp3971 =rdev_get_drvdata (dev);
@@ -169,7 +149,7 @@ static int lp3971_ldo_get_voltage(struct regulator_dev *dev) reg =lp3971_reg_read (lp3971,LP3971_LDO_VOL_CONTR_REG (ldo)); val = (reg >>LDO_VOL_CONTR_SHIFT (ldo)) &LDO_VOL_CONTR_MASK ; -return 1000 *LDO_VOL_VALUE_MAP (ldo)[val]; +return dev->desc->volt_table[val]; } static int lp3971_ldo_set_voltage_sel(struct regulator_dev *dev,
@@ -184,7 +164,7 @@ static int lp3971_ldo_set_voltage_sel(struct regulator_dev *dev, }static struct regulator_ops lp3971_ldo_ops = { - .list_voltage = lp3971_ldo_list_voltage, + .list_voltage = regulator_list_voltage_table, .is_enabled = lp3971_ldo_is_enabled, .enable = lp3971_ldo_enable, .disable = lp3971_ldo_disable,
@@ -192,14 +172,6 @@ static struct regulator_ops lp3971_ldo_ops = { .set_voltage_sel = lp3971_ldo_set_voltage_sel, }; -static int lp3971_dcdc_list_voltage (struct regulator_dev *dev,unsigned index) -{ -if (index <BUCK_TARGET_VOL_MIN_IDX || index >BUCK_TARGET_VOL_MAX_IDX ) -return -EINVAL ; - -return 1000 * buck_voltage_map[index]; -} -static int lp3971_dcdc_is_enabled (struct regulator_dev *dev) {struct lp3971 *lp3971 =rdev_get_drvdata (dev);
@@ -273,7 +245,7 @@ static int lp3971_dcdc_set_voltage_sel(struct regulator_dev *dev, }static struct regulator_ops lp3971_dcdc_ops = { - .list_voltage = lp3971_dcdc_list_voltage, + .list_voltage = regulator_list_voltage_table, .is_enabled = lp3971_dcdc_is_enabled, .enable = lp3971_dcdc_enable, .disable = lp3971_dcdc_disable,
@@ -287,6 +259,7 @@ static const struct regulator_desc regulators[] = { .id = LP3971_LDO1, .ops = &lp3971_ldo_ops, .n_voltages = ARRAY_SIZE(ldo123_voltage_map), + .volt_table = ldo123_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -295,6 +268,7 @@ static const struct regulator_desc regulators[] = { .id = LP3971_LDO2, .ops = &lp3971_ldo_ops, .n_voltages = ARRAY_SIZE(ldo123_voltage_map), + .volt_table = ldo123_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -303,6 +277,7 @@ static const struct regulator_desc regulators[] = { .id = LP3971_LDO3, .ops = &lp3971_ldo_ops, .n_voltages = ARRAY_SIZE(ldo123_voltage_map), + .volt_table = ldo123_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -311,6 +286,7 @@ static const struct regulator_desc regulators[] = { .id = LP3971_LDO4, .ops = &lp3971_ldo_ops, .n_voltages = ARRAY_SIZE(ldo45_voltage_map), + .volt_table = ldo45_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -319,6 +295,7 @@ static const struct regulator_desc regulators[] = { .id = LP3971_LDO5, .ops = &lp3971_ldo_ops, .n_voltages = ARRAY_SIZE(ldo45_voltage_map), + .volt_table = ldo45_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -327,6 +304,7 @@ static const struct regulator_desc regulators[] = { .id = LP3971_DCDC1, .ops = &lp3971_dcdc_ops, .n_voltages = ARRAY_SIZE(buck_voltage_map), + .volt_table = buck_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -335,6 +313,7 @@ static const struct regulator_desc regulators[] = { .id = LP3971_DCDC2, .ops = &lp3971_dcdc_ops, .n_voltages = ARRAY_SIZE(buck_voltage_map), + .volt_table = buck_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -343,6 +322,7 @@ static const struct regulator_desc regulators[] = { .id = LP3971_DCDC3, .ops = &lp3971_dcdc_ops, .n_voltages = ARRAY_SIZE(buck_voltage_map), + .volt_table = buck_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
Signature · 1 line
1.7.5.4
PATCH 5/7 regulator: lp3972: Use regulator_list_voltage_table()
In reply to Axel Lin--- drivers/regulator/lp3972.c | 102 +++++++++++++++---------------------------- 1 files changed, 36 insertions(+), 66 deletions(-)
drivers/regulator/lp3972.c +36 -66
@@ -74,54 +74,40 @@ struct lp3972 {#define LP3972_OVER2_LDO4_EN BIT(4)#define LP3972_OVER1_S_EN BIT(2) -static const int ldo1_voltage_map[] = { -1700 ,1725 ,1750 ,1775 ,1800 ,1825 ,1850 ,1875 , -1900 ,1925 ,1950 ,1975 ,2000 , +static const unsigned int ldo1_voltage_map[] = { +1700000 ,1725000 ,1750000 ,1775000 ,1800000 ,1825000 ,1850000 ,1875000 , +1900000 ,1925000 ,1950000 ,1975000 ,2000000 , }; -static const int ldo23_voltage_map[] = { -1800 ,1900 ,2000 ,2100 ,2200 ,2300 ,2400 ,2500 , -2600 ,2700 ,2800 ,2900 ,3000 ,3100 ,3200 ,3300 , +static const unsigned int ldo23_voltage_map[] = { +1800000 ,1900000 ,2000000 ,2100000 ,2200000 ,2300000 ,2400000 ,2500000 , +2600000 ,2700000 ,2800000 ,2900000 ,3000000 ,3100000 ,3200000 ,3300000 , }; -static const int ldo4_voltage_map[] = { -1000 ,1050 ,1100 ,1150 ,1200 ,1250 ,1300 ,1350 , -1400 ,1500 ,1800 ,1900 ,2500 ,2800 ,3000 ,3300 , +static const unsigned int ldo4_voltage_map[] = { +1000000 ,1050000 ,1100000 ,1150000 ,1200000 ,1250000 ,1300000 ,1350000 , +1400000 ,1500000 ,1800000 ,1900000 ,2500000 ,2800000 ,3000000 ,3300000 , }; -static const int ldo5_voltage_map[] = { -0 ,0 ,0 ,0 ,0 ,850 ,875 ,900 , -925 ,950 ,975 ,1000 ,1025 ,1050 ,1075 ,1100 , -1125 ,1150 ,1175 ,1200 ,1225 ,1250 ,1275 ,1300 , -1325 ,1350 ,1375 ,1400 ,1425 ,1450 ,1475 ,1500 , +static const unsigned int ldo5_voltage_map[] = { +0 ,0 ,0 ,0 ,0 ,850000 ,875000 ,900000 , +925000 ,950000 ,975000 ,1000000 ,1025000 ,1050000 ,1075000 ,1100000 , +1125000 ,1150000 ,1175000 ,1200000 ,1225000 ,1250000 ,1275000 ,1300000 , +1325000 ,1350000 ,1375000 ,1400000 ,1425000 ,1450000 ,1475000 ,1500000 , }; -static const int buck1_voltage_map[] = { -725 ,750 ,775 ,800 ,825 ,850 ,875 ,900 , -925 ,950 ,975 ,1000 ,1025 ,1050 ,1075 ,1100 , -1125 ,1150 ,1175 ,1200 ,1225 ,1250 ,1275 ,1300 , -1325 ,1350 ,1375 ,1400 ,1425 ,1450 ,1475 ,1500 , +static const unsigned int buck1_voltage_map[] = { +725000 ,750000 ,775000 ,800000 ,825000 ,850000 ,875000 ,900000 , +925000 ,950000 ,975000 ,1000000 ,1025000 ,1050000 ,1075000 ,1100000 , +1125000 ,1150000 ,1175000 ,1200000 ,1225000 ,1250000 ,1275000 ,1300000 , +1325000 ,1350000 ,1375000 ,1400000 ,1425000 ,1450000 ,1475000 ,1500000 , }; -static const int buck23_voltage_map[] = { -0 ,800 ,850 ,900 ,950 ,1000 ,1050 ,1100 , -1150 ,1200 ,1250 ,1300 ,1350 ,1400 ,1450 ,1500 , -1550 ,1600 ,1650 ,1700 ,1800 ,1900 ,2500 ,2800 , -3000 ,3300 , -}; - -static const int *ldo_voltage_map[] = { - ldo1_voltage_map, - ldo23_voltage_map, - ldo23_voltage_map, - ldo4_voltage_map, - ldo5_voltage_map, -}; - -static const int *buck_voltage_map[] = { - buck1_voltage_map, - buck23_voltage_map, - buck23_voltage_map, +static const unsigned int buck23_voltage_map[] = { +0 ,800000 ,850000 ,900000 ,950000 ,1000000 ,1050000 ,1100000 , +1150000 ,1200000 ,1250000 ,1300000 ,1350000 ,1400000 ,1450000 ,1500000 , +1550000 ,1600000 ,1650000 ,1700000 ,1800000 ,1900000 ,2500000 ,2800000 , +3000000 ,3300000 , };static const int ldo_output_enable_mask[] = {
@@ -160,7 +146,6 @@ static const int buck_base_addr[] = { LP3972_B3TV_REG, }; -#define LP3972_LDO_VOL_VALUE_MAP (x) (ldo_voltage_map[x])#define LP3972_LDO_OUTPUT_ENABLE_MASK (x) (ldo_output_enable_mask[x])#define LP3972_LDO_OUTPUT_ENABLE_REG (x) (ldo_output_enable_addr[x])
@@ -177,7 +162,6 @@ static const int buck_base_addr[] = {#define LP3972_LDO_VOL_MIN_IDX (x) (((x) == 4) ? 0x05 : 0x00)#define LP3972_LDO_VOL_MAX_IDX (x) ((x) ? (((x) == 4) ? 0x1f : 0x0f) : 0x0c) -#define LP3972_BUCK_VOL_VALUE_MAP (x) (buck_voltage_map[x])#define LP3972_BUCK_VOL_ENABLE_REG (x) (buck_vol_enable_addr[x])#define LP3972_BUCK_VOL1_REG (x) (buck_base_addr[x])#define LP3972_BUCK_VOL_MASK 0x1f
@@ -242,17 +226,6 @@ static int lp3972_set_bits(struct lp3972 *lp3972, u8 reg, u16 mask, u16 val)return ret; } -static int lp3972_ldo_list_voltage (struct regulator_dev *dev,unsigned index) -{ -int ldo =rdev_get_id (dev) -LP3972_LDO1 ; - -if (index <LP3972_LDO_VOL_MIN_IDX (ldo) || - index >LP3972_LDO_VOL_MAX_IDX (ldo)) -return -EINVAL ; - -return 1000 *LP3972_LDO_VOL_VALUE_MAP (ldo)[index]; -} -static int lp3972_ldo_is_enabled (struct regulator_dev *dev) {struct lp3972 *lp3972 =rdev_get_drvdata (dev);
@@ -294,7 +267,7 @@ static int lp3972_ldo_get_voltage(struct regulator_dev *dev) reg =lp3972_reg_read (lp3972,LP3972_LDO_VOL_CONTR_REG (ldo)); val = (reg >>LP3972_LDO_VOL_CONTR_SHIFT (ldo)) & mask; -return 1000 *LP3972_LDO_VOL_VALUE_MAP (ldo)[val]; +return dev->desc->volt_table[val]; } static int lp3972_ldo_set_voltage_sel(struct regulator_dev *dev,
@@ -337,7 +310,7 @@ static int lp3972_ldo_set_voltage_sel(struct regulator_dev *dev, }static struct regulator_ops lp3972_ldo_ops = { - .list_voltage = lp3972_ldo_list_voltage, + .list_voltage = regulator_list_voltage_table, .is_enabled = lp3972_ldo_is_enabled, .enable = lp3972_ldo_enable, .disable = lp3972_ldo_disable,
@@ -345,17 +318,6 @@ static struct regulator_ops lp3972_ldo_ops = { .set_voltage_sel = lp3972_ldo_set_voltage_sel, }; -static int lp3972_dcdc_list_voltage (struct regulator_dev *dev,unsigned index) -{ -int buck =rdev_get_id (dev) -LP3972_DCDC1 ; - -if (index <LP3972_BUCK_VOL_MIN_IDX (buck) || - index >LP3972_BUCK_VOL_MAX_IDX (buck)) -return -EINVAL ; - -return 1000 * buck_voltage_map[buck][index]; -} -static int lp3972_dcdc_is_enabled (struct regulator_dev *dev) {struct lp3972 *lp3972 =rdev_get_drvdata (dev);
@@ -401,7 +363,7 @@ static int lp3972_dcdc_get_voltage(struct regulator_dev *dev) reg =lp3972_reg_read (lp3972,LP3972_BUCK_VOL1_REG (buck)); reg &=LP3972_BUCK_VOL_MASK ;if (reg <=LP3972_BUCK_VOL_MAX_IDX (buck)) - val =1000 * buck_voltage_map[buck][reg]; + val = dev->desc->volt_table[reg];else { val =0 ; dev_warn(&dev->dev, "chip reported incorrect voltage value."
@@ -436,7 +398,7 @@ static int lp3972_dcdc_set_voltage_sel(struct regulator_dev *dev, }static struct regulator_ops lp3972_dcdc_ops = { - .list_voltage = lp3972_dcdc_list_voltage, + .list_voltage = regulator_list_voltage_table, .is_enabled = lp3972_dcdc_is_enabled, .enable = lp3972_dcdc_enable, .disable = lp3972_dcdc_disable,
@@ -450,6 +412,7 @@ static const struct regulator_desc regulators[] = { .id = LP3972_LDO1, .ops = &lp3972_ldo_ops, .n_voltages = ARRAY_SIZE(ldo1_voltage_map), + .volt_table = ldo1_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -458,6 +421,7 @@ static const struct regulator_desc regulators[] = { .id = LP3972_LDO2, .ops = &lp3972_ldo_ops, .n_voltages = ARRAY_SIZE(ldo23_voltage_map), + .volt_table = ldo23_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -466,6 +430,7 @@ static const struct regulator_desc regulators[] = { .id = LP3972_LDO3, .ops = &lp3972_ldo_ops, .n_voltages = ARRAY_SIZE(ldo23_voltage_map), + .volt_table = ldo23_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -474,6 +439,7 @@ static const struct regulator_desc regulators[] = { .id = LP3972_LDO4, .ops = &lp3972_ldo_ops, .n_voltages = ARRAY_SIZE(ldo4_voltage_map), + .volt_table = ldo4_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -482,6 +448,7 @@ static const struct regulator_desc regulators[] = { .id = LP3972_LDO5, .ops = &lp3972_ldo_ops, .n_voltages = ARRAY_SIZE(ldo5_voltage_map), + .volt_table = ldo5_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -490,6 +457,7 @@ static const struct regulator_desc regulators[] = { .id = LP3972_DCDC1, .ops = &lp3972_dcdc_ops, .n_voltages = ARRAY_SIZE(buck1_voltage_map), + .volt_table = buck1_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -498,6 +466,7 @@ static const struct regulator_desc regulators[] = { .id = LP3972_DCDC2, .ops = &lp3972_dcdc_ops, .n_voltages = ARRAY_SIZE(buck23_voltage_map), + .volt_table = buck23_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
@@ -506,6 +475,7 @@ static const struct regulator_desc regulators[] = { .id = LP3972_DCDC3, .ops = &lp3972_dcdc_ops, .n_voltages = ARRAY_SIZE(buck23_voltage_map), + .volt_table = buck23_voltage_map, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE, },
Signature · 1 line
1.7.5.4
PATCH 6/7 regulator: tps6105x: Use regulator_list_voltage_table()
In reply to Axel Lin--- drivers/regulator/tps6105x-regulator.c | 14 +++----------- 1 files changed, 3 insertions(+), 11 deletions(-)
drivers/regulator/tps6105x-regulator.c +3 -11
@@ -20,7 +20,7 @@#include <linux/mfd/core.h> #include <linux/mfd/tps6105x.h> -static const int tps6105x_voltages[] = { +static const unsigned int tps6105x_voltages[] = {4500000 ,5000000 ,5250000 ,
@@ -105,22 +105,13 @@ static int tps6105x_regulator_set_voltage_sel(struct regulator_dev *rdev,return 0 ; } -static int tps6105x_regulator_list_voltage (struct regulator_dev *rdev, -unsigned selector) -{ -if (selector >=ARRAY_SIZE (tps6105x_voltages)) -return -EINVAL ; - -return tps6105x_voltages[selector]; -} -static struct regulator_ops tps6105x_regulator_ops = { .enable = tps6105x_regulator_enable, .disable = tps6105x_regulator_disable, .is_enabled = tps6105x_regulator_is_enabled, .get_voltage_sel = tps6105x_regulator_get_voltage_sel, .set_voltage_sel = tps6105x_regulator_set_voltage_sel, - .list_voltage = tps6105x_regulator_list_voltage, + .list_voltage = regulator_list_voltage_table, };static const struct regulator_desc tps6105x_regulator_desc = {
@@ -130,6 +121,7 @@ static const struct regulator_desc tps6105x_regulator_desc = { .id = 0, .owner = THIS_MODULE, .n_voltages = ARRAY_SIZE(tps6105x_voltages), + .volt_table = tps6105x_voltages, };/*
Signature · 1 line
1.7.5.4
Re: [PATCH RFC/RFT 6/7] regulator: tps6105x: Use regulator_list_voltage_table()
Quoted 4 lines · Axel Lin
Signed-off-by Axel Lin <[email protected]>---
drivers/regulator/tps6105x-regulator.c | 14 +++-----------1 files changed, 3 insertions(+), 11 deletions(-)
Yours,
Linus Walleij
PATCH 7/7 regulator: tps6507x: Use regulator_list_voltage_table()
In reply to Axel Lin--- drivers/regulator/tps6507x-regulator.c | 100 ++++++++++++++------------------ 1 files changed, 43 insertions(+), 57 deletions(-)
drivers/regulator/tps6507x-regulator.c +43 -57
@@ -43,50 +43,50 @@/* Number of total regulators available */ #define TPS6507X_NUM_REGULATOR (TPS6507X_NUM_DCDC + TPS6507X_NUM_LDO) -/* Supported voltage values for regulators (in milliVolts) */ -static const u16 VDCDCx_VSEL_table[] = { -725 ,750 ,775 ,800 , -825 ,850 ,875 ,900 , -925 ,950 ,975 ,1000 , -1025 ,1050 ,1075 ,1100 , -1125 ,1150 ,1175 ,1200 , -1225 ,1250 ,1275 ,1300 , -1325 ,1350 ,1375 ,1400 , -1425 ,1450 ,1475 ,1500 , -1550 ,1600 ,1650 ,1700 , -1750 ,1800 ,1850 ,1900 , -1950 ,2000 ,2050 ,2100 , -2150 ,2200 ,2250 ,2300 , -2350 ,2400 ,2450 ,2500 , -2550 ,2600 ,2650 ,2700 , -2750 ,2800 ,2850 ,2900 , -3000 ,3100 ,3200 ,3300 , +/* Supported voltage values for regulators (in microVolts) */ +static const unsigned int VDCDCx_VSEL_table[] = { +725000 ,750000 ,775000 ,800000 , +825000 ,850000 ,875000 ,900000 , +925000 ,950000 ,975000 ,1000000 , +1025000 ,1050000 ,1075000 ,1100000 , +1125000 ,1150000 ,1175000 ,1200000 , +1225000 ,1250000 ,1275000 ,1300000 , +1325000 ,1350000 ,1375000 ,1400000 , +1425000 ,1450000 ,1475000 ,1500000 , +1550000 ,1600000 ,1650000 ,1700000 , +1750000 ,1800000 ,1850000 ,1900000 , +1950000 ,2000000 ,2050000 ,2100000 , +2150000 ,2200000 ,2250000 ,2300000 , +2350000 ,2400000 ,2450000 ,2500000 , +2550000 ,2600000 ,2650000 ,2700000 , +2750000 ,2800000 ,2850000 ,2900000 , +3000000 ,3100000 ,3200000 ,3300000 , }; -static const u16 LDO1_VSEL_table[] = { -1000 ,1100 ,1200 ,1250 , -1300 ,1350 ,1400 ,1500 , -1600 ,1800 ,2500 ,2750 , -2800 ,3000 ,3100 ,3300 , +static const unsigned int LDO1_VSEL_table[] = { +1000000 ,1100000 ,1200000 ,1250000 , +1300000 ,1350000 ,1400000 ,1500000 , +1600000 ,1800000 ,2500000 ,2750000 , +2800000 ,3000000 ,3100000 ,3300000 , }; -static const u16 LDO2_VSEL_table[] = { -725 ,750 ,775 ,800 , -825 ,850 ,875 ,900 , -925 ,950 ,975 ,1000 , -1025 ,1050 ,1075 ,1100 , -1125 ,1150 ,1175 ,1200 , -1225 ,1250 ,1275 ,1300 , -1325 ,1350 ,1375 ,1400 , -1425 ,1450 ,1475 ,1500 , -1550 ,1600 ,1650 ,1700 , -1750 ,1800 ,1850 ,1900 , -1950 ,2000 ,2050 ,2100 , -2150 ,2200 ,2250 ,2300 , -2350 ,2400 ,2450 ,2500 , -2550 ,2600 ,2650 ,2700 , -2750 ,2800 ,2850 ,2900 , -3000 ,3100 ,3200 ,3300 , +static const unsigned int LDO2_VSEL_table[] = { +725000 ,750000 ,775000 ,800000 , +825000 ,850000 ,875000 ,900000 , +925000 ,950000 ,975000 ,1000000 , +1025000 ,1050000 ,1075000 ,1100000 , +1125000 ,1150000 ,1175000 ,1200000 , +1225000 ,1250000 ,1275000 ,1300000 , +1325000 ,1350000 ,1375000 ,1400000 , +1425000 ,1450000 ,1475000 ,1500000 , +1550000 ,1600000 ,1650000 ,1700000 , +1750000 ,1800000 ,1850000 ,1900000 , +1950000 ,2000000 ,2050000 ,2100000 , +2150000 ,2200000 ,2250000 ,2300000 , +2350000 ,2400000 ,2450000 ,2500000 , +2550000 ,2600000 ,2650000 ,2700000 , +2750000 ,2800000 ,2850000 ,2900000 , +3000000 ,3100000 ,3200000 ,3300000 , };struct tps_info {
@@ -94,7 +94,7 @@ struct tps_info {unsigned min_uV;unsigned max_uV;u8 table_len; -const u16 *table; +const unsigned int *table;/* Does DCDC high or the low register defines output voltage? */ bool defdcdc_default;
@@ -375,28 +375,13 @@ static int tps6507x_pmic_set_voltage_sel(struct regulator_dev *dev,return tps6507x_pmic_reg_write (tps, reg, data); } -static int tps6507x_pmic_list_voltage (struct regulator_dev *dev, -unsigned selector) -{ -struct tps6507x_pmic *tps =rdev_get_drvdata (dev); -int rid =rdev_get_id (dev); - -if (rid <TPS6507X_DCDC_1 || rid >TPS6507X_LDO_2 ) -return -EINVAL ; - -if (selector >= tps->info[rid]->table_len) -return -EINVAL ; -else -return tps->info[rid]->table[selector] *1000 ; -} -static struct regulator_ops tps6507x_pmic_ops = { .is_enabled = tps6507x_pmic_is_enabled, .enable = tps6507x_pmic_enable, .disable = tps6507x_pmic_disable, .get_voltage_sel = tps6507x_pmic_get_voltage_sel, .set_voltage_sel = tps6507x_pmic_set_voltage_sel, - .list_voltage = tps6507x_pmic_list_voltage, + .list_voltage = regulator_list_voltage_table, };static __devinit int tps6507x_pmic_probe (struct platform_device *pdev)
@@ -449,6 +434,7 @@ static __devinit int tps6507x_pmic_probe(struct platform_device *pdev) tps->desc[i].name = info->name; tps->desc[i].id = i; tps->desc[i].n_voltages = info->table_len; + tps->desc[i].volt_table = info->table; tps->desc[i].ops = &tps6507x_pmic_ops; tps->desc[i].type =REGULATOR_VOLTAGE ; tps->desc[i].owner =THIS_MODULE ;
Signature · 1 line
1.7.5.4
Mark Brown
AppliedQuoted 3 lines · Axel Lin
Some regulator hardware use table based mapping can set
volt_tableinregulator_descand useregulator_list_voltage_table()for theirlist_voltagecallback.
Applied all, thanks!