aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm')
-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,