Commit cf0fe456 authored by Jerome Glisse's avatar Jerome Glisse Committed by Dave Airlie

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: default avatarJerome Glisse <jglisse@redhat.com>
Signed-off-by: default avatarDave Airlie <airlied@linux.ie>
parent eaa5fd1a
...@@ -30,10 +30,19 @@ ...@@ -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) ...@@ -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"); dev_err(&dev->pdev->dev, "Fatal error during GPU init\n");
return r; 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) { if (r)
return r; dev_err(&dev->pdev->dev, "Fatal error during modeset init\n");
} out:
return 0; if (r)
} radeon_driver_unload_kms(dev);
return r;
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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment