regulator: pbias: Fix is_enabled callback implementation
PATCH 1/3 regulator: pbias: Fix is_enabled callback implementation
The is_enabled implementation is wrong in some cases:
e.g. for pbias_mmc_omap5: emable_mask is : BIT(27) | BIT(25) | BIT(26) However, pbias_regulator_enable() only sets BIT(26) | BIT(22) bits. So is_enabled callback will always return false in this case. Fix the logic to compare the register value with info->enable rather than info->enable_mask.
--- drivers/regulator/pbias-regulator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/regulator/pbias-regulator.c +1 -1
@@ -108,7 +108,7 @@ static int pbias_regulator_is_enable(struct regulator_dev *rdev)regmap_read (data->syscon, data->pbias_reg, &value); -return (value & info->enable_mask) == info->enable_mask; +return (value & info->enable_mask) == info->enable; }static struct regulator_ops pbias_regulator_voltage_ops = {
Signature · 1 line
1.8.1.2
PATCH 2/3 regulator: pbias: Convert to use regmap helper functions
This patch converts this driver to use the regmap helper functions provided by regulator core.
--- drivers/regulator/pbias-regulator.c | 74 ++++++++++--------------------------- 1 file changed, 19 insertions(+), 55 deletions(-)
drivers/regulator/pbias-regulator.c +19 -55
@@ -38,66 +38,24 @@ struct pbias_reg_info {struct pbias_regulator_data {struct regulator_desc desc;void __iomem *pbias_addr; -unsigned int pbias_reg;struct regulator_dev *dev;struct regmap *syscon;const struct pbias_reg_info *info;int voltage; }; -static int pbias_regulator_set_voltage (struct regulator_dev *dev, -int min_uV,int max_uV,unsigned *selector) -{ -struct pbias_regulator_data *data =rdev_get_drvdata (dev); -const struct pbias_reg_info *info = data->info; -int ret, vmode; - -if (min_uV <=1800000 ) - vmode =0 ; -else if (min_uV >1800000 ) - vmode = info->vmode; - - ret =regmap_update_bits (data->syscon, data->pbias_reg, - info->vmode, vmode); - -return ret; -} - -static int pbias_regulator_get_voltage (struct regulator_dev *rdev) -{ -struct pbias_regulator_data *data =rdev_get_drvdata (rdev); -const struct pbias_reg_info *info = data->info; -int value, voltage; - -regmap_read (data->syscon, data->pbias_reg, &value); - value &= info->vmode; - - voltage = value ?3000000 :1800000 ; - -return voltage; -} +static const unsigned int pbias_volt_table[] = { +1800000 , +3000000 +};static int pbias_regulator_enable (struct regulator_dev *rdev) {struct pbias_regulator_data *data =rdev_get_drvdata (rdev);const struct pbias_reg_info *info = data->info; -int ret; - - ret =regmap_update_bits (data->syscon, data->pbias_reg, - info->enable_mask, info->enable); - -return ret; -} - -static int pbias_regulator_disable (struct regulator_dev *rdev) -{ -struct pbias_regulator_data *data =rdev_get_drvdata (rdev); -const struct pbias_reg_info *info = data->info; -int ret; - ret =regmap_update_bits (data->syscon, data->pbias_reg, - info->enable_mask,0 ); -return ret; +return regmap_update_bits (data->syscon, rdev->desc->enable_reg, + info->enable_mask, info->enable); }static int pbias_regulator_is_enable (struct regulator_dev *rdev)
@@ -106,17 +64,18 @@ static int pbias_regulator_is_enable(struct regulator_dev *rdev)const struct pbias_reg_info *info = data->info;int value; -regmap_read (data->syscon, data->pbias_reg, &value); +regmap_read (data->syscon, rdev->desc->enable_reg, &value);return (value & info->enable_mask) == info->enable; }static struct regulator_ops pbias_regulator_voltage_ops = { - .set_voltage = pbias_regulator_set_voltage, - .get_voltage = pbias_regulator_get_voltage, - .enable = pbias_regulator_enable, - .disable = pbias_regulator_disable, - .is_enabled = pbias_regulator_is_enable, + .list_voltage = regulator_list_voltage_table, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .enable = pbias_regulator_enable, + .disable = regulator_disable_regmap, + .is_enabled = pbias_regulator_is_enable, };static const struct pbias_reg_info pbias_mmc_omap2430 = {
@@ -192,6 +151,7 @@ static int pbias_regulator_probe(struct platform_device *pdev)if (IS_ERR (syscon))return PTR_ERR (syscon); + cfg.regmap = syscon; cfg.dev = &pdev->dev;for (idx =0 ; idx <PBIAS_NUM_REGS && data_idx < count; idx++) {
@@ -207,15 +167,19 @@ static int pbias_regulator_probe(struct platform_device *pdev)if (!res)return -EINVAL ; - drvdata[data_idx].pbias_reg = res->start; drvdata[data_idx].syscon = syscon; drvdata[data_idx].info = info; drvdata[data_idx].desc.name = info->name; drvdata[data_idx].desc.owner =THIS_MODULE ; drvdata[data_idx].desc.type =REGULATOR_VOLTAGE ; drvdata[data_idx].desc.ops = &pbias_regulator_voltage_ops; + drvdata[data_idx].desc.volt_table = pbias_volt_table; drvdata[data_idx].desc.n_voltages =2 ; drvdata[data_idx].desc.enable_time = info->enable_time; + drvdata[data_idx].desc.vsel_reg = res->start; + drvdata[data_idx].desc.vsel_mask = info->vmode; + drvdata[data_idx].desc.enable_reg = res->start; + drvdata[data_idx].desc.enable_mask = info->enable_mask; cfg.init_data = pbias_matches[idx].init_data; cfg.driver_data = &drvdata[data_idx];
Signature · 1 line
1.8.1.2
Re: [PATCH 2/3] regulator: pbias: Convert to use regmap helper functions
Quoted 4 lines · Axel Lin
This patch converts this driver to use the regmap helper functions provided by regulator core.
Signed-off-by Axel Lin <[email protected]>
Quoted 4 lines
--- drivers/regulator/pbias-regulator.c | 74 ++++++++++--------------------------- 1 file changed, 19 insertions(+), 55 deletions(-)
PATCH 3/3 regulator: pbias: Convert to use regulator_[enable|is_enabled]_regmap
In reply to Axel LinSince commit ca5d1b3524b4d
"regulator: helpers: Modify helpers enabling multi-bit control", we can set enable_val setting for device that use multiple bits for control when using regmap enable/disable/bypass ops.
---
Note:
This patch depends on below commit which is only in regulator tree now:
http://git.kernel.org/cgit/linux/kernel/git/broonie/regulator.git/commit/?h=topic/enable
I sent this for reveiw and test now.
if it works, I'll resend it once 3.5-rc1 is released.
drivers/regulator/pbias-regulator.c | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-)
drivers/regulator/pbias-regulator.c +3 -22
@@ -49,33 +49,13 @@ static const unsigned int pbias_volt_table[] = {3000000 }; -static int pbias_regulator_enable (struct regulator_dev *rdev) -{ -struct pbias_regulator_data *data =rdev_get_drvdata (rdev); -const struct pbias_reg_info *info = data->info; - -return regmap_update_bits (data->syscon, rdev->desc->enable_reg, - info->enable_mask, info->enable); -} - -static int pbias_regulator_is_enable (struct regulator_dev *rdev) -{ -struct pbias_regulator_data *data =rdev_get_drvdata (rdev); -const struct pbias_reg_info *info = data->info; -int value; - -regmap_read (data->syscon, rdev->desc->enable_reg, &value); - -return (value & info->enable_mask) == info->enable; -} -static struct regulator_ops pbias_regulator_voltage_ops = { .list_voltage = regulator_list_voltage_table, .get_voltage_sel = regulator_get_voltage_sel_regmap, .set_voltage_sel = regulator_set_voltage_sel_regmap, - .enable = pbias_regulator_enable, + .enable = regulator_enable_regmap, .disable = regulator_disable_regmap, - .is_enabled = pbias_regulator_is_enable, + .is_enabled = regulator_is_enabled_regmap, };static const struct pbias_reg_info pbias_mmc_omap2430 = {
@@ -180,6 +160,7 @@ static int pbias_regulator_probe(struct platform_device *pdev) drvdata[data_idx].desc.vsel_mask = info->vmode; drvdata[data_idx].desc.enable_reg = res->start; drvdata[data_idx].desc.enable_mask = info->enable_mask; + drvdata[data_idx].desc.enable_val = info->enable; cfg.init_data = pbias_matches[idx].init_data; cfg.driver_data = &drvdata[data_idx];
Signature · 1 line
1.8.1.2
Re: [PATCH 3/3] regulator: pbias: Convert to use regulator_[enable|is_enabled]_regmap
Quoted 5 lines · Axel Lin
Since commit
ca5d1b3524b4d
"regulator: helpers: Modify helpers enabling multi-bit control", we can setenable_valsetting for device that use multiple bits for control when using regmap enable/disable/bypass ops.
Quoted 8 lines
Signed-off-by Axel Lin <[email protected]>---
Note:
This patch depends on below commit which is only in regulator tree now:
http://git.kernel.org/cgit/linux/kernel/git/broonie/regulator.git/commit/?h=topic/enableI sent this for reveiw and test now.
if it works, I'll resend it once 3.5-rc1 is released.
Hi,
I tested this series with above dependent commit and it works as excepted So you can add my,
Thanks for doing regmap conversion, now pbias driver looks as minimal as possible.
Quoted 53 lines
drivers/regulator/pbias-regulator.c | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-)drivers/regulator/pbias-regulator.c +3
-22@@ -49,33 +49,13 @@ static const unsigned int pbias_volt_table[] = {3000000 }; -static int pbias_regulator_enable (struct regulator_dev *rdev) -{ -struct pbias_regulator_data *data =rdev_get_drvdata (rdev); -const struct pbias_reg_info *info = data->info; - -return regmap_update_bits (data->syscon, rdev->desc->enable_reg, - info->enable_mask, info->enable); -} - -static int pbias_regulator_is_enable (struct regulator_dev *rdev) -{ -struct pbias_regulator_data *data =rdev_get_drvdata (rdev); -const struct pbias_reg_info *info = data->info; -int value; - -regmap_read (data->syscon, rdev->desc->enable_reg, &value); - -return (value & info->enable_mask) == info->enable; -} -static struct regulator_ops pbias_regulator_voltage_ops = { .list_voltage = regulator_list_voltage_table, .get_voltage_sel = regulator_get_voltage_sel_regmap, .set_voltage_sel = regulator_set_voltage_sel_regmap, - .enable = pbias_regulator_enable, + .enable = regulator_enable_regmap, .disable = regulator_disable_regmap, - .is_enabled = pbias_regulator_is_enable, + .is_enabled = regulator_is_enabled_regmap, };static const struct pbias_reg_info pbias_mmc_omap2430 = {@@ -180,6 +160,7 @@ static int pbias_regulator_probe(struct platform_device *pdev) drvdata[data_idx].desc.vsel_mask = info->vmode; drvdata[data_idx].desc.enable_reg = res->start; drvdata[data_idx].desc.enable_mask = info->enable_mask; + drvdata[data_idx].desc.enable_val = info->enable; cfg.init_data = pbias_matches[idx].init_data; cfg.driver_data = &drvdata[data_idx];
Quoted 2 lines · Axel Lin
The
is_enabledimplementation is wrong in some cases:
e.g. forpbias_mmc_omap5:emable_maskis : BIT(27) | BIT(25) | BIT(26)
Hi Axel,
s/emable_mask/enable_mask
Quoted 1 line
However,
pbias_regulator_enable()only sets BIT(26) | BIT(22) bits.
You mixed up enable_mask of omap5 with .enable of omap4 :-) above comment should be
"However, pbias_regulator_enable() only sets BIT(27) | BIT(26) bits" Other than that
Quoted 23 lines
So
is_enabledcallback will always return false in this case. Fix the logic to compare the register value withinfo->enablerather thaninfo->enable_mask.Signed-off-by Axel Lin <[email protected]>--- drivers/regulator/pbias-regulator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/regulator/pbias-regulator.c +1
-1@@ -108,7 +108,7 @@ static int pbias_regulator_is_enable(struct regulator_dev *rdev)regmap_read (data->syscon, data->pbias_reg, &value); -return (value & info->enable_mask) == info->enable_mask; +return (value & info->enable_mask) == info->enable; }static struct regulator_ops pbias_regulator_voltage_ops = {