mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 11:50:43 +09:00
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:
@@ -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[] = {
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user