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

Commit d0439a71 authored by Adrian Salido's avatar Adrian Salido Committed by Nirmal Abraham
Browse files

msm: mdss: save state of vsync handler

When going into low power modes, vsync handlers can be forcefully shut
down in order to disable clocks. If vsync handler was expected to be
enabled it would lose that state. Instead maintain the state of the
vsync and re-enable on next panel on.

Bug: 62375787
Git-commit: dea49443c3e803158fb213a501452431b76fce3e
Git-repo: https://android.googlesource.com/kernel/common


Change-Id: Ic4e7d666f17852e5d6c60979151e27ab3fbf952d
Signed-off-by: default avatarAdrian Salido <salidoa@google.com>
Signed-off-by: default avatarNirmal Abraham <nabrah@codeaurora.org>
parent 5c004dec
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -933,6 +933,7 @@ struct mdss_mdp_writeback_arg {
struct mdss_mdp_wfd;

struct mdss_overlay_private {
	bool vsync_en;
	ktime_t vsync_time;
	ktime_t lineptr_time;
	struct kernfs_node *vsync_event_sd;
+11 −1
Original line number Diff line number Diff line
@@ -3307,12 +3307,14 @@ int mdss_mdp_overlay_vsync_ctrl(struct msm_fb_data_type *mfd, int en)
		goto end;
	}

	mdp5_data->vsync_en = en;

	if (!ctl->panel_data->panel_info.cont_splash_enabled
		&& (!mdss_mdp_ctl_is_power_on(ctl) ||
		mdss_panel_is_power_on_ulp(ctl->power_state))) {
		pr_debug("fb%d vsync pending first update en=%d, ctl power state:%d\n",
				mfd->index, en, ctl->power_state);
		rc = -EPERM;
		rc = 0;
		goto end;
	}

@@ -5759,6 +5761,13 @@ static int mdss_mdp_overlay_on(struct msm_fb_data_type *mfd)
	}

panel_on:
	if (mdp5_data->vsync_en) {
		pr_info("reenabling vsync for fb%d\n", mfd->index);
		mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON);
		rc = ctl->ops.add_vsync_handler(ctl, &ctl->vsync_handler);
		mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF);
	}

	if (IS_ERR_VALUE(rc)) {
		pr_err("Failed to turn on fb%d\n", mfd->index);
		mdss_mdp_overlay_off(mfd);
@@ -6600,6 +6609,7 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd)
		}
	}
	mfd->mdp_sync_pt_data.async_wait_fences = true;
	mdp5_data->vsync_en = false;

	pm_runtime_set_suspended(&mfd->pdev->dev);
	pm_runtime_enable(&mfd->pdev->dev);