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>
This commit is contained in:
shengfei Xu
2017-08-21 17:17:36 +08:00
committed by Huang, Tao
parent e7edb8f017
commit 8516153ecb
2 changed files with 47 additions and 19 deletions

View File

@@ -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[] = {

View File

@@ -52,9 +52,9 @@ enum rk816_reg {
RK816_ID_DCDC2,
RK816_ID_DCDC3,
RK816_ID_DCDC4,
RK816_ID_BOOST = 5,
RK816_ID_BOOST,
RK816_ID_OTG_SWITCH,
RK816_ID_LDO1 = 8,
RK816_ID_LDO1,
RK816_ID_LDO2,
RK816_ID_LDO3,
RK816_ID_LDO4,