diff options
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fb.c | 36 |
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 764571c9625a..5426cc5a5e8d 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 | ||
285 | struct exynos_drm_gem_buf *exynos_drm_fb_buffer(struct drm_framebuffer *fb, | 297 | struct exynos_drm_gem_buf *exynos_drm_fb_buffer(struct drm_framebuffer *fb, |