diff options
author | shengfei Xu <xsf@rock-chips.com> | 2017-08-21 17:17:36 +0800 |
---|---|---|
committer | Huang, Tao <huangtao@rock-chips.com> | 2017-08-23 20:37:15 +0800 |
commit | 8516153ecbd2bebfaa0e82dfb0e074278ba611bd (patch) | |
tree | 7291a8c994585846c44fb331884b0ef8d81b3ce6 /drivers | |
parent | e7edb8f01775387a2aac3a2a756daee482d435ea (diff) |
regulator: rk808: fix regulator operations table to the bucks for rk816
the patch fixes the following BUG:
[ 2.249731] PC is at regulator_map_voltage_linear+0x78/0x16c
[ 2.255413] LR is at regulator_map_voltage_linear+0x68/0x16c
[ 2.261092] pc : [<c042c1a8>] lr : [<c042c198>] psr: 60000013
[ 2.261092] sp : ef0a5a08 ip : 00000000 fp : c0c34368
[ 2.272578] r10: 000b71b0 r9 : c120394c r8 : 000b71b0
[ 2.277817] r7 : 000b71b0 r6 : ee85b800 r5 : 000b71b0 r4 : ee85b800
[ 2.284357] r3 : 00000000 r2 : dc8ba64d r1 : 60000013 r0 : 00000021
[ 2.290899] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none
[ 2.298047] Control: 10c5387d Table: 6000406a DAC: 00000051
Change-Id: I4a0d773f7847e7af14d1850e2250671a216b0c86
Signed-off-by: shengfei Xu <xsf@rock-chips.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/regulator/rk808-regulator.c | 62 |
1 files changed, 45 insertions, 17 deletions
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c index 92c274217a1d..0e2e2ed08735 100644 --- a/drivers/regulator/rk808-regulator.c +++ b/drivers/regulator/rk808-regulator.c @@ -92,7 +92,7 @@ } #define RK816_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ - _vmask, _ereg, _emask, _disval, _etime) \ + _vmask, _ereg, _emask, _enval, _disval, _etime) \ [_id] = { \ .name = (_match), \ .supply_name = (_supply), \ @@ -108,6 +108,7 @@ .vsel_mask = (_vmask), \ .enable_reg = (_ereg), \ .enable_mask = (_emask), \ + .enable_val = (_enval), \ .disable_val = (_disval), \ .enable_time = (_etime), \ .ops = &rk808_reg_ops, \ @@ -340,26 +341,33 @@ static int rk816_set_suspend_enable(struct regulator_dev *rdev) { unsigned int reg, val; - if (rdev->desc->id <= RK816_ID_DCDC4) + if (rdev->desc->id <= RK816_ID_DCDC4) { reg = rdev->desc->enable_reg + RK816_DCDC_SLP_EN_REG_OFFSET; + val = 1 << rdev->desc->id; + } if ((rdev->desc->id > RK816_ID_DCDC4) && - (rdev->desc->id <= RK816_ID_OTG_SWITCH)) + (rdev->desc->id <= RK816_ID_OTG_SWITCH)) { reg = rdev->desc->enable_reg + RK816_SWITCH_SLP_EN_REG_OFFSET; + val = 1 << (rdev->desc->id + 1); + } if ((rdev->desc->id > RK816_ID_OTG_SWITCH) && - (rdev->desc->id <= RK816_ID_LDO4)) + (rdev->desc->id <= RK816_ID_LDO4)) { reg = rdev->desc->enable_reg - RK816_LDO1_4_SLP_EN_REG_OFFSET; + val = 1 << (rdev->desc->id - RK816_ID_LDO1); + } if ((rdev->desc->id > RK816_ID_LDO4) && - (rdev->desc->id <= RK816_ID_LDO6)) + (rdev->desc->id <= RK816_ID_LDO6)) { reg = rdev->desc->enable_reg - RK816_LDO5_6_SLP_EN_REG_OFFSET; + val = 1 << (rdev->desc->id - RK816_ID_LDO1); + } - val = 1 << (rdev->desc->id % 8); return regmap_update_bits(rdev->regmap, reg, val, 0); @@ -440,6 +448,21 @@ static struct regulator_ops rk808_buck1_2_ops = { .set_suspend_disable = rk808_set_suspend_disable, }; +static struct regulator_ops rk8xx_buck_ops_range = { + .list_voltage = regulator_list_voltage_linear_range, + .map_voltage = regulator_map_voltage_linear_range, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .set_voltage_time_sel = regulator_set_voltage_time_sel, + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = regulator_is_enabled_regmap, + .set_ramp_delay = rk808_set_ramp_delay, + .set_suspend_voltage = rk808_set_suspend_voltage_range, + .set_suspend_enable = rk808_set_suspend_enable, + .set_suspend_disable = rk808_set_suspend_disable, +}; + static struct regulator_ops rk808_reg_ops = { .list_voltage = regulator_list_voltage_linear, .map_voltage = regulator_map_voltage_linear, @@ -575,7 +598,7 @@ static const struct regulator_desc rk816_reg[] = { .of_match = of_match_ptr("DCDC_REG1"), .regulators_node = of_match_ptr("regulators"), .id = RK816_ID_DCDC1, - .ops = &rk808_reg_ops, + .ops = &rk8xx_buck_ops_range, .type = REGULATOR_VOLTAGE, .n_voltages = 64, .linear_ranges = rk816_buck_voltage_ranges, @@ -584,6 +607,7 @@ static const struct regulator_desc rk816_reg[] = { .vsel_mask = RK818_BUCK_VSEL_MASK, .enable_reg = RK816_DCDC_EN_REG1, .enable_mask = BIT(4) | BIT(0), + .enable_val = BIT(0), .disable_val = BIT(4), .owner = THIS_MODULE, }, { @@ -592,7 +616,7 @@ static const struct regulator_desc rk816_reg[] = { .of_match = of_match_ptr("DCDC_REG2"), .regulators_node = of_match_ptr("regulators"), .id = RK816_ID_DCDC2, - .ops = &rk808_reg_ops, + .ops = &rk8xx_buck_ops_range, .type = REGULATOR_VOLTAGE, .n_voltages = 64, .linear_ranges = rk816_buck_voltage_ranges, @@ -601,6 +625,7 @@ static const struct regulator_desc rk816_reg[] = { .vsel_mask = RK818_BUCK_VSEL_MASK, .enable_reg = RK816_DCDC_EN_REG1, .enable_mask = BIT(5) | BIT(1), + .enable_val = BIT(1), .disable_val = BIT(5), .owner = THIS_MODULE, }, { @@ -614,6 +639,7 @@ static const struct regulator_desc rk816_reg[] = { .n_voltages = 1, .enable_reg = RK816_DCDC_EN_REG1, .enable_mask = BIT(6) | BIT(2), + .enable_val = BIT(2), .disable_val = BIT(6), .owner = THIS_MODULE, }, { @@ -622,7 +648,7 @@ static const struct regulator_desc rk816_reg[] = { .of_match = of_match_ptr("DCDC_REG4"), .regulators_node = of_match_ptr("regulators"), .id = RK816_ID_DCDC4, - .ops = &rk808_reg_ops, + .ops = &rk8xx_buck_ops_range, .type = REGULATOR_VOLTAGE, .n_voltages = 32, .linear_ranges = rk816_buck4_voltage_ranges, @@ -631,12 +657,13 @@ static const struct regulator_desc rk816_reg[] = { .vsel_mask = RK818_BUCK4_VSEL_MASK, .enable_reg = RK816_DCDC_EN_REG1, .enable_mask = BIT(7) | BIT(3), + .enable_val = BIT(3), .disable_val = BIT(7), .owner = THIS_MODULE, }, RK816_DESC(RK816_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100, RK816_BOOST_ON_VESL_REG, RK818_BOOST_ON_VSEL_MASK, - RK816_DCDC_EN_REG2, BIT(4) | BIT(0), BIT(4), 0), + RK816_DCDC_EN_REG2, BIT(4) | BIT(0), BIT(0), BIT(4), 0), { .name = "OTG_SWITCH", .supply_name = "usb", @@ -648,27 +675,28 @@ static const struct regulator_desc rk816_reg[] = { .n_voltages = 1, .enable_reg = RK816_DCDC_EN_REG2, .enable_mask = BIT(6) | BIT(2), + .enable_val = BIT(2), .disable_val = BIT(6), .owner = THIS_MODULE, }, RK816_DESC(RK816_ID_LDO1, "LDO_REG1", "vcc5", 800, 3400, 100, RK816_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, - RK816_LDO_EN_REG1, BIT(4) | BIT(0), BIT(4), 400), + RK816_LDO_EN_REG1, BIT(4) | BIT(0), BIT(0), BIT(4), 400), RK816_DESC(RK816_ID_LDO2, "LDO_REG2", "vcc5", 800, 3400, 100, RK816_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, - RK816_LDO_EN_REG1, BIT(5) | BIT(1), BIT(5), 400), - RK816_DESC(RK816_ID_LDO3, "LDO_REG2", "vcc5", 800, 3400, 100, + RK816_LDO_EN_REG1, BIT(5) | BIT(1), BIT(1), BIT(5), 400), + RK816_DESC(RK816_ID_LDO3, "LDO_REG3", "vcc5", 800, 3400, 100, RK816_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK, - RK816_LDO_EN_REG1, BIT(6) | BIT(2), BIT(6), 400), + RK816_LDO_EN_REG1, BIT(6) | BIT(2), BIT(2), BIT(6), 400), RK816_DESC(RK816_ID_LDO4, "LDO_REG4", "vcc6", 800, 3400, 100, RK816_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK, - RK816_LDO_EN_REG1, BIT(7) | BIT(3), BIT(7), 400), + RK816_LDO_EN_REG1, BIT(7) | BIT(3), BIT(3), BIT(7), 400), RK816_DESC(RK816_ID_LDO5, "LDO_REG5", "vcc6", 800, 3400, 100, RK816_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK, - RK816_LDO_EN_REG2, BIT(4) | BIT(0), BIT(4), 400), + RK816_LDO_EN_REG2, BIT(4) | BIT(0), BIT(0), BIT(4), 400), RK816_DESC(RK816_ID_LDO6, "LDO_REG6", "vcc6", 800, 3400, 100, RK816_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK, - RK816_LDO_EN_REG2, BIT(5) | BIT(1), BIT(5), 400), + RK816_LDO_EN_REG2, BIT(5) | BIT(1), BIT(1), BIT(5), 400), }; static const struct regulator_desc rk818_reg[] = { |