diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/base/power/domain.c | 8 | ||||
| -rw-r--r-- | drivers/soc/imx/gpc.c | 13 |
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 | ||
| 134 | static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev, | 135 | static 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) |
