target/rockchip: exports pm-domains apis
This commit is contained in:
parent
965cc7166d
commit
a9287e6e5f
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user