From 93993a9497ed707974c9e16210d3c2ff002a756e Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Thu, 19 Mar 2020 16:22:05 +0800 Subject: [PATCH] soc: rockchip: power-domain: export pd on/off and pd status Some special applications of video may require: rockchip_pmu_pd_on(dev)---> force power on pd rockchip_pmu_pd_off(dev)---> force power down pd rockchip_pmu_pd_is_on(dev)---> pd status Change-Id: I264d76559aef0b0540130bf29a4635a3f5380a7c Signed-off-by: Elaine Zhang --- drivers/soc/rockchip/pm_domains.c | 59 +++++++++++++++++++++++++++++++ include/soc/rockchip/pm_domains.h | 3 ++ 2 files changed, 62 insertions(+) diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c index bcf67c5ca574..f3db1187ae5e 100644 --- a/drivers/soc/rockchip/pm_domains.c +++ b/drivers/soc/rockchip/pm_domains.c @@ -500,6 +500,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 b566cb8a5ef2..c3a2017f86bc 100644 --- a/include/soc/rockchip/pm_domains.h +++ b/include/soc/rockchip/pm_domains.h @@ -7,6 +7,9 @@ struct device; #ifdef CONFIG_ROCKCHIP_PM_DOMAINS +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);