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

Commit 73c6a7c4 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: mdss: update panel PHY timings during resolution switch"

parents ef2f790c 36c8b2b8
Loading
Loading
Loading
Loading
+36 −1
Original line number Diff line number Diff line
@@ -2016,6 +2016,37 @@ error_byte:
	return rc;
}

static int mdss_dsi_check_params(struct mdss_dsi_ctrl_pdata *ctrl, void *arg)
{
	struct mdss_panel_info *var_pinfo, *pinfo;
	int rc = 0;

	if (!ctrl || !arg)
		return 0;

	pinfo = &ctrl->panel_data.panel_info;
	if (!pinfo->is_pluggable)
		return 0;

	var_pinfo = (struct mdss_panel_info *)arg;

	pr_debug("%s: reconfig xres: %d yres: %d, current xres: %d yres: %d\n",
			__func__, var_pinfo->xres, var_pinfo->yres,
					pinfo->xres, pinfo->yres);
	if ((var_pinfo->xres != pinfo->xres) ||
		(var_pinfo->yres != pinfo->yres) ||
		(var_pinfo->lcdc.h_back_porch != pinfo->lcdc.h_back_porch) ||
		(var_pinfo->lcdc.h_front_porch != pinfo->lcdc.h_front_porch) ||
		(var_pinfo->lcdc.h_pulse_width != pinfo->lcdc.h_pulse_width) ||
		(var_pinfo->lcdc.v_back_porch != pinfo->lcdc.v_back_porch) ||
		(var_pinfo->lcdc.v_front_porch != pinfo->lcdc.v_front_porch) ||
		(var_pinfo->lcdc.v_pulse_width != pinfo->lcdc.v_pulse_width)
		)
		rc = 1;

	return rc;
}

static int mdss_dsi_dfps_config(struct mdss_panel_data *pdata, int new_fps)
{
	int rc = 0;
@@ -2345,13 +2376,17 @@ static int mdss_dsi_event_handler(struct mdss_panel_data *pdata,
	switch (event) {
	case MDSS_EVENT_CHECK_PARAMS:
		pr_debug("%s:Entered Case MDSS_EVENT_CHECK_PARAMS\n", __func__);
		if (mdss_dsi_check_params(ctrl_pdata, arg)) {
			ctrl_pdata->refresh_clk_rate = true;
			rc = 1;
		}
		break;
	case MDSS_EVENT_LINK_READY:
		if (ctrl_pdata->refresh_clk_rate)
			rc = mdss_dsi_clk_refresh(pdata);

		mdss_dsi_get_hw_revision(ctrl_pdata);
		mdss_dsi_get_phy_revision(ctrl_pdata);
		rc = mdss_dsi_on(pdata);
		mdss_dsi_op_mode_config(pdata->panel_info.mipi.mode,
							pdata);
+29 −0
Original line number Diff line number Diff line
@@ -902,6 +902,35 @@ static inline bool mdss_panel_is_power_on_ulp(int panel_power_state)
	return panel_power_state == MDSS_PANEL_POWER_LP2;
}

/**
 * mdss_panel_calc_frame_rate() - calculate panel frame rate based on panel timing
 *				information.
 * @panel_info:	Pointer to panel info containing all panel information
 */
static inline u8 mdss_panel_calc_frame_rate(struct mdss_panel_info *pinfo)
{
		u32 pixel_total = 0;
		u8 frame_rate = 0;
		unsigned long pclk_rate = pinfo->clk_rate;

		pixel_total = (pinfo->lcdc.h_back_porch +
			  pinfo->lcdc.h_front_porch +
			  pinfo->lcdc.h_pulse_width +
			  pinfo->xres) *
			 (pinfo->lcdc.v_back_porch +
			  pinfo->lcdc.v_front_porch +
			  pinfo->lcdc.v_pulse_width +
			  pinfo->yres);

		if (pclk_rate && pixel_total)
			frame_rate =
				DIV_ROUND_CLOSEST(pclk_rate, pixel_total);
		else
			frame_rate = DEFAULT_FRAME_RATE;

		return frame_rate;
}

/**
 * mdss_panel_intf_type: - checks if a given intf type is primary
 * @intf_val: panel interface type of the individual controller
+26 −0
Original line number Diff line number Diff line
@@ -1071,10 +1071,27 @@ void mdss_dsi_core_clk_deinit(struct device *dev, struct dsi_shared_data *sdata)
int mdss_dsi_clk_refresh(struct mdss_panel_data *pdata)
{
	struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
	struct mdss_panel_info *pinfo = NULL;
	int rc = 0;

	if (!pdata) {
		pr_err("%s: invalid panel data\n", __func__);
		return -EINVAL;
	}

	ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
							panel_data);
	pinfo = &pdata->panel_info;

	if (!ctrl_pdata || !pinfo) {
		pr_err("%s: invalid ctrl data\n", __func__);
		return -EINVAL;
	}

	/* Re-calculate frame rate before clk config */
	pinfo->mipi.frame_rate = mdss_panel_calc_frame_rate(pinfo);
	pr_debug("%s: new frame rate %d\n", __func__, pinfo->mipi.frame_rate);

	rc = mdss_dsi_clk_div_config(&pdata->panel_info,
			pdata->panel_info.mipi.frame_rate);
	if (rc) {
@@ -1105,6 +1122,15 @@ int mdss_dsi_clk_refresh(struct mdss_panel_data *pdata)
				__func__);
		return rc;
	}

	/* phy panel timing calaculation */
	rc = mdss_dsi_phy_calc_timing_param(pinfo,
		ctrl_pdata->shared_data->phy_rev, pinfo->mipi.frame_rate);
	if (rc) {
		pr_err("%s: unable to calculate phy timings\n", __func__);
		return rc;
	}

	return rc;
}