diff options
-rw-r--r-- | drivers/mfd/rk808.c | 1 | ||||
-rw-r--r-- | drivers/regulator/rk808-regulator.c | 28 | ||||
-rw-r--r-- | include/linux/mfd/rk808.h | 3 |
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 |