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, |
