From dd61e4243f218e8e8c22497210d0eb3adf15ded3 Mon Sep 17 00:00:00 2001 From: Shengfei Xu Date: Thu, 31 Jul 2025 19:28:23 +0800 Subject: [PATCH] mfd: rk809/rk817: Modify the switching method of the PMIC sleep function The switching method of the pmic_sleep function has been changed from relying on the pinctrl framework to directly manipulating registers. Change-Id: I730846063387c3d378304d3ee1553fb990cb1604 Signed-off-by: Shengfei Xu --- drivers/mfd/rk808.c | 77 +++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c index d89f979133ad..f70bd4fe4405 100644 --- a/drivers/mfd/rk808.c +++ b/drivers/mfd/rk808.c @@ -957,6 +957,12 @@ static int rk817_shutdown_prepare(struct sys_off_data *data) if (ret) pr_info("%s:failed to activate pwroff state\n", __func__); + ret = regmap_update_bits(rk808->regmap, + RK817_SYS_CFG(3), + RK817_SLPPIN_FUNC_MSK, + SLPPIN_DN_FUN); + if (ret) + pr_err("shutdown: config SLPPIN_DN_FUN error!\n"); } /* pmic sleep shutdown function */ @@ -1173,29 +1179,8 @@ static int rk801_pinctrl_init(struct device *dev, struct rk808 *rk808) static int rk817_pinctrl_init(struct device *dev, struct rk808 *rk808) { - int ret; - struct platform_device *pinctrl_dev; struct pinctrl_state *default_st; - - pinctrl_dev = platform_device_alloc("rk805-pinctrl", -1); - if (!pinctrl_dev) { - dev_err(dev, "Alloc pinctrl dev failed!\n"); - return -ENOMEM; - } - - pinctrl_dev->dev.parent = dev; - - ret = platform_device_add(pinctrl_dev); - - if (ret) { - platform_device_put(pinctrl_dev); - dev_err(dev, "Add rk805-pinctrl dev failed!\n"); - return ret; - } - if (dev->pins && !IS_ERR(dev->pins->p)) { - dev_info(dev, "had get a pinctrl!\n"); - return 0; - } + int ret, value; rk808->pins = devm_kzalloc(dev, sizeof(struct rk808_pin_info), GFP_KERNEL); @@ -1244,12 +1229,40 @@ static int rk817_pinctrl_init(struct device *dev, struct rk808 *rk808) dev_dbg(dev, "no reset-setting pinctrl state\n"); return 0; } + ret = regmap_update_bits(rk808->regmap, + RK817_SYS_CFG(3), + RK817_SLPPIN_FUNC_MSK, + SLPPIN_NULL_FUN); + if (ret) { + dev_err(dev, "init: config SLPPIN_NULL_FUN error!\n"); + return ret; + } + ret = regmap_update_bits(rk808->regmap, + RK817_SYS_CFG(3), + RK817_SLPPOL_MSK, + RK817_SLPPOL_L); + if (ret) { + dev_err(dev, "init: config RK817_SLPPOL_L error!\n"); + return ret; + } + + /* pmic need the SCL clock to synchronize register */ + regmap_read(rk808->regmap, RK817_SYS_STS, &value); + mdelay(2); ret = pinctrl_select_state(rk808->pins->p, rk808->pins->reset); - if (ret) dev_dbg(dev, "failed to activate reset-setting pinctrl state\n"); + ret = regmap_update_bits(rk808->regmap, + RK817_SYS_CFG(3), + RK817_SLPPIN_FUNC_MSK, + SLPPIN_RST_FUN); + if (ret) { + dev_err(dev, "init: config SLPPIN_RST_FUN error!\n"); + return ret; + } + return 0; } @@ -1772,6 +1785,15 @@ static int __maybe_unused rk8xx_suspend(struct device *dev) dev_err(dev, "failed to act slp pinctrl state\n"); return ret; } + + ret = regmap_update_bits(rk808->regmap, + RK817_SYS_CFG(3), + RK817_SLPPIN_FUNC_MSK, + SLPPIN_SLP_FUN); + if (ret) { + dev_err(dev, "suspend: config SLPPIN_SLP_FUN error!\n"); + return ret; + } } break; default: @@ -1827,6 +1849,15 @@ static int __maybe_unused rk8xx_resume(struct device *dev) ret = pinctrl_select_state(rk808->pins->p, rk808->pins->reset); if (ret) dev_dbg(dev, "failed to act reset pinctrl state\n"); + + ret = regmap_update_bits(rk808->regmap, + RK817_SYS_CFG(3), + RK817_SLPPIN_FUNC_MSK, + SLPPIN_RST_FUN); + if (ret) { + dev_err(dev, "resume: config SLPPIN_RST_FUN error!\n"); + return ret; + } } break; default: