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);