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

Commit 85e9127a authored by Shashank Babu Chinta Venkata's avatar Shashank Babu Chinta Venkata Committed by Gerrit - the friendly Code Review server
Browse files

drm/msm/dsi-staging: enable panel te irq only during esd check



Panel TE irq is now enabled and disabled as part of display prepare
and unprepare respectively. This change enables and disables irq as
part of ESD check mechanism thereby saving power.

Change-Id: Iaea88fd8dd5cdcf52fdc0959aaca882b16aa6322
Signed-off-by: default avatarShashank Babu Chinta Venkata <sbchin@codeaurora.org>
Signed-off-by: default avatarLakshmi Narayana Kalavala <lkalaval@codeaurora.org>
parent cc134aae
Loading
Loading
Loading
Loading
+14 −17
Original line number Diff line number Diff line
@@ -319,8 +319,7 @@ static irqreturn_t dsi_display_panel_te_irq_handler(int irq, void *data)
	if (!display)
		return IRQ_HANDLED;

	atomic_set(&display->te_irq_triggered, 1);

	complete_all(&display->esd_te_gate);
	return IRQ_HANDLED;
}

@@ -334,12 +333,10 @@ static void dsi_display_change_te_irq_status(struct dsi_display *display,

	/* Handle unbalanced irq enable/disbale calls */
	if (enable && !display->is_te_irq_enabled) {
		atomic_set(&display->te_irq_triggered, 1);
		enable_irq(gpio_to_irq(display->disp_te_gpio));
		display->is_te_irq_enabled = true;
	} else if (!enable && display->is_te_irq_enabled) {
		disable_irq(gpio_to_irq(display->disp_te_gpio));
		atomic_set(&display->te_irq_triggered, 0);
		display->is_te_irq_enabled = false;
	}
}
@@ -370,6 +367,8 @@ static void dsi_display_register_te_irq(struct dsi_display *display)
		return;
	}

	init_completion(&display->esd_te_gate);

	disable_irq(gpio_to_irq(display->disp_te_gpio));
	display->is_te_irq_enabled = false;
}
@@ -666,16 +665,21 @@ static int dsi_display_status_bta_request(struct dsi_display *display)

static int dsi_display_status_check_te(struct dsi_display *display)
{
	int const esd_check_success = 1;
	int rc = 1;
	int const esd_te_timeout = msecs_to_jiffies(3*20);

	if (atomic_read(&display->te_irq_triggered)) {
		atomic_set(&display->te_irq_triggered, 0);
	} else {
	dsi_display_change_te_irq_status(display, true);

	reinit_completion(&display->esd_te_gate);
	if (!wait_for_completion_timeout(&display->esd_te_gate,
				esd_te_timeout)) {
		pr_err("ESD check failed\n");
		return -EINVAL;
		rc = -EINVAL;
	}

	return esd_check_success;
	dsi_display_change_te_irq_status(display, false);

	return rc;
}

int dsi_display_check_status(struct drm_connector *connector, void *display)
@@ -5549,9 +5553,6 @@ int dsi_display_prepare(struct dsi_display *display)

	mode = display->panel->cur_mode;

	if (dsi_display_is_te_based_esd(display))
		dsi_display_change_te_irq_status(display, true);

	if (mode->dsi_mode_flags & DSI_MODE_FLAG_DMS) {
		if (display->is_cont_splash_enabled) {
			pr_err("DMS is not supposed to be set on first frame\n");
@@ -6158,10 +6159,6 @@ int dsi_display_unprepare(struct dsi_display *display)
		pr_err("[%s] display wake up failed, rc=%d\n",
		       display->name, rc);

	/* Disable panel TE irq */
	if (dsi_display_is_te_based_esd(display))
		dsi_display_change_te_irq_status(display, false);

	rc = dsi_panel_unprepare(display->panel);
	if (rc)
		pr_err("[%s] panel unprepare failed, rc=%d\n",
+2 −2
Original line number Diff line number Diff line
@@ -137,7 +137,7 @@ struct dsi_display_clk_info {
 * @display_lock:     Mutex for dsi_display interface.
 * @disp_te_gpio:     GPIO for panel TE interrupt.
 * @is_te_irq_enabled:bool to specify whether TE interrupt is enabled.
 * @te_irq_triggered: atomic state notifying panel TE interrupt.
 * @esd_te_gate:      completion gate to signal TE interrupt.
 * @ctrl_count:       Number of DSI interfaces required by panel.
 * @ctrl:             Controller information for DSI display.
 * @panel:            Handle to DSI panel.
@@ -183,7 +183,7 @@ struct dsi_display {
	struct mutex display_lock;
	int disp_te_gpio;
	bool is_te_irq_enabled;
	atomic_t te_irq_triggered;
	struct completion esd_te_gate;

	u32 ctrl_count;
	struct dsi_display_ctrl ctrl[MAX_DSI_CTRLS_PER_DISPLAY];