Skip to content

Commit 663d876

Browse files
Rahul Sharmadaeinki
authored andcommitted
drm/exynos: move finish page flip to a common place
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@samsung.com> Signed-off-by: Stephane Marchesin <marcheu@chromium.org> Signed-off-by: Inki Dae <inki.dae@samsung.com>
1 parent 28998af commit 663d876

File tree

5 files changed

+36
-88
lines changed

5 files changed

+36
-88
lines changed

drivers/gpu/drm/exynos/exynos_drm_crtc.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,3 +393,33 @@ void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc)
393393
exynos_drm_fn_encoder(private->crtc[crtc], &crtc,
394394
exynos_drm_disable_vblank);
395395
}
396+
397+
void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc)
398+
{
399+
struct exynos_drm_private *dev_priv = dev->dev_private;
400+
struct drm_pending_vblank_event *e, *t;
401+
struct timeval now;
402+
unsigned long flags;
403+
404+
DRM_DEBUG_KMS("%s\n", __FILE__);
405+
406+
spin_lock_irqsave(&dev->event_lock, flags);
407+
408+
list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
409+
base.link) {
410+
/* if event's pipe isn't same as crtc then ignore it. */
411+
if (crtc != e->pipe)
412+
continue;
413+
414+
do_gettimeofday(&now);
415+
e->event.sequence = 0;
416+
e->event.tv_sec = now.tv_sec;
417+
e->event.tv_usec = now.tv_usec;
418+
419+
list_move_tail(&e->base.link, &e->base.file_priv->event_list);
420+
wake_up_interruptible(&e->base.file_priv->event_wait);
421+
drm_vblank_put(dev, crtc);
422+
}
423+
424+
spin_unlock_irqrestore(&dev->event_lock, flags);
425+
}

drivers/gpu/drm/exynos/exynos_drm_crtc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@
1818
int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr);
1919
int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc);
2020
void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc);
21+
void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc);
2122

2223
#endif

drivers/gpu/drm/exynos/exynos_drm_fimd.c

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -663,34 +663,6 @@ static struct exynos_drm_manager fimd_manager = {
663663
.display_ops = &fimd_display_ops,
664664
};
665665

