From 3865e11d7b28ae9cf7defb7a6717499f596f30eb Mon Sep 17 00:00:00 2001 From: Alexander Shiyan Date: Sun, 8 Jun 2014 15:26:28 +0400 Subject: regulator: mc13xxx: Remove unused field "hi_bit" Field "hi_bit" is not used anywhere in the driver. This patch removes this excess field. Signed-off-by: Alexander Shiyan Signed-off-by: Mark Brown --- drivers/regulator/mc13xxx.h | 1 - 1 file changed, 1 deletion(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/mc13xxx.h b/drivers/regulator/mc13xxx.h index 06c8903f182a..2ab9bfd93b4e 100644 --- a/drivers/regulator/mc13xxx.h +++ b/drivers/regulator/mc13xxx.h @@ -21,7 +21,6 @@ struct mc13xxx_regulator { int vsel_reg; int vsel_shift; int vsel_mask; - int hi_bit; }; struct mc13xxx_regulator_priv { -- cgit v1.2.3-70-g09d2 From 7dd33c1d57b057c3b8eda8effa72667ec798a814 Mon Sep 17 00:00:00 2001 From: Alexander Shiyan Date: Sun, 8 Jun 2014 15:26:29 +0400 Subject: regulator: mc13xxx: Remove unnecessary locks Read-modify-write sequence is already protected by regmap, so no additional locks need. This patch remove such locks from mc13xxx regulator driver. Signed-off-by: Alexander Shiyan Signed-off-by: Mark Brown --- drivers/regulator/mc13xxx-regulator-core.c | 37 +++++++----------------------- 1 file changed, 8 insertions(+), 29 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/mc13xxx-regulator-core.c b/drivers/regulator/mc13xxx-regulator-core.c index 05b971726ffa..afba024953e1 100644 --- a/drivers/regulator/mc13xxx-regulator-core.c +++ b/drivers/regulator/mc13xxx-regulator-core.c @@ -33,17 +33,12 @@ static int mc13xxx_regulator_enable(struct regulator_dev *rdev) struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev); struct mc13xxx_regulator *mc13xxx_regulators = priv->mc13xxx_regulators; int id = rdev_get_id(rdev); - int ret; dev_dbg(rdev_get_dev(rdev), "%s id: %d\n", __func__, id); - mc13xxx_lock(priv->mc13xxx); - ret = mc13xxx_reg_rmw(priv->mc13xxx, mc13xxx_regulators[id].reg, - mc13xxx_regulators[id].enable_bit, - mc13xxx_regulators[id].enable_bit); - mc13xxx_unlock(priv->mc13xxx); - - return ret; + return mc13xxx_reg_rmw(priv->mc13xxx, mc13xxx_regulators[id].reg, + mc13xxx_regulators[id].enable_bit, + mc13xxx_regulators[id].enable_bit); } static int mc13xxx_regulator_disable(struct regulator_dev *rdev) @@ -51,16 +46,11 @@ static int mc13xxx_regulator_disable(struct regulator_dev *rdev) struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev); struct mc13xxx_regulator *mc13xxx_regulators = priv->mc13xxx_regulators; int id = rdev_get_id(rdev); - int ret; dev_dbg(rdev_get_dev(rdev), "%s id: %d\n", __func__, id); - mc13xxx_lock(priv->mc13xxx); - ret = mc13xxx_reg_rmw(priv->mc13xxx, mc13xxx_regulators[id].reg, - mc13xxx_regulators[id].enable_bit, 0); - mc13xxx_unlock(priv->mc13xxx); - - return ret; + return mc13xxx_reg_rmw(priv->mc13xxx, mc13xxx_regulators[id].reg, + mc13xxx_regulators[id].enable_bit, 0); } static int mc13xxx_regulator_is_enabled(struct regulator_dev *rdev) @@ -70,10 +60,7 @@ static int mc13xxx_regulator_is_enabled(struct regulator_dev *rdev) int ret, id = rdev_get_id(rdev); unsigned int val; - mc13xxx_lock(priv->mc13xxx); ret = mc13xxx_reg_read(priv->mc13xxx, mc13xxx_regulators[id].reg, &val); - mc13xxx_unlock(priv->mc13xxx); - if (ret) return ret; @@ -86,15 +73,10 @@ static int mc13xxx_regulator_set_voltage_sel(struct regulator_dev *rdev, struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev); struct mc13xxx_regulator *mc13xxx_regulators = priv->mc13xxx_regulators; int id = rdev_get_id(rdev); - int ret; - mc13xxx_lock(priv->mc13xxx); - ret = mc13xxx_reg_rmw(priv->mc13xxx, mc13xxx_regulators[id].vsel_reg, - mc13xxx_regulators[id].vsel_mask, - selector << mc13xxx_regulators[id].vsel_shift); - mc13xxx_unlock(priv->mc13xxx); - - return ret; + return mc13xxx_reg_rmw(priv->mc13xxx, mc13xxx_regulators[id].vsel_reg, + mc13xxx_regulators[id].vsel_mask, + selector << mc13xxx_regulators[id].vsel_shift); } static int mc13xxx_regulator_get_voltage(struct regulator_dev *rdev) @@ -106,11 +88,8 @@ static int mc13xxx_regulator_get_voltage(struct regulator_dev *rdev) dev_dbg(rdev_get_dev(rdev), "%s id: %d\n", __func__, id); - mc13xxx_lock(priv->mc13xxx); ret = mc13xxx_reg_read(priv->mc13xxx, mc13xxx_regulators[id].vsel_reg, &val); - mc13xxx_unlock(priv->mc13xxx); - if (ret) return ret; -- cgit v1.2.3-70-g09d2 From 53ddddcad5a4fc41db3e2f16c22344d8da58cf74 Mon Sep 17 00:00:00 2001 From: Sachin Kamat Date: Tue, 10 Jun 2014 12:04:53 +0530 Subject: regulator: ltc3589: Staticize ltc3589_reg_defaults 'ltc3589_reg_defaults' is local to this file. Make it static. Signed-off-by: Sachin Kamat Signed-off-by: Mark Brown --- drivers/regulator/ltc3589.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/ltc3589.c b/drivers/regulator/ltc3589.c index 110a99ee1162..217d10d6f8f7 100644 --- a/drivers/regulator/ltc3589.c +++ b/drivers/regulator/ltc3589.c @@ -377,7 +377,7 @@ static bool ltc3589_volatile_reg(struct device *dev, unsigned int reg) return false; } -struct reg_default ltc3589_reg_defaults[] = { +static struct reg_default ltc3589_reg_defaults[] = { { LTC3589_SCR1, 0x00 }, { LTC3589_OVEN, 0x00 }, { LTC3589_SCR2, 0x00 }, -- cgit v1.2.3-70-g09d2 From 9f057dc1d01383e6975e515ba8e661d2aeb6bdfc Mon Sep 17 00:00:00 2001 From: Keerthy Date: Wed, 18 Jun 2014 15:28:56 +0530 Subject: regulator: palmas: Shift the reg_info structure definition to the header file Shift the reg_info structure definition to the header file. Acked-by: Lee Jones Signed-off-by: Keerthy Signed-off-by: Mark Brown --- drivers/regulator/palmas-regulator.c | 9 --------- include/linux/mfd/palmas.h | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index b982f0ff4e01..1cf462f90df5 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c @@ -27,15 +27,6 @@ #include #include -struct regs_info { - char *name; - char *sname; - u8 vsel_addr; - u8 ctrl_addr; - u8 tstep_addr; - int sleep_id; -}; - static const struct regulator_linear_range smps_low_ranges[] = { REGULATOR_LINEAR_RANGE(0, 0x0, 0x0, 0), REGULATOR_LINEAR_RANGE(500000, 0x1, 0x6, 0), diff --git a/include/linux/mfd/palmas.h b/include/linux/mfd/palmas.h index f760a07ab76e..c123666c70f7 100644 --- a/include/linux/mfd/palmas.h +++ b/include/linux/mfd/palmas.h @@ -88,6 +88,15 @@ struct palmas { u8 pwm_muxed; }; +struct regs_info { + char *name; + char *sname; + u8 vsel_addr; + u8 ctrl_addr; + u8 tstep_addr; + int sleep_id; +}; + struct palmas_gpadc_platform_data { /* Channel 3 current source is only enabled during conversion */ int ch3_current; -- cgit v1.2.3-70-g09d2 From cac9e916245390d7b0b770b8577af4918f74d0ee Mon Sep 17 00:00:00 2001 From: Keerthy Date: Wed, 18 Jun 2014 15:28:59 +0530 Subject: regulator: palmas: add driver data and modularize the probe add driver data and modularize the probe. Signed-off-by: Keerthy Signed-off-by: Mark Brown --- drivers/mfd/palmas.c | 44 +-- drivers/regulator/palmas-regulator.c | 658 +++++++++++++++++++++-------------- 2 files changed, 396 insertions(+), 306 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c index c12759d1bd7c..28cb048f4760 100644 --- a/drivers/mfd/palmas.c +++ b/drivers/mfd/palmas.c @@ -25,42 +25,6 @@ #include #include -#define EXTERNAL_REQUESTOR(_id, _offset, _pos) \ - [PALMAS_EXTERNAL_REQSTR_ID_##_id] = { \ - .id = PALMAS_EXTERNAL_REQSTR_ID_##_id, \ - .reg_offset = _offset, \ - .bit_pos = _pos, \ - } - -static struct palmas_sleep_requestor_info sleep_req_info[] = { - EXTERNAL_REQUESTOR(REGEN1, 0, 0), - EXTERNAL_REQUESTOR(REGEN2, 0, 1), - EXTERNAL_REQUESTOR(SYSEN1, 0, 2), - EXTERNAL_REQUESTOR(SYSEN2, 0, 3), - EXTERNAL_REQUESTOR(CLK32KG, 0, 4), - EXTERNAL_REQUESTOR(CLK32KGAUDIO, 0, 5), - EXTERNAL_REQUESTOR(REGEN3, 0, 6), - EXTERNAL_REQUESTOR(SMPS12, 1, 0), - EXTERNAL_REQUESTOR(SMPS3, 1, 1), - EXTERNAL_REQUESTOR(SMPS45, 1, 2), - EXTERNAL_REQUESTOR(SMPS6, 1, 3), - EXTERNAL_REQUESTOR(SMPS7, 1, 4), - EXTERNAL_REQUESTOR(SMPS8, 1, 5), - EXTERNAL_REQUESTOR(SMPS9, 1, 6), - EXTERNAL_REQUESTOR(SMPS10, 1, 7), - EXTERNAL_REQUESTOR(LDO1, 2, 0), - EXTERNAL_REQUESTOR(LDO2, 2, 1), - EXTERNAL_REQUESTOR(LDO3, 2, 2), - EXTERNAL_REQUESTOR(LDO4, 2, 3), - EXTERNAL_REQUESTOR(LDO5, 2, 4), - EXTERNAL_REQUESTOR(LDO6, 2, 5), - EXTERNAL_REQUESTOR(LDO7, 2, 6), - EXTERNAL_REQUESTOR(LDO8, 2, 7), - EXTERNAL_REQUESTOR(LDO9, 3, 0), - EXTERNAL_REQUESTOR(LDOLN, 3, 1), - EXTERNAL_REQUESTOR(LDOUSB, 3, 2), -}; - static const struct regmap_config palmas_regmap_config[PALMAS_NUM_CLIENTS] = { { .reg_bits = 8, @@ -365,10 +329,10 @@ static struct regmap_irq_chip tps65917_irq_chip = { int palmas_ext_control_req_config(struct palmas *palmas, enum palmas_external_requestor_id id, int ext_ctrl, bool enable) { + struct palmas_pmic_driver_data *pmic_ddata = palmas->pmic_ddata; int preq_mask_bit = 0; int reg_add = 0; - int bit_pos; - int ret; + int bit_pos, ret; if (!(ext_ctrl & PALMAS_EXT_REQ)) return 0; @@ -387,8 +351,8 @@ int palmas_ext_control_req_config(struct palmas *palmas, preq_mask_bit = 2; } - bit_pos = sleep_req_info[id].bit_pos; - reg_add += sleep_req_info[id].reg_offset; + bit_pos = pmic_ddata->sleep_req_info[id].bit_pos; + reg_add += pmic_ddata->sleep_req_info[id].reg_offset; if (enable) ret = palmas_update_bits(palmas, PALMAS_RESOURCE_BASE, reg_add, BIT(bit_pos), BIT(bit_pos)); diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index 1cf462f90df5..aa8e5516752e 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c @@ -41,7 +41,7 @@ static const struct regulator_linear_range smps_high_ranges[] = { REGULATOR_LINEAR_RANGE(3300000, 0x7A, 0x7f, 0), }; -static const struct regs_info palmas_regs_info[] = { +static struct regs_info palmas_regs_info[] = { { .name = "SMPS12", .sname = "smps1-in", @@ -227,6 +227,42 @@ static const struct regs_info palmas_regs_info[] = { }, }; +#define EXTERNAL_REQUESTOR(_id, _offset, _pos) \ + [PALMAS_EXTERNAL_REQSTR_ID_##_id] = { \ + .id = PALMAS_EXTERNAL_REQSTR_ID_##_id, \ + .reg_offset = _offset, \ + .bit_pos = _pos, \ + } + +struct palmas_sleep_requestor_info palma_sleep_req_info[] = { + EXTERNAL_REQUESTOR(REGEN1, 0, 0), + EXTERNAL_REQUESTOR(REGEN2, 0, 1), + EXTERNAL_REQUESTOR(SYSEN1, 0, 2), + EXTERNAL_REQUESTOR(SYSEN2, 0, 3), + EXTERNAL_REQUESTOR(CLK32KG, 0, 4), + EXTERNAL_REQUESTOR(CLK32KGAUDIO, 0, 5), + EXTERNAL_REQUESTOR(REGEN3, 0, 6), + EXTERNAL_REQUESTOR(SMPS12, 1, 0), + EXTERNAL_REQUESTOR(SMPS3, 1, 1), + EXTERNAL_REQUESTOR(SMPS45, 1, 2), + EXTERNAL_REQUESTOR(SMPS6, 1, 3), + EXTERNAL_REQUESTOR(SMPS7, 1, 4), + EXTERNAL_REQUESTOR(SMPS8, 1, 5), + EXTERNAL_REQUESTOR(SMPS9, 1, 6), + EXTERNAL_REQUESTOR(SMPS10, 1, 7), + EXTERNAL_REQUESTOR(LDO1, 2, 0), + EXTERNAL_REQUESTOR(LDO2, 2, 1), + EXTERNAL_REQUESTOR(LDO3, 2, 2), + EXTERNAL_REQUESTOR(LDO4, 2, 3), + EXTERNAL_REQUESTOR(LDO5, 2, 4), + EXTERNAL_REQUESTOR(LDO6, 2, 5), + EXTERNAL_REQUESTOR(LDO7, 2, 6), + EXTERNAL_REQUESTOR(LDO8, 2, 7), + EXTERNAL_REQUESTOR(LDO9, 3, 0), + EXTERNAL_REQUESTOR(LDOLN, 3, 1), + EXTERNAL_REQUESTOR(LDOUSB, 3, 2), +}; + static unsigned int palmas_smps_ramp_delay[4] = {0, 10000, 5000, 2500}; #define SMPS_CTRL_MODE_OFF 0x00 @@ -288,11 +324,14 @@ static int palmas_ldo_write(struct palmas *palmas, unsigned int reg, static int palmas_set_mode_smps(struct regulator_dev *dev, unsigned int mode) { struct palmas_pmic *pmic = rdev_get_drvdata(dev); + struct palmas_pmic_driver_data *ddata = pmic->palmas->pmic_ddata; int id = rdev_get_id(dev); unsigned int reg; bool rail_enable = true; - palmas_smps_read(pmic->palmas, palmas_regs_info[id].ctrl_addr, ®); + palmas_smps_read(pmic->palmas, ddata->palmas_regs_info[id].ctrl_addr, + ®); + reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; if (reg == SMPS_CTRL_MODE_OFF) @@ -315,7 +354,7 @@ static int palmas_set_mode_smps(struct regulator_dev *dev, unsigned int mode) pmic->current_reg_mode[id] = reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; if (rail_enable) palmas_smps_write(pmic->palmas, - palmas_regs_info[id].ctrl_addr, reg); + ddata->palmas_regs_info[id].ctrl_addr, reg); return 0; } @@ -343,9 +382,10 @@ static int palmas_smps_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) { struct palmas_pmic *pmic = rdev_get_drvdata(rdev); + struct palmas_pmic_driver_data *ddata = pmic->palmas->pmic_ddata; int id = rdev_get_id(rdev); unsigned int reg = 0; - unsigned int addr = palmas_regs_info[id].tstep_addr; + unsigned int addr = ddata->palmas_regs_info[id].tstep_addr; int ret; /* SMPS3 and SMPS7 do not have tstep_addr setting */ @@ -414,10 +454,12 @@ static struct regulator_ops palmas_ops_smps10 = { static int palmas_is_enabled_ldo(struct regulator_dev *dev) { struct palmas_pmic *pmic = rdev_get_drvdata(dev); + struct palmas_pmic_driver_data *ddata = pmic->palmas->pmic_ddata; int id = rdev_get_id(dev); unsigned int reg; - palmas_ldo_read(pmic->palmas, palmas_regs_info[id].ctrl_addr, ®); + palmas_ldo_read(pmic->palmas, + ddata->palmas_regs_info[id].ctrl_addr, ®); reg &= PALMAS_LDO1_CTRL_STATUS; @@ -478,7 +520,9 @@ static int palmas_smps_init(struct palmas *palmas, int id, unsigned int addr; int ret; - addr = palmas_regs_info[id].ctrl_addr; + struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata; + + addr = ddata->palmas_regs_info[id].ctrl_addr; ret = palmas_smps_read(palmas, addr, ®); if (ret) @@ -513,8 +557,8 @@ static int palmas_smps_init(struct palmas *palmas, int id, if (ret) return ret; - if (palmas_regs_info[id].vsel_addr && reg_init->vsel) { - addr = palmas_regs_info[id].vsel_addr; + if (ddata->palmas_regs_info[id].vsel_addr && reg_init->vsel) { + addr = ddata->palmas_regs_info[id].vsel_addr; reg = reg_init->vsel; @@ -526,7 +570,7 @@ static int palmas_smps_init(struct palmas *palmas, int id, if (reg_init->roof_floor && (id != PALMAS_REG_SMPS10_OUT1) && (id != PALMAS_REG_SMPS10_OUT2)) { /* Enable externally controlled regulator */ - addr = palmas_regs_info[id].ctrl_addr; + addr = ddata->palmas_regs_info[id].ctrl_addr; ret = palmas_smps_read(palmas, addr, ®); if (ret < 0) return ret; @@ -549,7 +593,9 @@ static int palmas_ldo_init(struct palmas *palmas, int id, unsigned int addr; int ret; - addr = palmas_regs_info[id].ctrl_addr; + struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata; + + addr = ddata->palmas_regs_info[id].ctrl_addr; ret = palmas_ldo_read(palmas, addr, ®); if (ret) @@ -571,7 +617,7 @@ static int palmas_ldo_init(struct palmas *palmas, int id, if (reg_init->roof_floor) { /* Enable externally controlled regulator */ - addr = palmas_regs_info[id].ctrl_addr; + addr = ddata->palmas_regs_info[id].ctrl_addr; ret = palmas_update_bits(palmas, PALMAS_LDO_BASE, addr, PALMAS_LDO1_CTRL_MODE_ACTIVE, PALMAS_LDO1_CTRL_MODE_ACTIVE); @@ -593,7 +639,9 @@ static int palmas_extreg_init(struct palmas *palmas, int id, int ret; unsigned int val = 0; - addr = palmas_regs_info[id].ctrl_addr; + struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata; + + addr = ddata->palmas_regs_info[id].ctrl_addr; if (reg_init->mode_sleep) val = PALMAS_REGEN1_CTRL_MODE_SLEEP; @@ -608,7 +656,7 @@ static int palmas_extreg_init(struct palmas *palmas, int id, if (reg_init->roof_floor) { /* Enable externally controlled regulator */ - addr = palmas_regs_info[id].ctrl_addr; + addr = ddata->palmas_regs_info[id].ctrl_addr; ret = palmas_update_bits(palmas, PALMAS_RESOURCE_BASE, addr, PALMAS_REGEN1_CTRL_MODE_ACTIVE, PALMAS_REGEN1_CTRL_MODE_ACTIVE); @@ -629,7 +677,9 @@ static void palmas_enable_ldo8_track(struct palmas *palmas) unsigned int addr; int ret; - addr = palmas_regs_info[PALMAS_REG_LDO8].ctrl_addr; + struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata; + + addr = ddata->palmas_regs_info[PALMAS_REG_LDO8].ctrl_addr; ret = palmas_ldo_read(palmas, addr, ®); if (ret) { @@ -648,7 +698,7 @@ static void palmas_enable_ldo8_track(struct palmas *palmas) * output is defined by the LDO8_VOLTAGE.VSEL register divided by two, * and can be set from 0.45 to 1.65 V. */ - addr = palmas_regs_info[PALMAS_REG_LDO8].vsel_addr; + addr = ddata->palmas_regs_info[PALMAS_REG_LDO8].vsel_addr; ret = palmas_ldo_read(palmas, addr, ®); if (ret) { dev_err(palmas->dev, "Error in reading ldo8 voltage reg\n"); @@ -663,169 +713,131 @@ static void palmas_enable_ldo8_track(struct palmas *palmas) return; } -static struct of_regulator_match palmas_matches[] = { - { .name = "smps12", }, - { .name = "smps123", }, - { .name = "smps3", }, - { .name = "smps45", }, - { .name = "smps457", }, - { .name = "smps6", }, - { .name = "smps7", }, - { .name = "smps8", }, - { .name = "smps9", }, - { .name = "smps10_out2", }, - { .name = "smps10_out1", }, - { .name = "ldo1", }, - { .name = "ldo2", }, - { .name = "ldo3", }, - { .name = "ldo4", }, - { .name = "ldo5", }, - { .name = "ldo6", }, - { .name = "ldo7", }, - { .name = "ldo8", }, - { .name = "ldo9", }, - { .name = "ldoln", }, - { .name = "ldousb", }, - { .name = "regen1", }, - { .name = "regen2", }, - { .name = "regen3", }, - { .name = "sysen1", }, - { .name = "sysen2", }, -}; - -static void palmas_dt_to_pdata(struct device *dev, - struct device_node *node, - struct palmas_pmic_platform_data *pdata) +static int palmas_ldo_registration(struct palmas_pmic *pmic, + struct palmas_pmic_driver_data *ddata, + struct palmas_pmic_platform_data *pdata, + const char *pdev_name, + struct regulator_config config) { - struct device_node *regulators; - u32 prop; - int idx, ret; + int id, ret; + struct regulator_dev *rdev; + struct palmas_reg_init *reg_init; - node = of_node_get(node); - regulators = of_get_child_by_name(node, "regulators"); - if (!regulators) { - dev_info(dev, "regulator node not found\n"); - return; - } + for (id = ddata->ldo_begin; id < ddata->max_reg; id++) { + if (pdata && pdata->reg_init[id]) + reg_init = pdata->reg_init[id]; + else + reg_init = NULL; - ret = of_regulator_match(dev, regulators, palmas_matches, - PALMAS_NUM_REGS); - of_node_put(regulators); - if (ret < 0) { - dev_err(dev, "Error parsing regulator init data: %d\n", ret); - return; - } + /* Miss out regulators which are not available due + * to alternate functions. + */ - for (idx = 0; idx < PALMAS_NUM_REGS; idx++) { - if (!palmas_matches[idx].init_data || - !palmas_matches[idx].of_node) - continue; + /* Register the regulators */ + pmic->desc[id].name = ddata->palmas_regs_info[id].name; + pmic->desc[id].id = id; + pmic->desc[id].type = REGULATOR_VOLTAGE; + pmic->desc[id].owner = THIS_MODULE; - pdata->reg_data[idx] = palmas_matches[idx].init_data; + if (id < PALMAS_REG_REGEN1) { + pmic->desc[id].n_voltages = PALMAS_LDO_NUM_VOLTAGES; + if (reg_init && reg_init->roof_floor) + pmic->desc[id].ops = + &palmas_ops_ext_control_ldo; + else + pmic->desc[id].ops = &palmas_ops_ldo; + pmic->desc[id].min_uV = 900000; + pmic->desc[id].uV_step = 50000; + pmic->desc[id].linear_min_sel = 1; + pmic->desc[id].enable_time = 500; + pmic->desc[id].vsel_reg = + PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, + ddata->palmas_regs_info[id].vsel_addr); + pmic->desc[id].vsel_mask = + PALMAS_LDO1_VOLTAGE_VSEL_MASK; + pmic->desc[id].enable_reg = + PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, + ddata->palmas_regs_info[id].ctrl_addr); + pmic->desc[id].enable_mask = + PALMAS_LDO1_CTRL_MODE_ACTIVE; - pdata->reg_init[idx] = devm_kzalloc(dev, - sizeof(struct palmas_reg_init), GFP_KERNEL); + /* Check if LDO8 is in tracking mode or not */ + if (pdata && (id == PALMAS_REG_LDO8) && + pdata->enable_ldo8_tracking) { + palmas_enable_ldo8_track(pmic->palmas); + pmic->desc[id].min_uV = 450000; + pmic->desc[id].uV_step = 25000; + } - pdata->reg_init[idx]->warm_reset = - of_property_read_bool(palmas_matches[idx].of_node, - "ti,warm-reset"); + /* LOD6 in vibrator mode will have enable time 2000us */ + if (pdata && pdata->ldo6_vibrator && + (id == PALMAS_REG_LDO6)) + pmic->desc[id].enable_time = 2000; + } else { + pmic->desc[id].n_voltages = 1; + if (reg_init && reg_init->roof_floor) + pmic->desc[id].ops = + &palmas_ops_ext_control_extreg; + else + pmic->desc[id].ops = &palmas_ops_extreg; + pmic->desc[id].enable_reg = + PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, + ddata->palmas_regs_info[id].ctrl_addr); + pmic->desc[id].enable_mask = + PALMAS_REGEN1_CTRL_MODE_ACTIVE; + } - ret = of_property_read_u32(palmas_matches[idx].of_node, - "ti,roof-floor", &prop); - /* EINVAL: Property not found */ - if (ret != -EINVAL) { - int econtrol; + if (pdata) + config.init_data = pdata->reg_data[id]; + else + config.init_data = NULL; - /* use default value, when no value is specified */ - econtrol = PALMAS_EXT_CONTROL_NSLEEP; - if (!ret) { - switch (prop) { - case 1: - econtrol = PALMAS_EXT_CONTROL_ENABLE1; - break; - case 2: - econtrol = PALMAS_EXT_CONTROL_ENABLE2; - break; - case 3: - econtrol = PALMAS_EXT_CONTROL_NSLEEP; - break; - default: - WARN_ON(1); - dev_warn(dev, - "%s: Invalid roof-floor option: %u\n", - palmas_matches[idx].name, prop); - break; - } - } - pdata->reg_init[idx]->roof_floor = econtrol; - } + pmic->desc[id].supply_name = ddata->palmas_regs_info[id].sname; + config.of_node = ddata->palmas_matches[id].of_node; - ret = of_property_read_u32(palmas_matches[idx].of_node, - "ti,mode-sleep", &prop); - if (!ret) - pdata->reg_init[idx]->mode_sleep = prop; + rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], + &config); + if (IS_ERR(rdev)) { + dev_err(pmic->dev, + "failed to register %s regulator\n", + pdev_name); + return PTR_ERR(rdev); + } - ret = of_property_read_bool(palmas_matches[idx].of_node, - "ti,smps-range"); - if (ret) - pdata->reg_init[idx]->vsel = - PALMAS_SMPS12_VOLTAGE_RANGE; + /* Save regulator for cleanup */ + pmic->rdev[id] = rdev; - if (idx == PALMAS_REG_LDO8) - pdata->enable_ldo8_tracking = of_property_read_bool( - palmas_matches[idx].of_node, - "ti,enable-ldo8-tracking"); + /* Initialise sleep/init values from platform data */ + if (pdata) { + reg_init = pdata->reg_init[id]; + if (reg_init) { + if (id <= ddata->ldo_end) + ret = palmas_ldo_init(pmic->palmas, id, + reg_init); + else + ret = palmas_extreg_init(pmic->palmas, + id, reg_init); + if (ret) + return ret; + } + } } - pdata->ldo6_vibrator = of_property_read_bool(node, "ti,ldo6-vibrator"); + return 0; } - -static int palmas_regulators_probe(struct platform_device *pdev) +static int palmas_smps_registration(struct palmas_pmic *pmic, + struct palmas_pmic_driver_data *ddata, + struct palmas_pmic_platform_data *pdata, + const char *pdev_name, + struct regulator_config config) { - struct palmas *palmas = dev_get_drvdata(pdev->dev.parent); - struct palmas_pmic_platform_data *pdata = dev_get_platdata(&pdev->dev); - struct device_node *node = pdev->dev.of_node; + int id, ret; + unsigned int addr, reg; struct regulator_dev *rdev; - struct regulator_config config = { }; - struct palmas_pmic *pmic; struct palmas_reg_init *reg_init; - int id = 0, ret; - unsigned int addr, reg; - - if (node && !pdata) { - pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); - - if (!pdata) - return -ENOMEM; - - palmas_dt_to_pdata(&pdev->dev, node, pdata); - } - - pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL); - if (!pmic) - return -ENOMEM; - - pmic->dev = &pdev->dev; - pmic->palmas = palmas; - palmas->pmic = pmic; - platform_set_drvdata(pdev, pmic); - - ret = palmas_smps_read(palmas, PALMAS_SMPS_CTRL, ®); - if (ret) - return ret; - - if (reg & PALMAS_SMPS_CTRL_SMPS12_SMPS123_EN) - pmic->smps123 = 1; - - if (reg & PALMAS_SMPS_CTRL_SMPS45_SMPS457_EN) - pmic->smps457 = 1; - config.regmap = palmas->regmap[REGULATOR_SLAVE]; - config.dev = &pdev->dev; - config.driver_data = pmic; - - for (id = 0; id < PALMAS_REG_LDO1; id++) { + for (id = ddata->smps_start; id <= ddata->smps_end; id++) { bool ramp_delay_support = false; /* @@ -859,7 +871,7 @@ static int palmas_regulators_probe(struct platform_device *pdev) break; case PALMAS_REG_SMPS10_OUT1: case PALMAS_REG_SMPS10_OUT2: - if (!PALMAS_PMIC_HAS(palmas, SMPS10_BOOST)) + if (!PALMAS_PMIC_HAS(pmic->palmas, SMPS10_BOOST)) continue; } @@ -867,10 +879,10 @@ static int palmas_regulators_probe(struct platform_device *pdev) ramp_delay_support = true; if (ramp_delay_support) { - addr = palmas_regs_info[id].tstep_addr; + addr = ddata->palmas_regs_info[id].tstep_addr; ret = palmas_smps_read(pmic->palmas, addr, ®); if (ret < 0) { - dev_err(&pdev->dev, + dev_err(pmic->dev, "reading TSTEP reg failed: %d\n", ret); return ret; } @@ -882,7 +894,7 @@ static int palmas_regulators_probe(struct platform_device *pdev) /* Initialise sleep/init values from platform data */ if (pdata && pdata->reg_init[id]) { reg_init = pdata->reg_init[id]; - ret = palmas_smps_init(palmas, id, reg_init); + ret = palmas_smps_init(pmic->palmas, id, reg_init); if (ret) return ret; } else { @@ -890,7 +902,7 @@ static int palmas_regulators_probe(struct platform_device *pdev) } /* Register the regulators */ - pmic->desc[id].name = palmas_regs_info[id].name; + pmic->desc[id].name = ddata->palmas_regs_info[id].name; pmic->desc[id].id = id; switch (id) { @@ -965,15 +977,15 @@ static int palmas_regulators_probe(struct platform_device *pdev) else config.init_data = NULL; - pmic->desc[id].supply_name = palmas_regs_info[id].sname; - config.of_node = palmas_matches[id].of_node; + pmic->desc[id].supply_name = ddata->palmas_regs_info[id].sname; + config.of_node = ddata->palmas_matches[id].of_node; - rdev = devm_regulator_register(&pdev->dev, &pmic->desc[id], + rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], &config); if (IS_ERR(rdev)) { - dev_err(&pdev->dev, + dev_err(pmic->dev, "failed to register %s regulator\n", - pdev->name); + pdev_name); return PTR_ERR(rdev); } @@ -981,123 +993,237 @@ static int palmas_regulators_probe(struct platform_device *pdev) pmic->rdev[id] = rdev; } - /* Start this loop from the id left from previous loop */ - for (; id < PALMAS_NUM_REGS; id++) { - if (pdata && pdata->reg_init[id]) - reg_init = pdata->reg_init[id]; - else - reg_init = NULL; + return 0; +} - /* Miss out regulators which are not available due - * to alternate functions. - */ +static struct of_regulator_match palmas_matches[] = { + { .name = "smps12", }, + { .name = "smps123", }, + { .name = "smps3", }, + { .name = "smps45", }, + { .name = "smps457", }, + { .name = "smps6", }, + { .name = "smps7", }, + { .name = "smps8", }, + { .name = "smps9", }, + { .name = "smps10_out2", }, + { .name = "smps10_out1", }, + { .name = "ldo1", }, + { .name = "ldo2", }, + { .name = "ldo3", }, + { .name = "ldo4", }, + { .name = "ldo5", }, + { .name = "ldo6", }, + { .name = "ldo7", }, + { .name = "ldo8", }, + { .name = "ldo9", }, + { .name = "ldoln", }, + { .name = "ldousb", }, + { .name = "regen1", }, + { .name = "regen2", }, + { .name = "regen3", }, + { .name = "sysen1", }, + { .name = "sysen2", }, +}; - /* Register the regulators */ - pmic->desc[id].name = palmas_regs_info[id].name; - pmic->desc[id].id = id; - pmic->desc[id].type = REGULATOR_VOLTAGE; - pmic->desc[id].owner = THIS_MODULE; +struct palmas_pmic_driver_data palmas_ddata = { + .smps_start = PALMAS_REG_SMPS12, + .smps_end = PALMAS_REG_SMPS10_OUT1, + .ldo_begin = PALMAS_REG_LDO1, + .ldo_end = PALMAS_REG_LDOUSB, + .max_reg = PALMAS_NUM_REGS, + .palmas_regs_info = palmas_regs_info, + .palmas_matches = palmas_matches, + .sleep_req_info = palma_sleep_req_info, + .smps_register = palmas_smps_registration, + .ldo_register = palmas_ldo_registration, +}; - if (id < PALMAS_REG_REGEN1) { - pmic->desc[id].n_voltages = PALMAS_LDO_NUM_VOLTAGES; - if (reg_init && reg_init->roof_floor) - pmic->desc[id].ops = - &palmas_ops_ext_control_ldo; - else - pmic->desc[id].ops = &palmas_ops_ldo; - pmic->desc[id].min_uV = 900000; - pmic->desc[id].uV_step = 50000; - pmic->desc[id].linear_min_sel = 1; - pmic->desc[id].enable_time = 500; - pmic->desc[id].vsel_reg = - PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, - palmas_regs_info[id].vsel_addr); - pmic->desc[id].vsel_mask = - PALMAS_LDO1_VOLTAGE_VSEL_MASK; - pmic->desc[id].enable_reg = - PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, - palmas_regs_info[id].ctrl_addr); - pmic->desc[id].enable_mask = - PALMAS_LDO1_CTRL_MODE_ACTIVE; +static void palmas_dt_to_pdata(struct device *dev, + struct device_node *node, + struct palmas_pmic_platform_data *pdata, + struct palmas_pmic_driver_data *ddata) +{ + struct device_node *regulators; + u32 prop; + int idx, ret; - /* Check if LDO8 is in tracking mode or not */ - if (pdata && (id == PALMAS_REG_LDO8) && - pdata->enable_ldo8_tracking) { - palmas_enable_ldo8_track(palmas); - pmic->desc[id].min_uV = 450000; - pmic->desc[id].uV_step = 25000; - } + node = of_node_get(node); + regulators = of_get_child_by_name(node, "regulators"); + if (!regulators) { + dev_info(dev, "regulator node not found\n"); + return; + } - /* LOD6 in vibrator mode will have enable time 2000us */ - if (pdata && pdata->ldo6_vibrator && - (id == PALMAS_REG_LDO6)) - pmic->desc[id].enable_time = 2000; - } else { - pmic->desc[id].n_voltages = 1; - if (reg_init && reg_init->roof_floor) - pmic->desc[id].ops = - &palmas_ops_ext_control_extreg; - else - pmic->desc[id].ops = &palmas_ops_extreg; - pmic->desc[id].enable_reg = - PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, - palmas_regs_info[id].ctrl_addr); - pmic->desc[id].enable_mask = - PALMAS_REGEN1_CTRL_MODE_ACTIVE; - } + ret = of_regulator_match(dev, regulators, ddata->palmas_matches, + ddata->max_reg); + of_node_put(regulators); + if (ret < 0) { + dev_err(dev, "Error parsing regulator init data: %d\n", ret); + return; + } - if (pdata) - config.init_data = pdata->reg_data[id]; - else - config.init_data = NULL; + for (idx = 0; idx < ddata->max_reg; idx++) { + if (!ddata->palmas_matches[idx].init_data || + !ddata->palmas_matches[idx].of_node) + continue; - pmic->desc[id].supply_name = palmas_regs_info[id].sname; - config.of_node = palmas_matches[id].of_node; + pdata->reg_data[idx] = ddata->palmas_matches[idx].init_data; - rdev = devm_regulator_register(&pdev->dev, &pmic->desc[id], - &config); - if (IS_ERR(rdev)) { - dev_err(&pdev->dev, - "failed to register %s regulator\n", - pdev->name); - return PTR_ERR(rdev); - } + pdata->reg_init[idx] = devm_kzalloc(dev, + sizeof(struct palmas_reg_init), GFP_KERNEL); - /* Save regulator for cleanup */ - pmic->rdev[id] = rdev; + pdata->reg_init[idx]->warm_reset = + of_property_read_bool(ddata->palmas_matches[idx].of_node, + "ti,warm-reset"); - /* Initialise sleep/init values from platform data */ - if (pdata) { - reg_init = pdata->reg_init[id]; - if (reg_init) { - if (id < PALMAS_REG_REGEN1) - ret = palmas_ldo_init(palmas, - id, reg_init); - else - ret = palmas_extreg_init(palmas, - id, reg_init); - if (ret) - return ret; + ret = of_property_read_u32(ddata->palmas_matches[idx].of_node, + "ti,roof-floor", &prop); + /* EINVAL: Property not found */ + if (ret != -EINVAL) { + int econtrol; + + /* use default value, when no value is specified */ + econtrol = PALMAS_EXT_CONTROL_NSLEEP; + if (!ret) { + switch (prop) { + case 1: + econtrol = PALMAS_EXT_CONTROL_ENABLE1; + break; + case 2: + econtrol = PALMAS_EXT_CONTROL_ENABLE2; + break; + case 3: + econtrol = PALMAS_EXT_CONTROL_NSLEEP; + break; + default: + WARN_ON(1); + dev_warn(dev, + "%s: Invalid roof-floor option: %u\n", + palmas_matches[idx].name, prop); + break; + } } + pdata->reg_init[idx]->roof_floor = econtrol; } - } + ret = of_property_read_u32(ddata->palmas_matches[idx].of_node, + "ti,mode-sleep", &prop); + if (!ret) + pdata->reg_init[idx]->mode_sleep = prop; - return 0; + ret = of_property_read_bool(ddata->palmas_matches[idx].of_node, + "ti,smps-range"); + if (ret) + pdata->reg_init[idx]->vsel = + PALMAS_SMPS12_VOLTAGE_RANGE; + + if (idx == PALMAS_REG_LDO8) + pdata->enable_ldo8_tracking = of_property_read_bool( + ddata->palmas_matches[idx].of_node, + "ti,enable-ldo8-tracking"); + } + + pdata->ldo6_vibrator = of_property_read_bool(node, "ti,ldo6-vibrator"); } -static const struct of_device_id of_palmas_match_tbl[] = { - { .compatible = "ti,palmas-pmic", }, - { .compatible = "ti,twl6035-pmic", }, - { .compatible = "ti,twl6036-pmic", }, - { .compatible = "ti,twl6037-pmic", }, - { .compatible = "ti,tps65913-pmic", }, - { .compatible = "ti,tps65914-pmic", }, - { .compatible = "ti,tps80036-pmic", }, - { .compatible = "ti,tps659038-pmic", }, +static struct of_device_id of_palmas_match_tbl[] = { + { + .compatible = "ti,palmas-pmic", + .data = &palmas_ddata, + }, + { + .compatible = "ti,twl6035-pmic", + .data = &palmas_ddata, + }, + { + .compatible = "ti,twl6036-pmic", + .data = &palmas_ddata, + }, + { + .compatible = "ti,twl6037-pmic", + .data = &palmas_ddata, + }, + { + .compatible = "ti,tps65913-pmic", + .data = &palmas_ddata, + }, + { + .compatible = "ti,tps65914-pmic", + .data = &palmas_ddata, + }, + { + .compatible = "ti,tps80036-pmic", + .data = &palmas_ddata, + }, + { + .compatible = "ti,tps659038-pmic", + .data = &palmas_ddata, + }, { /* end */ } }; +static int palmas_regulators_probe(struct platform_device *pdev) +{ + struct palmas *palmas = dev_get_drvdata(pdev->dev.parent); + struct palmas_pmic_platform_data *pdata = dev_get_platdata(&pdev->dev); + struct device_node *node = pdev->dev.of_node; + struct palmas_pmic_driver_data *driver_data; + struct regulator_config config = { }; + struct palmas_pmic *pmic; + const char *pdev_name; + const struct of_device_id *match; + int ret = 0; + unsigned int reg; + + match = of_match_device(of_match_ptr(of_palmas_match_tbl), &pdev->dev); + + if (!match) + return -ENODATA; + + driver_data = (struct palmas_pmic_driver_data *)match->data; + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return -ENOMEM; + + pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL); + if (!pmic) + return -ENOMEM; + + pmic->dev = &pdev->dev; + pmic->palmas = palmas; + palmas->pmic = pmic; + platform_set_drvdata(pdev, pmic); + pmic->palmas->pmic_ddata = driver_data; + + palmas_dt_to_pdata(&pdev->dev, node, pdata, driver_data); + + ret = palmas_smps_read(palmas, PALMAS_SMPS_CTRL, ®); + if (ret) + return ret; + + if (reg & PALMAS_SMPS_CTRL_SMPS12_SMPS123_EN) + pmic->smps123 = 1; + + if (reg & PALMAS_SMPS_CTRL_SMPS45_SMPS457_EN) + pmic->smps457 = 1; + + config.regmap = palmas->regmap[REGULATOR_SLAVE]; + config.dev = &pdev->dev; + config.driver_data = pmic; + pdev_name = pdev->name; + + ret = driver_data->smps_register(pmic, driver_data, pdata, pdev_name, + config); + if (ret) + return ret; + + ret = driver_data->ldo_register(pmic, driver_data, pdata, pdev_name, + config); + + return ret; +} + static struct platform_driver palmas_driver = { .driver = { .name = "palmas-pmic", -- cgit v1.2.3-70-g09d2 From d6f83370ed978d5570b7c8c22988310cb9376202 Mon Sep 17 00:00:00 2001 From: Keerthy Date: Wed, 18 Jun 2014 15:29:00 +0530 Subject: regulator: palmas: Add tps65917 PMIC support Add tps65917 PMIC support. Signed-off-by: Keerthy Signed-off-by: Mark Brown --- drivers/regulator/palmas-regulator.c | 387 +++++++++++++++++++++++++++++++++++ 1 file changed, 387 insertions(+) (limited to 'drivers/regulator') diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index aa8e5516752e..8fa651e998da 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c @@ -227,6 +227,94 @@ static struct regs_info palmas_regs_info[] = { }, }; +static struct regs_info tps65917_regs_info[] = { + { + .name = "SMPS1", + .sname = "smps1-in", + .vsel_addr = TPS65917_SMPS1_VOLTAGE, + .ctrl_addr = TPS65917_SMPS1_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_SMPS1, + }, + { + .name = "SMPS2", + .sname = "smps2-in", + .vsel_addr = TPS65917_SMPS2_VOLTAGE, + .ctrl_addr = TPS65917_SMPS2_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_SMPS2, + }, + { + .name = "SMPS3", + .sname = "smps3-in", + .vsel_addr = TPS65917_SMPS3_VOLTAGE, + .ctrl_addr = TPS65917_SMPS3_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_SMPS3, + }, + { + .name = "SMPS4", + .sname = "smps4-in", + .vsel_addr = TPS65917_SMPS4_VOLTAGE, + .ctrl_addr = TPS65917_SMPS4_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_SMPS4, + }, + { + .name = "SMPS5", + .sname = "smps5-in", + .vsel_addr = TPS65917_SMPS5_VOLTAGE, + .ctrl_addr = TPS65917_SMPS5_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_SMPS5, + }, + { + .name = "LDO1", + .sname = "ldo1-in", + .vsel_addr = TPS65917_LDO1_VOLTAGE, + .ctrl_addr = TPS65917_LDO1_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_LDO1, + }, + { + .name = "LDO2", + .sname = "ldo2-in", + .vsel_addr = TPS65917_LDO2_VOLTAGE, + .ctrl_addr = TPS65917_LDO2_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_LDO2, + }, + { + .name = "LDO3", + .sname = "ldo3-in", + .vsel_addr = TPS65917_LDO3_VOLTAGE, + .ctrl_addr = TPS65917_LDO3_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_LDO3, + }, + { + .name = "LDO4", + .sname = "ldo4-in", + .vsel_addr = TPS65917_LDO4_VOLTAGE, + .ctrl_addr = TPS65917_LDO4_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_LDO4, + }, + { + .name = "LDO5", + .sname = "ldo5-in", + .vsel_addr = TPS65917_LDO5_VOLTAGE, + .ctrl_addr = TPS65917_LDO5_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_LDO5, + }, + { + .name = "REGEN1", + .ctrl_addr = TPS65917_REGEN1_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_REGEN1, + }, + { + .name = "REGEN2", + .ctrl_addr = TPS65917_REGEN2_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_REGEN2, + }, + { + .name = "REGEN3", + .ctrl_addr = TPS65917_REGEN3_CTRL, + .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_REGEN3, + }, +}; + #define EXTERNAL_REQUESTOR(_id, _offset, _pos) \ [PALMAS_EXTERNAL_REQSTR_ID_##_id] = { \ .id = PALMAS_EXTERNAL_REQSTR_ID_##_id, \ @@ -263,6 +351,29 @@ struct palmas_sleep_requestor_info palma_sleep_req_info[] = { EXTERNAL_REQUESTOR(LDOUSB, 3, 2), }; +#define EXTERNAL_REQUESTOR_TPS65917(_id, _offset, _pos) \ + [TPS65917_EXTERNAL_REQSTR_ID_##_id] = { \ + .id = TPS65917_EXTERNAL_REQSTR_ID_##_id, \ + .reg_offset = _offset, \ + .bit_pos = _pos, \ + } + +static struct palmas_sleep_requestor_info tps65917_sleep_req_info[] = { + EXTERNAL_REQUESTOR_TPS65917(REGEN1, 0, 0), + EXTERNAL_REQUESTOR_TPS65917(REGEN2, 0, 1), + EXTERNAL_REQUESTOR_TPS65917(REGEN3, 0, 6), + EXTERNAL_REQUESTOR_TPS65917(SMPS1, 1, 0), + EXTERNAL_REQUESTOR_TPS65917(SMPS2, 1, 1), + EXTERNAL_REQUESTOR_TPS65917(SMPS3, 1, 2), + EXTERNAL_REQUESTOR_TPS65917(SMPS4, 1, 3), + EXTERNAL_REQUESTOR_TPS65917(SMPS5, 1, 4), + EXTERNAL_REQUESTOR_TPS65917(LDO1, 2, 0), + EXTERNAL_REQUESTOR_TPS65917(LDO2, 2, 1), + EXTERNAL_REQUESTOR_TPS65917(LDO3, 2, 2), + EXTERNAL_REQUESTOR_TPS65917(LDO4, 2, 3), + EXTERNAL_REQUESTOR_TPS65917(LDO5, 2, 4), +}; + static unsigned int palmas_smps_ramp_delay[4] = {0, 10000, 5000, 2500}; #define SMPS_CTRL_MODE_OFF 0x00 @@ -451,6 +562,28 @@ static struct regulator_ops palmas_ops_smps10 = { .get_bypass = regulator_get_bypass_regmap, }; +static struct regulator_ops tps65917_ops_smps = { + .is_enabled = regulator_is_enabled_regmap, + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .set_mode = palmas_set_mode_smps, + .get_mode = palmas_get_mode_smps, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .list_voltage = regulator_list_voltage_linear_range, + .map_voltage = regulator_map_voltage_linear_range, + .set_voltage_time_sel = regulator_set_voltage_time_sel, +}; + +static struct regulator_ops tps65917_ops_ext_control_smps = { + .set_mode = palmas_set_mode_smps, + .get_mode = palmas_get_mode_smps, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .list_voltage = regulator_list_voltage_linear_range, + .map_voltage = regulator_map_voltage_linear_range, +}; + static int palmas_is_enabled_ldo(struct regulator_dev *dev) { struct palmas_pmic *pmic = rdev_get_drvdata(dev); @@ -492,6 +625,17 @@ static struct regulator_ops palmas_ops_extreg = { static struct regulator_ops palmas_ops_ext_control_extreg = { }; +static struct regulator_ops tps65917_ops_ldo = { + .is_enabled = palmas_is_enabled_ldo, + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .list_voltage = regulator_list_voltage_linear, + .map_voltage = regulator_map_voltage_linear, + .set_voltage_time_sel = regulator_set_voltage_time_sel, +}; + static int palmas_regulator_config_external(struct palmas *palmas, int id, struct palmas_reg_init *reg_init) { @@ -826,6 +970,111 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic, return 0; } +static int tps65917_ldo_registration(struct palmas_pmic *pmic, + struct palmas_pmic_driver_data *ddata, + struct palmas_pmic_platform_data *pdata, + const char *pdev_name, + struct regulator_config config) +{ + int id, ret; + struct regulator_dev *rdev; + struct palmas_reg_init *reg_init; + + for (id = ddata->ldo_begin; id < ddata->max_reg; id++) { + if (pdata && pdata->reg_init[id]) + reg_init = pdata->reg_init[id]; + else + reg_init = NULL; + + /* Miss out regulators which are not available due + * to alternate functions. + */ + + /* Register the regulators */ + pmic->desc[id].name = ddata->palmas_regs_info[id].name; + pmic->desc[id].id = id; + pmic->desc[id].type = REGULATOR_VOLTAGE; + pmic->desc[id].owner = THIS_MODULE; + + if (id < TPS65917_REG_REGEN1) { + pmic->desc[id].n_voltages = PALMAS_LDO_NUM_VOLTAGES; + if (reg_init && reg_init->roof_floor) + pmic->desc[id].ops = + &palmas_ops_ext_control_ldo; + else + pmic->desc[id].ops = &tps65917_ops_ldo; + pmic->desc[id].min_uV = 900000; + pmic->desc[id].uV_step = 50000; + pmic->desc[id].linear_min_sel = 1; + pmic->desc[id].enable_time = 500; + pmic->desc[id].vsel_reg = + PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, + ddata->palmas_regs_info[id].vsel_addr); + pmic->desc[id].vsel_mask = + PALMAS_LDO1_VOLTAGE_VSEL_MASK; + pmic->desc[id].enable_reg = + PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, + ddata->palmas_regs_info[id].ctrl_addr); + pmic->desc[id].enable_mask = + PALMAS_LDO1_CTRL_MODE_ACTIVE; + /* + * To be confirmed. Discussion on going with PMIC Team. + * It is of the order of ~60mV/uS. + */ + pmic->desc[id].ramp_delay = 2500; + } else { + pmic->desc[id].n_voltages = 1; + if (reg_init && reg_init->roof_floor) + pmic->desc[id].ops = + &palmas_ops_ext_control_extreg; + else + pmic->desc[id].ops = &palmas_ops_extreg; + pmic->desc[id].enable_reg = + PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, + ddata->palmas_regs_info[id].ctrl_addr); + pmic->desc[id].enable_mask = + PALMAS_REGEN1_CTRL_MODE_ACTIVE; + } + + if (pdata) + config.init_data = pdata->reg_data[id]; + else + config.init_data = NULL; + + pmic->desc[id].supply_name = ddata->palmas_regs_info[id].sname; + config.of_node = ddata->palmas_matches[id].of_node; + + rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], + &config); + if (IS_ERR(rdev)) { + dev_err(pmic->dev, + "failed to register %s regulator\n", + pdev_name); + return PTR_ERR(rdev); + } + + /* Save regulator for cleanup */ + pmic->rdev[id] = rdev; + + /* Initialise sleep/init values from platform data */ + if (pdata) { + reg_init = pdata->reg_init[id]; + if (reg_init) { + if (id < TPS65917_REG_REGEN1) + ret = palmas_ldo_init(pmic->palmas, + id, reg_init); + else + ret = palmas_extreg_init(pmic->palmas, + id, reg_init); + if (ret) + return ret; + } + } + } + + return 0; +} + static int palmas_smps_registration(struct palmas_pmic *pmic, struct palmas_pmic_driver_data *ddata, struct palmas_pmic_platform_data *pdata, @@ -996,6 +1245,109 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, return 0; } +static int tps65917_smps_registration(struct palmas_pmic *pmic, + struct palmas_pmic_driver_data *ddata, + struct palmas_pmic_platform_data *pdata, + const char *pdev_name, + struct regulator_config config) +{ + int id, ret; + unsigned int addr, reg; + struct regulator_dev *rdev; + struct palmas_reg_init *reg_init; + + for (id = ddata->smps_start; id <= ddata->smps_end; id++) { + /* + * Miss out regulators which are not available due + * to slaving configurations. + */ + pmic->desc[id].n_linear_ranges = 3; + if ((id == TPS65917_REG_SMPS2) && pmic->smps12) + continue; + + /* Initialise sleep/init values from platform data */ + if (pdata && pdata->reg_init[id]) { + reg_init = pdata->reg_init[id]; + ret = palmas_smps_init(pmic->palmas, id, reg_init); + if (ret) + return ret; + } else { + reg_init = NULL; + } + + /* Register the regulators */ + pmic->desc[id].name = ddata->palmas_regs_info[id].name; + pmic->desc[id].id = id; + + /* + * Read and store the RANGE bit for later use + * This must be done before regulator is probed, + * otherwise we error in probe with unsupportable + * ranges. Read the current smps mode for later use. + */ + addr = ddata->palmas_regs_info[id].vsel_addr; + + ret = palmas_smps_read(pmic->palmas, addr, ®); + if (ret) + return ret; + if (reg & TPS65917_SMPS1_VOLTAGE_RANGE) + pmic->range[id] = 1; + + if (pmic->range[id]) + pmic->desc[id].linear_ranges = smps_high_ranges; + else + pmic->desc[id].linear_ranges = smps_low_ranges; + + + if (reg_init && reg_init->roof_floor) + pmic->desc[id].ops = + &tps65917_ops_ext_control_smps; + else + pmic->desc[id].ops = &tps65917_ops_smps; + pmic->desc[id].n_voltages = PALMAS_SMPS_NUM_VOLTAGES; + pmic->desc[id].vsel_reg = + PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, + tps65917_regs_info[id].vsel_addr); + pmic->desc[id].vsel_mask = + PALMAS_SMPS12_VOLTAGE_VSEL_MASK; + + pmic->desc[id].ramp_delay = 2500; + + /* Read the smps mode for later use. */ + addr = ddata->palmas_regs_info[id].ctrl_addr; + ret = palmas_smps_read(pmic->palmas, addr, ®); + if (ret) + return ret; + pmic->current_reg_mode[id] = reg & + PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; + + pmic->desc[id].type = REGULATOR_VOLTAGE; + pmic->desc[id].owner = THIS_MODULE; + + if (pdata) + config.init_data = pdata->reg_data[id]; + else + config.init_data = NULL; + + pmic->desc[id].supply_name = ddata->palmas_regs_info[id].sname; + config.of_node = ddata->palmas_matches[id].of_node; + + rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], + &config); + if (IS_ERR(rdev)) { + dev_err(pmic->dev, + "failed to register %s regulator\n", + pdev_name); + return PTR_ERR(rdev); + } + + /* Save regulator for cleanup */ + pmic->rdev[id] = rdev; + } + + return 0; +} + static struct of_regulator_match palmas_matches[] = { { .name = "smps12", }, { .name = "smps123", }, @@ -1026,6 +1378,24 @@ static struct of_regulator_match palmas_matches[] = { { .name = "sysen2", }, }; +static struct of_regulator_match tps65917_matches[] = { + { .name = "smps1", }, + { .name = "smps2", }, + { .name = "smps3", }, + { .name = "smps4", }, + { .name = "smps5", }, + { .name = "ldo1", }, + { .name = "ldo2", }, + { .name = "ldo3", }, + { .name = "ldo4", }, + { .name = "ldo5", }, + { .name = "regen1", }, + { .name = "regen2", }, + { .name = "regen3", }, + { .name = "sysen1", }, + { .name = "sysen2", }, +}; + struct palmas_pmic_driver_data palmas_ddata = { .smps_start = PALMAS_REG_SMPS12, .smps_end = PALMAS_REG_SMPS10_OUT1, @@ -1039,6 +1409,19 @@ struct palmas_pmic_driver_data palmas_ddata = { .ldo_register = palmas_ldo_registration, }; +struct palmas_pmic_driver_data tps65917_ddata = { + .smps_start = TPS65917_REG_SMPS1, + .smps_end = TPS65917_REG_SMPS5, + .ldo_begin = TPS65917_REG_LDO1, + .ldo_end = TPS65917_REG_LDO5, + .max_reg = TPS65917_NUM_REGS, + .palmas_regs_info = tps65917_regs_info, + .palmas_matches = tps65917_matches, + .sleep_req_info = tps65917_sleep_req_info, + .smps_register = tps65917_smps_registration, + .ldo_register = tps65917_ldo_registration, +}; + static void palmas_dt_to_pdata(struct device *dev, struct device_node *node, struct palmas_pmic_platform_data *pdata, @@ -1159,6 +1542,10 @@ static struct of_device_id of_palmas_match_tbl[] = { { .compatible = "ti,tps659038-pmic", .data = &palmas_ddata, + }, + { + .compatible = "ti,tps65917-pmic", + .data = &tps65917_ddata, }, { /* end */ } }; -- cgit v1.2.3-70-g09d2 From d7da152c52c15b41e4b4c9a9319d844a890ecb09 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Mon, 16 Jun 2014 10:12:25 +0800 Subject: regulator: max8952: Convert to devm_gpio_request_one() Signed-off-by: Axel Lin Signed-off-by: Mark Brown --- drivers/regulator/max8952.c | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/max8952.c b/drivers/regulator/max8952.c index c2792f0271ab..f7f9efcfedb7 100644 --- a/drivers/regulator/max8952.c +++ b/drivers/regulator/max8952.c @@ -229,7 +229,6 @@ static int max8952_pmic_probe(struct i2c_client *client, config.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH; rdev = devm_regulator_register(&client->dev, ®ulator, &config); - if (IS_ERR(rdev)) { ret = PTR_ERR(rdev); dev_err(&client->dev, "regulator init failed (%d)\n", ret); @@ -241,21 +240,19 @@ static int max8952_pmic_probe(struct i2c_client *client, if (gpio_is_valid(pdata->gpio_vid0) && gpio_is_valid(pdata->gpio_vid1)) { - if (!gpio_request(pdata->gpio_vid0, "MAX8952 VID0")) - gpio_direction_output(pdata->gpio_vid0, - (pdata->default_mode) & 0x1); - else + unsigned long gpio_flags; + + gpio_flags = max8952->vid0 ? + GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; + if (devm_gpio_request_one(&client->dev, pdata->gpio_vid0, + gpio_flags, "MAX8952 VID0")) err = 1; - if (!gpio_request(pdata->gpio_vid1, "MAX8952 VID1")) - gpio_direction_output(pdata->gpio_vid1, - (pdata->default_mode >> 1) & 0x1); - else { - if (!err) - gpio_free(pdata->gpio_vid0); + gpio_flags = max8952->vid1 ? + GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; + if (devm_gpio_request_one(&client->dev, pdata->gpio_vid1, + gpio_flags, "MAX8952 VID1")) err = 2; - } - } else err = 3; @@ -314,16 +311,6 @@ static int max8952_pmic_probe(struct i2c_client *client, return 0; } -static int max8952_pmic_remove(struct i2c_client *client) -{ - struct max8952_data *max8952 = i2c_get_clientdata(client); - struct max8952_platform_data *pdata = max8952->pdata; - - gpio_free(pdata->gpio_vid0); - gpio_free(pdata->gpio_vid1); - return 0; -} - static const struct i2c_device_id max8952_ids[] = { { "max8952", 0 }, { }, @@ -332,7 +319,6 @@ MODULE_DEVICE_TABLE(i2c, max8952_ids); static struct i2c_driver max8952_pmic_driver = { .probe = max8952_pmic_probe, - .remove = max8952_pmic_remove, .driver = { .name = "max8952", .of_match_table = of_match_ptr(max8952_dt_match), -- cgit v1.2.3-70-g09d2 From 4b09e17b6f9cec1b50991fa66d7b51bef38221d8 Mon Sep 17 00:00:00 2001 From: Nishanth Menon Date: Mon, 30 Jun 2014 10:57:34 -0500 Subject: regulator: palmas: Squelch sparse warnings convert to static variables to squelch the following sparse warnings: drivers/regulator/palmas-regulator.c:325:36: warning: symbol 'palma_sleep_req_info' was not declared. Should it be static? drivers/regulator/palmas-regulator.c:1414:32: warning: symbol 'palmas_ddata' was not declared. Should it be static? drivers/regulator/palmas-regulator.c:1427:32: warning: symbol 'tps65917_ddata' was not declared. Should it be static? Signed-off-by: Nishanth Menon Tested-by: Stephen Warren Tested-by: Keerthy Signed-off-by: Mark Brown --- drivers/regulator/palmas-regulator.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index 7c8b4417d7d8..91f60fa91d4b 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c @@ -322,7 +322,7 @@ static struct regs_info tps65917_regs_info[] = { .bit_pos = _pos, \ } -struct palmas_sleep_requestor_info palma_sleep_req_info[] = { +static struct palmas_sleep_requestor_info palma_sleep_req_info[] = { EXTERNAL_REQUESTOR(REGEN1, 0, 0), EXTERNAL_REQUESTOR(REGEN2, 0, 1), EXTERNAL_REQUESTOR(SYSEN1, 0, 2), @@ -1408,7 +1408,7 @@ static struct of_regulator_match tps65917_matches[] = { { .name = "sysen2", }, }; -struct palmas_pmic_driver_data palmas_ddata = { +static struct palmas_pmic_driver_data palmas_ddata = { .smps_start = PALMAS_REG_SMPS12, .smps_end = PALMAS_REG_SMPS10_OUT1, .ldo_begin = PALMAS_REG_LDO1, @@ -1421,7 +1421,7 @@ struct palmas_pmic_driver_data palmas_ddata = { .ldo_register = palmas_ldo_registration, }; -struct palmas_pmic_driver_data tps65917_ddata = { +static struct palmas_pmic_driver_data tps65917_ddata = { .smps_start = TPS65917_REG_SMPS1, .smps_end = TPS65917_REG_SMPS5, .ldo_begin = TPS65917_REG_LDO1, -- cgit v1.2.3-70-g09d2 From e7cf34ef396d6ceaa776661830d4ce332da650f0 Mon Sep 17 00:00:00 2001 From: Nishanth Menon Date: Mon, 30 Jun 2014 10:57:35 -0500 Subject: regulator: palmas: Rename reg_info to palmas_reg_info reg_info is a generic term which might cause conflict at a later point in time. To prevent such a thing from occuring in future, rename to palmas_reg_info. Signed-off-by: Nishanth Menon Acked-by: Lee Jones Tested-by: Stephen Warren Tested-by: Keerthy Signed-off-by: Mark Brown --- drivers/regulator/palmas-regulator.c | 4 ++-- include/linux/mfd/palmas.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index 91f60fa91d4b..05f11b96e17f 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c @@ -41,7 +41,7 @@ static const struct regulator_linear_range smps_high_ranges[] = { REGULATOR_LINEAR_RANGE(3300000, 0x7A, 0x7f, 0), }; -static struct regs_info palmas_regs_info[] = { +static struct palmas_regs_info palmas_regs_info[] = { { .name = "SMPS12", .sname = "smps1-in", @@ -227,7 +227,7 @@ static struct regs_info palmas_regs_info[] = { }, }; -static struct regs_info tps65917_regs_info[] = { +static struct palmas_regs_info tps65917_regs_info[] = { { .name = "SMPS1", .sname = "smps1-in", diff --git a/include/linux/mfd/palmas.h b/include/linux/mfd/palmas.h index 1a045ba32c13..fb0390a1a498 100644 --- a/include/linux/mfd/palmas.h +++ b/include/linux/mfd/palmas.h @@ -102,7 +102,7 @@ struct palmas_sleep_requestor_info { int bit_pos; }; -struct regs_info { +struct palmas_regs_info { char *name; char *sname; u8 vsel_addr; @@ -117,7 +117,7 @@ struct palmas_pmic_driver_data { int ldo_begin; int ldo_end; int max_reg; - struct regs_info *palmas_regs_info; + struct palmas_regs_info *palmas_regs_info; struct of_regulator_match *palmas_matches; struct palmas_sleep_requestor_info *sleep_req_info; int (*smps_register)(struct palmas_pmic *pmic, -- cgit v1.2.3-70-g09d2 From cf910b6b7101dae5eabaf2249b427e7698095abd Mon Sep 17 00:00:00 2001 From: Nishanth Menon Date: Mon, 30 Jun 2014 10:57:36 -0500 Subject: regulator: palmas: Simplify code by using pointer to palmas_reg_info Palmas register information is part of the ddata pointer which is used through out the code by indexing off the driver data array. Instead, just do the indexing once and use the pointer to further reference structure fields. This simplifies code and prevents errors by accessing wrong variables. Signed-off-by: Nishanth Menon Tested-by: Stephen Warren Tested-by: Keerthy Signed-off-by: Mark Brown --- drivers/regulator/palmas-regulator.c | 109 ++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 53 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index 05f11b96e17f..f75fb90d7db3 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c @@ -434,14 +434,14 @@ static int palmas_ldo_write(struct palmas *palmas, unsigned int reg, static int palmas_set_mode_smps(struct regulator_dev *dev, unsigned int mode) { + int id = rdev_get_id(dev); struct palmas_pmic *pmic = rdev_get_drvdata(dev); struct palmas_pmic_driver_data *ddata = pmic->palmas->pmic_ddata; - int id = rdev_get_id(dev); + struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id]; unsigned int reg; bool rail_enable = true; - palmas_smps_read(pmic->palmas, ddata->palmas_regs_info[id].ctrl_addr, - ®); + palmas_smps_read(pmic->palmas, rinfo->ctrl_addr, ®); reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; @@ -464,8 +464,7 @@ static int palmas_set_mode_smps(struct regulator_dev *dev, unsigned int mode) pmic->current_reg_mode[id] = reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; if (rail_enable) - palmas_smps_write(pmic->palmas, - ddata->palmas_regs_info[id].ctrl_addr, reg); + palmas_smps_write(pmic->palmas, rinfo->ctrl_addr, reg); /* Switch the enable value to ensure this is used for enable */ pmic->desc[id].enable_val = pmic->current_reg_mode[id]; @@ -496,11 +495,11 @@ static unsigned int palmas_get_mode_smps(struct regulator_dev *dev) static int palmas_smps_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) { + int id = rdev_get_id(rdev); struct palmas_pmic *pmic = rdev_get_drvdata(rdev); struct palmas_pmic_driver_data *ddata = pmic->palmas->pmic_ddata; - int id = rdev_get_id(rdev); + struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id]; unsigned int reg = 0; - unsigned int addr = ddata->palmas_regs_info[id].tstep_addr; int ret; /* SMPS3 and SMPS7 do not have tstep_addr setting */ @@ -519,7 +518,7 @@ static int palmas_smps_set_ramp_delay(struct regulator_dev *rdev, else reg = 1; - ret = palmas_smps_write(pmic->palmas, addr, reg); + ret = palmas_smps_write(pmic->palmas, rinfo->tstep_addr, reg); if (ret < 0) { dev_err(pmic->palmas->dev, "TSTEP write failed: %d\n", ret); return ret; @@ -590,13 +589,13 @@ static struct regulator_ops tps65917_ops_ext_control_smps = { static int palmas_is_enabled_ldo(struct regulator_dev *dev) { + int id = rdev_get_id(dev); struct palmas_pmic *pmic = rdev_get_drvdata(dev); struct palmas_pmic_driver_data *ddata = pmic->palmas->pmic_ddata; - int id = rdev_get_id(dev); + struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id]; unsigned int reg; - palmas_ldo_read(pmic->palmas, - ddata->palmas_regs_info[id].ctrl_addr, ®); + palmas_ldo_read(pmic->palmas, rinfo->ctrl_addr, ®); reg &= PALMAS_LDO1_CTRL_STATUS; @@ -643,11 +642,12 @@ static struct regulator_ops tps65917_ops_ldo = { static int palmas_regulator_config_external(struct palmas *palmas, int id, struct palmas_reg_init *reg_init) { - int sleep_id = palmas_regs_info[id].sleep_id; + struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata; + struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id]; int ret; - ret = palmas_ext_control_req_config(palmas, sleep_id, - reg_init->roof_floor, true); + ret = palmas_ext_control_req_config(palmas, rinfo->sleep_id, + reg_init->roof_floor, true); if (ret < 0) dev_err(palmas->dev, "Ext control config for regulator %d failed %d\n", @@ -665,12 +665,10 @@ static int palmas_smps_init(struct palmas *palmas, int id, struct palmas_reg_init *reg_init) { unsigned int reg; - unsigned int addr; int ret; - struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata; - - addr = ddata->palmas_regs_info[id].ctrl_addr; + struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id]; + unsigned int addr = rinfo->ctrl_addr; ret = palmas_smps_read(palmas, addr, ®); if (ret) @@ -705,12 +703,11 @@ static int palmas_smps_init(struct palmas *palmas, int id, if (ret) return ret; - if (ddata->palmas_regs_info[id].vsel_addr && reg_init->vsel) { - addr = ddata->palmas_regs_info[id].vsel_addr; + if (rinfo->vsel_addr && reg_init->vsel) { reg = reg_init->vsel; - ret = palmas_smps_write(palmas, addr, reg); + ret = palmas_smps_write(palmas, rinfo->vsel_addr, reg); if (ret) return ret; } @@ -718,7 +715,6 @@ static int palmas_smps_init(struct palmas *palmas, int id, if (reg_init->roof_floor && (id != PALMAS_REG_SMPS10_OUT1) && (id != PALMAS_REG_SMPS10_OUT2)) { /* Enable externally controlled regulator */ - addr = ddata->palmas_regs_info[id].ctrl_addr; ret = palmas_smps_read(palmas, addr, ®); if (ret < 0) return ret; @@ -740,10 +736,10 @@ static int palmas_ldo_init(struct palmas *palmas, int id, unsigned int reg; unsigned int addr; int ret; - struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata; + struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id]; - addr = ddata->palmas_regs_info[id].ctrl_addr; + addr = rinfo->ctrl_addr; ret = palmas_ldo_read(palmas, addr, ®); if (ret) @@ -765,7 +761,6 @@ static int palmas_ldo_init(struct palmas *palmas, int id, if (reg_init->roof_floor) { /* Enable externally controlled regulator */ - addr = ddata->palmas_regs_info[id].ctrl_addr; ret = palmas_update_bits(palmas, PALMAS_LDO_BASE, addr, PALMAS_LDO1_CTRL_MODE_ACTIVE, PALMAS_LDO1_CTRL_MODE_ACTIVE); @@ -786,10 +781,10 @@ static int palmas_extreg_init(struct palmas *palmas, int id, unsigned int addr; int ret; unsigned int val = 0; - struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata; + struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id]; - addr = ddata->palmas_regs_info[id].ctrl_addr; + addr = rinfo->ctrl_addr; if (reg_init->mode_sleep) val = PALMAS_REGEN1_CTRL_MODE_SLEEP; @@ -804,7 +799,6 @@ static int palmas_extreg_init(struct palmas *palmas, int id, if (reg_init->roof_floor) { /* Enable externally controlled regulator */ - addr = ddata->palmas_regs_info[id].ctrl_addr; ret = palmas_update_bits(palmas, PALMAS_RESOURCE_BASE, addr, PALMAS_REGEN1_CTRL_MODE_ACTIVE, PALMAS_REGEN1_CTRL_MODE_ACTIVE); @@ -824,10 +818,11 @@ static void palmas_enable_ldo8_track(struct palmas *palmas) unsigned int reg; unsigned int addr; int ret; - struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata; + struct palmas_regs_info *rinfo; - addr = ddata->palmas_regs_info[PALMAS_REG_LDO8].ctrl_addr; + rinfo = &ddata->palmas_regs_info[PALMAS_REG_LDO8]; + addr = rinfo->ctrl_addr; ret = palmas_ldo_read(palmas, addr, ®); if (ret) { @@ -846,7 +841,7 @@ static void palmas_enable_ldo8_track(struct palmas *palmas) * output is defined by the LDO8_VOLTAGE.VSEL register divided by two, * and can be set from 0.45 to 1.65 V. */ - addr = ddata->palmas_regs_info[PALMAS_REG_LDO8].vsel_addr; + addr = rinfo->vsel_addr; ret = palmas_ldo_read(palmas, addr, ®); if (ret) { dev_err(palmas->dev, "Error in reading ldo8 voltage reg\n"); @@ -870,6 +865,7 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic, int id, ret; struct regulator_dev *rdev; struct palmas_reg_init *reg_init; + struct palmas_regs_info *rinfo; for (id = ddata->ldo_begin; id < ddata->max_reg; id++) { if (pdata && pdata->reg_init[id]) @@ -877,12 +873,13 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic, else reg_init = NULL; + rinfo = &ddata->palmas_regs_info[id]; /* Miss out regulators which are not available due * to alternate functions. */ /* Register the regulators */ - pmic->desc[id].name = ddata->palmas_regs_info[id].name; + pmic->desc[id].name = rinfo->name; pmic->desc[id].id = id; pmic->desc[id].type = REGULATOR_VOLTAGE; pmic->desc[id].owner = THIS_MODULE; @@ -900,12 +897,12 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic, pmic->desc[id].enable_time = 500; pmic->desc[id].vsel_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, - ddata->palmas_regs_info[id].vsel_addr); + rinfo->vsel_addr); pmic->desc[id].vsel_mask = PALMAS_LDO1_VOLTAGE_VSEL_MASK; pmic->desc[id].enable_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, - ddata->palmas_regs_info[id].ctrl_addr); + rinfo->ctrl_addr); pmic->desc[id].enable_mask = PALMAS_LDO1_CTRL_MODE_ACTIVE; @@ -930,7 +927,7 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic, pmic->desc[id].ops = &palmas_ops_extreg; pmic->desc[id].enable_reg = PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, - ddata->palmas_regs_info[id].ctrl_addr); + rinfo->ctrl_addr); pmic->desc[id].enable_mask = PALMAS_REGEN1_CTRL_MODE_ACTIVE; } @@ -940,7 +937,7 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic, else config.init_data = NULL; - pmic->desc[id].supply_name = ddata->palmas_regs_info[id].sname; + pmic->desc[id].supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], @@ -983,6 +980,7 @@ static int tps65917_ldo_registration(struct palmas_pmic *pmic, int id, ret; struct regulator_dev *rdev; struct palmas_reg_init *reg_init; + struct palmas_regs_info *rinfo; for (id = ddata->ldo_begin; id < ddata->max_reg; id++) { if (pdata && pdata->reg_init[id]) @@ -993,9 +991,10 @@ static int tps65917_ldo_registration(struct palmas_pmic *pmic, /* Miss out regulators which are not available due * to alternate functions. */ + rinfo = &ddata->palmas_regs_info[id]; /* Register the regulators */ - pmic->desc[id].name = ddata->palmas_regs_info[id].name; + pmic->desc[id].name = rinfo->name; pmic->desc[id].id = id; pmic->desc[id].type = REGULATOR_VOLTAGE; pmic->desc[id].owner = THIS_MODULE; @@ -1013,12 +1012,12 @@ static int tps65917_ldo_registration(struct palmas_pmic *pmic, pmic->desc[id].enable_time = 500; pmic->desc[id].vsel_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, - ddata->palmas_regs_info[id].vsel_addr); + rinfo->vsel_addr); pmic->desc[id].vsel_mask = PALMAS_LDO1_VOLTAGE_VSEL_MASK; pmic->desc[id].enable_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, - ddata->palmas_regs_info[id].ctrl_addr); + rinfo->ctrl_addr); pmic->desc[id].enable_mask = PALMAS_LDO1_CTRL_MODE_ACTIVE; /* @@ -1035,7 +1034,7 @@ static int tps65917_ldo_registration(struct palmas_pmic *pmic, pmic->desc[id].ops = &palmas_ops_extreg; pmic->desc[id].enable_reg = PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, - ddata->palmas_regs_info[id].ctrl_addr); + rinfo->ctrl_addr); pmic->desc[id].enable_mask = PALMAS_REGEN1_CTRL_MODE_ACTIVE; } @@ -1045,7 +1044,7 @@ static int tps65917_ldo_registration(struct palmas_pmic *pmic, else config.init_data = NULL; - pmic->desc[id].supply_name = ddata->palmas_regs_info[id].sname; + pmic->desc[id].supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], @@ -1089,6 +1088,7 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, unsigned int addr, reg; struct regulator_dev *rdev; struct palmas_reg_init *reg_init; + struct palmas_regs_info *rinfo; for (id = ddata->smps_start; id <= ddata->smps_end; id++) { bool ramp_delay_support = false; @@ -1127,12 +1127,13 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, if (!PALMAS_PMIC_HAS(pmic->palmas, SMPS10_BOOST)) continue; } + rinfo = &ddata->palmas_regs_info[id]; if ((id == PALMAS_REG_SMPS6) || (id == PALMAS_REG_SMPS8)) ramp_delay_support = true; if (ramp_delay_support) { - addr = ddata->palmas_regs_info[id].tstep_addr; + addr = rinfo->tstep_addr; ret = palmas_smps_read(pmic->palmas, addr, ®); if (ret < 0) { dev_err(pmic->dev, @@ -1155,7 +1156,7 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, } /* Register the regulators */ - pmic->desc[id].name = ddata->palmas_regs_info[id].name; + pmic->desc[id].name = rinfo->name; pmic->desc[id].id = id; switch (id) { @@ -1188,7 +1189,7 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, * otherwise we error in probe with unsupportable * ranges. Read the current smps mode for later use. */ - addr = palmas_regs_info[id].vsel_addr; + addr = rinfo->vsel_addr; pmic->desc[id].n_linear_ranges = 3; ret = palmas_smps_read(pmic->palmas, addr, ®); @@ -1209,12 +1210,12 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, pmic->desc[id].n_voltages = PALMAS_SMPS_NUM_VOLTAGES; pmic->desc[id].vsel_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, - palmas_regs_info[id].vsel_addr); + rinfo->vsel_addr); pmic->desc[id].vsel_mask = PALMAS_SMPS12_VOLTAGE_VSEL_MASK; /* Read the smps mode for later use. */ - addr = palmas_regs_info[id].ctrl_addr; + addr = rinfo->ctrl_addr; ret = palmas_smps_read(pmic->palmas, addr, ®); if (ret) return ret; @@ -1223,7 +1224,7 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, pmic->desc[id].enable_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, - palmas_regs_info[id].ctrl_addr); + rinfo->ctrl_addr); pmic->desc[id].enable_mask = PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; /* set_mode overrides this value */ @@ -1238,7 +1239,7 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, else config.init_data = NULL; - pmic->desc[id].supply_name = ddata->palmas_regs_info[id].sname; + pmic->desc[id].supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], @@ -1267,6 +1268,7 @@ static int tps65917_smps_registration(struct palmas_pmic *pmic, unsigned int addr, reg; struct regulator_dev *rdev; struct palmas_reg_init *reg_init; + struct palmas_regs_info *rinfo; for (id = ddata->smps_start; id <= ddata->smps_end; id++) { /* @@ -1286,9 +1288,10 @@ static int tps65917_smps_registration(struct palmas_pmic *pmic, } else { reg_init = NULL; } + rinfo = &ddata->palmas_regs_info[id]; /* Register the regulators */ - pmic->desc[id].name = ddata->palmas_regs_info[id].name; + pmic->desc[id].name = rinfo->name; pmic->desc[id].id = id; /* @@ -1297,7 +1300,7 @@ static int tps65917_smps_registration(struct palmas_pmic *pmic, * otherwise we error in probe with unsupportable * ranges. Read the current smps mode for later use. */ - addr = ddata->palmas_regs_info[id].vsel_addr; + addr = rinfo->vsel_addr; ret = palmas_smps_read(pmic->palmas, addr, ®); if (ret) @@ -1319,14 +1322,14 @@ static int tps65917_smps_registration(struct palmas_pmic *pmic, pmic->desc[id].n_voltages = PALMAS_SMPS_NUM_VOLTAGES; pmic->desc[id].vsel_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, - tps65917_regs_info[id].vsel_addr); + rinfo->vsel_addr); pmic->desc[id].vsel_mask = PALMAS_SMPS12_VOLTAGE_VSEL_MASK; pmic->desc[id].ramp_delay = 2500; /* Read the smps mode for later use. */ - addr = ddata->palmas_regs_info[id].ctrl_addr; + addr = rinfo->ctrl_addr; ret = palmas_smps_read(pmic->palmas, addr, ®); if (ret) return ret; @@ -1341,7 +1344,7 @@ static int tps65917_smps_registration(struct palmas_pmic *pmic, else config.init_data = NULL; - pmic->desc[id].supply_name = ddata->palmas_regs_info[id].sname; + pmic->desc[id].supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], -- cgit v1.2.3-70-g09d2 From 6839cd6f6487969e969ced2245bfdabaf7005f6b Mon Sep 17 00:00:00 2001 From: Nishanth Menon Date: Mon, 30 Jun 2014 10:57:37 -0500 Subject: regulator: palmas: Rename palmas_regs_info to palmas_generic_regs_info With commit d6f83370ed978d5570b7c8c22988310cb9376202 (regulator: palmas: Add tps65917 PMIC support) palmas_regs_info naming is confusing as it is a driver data parameter and a local variable. To prevent mistaken updates, rename the local variable to palmas_generic_regs_info. Signed-off-by: Nishanth Menon Tested-by: Stephen Warren Tested-by: Keerthy Signed-off-by: Mark Brown --- drivers/regulator/palmas-regulator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index f75fb90d7db3..d6b734f397dc 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c @@ -41,7 +41,7 @@ static const struct regulator_linear_range smps_high_ranges[] = { REGULATOR_LINEAR_RANGE(3300000, 0x7A, 0x7f, 0), }; -static struct palmas_regs_info palmas_regs_info[] = { +static struct palmas_regs_info palmas_generic_regs_info[] = { { .name = "SMPS12", .sname = "smps1-in", @@ -1417,7 +1417,7 @@ static struct palmas_pmic_driver_data palmas_ddata = { .ldo_begin = PALMAS_REG_LDO1, .ldo_end = PALMAS_REG_LDOUSB, .max_reg = PALMAS_NUM_REGS, - .palmas_regs_info = palmas_regs_info, + .palmas_regs_info = palmas_generic_regs_info, .palmas_matches = palmas_matches, .sleep_req_info = palma_sleep_req_info, .smps_register = palmas_smps_registration, -- cgit v1.2.3-70-g09d2 From 429222d00531b348076862ea4fd8cd694bf064a9 Mon Sep 17 00:00:00 2001 From: Nishanth Menon Date: Mon, 30 Jun 2014 10:57:38 -0500 Subject: regulator: palmas: Simplify code by not indexing regulator_desc unnecessarily Palmas regulator needs to full up the regulator_desc based on PMIC and type of regulator. However, we dont need to do desc[id] every time. we can simplify by using a pointer to desc[id] and filling up the parameters. Signed-off-by: Nishanth Menon Tested-by: Stephen Warren Tested-by: Keerthy Signed-off-by: Mark Brown --- drivers/regulator/palmas-regulator.c | 248 ++++++++++++++++------------------- 1 file changed, 112 insertions(+), 136 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index d6b734f397dc..ae0f639096fb 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c @@ -866,6 +866,7 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic, struct regulator_dev *rdev; struct palmas_reg_init *reg_init; struct palmas_regs_info *rinfo; + struct regulator_desc *desc; for (id = ddata->ldo_begin; id < ddata->max_reg; id++) { if (pdata && pdata->reg_init[id]) @@ -879,57 +880,51 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic, */ /* Register the regulators */ - pmic->desc[id].name = rinfo->name; - pmic->desc[id].id = id; - pmic->desc[id].type = REGULATOR_VOLTAGE; - pmic->desc[id].owner = THIS_MODULE; + desc = &pmic->desc[id]; + desc->name = rinfo->name; + desc->id = id; + desc->type = REGULATOR_VOLTAGE; + desc->owner = THIS_MODULE; if (id < PALMAS_REG_REGEN1) { - pmic->desc[id].n_voltages = PALMAS_LDO_NUM_VOLTAGES; + desc->n_voltages = PALMAS_LDO_NUM_VOLTAGES; if (reg_init && reg_init->roof_floor) - pmic->desc[id].ops = - &palmas_ops_ext_control_ldo; + desc->ops = &palmas_ops_ext_control_ldo; else - pmic->desc[id].ops = &palmas_ops_ldo; - pmic->desc[id].min_uV = 900000; - pmic->desc[id].uV_step = 50000; - pmic->desc[id].linear_min_sel = 1; - pmic->desc[id].enable_time = 500; - pmic->desc[id].vsel_reg = - PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, - rinfo->vsel_addr); - pmic->desc[id].vsel_mask = - PALMAS_LDO1_VOLTAGE_VSEL_MASK; - pmic->desc[id].enable_reg = - PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, - rinfo->ctrl_addr); - pmic->desc[id].enable_mask = - PALMAS_LDO1_CTRL_MODE_ACTIVE; + desc->ops = &palmas_ops_ldo; + desc->min_uV = 900000; + desc->uV_step = 50000; + desc->linear_min_sel = 1; + desc->enable_time = 500; + desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, + rinfo->vsel_addr); + desc->vsel_mask = PALMAS_LDO1_VOLTAGE_VSEL_MASK; + desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, + rinfo->ctrl_addr); + desc->enable_mask = PALMAS_LDO1_CTRL_MODE_ACTIVE; /* Check if LDO8 is in tracking mode or not */ if (pdata && (id == PALMAS_REG_LDO8) && pdata->enable_ldo8_tracking) { palmas_enable_ldo8_track(pmic->palmas); - pmic->desc[id].min_uV = 450000; - pmic->desc[id].uV_step = 25000; + desc->min_uV = 450000; + desc->uV_step = 25000; } /* LOD6 in vibrator mode will have enable time 2000us */ if (pdata && pdata->ldo6_vibrator && (id == PALMAS_REG_LDO6)) - pmic->desc[id].enable_time = 2000; + desc->enable_time = 2000; } else { - pmic->desc[id].n_voltages = 1; + desc->n_voltages = 1; if (reg_init && reg_init->roof_floor) - pmic->desc[id].ops = - &palmas_ops_ext_control_extreg; + desc->ops = &palmas_ops_ext_control_extreg; else - pmic->desc[id].ops = &palmas_ops_extreg; - pmic->desc[id].enable_reg = + desc->ops = &palmas_ops_extreg; + desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, rinfo->ctrl_addr); - pmic->desc[id].enable_mask = - PALMAS_REGEN1_CTRL_MODE_ACTIVE; + desc->enable_mask = PALMAS_REGEN1_CTRL_MODE_ACTIVE; } if (pdata) @@ -937,11 +932,10 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic, else config.init_data = NULL; - pmic->desc[id].supply_name = rinfo->sname; + desc->supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; - rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], - &config); + rdev = devm_regulator_register(pmic->dev, desc, &config); if (IS_ERR(rdev)) { dev_err(pmic->dev, "failed to register %s regulator\n", @@ -981,6 +975,7 @@ static int tps65917_ldo_registration(struct palmas_pmic *pmic, struct regulator_dev *rdev; struct palmas_reg_init *reg_init; struct palmas_regs_info *rinfo; + struct regulator_desc *desc; for (id = ddata->ldo_begin; id < ddata->max_reg; id++) { if (pdata && pdata->reg_init[id]) @@ -994,49 +989,43 @@ static int tps65917_ldo_registration(struct palmas_pmic *pmic, rinfo = &ddata->palmas_regs_info[id]; /* Register the regulators */ - pmic->desc[id].name = rinfo->name; - pmic->desc[id].id = id; - pmic->desc[id].type = REGULATOR_VOLTAGE; - pmic->desc[id].owner = THIS_MODULE; + desc = &pmic->desc[id]; + desc->name = rinfo->name; + desc->id = id; + desc->type = REGULATOR_VOLTAGE; + desc->owner = THIS_MODULE; if (id < TPS65917_REG_REGEN1) { - pmic->desc[id].n_voltages = PALMAS_LDO_NUM_VOLTAGES; + desc->n_voltages = PALMAS_LDO_NUM_VOLTAGES; if (reg_init && reg_init->roof_floor) - pmic->desc[id].ops = - &palmas_ops_ext_control_ldo; + desc->ops = &palmas_ops_ext_control_ldo; else - pmic->desc[id].ops = &tps65917_ops_ldo; - pmic->desc[id].min_uV = 900000; - pmic->desc[id].uV_step = 50000; - pmic->desc[id].linear_min_sel = 1; - pmic->desc[id].enable_time = 500; - pmic->desc[id].vsel_reg = - PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, - rinfo->vsel_addr); - pmic->desc[id].vsel_mask = - PALMAS_LDO1_VOLTAGE_VSEL_MASK; - pmic->desc[id].enable_reg = - PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, - rinfo->ctrl_addr); - pmic->desc[id].enable_mask = - PALMAS_LDO1_CTRL_MODE_ACTIVE; + desc->ops = &tps65917_ops_ldo; + desc->min_uV = 900000; + desc->uV_step = 50000; + desc->linear_min_sel = 1; + desc->enable_time = 500; + desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, + rinfo->vsel_addr); + desc->vsel_mask = PALMAS_LDO1_VOLTAGE_VSEL_MASK; + desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, + rinfo->ctrl_addr); + desc->enable_mask = PALMAS_LDO1_CTRL_MODE_ACTIVE; /* * To be confirmed. Discussion on going with PMIC Team. * It is of the order of ~60mV/uS. */ - pmic->desc[id].ramp_delay = 2500; + desc->ramp_delay = 2500; } else { - pmic->desc[id].n_voltages = 1; + desc->n_voltages = 1; if (reg_init && reg_init->roof_floor) - pmic->desc[id].ops = - &palmas_ops_ext_control_extreg; + desc->ops = &palmas_ops_ext_control_extreg; else - pmic->desc[id].ops = &palmas_ops_extreg; - pmic->desc[id].enable_reg = + desc->ops = &palmas_ops_extreg; + desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, rinfo->ctrl_addr); - pmic->desc[id].enable_mask = - PALMAS_REGEN1_CTRL_MODE_ACTIVE; + desc->enable_mask = PALMAS_REGEN1_CTRL_MODE_ACTIVE; } if (pdata) @@ -1044,11 +1033,10 @@ static int tps65917_ldo_registration(struct palmas_pmic *pmic, else config.init_data = NULL; - pmic->desc[id].supply_name = rinfo->sname; + desc->supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; - rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], - &config); + rdev = devm_regulator_register(pmic->dev, desc, &config); if (IS_ERR(rdev)) { dev_err(pmic->dev, "failed to register %s regulator\n", @@ -1089,6 +1077,7 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, struct regulator_dev *rdev; struct palmas_reg_init *reg_init; struct palmas_regs_info *rinfo; + struct regulator_desc *desc; for (id = ddata->smps_start; id <= ddata->smps_end; id++) { bool ramp_delay_support = false; @@ -1128,6 +1117,7 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, continue; } rinfo = &ddata->palmas_regs_info[id]; + desc = &pmic->desc[id]; if ((id == PALMAS_REG_SMPS6) || (id == PALMAS_REG_SMPS8)) ramp_delay_support = true; @@ -1140,9 +1130,8 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, "reading TSTEP reg failed: %d\n", ret); return ret; } - pmic->desc[id].ramp_delay = - palmas_smps_ramp_delay[reg & 0x3]; - pmic->ramp_delay[id] = pmic->desc[id].ramp_delay; + desc->ramp_delay = palmas_smps_ramp_delay[reg & 0x3]; + pmic->ramp_delay[id] = desc->ramp_delay; } /* Initialise sleep/init values from platform data */ @@ -1156,31 +1145,28 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, } /* Register the regulators */ - pmic->desc[id].name = rinfo->name; - pmic->desc[id].id = id; + desc->name = rinfo->name; + desc->id = id; switch (id) { case PALMAS_REG_SMPS10_OUT1: case PALMAS_REG_SMPS10_OUT2: - pmic->desc[id].n_voltages = PALMAS_SMPS10_NUM_VOLTAGES; - pmic->desc[id].ops = &palmas_ops_smps10; - pmic->desc[id].vsel_reg = - PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, - PALMAS_SMPS10_CTRL); - pmic->desc[id].vsel_mask = SMPS10_VSEL; - pmic->desc[id].enable_reg = - PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, - PALMAS_SMPS10_CTRL); + desc->n_voltages = PALMAS_SMPS10_NUM_VOLTAGES; + desc->ops = &palmas_ops_smps10; + desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, + PALMAS_SMPS10_CTRL); + desc->vsel_mask = SMPS10_VSEL; + desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, + PALMAS_SMPS10_CTRL); if (id == PALMAS_REG_SMPS10_OUT1) - pmic->desc[id].enable_mask = SMPS10_SWITCH_EN; + desc->enable_mask = SMPS10_SWITCH_EN; else - pmic->desc[id].enable_mask = SMPS10_BOOST_EN; - pmic->desc[id].bypass_reg = - PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, - PALMAS_SMPS10_CTRL); - pmic->desc[id].bypass_mask = SMPS10_BYPASS_EN; - pmic->desc[id].min_uV = 3750000; - pmic->desc[id].uV_step = 1250000; + desc->enable_mask = SMPS10_BOOST_EN; + desc->bypass_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, + PALMAS_SMPS10_CTRL); + desc->bypass_mask = SMPS10_BYPASS_EN; + desc->min_uV = 3750000; + desc->uV_step = 1250000; break; default: /* @@ -1190,7 +1176,7 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, * ranges. Read the current smps mode for later use. */ addr = rinfo->vsel_addr; - pmic->desc[id].n_linear_ranges = 3; + desc->n_linear_ranges = 3; ret = palmas_smps_read(pmic->palmas, addr, ®); if (ret) @@ -1198,21 +1184,18 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, if (reg & PALMAS_SMPS12_VOLTAGE_RANGE) pmic->range[id] = 1; if (pmic->range[id]) - pmic->desc[id].linear_ranges = smps_high_ranges; + desc->linear_ranges = smps_high_ranges; else - pmic->desc[id].linear_ranges = smps_low_ranges; + desc->linear_ranges = smps_low_ranges; if (reg_init && reg_init->roof_floor) - pmic->desc[id].ops = - &palmas_ops_ext_control_smps; + desc->ops = &palmas_ops_ext_control_smps; else - pmic->desc[id].ops = &palmas_ops_smps; - pmic->desc[id].n_voltages = PALMAS_SMPS_NUM_VOLTAGES; - pmic->desc[id].vsel_reg = - PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, - rinfo->vsel_addr); - pmic->desc[id].vsel_mask = - PALMAS_SMPS12_VOLTAGE_VSEL_MASK; + desc->ops = &palmas_ops_smps; + desc->n_voltages = PALMAS_SMPS_NUM_VOLTAGES; + desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, + rinfo->vsel_addr); + desc->vsel_mask = PALMAS_SMPS12_VOLTAGE_VSEL_MASK; /* Read the smps mode for later use. */ addr = rinfo->ctrl_addr; @@ -1222,28 +1205,25 @@ static int palmas_smps_registration(struct palmas_pmic *pmic, pmic->current_reg_mode[id] = reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; - pmic->desc[id].enable_reg = - PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, - rinfo->ctrl_addr); - pmic->desc[id].enable_mask = - PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; + desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, + rinfo->ctrl_addr); + desc->enable_mask = PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; /* set_mode overrides this value */ - pmic->desc[id].enable_val = SMPS_CTRL_MODE_ON; + desc->enable_val = SMPS_CTRL_MODE_ON; } - pmic->desc[id].type = REGULATOR_VOLTAGE; - pmic->desc[id].owner = THIS_MODULE; + desc->type = REGULATOR_VOLTAGE; + desc->owner = THIS_MODULE; if (pdata) config.init_data = pdata->reg_data[id]; else config.init_data = NULL; - pmic->desc[id].supply_name = rinfo->sname; + desc->supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; - rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], - &config); + rdev = devm_regulator_register(pmic->dev, desc, &config); if (IS_ERR(rdev)) { dev_err(pmic->dev, "failed to register %s regulator\n", @@ -1269,13 +1249,15 @@ static int tps65917_smps_registration(struct palmas_pmic *pmic, struct regulator_dev *rdev; struct palmas_reg_init *reg_init; struct palmas_regs_info *rinfo; + struct regulator_desc *desc; for (id = ddata->smps_start; id <= ddata->smps_end; id++) { /* * Miss out regulators which are not available due * to slaving configurations. */ - pmic->desc[id].n_linear_ranges = 3; + desc = &pmic->desc[id]; + desc->n_linear_ranges = 3; if ((id == TPS65917_REG_SMPS2) && pmic->smps12) continue; @@ -1291,8 +1273,8 @@ static int tps65917_smps_registration(struct palmas_pmic *pmic, rinfo = &ddata->palmas_regs_info[id]; /* Register the regulators */ - pmic->desc[id].name = rinfo->name; - pmic->desc[id].id = id; + desc->name = rinfo->name; + desc->id = id; /* * Read and store the RANGE bit for later use @@ -1309,24 +1291,19 @@ static int tps65917_smps_registration(struct palmas_pmic *pmic, pmic->range[id] = 1; if (pmic->range[id]) - pmic->desc[id].linear_ranges = smps_high_ranges; - else - pmic->desc[id].linear_ranges = smps_low_ranges; - + desc->linear_ranges = smps_high_ranges; + else + desc->linear_ranges = smps_low_ranges; if (reg_init && reg_init->roof_floor) - pmic->desc[id].ops = - &tps65917_ops_ext_control_smps; + desc->ops = &tps65917_ops_ext_control_smps; else - pmic->desc[id].ops = &tps65917_ops_smps; - pmic->desc[id].n_voltages = PALMAS_SMPS_NUM_VOLTAGES; - pmic->desc[id].vsel_reg = - PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, - rinfo->vsel_addr); - pmic->desc[id].vsel_mask = - PALMAS_SMPS12_VOLTAGE_VSEL_MASK; - - pmic->desc[id].ramp_delay = 2500; + desc->ops = &tps65917_ops_smps; + desc->n_voltages = PALMAS_SMPS_NUM_VOLTAGES; + desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, + rinfo->vsel_addr); + desc->vsel_mask = PALMAS_SMPS12_VOLTAGE_VSEL_MASK; + desc->ramp_delay = 2500; /* Read the smps mode for later use. */ addr = rinfo->ctrl_addr; @@ -1336,19 +1313,18 @@ static int tps65917_smps_registration(struct palmas_pmic *pmic, pmic->current_reg_mode[id] = reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; - pmic->desc[id].type = REGULATOR_VOLTAGE; - pmic->desc[id].owner = THIS_MODULE; + desc->type = REGULATOR_VOLTAGE; + desc->owner = THIS_MODULE; if (pdata) config.init_data = pdata->reg_data[id]; else config.init_data = NULL; - pmic->desc[id].supply_name = rinfo->sname; + desc->supply_name = rinfo->sname; config.of_node = ddata->palmas_matches[id].of_node; - rdev = devm_regulator_register(pmic->dev, &pmic->desc[id], - &config); + rdev = devm_regulator_register(pmic->dev, desc, &config); if (IS_ERR(rdev)) { dev_err(pmic->dev, "failed to register %s regulator\n", -- cgit v1.2.3-70-g09d2 From b632815e9a8d2f8c0c0486b209cf90fa942c527b Mon Sep 17 00:00:00 2001 From: Nishanth Menon Date: Mon, 30 Jun 2014 10:57:39 -0500 Subject: regulator: palmas: Fix SMPS enable/disable/is_enable for tps65917 We use regmap regulator ops to enable/disable and check if regulator is enabled for various SMPS. However, these depend on valid enable_reg, enable_mask and enable_value in regulator descriptor. So, similar to fix we did in commit 318dbb02b50c ("regulator: palmas: Fix SMPS enable/disable/is_enabled"), populate the same for TPS65917 SMPS registration. LDO definitions are already in place. Fixes: d6f83370ed97 ("regulator: palmas: Add tps65917 PMIC support") Signed-off-by: Nishanth Menon Tested-by: Stephen Warren Tested-by: Keerthy Signed-off-by: Mark Brown --- drivers/regulator/palmas-regulator.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'drivers/regulator') diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index ae0f639096fb..a7ce34d1b5f2 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c @@ -1312,6 +1312,11 @@ static int tps65917_smps_registration(struct palmas_pmic *pmic, return ret; pmic->current_reg_mode[id] = reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; + desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, + rinfo->ctrl_addr); + desc->enable_mask = PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; + /* set_mode overrides this value */ + desc->enable_val = SMPS_CTRL_MODE_ON; desc->type = REGULATOR_VOLTAGE; desc->owner = THIS_MODULE; -- cgit v1.2.3-70-g09d2 From 57135250358e54c237450f30474616f3d850b8de Mon Sep 17 00:00:00 2001 From: Himangi Saraogi Date: Mon, 7 Jul 2014 21:12:14 +0530 Subject: regulator: lp8755: Use devm_regulator_register This patch moves data allocated using regulator_register to devm_regulator_register and does away with the calls to regulator_unregister. Also some labels are removed and a new labelerr is introduced which is less specific to context. Signed-off-by: Himangi Saraogi Acked-by: Julia Lawall Signed-off-by: Mark Brown --- drivers/regulator/lp8755.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/lp8755.c b/drivers/regulator/lp8755.c index 785a25e9a437..4a415d4ee463 100644 --- a/drivers/regulator/lp8755.c +++ b/drivers/regulator/lp8755.c @@ -339,22 +339,18 @@ static int lp8755_regulator_init(struct lp8755_chip *pchip) rconfig.init_data = pdata->buck_data[buck_num]; rconfig.of_node = pchip->dev->of_node; pchip->rdev[buck_num] = - regulator_register(&lp8755_regulators[buck_num], &rconfig); + devm_regulator_register(pchip->dev, + &lp8755_regulators[buck_num], &rconfig); if (IS_ERR(pchip->rdev[buck_num])) { ret = PTR_ERR(pchip->rdev[buck_num]); pchip->rdev[buck_num] = NULL; dev_err(pchip->dev, "regulator init failed: buck %d\n", buck_num); - goto err_buck; + return ret; } } return 0; - -err_buck: - for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++) - regulator_unregister(pchip->rdev[icnt]); - return ret; } static irqreturn_t lp8755_irq_handler(int irq, void *data) @@ -490,23 +486,19 @@ static int lp8755_probe(struct i2c_client *client, ret = lp8755_regulator_init(pchip); if (ret < 0) { dev_err(&client->dev, "fail to initialize regulators\n"); - goto err_regulator; + goto err; } pchip->irq = client->irq; ret = lp8755_int_config(pchip); if (ret < 0) { dev_err(&client->dev, "fail to irq config\n"); - goto err_irq; + goto err; } return ret; -err_irq: - for (icnt = 0; icnt < mphase_buck[pchip->mphase].nreg; icnt++) - regulator_unregister(pchip->rdev[icnt]); - -err_regulator: +err: /* output disable */ for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++) lp8755_write(pchip, icnt, 0x00); @@ -519,9 +511,6 @@ static int lp8755_remove(struct i2c_client *client) int icnt; struct lp8755_chip *pchip = i2c_get_clientdata(client); - for (icnt = 0; icnt < mphase_buck[pchip->mphase].nreg; icnt++) - regulator_unregister(pchip->rdev[icnt]); - for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++) lp8755_write(pchip, icnt, 0x00); -- cgit v1.2.3-70-g09d2