diff options
author | Gustavo Padovan <gustavo.padovan@collabora.co.uk> | 2015-01-18 12:16:23 +0300 |
---|---|---|
committer | Inki Dae <daeinki@gmail.com> | 2015-01-25 15:28:07 +0300 |
commit | 93bca243ec96f0acb949d4aa2306f07467e89985 (patch) | |
tree | a93ec737fee887d2b73999d229273b191813276f /drivers/gpu/drm/exynos/exynos_drm_crtc.c | |
parent | eb88e422c502a7a1628cc919020e2ebf59450d4d (diff) | |
download | linux-93bca243ec96f0acb949d4aa2306f07467e89985.tar.xz |
drm/exynos: remove struct exynos_drm_manager
exynos_drm_manager was just a redundant struct to represent the crtc as
well. In this commit we merge exynos_drm_manager into exynos_drm_crtc to
remove an unnecessary level of indirection easing the understand of the
flow on exynos.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_crtc.c')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_crtc.c | 67 |
1 files changed, 32 insertions, 35 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index 1eb5750a59c9..9e8ed5fd60ae 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c @@ -23,7 +23,6 @@ static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode) { struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); - struct exynos_drm_manager *manager = exynos_crtc->manager; DRM_DEBUG_KMS("crtc[%d] mode[%d]\n", crtc->base.id, mode); @@ -41,8 +40,8 @@ static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode) drm_crtc_vblank_off(crtc); } - if (manager->ops->dpms) - manager->ops->dpms(manager, mode); + if (exynos_crtc->ops->dpms) + exynos_crtc->ops->dpms(exynos_crtc, mode); exynos_crtc->dpms = mode; @@ -58,16 +57,15 @@ static void exynos_drm_crtc_prepare(struct drm_crtc *crtc) static void exynos_drm_crtc_commit(struct drm_crtc *crtc) { struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); - struct exynos_drm_manager *manager = exynos_crtc->manager; struct exynos_drm_plane *exynos_plane = to_exynos_plane(crtc->primary); exynos_drm_crtc_dpms(crtc, DRM_MODE_DPMS_ON); - if (manager->ops->win_commit) - manager->ops->win_commit(manager, exynos_plane->zpos); + if (exynos_crtc->ops->win_commit) + exynos_crtc->ops->win_commit(exynos_crtc, exynos_plane->zpos); - if (manager->ops->commit) - manager->ops->commit(manager); + if (exynos_crtc->ops->commit) + exynos_crtc->ops->commit(exynos_crtc); exynos_plane_dpms(crtc->primary, DRM_MODE_DPMS_ON); } @@ -78,10 +76,10 @@ exynos_drm_crtc_mode_fixup(struct drm_crtc *crtc, struct drm_display_mode *adjusted_mode) { struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); - struct exynos_drm_manager *manager = exynos_crtc->manager; - if (manager->ops->mode_fixup) - return manager->ops->mode_fixup(manager, mode, adjusted_mode); + if (exynos_crtc->ops->mode_fixup) + return exynos_crtc->ops->mode_fixup(exynos_crtc, mode, + adjusted_mode); return true; } @@ -92,7 +90,6 @@ exynos_drm_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode, struct drm_framebuffer *old_fb) { struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); - struct exynos_drm_manager *manager = exynos_crtc->manager; struct drm_framebuffer *fb = crtc->primary->fb; unsigned int crtc_w; unsigned int crtc_h; @@ -106,8 +103,8 @@ exynos_drm_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode, crtc_w = fb->width - x; crtc_h = fb->height - y; - if (manager->ops->mode_set) - manager->ops->mode_set(manager, &crtc->mode); + if (exynos_crtc->ops->mode_set) + exynos_crtc->ops->mode_set(exynos_crtc, &crtc->mode); return exynos_plane_mode_set(crtc->primary, crtc, fb, 0, 0, crtc_w, crtc_h, x, y, crtc_w, crtc_h); @@ -299,9 +296,11 @@ static void exynos_drm_crtc_attach_mode_property(struct drm_crtc *crtc) drm_object_attach_property(&crtc->base, prop, 0); } -int exynos_drm_crtc_create(struct exynos_drm_manager *manager, - struct drm_device *drm_dev, int pipe, - enum exynos_drm_output_type type) +struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev, + int pipe, + enum exynos_drm_output_type type, + struct exynos_drm_crtc_ops *ops, + void *ctx) { struct exynos_drm_crtc *exynos_crtc; struct drm_plane *plane; @@ -311,15 +310,16 @@ int exynos_drm_crtc_create(struct exynos_drm_manager *manager, exynos_crtc = kzalloc(sizeof(*exynos_crtc), GFP_KERNEL); if (!exynos_crtc) - return -ENOMEM; + return ERR_PTR(-ENOMEM); init_waitqueue_head(&exynos_crtc->pending_flip_queue); atomic_set(&exynos_crtc->pending_flip, 0); exynos_crtc->dpms = DRM_MODE_DPMS_OFF; - exynos_crtc->manager = manager; exynos_crtc->pipe = pipe; exynos_crtc->type = type; + exynos_crtc->ops = ops; + exynos_crtc->ctx = ctx; plane = exynos_plane_init(drm_dev, 1 << pipe, DRM_PLANE_TYPE_PRIMARY); if (IS_ERR(plane)) { @@ -327,7 +327,6 @@ int exynos_drm_crtc_create(struct exynos_drm_manager *manager, goto err_plane; } - manager->crtc = &exynos_crtc->base; crtc = &exynos_crtc->base; private->crtc[pipe] = crtc; @@ -341,13 +340,13 @@ int exynos_drm_crtc_create(struct exynos_drm_manager *manager, exynos_drm_crtc_attach_mode_property(crtc); - return 0; + return exynos_crtc; err_crtc: plane->funcs->destroy(plane); err_plane: kfree(exynos_crtc); - return ret; + return ERR_PTR(ret); } int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int pipe) @@ -355,13 +354,12 @@ int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int pipe) struct exynos_drm_private *private = dev->dev_private; struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(private->crtc[pipe]); - struct exynos_drm_manager *manager = exynos_crtc->manager; if (exynos_crtc->dpms != DRM_MODE_DPMS_ON) return -EPERM; - if (manager->ops->enable_vblank) - manager->ops->enable_vblank(manager); + if (exynos_crtc->ops->enable_vblank) + exynos_crtc->ops->enable_vblank(exynos_crtc); return 0; } @@ -371,13 +369,12 @@ void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int pipe) struct exynos_drm_private *private = dev->dev_private; struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(private->crtc[pipe]); - struct exynos_drm_manager *manager = exynos_crtc->manager; if (exynos_crtc->dpms != DRM_MODE_DPMS_ON) return; - if (manager->ops->disable_vblank) - manager->ops->disable_vblank(manager); + if (exynos_crtc->ops->disable_vblank) + exynos_crtc->ops->disable_vblank(exynos_crtc); } void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int pipe) @@ -408,7 +405,7 @@ void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int pipe) void exynos_drm_crtc_complete_scanout(struct drm_framebuffer *fb) { - struct exynos_drm_manager *manager; + struct exynos_drm_crtc *exynos_crtc; struct drm_device *dev = fb->dev; struct drm_crtc *crtc; @@ -417,15 +414,15 @@ void exynos_drm_crtc_complete_scanout(struct drm_framebuffer *fb) * for all encoders. */ list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { - manager = to_exynos_crtc(crtc)->manager; + exynos_crtc = to_exynos_crtc(crtc); /* * wait for vblank interrupt * - this makes sure that overlay data are updated to * real hardware. */ - if (manager->ops->wait_for_vblank) - manager->ops->wait_for_vblank(manager); + if (exynos_crtc->ops->wait_for_vblank) + exynos_crtc->ops->wait_for_vblank(exynos_crtc); } } @@ -447,8 +444,8 @@ int exynos_drm_crtc_get_pipe_from_type(struct drm_device *drm_dev, void exynos_drm_crtc_te_handler(struct drm_crtc *crtc) { - struct exynos_drm_manager *manager = to_exynos_crtc(crtc)->manager; + struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); - if (manager->ops->te_handler) - manager->ops->te_handler(manager); + if (exynos_crtc->ops->te_handler) + exynos_crtc->ops->te_handler(exynos_crtc); } |