Merge "msm: mdss: Ensure MDSS GDSC switched off during FB PM suspend"
This commit is contained in:
commit
4b791a5fa9
5 changed files with 39 additions and 3 deletions
|
@ -1596,13 +1596,30 @@ static int mdss_fb_resume(struct platform_device *pdev)
|
||||||
static int mdss_fb_pm_suspend(struct device *dev)
|
static int mdss_fb_pm_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct msm_fb_data_type *mfd = dev_get_drvdata(dev);
|
struct msm_fb_data_type *mfd = dev_get_drvdata(dev);
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
if (!mfd)
|
if (!mfd)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
dev_dbg(dev, "display pm suspend\n");
|
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)
|
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_set_suspended(dev);
|
||||||
pm_runtime_enable(dev);
|
pm_runtime_enable(dev);
|
||||||
|
|
||||||
|
if (mfd->mdp.footswitch_ctrl)
|
||||||
|
mfd->mdp.footswitch_ctrl(true);
|
||||||
|
|
||||||
return mdss_fb_resume_sub(mfd);
|
return mdss_fb_resume_sub(mfd);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -232,6 +232,7 @@ struct msm_mdp_interface {
|
||||||
int (*configure_panel)(struct msm_fb_data_type *mfd, int mode,
|
int (*configure_panel)(struct msm_fb_data_type *mfd, int mode,
|
||||||
int dest_ctrl);
|
int dest_ctrl);
|
||||||
int (*input_event_handler)(struct msm_fb_data_type *mfd);
|
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);
|
int (*pp_release_fnc)(struct msm_fb_data_type *mfd);
|
||||||
void *private1;
|
void *private1;
|
||||||
};
|
};
|
||||||
|
|
|
@ -233,7 +233,6 @@ static struct mdss_mdp_irq mdp_irq_map[] = {
|
||||||
|
|
||||||
static struct intr_callback *mdp_intr_cb;
|
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(struct platform_device *pdev);
|
||||||
static int mdss_mdp_parse_dt_pipe(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);
|
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
|
* active (but likely in an idle state), the vote for the CX and the batfet
|
||||||
* rails should not be released.
|
* 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 ret;
|
||||||
int active_cnt = 0;
|
int active_cnt = 0;
|
||||||
|
|
|
@ -1640,6 +1640,7 @@ int mdss_mdp_set_intr_callback_nosync(u32 intr_type, u32 intf_num,
|
||||||
void (*fnc_ptr)(void *), void *arg);
|
void (*fnc_ptr)(void *), void *arg);
|
||||||
u32 mdss_mdp_get_irq_mask(u32 intr_type, u32 intf_num);
|
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_footswitch_ctrl_splash(int on);
|
||||||
void mdss_mdp_batfet_ctrl(struct mdss_data_type *mdata, int enable);
|
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);
|
void mdss_mdp_set_clk_rate(unsigned long min_clk_rate, bool locked);
|
||||||
|
|
|
@ -6291,6 +6291,13 @@ int mdss_mdp_input_event_handler(struct msm_fb_data_type *mfd)
|
||||||
return rc;
|
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)
|
int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd)
|
||||||
{
|
{
|
||||||
struct device *dev = mfd->fbi->dev;
|
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->configure_panel = mdss_mdp_update_panel_info;
|
||||||
mdp5_interface->input_event_handler = mdss_mdp_input_event_handler;
|
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) {
|
if (mfd->panel_info->type == WRITEBACK_PANEL) {
|
||||||
mdp5_interface->atomic_validate =
|
mdp5_interface->atomic_validate =
|
||||||
mdss_mdp_layer_atomic_validate_wfd;
|
mdss_mdp_layer_atomic_validate_wfd;
|
||||||
|
|
Loading…
Add table
Reference in a new issue