diff options
Diffstat (limited to 'drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c')
-rw-r--r-- | drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 119 |
1 files changed, 36 insertions, 83 deletions
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c index 3e1b28d3e41b..15aed45022bc 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c @@ -19,8 +19,6 @@ #include "msm_mmu.h" #include "mdp5_kms.h" -#define MDP5_DEFAULT_BW MBps_to_icc(6400) - static int mdp5_hw_init(struct msm_kms *kms) { struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms)); @@ -298,28 +296,6 @@ static const struct mdp_kms_funcs kms_funcs = { .set_irqmask = mdp5_set_irqmask, }; -void mdp5_kms_set_bandwidth(struct mdp5_kms *mdp5_kms) -{ - int i; - u32 full_bw = 0; - struct drm_crtc *tmp_crtc; - - if (!mdp5_kms->num_paths) - return; - - drm_for_each_crtc(tmp_crtc, mdp5_kms->dev) { - if (!tmp_crtc->enabled) - continue; - - full_bw += Bps_to_icc(to_mdp5_crtc_state(tmp_crtc->state)->new_crtc_bw / mdp5_kms->num_paths); - } - - DBG("SET BW to %d\n", full_bw); - - for (i = 0; i < mdp5_kms->num_paths; i++) - icc_set_bw(mdp5_kms->paths[i], full_bw, full_bw); -} - static int mdp5_disable(struct mdp5_kms *mdp5_kms) { DBG(""); @@ -337,14 +313,6 @@ static int mdp5_disable(struct mdp5_kms *mdp5_kms) if (mdp5_kms->lut_clk) clk_disable_unprepare(mdp5_kms->lut_clk); - if (!mdp5_kms->enable_count) { - int i; - - for (i = 0; i < mdp5_kms->num_paths; i++) - icc_set_bw(mdp5_kms->paths[i], 0, 0); - icc_set_bw(mdp5_kms->path_rot, 0, 0); - } - return 0; } @@ -354,14 +322,6 @@ static int mdp5_enable(struct mdp5_kms *mdp5_kms) mdp5_kms->enable_count++; - if (mdp5_kms->enable_count == 1) { - int i; - - for (i = 0; i < mdp5_kms->num_paths; i++) - icc_set_bw(mdp5_kms->paths[i], 0, MDP5_DEFAULT_BW); - icc_set_bw(mdp5_kms->path_rot, 0, MDP5_DEFAULT_BW); - } - clk_prepare_enable(mdp5_kms->ahb_clk); clk_prepare_enable(mdp5_kms->axi_clk); clk_prepare_enable(mdp5_kms->core_clk); @@ -868,40 +828,6 @@ static int interface_init(struct mdp5_kms *mdp5_kms) return 0; } -static int mdp5_setup_interconnect(struct mdp5_kms *mdp5_kms) -{ - struct icc_path *path0 = of_icc_get(&mdp5_kms->pdev->dev, "mdp0-mem"); - struct icc_path *path1 = of_icc_get(&mdp5_kms->pdev->dev, "mdp1-mem"); - struct icc_path *path_rot = of_icc_get(&mdp5_kms->pdev->dev, "rotator-mem"); - - if (IS_ERR(path0)) - return PTR_ERR(path0); - - if (!path0) { - /* no interconnect support is not necessarily a fatal - * condition, the platform may simply not have an - * interconnect driver yet. But warn about it in case - * bootloader didn't setup bus clocks high enough for - * scanout. - */ - dev_warn(&mdp5_kms->pdev->dev, "No interconnect support may cause display underflows!\n"); - return 0; - } - - mdp5_kms->paths[0] = path0; - mdp5_kms->num_paths = 1; - - if (!IS_ERR_OR_NULL(path1)) { - mdp5_kms->paths[1] = path1; - mdp5_kms->num_paths++; - } - - if (!IS_ERR_OR_NULL(path_rot)) - mdp5_kms->path_rot = path_rot; - - return 0; -} - static int mdp5_init(struct platform_device *pdev, struct drm_device *dev) { struct msm_drm_private *priv = dev->dev_private; @@ -909,7 +835,6 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev) struct mdp5_cfg *config; u32 major, minor; int ret; - int i; mdp5_kms = devm_kzalloc(&pdev->dev, sizeof(*mdp5_kms), GFP_KERNEL); if (!mdp5_kms) { @@ -934,14 +859,6 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev) goto fail; } - ret = mdp5_setup_interconnect(mdp5_kms); - if (ret) - goto fail; - - for (i = 0; i < mdp5_kms->num_paths; i++) - icc_set_bw(mdp5_kms->paths[i], 0, MDP5_DEFAULT_BW); - icc_set_bw(mdp5_kms->path_rot, 0, MDP5_DEFAULT_BW); - /* mandatory clocks: */ ret = get_clk(pdev, &mdp5_kms->axi_clk, "bus", true); if (ret) @@ -1051,10 +968,46 @@ static const struct component_ops mdp5_ops = { .unbind = mdp5_unbind, }; +static int mdp5_setup_interconnect(struct platform_device *pdev) +{ + struct icc_path *path0 = of_icc_get(&pdev->dev, "mdp0-mem"); + struct icc_path *path1 = of_icc_get(&pdev->dev, "mdp1-mem"); + struct icc_path *path_rot = of_icc_get(&pdev->dev, "rotator-mem"); + + if (IS_ERR(path0)) + return PTR_ERR(path0); + + if (!path0) { + /* no interconnect support is not necessarily a fatal + * condition, the platform may simply not have an + * interconnect driver yet. But warn about it in case + * bootloader didn't setup bus clocks high enough for + * scanout. + */ + dev_warn(&pdev->dev, "No interconnect support may cause display underflows!\n"); + return 0; + } + + icc_set_bw(path0, 0, MBps_to_icc(6400)); + + if (!IS_ERR_OR_NULL(path1)) + icc_set_bw(path1, 0, MBps_to_icc(6400)); + if (!IS_ERR_OR_NULL(path_rot)) + icc_set_bw(path_rot, 0, MBps_to_icc(6400)); + + return 0; +} + static int mdp5_dev_probe(struct platform_device *pdev) { + int ret; + DBG(""); + ret = mdp5_setup_interconnect(pdev); + if (ret) + return ret; + return component_add(&pdev->dev, &mdp5_ops); } |