summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c')
-rw-r--r--drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c119
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);
}