Get the power management hooks into the right place so that everything gets
authorJon Smirl <jonsmirl@yahoo.com>
Wed, 22 Jun 2005 05:49:56 +0000 (05:49 +0000)
committerJon Smirl <jonsmirl@yahoo.com>
Wed, 22 Jun 2005 05:49:56 +0000 (05:49 +0000)
    freed correctly.

linux-core/drmP.h
linux-core/drm_drv.c
linux-core/drm_pm.c
linux-core/drm_stub.c

index 410a3e2..9f83677 100644 (file)
@@ -892,7 +892,7 @@ extern unsigned long drm_get_resource_len(drm_device_t *dev,
 extern int drm_pm_setup(drm_device_t *dev);
 extern void drm_pm_takedown(drm_device_t *dev);
 extern int drm_pm_init(void);
-extern void drm_pm_cleanup(void);
+extern void drm_pm_exit(void);
 
                                /* DMA support (drm_dma.h) */
 extern int drm_dma_setup(drm_device_t * dev);
index 39c893c..6c1e5fe 100644 (file)
@@ -310,7 +310,7 @@ int drm_init(struct drm_driver *driver,
 {
        struct pci_dev *pdev;
        struct pci_device_id *pid;
-       int i;
+       int rc, i;
 
        DRM_DEBUG("\n");
 
@@ -351,7 +351,10 @@ int drm_init(struct drm_driver *driver,
                                               pdev))) {
                                /* stealth mode requires a manual probe */
                                pci_dev_get(pdev);
-                               drm_get_dev(pdev, &pciidlist[i], driver);
+                               if ((rc = drm_get_dev(pdev, &pciidlist[i], driver))) {
+                                       pci_dev_put(pdev);
+                                       return rc;
+                               }
                        }
                }
                DRM_INFO("Used old pci detect: framebuffer loaded\n");
@@ -438,9 +441,6 @@ static void __exit drm_cleanup(drm_device_t * dev)
                DRM_DEBUG("mtrr_del=%d\n", retval);
        }
 
-       if (drm_fb_loaded)
-               drm_pm_cleanup();
-
        if (drm_core_has_AGP(dev) && dev->agp) {
                drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS);
                dev->agp = NULL;
@@ -539,6 +539,7 @@ static void __exit drm_core_exit(void)
        unregister_chrdev(DRM_MAJOR, "drm");
 
        drm_free(drm_heads, sizeof(*drm_heads) * cards_limit, DRM_MEM_STUB);
+       drm_pm_exit();
 }
 
 module_init(drm_core_init);
index ea801bd..68c9d0a 100644 (file)
 #define __NO_VERSION__
 #include "drmP.h"
 
-
 #include <linux/device.h>
 #include <linux/sysdev.h>
 
+
 static int drm_suspend(struct sys_device *sysdev, u32 state)
 {
        drm_device_t *dev = (drm_device_t *)sysdev;
-       
-       DRM_DEBUG("%s state=%d\n", __FUNCTION__, state);
-       
+
+       DRM_DEBUG("state=%d\n", state);
+
         if (dev->driver->power)
                return dev->driver->power(dev, state);
        else
@@ -51,15 +51,16 @@ static int drm_suspend(struct sys_device *sysdev, u32 state)
 static int drm_resume(struct sys_device *sysdev)
 {
        drm_device_t *dev = (drm_device_t *)sysdev;
-       
-       DRM_DEBUG("%s\n", __FUNCTION__);
-       
+
+       DRM_DEBUG("\n");
+
         if (dev->driver->power)
                return dev->driver->power(dev, 0);
        else
                return 0;
 }
 
+static int drm_sysdev_class_registered = 0;
 static struct sysdev_class drm_sysdev_class = {
        set_kset_name("drm"),
        .resume         = drm_resume,
@@ -75,21 +76,21 @@ static struct sysdev_class drm_sysdev_class = {
  */
 int drm_pm_setup(drm_device_t *dev)
 {
-       int error;
-       
-       DRM_DEBUG("%s\n", __FUNCTION__);
-       
+       int rc;
+
+       DRM_DEBUG("\n");
+
        dev->sysdev.id = dev->primary.minor;
        dev->sysdev.cls = &drm_sysdev_class;
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4)
-       error = sys_device_register(&dev->sysdev);
+       rc = sys_device_register(&dev->sysdev);
 #else
-       error = sysdev_register(&dev->sysdev);
+       rc = sysdev_register(&dev->sysdev);
 #endif
-       if(!error)
+       if (!rc)
                dev->sysdev_registered = 1;
-       return error;
+       return rc;
 }
 
 /**
@@ -99,28 +100,30 @@ int drm_pm_setup(drm_device_t *dev)
  */
 void drm_pm_takedown(drm_device_t *dev)
 {
-       DRM_DEBUG("%s\n", __FUNCTION__);
-       
+       DRM_DEBUG("\n");
+
        if(dev->sysdev_registered) {
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4)
                sys_device_unregister(&dev->sysdev);
 #else
                sysdev_unregister(&dev->sysdev);
 #endif
-               dev->sysdev_registered = 0;
        }
 }
 
 int drm_pm_init(void)
 {
-       DRM_DEBUG("%s\n", __FUNCTION__);
-       
-       return sysdev_class_register(&drm_sysdev_class);
+       int rc;
+       DRM_DEBUG("\n");
+       rc = sysdev_class_register(&drm_sysdev_class);
+       if (!rc)
+               drm_sysdev_class_registered = 1;
+       return rc;
 }
 
-void drm_pm_cleanup(void)
+void drm_pm_exit(void)
 {
-       DRM_DEBUG("%s\n", __FUNCTION__);
-       
-       sysdev_class_unregister(&drm_sysdev_class);
+       DRM_DEBUG("\n");
+       if (drm_sysdev_class_registered)
+               sysdev_class_unregister(&drm_sysdev_class);
 }
index cb6d6c6..2f9a2c3 100644 (file)
@@ -67,9 +67,6 @@ static int fill_in_dev(drm_device_t * dev, struct pci_dev *pdev,
 
        dev->pdev = pdev;
 
-       if (drm_fb_loaded)
-               drm_pm_setup( dev );
-
 #ifdef __alpha__
        dev->hose = pdev->sysdata;
        dev->pci_domain = dev->hose->bus->number;
@@ -97,6 +94,10 @@ static int fill_in_dev(drm_device_t * dev, struct pci_dev *pdev,
 
        dev->driver = driver;
 
+       if (drm_fb_loaded)
+               if ((retcode = drm_pm_setup( dev )))
+                       goto error_out_unreg;
+
        if (dev->driver->preinit)
                if ((retcode = dev->driver->preinit(dev, ent->driver_data)))
                        goto error_out_unreg;