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:
parent
663f4f2bbc
commit
fc379ee8d6
1 changed files with 49 additions and 46 deletions
|
@ -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,6 +2247,34 @@ static int mdss_mdp_probe(struct platform_device *pdev)
|
|||
if (rc)
|
||||
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*/
|
||||
rc = mdss_mdp_parse_dt(pdev);
|
||||
if (rc) {
|
||||
|
@ -2255,17 +2288,6 @@ static int mdss_mdp_probe(struct platform_device *pdev)
|
|||
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);
|
||||
if (rc) {
|
||||
pr_err("unable to initialize mdp debugging\n");
|
||||
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue