summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.c91
1 files changed, 47 insertions, 44 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c
index b66830d7d7a5..d51f4d7dce67 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp.c
@@ -140,6 +140,7 @@ static struct msm_bus_scale_pdata mdp_reg_bus_scale_table = {
.name = "mdss_reg",
.active_only = true,
};
+static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev);
#endif
u32 invalid_mdp107_wb_output_fmts[] = {
@@ -163,7 +164,6 @@ static int mdss_mdp_parse_dt_smp(struct platform_device *pdev);
static int mdss_mdp_parse_dt_prefill(struct platform_device *pdev);
static int mdss_mdp_parse_dt_misc(struct platform_device *pdev);
static int mdss_mdp_parse_dt_ad_cfg(struct platform_device *pdev);
-static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev);
static int mdss_mdp_parse_dt_ppb_off(struct platform_device *pdev);
static int mdss_mdp_parse_dt_cdm(struct platform_device *pdev);
static int mdss_mdp_parse_dt_dsc(struct platform_device *pdev);
@@ -295,9 +295,15 @@ static irqreturn_t mdss_irq_handler(int irq, void *ptr)
static int mdss_mdp_bus_scale_register(struct mdss_data_type *mdata)
{
struct msm_bus_scale_pdata *reg_bus_pdata;
- int i;
+ int i, rc;
if (!mdata->bus_hdl) {
+ rc = mdss_mdp_parse_dt_bus_scale(mdata->pdev);
+ if (rc) {
+ pr_err("Error in device tree : bus scale\n");
+ return rc;
+ }
+
mdata->bus_hdl =
msm_bus_scale_register_client(mdata->bus_scale_table);
if (!mdata->bus_hdl) {
@@ -1543,8 +1549,6 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata)
if (mdata->mdp_rev < MDSS_MDP_HW_REV_102 ||
mdata->mdp_rev == MDSS_MDP_HW_REV_200)
mdss_set_quirk(mdata, MDSS_QUIRK_FMT_PACK_PATTERN);
-
- mdss_mdp_set_supported_formats(mdata);
}
static void mdss_hw_rev_init(struct mdss_data_type *mdata)
@@ -1729,6 +1733,7 @@ void mdss_mdp_footswitch_ctrl_splash(int on)
struct mdss_data_type *mdata = mdss_mdp_get_mdata();
if (mdata != NULL) {
if (on) {
+ mdata->handoff_pending = true;
pr_debug("Enable MDP FS for splash.\n");
if (mdata->venus) {
ret = regulator_enable(mdata->venus);
@@ -2147,7 +2152,7 @@ static int mdss_mdp_probe(struct platform_device *pdev)
struct resource *res;
int rc;
struct mdss_data_type *mdata;
- bool display_on;
+ bool display_on = false;
if (!pdev->dev.of_node) {
pr_err("MDP driver only supports device tree probe\n");
@@ -2242,27 +2247,44 @@ static int mdss_mdp_probe(struct platform_device *pdev)
if (rc)
pr_err("mdss_register_irq failed.\n");
- /*populate hw iomem base info from device tree*/
- rc = mdss_mdp_parse_dt(pdev);
+ rc = mdss_mdp_res_init(mdata);
if (rc) {
- pr_err("unable to parse device tree\n");
+ pr_err("unable to initialize mdss mdp resources\n");
goto probe_done;
}
- rc = mdss_mdp_get_cmdline_config(pdev);
+ pm_runtime_set_autosuspend_delay(&pdev->dev, AUTOSUSPEND_TIMEOUT_MS);
+ if (mdata->idle_pc_enabled)
+ pm_runtime_use_autosuspend(&pdev->dev);
+ pm_runtime_set_suspended(&pdev->dev);
+ pm_runtime_enable(&pdev->dev);
+ if (!pm_runtime_enabled(&pdev->dev))
+ mdss_mdp_footswitch_ctrl(mdata, true);
+
+ rc = mdss_mdp_bus_scale_register(mdata);
if (rc) {
- pr_err("Error in panel override:rc=[%d]\n", rc);
+ pr_err("unable to register bus scaling\n");
goto probe_done;
}
- rc = mdss_mdp_res_init(mdata);
+ /*
+ * enable clocks and read mdp_rev as soon as possible once
+ * kernel is up.
+ */
+ mdss_mdp_footswitch_ctrl_splash(true);
+ mdss_hw_rev_init(mdata);
+ display_on = true;
+
+ /*populate hw iomem base info from device tree*/
+ rc = mdss_mdp_parse_dt(pdev);
if (rc) {
- pr_err("unable to initialize mdss mdp resources\n");
+ pr_err("unable to parse device tree\n");
goto probe_done;
}
- rc = mdss_mdp_bus_scale_register(mdata);
+
+ rc = mdss_mdp_get_cmdline_config(pdev);
if (rc) {
- pr_err("unable to register bus scaling\n");
+ pr_err("Error in panel override:rc=[%d]\n", rc);
goto probe_done;
}
@@ -2275,14 +2297,6 @@ static int mdss_mdp_probe(struct platform_device *pdev)
if (rc)
goto probe_done;
- pm_runtime_set_autosuspend_delay(&pdev->dev, AUTOSUSPEND_TIMEOUT_MS);
- if (mdata->idle_pc_enabled)
- pm_runtime_use_autosuspend(&pdev->dev);
- pm_runtime_set_suspended(&pdev->dev);
- pm_runtime_enable(&pdev->dev);
- if (!pm_runtime_enabled(&pdev->dev))
- mdss_mdp_footswitch_ctrl(mdata, true);
-
rc = mdss_mdp_register_sysfs(mdata);
if (rc)
pr_err("unable to register mdp sysfs nodes\n");
@@ -2301,14 +2315,6 @@ static int mdss_mdp_probe(struct platform_device *pdev)
mdss_res->mdss_util->mdp_probe_done = true;
- /*
- * enable clocks and read mdp_rev as soon as possible once
- * kernel is up. Read the DISP_INTF_SEL register to check if
- * display was enabled in bootloader or not. If yes, let handoff
- * handle removing the extra clk/regulator votes else turn off
- * clk/regulators because purpose here is to get mdp_rev.
- */
- mdss_mdp_footswitch_ctrl_splash(true);
mdss_hw_init(mdata);
rc = mdss_mdp_pp_init(&pdev->dev);
@@ -2328,18 +2334,25 @@ static int mdss_mdp_probe(struct platform_device *pdev)
MMSS_MDP_ROBUST_LUT);
}
+ /*
+ * Read the DISP_INTF_SEL register to check if display was enabled in
+ * bootloader or not. If yes, let handoff handle removing the extra
+ * clk/regulator votes else turn off clk/regulators because purpose
+ * here is to get mdp_rev.
+ */
display_on = (bool)readl_relaxed(mdata->mdp_base +
MDSS_MDP_REG_DISP_INTF_SEL);
if (!display_on)
mdss_mdp_footswitch_ctrl_splash(false);
- else
- mdata->handoff_pending = true;
pr_info("mdss version = 0x%x, bootloader display is %s\n",
mdata->mdp_rev, display_on ? "on" : "off");
probe_done:
if (IS_ERR_VALUE(rc)) {
+ if (display_on)
+ mdss_mdp_footswitch_ctrl_splash(false);
+
if (mdata->regulator_notif_register)
regulator_unregister_notifier(mdata->fs,
&(mdata->gdsc_cb));
@@ -2489,12 +2502,6 @@ static int mdss_mdp_parse_dt(struct platform_device *pdev)
return rc;
}
- rc = mdss_mdp_parse_dt_bus_scale(pdev);
- if (rc) {
- pr_err("Error in device tree : bus scale\n");
- return rc;
- }
-
rc = mdss_mdp_parse_dt_cdm(pdev);
if (rc)
pr_debug("CDM offset not found in device tree\n");
@@ -2831,6 +2838,8 @@ static int mdss_mdp_parse_dt_pipe(struct platform_device *pdev)
data[0], data[1], data[2], data[3]);
}
+ mdss_mdp_set_supported_formats(mdata);
+
parse_fail:
return rc;
}
@@ -3838,12 +3847,6 @@ static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev)
return rc;
}
-#else
-static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev)
-{
- return 0;
-}
-
#endif
static int mdss_mdp_parse_dt_handler(struct platform_device *pdev,