aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Skeggs2011-12-15 10:43:03 +1000
committerBen Skeggs2012-03-13 17:05:58 +1000
commit668b6c097dbaf190f5d3974798fef37aee025385 (patch)
treec67426a784b418a826300ae9f8a15030e5129aa5
parentf3298532f71f163877b9003009d6e1eefe988258 (diff)
drm/nouveau: rework the init/takedown ordering
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_state.c81
1 files changed, 41 insertions, 40 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
index a30d7af58eb3..a36386c00d9b 100644
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
@@ -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);
}