diff options
| author | Adrian Salido-Moreno <adrianm@codeaurora.org> | 2016-03-02 17:41:47 -0800 |
|---|---|---|
| committer | Kyle Yan <kyan@codeaurora.org> | 2016-04-28 16:41:56 -0700 |
| commit | fc379ee8d612dfed8317ff6fd92e51cf1dd198bd (patch) | |
| tree | e8e90fca084a9fc2957b897e4f1aa30182021460 | |
| parent | 663f4f2bbcdf277f105f048473ce9229f3815cb4 (diff) | |
msm: mdss: perform hardware rev init earlier during probe
Perform revision initialization as soon as possible in order to have
all capabilities that depend on revision read from hardware
enumerated by the time we start parsing and doing other
initialization.
CRs-Fixed: 987777
Change-Id: Ide1fa99b876a3347a4e46c11261a9e7a32b8f47a
Signed-off-by: Adrian Salido-Moreno <adrianm@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 91 |
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, |
