OSDN Git Service

msm: mdss: Ensure MDSS GDSC switched off during FB PM suspend
authorJayant Shekhar <jshekhar@codeaurora.org>
Thu, 13 Apr 2017 09:44:40 +0000 (15:14 +0530)
committerJayant Shekhar <jshekhar@codeaurora.org>
Mon, 17 Apr 2017 05:53:02 +0000 (11:23 +0530)
There are some cases where MDSS GSDC is not turned off after FB
PM suspend ever after clock ref count is 0 as runtime suspend
is not triggered. Ensure that MDSS GDCC is toggled in these
cases.

Change-Id: I33389ad736960b619b32a9bec4b2b157eed4d20b
Signed-off-by: Jayant Shekhar <jshekhar@codeaurora.org>
drivers/video/fbdev/msm/mdss_fb.c
drivers/video/fbdev/msm/mdss_fb.h
drivers/video/fbdev/msm/mdss_mdp.c
drivers/video/fbdev/msm/mdss_mdp.h
drivers/video/fbdev/msm/mdss_mdp_overlay.c

index bf66c0c..664b27d 100644 (file)
@@ -1592,13 +1592,30 @@ static int mdss_fb_resume(struct platform_device *pdev)
 static int mdss_fb_pm_suspend(struct device *dev)
 {
        struct msm_fb_data_type *mfd = dev_get_drvdata(dev);
+       int rc = 0;
 
        if (!mfd)
                return -ENODEV;
 
        dev_dbg(dev, "display pm suspend\n");
 
-       return mdss_fb_suspend_sub(mfd);
+       rc = mdss_fb_suspend_sub(mfd);
+
+       /*
+        * Call MDSS footswitch control to ensure GDSC is
+        * off after pm suspend call. There are cases when
+        * mdss runtime call doesn't trigger even when clock
+        * ref count is zero after fb pm suspend.
+        */
+       if (!rc) {
+               if (mfd->mdp.footswitch_ctrl)
+                       mfd->mdp.footswitch_ctrl(false);
+       } else {
+               pr_err("fb pm suspend failed, rc: %d\n", rc);
+       }
+
+       return rc;
+
 }
 
 static int mdss_fb_pm_resume(struct device *dev)
@@ -1618,6 +1635,9 @@ static int mdss_fb_pm_resume(struct device *dev)
        pm_runtime_set_suspended(dev);
        pm_runtime_enable(dev);
 
+       if (mfd->mdp.footswitch_ctrl)
+               mfd->mdp.footswitch_ctrl(true);
+
        return mdss_fb_resume_sub(mfd);
 }
 #endif
index 321531c..3a60cdd 100644 (file)
@@ -232,6 +232,7 @@ struct msm_mdp_interface {
        int (*configure_panel)(struct msm_fb_data_type *mfd, int mode,
                                int dest_ctrl);
        int (*input_event_handler)(struct msm_fb_data_type *mfd);
+       void (*footswitch_ctrl)(bool on);
        int (*pp_release_fnc)(struct msm_fb_data_type *mfd);
        void *private1;
 };
index b09e771..51c74b8 100644 (file)
@@ -233,7 +233,6 @@ static struct mdss_mdp_irq mdp_irq_map[] =  {
 
 static struct intr_callback *mdp_intr_cb;
 
-static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on);
 static int mdss_mdp_parse_dt(struct platform_device *pdev);
 static int mdss_mdp_parse_dt_pipe(struct platform_device *pdev);
 static int mdss_mdp_parse_dt_mixer(struct platform_device *pdev);
@@ -5172,7 +5171,7 @@ static void mdss_mdp_notify_idle_pc(struct mdss_data_type *mdata)
  * active (but likely in an idle state), the vote for the CX and the batfet
  * rails should not be released.
  */
-static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on)
+void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on)
 {
        int ret;
        int active_cnt = 0;
index 2fd047e..56bed5d 100644 (file)
@@ -1638,6 +1638,7 @@ int mdss_mdp_set_intr_callback_nosync(u32 intr_type, u32 intf_num,
                               void (*fnc_ptr)(void *), void *arg);
 u32 mdss_mdp_get_irq_mask(u32 intr_type, u32 intf_num);
 
+void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on);
 void mdss_mdp_footswitch_ctrl_splash(int on);
 void mdss_mdp_batfet_ctrl(struct mdss_data_type *mdata, int enable);
 void mdss_mdp_set_clk_rate(unsigned long min_clk_rate, bool locked);
index 5daa8a7..e25ec50 100644 (file)
@@ -6269,6 +6269,13 @@ int mdss_mdp_input_event_handler(struct msm_fb_data_type *mfd)
        return rc;
 }
 
+void mdss_mdp_footswitch_ctrl_handler(bool on)
+{
+       struct mdss_data_type *mdata = mdss_mdp_get_mdata();
+
+       mdss_mdp_footswitch_ctrl(mdata, on);
+}
+
 int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd)
 {
        struct device *dev = mfd->fbi->dev;
@@ -6311,6 +6318,14 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd)
        mdp5_interface->configure_panel = mdss_mdp_update_panel_info;
        mdp5_interface->input_event_handler = mdss_mdp_input_event_handler;
 
+       /*
+        * Register footswitch control only for primary fb pm
+        * suspend/resume calls.
+        */
+       if (mfd->panel_info->is_prim_panel)
+               mdp5_interface->footswitch_ctrl =
+                       mdss_mdp_footswitch_ctrl_handler;
+
        if (mfd->panel_info->type == WRITEBACK_PANEL) {
                mdp5_interface->atomic_validate =
                        mdss_mdp_layer_atomic_validate_wfd;