[PATCH] drm/exynos: move finish page flip to a common place
Inki Dae
inki.dae at samsung.com
Sun Jan 6 21:01:18 PST 2013
Applied.
Thanks,
Inki Dae
2013/1/3 Rahul Sharma <rahul.sharma at samsung.com>:
> This patch implements the exynos_drm_crtc_finish_pageflip in
> exynos_drm_crtc.c. This avoids the duplication of same code
> in mixer, fimd and vidi.
>
> Signed-off-by: Rahul Sharma <rahul.sharma at samsung.com>
> Signed-off-by: Stephane Marchesin <marcheu at chromium.org>
> ---
> This patch is based on branch "exynos-drm-next" at
> http://git.kernel.org/?p=linux/kernel/git/daeinki/drm-exynos.git
>
> drivers/gpu/drm/exynos/exynos_drm_crtc.c | 30 +++++++++++++++++++++++++++++
> drivers/gpu/drm/exynos/exynos_drm_crtc.h | 1 +
> drivers/gpu/drm/exynos/exynos_drm_fimd.c | 30 +----------------------------
> drivers/gpu/drm/exynos/exynos_drm_vidi.c | 30 +----------------------------
> drivers/gpu/drm/exynos/exynos_mixer.c | 33 +++-----------------------------
> 5 files changed, 36 insertions(+), 88 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> index d59a03a..e8894bc 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> @@ -393,3 +393,33 @@ void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc)
> exynos_drm_fn_encoder(private->crtc[crtc], &crtc,
> exynos_drm_disable_vblank);
> }
> +
> +void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc)
> +{
> + struct exynos_drm_private *dev_priv = dev->dev_private;
> + struct drm_pending_vblank_event *e, *t;
> + struct timeval now;
> + unsigned long flags;
> +
> + DRM_DEBUG_KMS("%s\n", __FILE__);
> +
> + spin_lock_irqsave(&dev->event_lock, flags);
> +
> + list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
> + base.link) {
> + /* if event's pipe isn't same as crtc then ignore it. */
> + if (crtc != e->pipe)
> + continue;
> +
> + do_gettimeofday(&now);
> + e->event.sequence = 0;
> + e->event.tv_sec = now.tv_sec;
> + e->event.tv_usec = now.tv_usec;
> +
> + list_move_tail(&e->base.link, &e->base.file_priv->event_list);
> + wake_up_interruptible(&e->base.file_priv->event_wait);
> + drm_vblank_put(dev, crtc);
> + }
> +
> + spin_unlock_irqrestore(&dev->event_lock, flags);
> +}
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.h b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
> index 8ac3969..3e197e6 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
> @@ -18,5 +18,6 @@
> int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr);
> int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc);
> void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc);
> +void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc);
>
> #endif
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> index bf0d9ba..6dda825 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> @@ -663,34 +663,6 @@ static struct exynos_drm_manager fimd_manager = {
> .display_ops = &fimd_display_ops,
> };
>
> -static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc)
> -{
> - struct exynos_drm_private *dev_priv = drm_dev->dev_private;
> - struct drm_pending_vblank_event *e, *t;
> - struct timeval now;
> - unsigned long flags;
> -
> - spin_lock_irqsave(&drm_dev->event_lock, flags);
> -
> - list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
> - base.link) {
> - /* if event's pipe isn't same as crtc then ignore it. */
> - if (crtc != e->pipe)
> - continue;
> -
> - do_gettimeofday(&now);
> - e->event.sequence = 0;
> - e->event.tv_sec = now.tv_sec;
> - e->event.tv_usec = now.tv_usec;
> -
> - list_move_tail(&e->base.link, &e->base.file_priv->event_list);
> - wake_up_interruptible(&e->base.file_priv->event_wait);
> - drm_vblank_put(drm_dev, crtc);
> - }
> -
> - spin_unlock_irqrestore(&drm_dev->event_lock, flags);
> -}
> -
> static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
> {
> struct fimd_context *ctx = (struct fimd_context *)dev_id;
> @@ -710,7 +682,7 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
> goto out;
>
> drm_handle_vblank(drm_dev, manager->pipe);
> - fimd_finish_pageflip(drm_dev, manager->pipe);
> + exynos_drm_crtc_finish_pageflip(drm_dev, manager->pipe);
>
> /* set wait vsync event to zero and wake up queue. */
> if (atomic_read(&ctx->wait_vsync_event)) {
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> index 3260035..b192308 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> @@ -379,34 +379,6 @@ static struct exynos_drm_manager vidi_manager = {
> .display_ops = &vidi_display_ops,
> };
>
> -static void vidi_finish_pageflip(struct drm_device *drm_dev, int crtc)
> -{
> - struct exynos_drm_private *dev_priv = drm_dev->dev_private;
> - struct drm_pending_vblank_event *e, *t;
> - struct timeval now;
> - unsigned long flags;
> -
> - spin_lock_irqsave(&drm_dev->event_lock, flags);
> -
> - list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
> - base.link) {
> - /* if event's pipe isn't same as crtc then ignore it. */
> - if (crtc != e->pipe)
> - continue;
> -
> - do_gettimeofday(&now);
> - e->event.sequence = 0;
> - e->event.tv_sec = now.tv_sec;
> - e->event.tv_usec = now.tv_usec;
> -
> - list_move_tail(&e->base.link, &e->base.file_priv->event_list);
> - wake_up_interruptible(&e->base.file_priv->event_wait);
> - drm_vblank_put(drm_dev, crtc);
> - }
> -
> - spin_unlock_irqrestore(&drm_dev->event_lock, flags);
> -}
> -
> static void vidi_fake_vblank_handler(struct work_struct *work)
> {
> struct vidi_context *ctx = container_of(work, struct vidi_context,
> @@ -431,7 +403,7 @@ static void vidi_fake_vblank_handler(struct work_struct *work)
>
> mutex_unlock(&ctx->lock);
>
> - vidi_finish_pageflip(subdrv->drm_dev, manager->pipe);
> + exynos_drm_crtc_finish_pageflip(subdrv->drm_dev, manager->pipe);
> }
>
> static int vidi_subdrv_probe(struct drm_device *drm_dev, struct device *dev)
> diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c
> index 21db895..e9dbf79 100644
> --- a/drivers/gpu/drm/exynos/exynos_mixer.c
> +++ b/drivers/gpu/drm/exynos/exynos_mixer.c
> @@ -35,6 +35,7 @@
> #include <drm/exynos_drm.h>
>
> #include "exynos_drm_drv.h"
> +#include "exynos_drm_crtc.h"
> #include "exynos_drm_hdmi.h"
> #include "exynos_drm_iommu.h"
>
> @@ -949,35 +950,6 @@ static struct exynos_mixer_ops mixer_ops = {
> .win_disable = mixer_win_disable,
> };
>
> -/* for pageflip event */
> -static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc)
> -{
> - struct exynos_drm_private *dev_priv = drm_dev->dev_private;
> - struct drm_pending_vblank_event *e, *t;
> - struct timeval now;
> - unsigned long flags;
> -
> - spin_lock_irqsave(&drm_dev->event_lock, flags);
> -
> - list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
> - base.link) {
> - /* if event's pipe isn't same as crtc then ignore it. */
> - if (crtc != e->pipe)
> - continue;
> -
> - do_gettimeofday(&now);
> - e->event.sequence = 0;
> - e->event.tv_sec = now.tv_sec;
> - e->event.tv_usec = now.tv_usec;
> -
> - list_move_tail(&e->base.link, &e->base.file_priv->event_list);
> - wake_up_interruptible(&e->base.file_priv->event_wait);
> - drm_vblank_put(drm_dev, crtc);
> - }
> -
> - spin_unlock_irqrestore(&drm_dev->event_lock, flags);
> -}
> -
> static irqreturn_t mixer_irq_handler(int irq, void *arg)
> {
> struct exynos_drm_hdmi_context *drm_hdmi_ctx = arg;
> @@ -1006,7 +978,8 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg)
> }
>
> drm_handle_vblank(drm_hdmi_ctx->drm_dev, ctx->pipe);
> - mixer_finish_pageflip(drm_hdmi_ctx->drm_dev, ctx->pipe);
> + exynos_drm_crtc_finish_pageflip(drm_hdmi_ctx->drm_dev,
> + ctx->pipe);
>
> /* set wait vsync event to zero and wake up queue. */
> if (atomic_read(&ctx->wait_vsync_event)) {
> --
> 1.8.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list