target/rockchip: exports pm-domains apis

This commit is contained in:
Liangbin Lian 2025-02-25 15:50:24 +08:00
parent 965cc7166d
commit a9287e6e5f

View File

@ -0,0 +1,247 @@
From 7495942defb389d1b10478f1676b9ab37ec9dcd4 Mon Sep 17 00:00:00 2001
From: jjm2473 <jjm2473@gmail.com>
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 <linux/regmap.h>
#include <linux/mfd/syscon.h>
#include <soc/rockchip/pm_domains.h>
+#include <soc/rockchip/rockchip_dmc.h>
#include <dt-bindings/power/px30-power.h>
#include <dt-bindings/power/rockchip,rv1126-power.h>
#include <dt-bindings/power/rk3036-power.h>
@@ -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