diff options
-rw-r--r-- | arch/arm/mach-imx/busfreq-imx.c | 31 | ||||
-rw-r--r-- | arch/arm/mach-imx/common.h | 3 |
2 files changed, 29 insertions, 5 deletions
diff --git a/arch/arm/mach-imx/busfreq-imx.c b/arch/arm/mach-imx/busfreq-imx.c index 1b0df6b3e392..c9cc1ef516fd 100644 --- a/arch/arm/mach-imx/busfreq-imx.c +++ b/arch/arm/mach-imx/busfreq-imx.c @@ -1029,19 +1029,30 @@ static ssize_t bus_freq_scaling_enable_store(struct device *dev, static int bus_freq_pm_notify(struct notifier_block *nb, unsigned long event, void *dummy) { + if (cpu_is_imx7d() && imx_src_is_m4_enabled()) { + if (event == PM_SUSPEND_PREPARE) + imx_mu_lpm_ready(false); + else if (event == PM_POST_SUSPEND) + imx_mu_lpm_ready(true); + + /* + * If M4 is in low frequency mode, we should not force the + * system AXI bus to high frequency but let it switch to low + * frequency mode when entering suspend... + */ + if (imx_mu_is_m4_in_low_freq()) + return NOTIFY_OK; + } + mutex_lock(&bus_freq_mutex); if (event == PM_SUSPEND_PREPARE) { - if (cpu_is_imx7d() && imx_src_is_m4_enabled()) - imx_mu_lpm_ready(false); high_bus_count++; set_high_bus_freq(1); busfreq_suspended = 1; } else if (event == PM_POST_SUSPEND) { busfreq_suspended = 0; high_bus_count--; - if (cpu_is_imx7d() && imx_src_is_m4_enabled()) - imx_mu_lpm_ready(true); schedule_delayed_work(&bus_freq_daemon, usecs_to_jiffies(5000000)); } @@ -1325,11 +1336,23 @@ static const struct of_device_id imx_busfreq_ids[] = { { /* sentinel */ } }; +static int busfreq_suspend(struct device *pdev) +{ + flush_delayed_work(&low_bus_freq_handler); + + return 0; +} + +static const struct dev_pm_ops busfreq_pm_ops = { + SET_LATE_SYSTEM_SLEEP_PM_OPS(busfreq_suspend, NULL) +}; + static struct platform_driver busfreq_driver = { .driver = { .name = "imx_busfreq", .owner = THIS_MODULE, .of_match_table = imx_busfreq_ids, + .pm = &busfreq_pm_ops, }, .probe = busfreq_probe, }; diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index e8fd22bc2b15..c5a724e9988b 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -80,14 +80,15 @@ void imx_gpc_hold_m4_in_sleep(void); void imx_gpc_release_m4_in_sleep(void); void mcc_receive_from_mu_buffer(unsigned int index, unsigned int *data); void mcc_send_via_mu_buffer(unsigned int index, unsigned int data); -bool imx_mu_is_m4_in_low_freq(void); bool imx_mu_is_m4_in_stop(void); void imx_mu_set_m4_run_mode(void); #ifdef CONFIG_HAVE_IMX_MU int imx_mu_lpm_ready(bool ready); +bool imx_mu_is_m4_in_low_freq(void); void imx_mu_set_m4_low_freq(void); #else static inline int imx_mu_lpm_ready(bool ready) { return 0; } +static inline bool imx_mu_is_m4_in_low_freq(void) { return false; } static inline void imx_mu_set_m4_low_freq(void) { } #endif |