]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
drm/exynos: use helper to set possible crtcs
authorAndrzej Hajda <a.hajda@samsung.com>
Thu, 24 Aug 2017 13:33:51 +0000 (15:33 +0200)
committerInki Dae <inki.dae@samsung.com>
Fri, 25 Aug 2017 02:26:10 +0000 (11:26 +0900)
All encoders share the same code to set encoders possible_crtcs field.
The patch creates helper to abstract out this code.

Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos_dp.c
drivers/gpu/drm/exynos/exynos_drm_core.c
drivers/gpu/drm/exynos/exynos_drm_crtc.c
drivers/gpu/drm/exynos/exynos_drm_crtc.h
drivers/gpu/drm/exynos/exynos_drm_dpi.c
drivers/gpu/drm/exynos/exynos_drm_dsi.c
drivers/gpu/drm/exynos/exynos_drm_vidi.c
drivers/gpu/drm/exynos/exynos_hdmi.c

index 385537b726a6acdcb990d5801aa3415fbac05d49..39629e7a80b9804e26e1219935c4fa727da84cfc 100644 (file)
@@ -155,7 +155,7 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
        struct exynos_dp_device *dp = dev_get_drvdata(dev);
        struct drm_encoder *encoder = &dp->encoder;
        struct drm_device *drm_dev = data;