666-
static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc)
667-
{
668-
struct exynos_drm_private *dev_priv = drm_dev->dev_private;
669-
struct drm_pending_vblank_event *e, *t;
670-
struct timeval now;
671-
unsigned long flags;
672-
673-
spin_lock_irqsave(&drm_dev->event_lock, flags);
674-
675-
list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
676-
base.link) {
677-
/* if event's pipe isn't same as crtc then ignore it. */
678-
if (crtc != e->pipe)
679-
continue;
680-
681-
do_gettimeofday(&now);
682-
e->event.sequence = 0;
683-
e->event.tv_sec = now.tv_sec;
684-
e->event.tv_usec = now.tv_usec;
685-
686-
list_move_tail(&e->base.link, &e->base.file_priv->event_list);
687-
wake_up_interruptible(&e->base.file_priv->event_wait);
688-
drm_vblank_put(drm_dev, crtc);
689-
}
690-
691-
spin_unlock_irqrestore(&drm_dev->event_lock, flags);
692-
}
693-
694666
static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
695667
{
696668
struct fimd_context *ctx = (struct fimd_context *)dev_id;
@@ -710,7 +682,7 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
710682
goto out;
711683

712684
drm_handle_vblank(drm_dev, manager->pipe);
713-
fimd_finish_pageflip(drm_dev, manager->pipe);
685+
exynos_drm_crtc_finish_pageflip(drm_dev, manager->pipe);
714686

715687
/* set wait vsync event to zero and wake up queue. */
716688
if (atomic_read(&ctx->wait_vsync_event)) {

drivers/gpu/drm/exynos/exynos_drm_vidi.c

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -372,34 +372,6 @@ static struct exynos_drm_manager vidi_manager = {
372372
.display_ops = &vidi_display_ops,
373373
};
374374

375-
static void vidi_finish_pageflip(struct drm_device *drm_dev, int crtc)
376-
{
377-
struct exynos_drm_private *dev_priv = drm_dev->dev_private;
378-
struct drm_pending_vblank_event *e, *t;
379-
struct timeval now;
380-
unsigned long flags;
381-
382-
spin_lock_irqsave(&drm_dev->event_lock, flags);
383-
384-
list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
385-
base.link) {
386-
/* if event's pipe isn't same as crtc then ignore it. */
387-
if (crtc != e->pipe)
388-
continue;
389-
390-
do_gettimeofday(&now);
391-
e->event.sequence = 0;
392-
e->event.tv_sec = now.tv_sec;
393-
e->event.tv_usec = now.tv_usec;
394-
395-
list_move_tail(&e->base.link, &e->base.file_priv->event_list);
396-
wake_up_interruptible(&e->base.file_priv->event_wait);
397-
drm_vblank_put(drm_dev, crtc);
398-
}
399-
400-
spin_unlock_irqrestore(&drm_dev->event_lock, flags);
401-
}
402-
403375
static void vidi_fake_vblank_handler(struct work_struct *work)
404376
{
405377
struct vidi_context *ctx = container_of(work, struct vidi_context,
@@ -424,7 +396,7 @@ static void vidi_fake_vblank_handler(struct work_struct *work)
424396

425397
mutex_unlock(&ctx->lock);
426398

427-
vidi_finish_pageflip(subdrv->drm_dev, manager->pipe);
399+
exynos_drm_crtc_finish_pageflip(subdrv->drm_dev, manager->pipe);
428400
}
429401

430402
static int vidi_subdrv_probe(struct drm_device *drm_dev, struct device *dev)

drivers/gpu/drm/exynos/exynos_mixer.c

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include <drm/exynos_drm.h>
3636

3737
#include "exynos_drm_drv.h"
38+
#include "exynos_drm_crtc.h"
3839
#include "exynos_drm_hdmi.h"
3940
#include "exynos_drm_iommu.h"
4041

@@ -949,35 +950,6 @@ static struct exynos_mixer_ops mixer_ops = {
949950
.win_disable = mixer_win_disable,
950951
};
951952

952-
/* for pageflip event */
953-
static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc)
954-
{
955-
struct exynos_drm_private *dev_priv = drm_dev->dev_private;
956-
struct drm_pending_vblank_event *e, *t;
957-
struct timeval now;
958-
unsigned long flags;
959-
960-
spin_lock_irqsave(&drm_dev->event_lock, flags);
961-
962-
list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
963-
base.link) {
964-
/* if event's pipe isn't same as crtc then ignore it. */
965-
if (crtc != e->pipe)
966-
continue;
967-
968-
do_gettimeofday(&now);
969-
e->event.sequence = 0;
970-
e->event.tv_sec = now.tv_sec;
971-
e->event.tv_usec = now.tv_usec;
972-
973-
list_move_tail(&e->base.link, &e->base.file_priv->event_list);
974-
wake_up_interruptible(&e->base.file_priv->event_wait);
975-
drm_vblank_put(drm_dev, crtc);
976-
}
977-
978-
spin_unlock_irqrestore(&drm_dev->event_lock, flags);
979-
}
980-
981953
static irqreturn_t mixer_irq_handler(int irq, void *arg)
982954
{
983955
struct exynos_drm_hdmi_context *drm_hdmi_ctx = arg;
@@ -1006,7 +978,8 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg)
1006978
}
1007979

1008980
drm_handle_vblank(drm_hdmi_ctx->drm_dev, ctx->pipe);
1009-
mixer_finish_pageflip(drm_hdmi_ctx->drm_dev, ctx->pipe);
981+
exynos_drm_crtc_finish_pageflip(drm_hdmi_ctx->drm_dev,
982+
ctx->pipe);
1010983

1011984
/* set wait vsync event to zero and wake up queue. */
1012985
if (atomic_read(&ctx->wait_vsync_event)) {

0 commit comments

Comments
 (0)