Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47756a03 authored by Jayant Shekhar's avatar Jayant Shekhar
Browse files

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



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: default avatarJayant Shekhar <jshekhar@codeaurora.org>
parent 630218f7
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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;
};
+1 −2
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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);
+15 −0
Original line number Diff line number Diff line
@@ -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;