diff options
| -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, |
