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

Commit 114033ba authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/dsi-staging: synchronize DSI error recovery and power off"

parents df8ad555 a878a444
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -420,9 +420,9 @@ bool dsi_ctrl_validate_host_state(struct dsi_ctrl *dsi_ctrl)
	}

	if (!state->host_initialized)
		return true;

		return false;

	return true;
}

static void dsi_ctrl_update_state(struct dsi_ctrl *dsi_ctrl,
+3 −0
Original line number Diff line number Diff line
@@ -37,6 +37,9 @@
	})

#define DSI_DEBUG_NAME_LEN		32
#define display_for_each_ctrl(index, display) \
	for (index = 0; (index < (display)->ctrl_count) &&\
			(index < MAX_DSI_CTRLS_PER_DISPLAY); index++)
/**
 * enum dsi_pixel_format - DSI pixel formats
 * @DSI_PIXEL_FORMAT_RGB565:
+139 −89
Original line number Diff line number Diff line
@@ -65,8 +65,7 @@ static void dsi_display_mask_ctrl_error_interrupts(struct dsi_display *display,
	if (!display)
		return;

	for (i = 0; (i < display->ctrl_count) &&
			(i < MAX_DSI_CTRLS_PER_DISPLAY); i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl)
			continue;
@@ -100,7 +99,7 @@ static int dsi_display_config_clk_gating(struct dsi_display *display,
		return rc;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == mctrl))
			continue;
@@ -129,8 +128,7 @@ static void dsi_display_set_ctrl_esd_check_flag(struct dsi_display *display,
	if (!display)
		return;

	for (i = 0; (i < display->ctrl_count) &&
			(i < MAX_DSI_CTRLS_PER_DISPLAY); i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl)
			continue;
@@ -146,8 +144,7 @@ static void dsi_display_ctrl_irq_update(struct dsi_display *display, bool en)
	if (!display)
		return;

	for (i = 0; (i < display->ctrl_count) &&
			(i < MAX_DSI_CTRLS_PER_DISPLAY); i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl)
			continue;
@@ -257,7 +254,7 @@ static int dsi_display_cmd_engine_enable(struct dsi_display *display)
		goto done;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -297,7 +294,7 @@ static int dsi_display_cmd_engine_disable(struct dsi_display *display)
		goto done;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -366,7 +363,7 @@ static void dsi_display_aspace_cb_locked(void *cb_data, bool is_detach)
		}
	}

	for (cnt = 0; cnt < display->ctrl_count; cnt++) {
	display_for_each_ctrl(cnt, display) {
		display_ctrl = &display->ctrl[cnt];
		display_ctrl->ctrl->cmd_buffer_size = display->cmd_buffer_size;
		display_ctrl->ctrl->cmd_buffer_iova = display->cmd_buffer_iova;
@@ -523,7 +520,7 @@ static int dsi_host_alloc_cmd_tx_buffer(struct dsi_display *display)
		goto put_iova;
	}

	for (cnt = 0; cnt < display->ctrl_count; cnt++) {
	display_for_each_ctrl(cnt, display) {
		display_ctrl = &display->ctrl[cnt];
		display_ctrl->ctrl->cmd_buffer_size = SZ_4K;
		display_ctrl->ctrl->cmd_buffer_iova =
@@ -636,7 +633,7 @@ static int dsi_display_read_status(struct dsi_display_ctrl *ctrl,
	 * report a false ESD failure and hence we defer until next read
	 * happen.
	 */
	if (dsi_ctrl_validate_host_state(ctrl->ctrl))
	if (!dsi_ctrl_validate_host_state(ctrl->ctrl))
		return 1;

	config = &(panel->esd_config);
@@ -727,7 +724,7 @@ static int dsi_display_status_reg_read(struct dsi_display *display)
	if (!display->panel->sync_broadcast_en)
		goto exit;

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (ctrl == m_ctrl)
			continue;
