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>
This commit is contained in:
Adrian Salido-Moreno 2016-03-02 17:41:47 -08:00 committed by Kyle Yan
parent 663f4f2bbc
commit fc379ee8d6

View file

@ -140,6 +140,7 @@ static struct msm_bus_scale_pdata mdp_reg_bus_scale_table = {
.name = "mdss_reg", .name = "mdss_reg",
.active_only = true, .active_only = true,
}; };
static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev);
#endif #endif
u32 invalid_mdp107_wb_output_fmts[] = { 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_prefill(struct platform_device *pdev);
static int mdss_mdp_parse_dt_misc(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_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_ppb_off(struct platform_device *pdev);
static int mdss_mdp_parse_dt_cdm(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); 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) static int mdss_mdp_bus_scale_register(struct mdss_data_type *mdata)
{ {
struct msm_bus_scale_pdata *reg_bus_pdata; struct msm_bus_scale_pdata *reg_bus_pdata;
int i; int i, rc;
if (!mdata->bus_hdl) { 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 = mdata->bus_hdl =
msm_bus_scale_register_client(mdata->bus_scale_table); msm_bus_scale_register_client(mdata->bus_scale_table);
if (!mdata->bus_hdl) { 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 || if (mdata->mdp_rev < MDSS_MDP_HW_REV_102 ||
mdata->mdp_rev == MDSS_MDP_HW_REV_200) mdata->mdp_rev == MDSS_MDP_HW_REV_200)
mdss_set_quirk(mdata, MDSS_QUIRK_FMT_PACK_PATTERN); 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) 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(); struct mdss_data_type *mdata = mdss_mdp_get_mdata();
if (mdata != NULL) { if (mdata != NULL) {
if (on) { if (on) {
mdata->handoff_pending = true;
pr_debug("Enable MDP FS for splash.\n"); pr_debug("Enable MDP FS for splash.\n");
if (mdata->venus) { if (mdata->venus) {
ret = regulator_enable(mdata->venus); ret = regulator_enable(mdata->venus);
@ -2147,7 +2152,7 @@ static int mdss_mdp_probe(struct platform_device *pdev)
struct resource *res; struct resource *res;
int rc; int rc;
struct mdss_data_type *mdata; struct mdss_data_type *mdata;
bool display_on; bool display_on = false;
if (!pdev->dev.of_node) { if (!pdev->dev.of_node) {
pr_err("MDP driver only supports device tree probe\n"); pr_err("MDP driver only supports device tree probe\n");
@ -2242,6 +2247,34 @@ static int mdss_mdp_probe(struct platform_device *pdev)
if (rc) if (rc)
pr_err("mdss_register_irq failed.\n"); pr_err("mdss_register_irq failed.\n");
rc = mdss_mdp_res_init(mdata);
if (rc) {
pr_err("unable to initialize mdss mdp resources\n");
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_bus_scale_register(mdata);
if (rc) {
pr_err("unable to register bus scaling\n");
goto probe_done;
}
/*
* 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*/ /*populate hw iomem base info from device tree*/
rc = mdss_mdp_parse_dt(pdev); rc = mdss_mdp_parse_dt(pdev);
if (rc) { if (rc) {
@ -2255,17 +2288,6 @@ static int mdss_mdp_probe(struct platform_device *pdev)
goto probe_done; goto probe_done;
} }
rc = mdss_mdp_res_init(mdata);
if (rc) {
pr_err("unable to initialize mdss mdp resources\n");
goto probe_done;
}
rc = mdss_mdp_bus_scale_register(mdata);
if (rc) {
pr_err("unable to register bus scaling\n");
goto probe_done;
}
rc = mdss_mdp_debug_init(pdev, mdata); rc = mdss_mdp_debug_init(pdev, mdata);
if (rc) { if (rc) {
pr_err("unable to initialize mdp debugging\n"); pr_err("unable to initialize mdp debugging\n");
@ -2275,14 +2297,6 @@ static int mdss_mdp_probe(struct platform_device *pdev)
if (rc) if (rc)
goto probe_done; 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); rc = mdss_mdp_register_sysfs(mdata);
if (rc) if (rc)
pr_err("unable to register mdp sysfs nodes\n"); 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; 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); mdss_hw_init(mdata);
rc = mdss_mdp_pp_init(&pdev->dev); rc = mdss_mdp_pp_init(&pdev->dev);
@ -2328,18 +2334,25 @@ static int mdss_mdp_probe(struct platform_device *pdev)
MMSS_MDP_ROBUST_LUT); 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 + display_on = (bool)readl_relaxed(mdata->mdp_base +
MDSS_MDP_REG_DISP_INTF_SEL); MDSS_MDP_REG_DISP_INTF_SEL);
if (!display_on) if (!display_on)
mdss_mdp_footswitch_ctrl_splash(false); mdss_mdp_footswitch_ctrl_splash(false);
else
mdata->handoff_pending = true;
pr_info("mdss version = 0x%x, bootloader display is %s\n", pr_info("mdss version = 0x%x, bootloader display is %s\n",
mdata->mdp_rev, display_on ? "on" : "off"); mdata->mdp_rev, display_on ? "on" : "off");
probe_done: probe_done:
if (IS_ERR_VALUE(rc)) { if (IS_ERR_VALUE(rc)) {
if (display_on)
mdss_mdp_footswitch_ctrl_splash(false);
if (mdata->regulator_notif_register) if (mdata->regulator_notif_register)
regulator_unregister_notifier(mdata->fs, regulator_unregister_notifier(mdata->fs,
&(mdata->gdsc_cb)); &(mdata->gdsc_cb));
@ -2489,12 +2502,6 @@ static int mdss_mdp_parse_dt(struct platform_device *pdev)
return rc; 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); rc = mdss_mdp_parse_dt_cdm(pdev);
if (rc) if (rc)
pr_debug("CDM offset not found in device tree\n"); 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]); data[0], data[1], data[2], data[3]);
} }
mdss_mdp_set_supported_formats(mdata);
parse_fail: parse_fail:
return rc; return rc;
} }
@ -3838,12 +3847,6 @@ static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev)
return rc; return rc;
} }
#else
static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev)
{
return 0;
}
#endif #endif
static int mdss_mdp_parse_dt_handler(struct platform_device *pdev, static int mdss_mdp_parse_dt_handler(struct platform_device *pdev,