aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/sun4i/sun4i_layer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/sun4i/sun4i_layer.c')
-rw-r--r--drivers/gpu/drm/sun4i/sun4i_layer.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.c b/drivers/gpu/drm/sun4i/sun4i_layer.c
index 78f77af8805a..29631e0efde3 100644
--- a/drivers/gpu/drm/sun4i/sun4i_layer.c
+++ b/drivers/gpu/drm/sun4i/sun4i_layer.c
@@ -12,6 +12,7 @@
12 12
13#include <drm/drm_atomic_helper.h> 13#include <drm/drm_atomic_helper.h>
14#include <drm/drm_plane_helper.h> 14#include <drm/drm_plane_helper.h>
15#include <drm/drm_gem_framebuffer_helper.h>
15#include <drm/drmP.h> 16#include <drm/drmP.h>
16 17
17#include "sun4i_backend.h" 18#include "sun4i_backend.h"
@@ -92,14 +93,16 @@ static void sun4i_backend_layer_atomic_update(struct drm_plane *plane,
92 struct sun4i_backend *backend = layer->backend; 93 struct sun4i_backend *backend = layer->backend;
93 struct sun4i_frontend *frontend = backend->frontend; 94 struct sun4i_frontend *frontend = backend->frontend;
94 95
96 sun4i_backend_cleanup_layer(backend, layer->id);
97
95 if (layer_state->uses_frontend) { 98 if (layer_state->uses_frontend) {
96 sun4i_frontend_init(frontend); 99 sun4i_frontend_init(frontend);
97 sun4i_frontend_update_coord(frontend, plane); 100 sun4i_frontend_update_coord(frontend, plane);
98 sun4i_frontend_update_buffer(frontend, plane); 101 sun4i_frontend_update_buffer(frontend, plane);
99 sun4i_frontend_update_formats(frontend, plane, 102 sun4i_frontend_update_formats(frontend, plane,
100 DRM_FORMAT_ARGB8888); 103 DRM_FORMAT_XRGB8888);
101 sun4i_backend_update_layer_frontend(backend, layer->id, 104 sun4i_backend_update_layer_frontend(backend, layer->id,
102 DRM_FORMAT_ARGB8888); 105 DRM_FORMAT_XRGB8888);
103 sun4i_frontend_enable(frontend); 106 sun4i_frontend_enable(frontend);
104 } else { 107 } else {
105 sun4i_backend_update_layer_formats(backend, layer->id, plane); 108 sun4i_backend_update_layer_formats(backend, layer->id, plane);
@@ -112,6 +115,7 @@ static void sun4i_backend_layer_atomic_update(struct drm_plane *plane,
112} 115}
113 116
114static const struct drm_plane_helper_funcs sun4i_backend_layer_helper_funcs = { 117static const struct drm_plane_helper_funcs sun4i_backend_layer_helper_funcs = {
118 .prepare_fb = drm_gem_fb_prepare_fb,
115 .atomic_disable = sun4i_backend_layer_atomic_disable, 119 .atomic_disable = sun4i_backend_layer_atomic_disable,
116 .atomic_update = sun4i_backend_layer_atomic_update, 120 .atomic_update = sun4i_backend_layer_atomic_update,
117}; 121};
@@ -125,10 +129,11 @@ static const struct drm_plane_funcs sun4i_backend_layer_funcs = {
125 .update_plane = drm_atomic_helper_update_plane, 129 .update_plane = drm_atomic_helper_update_plane,
126}; 130};
127 131
128static const uint32_t sun4i_backend_layer_formats[] = { 132static const uint32_t sun4i_layer_formats[] = {
129 DRM_FORMAT_ARGB8888, 133 DRM_FORMAT_ARGB8888,
130 DRM_FORMAT_ARGB4444, 134 DRM_FORMAT_ARGB4444,
131 DRM_FORMAT_ARGB1555, 135 DRM_FORMAT_ARGB1555,
136 DRM_FORMAT_BGRX8888,
132 DRM_FORMAT_RGBA5551, 137 DRM_FORMAT_RGBA5551,
133 DRM_FORMAT_RGBA4444, 138 DRM_FORMAT_RGBA4444,
134 DRM_FORMAT_RGB888, 139 DRM_FORMAT_RGB888,
@@ -154,8 +159,8 @@ static struct sun4i_layer *sun4i_layer_init_one(struct drm_device *drm,
154 /* possible crtcs are set later */ 159 /* possible crtcs are set later */
155 ret = drm_universal_plane_init(drm, &layer->plane, 0, 160 ret = drm_universal_plane_init(drm, &layer->plane, 0,
156 &sun4i_backend_layer_funcs, 161 &sun4i_backend_layer_funcs,
157 sun4i_backend_layer_formats, 162 sun4i_layer_formats,
158 ARRAY_SIZE(sun4i_backend_layer_formats), 163 ARRAY_SIZE(sun4i_layer_formats),
159 NULL, type, NULL); 164 NULL, type, NULL);
160 if (ret) { 165 if (ret) {
161 dev_err(drm->dev, "Couldn't initialize layer\n"); 166 dev_err(drm->dev, "Couldn't initialize layer\n");