Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01934c2a authored by Thierry Reding's avatar Thierry Reding Committed by Daniel Vetter
Browse files

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: default avatarFengguang 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: default avatarThierry Reding <treding@nvidia.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
[danvet: Squash in simplification patch from kbuild.]
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 7119ad5f
Loading
Loading
Loading
Loading
+15 −6
Original line number Diff line number Diff line
@@ -335,18 +335,27 @@ int ast_fbdev_init(struct drm_device *dev)

	ret = drm_fb_helper_init(dev, &afbdev->helper,
				 1, 1);
	if (ret) {
		kfree(afbdev);
		return ret;
	}
	if (ret)
		goto free;

	drm_fb_helper_single_add_all_connectors(&afbdev->helper);
	ret = drm_fb_helper_single_add_all_connectors(&afbdev->helper);
	if (ret)
		goto fini;

	/* disable all the possible outputs/crtcs before entering KMS mode */
	drm_helper_disable_unused_functions(dev);

	drm_fb_helper_initial_config(&afbdev->helper, 32);
	ret = drm_fb_helper_initial_config(&afbdev->helper, 32);
	if (ret)
		goto fini;

	return 0;

fini:
	drm_fb_helper_fini(&afbdev->helper);
free:
	kfree(afbdev);
	return ret;
}

void ast_fbdev_fini(struct drm_device *dev)
+12 −2
Original line number Diff line number Diff line
@@ -207,12 +207,22 @@ int bochs_fbdev_init(struct bochs_device *bochs)
	if (ret)
		return ret;

	drm_fb_helper_single_add_all_connectors(&bochs->fb.helper);
	ret = drm_fb_helper_single_add_all_connectors(&bochs->fb.helper);
	if (ret)
		goto fini;

	drm_helper_disable_unused_functions(bochs->dev);
	drm_fb_helper_initial_config(&bochs->fb.helper, 32);

	ret = drm_fb_helper_initial_config(&bochs->fb.helper, 32);
	if (ret)
		goto fini;

	bochs->fb.initialized = true;
	return 0;

fini:
	drm_fb_helper_fini(&bochs->fb.helper);
	return ret;
}

void bochs_fbdev_fini(struct bochs_device *bochs)
+6 −6
Original line number Diff line number Diff line
@@ -317,17 +317,17 @@ int cirrus_fbdev_init(struct cirrus_device *cdev)

	ret = drm_fb_helper_init(cdev->dev, &gfbdev->helper,
				 cdev->num_crtc, CIRRUSFB_CONN_LIMIT);
	if (ret) {
		kfree(gfbdev);
	if (ret)
		return ret;

	ret = drm_fb_helper_single_add_all_connectors(&gfbdev->helper);
	if (ret)
		return ret;
	}
	drm_fb_helper_single_add_all_connectors(&gfbdev->helper);

	/* disable all the possible outputs/crtcs before entering KMS mode */
	drm_helper_disable_unused_functions(cdev->dev);
	drm_fb_helper_initial_config(&gfbdev->helper, bpp_sel);

	return 0;
	return drm_fb_helper_initial_config(&gfbdev->helper, bpp_sel);
}

void cirrus_fbdev_fini(struct cirrus_device *cdev)
+1 −1
Original line number Diff line number Diff line
@@ -1688,7 +1688,7 @@ static void drm_setup_crtcs(struct drm_fb_helper *fb_helper)
 * RETURNS:
 * Zero if everything went ok, nonzero otherwise.
 */
bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
{
	struct drm_device *dev = fb_helper->dev;
	int count = 0;
+18 −4
Original line number Diff line number Diff line
@@ -593,6 +593,7 @@ int psb_fbdev_init(struct drm_device *dev)
{
	struct psb_fbdev *fbdev;
	struct drm_psb_private *dev_priv = dev->dev_private;
	int ret;

	fbdev = kzalloc(sizeof(struct psb_fbdev), GFP_KERNEL);
	if (!fbdev) {
@@ -604,16 +605,29 @@ int psb_fbdev_init(struct drm_device *dev)

	drm_fb_helper_prepare(dev, &fbdev->psb_fb_helper, &psb_fb_helper_funcs);

	drm_fb_helper_init(dev, &fbdev->psb_fb_helper, dev_priv->ops->crtcs,
							INTELFB_CONN_LIMIT);
	ret = drm_fb_helper_init(dev, &fbdev->psb_fb_helper,
				 dev_priv->ops->crtcs, INTELFB_CONN_LIMIT);
	if (ret)
		goto free;

	drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper);
	ret = drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper);
	if (ret)
		goto fini;

	/* disable all the possible outputs/crtcs before entering KMS mode */
	drm_helper_disable_unused_functions(dev);

	drm_fb_helper_initial_config(&fbdev->psb_fb_helper, 32);
	ret = drm_fb_helper_initial_config(&fbdev->psb_fb_helper, 32);
	if (ret)
		goto fini;

	return 0;

fini:
	drm_fb_helper_fini(&fbdev->psb_fb_helper);
free:
	kfree(fbdev);
	return ret;
}

static void psb_fbdev_fini(struct drm_device *dev)
Loading