summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/mfd/rk808.c1
-rw-r--r--drivers/regulator/rk808-regulator.c28
-rw-r--r--include/linux/mfd/rk808.h3
3 files changed, 26 insertions, 6 deletions
diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index d73fd528c88d..6b8059ca2533 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -196,6 +196,7 @@ static bool rk818_is_volatile_reg(struct device *dev, unsigned int reg)
case RK808_VB_MON_REG:
case RK808_THERMAL_REG:
case RK808_DCDC_EN_REG:
+ case RK808_LDO_EN_REG:
case RK808_DCDC_UV_STS_REG:
case RK808_LDO_UV_STS_REG:
case RK808_DCDC_PG_REG:
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 62be2d5b4ec0..df992c516ac8 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -356,13 +356,19 @@ static int rk816_regulator_set_voltage_sel_regmap(struct regulator_dev *rdev,
unsigned int sel)
{
int ret, real_sel, delay = 100;
+ int rk816_type;
+ int id = rdev_get_id(rdev);
+ regmap_read(rdev->regmap, RK816_CHIP_VER_REG, &rk816_type);
+ rk816_type &= RK816_CHIP_VERSION_MASK;
sel <<= ffs(rdev->desc->vsel_mask) - 1;
- if (sel > 23)
- rkclk_cpuclk_div_setting(4);
- else
- rkclk_cpuclk_div_setting(2);
+ if ((rk816_type != RK816_TYPE_ES2) && (id == 0)) {
+ if (sel > 23)
+ rkclk_cpuclk_div_setting(4);
+ else
+ rkclk_cpuclk_div_setting(2);
+ }
do {
ret = regmap_update_bits(rdev->regmap,
@@ -371,13 +377,23 @@ static int rk816_regulator_set_voltage_sel_regmap(struct regulator_dev *rdev,
if (ret)
return ret;
+ if (rk816_type == RK816_TYPE_ES2) {
+ ret = regmap_update_bits(rdev->regmap,
+ RK816_DCDC_EN_REG2,
+ RK816_BUCK_DVS_CONFIRM,
+ RK816_BUCK_DVS_CONFIRM);
+ if (ret)
+ return ret;
+ }
+
regmap_read(rdev->regmap,
rdev->desc->vsel_reg, &real_sel);
real_sel &= rdev->desc->vsel_mask;
delay--;
} while ((sel != real_sel) && (delay > 0));
- rkclk_cpuclk_div_setting(1);
+ if ((rk816_type != RK816_TYPE_ES2) && (id == 0))
+ rkclk_cpuclk_div_setting(1);
return ret;
}
@@ -1016,7 +1032,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 = &rk8xx_buck_ops_range,
+ .ops = &rk816_buck_ops_range,
.type = REGULATOR_VOLTAGE,
.n_voltages = 64,
.linear_ranges = rk816_buck_voltage_ranges,
diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
index 28569148b23f..f7d9e98a7141 100644
--- a/include/linux/mfd/rk808.h
+++ b/include/linux/mfd/rk808.h
@@ -762,6 +762,9 @@ enum rk805_reg {
#define BUCK3_4_IMAX_MAX (0x3 << 3)
#define BOOST_DISABLE ((0x1 << 5) | (0x0 << 1))
#define BUCK4_VRP_3PERCENT 0xc0
+#define RK816_BUCK_DVS_CONFIRM (0x1 << 7)
+#define RK816_TYPE_ES2 0x05
+#define RK816_CHIP_VERSION_MASK 0x0f
#define TEMP105C 0x08
#define TEMP115C 0x0c