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

Commit ef9c4ea5 authored by Sandeep Panda's avatar Sandeep Panda Committed by Dhaval Patel
Browse files

drm/msm/dsi-staging: register dsi irq before splash handoff



In the current implementation dsi irq enable is tied to
dsi core clock enable and disable. But in continuous splash
scenario dsi core is getting enabled before dsi irq can be
registered. So when from core clock enable function, dsi irq
enable call is made, it is returning early since irq is not
registered yet and later this is resulting in irq storm if
any dsi irq is getting triggered. This change fixes the same
by registering dsi irq before splash handoff sequence begins.

Change-Id: I06528884667d63b25df5aa8276a34233315e8395
Signed-off-by: default avatarSandeep Panda <spanda@codeaurora.org>
Signed-off-by: default avatarDhaval Patel <pdhaval@codeaurora.org>
parent 54559809
Loading
Loading
Loading
Loading
+20 −11
Original line number Diff line number Diff line
@@ -538,10 +538,9 @@ static int dsi_display_status_reg_read(struct dsi_display *display)
		}
	}
exit:
	if (rc <= 0) {
		dsi_display_ctrl_irq_update(display, false);
	/* mask only error interrupts */
	if (rc <= 0)
		dsi_display_mask_ctrl_error_interrupts(display);
	}

	dsi_display_cmd_engine_disable(display);
done:
@@ -3593,16 +3592,24 @@ static int _dsi_display_dev_deinit(struct dsi_display *display)
}

/**
 * dsi_display_splash_res_init() - Initialize resources for continuous splash
 * @display:    Pointer to dsi display
 * dsi_display_cont_splash_config() - Initialize resources for continuous splash
 * @dsi_display:    Pointer to dsi display
 * Returns:     Zero on success
 */
static int dsi_display_splash_res_init(struct  dsi_display *display)
int dsi_display_cont_splash_config(void *dsi_display)
{
	struct dsi_display *display = dsi_display;
	int rc = 0;

	/* Vote for gdsc required to read register address space */
	if (!display) {
		pr_err("invalid input display param\n");
		return -EINVAL;
	}

	mutex_lock(&display->display_lock);

	/* Vote for gdsc required to read register address space */
	display->cont_splash_client = sde_power_client_create(display->phandle,
						"cont_splash_client");
	rc = sde_power_resource_enable(display->phandle,
@@ -3610,6 +3617,7 @@ static int dsi_display_splash_res_init(struct dsi_display *display)
	if (rc) {
		pr_err("failed to vote gdsc for continuous splash, rc=%d\n",
							rc);
		mutex_unlock(&display->display_lock);
		return -EINVAL;
	}

@@ -3625,6 +3633,9 @@ static int dsi_display_splash_res_init(struct dsi_display *display)
	dsi_display_clk_mngr_update_splash_status(display->clk_mngr,
				display->is_cont_splash_enabled);

	/* Set up ctrl isr before enabling core clk */
	dsi_display_ctrl_isr_configure(display, true);

	/* Vote for Core clk and link clk. Votes on ctrl and phy
	 * regulator are inplicit from  pre clk on callback
	 */
@@ -3645,6 +3656,7 @@ static int dsi_display_splash_res_init(struct dsi_display *display)
	}

	dsi_config_host_engine_state_for_cont_splash(display);
	mutex_unlock(&display->display_lock);

	return rc;

@@ -3653,6 +3665,7 @@ static int dsi_display_splash_res_init(struct dsi_display *display)
			DSI_ALL_CLKS, DSI_CLK_OFF);

clk_manager_update:
	dsi_display_ctrl_isr_configure(display, false);
	/* Update splash status for clock manager */
	dsi_display_clk_mngr_update_splash_status(display->clk_mngr,
				false);
@@ -3661,6 +3674,7 @@ static int dsi_display_splash_res_init(struct dsi_display *display)
	(void)sde_power_resource_enable(display->phandle,
			display->cont_splash_client, false);
	display->is_cont_splash_enabled = false;
	mutex_unlock(&display->display_lock);
	return rc;
}

@@ -4106,11 +4120,6 @@ static int dsi_display_bind(struct device *dev,
		}
	}

	/* Initialize resources for continuous splash */
	rc = dsi_display_splash_res_init(display);
	if (rc)
		pr_err("Continuous splash resource init failed, rc=%d\n", rc);

	goto error;

error_host_deinit:
+7 −0
Original line number Diff line number Diff line
@@ -622,4 +622,11 @@ enum dsi_pixel_format dsi_display_get_dst_format(
		struct drm_connector *connector,
		void *display);

/**
 * dsi_display_cont_splash_config() - initialize splash resources
 * @display:         Handle to display
 *
 * Return: Zero on Success
 */
int dsi_display_cont_splash_config(void *display);
#endif /* _DSI_DISPLAY_H_ */
+7 −0
Original line number Diff line number Diff line
@@ -292,6 +292,13 @@ struct sde_connector_ops {
	 * Returns: Zero on success, negative error code for failures
	 */
	void (*pre_destroy)(struct drm_connector *connector, void *display);

	/**
	 * cont_splash_config - initialize splash resources
	 * @display: Pointer to private display handle
	 * Returns: zero for success, negetive for failure
	 */
	int (*cont_splash_config)(void *display);
};

/**
+8 −0
Original line number Diff line number Diff line
@@ -1260,6 +1260,7 @@ static int _sde_kms_setup_displays(struct drm_device *dev,
		.check_status = dsi_display_check_status,
		.enable_event = dsi_conn_enable_event,
		.cmd_transfer = dsi_display_cmd_transfer,
		.cont_splash_config = dsi_display_cont_splash_config,
	};
	static const struct sde_connector_ops wb_ops = {
		.post_init =    sde_wb_connector_post_init,
@@ -1273,6 +1274,7 @@ static int _sde_kms_setup_displays(struct drm_device *dev,
		.get_dst_format = NULL,
		.check_status = NULL,
		.cmd_transfer = NULL,
		.cont_splash_config = NULL,
	};
	static const struct sde_connector_ops dp_ops = {
		.post_init  = dp_connector_post_init,
@@ -1285,6 +1287,7 @@ static int _sde_kms_setup_displays(struct drm_device *dev,
		.check_status = NULL,
		.config_hdr = dp_connector_config_hdr,
		.cmd_transfer = NULL,
		.cont_splash_config = NULL,
	};
	struct msm_display_info info;
	struct drm_encoder *encoder;
@@ -2272,6 +2275,7 @@ static int sde_kms_cont_splash_config(struct msm_kms *kms)
	struct list_head *connector_list = NULL;
	struct drm_connector *conn_iter = NULL;
	struct drm_connector *connector = NULL;
	struct sde_connector *sde_conn = NULL;

	if (!kms) {
		SDE_ERROR("invalid kms\n");
@@ -2383,6 +2387,10 @@ static int sde_kms_cont_splash_config(struct msm_kms *kms)

	sde_crtc_update_cont_splash_mixer_settings(crtc);

	sde_conn = to_sde_connector(connector);
	if (sde_conn && sde_conn->ops.cont_splash_config)
		sde_conn->ops.cont_splash_config(sde_conn->display);

	return rc;
}