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

Commit b8da527f authored by Dhaval Patel's avatar Dhaval Patel
Browse files

msm: mdss: Avoid memcopy in dsi driver



Update dsi panel code to use controller variable directly to
avoid memcopy in dsi driver. This simplifies the code and
avoids usage of multiple structures for same configurations.

Change-Id: I1625190213c8844ce99a9812892531ac5b7a64fb
Signed-off-by: default avatarDhaval Patel <pdhaval@codeaurora.org>
parent 1eca5fe6
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -362,12 +362,12 @@ static void msm_dsi_phy_lane_init(unsigned char *ctrl_base,
	for (ln = 0; ln < 5; ln++) {
		unsigned char *off = ctrl_base + 0x0300 + (ln * 0x40);
		index = ln * 6;
		MIPI_OUTP(off, pd->laneCfg[index]);
		MIPI_OUTP(off + 4, pd->laneCfg[index + 1]);
		MIPI_OUTP(off + 8, pd->laneCfg[index + 2]);
		MIPI_OUTP(off + 12, pd->laneCfg[index + 3]);
		MIPI_OUTP(off + 20, pd->laneCfg[index + 4]);
		MIPI_OUTP(off + 24, pd->laneCfg[index + 5]);
		MIPI_OUTP(off, pd->lanecfg[index]);
		MIPI_OUTP(off + 4, pd->lanecfg[index + 1]);
		MIPI_OUTP(off + 8, pd->lanecfg[index + 2]);
		MIPI_OUTP(off + 12, pd->lanecfg[index + 3]);
		MIPI_OUTP(off + 20, pd->lanecfg[index + 4]);
		MIPI_OUTP(off + 24, pd->lanecfg[index + 5]);
	}
	wmb();
}
@@ -386,9 +386,9 @@ static void msm_dsi_phy_timing_init(unsigned char *ctrl_base,
static void msm_dsi_phy_bist_init(unsigned char *ctrl_base,
			struct mdss_dsi_phy_ctrl *pd)
{
	MIPI_OUTP(ctrl_base + DSI_DSIPHY_BIST_CTRL4, pd->bistCtrl[4]);
	MIPI_OUTP(ctrl_base + DSI_DSIPHY_BIST_CTRL1, pd->bistCtrl[1]);
	MIPI_OUTP(ctrl_base + DSI_DSIPHY_BIST_CTRL0, pd->bistCtrl[0]);
	MIPI_OUTP(ctrl_base + DSI_DSIPHY_BIST_CTRL4, pd->bistctrl[4]);
	MIPI_OUTP(ctrl_base + DSI_DSIPHY_BIST_CTRL1, pd->bistctrl[1]);
	MIPI_OUTP(ctrl_base + DSI_DSIPHY_BIST_CTRL0, pd->bistctrl[0]);
	MIPI_OUTP(ctrl_base + DSI_DSIPHY_BIST_CTRL4, 0);
	wmb();
}
@@ -398,7 +398,7 @@ int msm_dsi_phy_init(unsigned char *ctrl_base,
{
	struct mdss_dsi_phy_ctrl *pd;

	pd = pdata->panel_info.mipi.dsi_phy_db;
	pd = &(pdata->panel_info.mipi.dsi_phy_db);

	msm_dsi_phy_strength_init(ctrl_base, pd);

+6 −7
Original line number Diff line number Diff line
@@ -417,7 +417,7 @@ static int dsi_panel_parse_phy(struct platform_device *pdev,
		return -EINVAL;
	}
	for (i = 0; i < len; i++)
		panel_private->phy_params.regulator[i] = data[i];
		panel_data->panel_info.mipi.dsi_phy_db.regulator[i] = data[i];

	data = of_get_property(np, "qcom,panel-phy-timingSettings", &len);
	if ((!data) || (len != 12)) {
@@ -426,7 +426,7 @@ static int dsi_panel_parse_phy(struct platform_device *pdev,
		return -EINVAL;
	}
	for (i = 0; i < len; i++)
		panel_private->phy_params.timing[i] = data[i];
		panel_data->panel_info.mipi.dsi_phy_db.timing[i] = data[i];

	data = of_get_property(np, "qcom,panel-phy-strengthCtrl", &len);
	if ((!data) || (len != 2)) {
@@ -434,8 +434,8 @@ static int dsi_panel_parse_phy(struct platform_device *pdev,
			__func__, __LINE__);
		return -EINVAL;
	}
	panel_private->phy_params.strength[0] = data[0];
	panel_private->phy_params.strength[1] = data[1];
	panel_data->panel_info.mipi.dsi_phy_db.strength[0] = data[0];
	panel_data->panel_info.mipi.dsi_phy_db.strength[1] = data[1];

	data = of_get_property(np, "qcom,panel-phy-bistCtrl", &len);
	if ((!data) || (len != 6)) {
@@ -444,7 +444,7 @@ static int dsi_panel_parse_phy(struct platform_device *pdev,
		return -EINVAL;
	}
	for (i = 0; i < len; i++)
		panel_private->phy_params.bistCtrl[i] = data[i];
		panel_data->panel_info.mipi.dsi_phy_db.bistctrl[i] = data[i];

	data = of_get_property(np, "qcom,panel-phy-laneConfig", &len);
	if ((!data) || (len != 30)) {
@@ -453,9 +453,8 @@ static int dsi_panel_parse_phy(struct platform_device *pdev,
		return -EINVAL;
	}
	for (i = 0; i < len; i++)
		panel_private->phy_params.laneCfg[i] = data[i];
		panel_data->panel_info.mipi.dsi_phy_db.lanecfg[i] = data[i];

	panel_data->panel_info.mipi.dsi_phy_db = &panel_private->phy_params;
	return 0;
}

+22 −47
Original line number Diff line number Diff line
@@ -820,7 +820,6 @@ static int mdss_dsi_ctrl_probe(struct platform_device *pdev)
	char panel_cfg[MDSS_MAX_PANEL_LEN];
	struct resource *mdss_dsi_mres;
	const char *ctrl_name;
	static struct mdss_panel_common_pdata vendor_pdata;
	bool cmd_cfg_cont_splash = true;

	if (!mdss_is_ready()) {
@@ -920,13 +919,13 @@ static int mdss_dsi_ctrl_probe(struct platform_device *pdev)

	cmd_cfg_cont_splash = mdss_panel_get_boot_cfg() ? true : false;

	rc = mdss_dsi_panel_init(dsi_pan_node, &vendor_pdata);
	rc = mdss_dsi_panel_init(dsi_pan_node, ctrl_pdata);
	if (rc) {
		pr_err("%s: dsi panel init failed\n", __func__);
		goto error_pan_node;
	}

	rc = dsi_panel_device_register(dsi_pan_node, &vendor_pdata,
	rc = dsi_panel_device_register(dsi_pan_node, ctrl_pdata,
				       cmd_cfg_cont_splash);
	if (rc) {
		pr_err("%s: dsi panel dev reg failed\n", __func__);
@@ -1027,26 +1026,26 @@ int mdss_dsi_retrieve_ctrl_resources(struct platform_device *pdev, int mode,
}

int dsi_panel_device_register(struct device_node *pan_node,
			      struct mdss_panel_common_pdata *panel_data,
				struct mdss_dsi_ctrl_pdata *ctrl_pdata,
			      bool cmd_cfg_cont_splash)
{
	struct mipi_panel_info *mipi;
	int rc, i, len;
	u32 tmp[9];
	struct mdss_dsi_ctrl_pdata *ctrl_pdata;
	struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info);
	struct device_node *dsi_ctrl_np = NULL;
	struct platform_device *ctrl_pdev = NULL;
	bool dynamic_fps;
	bool cont_splash_enabled = false;
	const char *data;

	mipi  = &panel_data->panel_info.mipi;
	mipi  = &(pinfo->mipi);

	panel_data->panel_info.type =
	pinfo->type =
		((mipi->mode == DSI_VIDEO_MODE)
			? MIPI_VIDEO_PANEL : MIPI_CMD_PANEL);

	rc = mdss_dsi_clk_div_config(&panel_data->panel_info, mipi->frame_rate);
	rc = mdss_dsi_clk_div_config(pinfo, mipi->frame_rate);
	if (rc) {
		pr_err("%s: unable to initialize the clk dividers\n", __func__);
		return rc;
@@ -1060,11 +1059,6 @@ int dsi_panel_device_register(struct device_node *pan_node,
	}

	ctrl_pdev = of_find_device_by_node(dsi_ctrl_np);
	ctrl_pdata = platform_get_drvdata(ctrl_pdev);
	if (!ctrl_pdata) {
		pr_err("%s: no dsi ctrl driver data\n", __func__);
		return -EINVAL;
	}

	rc = mdss_dsi_regulator_init(ctrl_pdev);
	if (rc) {
@@ -1080,8 +1074,8 @@ int dsi_panel_device_register(struct device_node *pan_node,
			__func__, __LINE__);
		return -EINVAL;
	}
	(panel_data->panel_info.mipi.dsi_phy_db)->strength[0] = data[0];
	(panel_data->panel_info.mipi.dsi_phy_db)->strength[1] = data[1];
	pinfo->mipi.dsi_phy_db.strength[0] = data[0];
	pinfo->mipi.dsi_phy_db.strength[1] = data[1];

	data = of_get_property(ctrl_pdev->dev.of_node,
		"qcom,platform-regulator-settings", &len);
@@ -1091,7 +1085,7 @@ int dsi_panel_device_register(struct device_node *pan_node,
		return -EINVAL;
	}
	for (i = 0; i < len; i++) {
		(panel_data->panel_info.mipi.dsi_phy_db)->regulator[i]
		pinfo->mipi.dsi_phy_db.regulator[i]
			= data[i];
	}

@@ -1103,7 +1097,7 @@ int dsi_panel_device_register(struct device_node *pan_node,
		return -EINVAL;
	}
	for (i = 0; i < len; i++) {
		(panel_data->panel_info.mipi.dsi_phy_db)->bistCtrl[i]
		pinfo->mipi.dsi_phy_db.bistctrl[i]
			= data[i];
	}

@@ -1115,7 +1109,7 @@ int dsi_panel_device_register(struct device_node *pan_node,
		return -EINVAL;
	}
	for (i = 0; i < len; i++) {
		(panel_data->panel_info.mipi.dsi_phy_db)->laneCfg[i] =
		pinfo->mipi.dsi_phy_db.lanecfg[i] =
			data[i];
	}

@@ -1125,25 +1119,25 @@ int dsi_panel_device_register(struct device_node *pan_node,
	dynamic_fps = of_property_read_bool(pan_node,
					  "qcom,mdss-dsi-pan-enable-dynamic-fps");
	if (dynamic_fps) {
		panel_data->panel_info.dynamic_fps = true;
		pinfo->dynamic_fps = true;
		data = of_get_property(pan_node,
					  "qcom,mdss-dsi-pan-fps-update", NULL);
		if (data) {
			if (!strcmp(data, "dfps_suspend_resume_mode")) {
				panel_data->panel_info.dfps_update =
				pinfo->dfps_update =
						DFPS_SUSPEND_RESUME_MODE;
				pr_debug("%s: dfps mode: suspend/resume\n",
								__func__);
			} else if (!strcmp(data,
					    "dfps_immediate_clk_mode")) {
				panel_data->panel_info.dfps_update =
				pinfo->dfps_update =
						DFPS_IMMEDIATE_CLK_UPDATE_MODE;
				pr_debug("%s: dfps mode: Immediate clk\n",
								__func__);
			} else {
				pr_debug("%s: dfps to default mode\n",
								__func__);
				panel_data->panel_info.dfps_update =
				pinfo->dfps_update =
						DFPS_SUSPEND_RESUME_MODE;
				pr_debug("%s: dfps mode: suspend/resume\n",
								__func__);
@@ -1151,13 +1145,11 @@ int dsi_panel_device_register(struct device_node *pan_node,
		} else {
			pr_debug("%s: dfps update mode not configured\n",
								__func__);
				panel_data->panel_info.dynamic_fps =
								false;
				pinfo->dynamic_fps = false;
				pr_debug("%s: dynamic FPS disabled\n",
								__func__);
		}
		panel_data->panel_info.new_fps =
				panel_data->panel_info.mipi.frame_rate;
		pinfo->new_fps = pinfo->mipi.frame_rate;
	}

	ctrl_pdata->disp_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,
@@ -1190,7 +1182,7 @@ int dsi_panel_device_register(struct device_node *pan_node,
		}
	}

	if (panel_data->panel_info.type == MIPI_CMD_PANEL) {
	if (pinfo->type == MIPI_CMD_PANEL) {
		ctrl_pdata->disp_te_gpio = of_get_named_gpio
			(ctrl_pdev->dev.of_node, "qcom,platform-te-gpio", 0);
		if (!gpio_is_valid(ctrl_pdata->disp_te_gpio))
@@ -1263,7 +1255,7 @@ int dsi_panel_device_register(struct device_node *pan_node,
	}

	if (mdss_dsi_retrieve_ctrl_resources(ctrl_pdev,
					     panel_data->panel_info.pdest,
					     pinfo->pdest,
					     ctrl_pdata)) {
		pr_err("%s: unable to get Dsi controller res\n", __func__);
		return -EPERM;
@@ -1271,20 +1263,6 @@ int dsi_panel_device_register(struct device_node *pan_node,

	ctrl_pdata->panel_data.event_handler = mdss_dsi_event_handler;

	ctrl_pdata->on_cmds = panel_data->on_cmds;
	ctrl_pdata->off_cmds = panel_data->off_cmds;

	memcpy(&((ctrl_pdata->panel_data).panel_info),
				&(panel_data->panel_info),
				       sizeof(struct mdss_panel_info));

	ctrl_pdata->panel_data.set_backlight = panel_data->bl_fnc;
	ctrl_pdata->bklt_ctrl = panel_data->panel_info.bklt_ctrl;
	ctrl_pdata->pwm_pmic_gpio = panel_data->panel_info.pwm_pmic_gpio;
	ctrl_pdata->pwm_period = panel_data->panel_info.pwm_period;
	ctrl_pdata->pwm_lpg_chan = panel_data->panel_info.pwm_lpg_chan;
	ctrl_pdata->bklt_max = panel_data->panel_info.bl_max;

	if (ctrl_pdata->bklt_ctrl == BL_PWM)
		mdss_dsi_panel_pwm_cfg(ctrl_pdata);

@@ -1294,7 +1272,7 @@ int dsi_panel_device_register(struct device_node *pan_node,
	 */

	ctrl_pdata->pclk_rate = mipi->dsi_pclk_rate;
	ctrl_pdata->byte_clk_rate = panel_data->panel_info.clk_rate / 8;
	ctrl_pdata->byte_clk_rate = pinfo->clk_rate / 8;
	pr_debug("%s: pclk=%d, bclk=%d\n", __func__,
			ctrl_pdata->pclk_rate, ctrl_pdata->byte_clk_rate);

@@ -1336,10 +1314,7 @@ int dsi_panel_device_register(struct device_node *pan_node,
		return rc;
	}

	ctrl_pdata->on = panel_data->on;
	ctrl_pdata->off = panel_data->off;

	if (panel_data->panel_info.pdest == DISPLAY_1) {
	if (pinfo->pdest == DISPLAY_1) {
		mdss_debug_register_base("dsi0",
			ctrl_pdata->ctrl_base, ctrl_pdata->reg_size);
		ctrl_pdata->ndx = 0;
+2 −12
Original line number Diff line number Diff line
@@ -296,16 +296,6 @@ struct dsi_kickoff_action {
	void *data;
};

struct mdss_panel_common_pdata {
	struct mdss_panel_info panel_info;
	int (*on) (struct mdss_panel_data *pdata);
	int (*off) (struct mdss_panel_data *pdata);
	void (*bl_fnc) (struct mdss_panel_data *pdata, u32 bl_level);

	struct dsi_panel_cmds on_cmds;
	struct dsi_panel_cmds off_cmds;
};

struct dsi_drv_cm_data {
	struct regulator *vdd_vreg;
	struct regulator *vdd_io_vreg;
@@ -374,7 +364,7 @@ struct mdss_dsi_ctrl_pdata {
};

int dsi_panel_device_register(struct device_node *pan_node,
			      struct mdss_panel_common_pdata *panel_data,
				struct mdss_dsi_ctrl_pdata *ctrl_pdata,
			      bool cmd_cfg_cont_splash);

char *mdss_dsi_buf_reserve_hdr(struct dsi_buf *dp, int hlen);
@@ -434,5 +424,5 @@ struct dcs_cmd_req *mdss_dsi_cmdlist_get(struct mdss_dsi_ctrl_pdata *ctrl);
void mdss_dsi_cmdlist_kickoff(int intf);

int mdss_dsi_panel_init(struct device_node *node,
		struct mdss_panel_common_pdata *vendor_pdata);
		struct mdss_dsi_ctrl_pdata *ctrl_pdata);
#endif /* MDSS_DSI_H */
+80 −82
Original line number Diff line number Diff line
@@ -28,8 +28,6 @@

DEFINE_LED_TRIGGER(bl_led_trigger);

static struct mdss_dsi_phy_ctrl phy_params;

void mdss_dsi_panel_pwm_cfg(struct mdss_dsi_ctrl_pdata *ctrl)
{
	int ret;
@@ -495,12 +493,13 @@ static int mdss_dsi_parse_fbc_params(struct device_node *np,


static int mdss_panel_parse_dt(struct device_node *np,
			       struct mdss_panel_common_pdata *panel_data)
			struct mdss_dsi_ctrl_pdata *ctrl_pdata)
{
	u32 tmp;
	int rc, i, len;
	const char *data;
	static const char *pdest;
	struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info);

	rc = of_property_read_u32(np, "qcom,mdss-dsi-panel-width", &tmp);
	if (rc) {
@@ -508,7 +507,7 @@ static int mdss_panel_parse_dt(struct device_node *np,
						__func__, __LINE__);
		return -EINVAL;
	}
	panel_data->panel_info.xres = (!rc ? tmp : 640);
	pinfo->xres = (!rc ? tmp : 640);

	rc = of_property_read_u32(np, "qcom,mdss-dsi-panel-height", &tmp);
	if (rc) {
@@ -516,43 +515,43 @@ static int mdss_panel_parse_dt(struct device_node *np,
						__func__, __LINE__);
		return -EINVAL;
	}
	panel_data->panel_info.yres = (!rc ? tmp : 480);
	pinfo->yres = (!rc ? tmp : 480);

	rc = of_property_read_u32(np,
		"qcom,mdss-pan-physical-width-dimension", &tmp);
	panel_data->panel_info.physical_width = (!rc ? tmp : 0);
	pinfo->physical_width = (!rc ? tmp : 0);
	rc = of_property_read_u32(np,
		"qcom,mdss-pan-physical-height-dimension", &tmp);
	panel_data->panel_info.physical_height = (!rc ? tmp : 0);
	pinfo->physical_height = (!rc ? tmp : 0);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-h-left-border", &tmp);
	panel_data->panel_info.lcdc.xres_pad = (!rc ? tmp : 0);
	pinfo->lcdc.xres_pad = (!rc ? tmp : 0);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-h-right-border", &tmp);
	if (!rc)
		panel_data->panel_info.lcdc.xres_pad += tmp;
		pinfo->lcdc.xres_pad += tmp;
	rc = of_property_read_u32(np, "qcom,mdss-dsi-v-top-border", &tmp);
	panel_data->panel_info.lcdc.yres_pad = (!rc ? tmp : 0);
	pinfo->lcdc.yres_pad = (!rc ? tmp : 0);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-v-bottom-border", &tmp);
	if (!rc)
		panel_data->panel_info.lcdc.yres_pad += tmp;
		pinfo->lcdc.yres_pad += tmp;
	rc = of_property_read_u32(np, "qcom,mdss-dsi-bpp", &tmp);
	if (rc) {
		pr_err("%s:%d, bpp not specified\n", __func__, __LINE__);
		return -EINVAL;
	}
	panel_data->panel_info.bpp = (!rc ? tmp : 24);
	panel_data->panel_info.mipi.mode = DSI_VIDEO_MODE;
	pinfo->bpp = (!rc ? tmp : 24);
	pinfo->mipi.mode = DSI_VIDEO_MODE;
	data = of_get_property(np, "qcom,mdss-dsi-panel-type", NULL);
	if (data && !strncmp(data, "dsi_cmd_mode", 12))
		panel_data->panel_info.mipi.mode = DSI_CMD_MODE;
		pinfo->mipi.mode = DSI_CMD_MODE;
	rc = of_property_read_u32(np, "qcom,mdss-dsi-pixel-packing", &tmp);
	tmp = (!rc ? tmp : 0);
	rc = mdss_panel_dt_get_dst_fmt(panel_data->panel_info.bpp,
		panel_data->panel_info.mipi.mode, tmp,
		&(panel_data->panel_info.mipi.dst_format));
	rc = mdss_panel_dt_get_dst_fmt(pinfo->bpp,
		pinfo->mipi.mode, tmp,
		&(pinfo->mipi.dst_format));
	if (rc) {
		pr_debug("%s: problem determining dst format. Set Default\n",
			__func__);
		panel_data->panel_info.mipi.dst_format =
		pinfo->mipi.dst_format =
			DSI_VIDEO_DST_FORMAT_RGB888;
	}
	pdest = of_get_property(np,
@@ -563,35 +562,35 @@ static int mdss_panel_parse_dt(struct device_node *np,
		return -EINVAL;
	}
	if (!strncmp(pdest, "display_1", 9))
		panel_data->panel_info.pdest = DISPLAY_1;
		pinfo->pdest = DISPLAY_1;
	else if (!strncmp(pdest, "display_2", 9))
		panel_data->panel_info.pdest = DISPLAY_2;
		pinfo->pdest = DISPLAY_2;
	else {
		pr_debug("%s: pdest not specified. Set Default\n",
							__func__);
		panel_data->panel_info.pdest = DISPLAY_1;
		pinfo->pdest = DISPLAY_1;
	}
	rc = of_property_read_u32(np, "qcom,mdss-dsi-h-front-porch", &tmp);
	panel_data->panel_info.lcdc.h_front_porch = (!rc ? tmp : 6);
	pinfo->lcdc.h_front_porch = (!rc ? tmp : 6);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-h-back-porch", &tmp);
	panel_data->panel_info.lcdc.h_back_porch = (!rc ? tmp : 6);
	pinfo->lcdc.h_back_porch = (!rc ? tmp : 6);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-h-pulse-width", &tmp);
	panel_data->panel_info.lcdc.h_pulse_width = (!rc ? tmp : 2);
	pinfo->lcdc.h_pulse_width = (!rc ? tmp : 2);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-h-sync-skew", &tmp);
	panel_data->panel_info.lcdc.hsync_skew = (!rc ? tmp : 0);
	pinfo->lcdc.hsync_skew = (!rc ? tmp : 0);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-v-back-porch", &tmp);
	panel_data->panel_info.lcdc.v_back_porch = (!rc ? tmp : 6);
	pinfo->lcdc.v_back_porch = (!rc ? tmp : 6);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-v-front-porch", &tmp);
	panel_data->panel_info.lcdc.v_front_porch = (!rc ? tmp : 6);
	pinfo->lcdc.v_front_porch = (!rc ? tmp : 6);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-v-pulse-width", &tmp);
	panel_data->panel_info.lcdc.v_pulse_width = (!rc ? tmp : 2);
	pinfo->lcdc.v_pulse_width = (!rc ? tmp : 2);
	rc = of_property_read_u32(np,
		"qcom,mdss-dsi-underflow-color", &tmp);
	panel_data->panel_info.lcdc.underflow_clr = (!rc ? tmp : 0xff);
	pinfo->lcdc.underflow_clr = (!rc ? tmp : 0xff);
	rc = of_property_read_u32(np,
		"qcom,mdss-dsi-border-color", &tmp);
	panel_data->panel_info.lcdc.border_clr = (!rc ? tmp : 0);
	panel_data->panel_info.bklt_ctrl = UNKNOWN_CTRL;
	pinfo->lcdc.border_clr = (!rc ? tmp : 0);
	pinfo->bklt_ctrl = UNKNOWN_CTRL;
	data = of_get_property(np, "qcom,mdss-dsi-bl-pmic-control-type", NULL);
	if (data) {
		if (!strncmp(data, "bl_ctrl_wled", 12)) {
@@ -599,9 +598,9 @@ static int mdss_panel_parse_dt(struct device_node *np,
				&bl_led_trigger);
			pr_debug("%s: SUCCESS-> WLED TRIGGER register\n",
				__func__);
			panel_data->panel_info.bklt_ctrl = BL_WLED;
			ctrl_pdata->bklt_ctrl = BL_WLED;
		} else if (!strncmp(data, "bl_ctrl_pwm", 11)) {
			panel_data->panel_info.bklt_ctrl = BL_PWM;
			ctrl_pdata->bklt_ctrl = BL_PWM;
			rc = of_property_read_u32(np,
				"qcom,mdss-dsi-bl-pmic-pwm-frequency", &tmp);
			if (rc) {
@@ -609,7 +608,7 @@ static int mdss_panel_parse_dt(struct device_node *np,
						__func__, __LINE__);
				return -EINVAL;
			}
			panel_data->panel_info.pwm_period = tmp;
			ctrl_pdata->pwm_period = tmp;
			rc = of_property_read_u32(np,
				"qcom,mdss-dsi-bl-pmic-bank-select", &tmp);
			if (rc) {
@@ -617,108 +616,109 @@ static int mdss_panel_parse_dt(struct device_node *np,
						__func__, __LINE__);
				return -EINVAL;
			}
			panel_data->panel_info.pwm_lpg_chan = tmp;
			ctrl_pdata->pwm_lpg_chan = tmp;
			tmp = of_get_named_gpio(np,
				"qcom,mdss-dsi-pwm-gpio", 0);
			panel_data->panel_info.pwm_pmic_gpio = tmp;
			ctrl_pdata->pwm_pmic_gpio = tmp;
		} else if (!strncmp(data, "bl_ctrl_dcs", 11)) {
			panel_data->panel_info.bklt_ctrl = BL_DCS_CMD;
			ctrl_pdata->bklt_ctrl = BL_DCS_CMD;
		}
	}
	rc = of_property_read_u32(np, "qcom,mdss-dsi-bl-min-level", &tmp);
	panel_data->panel_info.bl_min = (!rc ? tmp : 0);
	pinfo->bl_min = (!rc ? tmp : 0);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-bl-max-level", &tmp);
	panel_data->panel_info.bl_max = (!rc ? tmp : 255);
	pinfo->bl_max = (!rc ? tmp : 255);
	ctrl_pdata->bklt_max = pinfo->bl_max;

	rc = of_property_read_u32(np, "qcom,mdss-dsi-interleave-mode", &tmp);
	panel_data->panel_info.mipi.interleave_mode = (!rc ? tmp : 0);
	pinfo->mipi.interleave_mode = (!rc ? tmp : 0);

	panel_data->panel_info.mipi.vsync_enable = of_property_read_bool(np,
	pinfo->mipi.vsync_enable = of_property_read_bool(np,
		"qcom,mdss-dsi-te-check-enable");
	panel_data->panel_info.mipi.hw_vsync_mode = of_property_read_bool(np,
	pinfo->mipi.hw_vsync_mode = of_property_read_bool(np,
		"qcom,mdss-dsi-te-using-te-pin");

	rc = of_property_read_u32(np,
		"qcom,mdss-dsi-h-sync-pulse", &tmp);
	panel_data->panel_info.mipi.pulse_mode_hsa_he = (!rc ? tmp : false);
	pinfo->mipi.pulse_mode_hsa_he = (!rc ? tmp : false);

	panel_data->panel_info.mipi.hfp_power_stop = of_property_read_bool(np,
	pinfo->mipi.hfp_power_stop = of_property_read_bool(np,
		"qcom,mdss-dsi-hfp-power-mode");
	panel_data->panel_info.mipi.hsa_power_stop = of_property_read_bool(np,
	pinfo->mipi.hsa_power_stop = of_property_read_bool(np,
		"qcom,mdss-dsi-hsa-power-mode");
	panel_data->panel_info.mipi.hbp_power_stop = of_property_read_bool(np,
	pinfo->mipi.hbp_power_stop = of_property_read_bool(np,
		"qcom,mdss-dsi-hbp-power-mode");
	panel_data->panel_info.mipi.bllp_power_stop = of_property_read_bool(np,
	pinfo->mipi.bllp_power_stop = of_property_read_bool(np,
		"qcom,mdss-dsi-bllp-power-mode");
	panel_data->panel_info.mipi.eof_bllp_power_stop = of_property_read_bool(
	pinfo->mipi.eof_bllp_power_stop = of_property_read_bool(
		np, "qcom,mdss-dsi-bllp-eof-power-mode");
	rc = of_property_read_u32(np,
		"qcom,mdss-dsi-traffic-mode", &tmp);
	panel_data->panel_info.mipi.traffic_mode =
	pinfo->mipi.traffic_mode =
			(!rc ? tmp : DSI_NON_BURST_SYNCH_PULSE);
	rc = of_property_read_u32(np,
		"qcom,mdss-dsi-te-dcs-command", &tmp);
	panel_data->panel_info.mipi.insert_dcs_cmd =
	pinfo->mipi.insert_dcs_cmd =
			(!rc ? tmp : 1);
	rc = of_property_read_u32(np,
		"qcom,mdss-dsi-te-v-sync-continue-lines", &tmp);
	panel_data->panel_info.mipi.wr_mem_continue =
	pinfo->mipi.wr_mem_continue =
			(!rc ? tmp : 0x3c);
	rc = of_property_read_u32(np,
		"qcom,mdss-dsi-te-v-sync-rd-ptr-irq-line", &tmp);
	panel_data->panel_info.mipi.wr_mem_start =
	pinfo->mipi.wr_mem_start =
			(!rc ? tmp : 0x2c);
	rc = of_property_read_u32(np,
		"qcom,mdss-dsi-te-pin-select", &tmp);
	panel_data->panel_info.mipi.te_sel =
	pinfo->mipi.te_sel =
			(!rc ? tmp : 1);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-virtual-channel-id", &tmp);
	panel_data->panel_info.mipi.vc = (!rc ? tmp : 0);
	pinfo->mipi.vc = (!rc ? tmp : 0);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-color-order", &tmp);
	panel_data->panel_info.mipi.rgb_swap = (!rc ? tmp : DSI_RGB_SWAP_RGB);
	panel_data->panel_info.mipi.data_lane0 = of_property_read_bool(np,
	pinfo->mipi.rgb_swap = (!rc ? tmp : DSI_RGB_SWAP_RGB);
	pinfo->mipi.data_lane0 = of_property_read_bool(np,
		"qcom,mdss-dsi-lane-0-state");
	panel_data->panel_info.mipi.data_lane1 = of_property_read_bool(np,
	pinfo->mipi.data_lane1 = of_property_read_bool(np,
		"qcom,mdss-dsi-lane-1-state");
	panel_data->panel_info.mipi.data_lane2 = of_property_read_bool(np,
	pinfo->mipi.data_lane2 = of_property_read_bool(np,
		"qcom,mdss-dsi-lane-2-state");
	panel_data->panel_info.mipi.data_lane3 = of_property_read_bool(np,
	pinfo->mipi.data_lane3 = of_property_read_bool(np,
		"qcom,mdss-dsi-lane-3-state");

	rc = of_property_read_u32(np, "qcom,mdss-dsi-lane-map", &tmp);
	panel_data->panel_info.mipi.dlane_swap = (!rc ? tmp : 0);
	pinfo->mipi.dlane_swap = (!rc ? tmp : 0);

	rc = of_property_read_u32(np, "qcom,mdss-dsi-t-clk-pre", &tmp);
	panel_data->panel_info.mipi.t_clk_pre = (!rc ? tmp : 0x24);
	pinfo->mipi.t_clk_pre = (!rc ? tmp : 0x24);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-t-clk-post", &tmp);
	panel_data->panel_info.mipi.t_clk_post = (!rc ? tmp : 0x03);
	pinfo->mipi.t_clk_post = (!rc ? tmp : 0x03);

	rc = of_property_read_u32(np, "qcom,mdss-dsi-stream", &tmp);
	panel_data->panel_info.mipi.stream = (!rc ? tmp : 0);
	pinfo->mipi.stream = (!rc ? tmp : 0);

	rc = of_property_read_u32(np, "qcom,mdss-dsi-mdp-trigger", &tmp);
	panel_data->panel_info.mipi.mdp_trigger =
	pinfo->mipi.mdp_trigger =
			(!rc ? tmp : DSI_CMD_TRIGGER_SW);
	if (panel_data->panel_info.mipi.mdp_trigger > 6) {
	if (pinfo->mipi.mdp_trigger > 6) {
		pr_err("%s:%d, Invalid mdp trigger. Forcing to sw trigger",
						 __func__, __LINE__);
		panel_data->panel_info.mipi.mdp_trigger =
		pinfo->mipi.mdp_trigger =
					DSI_CMD_TRIGGER_SW;
	}

	rc = of_property_read_u32(np, "qcom,mdss-dsi-dma-trigger", &tmp);
	panel_data->panel_info.mipi.dma_trigger =
	pinfo->mipi.dma_trigger =
			(!rc ? tmp : DSI_CMD_TRIGGER_SW);
	if (panel_data->panel_info.mipi.dma_trigger > 6) {
	if (pinfo->mipi.dma_trigger > 6) {
		pr_err("%s:%d, Invalid dma trigger. Forcing to sw trigger",
						 __func__, __LINE__);
		panel_data->panel_info.mipi.dma_trigger =
		pinfo->mipi.dma_trigger =
					DSI_CMD_TRIGGER_SW;
	}
	rc = of_property_read_u32(np, "qcom,mdss-dsi-panel-frame-rate", &tmp);
	panel_data->panel_info.mipi.frame_rate = (!rc ? tmp : 60);
	pinfo->mipi.frame_rate = (!rc ? tmp : 60);
	rc = of_property_read_u32(np, "qcom,mdss-dsi-panel-clock-rate", &tmp);
	panel_data->panel_info.clk_rate = (!rc ? tmp : 0);
	pinfo->clk_rate = (!rc ? tmp : 0);
	data = of_get_property(np, "qcom,mdss-dsi-panel-timings", &len);
	if ((!data) || (len != 12)) {
		pr_err("%s:%d, Unable to read Phy timing settings",
@@ -726,16 +726,14 @@ static int mdss_panel_parse_dt(struct device_node *np,
		goto error;
	}
	for (i = 0; i < len; i++)
		phy_params.timing[i] = data[i];

	panel_data->panel_info.mipi.dsi_phy_db = &phy_params;
		pinfo->mipi.dsi_phy_db.timing[i] = data[i];

	mdss_dsi_parse_fbc_params(np, &panel_data->panel_info);
	mdss_dsi_parse_fbc_params(np, pinfo);

	mdss_dsi_parse_dcs_cmds(np, &panel_data->on_cmds,
	mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->on_cmds,
		"qcom,mdss-dsi-on-command", "qcom,mdss-dsi-on-command-state");

	mdss_dsi_parse_dcs_cmds(np, &panel_data->off_cmds,
	mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->off_cmds,
		"qcom,mdss-dsi-off-command", "qcom,mdss-dsi-off-command-state");

	return 0;
@@ -745,7 +743,7 @@ error:
}

int mdss_dsi_panel_init(struct device_node *node,
	struct mdss_panel_common_pdata *vendor_pdata)
	struct mdss_dsi_ctrl_pdata *ctrl_pdata)
{
	int rc = 0;
	static const char *panel_name;
@@ -763,15 +761,15 @@ int mdss_dsi_panel_init(struct device_node *node,
	else
		pr_info("%s: Panel Name = %s\n", __func__, panel_name);

	rc = mdss_panel_parse_dt(node, vendor_pdata);
	rc = mdss_panel_parse_dt(node, ctrl_pdata);
	if (rc) {
		pr_err("%s:%d panel dt parse failed\n", __func__, __LINE__);
		return rc;
	}

	vendor_pdata->on = mdss_dsi_panel_on;
	vendor_pdata->off = mdss_dsi_panel_off;
	vendor_pdata->bl_fnc = mdss_dsi_panel_bl_ctrl;
	ctrl_pdata->on = mdss_dsi_panel_on;
	ctrl_pdata->off = mdss_dsi_panel_off;
	ctrl_pdata->panel_data.set_backlight = mdss_dsi_panel_bl_ctrl;

	return 0;
}
Loading