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

Commit bf3f5092 authored by Padmanabhan Komanduru's avatar Padmanabhan Komanduru Committed by Gerrit - the friendly Code Review server
Browse files

msm: mdss: add support to override dual DSI properties in kernel



In the current implementation, the DSI h/w configuration and DSI
PLL source are configured based on the MDSS DSI DT properties.
These can be changed dynamically based on the panel that is being
configured in LK. Add support to override these properties based on
the display command line string that is passed from LK to kernel.

Change-Id: I7ba5a2d16b3527537c91c79e7977a55d8b2e23c3
Signed-off-by: default avatarPadmanabhan Komanduru <pkomandu@codeaurora.org>
parent 9fd50032
Loading
Loading
Loading
Loading
+41 −27
Original line number Diff line number Diff line
@@ -2828,11 +2828,14 @@ mem_fail:
	return rc;
}

static int mdss_dsi_parse_hw_cfg(struct platform_device *pdev)
static int mdss_dsi_parse_hw_cfg(struct platform_device *pdev, char *pan_cfg)
{
	const char *data;
	struct mdss_dsi_data *dsi_res = platform_get_drvdata(pdev);
	struct dsi_shared_data *sdata;
	char dsi_cfg[20];
	char *cfg_prim = NULL, *cfg_sec = NULL;
	int i = 0;

	if (!dsi_res) {
		pr_err("%s: DSI root device drvdata not found\n", __func__);
@@ -2847,7 +2850,22 @@ static int mdss_dsi_parse_hw_cfg(struct platform_device *pdev)

	sdata->hw_config = SINGLE_DSI;

	data = of_get_property(pdev->dev.of_node, "hw-config", NULL);
	if (pan_cfg)
		cfg_prim = strnstr(pan_cfg, "cfg:", strlen(pan_cfg));
	if (cfg_prim) {
		cfg_prim += 4;
		cfg_sec = strnchr(cfg_prim, strlen(cfg_prim), ':');
		if (!cfg_sec)
			cfg_sec = cfg_prim + strlen(cfg_prim);
		for (i = 0; (cfg_prim + i) < cfg_sec; i++)
			dsi_cfg[i] = *(cfg_prim + i);
		dsi_cfg[i] = '\0';
		data = dsi_cfg;
	} else {
		data = of_get_property(pdev->dev.of_node,
			"hw-config", NULL);
	}

	if (data) {
		if (!strcmp(data, "dual_dsi"))
			sdata->hw_config = DUAL_DSI;
@@ -2870,13 +2888,30 @@ static int mdss_dsi_parse_hw_cfg(struct platform_device *pdev)
	return 0;
}

static void mdss_dsi_parse_pll_src_cfg(struct platform_device *pdev)
static void mdss_dsi_parse_pll_src_cfg(struct platform_device *pdev,
	char *pan_cfg)
{
	const char *data;
	char *pll_ptr, pll_cfg[10] = {'\0'};
	struct dsi_shared_data *sdata = mdss_dsi_res->shared_data;

	sdata->pll_src_config = PLL_SRC_DEFAULT;
	data = of_get_property(pdev->dev.of_node, "pll-src-config", NULL);

	if (pan_cfg) {
		pll_ptr = strnstr(pan_cfg, ":pll0", strlen(pan_cfg));
		if (!pll_ptr) {
			pll_ptr = strnstr(pan_cfg, ":pll1", strlen(pan_cfg));
			if (pll_ptr)
				strlcpy(pll_cfg, "PLL1", strlen(pll_cfg));
		} else {
			strlcpy(pll_cfg, "PLL0", strlen(pll_cfg));
		}
	}
	data = pll_cfg;

	if (!data || !strcmp(data, ""))
		data = of_get_property(pdev->dev.of_node,
			"pll-src-config", NULL);
	if (data) {
		if (!strcmp(data, "PLL0"))
			sdata->pll_src_config = PLL_SRC_0;
@@ -2894,24 +2929,6 @@ static void mdss_dsi_parse_pll_src_cfg(struct platform_device *pdev)
	return;
}

static void mdss_dsi_update_hw_cfg(char *panel_cfg)
{
	const char *pan;
	struct dsi_shared_data *sdata = mdss_dsi_res->shared_data;

	if (!panel_cfg)
		return;

	if (mdss_dsi_is_hw_config_split(sdata)) {
		pan = strnstr(panel_cfg, NONE_PANEL, strlen(panel_cfg));
		if (pan) {
			pr_debug("moving to single DSI configuraiton\n");
			sdata->hw_config = SINGLE_DSI;
			sdata->pll_src_config = PLL_SRC_DEFAULT;
		}
	}
}

static int mdss_dsi_validate_pll_src_config(struct dsi_shared_data *sdata)
{
	int rc = 0;
@@ -3000,17 +3017,14 @@ static int mdss_dsi_probe(struct platform_device *pdev)
		return rc;
	}

	rc = mdss_dsi_parse_hw_cfg(pdev);
	rc = mdss_dsi_parse_hw_cfg(pdev, panel_cfg);
	if (rc) {
		pr_err("%s Unable to parse dsi h/w config\n", __func__);
		mdss_dsi_res_deinit(pdev);
		return rc;
	}

	/* support hw config override until full support is not added */
	mdss_dsi_update_hw_cfg(panel_cfg);

	mdss_dsi_parse_pll_src_cfg(pdev);
	mdss_dsi_parse_pll_src_cfg(pdev, panel_cfg);

	of_platform_populate(pdev->dev.of_node, mdss_dsi_ctrl_dt_match,
				NULL, &pdev->dev);