From 668b6c097dbaf190f5d3974798fef37aee025385 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 15 Dec 2011 10:43:03 +1000 Subject: [PATCH] drm/nouveau: rework the init/takedown ordering Signed-off-by: Ben Skeggs --- drivers/gpu/drm/nouveau/nouveau_state.c | 81 +++++++++++++++++---------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index a30d7af..a36386c 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); } -- 2.7.4