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

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

msm: mdss: enable burst mode for DSI command mode panels



Enable burst mode for DSI command mode panels, so that
dsi pixel data and dcs commands can be sent independent
of each other. In case of burst mode we don't need to
wait for DSI command transfer to complete before command
kickoff.

Conflicts:
	drivers/video/msm/mdss/mdss_dsi.c
	drivers/video/msm/mdss/mdss_dsi_host.c

Change-Id: I5777a72b8ad84a7929aa6e06849060efdebb0d7b
Signed-off-by: default avatarSandeep Panda <spanda@codeaurora.org>
parent 6a555534
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -2424,7 +2424,7 @@ static int mdss_dsi_cont_splash_config(struct mdss_panel_info *pinfo,
				       struct mdss_dsi_ctrl_pdata *ctrl_pdata)
{
	void *clk_handle;
	int rc = 0;
	int rc = 0, data;

	if (pinfo->cont_splash_enabled) {
		rc = mdss_dsi_panel_power_ctrl(&(ctrl_pdata->panel_data),
@@ -2444,6 +2444,13 @@ static int mdss_dsi_cont_splash_config(struct mdss_panel_info *pinfo,
		mdss_dsi_clk_ctrl(ctrl_pdata, clk_handle,
				  MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON);
		ctrl_pdata->is_phyreg_enabled = 1;
		mdss_dsi_get_hw_revision(ctrl_pdata);
		if ((ctrl_pdata->shared_data->hw_rev >= MDSS_DSI_HW_REV_103)
			&& (pinfo->type == MIPI_CMD_PANEL)) {
			data = MIPI_INP(ctrl_pdata->ctrl_base + 0x1b8);
			if (data & BIT(16))
				ctrl_pdata->burst_mode_enabled = true;
		}
		ctrl_pdata->ctrl_state |=
			(CTRL_STATE_PANEL_INIT | CTRL_STATE_MDP_ACTIVE);
	} else {
+2 −1
Original line number Diff line number Diff line
@@ -455,6 +455,7 @@ struct mdss_dsi_ctrl_pdata {
	int mdp_busy;
	struct mutex mutex;
	struct mutex cmd_mutex;
	struct mutex cmdlist_mutex;
	struct regulator *lab; /* vreg handle */
	struct regulator *ibb; /* vreg handle */
	struct mutex clk_lane_mutex;
@@ -465,7 +466,7 @@ struct mdss_dsi_ctrl_pdata {
	bool mmss_clamp;
	char dlane_swap;	/* data lane swap */
	bool is_phyreg_enabled;

	bool burst_mode_enabled;

	struct dsi_buf tx_buf;
	struct dsi_buf rx_buf;
+5 −0
Original line number Diff line number Diff line
@@ -729,6 +729,7 @@ struct dcs_cmd_req *mdss_dsi_cmdlist_get(struct mdss_dsi_ctrl_pdata *ctrl)
	struct dcs_cmd_list *clist;
	struct dcs_cmd_req *req = NULL;

	mutex_lock(&ctrl->cmdlist_mutex);
	clist = &ctrl->cmdlist;
	if (clist->get != clist->put) {
		req = &clist->list[clist->get];
@@ -738,6 +739,7 @@ struct dcs_cmd_req *mdss_dsi_cmdlist_get(struct mdss_dsi_ctrl_pdata *ctrl)
		pr_debug("%s: tot=%d put=%d get=%d\n", __func__,
		clist->tot, clist->put, clist->get);
	}
	mutex_unlock(&ctrl->cmdlist_mutex);
	return req;
}

@@ -749,6 +751,7 @@ int mdss_dsi_cmdlist_put(struct mdss_dsi_ctrl_pdata *ctrl,
	int ret = 0;

	mutex_lock(&ctrl->cmd_mutex);
	mutex_lock(&ctrl->cmdlist_mutex);
	clist = &ctrl->cmdlist;
	req = &clist->list[clist->put];
	*req = *cmdreq;
@@ -767,6 +770,8 @@ int mdss_dsi_cmdlist_put(struct mdss_dsi_ctrl_pdata *ctrl,
	pr_debug("%s: tot=%d put=%d get=%d\n", __func__,
		clist->tot, clist->put, clist->get);

	mutex_unlock(&ctrl->cmdlist_mutex);

	if (req->flags & CMD_REQ_COMMIT) {
		if (!ctrl->cmdlist_commit)
			pr_err("cmdlist_commit not implemented!\n");
+25 −5
Original line number Diff line number Diff line
@@ -110,6 +110,7 @@ void mdss_dsi_ctrl_init(struct device *ctrl_dev,
	mutex_init(&ctrl->mutex);
	mutex_init(&ctrl->cmd_mutex);
	mutex_init(&ctrl->clk_lane_mutex);
	mutex_init(&ctrl->cmdlist_mutex);
	mdss_dsi_buf_alloc(ctrl_dev, &ctrl->tx_buf, SZ_4K);
	mdss_dsi_buf_alloc(ctrl_dev, &ctrl->rx_buf, SZ_4K);
	mdss_dsi_buf_alloc(ctrl_dev, &ctrl->status_buf, SZ_4K);
@@ -1189,6 +1190,14 @@ static void mdss_dsi_mode_setup(struct mdss_panel_data *pdata)
			MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x2b4, data);
		}

		/* Enable frame transfer in burst mode */
		if (ctrl_pdata->shared_data->hw_rev >= MDSS_DSI_HW_REV_103) {
			data = MIPI_INP(ctrl_pdata->ctrl_base + 0x1b8);
			data = data | BIT(16);
			MIPI_OUTP((ctrl_pdata->ctrl_base + 0x1b8), data);
			ctrl_pdata->burst_mode_enabled = 1;
		}

		/* DSI_COMMAND_MODE_MDP_STREAM_CTRL */
		MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x60, stream_ctrl);
		MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x58, stream_ctrl);
@@ -2272,18 +2281,26 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp)
	int ret = -EINVAL;
	int rc = 0;
	bool hs_req = false;
	bool cmd_mutex_acquired = false;

	if (mdss_get_sd_client_cnt())
		return -EPERM;

	if (from_mdp) {	/* from mdp kickoff */
		if (!ctrl->burst_mode_enabled) {
			mutex_lock(&ctrl->cmd_mutex);
			cmd_mutex_acquired = true;
		}
		pinfo = &ctrl->panel_data.panel_info;
		if (pinfo->partial_update_enabled)
			roi = &pinfo->roi;
	}

	req = mdss_dsi_cmdlist_get(ctrl);
	if (req && from_mdp && ctrl->burst_mode_enabled) {
		mutex_lock(&ctrl->cmd_mutex);
		cmd_mutex_acquired = true;
	}

	MDSS_XLOG(ctrl->ndx, from_mdp, ctrl->mdp_busy, current->pid,
							XLOG_FUNC_ENTRY);
@@ -2291,8 +2308,11 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp)
	if (req && (req->flags & CMD_REQ_HS_MODE))
		hs_req = true;

	if (!ctrl->burst_mode_enabled ||
		(from_mdp && ctrl->shared_data->cmd_clk_ln_recovery_en)) {
		/* make sure dsi_cmd_mdp is idle */
		mdss_dsi_cmd_mdp_busy(ctrl);
	}

	mdss_dsi_get_hw_revision(ctrl);

@@ -2392,7 +2412,7 @@ need_lock:
		 */
		if (!roi || (roi->w != 0 || roi->h != 0))
			mdss_dsi_cmd_mdp_start(ctrl);

		if (cmd_mutex_acquired)
			mutex_unlock(&ctrl->cmd_mutex);
	} else {	/* from dcs send */
		if (ctrl->shared_data->cmd_clk_ln_recovery_en &&