Merge "msm: mdss: Ensure MDSS GDSC switched off during FB PM suspend"

This commit is contained in:
Linux Build Service Account 2017-04-20 04:40:53 -07:00 committed by Gerrit - the friendly Code Review server
commit 4b791a5fa9
5 changed files with 39 additions and 3 deletions

View file

@ -1596,13 +1596,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)
@ -1622,6 +1639,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

View 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;
};

View 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;

View file

@ -1640,6 +1640,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);

View file

@ -6291,6 +6291,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;
@ -6333,6 +6340,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;