[PATCH 24/27] mmc: dw_mmc-rockchip: Keep RK3572 NVM domain powered
Shawn Lin
shawn.lin at rock-chips.com
Mon Oct 26 17:53:09 PDT 2026
Hi Cunhao,
在 2026/10/22 星期四 0:11, Cunhao Lu via B4 Relay 写道:
> From: Cunhao Lu <1579567540 at qq.com>
>
> Power cycling the RK3572 NVM domain causes repeated SD recovery. Keep it
> powered during runtime suspend without disabling controller runtime PM.
>
Before your v2 about this path, I would like to ask why you need this?
The dw_mmc-rockchip controller is always under A power domain on every
SoC, none of the predecessors need this kind of change. If you see
some errors during RPM, perhaps you should have a look[1] and check your
DTS.
[1]
https://lore.kernel.org/linux-mmc/1768524932-163929-1-git-send-email-shawn.lin@rock-chips.com/
> Signed-off-by: Cunhao Lu <1579567540 at qq.com>
> ---
> drivers/mmc/host/dw_mmc-rockchip.c | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c
> index 75c82ff20f177..8bc55d4b996c6 100644
> --- a/drivers/mmc/host/dw_mmc-rockchip.c
> +++ b/drivers/mmc/host/dw_mmc-rockchip.c
> @@ -10,6 +10,7 @@
> #include <linux/mmc/host.h>
> #include <linux/of_address.h>
> #include <linux/mmc/slot-gpio.h>
> +#include <linux/pm_domain.h>
> #include <linux/pm_runtime.h>
> #include <linux/slab.h>
>
> @@ -528,6 +529,19 @@ static int dw_mci_rockchip_init(struct dw_mci *host)
> return 0;
> }
>
> +static int dw_mci_rk3572_init(struct dw_mci *host)
> +{
> + int ret;
> +
> + /* Power cycling the NVM domain disrupts SDMMC recovery. */
> + ret = dev_pm_genpd_rpm_always_on(host->dev, true);
> + if (ret && ret != -EOPNOTSUPP)
> + dev_warn(host->dev, "failed to keep power domain on: %pe\n",
> + ERR_PTR(ret));
> +
> + return dw_mci_rockchip_init(host);
> +}
> +
> static const struct dw_mci_drv_data rk2928_drv_data = {
> .init = dw_mci_rockchip_init,
> .parse_dt = dw_mci_rk2928_parse_dt,
> @@ -541,6 +555,14 @@ static const struct dw_mci_drv_data rk3288_drv_data = {
> .init = dw_mci_rockchip_init,
> };
>
> +static const struct dw_mci_drv_data rk3572_drv_data = {
> + .common_caps = MMC_CAP_CMD23,
> + .set_ios = dw_mci_rk3288_set_ios,
> + .execute_tuning = dw_mci_rk3288_execute_tuning,
> + .parse_dt = dw_mci_rk3576_parse_dt,
> + .init = dw_mci_rk3572_init,
> +};
> +
> static const struct dw_mci_drv_data rk3576_drv_data = {
> .common_caps = MMC_CAP_CMD23,
> .set_ios = dw_mci_rk3288_set_ios,
> @@ -554,6 +576,8 @@ static const struct of_device_id dw_mci_rockchip_match[] = {
> .data = &rk2928_drv_data },
> { .compatible = "rockchip,rk3288-dw-mshc",
> .data = &rk3288_drv_data },
> + { .compatible = "rockchip,rk3572-dw-mshc",
> + .data = &rk3572_drv_data },
> { .compatible = "rockchip,rk3576-dw-mshc",
> .data = &rk3576_drv_data },
> {},
>
More information about the linux-phy
mailing list