drm/nouveau: rework the init/takedown ordering
authorBen Skeggs <bskeggs@redhat.com>
Thu, 15 Dec 2011 00:43:03 +0000 (10:43 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 13 Mar 2012 07:05:58 +0000 (17:05 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_state.c

index a30d7af58eb316ab9d228007f097f1a8a9f98dfb..a36386c00d9b57c6b33351aa27194ee79d6df258 100644 (file)
@@ -592,16 +592,34 @@ nouveau_card_init(struct drm_device *dev)
                nv_mask(dev, 0x00088080, 0x00000800, 0x00000000);
        }
 
-       nouveau_pm_init(dev);
+       /* PMC */
+       ret = engine->mc.init(dev);
+       if (ret)
+               goto out_bios;
+
+       /* PTIMER */
+       ret = engine->timer.init(dev);
+       if (ret)
+               goto out_mc;
+
+       /* PFB */
+       ret = engine->fb.init(dev);
+       if (ret)
+               goto out_timer;
 
        ret = engine->vram.init(dev);
        if (ret)
-               goto out_bios;
+               goto out_fb;
 
-       ret = nouveau_gpuobj_init(dev);
+       /* PGPIO */
+       ret = nouveau_gpio_create(dev);
        if (ret)
                goto out_vram;
 
+       ret = nouveau_gpuobj_init(dev);
+       if (ret)
+               goto out_gpio;
+
        ret = engine->instmem.init(dev);
        if (ret)
                goto out_gpuobj;
@@ -614,25 +632,7 @@ nouveau_card_init(struct drm_device *dev)
        if (ret)
                goto out_ttmvram;
 
-       /* PMC */
-       ret = engine->mc.init(dev);
-       if (ret)
-               goto out_gart;
-
-       /* PGPIO */
-       ret = nouveau_gpio_create(dev);
-       if (ret)
-               goto out_mc;
-
-       /* PTIMER */
-       ret = engine->timer.init(dev);
-       if (ret)
-               goto out_gpio;
-
-       /* PFB */
-       ret = engine->fb.init(dev);
-       if (ret)
-               goto out_timer;
+       nouveau_pm_init(dev);
 
        if (!dev_priv->noaccel) {
                switch (dev_priv->card_type) {
@@ -783,15 +783,7 @@ out_engine:
                        dev_priv->eng[e]->destroy(dev,e );
                }
        }
-
-       engine->fb.takedown(dev);
-out_timer:
-       engine->timer.takedown(dev);
-out_gpio:
-       nouveau_gpio_destroy(dev);
-out_mc:
-       engine->mc.takedown(dev);
-out_gart:
+       nouveau_pm_fini(dev);
        nouveau_mem_gart_fini(dev);
 out_ttmvram:
        nouveau_mem_vram_fini(dev);
@@ -799,10 +791,17 @@ out_instmem:
        engine->instmem.takedown(dev);
 out_gpuobj:
        nouveau_gpuobj_takedown(dev);
+out_gpio:
+       nouveau_gpio_destroy(dev);
 out_vram:
        engine->vram.takedown(dev);
+out_fb:
+       engine->fb.takedown(dev);
+out_timer:
+       engine->timer.takedown(dev);
+out_mc:
+       engine->mc.takedown(dev);
 out_bios:
-       nouveau_pm_fini(dev);
        nouveau_bios_takedown(dev);
 out_display_early:
        engine->display.late_takedown(dev);
@@ -839,11 +838,6 @@ static void nouveau_card_takedown(struct drm_device *dev)
                        }
                }
        }
-       engine->fb.takedown(dev);
-       engine->timer.takedown(dev);
-       nouveau_gpio_destroy(dev);
-       engine->mc.takedown(dev);
-       engine->display.late_takedown(dev);
 
        if (dev_priv->vga_ram) {
                nouveau_bo_unpin(dev_priv->vga_ram);
@@ -859,12 +853,19 @@ static void nouveau_card_takedown(struct drm_device *dev)
 
        engine->instmem.takedown(dev);
        nouveau_gpuobj_takedown(dev);
-       engine->vram.takedown(dev);
-
-       nouveau_irq_fini(dev);
 
        nouveau_pm_fini(dev);
+
+       nouveau_gpio_destroy(dev);
+       engine->vram.takedown(dev);
+       engine->fb.takedown(dev);
+       engine->timer.takedown(dev);
+       engine->mc.takedown(dev);
+
        nouveau_bios_takedown(dev);
+       engine->display.late_takedown(dev);
+
+       nouveau_irq_fini(dev);
 
        vga_client_register(dev->pdev, NULL, NULL, NULL);
 }