aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/exynos/exynos_drm_fb.c
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-12-13 23:39:03 -0500
committerInki Dae <inki.dae@samsung.com>2012-12-13 23:40:41 -0500
commitf2c0095acbf250b0e7a714bc42f7f32ddb34cfdf (patch)
treea2ed8479628709178a0db3eb786eda5f9a608f8d /drivers/gpu/drm/exynos/exynos_drm_fb.c
parenta0e41b562b3e302b47f887056d89189b816ce219 (diff)
drm/exynos: reorder framebuffer init sequence
For user framebuffers it's easier to just inline the exynos_drm_framebuffer_init helper instead of trying to adjust it - most of the things that helper sets up need to be overwritten anyway again due to the multiple backing storage objects support exynos has, but does not use for the fbdev. Changelog v2: - fix NULL point issue to first gem object of exynos drm framebuffer. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Inki Dae <inki.dae@samsung.com>
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_fb.c')
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fb.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c
index 764571c9625..5426cc5a5e8 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fb.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c
@@ -177,6 +177,7 @@ exynos_drm_framebuffer_init(struct drm_device *dev,
177 return ERR_PTR(-ENOMEM); 177 return ERR_PTR(-ENOMEM);
178 } 178 }
179 179
180 drm_helper_mode_fill_fb_struct(&exynos_fb->fb, mode_cmd);
180 exynos_fb->exynos_gem_obj[0] = exynos_gem_obj; 181 exynos_fb->exynos_gem_obj[0] = exynos_gem_obj;
181 182
182 ret = drm_framebuffer_init(dev, &exynos_fb->fb, &exynos_drm_fb_funcs); 183 ret = drm_framebuffer_init(dev, &exynos_fb->fb, &exynos_drm_fb_funcs);
@@ -185,8 +186,6 @@ exynos_drm_framebuffer_init(struct drm_device *dev,
185 return ERR_PTR(ret); 186 return ERR_PTR(ret);
186 } 187 }
187 188
188 drm_helper_mode_fill_fb_struct(&exynos_fb->fb, mode_cmd);
189
190 return &exynos_fb->fb; 189 return &exynos_fb->fb;
191} 190}
192 191
@@ -232,9 +231,8 @@ exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
232 struct drm_mode_fb_cmd2 *mode_cmd) 231 struct drm_mode_fb_cmd2 *mode_cmd)
233{ 232{
234 struct drm_gem_object *obj; 233 struct drm_gem_object *obj;
235 struct drm_framebuffer *fb;
236 struct exynos_drm_fb *exynos_fb; 234 struct exynos_drm_fb *exynos_fb;
237 int i; 235 int i, ret;
238 236
239 DRM_DEBUG_KMS("%s\n", __FILE__); 237 DRM_DEBUG_KMS("%s\n", __FILE__);
240 238
@@ -244,13 +242,14 @@ exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
244 return ERR_PTR(-ENOENT); 242 return ERR_PTR(-ENOENT);
245 } 243 }
246 244
247 fb = exynos_drm_framebuffer_init(dev, mode_cmd, obj); 245 exynos_fb = kzalloc(sizeof(*exynos_fb), GFP_KERNEL);
248 if (IS_ERR(fb)) { 246 if (!exynos_fb) {
249 drm_gem_object_unreference_unlocked(obj); 247 DRM_ERROR("failed to allocate exynos drm framebuffer\n");
250 return fb; 248 return ERR_PTR(-ENOMEM);
251 } 249 }
252 250
253 exynos_fb = to_exynos_fb(fb); 251 drm_helper_mode_fill_fb_struct(&exynos_fb->fb, mode_cmd);
252 exynos_fb->exynos_gem_obj[0] = to_exynos_gem_obj(obj);
254 exynos_fb->buf_cnt = exynos_drm_format_num_buffers(mode_cmd); 253 exynos_fb->buf_cnt = exynos_drm_format_num_buffers(mode_cmd);
255 254
256 DRM_DEBUG_KMS("buf_cnt = %d\n", exynos_fb->buf_cnt); 255 DRM_DEBUG_KMS("buf_cnt = %d\n", exynos_fb->buf_cnt);
@@ -263,7 +262,7 @@ exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
263 mode_cmd->handles[i]); 262 mode_cmd->handles[i]);
264 if (!obj) { 263 if (!obj) {
265 DRM_ERROR("failed to lookup gem object\n"); 264 DRM_ERROR("failed to lookup gem object\n");
266 exynos_drm_fb_destroy(fb); 265 kfree(exynos_fb);
267 return ERR_PTR(-ENOENT); 266 return ERR_PTR(-ENOENT);
268 } 267 }
269 268
@@ -272,14 +271,27 @@ exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
272 ret = check_fb_gem_memory_type(dev, exynos_gem_obj); 271 ret = check_fb_gem_memory_type(dev, exynos_gem_obj);
273 if (ret < 0) { 272 if (ret < 0) {
274 DRM_ERROR("cannot use this gem memory type for fb.\n"); 273 DRM_ERROR("cannot use this gem memory type for fb.\n");
275 exynos_drm_fb_destroy(fb); 274 kfree(exynos_fb);
276 return ERR_PTR(ret); 275 return ERR_PTR(ret);
277 } 276 }
278 277
279 exynos_fb->exynos_gem_obj[i] = to_exynos_gem_obj(obj); 278 exynos_fb->exynos_gem_obj[i] = to_exynos_gem_obj(obj);
280 } 279 }
281 280
282 return fb; 281 ret = drm_framebuffer_init(dev, &exynos_fb->fb, &exynos_drm_fb_funcs);
282 if (ret) {
283 for (i = 0; i < exynos_fb->buf_cnt; i++) {
284 struct exynos_drm_gem_obj *gem_obj;
285
286 gem_obj = exynos_fb->exynos_gem_obj[i];
287 drm_gem_object_unreference_unlocked(&gem_obj->base);
288 }
289
290 kfree(exynos_fb);
291 return ERR_PTR(ret);
292 }
293
294 return &exynos_fb->fb;
283} 295}
284 296
285struct exynos_drm_gem_buf *exynos_drm_fb_buffer(struct drm_framebuffer *fb, 297struct exynos_drm_gem_buf *exynos_drm_fb_buffer(struct drm_framebuffer *fb,