aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/base/power/domain.c8
-rw-r--r--drivers/soc/imx/gpc.c13
2 files changed, 17 insertions, 4 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 3d899e8abd58..a887575fafa9 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -130,6 +130,7 @@ static const struct genpd_lock_ops genpd_spin_ops = {
130#define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON) 130#define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON)
131#define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP) 131#define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP)
132#define genpd_is_cpu_domain(genpd) (genpd->flags & GENPD_FLAG_CPU_DOMAIN) 132#define genpd_is_cpu_domain(genpd) (genpd->flags & GENPD_FLAG_CPU_DOMAIN)
133#define genpd_is_rpm_always_on(genpd) (genpd->flags & GENPD_FLAG_RPM_ALWAYS_ON)
133 134
134static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev, 135static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev,
135 const struct generic_pm_domain *genpd) 136 const struct generic_pm_domain *genpd)
@@ -517,7 +518,9 @@ static int genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on,
517 * (1) The domain is configured as always on. 518 * (1) The domain is configured as always on.
518 * (2) When the domain has a subdomain being powered on. 519 * (2) When the domain has a subdomain being powered on.
519 */ 520 */
520 if (genpd_is_always_on(genpd) || atomic_read(&genpd->sd_count) > 0) 521 if (genpd_is_always_on(genpd) ||
522 genpd_is_rpm_always_on(genpd) ||
523 atomic_read(&genpd->sd_count) > 0)
521 return -EBUSY; 524 return -EBUSY;
522 525
523 list_for_each_entry(pdd, &genpd->dev_list, list_node) { 526 list_for_each_entry(pdd, &genpd->dev_list, list_node) {
@@ -1814,7 +1817,8 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
1814 } 1817 }
1815 1818
1816 /* Always-on domains must be powered on at initialization. */ 1819 /* Always-on domains must be powered on at initialization. */
1817 if (genpd_is_always_on(genpd) && !genpd_status_on(genpd)) 1820 if ((genpd_is_always_on(genpd) || genpd_is_rpm_always_on(genpd)) &&
1821 !genpd_status_on(genpd))
1818 return -EINVAL; 1822 return -EINVAL;
1819 1823
1820 if (genpd_is_cpu_domain(genpd) && 1824 if (genpd_is_cpu_domain(genpd) &&
diff --git a/drivers/soc/imx/gpc.c b/drivers/soc/imx/gpc.c
index 7d14a4b4e82a..29b43651c261 100644
--- a/drivers/soc/imx/gpc.c
+++ b/drivers/soc/imx/gpc.c
@@ -431,10 +431,19 @@ static int imx_gpc_probe(struct platform_device *pdev)
431 return ret; 431 return ret;
432 } 432 }
433 433
434 /* Disable PU power down in normal operation if ERR009619 is present */ 434 /*
435 * Disable PU power down by runtime PM if ERR009619 is present.
436 *
437 * The PRE clock will be paused for several cycles when turning on the
438 * PU domain LDO from power down state. If PRE is in use at that time,
439 * the IPU/PRG cannot get the correct display data from the PRE.
440 *
441 * This is not a concern when the whole system enters suspend state, so
442 * it's safe to power down PU in this case.
443 */
435 if (of_id_data->err009619_present) 444 if (of_id_data->err009619_present)
436 imx_gpc_domains[GPC_PGC_DOMAIN_PU].base.flags |= 445 imx_gpc_domains[GPC_PGC_DOMAIN_PU].base.flags |=
437 GENPD_FLAG_ALWAYS_ON; 446 GENPD_FLAG_RPM_ALWAYS_ON;
438 447
439 /* Keep DISP always on if ERR006287 is present */ 448 /* Keep DISP always on if ERR006287 is present */
440 if (of_id_data->err006287_present) 449 if (of_id_data->err006287_present)