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: Padmanabhan Komanduru <pkomandu@codeaurora.org>
This commit is contained in:
Padmanabhan Komanduru 2015-06-30 18:58:32 +05:30 committed by David Keitel
parent 52d6080e7d
commit c15bb828de

View file

@ -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);