Browse Source

drm/radeon/kms: cleanup structure and module if initialization fails

This would allow us to properly unload others module like TTM if
initialization fails after we initiliazed TTM structure.

Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@linux.ie>
Jerome Glisse 15 years ago
parent
commit
cf0fe4566d
1 changed files with 20 additions and 22 deletions
  1. 20 22
      drivers/gpu/drm/radeon/radeon_kms.c

+ 20 - 22
drivers/gpu/drm/radeon/radeon_kms.c

@@ -30,10 +30,19 @@
 #include "radeon.h"
 #include "radeon.h"
 #include "radeon_drm.h"
 #include "radeon_drm.h"
 
 
+int radeon_driver_unload_kms(struct drm_device *dev)
+{
+	struct radeon_device *rdev = dev->dev_private;
+
+	if (rdev == NULL)
+		return 0;
+	radeon_modeset_fini(rdev);
+	radeon_device_fini(rdev);
+	kfree(rdev);
+	dev->dev_private = NULL;
+	return 0;
+}
 
 
-/*
- * Driver load/unload
- */
 int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
 int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
 {
 {
 	struct radeon_device *rdev;
 	struct radeon_device *rdev;
@@ -62,31 +71,20 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
 	 */
 	 */
 	r = radeon_device_init(rdev, dev, dev->pdev, flags);
 	r = radeon_device_init(rdev, dev, dev->pdev, flags);
 	if (r) {
 	if (r) {
-		DRM_ERROR("Fatal error while trying to initialize radeon.\n");
-		return r;
+		dev_err(&dev->pdev->dev, "Fatal error during GPU init\n");
+		goto out;
 	}
 	}
 	/* Again modeset_init should fail only on fatal error
 	/* Again modeset_init should fail only on fatal error
 	 * otherwise it should provide enough functionalities
 	 * otherwise it should provide enough functionalities
 	 * for shadowfb to run
 	 * for shadowfb to run
 	 */
 	 */
 	r = radeon_modeset_init(rdev);
 	r = radeon_modeset_init(rdev);
-	if (r) {
-		return r;
-	}
-	return 0;
-}
-
-int radeon_driver_unload_kms(struct drm_device *dev)
-{
-	struct radeon_device *rdev = dev->dev_private;
-
-	if (rdev == NULL)
-		return 0;
-	radeon_modeset_fini(rdev);
-	radeon_device_fini(rdev);
-	kfree(rdev);
-	dev->dev_private = NULL;
-	return 0;
+	if (r)
+		dev_err(&dev->pdev->dev, "Fatal error during modeset init\n");
+out:
+	if (r)
+		radeon_driver_unload_kms(dev);
+	return r;
 }
 }