diff options
| author | Adrian Salido-Moreno <adrianm@codeaurora.org> | 2012-09-21 15:48:31 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:12:27 -0700 |
| commit | c258eecae169cbbc3b4bf26a025260380760751d (patch) | |
| tree | a03e52ad904482728b9027aebff0d63b325c38eb | |
| parent | 1c0f32355fb49ef976e248187f1c350df2cb75c2 (diff) | |
msm: mdss: implement early suspend api
Use early suspend API for suspend/resume to allow display more room to
turn panel off/on before system goes to suspend mode.
Change-Id: I70b8b1055c30b940eda49ebad0db341259e903b4
Signed-off-by: Adrian Salido-Moreno <adrianm@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss.h | 3 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 63 |
2 files changed, 65 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h index 505c738826c4..8d1423e6b9af 100644 --- a/drivers/video/fbdev/msm/mdss.h +++ b/drivers/video/fbdev/msm/mdss.h @@ -15,6 +15,7 @@ #define MDSS_H #include <linux/msm_ion.h> +#include <linux/earlysuspend.h> #include <linux/msm_mdp.h> #include <linux/spinlock.h> #include <linux/types.h> @@ -75,6 +76,8 @@ struct mdss_data_type { struct ion_client *iclient; int iommu_domain; int iommu_attached; + + struct early_suspend early_suspend; }; extern struct mdss_data_type *mdss_res; diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index 1eb41eca6a25..488e69eeeca4 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -128,6 +128,8 @@ struct mdss_hw mdss_mdp_hw = { static DEFINE_SPINLOCK(mdss_lock); struct mdss_hw *mdss_irq_handlers[MDSS_MAX_HW_BLK]; +static int mdss_mdp_register_early_suspend(struct mdss_data_type *mdata); + static inline int mdss_irq_dispatch(u32 hw_ndx, int irq, void *ptr) { struct mdss_hw *hw; @@ -852,6 +854,16 @@ static int mdss_mdp_probe(struct platform_device *pdev) goto probe_done; } rc = mdss_mdp_bus_scale_register(mdata); + if (rc) { + pr_err("unable to register bus scaling\n"); + goto probe_done; + } + + rc = mdss_mdp_register_early_suspend(mdata); + if (rc) { + pr_err("unable to register early suspend\n"); + goto probe_done; + } probe_done: if (IS_ERR_VALUE(rc)) { mdss_res = NULL; @@ -936,7 +948,7 @@ static inline int mdss_mdp_resume_sub(struct mdss_data_type *mdata) return ret; } -#if defined(CONFIG_PM) +#if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND) static int mdss_mdp_suspend(struct platform_device *pdev, pm_message_t state) { struct mdss_data_type *mdata = platform_get_drvdata(pdev); @@ -965,6 +977,54 @@ static int mdss_mdp_resume(struct platform_device *pdev) #define mdss_mdp_resume NULL #endif +#ifdef CONFIG_HAS_EARLYSUSPEND +static void mdss_mdp_early_suspend(struct early_suspend *h) +{ + struct mdss_data_type *mdata; + mdata = container_of(h, struct mdss_data_type, early_suspend); + + pr_debug("display early suspend\n"); + + mdss_mdp_suspend_sub(mdata); +} + +static void mdss_mdp_late_resume(struct early_suspend *h) +{ + struct mdss_data_type *mdata; + mdata = container_of(h, struct mdss_data_type, early_suspend); + + pr_debug("display early resume\n"); + + mdss_mdp_resume_sub(mdata); +} + +static int mdss_mdp_register_early_suspend(struct mdss_data_type *mdata) +{ + mdata->early_suspend.suspend = mdss_mdp_early_suspend; + mdata->early_suspend.resume = mdss_mdp_late_resume; + mdata->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN; + register_early_suspend(&mdata->early_suspend); + + return 0; +} + +static int mdss_mdp_remove_early_suspend(struct mdss_data_type *mdata) +{ + unregister_early_suspend(&mdata->early_suspend); + + return 0; +} +#else +static int mdss_mdp_register_early_suspend(struct mdss_data_type *mdata) +{ + return 0; +} +static int mdss_mdp_remove_early_suspend(struct mdss_data_type *mdata) +{ + return 0; +} +#endif + static int mdss_mdp_remove(struct platform_device *pdev) { struct mdss_data_type *mdata = platform_get_drvdata(pdev); @@ -973,6 +1033,7 @@ static int mdss_mdp_remove(struct platform_device *pdev) pm_runtime_disable(&pdev->dev); mdss_mdp_pp_term(&pdev->dev); mdss_mdp_bus_scale_unregister(mdata); + mdss_mdp_remove_early_suspend(mdata); return 0; } |
