drm/exynos: hdmi: Implement initialize op for hdmi
authorSean Paul <seanpaul@chromium.org>
Thu, 30 Jan 2014 21:19:05 +0000 (16:19 -0500)
committerInki Dae <daeinki@gmail.com>
Sun, 23 Mar 2014 15:36:28 +0000 (00:36 +0900)
This patch implements the initialize callback in the hdmi and mixer
manager. This allows us to get rid of drm_dev in the drm_hdmi level and
track it in the mixer and hdmi drivers. This is one of the things
holding back the complete removal of the drm_hdmi layer.

Signed-off-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_hdmi.c
drivers/gpu/drm/exynos/exynos_drm_hdmi.h
drivers/gpu/drm/exynos/exynos_hdmi.c
drivers/gpu/drm/exynos/exynos_mixer.c

index a1ef3c9..aebcc0e 100644 (file)
@@ -97,6 +97,18 @@ void exynos_mixer_ops_register(struct exynos_mixer_ops *ops)
                mixer_ops = ops;
 }
 
+static int drm_hdmi_display_initialize(struct device *dev,
+               struct drm_device *drm_dev)
+{
+       struct drm_hdmi_context *ctx = to_context(dev);
+
+       if (hdmi_ops && hdmi_ops->initialize)
+               return hdmi_ops->initialize(ctx->hdmi_ctx->ctx, drm_dev);
+
+       return 0;
+}
+
+
 static bool drm_hdmi_is_connected(struct device *dev)
 {
        struct drm_hdmi_context *ctx = to_context(dev);
@@ -153,6 +165,7 @@ static int drm_hdmi_power_on(struct device *dev, int mode)
 
 static struct exynos_drm_display_ops drm_hdmi_display_ops = {
        .type = EXYNOS_DISPLAY_TYPE_HDMI,
+       .initialize = drm_hdmi_display_initialize,
        .is_connected = drm_hdmi_is_connected,
        .get_edid = drm_hdmi_get_edid,
        .check_mode = drm_hdmi_check_mode,
@@ -257,6 +270,21 @@ static void drm_hdmi_commit(struct device *subdrv_dev)
                hdmi_ops->commit(ctx->hdmi_ctx->ctx);
 }
 
+static int drm_hdmi_mgr_initialize(struct device *subdrv_dev,
+               struct drm_device *drm_dev)
+{
+       struct drm_hdmi_context *ctx = to_context(subdrv_dev);
+       int ret = 0;
+
+       if (mixer_ops && mixer_ops->initialize)
+               ret = mixer_ops->initialize(ctx->mixer_ctx->ctx, drm_dev);
+
+       if (mixer_ops->iommu_on)
+               mixer_ops->iommu_on(ctx->mixer_ctx->ctx, true);
+
+       return ret;
+}
+
 static void drm_hdmi_dpms(struct device *subdrv_dev, int mode)
 {
        struct drm_hdmi_context *ctx = to_context(subdrv_dev);
@@ -326,6 +354,7 @@ static void drm_mixer_win_disable(struct device *subdrv_dev, int zpos)
 }
 
 static struct exynos_drm_manager_ops drm_hdmi_manager_ops = {
+       .initialize = drm_hdmi_mgr_initialize,
        .dpms = drm_hdmi_dpms,
        .apply = drm_hdmi_apply,
        .enable_vblank = drm_hdmi_enable_vblank,
@@ -372,12 +401,6 @@ static int hdmi_subdrv_probe(struct drm_device *drm_dev,
        ctx->hdmi_ctx = hdmi_ctx;
        ctx->mixer_ctx = mixer_ctx;
 
-       ctx->hdmi_ctx->drm_dev = drm_dev;
-       ctx->mixer_ctx->drm_dev = drm_dev;
-
-       if (mixer_ops->iommu_on)
-               mixer_ops->iommu_on(ctx->mixer_ctx->ctx, true);
-
        return 0;
 }
 
index 724cab1..cf7b1da 100644 (file)
  *     this context should be hdmi_context or mixer_context.
  */
 struct exynos_drm_hdmi_context {
-       struct drm_device       *drm_dev;
        void                    *ctx;
 };
 
 struct exynos_hdmi_ops {
        /* display */
+       int (*initialize)(void *ctx, struct drm_device *drm_dev);
        bool (*is_connected)(void *ctx);
        struct edid *(*get_edid)(void *ctx,
                        struct drm_connector *connector);
@@ -45,6 +45,7 @@ struct exynos_hdmi_ops {
 
 struct exynos_mixer_ops {
        /* manager */
+       int (*initialize)(void *ctx, struct drm_device *drm_dev);
        int (*iommu_on)(void *ctx, bool enable);
        int (*enable_vblank)(void *ctx, int pipe);
        void (*disable_vblank)(void *ctx);
Simple merge
Simple merge