diff options
author | Prathyush K <prathyush.k@samsung.com> | 2012-12-06 09:46:00 -0500 |
---|---|---|
committer | Inki Dae <daeinki@gmail.com> | 2012-12-13 09:05:43 -0500 |
commit | f74085a9f87087d70028dcc18563dba4a42ce32c (patch) | |
tree | 41099f6c1908f5002694e10be78414884da8ea80 /drivers | |
parent | a7b362fb3bba310426b90e7bac83a2206808e425 (diff) |
drm/exynos: make wait_for_vblank a manager op
Changelog v2:
remove unnecessay wait_for_vblank call.
- with this patch, wait_for_vblank callback is moved from
overlay ops to manager ops so it should be removed and
it doesn't need to wait vblank signal at plane disable.
Changelog v1:
The wait_for_vblank callback is moved from overlay ops to manager ops
of exynos drm driver. Also, the check for DPMS OFF of encoder is
removed before calling wait_for_vblank.
Signed-off-by: Prathyush K <prathyush.k@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_drv.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_encoder.c | 25 |
2 files changed, 7 insertions, 24 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h index a4702a83e03f..5a8c1f210450 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h | |||
@@ -74,8 +74,6 @@ enum exynos_drm_output_type { | |||
74 | * @commit: apply hardware specific overlay data to registers. | 74 | * @commit: apply hardware specific overlay data to registers. |
75 | * @enable: enable hardware specific overlay. | 75 | * @enable: enable hardware specific overlay. |
76 | * @disable: disable hardware specific overlay. | 76 | * @disable: disable hardware specific overlay. |
77 | * @wait_for_vblank: wait for vblank interrupt to make sure that | ||
78 | * hardware overlay is disabled. | ||
79 | */ | 77 | */ |
80 | struct exynos_drm_overlay_ops { | 78 | struct exynos_drm_overlay_ops { |
81 | void (*mode_set)(struct device *subdrv_dev, | 79 | void (*mode_set)(struct device *subdrv_dev, |
@@ -83,7 +81,6 @@ struct exynos_drm_overlay_ops { | |||
83 | void (*commit)(struct device *subdrv_dev, int zpos); | 81 | void (*commit)(struct device *subdrv_dev, int zpos); |
84 | void (*enable)(struct device *subdrv_dev, int zpos); | 82 | void (*enable)(struct device *subdrv_dev, int zpos); |
85 | void (*disable)(struct device *subdrv_dev, int zpos); | 83 | void (*disable)(struct device *subdrv_dev, int zpos); |
86 | void (*wait_for_vblank)(struct device *subdrv_dev); | ||
87 | }; | 84 | }; |
88 | 85 | ||
89 | /* | 86 | /* |
@@ -186,6 +183,8 @@ struct exynos_drm_display_ops { | |||
186 | * @commit: set current hw specific display mode to hw. | 183 | * @commit: set current hw specific display mode to hw. |
187 | * @enable_vblank: specific driver callback for enabling vblank interrupt. | 184 | * @enable_vblank: specific driver callback for enabling vblank interrupt. |
188 | * @disable_vblank: specific driver callback for disabling vblank interrupt. | 185 | * @disable_vblank: specific driver callback for disabling vblank interrupt. |
186 | * @wait_for_vblank: wait for vblank interrupt to make sure that | ||
187 | * hardware overlay is updated. | ||
189 | */ | 188 | */ |
190 | struct exynos_drm_manager_ops { | 189 | struct exynos_drm_manager_ops { |
191 | void (*dpms)(struct device *subdrv_dev, int mode); | 190 | void (*dpms)(struct device *subdrv_dev, int mode); |
@@ -200,6 +199,7 @@ struct exynos_drm_manager_ops { | |||
200 | void (*commit)(struct device *subdrv_dev); | 199 | void (*commit)(struct device *subdrv_dev); |
201 | int (*enable_vblank)(struct device *subdrv_dev); | 200 | int (*enable_vblank)(struct device *subdrv_dev); |
202 | void (*disable_vblank)(struct device *subdrv_dev); | 201 | void (*disable_vblank)(struct device *subdrv_dev); |
202 | void (*wait_for_vblank)(struct device *subdrv_dev); | ||
203 | }; | 203 | }; |
204 | 204 | ||
205 | /* | 205 | /* |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index e5001dd85afc..301485215a70 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c | |||
@@ -237,8 +237,7 @@ static void exynos_drm_encoder_commit(struct drm_encoder *encoder) | |||
237 | void exynos_drm_encoder_complete_scanout(struct drm_framebuffer *fb) | 237 | void exynos_drm_encoder_complete_scanout(struct drm_framebuffer *fb) |
238 | { | 238 | { |
239 | struct exynos_drm_encoder *exynos_encoder; | 239 | struct exynos_drm_encoder *exynos_encoder; |
240 | struct exynos_drm_overlay_ops *overlay_ops; | 240 | struct exynos_drm_manager_ops *ops; |
241 | struct exynos_drm_manager *manager; | ||
242 | struct drm_device *dev = fb->dev; | 241 | struct drm_device *dev = fb->dev; |
243 | struct drm_encoder *encoder; | 242 | struct drm_encoder *encoder; |
244 | 243 | ||
@@ -248,21 +247,15 @@ void exynos_drm_encoder_complete_scanout(struct drm_framebuffer *fb) | |||
248 | */ | 247 | */ |
249 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { | 248 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
250 | exynos_encoder = to_exynos_encoder(encoder); | 249 | exynos_encoder = to_exynos_encoder(encoder); |
251 | 250 | ops = exynos_encoder->manager->ops; | |
252 | /* if exynos was disabled, just ignor it. */ | ||
253 | if (exynos_encoder->dpms > DRM_MODE_DPMS_ON) | ||
254 | continue; | ||
255 | |||
256 | manager = exynos_encoder->manager; | ||
257 | overlay_ops = manager->overlay_ops; | ||
258 | 251 | ||
259 | /* | 252 | /* |
260 | * wait for vblank interrupt | 253 | * wait for vblank interrupt |
261 | * - this makes sure that overlay data are updated to | 254 | * - this makes sure that overlay data are updated to |
262 | * real hardware. | 255 | * real hardware. |
263 | */ | 256 | */ |
264 | if (overlay_ops->wait_for_vblank) | 257 | if (ops->wait_for_vblank) |
265 | overlay_ops->wait_for_vblank(manager->dev); | 258 | ops->wait_for_vblank(exynos_encoder->manager->dev); |
266 | } | 259 | } |
267 | } | 260 | } |
268 | 261 | ||
@@ -538,14 +531,4 @@ void exynos_drm_encoder_plane_disable(struct drm_encoder *encoder, void *data) | |||
538 | 531 | ||
539 | if (overlay_ops && overlay_ops->disable) | 532 | if (overlay_ops && overlay_ops->disable) |
540 | overlay_ops->disable(manager->dev, zpos); | 533 | overlay_ops->disable(manager->dev, zpos); |
541 | |||
542 | /* | ||
543 | * wait for vblank interrupt | ||
544 | * - this makes sure that hardware overlay is disabled to avoid | ||
545 | * for the dma accesses to memory after gem buffer was released | ||
546 | * because the setting for disabling the overlay will be updated | ||
547 | * at vsync. | ||
548 | */ | ||
549 | if (overlay_ops && overlay_ops->wait_for_vblank) | ||
550 | overlay_ops->wait_for_vblank(manager->dev); | ||
551 | } | 534 | } |