From a9287e6e5f92ebaa42e60a83dc8d8943581d2f95 Mon Sep 17 00:00:00 2001 From: Liangbin Lian Date: Tue, 25 Feb 2025 15:50:24 +0800 Subject: [PATCH] target/rockchip: exports pm-domains apis --- .../801-rockchip-pm-domains-apis.patch | 247 ++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 target/linux/rockchip/patches-6.6/801-rockchip-pm-domains-apis.patch diff --git a/target/linux/rockchip/patches-6.6/801-rockchip-pm-domains-apis.patch b/target/linux/rockchip/patches-6.6/801-rockchip-pm-domains-apis.patch new file mode 100644 index 0000000000..614f3e9b9b --- /dev/null +++ b/target/linux/rockchip/patches-6.6/801-rockchip-pm-domains-apis.patch @@ -0,0 +1,247 @@ +From 7495942defb389d1b10478f1676b9ab37ec9dcd4 Mon Sep 17 00:00:00 2001 +From: jjm2473 +Date: Mon, 24 Feb 2025 14:24:24 +0800 +Subject: [PATCH] rockchip/pm-domains: export APIs + +--- + drivers/pmdomain/rockchip/pm-domains.c | 141 +++++++++++++++++++++++++ + include/soc/rockchip/pm_domains.h | 36 +++++++ + 2 files changed, 177 insertions(+) + +diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c +index d5d3ecb38..35f2c5672 100644 +--- a/drivers/pmdomain/rockchip/pm-domains.c ++++ b/drivers/pmdomain/rockchip/pm-domains.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -98,6 +99,18 @@ struct rockchip_pmu { + struct generic_pm_domain *domains[]; + }; + ++static void rockchip_pmu_lock(struct rockchip_pm_domain *pd) ++{ ++ mutex_lock(&pd->pmu->mutex); ++ rockchip_dmcfreq_lock_nested(); ++} ++ ++static void rockchip_pmu_unlock(struct rockchip_pm_domain *pd) ++{ ++ rockchip_dmcfreq_unlock(); ++ mutex_unlock(&pd->pmu->mutex); ++} ++ + #define to_rockchip_pd(gpd) container_of(gpd, struct rockchip_pm_domain, genpd) + + #define DOMAIN(_name, pwr, status, req, idle, ack, wakeup) \ +@@ -345,6 +358,29 @@ static int rockchip_pmu_set_idle_request(struct rockchip_pm_domain *pd, + return 0; + } + ++int rockchip_pmu_idle_request(struct device *dev, bool idle) ++{ ++ struct generic_pm_domain *genpd; ++ struct rockchip_pm_domain *pd; ++ int ret; ++ ++ if (IS_ERR_OR_NULL(dev)) ++ return -EINVAL; ++ ++ if (IS_ERR_OR_NULL(dev->pm_domain)) ++ return -EINVAL; ++ ++ genpd = pd_to_genpd(dev->pm_domain); ++ pd = to_rockchip_pd(genpd); ++ ++ rockchip_pmu_lock(pd); ++ ret = rockchip_pmu_set_idle_request(pd, idle); ++ rockchip_pmu_unlock(pd); ++ ++ return ret; ++} ++EXPORT_SYMBOL(rockchip_pmu_idle_request); ++ + static int rockchip_pmu_save_qos(struct rockchip_pm_domain *pd) + { + int i; +@@ -394,6 +430,52 @@ static int rockchip_pmu_restore_qos(struct rockchip_pm_domain *pd) + return 0; + } + ++int rockchip_save_qos(struct device *dev) ++{ ++ struct generic_pm_domain *genpd; ++ struct rockchip_pm_domain *pd; ++ int ret; ++ ++ if (IS_ERR_OR_NULL(dev)) ++ return -EINVAL; ++ ++ if (IS_ERR_OR_NULL(dev->pm_domain)) ++ return -EINVAL; ++ ++ genpd = pd_to_genpd(dev->pm_domain); ++ pd = to_rockchip_pd(genpd); ++ ++ rockchip_pmu_lock(pd); ++ ret = rockchip_pmu_save_qos(pd); ++ rockchip_pmu_unlock(pd); ++ ++ return ret; ++} ++EXPORT_SYMBOL(rockchip_save_qos); ++ ++int rockchip_restore_qos(struct device *dev) ++{ ++ struct generic_pm_domain *genpd; ++ struct rockchip_pm_domain *pd; ++ int ret; ++ ++ if (IS_ERR_OR_NULL(dev)) ++ return -EINVAL; ++ ++ if (IS_ERR_OR_NULL(dev->pm_domain)) ++ return -EINVAL; ++ ++ genpd = pd_to_genpd(dev->pm_domain); ++ pd = to_rockchip_pd(genpd); ++ ++ rockchip_pmu_lock(pd); ++ ret = rockchip_pmu_restore_qos(pd); ++ rockchip_pmu_unlock(pd); ++ ++ return ret; ++} ++EXPORT_SYMBOL(rockchip_restore_qos); ++ + static bool rockchip_pmu_domain_is_on(struct rockchip_pm_domain *pd) + { + struct rockchip_pmu *pmu = pd->pmu; +@@ -574,6 +656,65 @@ static int rockchip_pd_power_off(struct generic_pm_domain *domain) + return rockchip_pd_power(pd, false); + } + ++int rockchip_pmu_pd_on(struct device *dev) ++{ ++ struct generic_pm_domain *genpd; ++ struct rockchip_pm_domain *pd; ++ ++ if (IS_ERR_OR_NULL(dev)) ++ return -EINVAL; ++ ++ if (IS_ERR_OR_NULL(dev->pm_domain)) ++ return -EINVAL; ++ ++ genpd = pd_to_genpd(dev->pm_domain); ++ pd = to_rockchip_pd(genpd); ++ ++ return rockchip_pd_power(pd, true); ++} ++EXPORT_SYMBOL(rockchip_pmu_pd_on); ++ ++int rockchip_pmu_pd_off(struct device *dev) ++{ ++ struct generic_pm_domain *genpd; ++ struct rockchip_pm_domain *pd; ++ ++ if (IS_ERR_OR_NULL(dev)) ++ return -EINVAL; ++ ++ if (IS_ERR_OR_NULL(dev->pm_domain)) ++ return -EINVAL; ++ ++ genpd = pd_to_genpd(dev->pm_domain); ++ pd = to_rockchip_pd(genpd); ++ ++ return rockchip_pd_power(pd, false); ++ } ++EXPORT_SYMBOL(rockchip_pmu_pd_off); ++ ++bool rockchip_pmu_pd_is_on(struct device *dev) ++{ ++ struct generic_pm_domain *genpd; ++ struct rockchip_pm_domain *pd; ++ bool is_on; ++ ++ if (IS_ERR_OR_NULL(dev)) ++ return false; ++ ++ if (IS_ERR_OR_NULL(dev->pm_domain)) ++ return false; ++ ++ genpd = pd_to_genpd(dev->pm_domain); ++ pd = to_rockchip_pd(genpd); ++ ++ rockchip_pmu_lock(pd); ++ is_on = rockchip_pmu_domain_is_on(pd); ++ rockchip_pmu_unlock(pd); ++ ++ return is_on; ++} ++EXPORT_SYMBOL(rockchip_pmu_pd_is_on); ++ + static int rockchip_pd_attach_dev(struct generic_pm_domain *genpd, + struct device *dev) + { +diff --git a/include/soc/rockchip/pm_domains.h b/include/soc/rockchip/pm_domains.h +index 7dbd941fc..92ef647d6 100644 +--- a/include/soc/rockchip/pm_domains.h ++++ b/include/soc/rockchip/pm_domains.h +@@ -10,6 +10,12 @@ + + int rockchip_pmu_block(void); + void rockchip_pmu_unblock(void); ++int rockchip_pmu_pd_on(struct device *dev); ++int rockchip_pmu_pd_off(struct device *dev); ++bool rockchip_pmu_pd_is_on(struct device *dev); ++int rockchip_pmu_idle_request(struct device *dev, bool idle); ++int rockchip_save_qos(struct device *dev); ++int rockchip_restore_qos(struct device *dev); + + #else /* CONFIG_ROCKCHIP_PM_DOMAINS */ + +@@ -20,6 +26,36 @@ static inline int rockchip_pmu_block(void) + + static inline void rockchip_pmu_unblock(void) { } + ++static inline int rockchip_pmu_pd_on(struct device *dev) ++{ ++ return -ENOTSUPP; ++} ++ ++static inline int rockchip_pmu_pd_off(struct device *dev) ++{ ++ return -ENOTSUPP; ++} ++ ++static inline bool rockchip_pmu_pd_is_on(struct device *dev) ++{ ++ return true; ++} ++ ++static inline int rockchip_pmu_idle_request(struct device *dev, bool idle) ++{ ++ return -ENOTSUPP; ++} ++ ++static inline int rockchip_save_qos(struct device *dev) ++{ ++ return -ENOTSUPP; ++} ++ ++static inline int rockchip_restore_qos(struct device *dev) ++{ ++ return -ENOTSUPP; ++} ++ + #endif /* CONFIG_ROCKCHIP_PM_DOMAINS */ + + #endif /* __SOC_ROCKCHIP_PM_DOMAINS_H__ */ +-- +2.46.0 +