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

Commit a64cd2cd 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: add support to configure dsi lanes for bridge chips"

parents 3d722f41 e2eab12e
Loading
Loading
Loading
Loading
+74 −1
Original line number Diff line number Diff line
/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -38,6 +38,7 @@ struct mdss_dba_utils_data {
	struct mdss_panel_info *pinfo;
	void *dba_data;
	void *edid_data;
	void *timing_data;
	void *cec_abst_data;
	u8 *edid_buf;
	u32 edid_buf_size;
@@ -648,6 +649,72 @@ void mdss_dba_utils_hdcp_enable(void *data, bool enable)
		ud->ops.hdcp_enable(ud->dba_data, enable, enable, 0);
}

void mdss_dba_update_lane_cfg(struct mdss_panel_info *pinfo)
{
	struct mdss_dba_utils_data *dba_data;
	struct mdss_dba_timing_info *cfg_tbl;
	int i = 0, lanes;

	if (NULL == pinfo)
		return;

	/*
	 * Restore to default value from DT
	 * if resolution not found in
	 * supported resolutions
	 */
	lanes = pinfo->mipi.default_lanes;

	dba_data = (struct mdss_dba_utils_data *)(pinfo->dba_data);
	if (NULL == dba_data)
		goto lane_cfg;

	/* get adv supported timing info */
	cfg_tbl = (struct mdss_dba_timing_info *)(dba_data->timing_data);
	if (NULL == cfg_tbl)
		goto lane_cfg;

	while (cfg_tbl[i].xres != 0xffff) {
		if (cfg_tbl[i].xres == pinfo->xres &&
			cfg_tbl[i].yres == pinfo->yres &&
			cfg_tbl[i].bpp == pinfo->bpp &&
			cfg_tbl[i].fps == pinfo->mipi.frame_rate) {
			lanes = cfg_tbl[i].lanes;
			break;
		}
		i++;
	}

lane_cfg:
	switch (lanes) {
	case 1:
		pinfo->mipi.data_lane0 = 1;
		pinfo->mipi.data_lane1 = 0;
		pinfo->mipi.data_lane2 = 0;
		pinfo->mipi.data_lane3 = 0;
		break;
	case 2:
		pinfo->mipi.data_lane0 = 1;
		pinfo->mipi.data_lane1 = 1;
		pinfo->mipi.data_lane2 = 0;
		pinfo->mipi.data_lane3 = 0;
		break;
	case 3:
		pinfo->mipi.data_lane0 = 1;
		pinfo->mipi.data_lane1 = 1;
		pinfo->mipi.data_lane2 = 1;
		pinfo->mipi.data_lane3 = 0;
		break;
	case 4:
	default:
		pinfo->mipi.data_lane0 = 1;
		pinfo->mipi.data_lane1 = 1;
		pinfo->mipi.data_lane2 = 1;
		pinfo->mipi.data_lane3 = 1;
		break;
	}
}

/**
 * mdss_dba_utils_init() - Allow clients to register with DBA utils
 * @uid: Initialization data for registration.
@@ -760,6 +827,12 @@ void *mdss_dba_utils_init(struct mdss_dba_utils_init_data *uid)
		goto error;
	}

	/* get the timing data for the adv chip */
	if (udata->ops.get_supp_timing_info)
		udata->timing_data = udata->ops.get_supp_timing_info();
	else
		udata->timing_data = NULL;

	/* update cec data to retrieve it back in cec abstract module */
	if (uid->pinfo) {
		uid->pinfo->is_cec_supported = true;
+2 −1
Original line number Diff line number Diff line
/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -46,4 +46,5 @@ void mdss_dba_utils_hdcp_enable(void *data, bool enable);

void *mdss_dba_utils_init(struct mdss_dba_utils_init_data *init_data);
void mdss_dba_utils_deinit(void *data);
void mdss_dba_update_lane_cfg(struct mdss_panel_info *pinfo);
#endif /* __MDSS_DBA_UTILS__ */
+22 −0
Original line number Diff line number Diff line
@@ -2237,6 +2237,23 @@ static int mdss_dsi_check_params(struct mdss_dsi_ctrl_pdata *ctrl, void *arg)
	return rc;
}

#ifdef TARGET_HW_MDSS_HDMI
static void mdss_dsi_update_params(struct mdss_dsi_ctrl_pdata *ctrl, void *arg)
{
	struct mdss_panel_info *pinfo;

	if (!ctrl || !arg)
		return;

	pinfo = &ctrl->panel_data.panel_info;
	mdss_dba_update_lane_cfg(pinfo);
}
#else
static void mdss_dsi_update_params(struct mdss_dsi_ctrl_pdata *ctrl, void *arg)
{
}
#endif

static int mdss_dsi_dfps_config(struct mdss_panel_data *pdata, int new_fps)
{
	int rc = 0;
@@ -2589,6 +2606,11 @@ static int mdss_dsi_event_handler(struct mdss_panel_data *pdata,
	MDSS_XLOG(event, arg, ctrl_pdata->ndx, 0x3333);

	switch (event) {
	case MDSS_EVENT_UPDATE_PARAMS:
		pr_debug("%s:Entered Case MDSS_EVENT_UPDATE_PARAMS\n",
				__func__);
		mdss_dsi_update_params(ctrl_pdata, arg);
		break;
	case MDSS_EVENT_CHECK_PARAMS:
		pr_debug("%s:Entered Case MDSS_EVENT_CHECK_PARAMS\n", __func__);
		if (mdss_dsi_check_params(ctrl_pdata, arg)) {
+15 −0
Original line number Diff line number Diff line
@@ -2527,6 +2527,7 @@ static int mdss_panel_parse_dt(struct device_node *np,
			struct mdss_dsi_ctrl_pdata *ctrl_pdata)
{
	u32 tmp;
	u8 lanes = 0;
	int rc = 0;
	const char *data;
	static const char *pdest;
@@ -2673,6 +2674,20 @@ static int mdss_panel_parse_dt(struct device_node *np,
	pinfo->mipi.data_lane3 = of_property_read_bool(np,
		"qcom,mdss-dsi-lane-3-state");

	if (pinfo->mipi.data_lane0)
		lanes++;
	if (pinfo->mipi.data_lane1)
		lanes++;
	if (pinfo->mipi.data_lane2)
		lanes++;
	if (pinfo->mipi.data_lane3)
		lanes++;
	/*
	 * needed to set default lanes during
	 * resolution switch for bridge chips
	 */
	pinfo->mipi.default_lanes = lanes;

	rc = mdss_panel_parse_display_timings(np, &ctrl_pdata->panel_data);
	if (rc)
		return rc;
+4 −0
Original line number Diff line number Diff line
@@ -3901,6 +3901,10 @@ static int mdss_fb_set_par(struct fb_info *info)
	if (mfd->panel_reconfig || (mfd->fb_imgType != old_imgType)) {
		mdss_fb_blank_sub(FB_BLANK_POWERDOWN, info, mfd->op_enable);
		mdss_fb_var_to_panelinfo(var, mfd->panel_info);
		if (mfd->panel_info->is_dba_panel &&
			mdss_fb_send_panel_event(mfd, MDSS_EVENT_UPDATE_PARAMS,
							mfd->panel_info))
			pr_debug("Failed to send panel event UPDATE_PARAMS\n");
		mdss_fb_blank_sub(FB_BLANK_UNBLANK, info, mfd->op_enable);
		mfd->panel_reconfig = false;
	}
Loading