]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
pmdomain: rockchip: Add smc call to inform firmware
authorShawn Lin <shawn.lin@rock-chips.com>
Wed, 5 Feb 2025 06:15:53 +0000 (14:15 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Thu, 13 Feb 2025 13:47:48 +0000 (14:47 +0100)
Inform firmware to keep the power domain on or off.

Suggested-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Acked-by: Heiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/r/1738736156-119203-5-git-send-email-shawn.lin@rock-chips.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/pmdomain/rockchip/pm-domains.c

index cb0f938001382fad302ccaf6f3959f5ee4dcbb8a..49842f16f33d0aa2e1c826876e5ed1ec27200a10 100644 (file)
@@ -5,6 +5,7 @@
  * Copyright (c) 2015 ROCKCHIP, Co. Ltd.
  */
 
+#include <linux/arm-smccc.h>
 #include <linux/io.h>
 #include <linux/iopoll.h>
 #include <linux/err.h>
@@ -20,6 +21,7 @@
 #include <linux/regmap.h>
 #include <linux/mfd/syscon.h>
 #include <soc/rockchip/pm_domains.h>
+#include <soc/rockchip/rockchip_sip.h>
 #include <dt-bindings/power/px30-power.h>
 #include <dt-bindings/power/rockchip,rv1126-power.h>
 #include <dt-bindings/power/rk3036-power.h>
@@ -540,6 +542,7 @@ static void rockchip_do_pmu_set_power_domain(struct rockchip_pm_domain *pd,
        struct generic_pm_domain *genpd = &pd->genpd;
        u32 pd_pwr_offset = pd->info->pwr_offset;
        bool is_on, is_mem_on = false;
+       struct arm_smccc_res res;
 
        if (pd->info->pwr_mask == 0)
                return;
@@ -567,6 +570,11 @@ static void rockchip_do_pmu_set_power_domain(struct rockchip_pm_domain *pd,
                        genpd->name, is_on);
                return;
        }
+
+       /* Inform firmware to keep this pd on or off */
+       arm_smccc_smc(ROCKCHIP_SIP_SUSPEND_MODE, ROCKCHIP_SLEEP_PD_CONFIG,
+                       pmu->info->pwr_offset + pd_pwr_offset,
+                       pd->info->pwr_mask, on, 0, 0, 0, &res);
 }
 
 static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on)