@@ -885,7 +882,7 @@ static int dsi_display_ctrl_get_host_init_state(struct dsi_display *dsi_display,
	struct dsi_display_ctrl *ctrl;
	int i, rc = -EINVAL;

	for (i = 0 ; i < dsi_display->ctrl_count; i++) {
	display_for_each_ctrl(i, dsi_display) {
		ctrl = &dsi_display->ctrl[i];
		rc = dsi_ctrl_get_host_engine_init_state(ctrl->ctrl, state);
		if (rc)
@@ -954,7 +951,7 @@ static void _dsi_display_continuous_clk_ctrl(struct dsi_display *display,
	if (!display || !display->panel->host_config.force_hs_clk_lane)
		return;

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		dsi_ctrl_set_continuous_clk(ctrl->ctrl, enable);
	}
@@ -972,7 +969,7 @@ int dsi_display_soft_reset(void *display)

	dsi_display = display;

	for (i = 0 ; i < dsi_display->ctrl_count; i++) {
	display_for_each_ctrl(i, dsi_display) {
		ctrl = &dsi_display->ctrl[i];
		rc = dsi_ctrl_soft_reset(ctrl->ctrl);
		if (rc) {
@@ -1007,7 +1004,7 @@ static void _dsi_display_setup_misr(struct dsi_display *display)
{
	int i;

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		dsi_ctrl_setup_misr(display->ctrl[i].ctrl,
				display->misr_enable,
				display->misr_frame_count);
@@ -1027,8 +1024,7 @@ static bool dsi_display_get_cont_splash_status(struct dsi_display *display)
	struct dsi_display_ctrl *ctrl;
	struct dsi_ctrl_hw *hw;

	for (i = 0; (i < display->ctrl_count) &&
	     (i < MAX_DSI_CTRLS_PER_DISPLAY); i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &(display->ctrl[i]);
		if (!ctrl || !ctrl->ctrl)
			continue;
@@ -1092,7 +1088,7 @@ static ssize_t debugfs_dump_info_read(struct file *file,
			display->config.video_timing.h_active,
			display->config.video_timing.v_active);

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		len += snprintf(buf + len, (SZ_4K - len),
				"\tCTRL_%d:\n\t\tctrl = %s\n\t\tphy = %s\n",
				i, display->ctrl[i].ctrl->name,
@@ -1215,7 +1211,7 @@ static ssize_t debugfs_misr_read(struct file *file,
		goto error;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		dsi_ctrl = display->ctrl[i].ctrl;
		misr = dsi_ctrl_collect_misr(display->ctrl[i].ctrl);

@@ -1540,7 +1536,7 @@ static int dsi_display_debugfs_init(struct dsi_display *display)
		goto error_remove_dir;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		struct msm_dsi_phy *phy = display->ctrl[i].phy;

		if (!phy || !phy->name)
@@ -1707,7 +1703,7 @@ static int dsi_display_set_ulps(struct dsi_display *display, bool enable)
		return rc;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -1770,7 +1766,7 @@ static int dsi_display_set_clamp(struct dsi_display *display, bool enable)
		return rc;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -1821,7 +1817,7 @@ static int dsi_display_ctrl_setup(struct dsi_display *display)
		return rc;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -1869,7 +1865,7 @@ static int dsi_display_phy_idle_on(struct dsi_display *display,
		return rc;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -1901,7 +1897,7 @@ static int dsi_display_phy_idle_off(struct dsi_display *display)
		return -EINVAL;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		struct msm_dsi_phy *phy = display->ctrl[i].phy;

		if (!phy)
@@ -1922,7 +1918,7 @@ static int dsi_display_phy_idle_off(struct dsi_display *display)
		return rc;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -1963,7 +1959,7 @@ void dsi_display_enable_event(struct drm_connector *connector,
	case SDE_CONN_EVENT_VID_FIFO_OVERFLOW:
	case SDE_CONN_EVENT_CMD_FIFO_UNDERFLOW:
		if (event_info) {
			for (i = 0; i < display->ctrl_count; i++)
			display_for_each_ctrl(i, display)
				display->ctrl[i].ctrl->recovery_cb =
							*event_info;
		}
@@ -1974,12 +1970,12 @@ void dsi_display_enable_event(struct drm_connector *connector,
	}

	if (enable) {
		for (i = 0; i < display->ctrl_count; i++)
		display_for_each_ctrl(i, display)
			dsi_ctrl_enable_status_interrupt(
					display->ctrl[i].ctrl, irq_status_idx,
					event_info);
	} else {
		for (i = 0; i < display->ctrl_count; i++)
		display_for_each_ctrl(i, display)
			dsi_ctrl_disable_status_interrupt(
					display->ctrl[i].ctrl, irq_status_idx);
	}
@@ -1999,8 +1995,7 @@ static void dsi_config_host_engine_state_for_cont_splash
	enum dsi_engine_state host_state = DSI_CTRL_ENGINE_ON;

	/* Sequence does not matter for split dsi usecases */
	for (i = 0; (i < display->ctrl_count) &&
			(i < MAX_DSI_CTRLS_PER_DISPLAY); i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl)
			continue;
@@ -2017,7 +2012,7 @@ static int dsi_display_ctrl_power_on(struct dsi_display *display)
	struct dsi_display_ctrl *ctrl;

	/* Sequence does not matter for split dsi usecases */
	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl)
			continue;
@@ -2050,7 +2045,7 @@ static int dsi_display_ctrl_power_off(struct dsi_display *display)
	struct dsi_display_ctrl *ctrl;

	/* Sequence does not matter for split dsi usecases */
	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl)
			continue;
@@ -2158,7 +2153,7 @@ static int dsi_display_phy_power_on(struct dsi_display *display)
	struct dsi_display_ctrl *ctrl;

	/* Sequence does not matter for split dsi usecases */
	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl)
			continue;
@@ -2189,7 +2184,7 @@ static int dsi_display_phy_power_off(struct dsi_display *display)
	struct dsi_display_ctrl *ctrl;

	/* Sequence does not matter for split dsi usecases */
	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->phy)
			continue;
@@ -2227,7 +2222,7 @@ static int dsi_display_set_clk_src(struct dsi_display *display)
	}

	/* Turn on rest of the controllers */
	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -2250,7 +2245,7 @@ static int dsi_display_phy_reset_config(struct dsi_display *display,
	int i;
	struct dsi_display_ctrl *ctrl;

	for (i = 0 ; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		rc = dsi_ctrl_phy_reset_config(ctrl->ctrl, enable);
		if (rc) {
@@ -2270,7 +2265,7 @@ static void dsi_display_toggle_resync_fifo(struct dsi_display *display)
	if (!display)
		return;

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		dsi_phy_toggle_resync_fifo(ctrl->phy);
	}
@@ -2279,7 +2274,7 @@ static void dsi_display_toggle_resync_fifo(struct dsi_display *display)
	 * After retime buffer synchronization we need to turn of clk_en_sel
	 * bit on each phy.
	 */
	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		dsi_phy_reset_clk_en_sel(ctrl->phy);
	}
@@ -2292,7 +2287,7 @@ static int dsi_display_ctrl_update(struct dsi_display *display)
	int i;
	struct dsi_display_ctrl *ctrl;

	for (i = 0 ; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		rc = dsi_ctrl_host_timing_update(ctrl->ctrl);
		if (rc) {
@@ -2326,7 +2321,7 @@ static int dsi_display_ctrl_init(struct dsi_display *display)
	 * the HW in bad state.
	 */
	if (!display->panel->ulps_suspend_enabled || !display->ulps_enabled) {
		for (i = 0 ; i < display->ctrl_count; i++) {
		display_for_each_ctrl(i, display) {
			ctrl = &display->ctrl[i];
			rc = dsi_ctrl_host_init(ctrl->ctrl,
					display->is_cont_splash_enabled);
@@ -2337,7 +2332,7 @@ static int dsi_display_ctrl_init(struct dsi_display *display)
			}
		}
	} else {
		for (i = 0 ; i < display->ctrl_count; i++) {
		display_for_each_ctrl(i, display) {
			ctrl = &display->ctrl[i];
			rc = dsi_ctrl_update_host_init_state(ctrl->ctrl, true);
			if (rc)
@@ -2360,7 +2355,7 @@ static int dsi_display_ctrl_deinit(struct dsi_display *display)
	int i;
	struct dsi_display_ctrl *ctrl;

	for (i = 0 ; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		rc = dsi_ctrl_host_deinit(ctrl->ctrl);
		if (rc) {
@@ -2395,7 +2390,7 @@ static int dsi_display_ctrl_host_enable(struct dsi_display *display)
		goto error;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -2423,7 +2418,7 @@ static int dsi_display_ctrl_host_disable(struct dsi_display *display)
	struct dsi_display_ctrl *m_ctrl, *ctrl;

	m_ctrl = &display->ctrl[display->cmd_master_idx];
	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -2461,7 +2456,7 @@ static int dsi_display_vid_engine_enable(struct dsi_display *display)
		goto error;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -2490,7 +2485,7 @@ static int dsi_display_vid_engine_disable(struct dsi_display *display)

	m_ctrl = &display->ctrl[display->video_master_idx];

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -2532,7 +2527,7 @@ static int dsi_display_phy_enable(struct dsi_display *display)
		goto error;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -2565,7 +2560,7 @@ static int dsi_display_phy_disable(struct dsi_display *display)

	m_ctrl = &display->ctrl[display->clk_master_idx];

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -2618,7 +2613,7 @@ static int dsi_display_broadcast_cmd(struct dsi_display *display,
		goto error;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (ctrl == m_ctrl)
			continue;
@@ -2671,7 +2666,7 @@ static int dsi_display_phy_sw_reset(struct dsi_display *display)
		goto error;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -3003,8 +2998,7 @@ static void dsi_display_ctrl_isr_configure(struct dsi_display *display, bool en)
	if (!display)
		return;

	for (i = 0; (i < display->ctrl_count) &&
			(i < MAX_DSI_CTRLS_PER_DISPLAY); i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl)
			continue;
@@ -3089,7 +3083,7 @@ int dsi_pre_clkoff_cb(void *priv,
		dsi_display_ctrl_irq_update(display, false);

		/* cache the MISR values */
		for (i = 0; i < display->ctrl_count; i++) {
		display_for_each_ctrl(i, display) {
			ctrl = &display->ctrl[i];
			if (!ctrl->ctrl)
				continue;
@@ -3453,7 +3447,7 @@ static int dsi_display_parse_dt(struct dsi_display *display)
		goto error;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		struct dsi_display_ctrl *ctrl = &display->ctrl[i];
		int index;

@@ -3494,7 +3488,7 @@ static int dsi_display_res_init(struct dsi_display *display)
	int i;
	struct dsi_display_ctrl *ctrl;

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		ctrl->ctrl = dsi_ctrl_get(ctrl->ctrl_of_node);
		if (IS_ERR_OR_NULL(ctrl->ctrl)) {
@@ -3558,7 +3552,7 @@ static int dsi_display_res_deinit(struct dsi_display *display)
	if (rc)
		pr_err("clocks deinit failed, rc=%d\n", rc);

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		dsi_phy_put(ctrl->phy);
		dsi_ctrl_put(ctrl->ctrl);
@@ -3585,7 +3579,7 @@ static int dsi_display_validate_mode_set(struct dsi_display *display,
	 * 3. Phy should be disabled.
	 */

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if ((ctrl->power_state > DSI_CTRL_POWER_VREG_ON) ||
		    (ctrl->phy_enabled)) {
@@ -3737,7 +3731,7 @@ static int dsi_display_dfps_update(struct dsi_display *display,
	}

	/* Update the rest of the controllers */
	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl || (ctrl == m_ctrl))
			continue;
@@ -3963,7 +3957,7 @@ static int dsi_display_set_mode_sub(struct dsi_display *display,
		}
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		rc = dsi_ctrl_update_host_config(ctrl->ctrl, &display->config,
				mode->dsi_mode_flags, display->dsi_clk_handle);
@@ -3975,7 +3969,7 @@ static int dsi_display_set_mode_sub(struct dsi_display *display,
	}

	if (priv_info->phy_timing_len) {
		for (i = 0; i < display->ctrl_count; i++) {
		display_for_each_ctrl(i, display) {
			ctrl = &display->ctrl[i];
			 rc = dsi_phy_set_timing_params(ctrl->phy,
				priv_info->phy_timing_val,
@@ -4224,7 +4218,7 @@ static int dsi_display_request_update_dsi_bitrate(struct dsi_display *display,

	display->config.bit_clk_rate_hz_override = bit_clk_rate;

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		struct dsi_display_ctrl *dsi_disp_ctrl = &display->ctrl[i];
		struct dsi_ctrl *ctrl = dsi_disp_ctrl->ctrl;
		u32 num_of_lanes = 0;
@@ -4470,7 +4464,7 @@ static int dsi_display_bind(struct device *dev,

	memset(&info, 0x0, sizeof(info));

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		display_ctrl = &display->ctrl[i];
		rc = dsi_ctrl_drv_init(display_ctrl->ctrl, display->root);
		if (rc) {
@@ -4555,7 +4549,7 @@ static int dsi_display_bind(struct device *dev,
	clk_cb.priv = display;
	clk_cb.dsi_clk_cb = dsi_display_clk_ctrl_cb;

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		display_ctrl = &display->ctrl[i];

		rc = dsi_ctrl_clk_cb_register(display_ctrl->ctrl, &clk_cb);
@@ -4591,7 +4585,7 @@ static int dsi_display_bind(struct device *dev,
	pr_info("Successfully bind display panel '%s'\n", display->name);
	display->drm_dev = drm;

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		display_ctrl = &display->ctrl[i];

		if (!display_ctrl->phy || !display_ctrl->ctrl)
@@ -4668,7 +4662,7 @@ static void dsi_display_unbind(struct device *dev,
		       display->name,
		       rc);

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		display_ctrl = &display->ctrl[i];

		rc = dsi_phy_drv_deinit(display_ctrl->phy);
@@ -5716,7 +5710,7 @@ int dsi_display_validate_mode(struct dsi_display *display,
		goto error;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		rc = dsi_ctrl_validate_timing(ctrl->ctrl, &adj_mode.timing);
		if (rc) {
@@ -5807,7 +5801,7 @@ int dsi_display_set_tpg_state(struct dsi_display *display, bool enable)
		return -EINVAL;
	}

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		rc = dsi_ctrl_set_tpg_state(ctrl->ctrl, enable);
		if (rc) {
@@ -5867,13 +5861,40 @@ static int dsi_display_pre_switch(struct dsi_display *display)
	return rc;
}

static bool _dsi_display_validate_host_state(struct dsi_display *display)
{
	int i;
	struct dsi_display_ctrl *ctrl;

	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		if (!ctrl->ctrl)
			continue;
		if (!dsi_ctrl_validate_host_state(ctrl->ctrl))
			return false;
	}

	return true;
}

static void dsi_display_handle_fifo_underflow(struct work_struct *work)
{
	struct dsi_display *display = NULL;

	display = container_of(work, struct dsi_display, fifo_underflow_work);
	if (!display)
	if (!display || !display->panel ||
	    atomic_read(&display->panel->esd_recovery_pending)) {
		pr_debug("Invalid recovery use case\n");
		return;
	}

	mutex_lock(&display->display_lock);

	if (!_dsi_display_validate_host_state(display)) {
		mutex_unlock(&display->display_lock);
		return;
	}

	pr_debug("handle DSI FIFO underflow error\n");

	dsi_display_clk_ctrl(display->dsi_clk_handle,
@@ -5881,6 +5902,8 @@ static void dsi_display_handle_fifo_underflow(struct work_struct *work)
	dsi_display_soft_reset(display);
	dsi_display_clk_ctrl(display->dsi_clk_handle,
			DSI_ALL_CLKS, DSI_CLK_OFF);

	mutex_unlock(&display->display_lock);
}

static void dsi_display_handle_fifo_overflow(struct work_struct *work)
@@ -5898,8 +5921,18 @@ static void dsi_display_handle_fifo_overflow(struct work_struct *work)

	display = container_of(work, struct dsi_display, fifo_overflow_work);
	if (!display || !display->panel ||
			(display->panel->panel_mode != DSI_OP_VIDEO_MODE))
	    (display->panel->panel_mode != DSI_OP_VIDEO_MODE) ||
	    atomic_read(&display->panel->esd_recovery_pending)) {
		pr_debug("Invalid recovery use case\n");
		return;
	}

	mutex_lock(&display->display_lock);

	if (!_dsi_display_validate_host_state(display)) {
		mutex_unlock(&display->display_lock);
		return;
	}

	pr_debug("handle DSI FIFO overflow error\n");
	dsi_display_clk_ctrl(display->dsi_clk_handle,
@@ -5915,7 +5948,7 @@ static void dsi_display_handle_fifo_overflow(struct work_struct *work)
		goto end;

	/* reset ctrl and lanes */
	for (i = 0 ; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		rc = dsi_ctrl_reset(ctrl->ctrl, mask);
		rc = dsi_phy_lane_reset(ctrl->phy);
@@ -5935,7 +5968,7 @@ static void dsi_display_handle_fifo_overflow(struct work_struct *work)
	}

	/* Enable Video mode for DSI controller */
	for (i = 0 ; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		dsi_ctrl_vid_engine_en(ctrl->ctrl, true);
	}
@@ -5947,6 +5980,7 @@ static void dsi_display_handle_fifo_overflow(struct work_struct *work)
end:
	dsi_display_clk_ctrl(display->dsi_clk_handle,
			DSI_ALL_CLKS, DSI_CLK_OFF);
	mutex_unlock(&display->display_lock);
}

static void dsi_display_handle_lp_rx_timeout(struct work_struct *work)
@@ -5964,8 +5998,19 @@ static void dsi_display_handle_lp_rx_timeout(struct work_struct *work)

	display = container_of(work, struct dsi_display, lp_rx_timeout_work);
	if (!display || !display->panel ||
			(display->panel->panel_mode != DSI_OP_VIDEO_MODE))
	    (display->panel->panel_mode != DSI_OP_VIDEO_MODE) ||
	    atomic_read(&display->panel->esd_recovery_pending)) {
		pr_debug("Invalid recovery use case\n");
		return;
	}

	mutex_lock(&display->display_lock);

	if (!_dsi_display_validate_host_state(display)) {
		mutex_unlock(&display->display_lock);
		return;
	}

	pr_debug("handle DSI LP RX Timeout error\n");

	dsi_display_clk_ctrl(display->dsi_clk_handle,
@@ -5981,7 +6026,7 @@ static void dsi_display_handle_lp_rx_timeout(struct work_struct *work)
		goto end;

	/* reset ctrl and lanes */
	for (i = 0 ; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		rc = dsi_ctrl_reset(ctrl->ctrl, mask);
		rc = dsi_phy_lane_reset(ctrl->phy);
@@ -6000,7 +6045,7 @@ static void dsi_display_handle_lp_rx_timeout(struct work_struct *work)
	}

	/* Enable Video mode for DSI controller */
	for (i = 0 ; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		dsi_ctrl_vid_engine_en(ctrl->ctrl, true);
	}
@@ -6010,9 +6055,11 @@ static void dsi_display_handle_lp_rx_timeout(struct work_struct *work)
	 * pixel transmission as started
	 */
	udelay(200);

end:
	dsi_display_clk_ctrl(display->dsi_clk_handle,
			DSI_ALL_CLKS, DSI_CLK_OFF);
	mutex_unlock(&display->display_lock);
}

static int dsi_display_cb_error_handler(void *data,
@@ -6070,7 +6117,7 @@ static void dsi_display_register_error_handler(struct dsi_display *display)
	event_info.event_cb = dsi_display_cb_error_handler;
	event_info.event_usr_ptr = display;

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		ctrl->ctrl->irq_info.irq_err_cb = event_info;
	}
@@ -6084,14 +6131,16 @@ static void dsi_display_unregister_error_handler(struct dsi_display *display)
	if (!display)
		return;

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		ctrl = &display->ctrl[i];
		memset(&ctrl->ctrl->irq_info.irq_err_cb,
		       0, sizeof(struct dsi_event_cb_info));
	}

	if (display->err_workq)
	if (display->err_workq) {
		destroy_workqueue(display->err_workq);
		display->err_workq = NULL;
	}
}

int dsi_display_prepare(struct dsi_display *display)
@@ -6361,7 +6410,7 @@ static int dsi_display_set_roi(struct dsi_display *display,
	if (!roi_caps->enabled)
		return 0;

	for (i = 0; i < display->ctrl_count; i++) {
	display_for_each_ctrl(i, display) {
		struct dsi_display_ctrl *ctrl = &display->ctrl[i];
		struct dsi_rect ctrl_roi;
		bool changed = false;
@@ -6437,7 +6486,7 @@ int dsi_display_pre_kickoff(struct drm_connector *connector,
		 * not to impact DRM commit. The clock updating would be
		 * deferred to the next DRM commit.
		 */
		for (i = 0; i < display->ctrl_count; i++) {
		display_for_each_ctrl(i, display) {
			struct dsi_ctrl *ctrl = display->ctrl[i].ctrl;
			int ret = 0;

@@ -6767,15 +6816,16 @@ int dsi_display_unprepare(struct dsi_display *display)
	/* destrory dsi isr set up */
	dsi_display_ctrl_isr_configure(display, false);

	/* Free up DSI ERROR event callback */
	dsi_display_unregister_error_handler(display);

	rc = dsi_panel_post_unprepare(display->panel);
	if (rc)
		pr_err("[%s] panel post-unprepare failed, rc=%d\n",
		       display->name, rc);

	mutex_unlock(&display->display_lock);

	/* Free up DSI ERROR event callback */
	dsi_display_unregister_error_handler(display);

	SDE_EVT32(SDE_EVTLOG_FUNC_EXIT);
	return rc;
}
+1 −1
Original line number Diff line number Diff line
@@ -751,7 +751,7 @@ int dsi_conn_post_kickoff(struct drm_connector *connector)
		}

		/* Update the rest of the controllers */
		for (i = 0; i < display->ctrl_count; i++) {
		display_for_each_ctrl(i, display) {
			ctrl = &display->ctrl[i];
			if (!ctrl->ctrl || (ctrl == m_ctrl))
				continue;