diff options
author | Thierry Reding <treding@nvidia.com> | 2014-12-19 05:21:32 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-01-21 08:57:03 -0500 |
commit | 01934c2a691882185b3021d437df13bcba07711d (patch) | |
tree | 6e891d192b0e4bd35b4f00ee013ea9763d5dc48d | |
parent | 7119ad5f6b0ce222072b0c0b31c3b4ac87660afa (diff) |
drm/fb-helper: Propagate errors from initial config failure
Make drm_fb_helper_initial_config() return an int rather than a bool so
that the error can be properly propagated. While at it, update drivers
to propagate errors further rather than just ignore them.
v2:
- cirrus: No cleanup is required, the top-level cirrus_driver_load()
will do it as part of cirrus_driver_unload() in its cleanup path.
Reported-by: Fengguang Wu <fengguang.wu@intel.com>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Ben Skeggs <bskeggs@redhat.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
[danvet: Squash in simplification patch from kbuild.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/ast/ast_fb.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/bochs/bochs_fbdev.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/cirrus/cirrus_fbdev.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/gma500/framebuffer.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/mgag200/mgag200_fb.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_fbdev.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_fbcon.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_fbdev.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_fb.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_fb.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/udl/udl_fb.c | 22 | ||||
-rw-r--r-- | include/drm/drm_fb_helper.h | 2 |
13 files changed, 140 insertions, 51 deletions
diff --git a/drivers/gpu/drm/ast/ast_fb.c b/drivers/gpu/drm/ast/ast_fb.c index 5c60ae524c45..ff68eefae273 100644 --- a/drivers/gpu/drm/ast/ast_fb.c +++ b/drivers/gpu/drm/ast/ast_fb.c | |||
@@ -335,18 +335,27 @@ int ast_fbdev_init(struct drm_device *dev) | |||
335 | 335 | ||
336 | ret = drm_fb_helper_init(dev, &afbdev->helper, | 336 | ret = drm_fb_helper_init(dev, &afbdev->helper, |
337 | 1, 1); | 337 | 1, 1); |
338 | if (ret) { | 338 | if (ret) |
339 | kfree(afbdev); | 339 | goto free; |
340 | return ret; | ||
341 | } | ||
342 | 340 | ||
343 | drm_fb_helper_single_add_all_connectors(&afbdev->helper); | 341 | ret = drm_fb_helper_single_add_all_connectors(&afbdev->helper); |
342 | if (ret) | ||
343 | goto fini; | ||
344 | 344 | ||
345 | /* disable all the possible outputs/crtcs before entering KMS mode */ | 345 | /* disable all the possible outputs/crtcs before entering KMS mode */ |
346 | drm_helper_disable_unused_functions(dev); | 346 | drm_helper_disable_unused_functions(dev); |
347 | 347 | ||
348 | drm_fb_helper_initial_config(&afbdev->helper, 32); | 348 | ret = drm_fb_helper_initial_config(&afbdev->helper, 32); |
349 | if (ret) | ||
350 | goto fini; | ||
351 | |||
349 | return 0; | 352 | return 0; |
353 | |||
354 | fini: | ||
355 | drm_fb_helper_fini(&afbdev->helper); | ||
356 | free: | ||
357 | kfree(afbdev); | ||
358 | return ret; | ||
350 | } | 359 | } |
351 | 360 | ||
352 | void ast_fbdev_fini(struct drm_device *dev) | 361 | void ast_fbdev_fini(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c b/drivers/gpu/drm/bochs/bochs_fbdev.c index 61dbf09dff5d..976d9798dc99 100644 --- a/drivers/gpu/drm/bochs/bochs_fbdev.c +++ b/drivers/gpu/drm/bochs/bochs_fbdev.c | |||
@@ -207,12 +207,22 @@ int bochs_fbdev_init(struct bochs_device *bochs) | |||
207 | if (ret) | 207 | if (ret) |
208 | return ret; | 208 | return ret; |
209 | 209 | ||
210 | drm_fb_helper_single_add_all_connectors(&bochs->fb.helper); | 210 | ret = drm_fb_helper_single_add_all_connectors(&bochs->fb.helper); |
211 | if (ret) | ||
212 | goto fini; | ||
213 | |||
211 | drm_helper_disable_unused_functions(bochs->dev); | 214 | drm_helper_disable_unused_functions(bochs->dev); |
212 | drm_fb_helper_initial_config(&bochs->fb.helper, 32); | 215 | |
216 | ret = drm_fb_helper_initial_config(&bochs->fb.helper, 32); | ||
217 | if (ret) | ||
218 | goto fini; | ||
213 | 219 | ||
214 | bochs->fb.initialized = true; | 220 | bochs->fb.initialized = true; |
215 | return 0; | 221 | return 0; |
222 | |||
223 | fini: | ||
224 | drm_fb_helper_fini(&bochs->fb.helper); | ||
225 | return ret; | ||
216 | } | 226 | } |
217 | 227 | ||
218 | void bochs_fbdev_fini(struct bochs_device *bochs) | 228 | void bochs_fbdev_fini(struct bochs_device *bochs) |
diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c b/drivers/gpu/drm/cirrus/cirrus_fbdev.c index 502a89eb54b5..13ddf1c4bb8e 100644 --- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c +++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c | |||
@@ -317,17 +317,17 @@ int cirrus_fbdev_init(struct cirrus_device *cdev) | |||
317 | 317 | ||
318 | ret = drm_fb_helper_init(cdev->dev, &gfbdev->helper, | 318 | ret = drm_fb_helper_init(cdev->dev, &gfbdev->helper, |
319 | cdev->num_crtc, CIRRUSFB_CONN_LIMIT); | 319 | cdev->num_crtc, CIRRUSFB_CONN_LIMIT); |
320 | if (ret) { | 320 | if (ret) |
321 | kfree(gfbdev); | 321 | return ret; |
322 | |||
323 | ret = drm_fb_helper_single_add_all_connectors(&gfbdev->helper); | ||
324 | if (ret) | ||
322 | return ret; | 325 | return ret; |
323 | } | ||
324 | drm_fb_helper_single_add_all_connectors(&gfbdev->helper); | ||
325 | 326 | ||
326 | /* disable all the possible outputs/crtcs before entering KMS mode */ | 327 | /* disable all the possible outputs/crtcs before entering KMS mode */ |
327 | drm_helper_disable_unused_functions(cdev->dev); | 328 | drm_helper_disable_unused_functions(cdev->dev); |
328 | drm_fb_helper_initial_config(&gfbdev->helper, bpp_sel); | ||
329 | 329 | ||
330 | return 0; | 330 | return drm_fb_helper_initial_config(&gfbdev->helper, bpp_sel); |
331 | } | 331 | } |
332 | 332 | ||
333 | void cirrus_fbdev_fini(struct cirrus_device *cdev) | 333 | void cirrus_fbdev_fini(struct cirrus_device *cdev) |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 52ce26d6b4fb..876f1ef0acd1 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -1688,7 +1688,7 @@ out: | |||
1688 | * RETURNS: | 1688 | * RETURNS: |
1689 | * Zero if everything went ok, nonzero otherwise. | 1689 | * Zero if everything went ok, nonzero otherwise. |
1690 | */ | 1690 | */ |
1691 | bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) | 1691 | int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) |
1692 | { | 1692 | { |
1693 | struct drm_device *dev = fb_helper->dev; | 1693 | struct drm_device *dev = fb_helper->dev; |
1694 | int count = 0; | 1694 | int count = 0; |
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c index ddd90ddbc200..2d42ce6d3757 100644 --- a/drivers/gpu/drm/gma500/framebuffer.c +++ b/drivers/gpu/drm/gma500/framebuffer.c | |||
@@ -593,6 +593,7 @@ int psb_fbdev_init(struct drm_device *dev) | |||
593 | { | 593 | { |
594 | struct psb_fbdev *fbdev; | 594 | struct psb_fbdev *fbdev; |
595 | struct drm_psb_private *dev_priv = dev->dev_private; | 595 | struct drm_psb_private *dev_priv = dev->dev_private; |
596 | int ret; | ||
596 | 597 | ||
597 | fbdev = kzalloc(sizeof(struct psb_fbdev), GFP_KERNEL); | 598 | fbdev = kzalloc(sizeof(struct psb_fbdev), GFP_KERNEL); |
598 | if (!fbdev) { | 599 | if (!fbdev) { |
@@ -604,16 +605,29 @@ int psb_fbdev_init(struct drm_device *dev) | |||
604 | 605 | ||
605 | drm_fb_helper_prepare(dev, &fbdev->psb_fb_helper, &psb_fb_helper_funcs); | 606 | drm_fb_helper_prepare(dev, &fbdev->psb_fb_helper, &psb_fb_helper_funcs); |
606 | 607 | ||
607 | drm_fb_helper_init(dev, &fbdev->psb_fb_helper, dev_priv->ops->crtcs, | 608 | ret = drm_fb_helper_init(dev, &fbdev->psb_fb_helper, |
608 | INTELFB_CONN_LIMIT); | 609 | dev_priv->ops->crtcs, INTELFB_CONN_LIMIT); |
610 | if (ret) | ||
611 | goto free; | ||
609 | 612 | ||
610 | drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper); | 613 | ret = drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper); |
614 | if (ret) | ||
615 | goto fini; | ||
611 | 616 | ||
612 | /* disable all the possible outputs/crtcs before entering KMS mode */ | 617 | /* disable all the possible outputs/crtcs before entering KMS mode */ |
613 | drm_helper_disable_unused_functions(dev); | 618 | drm_helper_disable_unused_functions(dev); |
614 | 619 | ||
615 | drm_fb_helper_initial_config(&fbdev->psb_fb_helper, 32); | 620 | ret = drm_fb_helper_initial_config(&fbdev->psb_fb_helper, 32); |
621 | if (ret) | ||
622 | goto fini; | ||
623 | |||
616 | return 0; | 624 | return 0; |
625 | |||
626 | fini: | ||
627 | drm_fb_helper_fini(&fbdev->psb_fb_helper); | ||
628 | free: | ||
629 | kfree(fbdev); | ||
630 | return ret; | ||
617 | } | 631 | } |
618 | 632 | ||
619 | static void psb_fbdev_fini(struct drm_device *dev) | 633 | static void psb_fbdev_fini(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/mgag200/mgag200_fb.c b/drivers/gpu/drm/mgag200/mgag200_fb.c index 4415af3666ab..c36b8304042b 100644 --- a/drivers/gpu/drm/mgag200/mgag200_fb.c +++ b/drivers/gpu/drm/mgag200/mgag200_fb.c | |||
@@ -303,14 +303,22 @@ int mgag200_fbdev_init(struct mga_device *mdev) | |||
303 | if (ret) | 303 | if (ret) |
304 | return ret; | 304 | return ret; |
305 | 305 | ||
306 | drm_fb_helper_single_add_all_connectors(&mfbdev->helper); | 306 | ret = drm_fb_helper_single_add_all_connectors(&mfbdev->helper); |
307 | if (ret) | ||
308 | goto fini; | ||
307 | 309 | ||
308 | /* disable all the possible outputs/crtcs before entering KMS mode */ | 310 | /* disable all the possible outputs/crtcs before entering KMS mode */ |
309 | drm_helper_disable_unused_functions(mdev->dev); | 311 | drm_helper_disable_unused_functions(mdev->dev); |
310 | 312 | ||
311 | drm_fb_helper_initial_config(&mfbdev->helper, bpp_sel); | 313 | ret = drm_fb_helper_initial_config(&mfbdev->helper, bpp_sel); |
314 | if (ret) | ||
315 | goto fini; | ||
312 | 316 | ||
313 | return 0; | 317 | return 0; |
318 | |||
319 | fini: | ||
320 | drm_fb_helper_fini(&mfbdev->helper); | ||
321 | return ret; | ||
314 | } | 322 | } |
315 | 323 | ||
316 | void mgag200_fbdev_fini(struct mga_device *mdev) | 324 | void mgag200_fbdev_fini(struct mga_device *mdev) |
diff --git a/drivers/gpu/drm/msm/msm_fbdev.c b/drivers/gpu/drm/msm/msm_fbdev.c index 1f3af13ccede..115b509a4a00 100644 --- a/drivers/gpu/drm/msm/msm_fbdev.c +++ b/drivers/gpu/drm/msm/msm_fbdev.c | |||
@@ -241,17 +241,23 @@ struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev) | |||
241 | goto fail; | 241 | goto fail; |
242 | } | 242 | } |
243 | 243 | ||
244 | drm_fb_helper_single_add_all_connectors(helper); | 244 | ret = drm_fb_helper_single_add_all_connectors(helper); |
245 | if (ret) | ||
246 | goto fini; | ||
245 | 247 | ||
246 | /* disable all the possible outputs/crtcs before entering KMS mode */ | 248 | /* disable all the possible outputs/crtcs before entering KMS mode */ |
247 | drm_helper_disable_unused_functions(dev); | 249 | drm_helper_disable_unused_functions(dev); |
248 | 250 | ||
249 | drm_fb_helper_initial_config(helper, 32); | 251 | ret = drm_fb_helper_initial_config(helper, 32); |
252 | if (ret) | ||
253 | goto fini; | ||
250 | 254 | ||
251 | priv->fbdev = helper; | 255 | priv->fbdev = helper; |
252 | 256 | ||
253 | return helper; | 257 | return helper; |
254 | 258 | ||
259 | fini: | ||
260 | drm_fb_helper_fini(helper); | ||
255 | fail: | 261 | fail: |
256 | kfree(fbdev); | 262 | kfree(fbdev); |
257 | return NULL; | 263 | return NULL; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c index 3ed12a8cfc91..5a7705dcd67e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c | |||
@@ -539,12 +539,12 @@ nouveau_fbcon_init(struct drm_device *dev) | |||
539 | 539 | ||
540 | ret = drm_fb_helper_init(dev, &fbcon->helper, | 540 | ret = drm_fb_helper_init(dev, &fbcon->helper, |
541 | dev->mode_config.num_crtc, 4); | 541 | dev->mode_config.num_crtc, 4); |
542 | if (ret) { | 542 | if (ret) |
543 | kfree(fbcon); | 543 | goto free; |
544 | return ret; | ||
545 | } | ||
546 | 544 | ||
547 | drm_fb_helper_single_add_all_connectors(&fbcon->helper); | 545 | ret = drm_fb_helper_single_add_all_connectors(&fbcon->helper); |
546 | if (ret) | ||
547 | goto fini; | ||
548 | 548 | ||
549 | if (drm->device.info.ram_size <= 32 * 1024 * 1024) | 549 | if (drm->device.info.ram_size <= 32 * 1024 * 1024) |
550 | preferred_bpp = 8; | 550 | preferred_bpp = 8; |
@@ -557,8 +557,17 @@ nouveau_fbcon_init(struct drm_device *dev) | |||
557 | /* disable all the possible outputs/crtcs before entering KMS mode */ | 557 | /* disable all the possible outputs/crtcs before entering KMS mode */ |
558 | drm_helper_disable_unused_functions(dev); | 558 | drm_helper_disable_unused_functions(dev); |
559 | 559 | ||
560 | drm_fb_helper_initial_config(&fbcon->helper, preferred_bpp); | 560 | ret = drm_fb_helper_initial_config(&fbcon->helper, preferred_bpp); |
561 | if (ret) | ||
562 | goto fini; | ||
563 | |||
561 | return 0; | 564 | return 0; |
565 | |||
566 | fini: | ||
567 | drm_fb_helper_fini(&fbcon->helper); | ||
568 | free: | ||
569 | kfree(fbcon); | ||
570 | return ret; | ||
562 | } | 571 | } |
563 | 572 | ||
564 | void | 573 | void |
diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.c b/drivers/gpu/drm/omapdrm/omap_fbdev.c index 8436c6857cda..d292d24b3a6e 100644 --- a/drivers/gpu/drm/omapdrm/omap_fbdev.c +++ b/drivers/gpu/drm/omapdrm/omap_fbdev.c | |||
@@ -334,17 +334,23 @@ struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev) | |||
334 | goto fail; | 334 | goto fail; |
335 | } | 335 | } |
336 | 336 | ||
337 | drm_fb_helper_single_add_all_connectors(helper); | 337 | ret = drm_fb_helper_single_add_all_connectors(helper); |
338 | if (ret) | ||
339 | goto fini; | ||
338 | 340 | ||
339 | /* disable all the possible outputs/crtcs before entering KMS mode */ | 341 | /* disable all the possible outputs/crtcs before entering KMS mode */ |
340 | drm_helper_disable_unused_functions(dev); | 342 | drm_helper_disable_unused_functions(dev); |
341 | 343 | ||
342 | drm_fb_helper_initial_config(helper, 32); | 344 | ret = drm_fb_helper_initial_config(helper, 32); |
345 | if (ret) | ||
346 | goto fini; | ||
343 | 347 | ||
344 | priv->fbdev = helper; | 348 | priv->fbdev = helper; |
345 | 349 | ||
346 | return helper; | 350 | return helper; |
347 | 351 | ||
352 | fini: | ||
353 | drm_fb_helper_fini(helper); | ||
348 | fail: | 354 | fail: |
349 | kfree(fbdev); | 355 | kfree(fbdev); |
350 | return NULL; | 356 | return NULL; |
diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c index 3d7c1d00a424..f778c0e8ae3c 100644 --- a/drivers/gpu/drm/qxl/qxl_fb.c +++ b/drivers/gpu/drm/qxl/qxl_fb.c | |||
@@ -686,14 +686,24 @@ int qxl_fbdev_init(struct qxl_device *qdev) | |||
686 | ret = drm_fb_helper_init(qdev->ddev, &qfbdev->helper, | 686 | ret = drm_fb_helper_init(qdev->ddev, &qfbdev->helper, |
687 | qxl_num_crtc /* num_crtc - QXL supports just 1 */, | 687 | qxl_num_crtc /* num_crtc - QXL supports just 1 */, |
688 | QXLFB_CONN_LIMIT); | 688 | QXLFB_CONN_LIMIT); |
689 | if (ret) { | 689 | if (ret) |
690 | kfree(qfbdev); | 690 | goto free; |
691 | return ret; | 691 | |
692 | } | 692 | ret = drm_fb_helper_single_add_all_connectors(&qfbdev->helper); |
693 | if (ret) | ||
694 | goto fini; | ||
695 | |||
696 | ret = drm_fb_helper_initial_config(&qfbdev->helper, bpp_sel); | ||
697 | if (ret) | ||
698 | goto fini; | ||
693 | 699 | ||
694 | drm_fb_helper_single_add_all_connectors(&qfbdev->helper); | ||
695 | drm_fb_helper_initial_config(&qfbdev->helper, bpp_sel); | ||
696 | return 0; | 700 | return 0; |
701 | |||
702 | fini: | ||
703 | drm_fb_helper_fini(&qfbdev->helper); | ||
704 | free: | ||
705 | kfree(qfbdev); | ||
706 | return ret; | ||
697 | } | 707 | } |
698 | 708 | ||
699 | void qxl_fbdev_fini(struct qxl_device *qdev) | 709 | void qxl_fbdev_fini(struct qxl_device *qdev) |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index 29b9220ec399..3000bc4c136b 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
@@ -390,18 +390,27 @@ int radeon_fbdev_init(struct radeon_device *rdev) | |||
390 | ret = drm_fb_helper_init(rdev->ddev, &rfbdev->helper, | 390 | ret = drm_fb_helper_init(rdev->ddev, &rfbdev->helper, |
391 | rdev->num_crtc, | 391 | rdev->num_crtc, |
392 | RADEONFB_CONN_LIMIT); | 392 | RADEONFB_CONN_LIMIT); |
393 | if (ret) { | 393 | if (ret) |
394 | kfree(rfbdev); | 394 | goto free; |
395 | return ret; | ||
396 | } | ||
397 | 395 | ||
398 | drm_fb_helper_single_add_all_connectors(&rfbdev->helper); | 396 | ret = drm_fb_helper_single_add_all_connectors(&rfbdev->helper); |
397 | if (ret) | ||
398 | goto fini; | ||
399 | 399 | ||
400 | /* disable all the possible outputs/crtcs before entering KMS mode */ | 400 | /* disable all the possible outputs/crtcs before entering KMS mode */ |
401 | drm_helper_disable_unused_functions(rdev->ddev); | 401 | drm_helper_disable_unused_functions(rdev->ddev); |
402 | 402 | ||
403 | drm_fb_helper_initial_config(&rfbdev->helper, bpp_sel); | 403 | ret = drm_fb_helper_initial_config(&rfbdev->helper, bpp_sel); |
404 | if (ret) | ||
405 | goto fini; | ||
406 | |||
404 | return 0; | 407 | return 0; |
408 | |||
409 | fini: | ||
410 | drm_fb_helper_fini(&rfbdev->helper); | ||
411 | free: | ||
412 | kfree(rfbdev); | ||
413 | return ret; | ||
405 | } | 414 | } |
406 | 415 | ||
407 | void radeon_fbdev_fini(struct radeon_device *rdev) | 416 | void radeon_fbdev_fini(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c index 8cbcb4589bd3..5fc16cecd3ba 100644 --- a/drivers/gpu/drm/udl/udl_fb.c +++ b/drivers/gpu/drm/udl/udl_fb.c | |||
@@ -589,19 +589,27 @@ int udl_fbdev_init(struct drm_device *dev) | |||
589 | 589 | ||
590 | ret = drm_fb_helper_init(dev, &ufbdev->helper, | 590 | ret = drm_fb_helper_init(dev, &ufbdev->helper, |
591 | 1, 1); | 591 | 1, 1); |
592 | if (ret) { | 592 | if (ret) |
593 | kfree(ufbdev); | 593 | goto free; |
594 | return ret; | ||
595 | |||
596 | } | ||
597 | 594 | ||
598 | drm_fb_helper_single_add_all_connectors(&ufbdev->helper); | 595 | ret = drm_fb_helper_single_add_all_connectors(&ufbdev->helper); |
596 | if (ret) | ||
597 | goto fini; | ||
599 | 598 | ||
600 | /* disable all the possible outputs/crtcs before entering KMS mode */ | 599 | /* disable all the possible outputs/crtcs before entering KMS mode */ |
601 | drm_helper_disable_unused_functions(dev); | 600 | drm_helper_disable_unused_functions(dev); |
602 | 601 | ||
603 | drm_fb_helper_initial_config(&ufbdev->helper, bpp_sel); | 602 | ret = drm_fb_helper_initial_config(&ufbdev->helper, bpp_sel); |
603 | if (ret) | ||
604 | goto fini; | ||
605 | |||
604 | return 0; | 606 | return 0; |
607 | |||
608 | fini: | ||
609 | drm_fb_helper_fini(&ufbdev->helper); | ||
610 | free: | ||
611 | kfree(ufbdev); | ||
612 | return ret; | ||
605 | } | 613 | } |
606 | 614 | ||
607 | void udl_fbdev_cleanup(struct drm_device *dev) | 615 | void udl_fbdev_cleanup(struct drm_device *dev) |
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h index b597068103aa..21b944c456f6 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h | |||
@@ -125,7 +125,7 @@ void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, | |||
125 | int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info); | 125 | int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info); |
126 | 126 | ||
127 | int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper); | 127 | int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper); |
128 | bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel); | 128 | int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel); |
129 | int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper); | 129 | int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper); |
130 | int drm_fb_helper_debug_enter(struct fb_info *info); | 130 | int drm_fb_helper_debug_enter(struct fb_info *info); |
131 | int drm_fb_helper_debug_leave(struct fb_info *info); | 131 | int drm_fb_helper_debug_leave(struct fb_info *info); |