drm/exynos: Use manager_op initialize in fimd
authorSean Paul <seanpaul@chromium.org>
Thu, 30 Jan 2014 21:19:04 +0000 (16:19 -0500)
committerInki Dae <daeinki@gmail.com>
Sun, 23 Mar 2014 15:36:28 +0000 (00:36 +0900)
This patch implements the intitialize manager op in fimd. This will
allow us to keep track of drm_dev in context instead of using subdev,
which in turn makes it easier to remove subdev from fimd.

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

index bc4001eeb06ad8eb32439acc78e401b204167931..f06a0a99e77e0dd6b9833947804aeae55baa3244 100644 (file)
@@ -106,6 +106,7 @@ struct fimd_win_data {
 
 struct fimd_context {
        struct exynos_drm_subdrv        subdrv;
+       struct drm_device               *drm_dev;
        int                             irq;
        struct drm_crtc                 *crtc;
        struct clk                      *bus_clk;
@@ -181,6 +182,16 @@ static struct exynos_drm_display_ops fimd_display_ops = {
        .power_on = fimd_display_power_on,
 };
 
+static int fimd_mgr_initialize(struct device *subdrv_dev,
+               struct drm_device *drm_dev)
+{
+       struct fimd_context *ctx = get_fimd_context(subdrv_dev);
+
+       ctx->drm_dev = drm_dev;
+
+       return 0;
+}
+
 static void fimd_dpms(struct device *subdrv_dev, int mode)
 {
        struct fimd_context *ctx = get_fimd_context(subdrv_dev);
@@ -660,6 +671,7 @@ static void fimd_win_disable(struct device *dev, int zpos)
 }
 
 static struct exynos_drm_manager_ops fimd_manager_ops = {
+       .initialize = fimd_mgr_initialize,
        .dpms = fimd_dpms,
        .apply = fimd_apply,
        .commit = fimd_commit,
@@ -681,7 +693,6 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
 {
        struct fimd_context *ctx = (struct fimd_context *)dev_id;
        struct exynos_drm_subdrv *subdrv = &ctx->subdrv;
-       struct drm_device *drm_dev = subdrv->drm_dev;
        struct exynos_drm_manager *manager = subdrv->manager;
        u32 val;
 
@@ -692,11 +703,11 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
                writel(VIDINTCON1_INT_FRAME, ctx->regs + VIDINTCON1);
 
        /* check the crtc is detached already from encoder */
-       if (manager->pipe < 0)
+       if (manager->pipe < 0 || !ctx->drm_dev)
                goto out;
 
-       drm_handle_vblank(drm_dev, manager->pipe);
-       exynos_drm_crtc_finish_pageflip(drm_dev, manager->pipe);
+       drm_handle_vblank(ctx->drm_dev, manager->pipe);
+       exynos_drm_crtc_finish_pageflip(ctx->drm_dev, manager->pipe);
 
        /* set wait vsync event to zero and wake up queue. */
        if (atomic_read(&ctx->wait_vsync_event)) {