Skip to content

Commit 0586feb

Browse files
Andrzej Hajdadaeinki
authored andcommitted
drm/exynos/decon5433: implement frame counter
DECON in Exynos5433 has frame counter, it can be used to implement get_vblank_counter callback. Signed-off-by: Andrzej Hajda <a.hajda@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com>
1 parent 73b7b44 commit 0586feb

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

drivers/gpu/drm/exynos/exynos5433_drm_decon.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,16 @@ static u32 decon_get_frame_count(struct decon_context *ctx, bool end)
166166
return frm;
167167
}
168168

169+
static u32 decon_get_vblank_counter(struct exynos_drm_crtc *crtc)
170+
{
171+
struct decon_context *ctx = crtc->ctx;
172+
173+
if (test_bit(BIT_SUSPENDED, &ctx->flags))
174+
return 0;
175+
176+
return decon_get_frame_count(ctx, false);
177+
}
178+
169179
static void decon_setup_trigger(struct decon_context *ctx)
170180
{
171181
if (!(ctx->out_type & (IFTYPE_I80 | I80_HW_TRG)))
@@ -564,6 +574,7 @@ static const struct exynos_drm_crtc_ops decon_crtc_ops = {
564574
.disable = decon_disable,
565575
.enable_vblank = decon_enable_vblank,
566576
.disable_vblank = decon_disable_vblank,
577+
.get_vblank_counter = decon_get_vblank_counter,
567578
.atomic_begin = decon_atomic_begin,
568579
.update_plane = decon_update_plane,
569580
.disable_plane = decon_disable_plane,
@@ -583,6 +594,7 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
583594

584595
ctx->drm_dev = drm_dev;
585596
ctx->pipe = priv->pipe++;
597+
drm_dev->max_vblank_count = 0xffffffff;
586598

587599
for (win = ctx->first_win; win < WINDOWS_NR; win++) {
588600
int tmp = (win == ctx->first_win) ? 0 : win;

drivers/gpu/drm/exynos/exynos_drm_crtc.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,16 @@ static void exynos_drm_crtc_disable_vblank(struct drm_crtc *crtc)
142142
exynos_crtc->ops->disable_vblank(exynos_crtc);
143143
}
144144

145+
static u32 exynos_drm_crtc_get_vblank_counter(struct drm_crtc *crtc)
146+
{
147+
struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
148+
149+
if (exynos_crtc->ops->get_vblank_counter)
150+
return exynos_crtc->ops->get_vblank_counter(exynos_crtc);
151+
152+
return 0;
153+
}
154+
145155
static const struct drm_crtc_funcs exynos_crtc_funcs = {
146156
.set_config = drm_atomic_helper_set_config,
147157
.page_flip = drm_atomic_helper_page_flip,
@@ -151,6 +161,7 @@ static const struct drm_crtc_funcs exynos_crtc_funcs = {
151161
.atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
152162
.enable_vblank = exynos_drm_crtc_enable_vblank,
153163
.disable_vblank = exynos_drm_crtc_disable_vblank,
164+
.get_vblank_counter = exynos_drm_crtc_get_vblank_counter,
154165
};
155166

156167
struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev,

drivers/gpu/drm/exynos/exynos_drm_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ struct exynos_drm_crtc_ops {
133133
void (*commit)(struct exynos_drm_crtc *crtc);
134134
int (*enable_vblank)(struct exynos_drm_crtc *crtc);
135135
void (*disable_vblank)(struct exynos_drm_crtc *crtc);
136+
u32 (*get_vblank_counter)(struct exynos_drm_crtc *crtc);
136137
int (*atomic_check)(struct exynos_drm_crtc *crtc,
137138
struct drm_crtc_state *state);
138139
void (*atomic_begin)(struct exynos_drm_crtc *crtc);

0 commit comments

Comments
 (0)