drm/nv50/disp: fix evo for create/init + destroy/fini split
authorBen Skeggs <bskeggs@redhat.com>
Wed, 9 Nov 2011 05:52:43 +0000 (15:52 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 21 Dec 2011 09:01:34 +0000 (19:01 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nv50_display.c
drivers/gpu/drm/nouveau/nv50_display.h
drivers/gpu/drm/nouveau/nv50_evo.c

index 7a57c30e27289603dd120a3915666b7ae6775605..a3d28a1e8bb26c1ea95125bfa25e00b80f3686a5 100644 (file)
@@ -347,7 +347,7 @@ nv50_display_create(struct drm_device *dev)
        struct dcb_table *dcb = &dev_priv->vbios.dcb;
        struct drm_connector *connector, *ct;
        struct nv50_display *priv;
-       int i;
+       int ret, i;
 
        NV_DEBUG_KMS(dev, "\n");
 
@@ -400,6 +400,13 @@ nv50_display_create(struct drm_device *dev)
 
        tasklet_init(&priv->tasklet, nv50_display_bh, (unsigned long)dev);
        nouveau_irq_register(dev, 26, nv50_display_isr);
+
+       ret = nv50_evo_create(dev);
+       if (ret) {
+               nv50_display_destroy(dev);
+               return ret;
+       }
+
        return 0;
 }
 
@@ -410,6 +417,7 @@ nv50_display_destroy(struct drm_device *dev)
 
        NV_DEBUG_KMS(dev, "\n");
 
+       nv50_evo_destroy(dev);
        nouveau_irq_unregister(dev, 26);
        kfree(disp);
 }
index 11e2f1efd4117eeb7da53781dc8e61cc46bd3c60..95874f7c043cf3aad9e80de35712cc9d1aad72f6 100644 (file)
@@ -79,6 +79,8 @@ int  nv50_display_flip_next(struct drm_crtc *, struct drm_framebuffer *,
                            struct nouveau_channel *chan);
 void nv50_display_flip_stop(struct drm_crtc *);
 
+int  nv50_evo_create(struct drm_device *dev);
+void nv50_evo_destroy(struct drm_device *dev);
 int  nv50_evo_init(struct drm_device *dev);
 void nv50_evo_fini(struct drm_device *dev);
 void nv50_evo_dmaobj_init(struct nouveau_gpuobj *, u32 memtype, u64 base,
index c99d9751880c56d6012b06d36858381550f23685..9b962e989d7c6914001ae20b3d59bde7e830fdfe 100644 (file)
@@ -218,7 +218,7 @@ nv50_evo_channel_fini(struct nouveau_channel *evo)
        }
 }
 
-static void
+void
 nv50_evo_destroy(struct drm_device *dev)
 {
        struct nv50_display *disp = nv50_display(dev);
@@ -235,7 +235,7 @@ nv50_evo_destroy(struct drm_device *dev)
        nv50_evo_channel_del(&disp->master);
 }
 
-static int
+int
 nv50_evo_create(struct drm_device *dev)
 {
        struct drm_nouveau_private *dev_priv = dev->dev_private;
@@ -388,12 +388,6 @@ nv50_evo_init(struct drm_device *dev)
        struct nv50_display *disp = nv50_display(dev);
        int ret, i;
 
-       if (!disp->master) {
-               ret = nv50_evo_create(dev);
-               if (ret)
-                       return ret;
-       }
-
        ret = nv50_evo_channel_init(disp->master);
        if (ret)
                return ret;
@@ -420,6 +414,4 @@ nv50_evo_fini(struct drm_device *dev)
 
        if (disp->master)
                nv50_evo_channel_fini(disp->master);
-
-       nv50_evo_destroy(dev);
 }