diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c index 826889d451d2..2e574b2294c8 100644 --- a/drivers/mfd/rk808.c +++ b/drivers/mfd/rk808.c @@ -1048,6 +1048,23 @@ static int rk817_reboot_notifier_handler(struct notifier_block *nb, struct rk817_reboot_data_t *data; int ret; struct device *dev; + int value, power_en_active0, power_en_active1; + + data = container_of(nb, struct rk817_reboot_data_t, reboot_notifier); + dev = &data->rk808->i2c->dev; + + regmap_read(data->rk808->regmap, RK817_POWER_EN_SAVE0, + &power_en_active0); + regmap_read(data->rk808->regmap, RK817_POWER_EN_SAVE1, + &power_en_active1); + value = power_en_active0 & 0x0f; + regmap_write(data->rk808->regmap, RK817_POWER_EN_REG(0), value | 0xf0); + value = (power_en_active0 & 0xf0) >> 4; + regmap_write(data->rk808->regmap, RK817_POWER_EN_REG(1), value | 0xf0); + value = power_en_active1 & 0x0f; + regmap_write(data->rk808->regmap, RK817_POWER_EN_REG(2), value | 0xf0); + value = (power_en_active1 & 0xf0) >> 4; + regmap_write(data->rk808->regmap, RK817_POWER_EN_REG(3), value | 0xf0); if (action != SYS_RESTART) return NOTIFY_OK; @@ -1055,8 +1072,6 @@ static int rk817_reboot_notifier_handler(struct notifier_block *nb, if (!cmd || !strlen(cmd) || !strcmp(cmd, "normal")) return NOTIFY_OK; - data = container_of(nb, struct rk817_reboot_data_t, reboot_notifier); - dev = &data->rk808->i2c->dev; ret = regmap_update_bits(data->rk808->regmap, RK817_SYS_CFG(3), RK817_RST_FUNC_MSK, RK817_RST_FUNC_REG); @@ -1101,8 +1116,6 @@ static void rk817_of_property_prepare(struct rk808 *rk808, struct device *dev) dev_info(dev, "support pmic reset mode:%d,%d\n", ret, func); - if (val & RK817_RST_FUNC_REG) - return; rk817_reboot_data.rk808 = rk808; rk817_reboot_data.reboot_notifier.notifier_call = rk817_reboot_notifier_handler; diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h index 38d1d8191bca..b433c7359734 100644 --- a/include/linux/mfd/rk808.h +++ b/include/linux/mfd/rk808.h @@ -825,6 +825,9 @@ enum rk809_reg_id { #define RK817_RTC_COMP_LSB_REG 0x10 #define RK817_RTC_COMP_MSB_REG 0x11 +#define RK817_POWER_EN_SAVE0 0x99 +#define RK817_POWER_EN_SAVE1 0xa4 + #define RK817_POWER_EN_REG(i) (0xb1 + (i)) #define RK817_POWER_SLP_EN_REG(i) (0xb5 + (i))