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

Commit 36c8b2b8 authored by Sandeep Panda's avatar Sandeep Panda
Browse files

msm: mdss: update panel PHY timings during resolution switch



During dynamic resolution switch update the DSI PHY timings
for panel based on the new porch values. Also calculate the
new frame rate as per new porch values.

Change-Id: I683bf1255c77a2575567847cef5edcfb5529b69d
Signed-off-by: default avatarSandeep Panda <spanda@codeaurora.org>
parent 5a7adcb6
Loading
Loading
Loading
Loading
+16 −7
Original line number Diff line number Diff line
@@ -1978,7 +1978,7 @@ error_byte:

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

	if (!ctrl || !arg)
@@ -1988,13 +1988,20 @@ static int mdss_dsi_check_params(struct mdss_dsi_ctrl_pdata *ctrl, void *arg)
	if (!pinfo->is_pluggable)
		return 0;

	reconf_pinfo = (struct mdss_panel_info *)arg;
	var_pinfo = (struct mdss_panel_info *)arg;

	pr_debug("%s: reconfig xres: %d yres: %d, current xres: %d yres: %d\n",
			__func__, reconf_pinfo->xres, reconf_pinfo->yres,
			__func__, var_pinfo->xres, var_pinfo->yres,
					pinfo->xres, pinfo->yres);
	if ((reconf_pinfo->xres != pinfo->xres) ||
			(reconf_pinfo->yres != 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;
@@ -2260,15 +2267,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))
			rc = 1;
		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
@@ -894,6 +894,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
+27 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@

#include "mdss_dsi.h"
#include "mdss_edp.h"
#include "mdss_dsi_phy.h"

#define MDSS_DSI_DSIPHY_REGULATOR_CTRL_0	0x00
#define MDSS_DSI_DSIPHY_REGULATOR_CTRL_1	0x04
@@ -1076,10 +1077,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) {
@@ -1110,6 +1128,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;
}