-       int pipe, ret;
+       int ret;
 
        /*
         * Just like the probe function said, we don't need the
@@ -179,20 +179,15 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
                        return ret;
        }
 
-       pipe = exynos_drm_crtc_get_pipe_from_type(drm_dev,
-                                                 EXYNOS_DISPLAY_TYPE_LCD);
-       if (pipe < 0)
-               return pipe;
-
-       encoder->possible_crtcs = 1 << pipe;
-
-       DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
-
        drm_encoder_init(drm_dev, encoder, &exynos_dp_encoder_funcs,
                         DRM_MODE_ENCODER_TMDS, NULL);
 
        drm_encoder_helper_add(encoder, &exynos_dp_encoder_helper_funcs);
 
+       ret = exynos_drm_set_possible_crtcs(encoder, EXYNOS_DISPLAY_TYPE_LCD);
+       if (ret < 0)
+               return ret;
+
        dp->plat_data.encoder = encoder;
 
        return analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data);
index edbd98ff293ec913008e7ec60cee20d85c54fa56..b0c0621fcdf7202db041f322749419f4b4665a79 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include <drm/drmP.h>
+
 #include "exynos_drm_drv.h"
 #include "exynos_drm_crtc.h"
 
index c37078fbe0ea4181c16391b134e5e650da7fe806..ac544de73c828434ebb27498d6cc807c1941c36a 100644 (file)
@@ -16,6 +16,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_encoder.h>
 
 #include "exynos_drm_crtc.h"
 #include "exynos_drm_drv.h"
@@ -191,16 +192,30 @@ err_crtc:
        return ERR_PTR(ret);
 }
 
-int exynos_drm_crtc_get_pipe_from_type(struct drm_device *drm_dev,
+struct exynos_drm_crtc *exynos_drm_crtc_get_by_type(struct drm_device *drm_dev,
                                       enum exynos_drm_output_type out_type)
 {
        struct drm_crtc *crtc;
 
        drm_for_each_crtc(crtc, drm_dev)
                if (to_exynos_crtc(crtc)->type == out_type)
-                       return drm_crtc_index(crtc);
+                       return to_exynos_crtc(crtc);
 
-       return -EPERM;
+       return ERR_PTR(-EPERM);
+}
+
+int exynos_drm_set_possible_crtcs(struct drm_encoder *encoder,
+               enum exynos_drm_output_type out_type)
+{
+       struct exynos_drm_crtc *crtc = exynos_drm_crtc_get_by_type(encoder->dev,
+                                               out_type);
+
+       if (IS_ERR(crtc))
+               return PTR_ERR(crtc);
+
+       encoder->possible_crtcs = drm_crtc_mask(&crtc->base);
+
+       return 0;
 }
 
 void exynos_drm_crtc_te_handler(struct drm_crtc *crtc)
index ef58b64e3d2d4f65f2e9df202ca87d0911690367..dec446109e6c2a39b5f6c80704a674dd27205d39 100644 (file)
 #ifndef _EXYNOS_DRM_CRTC_H_
 #define _EXYNOS_DRM_CRTC_H_
 
+
 #include "exynos_drm_drv.h"
 
 struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev,
                                        struct drm_plane *plane,
-                                       enum exynos_drm_output_type type,
+                                       enum exynos_drm_output_type out_type,
                                        const struct exynos_drm_crtc_ops *ops,
                                        void *context);
 void exynos_drm_crtc_wait_pending_update(struct exynos_drm_crtc *exynos_crtc);
 void exynos_drm_crtc_finish_update(struct exynos_drm_crtc *exynos_crtc,
                                   struct exynos_drm_plane *exynos_plane);
 
-/* This function gets pipe value to crtc device matched with out_type. */
-int exynos_drm_crtc_get_pipe_from_type(struct drm_device *drm_dev,
+/* This function gets crtc device matched with out_type. */
+struct exynos_drm_crtc *exynos_drm_crtc_get_by_type(struct drm_device *drm_dev,
                                       enum exynos_drm_output_type out_type);
 
+int exynos_drm_set_possible_crtcs(struct drm_encoder *encoder,
+               enum exynos_drm_output_type out_type);
+
 /*
  * This function calls the crtc device(manager)'s te_handler() callback
  * to trigger to transfer video image at the tearing effect synchronization
index 76d80e5de521501a04b7aff5a08df5e32f423608..66945e0dc57fc6c723fe8e891a0fa655d9358354 100644 (file)
@@ -202,19 +202,15 @@ int exynos_dpi_bind(struct drm_device *dev, struct drm_encoder *encoder)
 {
        int ret;
 
-       ret = exynos_drm_crtc_get_pipe_from_type(dev, EXYNOS_DISPLAY_TYPE_LCD);
-       if (ret < 0)
-               return ret;
-
-       encoder->possible_crtcs = 1 << ret;
-
-       DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
-
        drm_encoder_init(dev, encoder, &exynos_dpi_encoder_funcs,
                         DRM_MODE_ENCODER_TMDS, NULL);
 
        drm_encoder_helper_add(encoder, &exynos_dpi_encoder_helper_funcs);
 
+       ret = exynos_drm_set_possible_crtcs(encoder, EXYNOS_DISPLAY_TYPE_LCD);
+       if (ret < 0)
+               return ret;
+
        ret = exynos_dpi_create_connector(encoder);
        if (ret) {
                DRM_ERROR("failed to create connector ret = %d\n", ret);
index c399dc9b325f640f51b6da03d3fb83c9bf2a33bb..6b46df65dc216578a3fbcf45df3d142021076db5 100644 (file)
@@ -1662,20 +1662,15 @@ static int exynos_dsi_bind(struct device *dev, struct device *master,
        struct drm_bridge *bridge;
        int ret;
 
-       ret = exynos_drm_crtc_get_pipe_from_type(drm_dev,
-                                                 EXYNOS_DISPLAY_TYPE_LCD);
-       if (ret < 0)
-               return ret;
-
-       encoder->possible_crtcs = 1 << ret;
-
-       DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
-
        drm_encoder_init(drm_dev, encoder, &exynos_dsi_encoder_funcs,
                         DRM_MODE_ENCODER_TMDS, NULL);
 
        drm_encoder_helper_add(encoder, &exynos_dsi_encoder_helper_funcs);
 
+       ret = exynos_drm_set_possible_crtcs(encoder, EXYNOS_DISPLAY_TYPE_LCD);
+       if (ret < 0)
+               return ret;
+
        ret = exynos_dsi_create_connector(encoder);
        if (ret) {
                DRM_ERROR("failed to create connector ret = %d\n", ret);
index 9186a654c3b5f443fbb0db5f188388e29eca1efc..53e03f8af3d5ecd4dda4ec649a4e17017cc693c4 100644 (file)
@@ -381,7 +381,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
        struct exynos_drm_plane *exynos_plane;
        struct exynos_drm_plane_config plane_config = { 0 };
        unsigned int i;
-       int pipe, ret;
+       int ret;
 
        ctx->drm_dev = drm_dev;
 
@@ -406,20 +406,15 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
                return PTR_ERR(ctx->crtc);
        }
 
-       pipe = exynos_drm_crtc_get_pipe_from_type(drm_dev,
-                                                 EXYNOS_DISPLAY_TYPE_VIDI);
-       if (pipe < 0)
-               return pipe;
-
-       encoder->possible_crtcs = 1 << pipe;
-
-       DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
-
        drm_encoder_init(drm_dev, encoder, &exynos_vidi_encoder_funcs,
                         DRM_MODE_ENCODER_TMDS, NULL);
 
        drm_encoder_helper_add(encoder, &exynos_vidi_encoder_helper_funcs);
 
+       ret = exynos_drm_set_possible_crtcs(encoder, EXYNOS_DISPLAY_TYPE_VIDI);
+       if (ret < 0)
+               return ret;
+
        ret = vidi_create_connector(encoder);
        if (ret) {
                DRM_ERROR("failed to create connector ret = %d\n", ret);
index d70eeb8c5f75117d7c557a095aef701057416c4a..214fa5e51963898ee5288f98d536681cdbebdcd6 100644 (file)
@@ -1697,32 +1697,25 @@ static int hdmi_bind(struct device *dev, struct device *master, void *data)
        struct drm_device *drm_dev = data;
        struct hdmi_context *hdata = dev_get_drvdata(dev);
        struct drm_encoder *encoder = &hdata->encoder;
-       struct exynos_drm_crtc *exynos_crtc;
-       struct drm_crtc *crtc;
-       int ret, pipe;
+       struct exynos_drm_crtc *crtc;
+       int ret;
 
        hdata->drm_dev = drm_dev;
 
-       pipe = exynos_drm_crtc_get_pipe_from_type(drm_dev,
-                                                 EXYNOS_DISPLAY_TYPE_HDMI);
-       if (pipe < 0)
-               return pipe;
-
        hdata->phy_clk.enable = hdmiphy_clk_enable;
 
-       crtc = drm_crtc_from_index(drm_dev, pipe);
-       exynos_crtc = to_exynos_crtc(crtc);
-       exynos_crtc->pipe_clk = &hdata->phy_clk;
-
-       encoder->possible_crtcs = 1 << pipe;
-
-       DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
-
        drm_encoder_init(drm_dev, encoder, &exynos_hdmi_encoder_funcs,
                         DRM_MODE_ENCODER_TMDS, NULL);
 
        drm_encoder_helper_add(encoder, &exynos_hdmi_encoder_helper_funcs);
 
+       ret = exynos_drm_set_possible_crtcs(encoder, EXYNOS_DISPLAY_TYPE_HDMI);
+       if (ret < 0)
+               return ret;
+
+       crtc = exynos_drm_crtc_get_by_type(drm_dev, EXYNOS_DISPLAY_TYPE_HDMI);
+       crtc->pipe_clk = &hdata->phy_clk;
+
        ret = hdmi_create_connector(encoder);
        if (ret) {
                DRM_ERROR("failed to create connector ret = %d\n", ret);