vmwgfx: Screen object cleanups
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / vmwgfx / vmwgfx_scrn.c
index 347e406994435aaf8b36f2139a9e33e85348def7..edfecc79d957871d33dd9f05c51bbb8dbc3d28d1 100644 (file)
@@ -39,7 +39,6 @@ struct vmw_screen_object_display {
        struct list_head active;
 
        unsigned num_active;
-       unsigned last_num_active;
 
        struct vmw_framebuffer *fb;
 };
@@ -84,12 +83,8 @@ static int vmw_sou_del_active(struct vmw_private *vmw_priv,
 
        /* Must init otherwise list_empty(&sou->active) will not work. */
        list_del_init(&sou->active);
-       if (--(ld->num_active) == 0) {
-               BUG_ON(!ld->fb);
-               if (ld->fb->unpin)
-                       ld->fb->unpin(ld->fb);
+       if (--(ld->num_active) == 0)
                ld->fb = NULL;
-       }
 
        return 0;
 }
@@ -103,13 +98,7 @@ static int vmw_sou_add_active(struct vmw_private *vmw_priv,
        struct list_head *at;
 
        BUG_ON(!ld->num_active && ld->fb);
-       if (vfb != ld->fb) {
-               if (ld->fb && ld->fb->unpin)
-                       ld->fb->unpin(ld->fb);
-               if (vfb->pin)
-                       vfb->pin(vfb);
-               ld->fb = vfb;
-       }
+       ld->fb = vfb;
 
        if (!list_empty(&sou->active))
                return 0;
@@ -479,11 +468,11 @@ static int vmw_sou_init(struct vmw_private *dev_priv, unsigned unit)
        sou->base.pref_mode = NULL;
 
        drm_connector_init(dev, connector, &vmw_legacy_connector_funcs,
-                          DRM_MODE_CONNECTOR_LVDS);
+                          DRM_MODE_CONNECTOR_VIRTUAL);
        connector->status = vmw_du_connector_detect(connector, true);
 
        drm_encoder_init(dev, encoder, &vmw_screen_object_encoder_funcs,
-                        DRM_MODE_ENCODER_LVDS);
+                        DRM_MODE_ENCODER_VIRTUAL);
        drm_mode_connector_attach_encoder(connector, encoder);
        encoder->possible_crtcs = (1 << unit);
        encoder->possible_clones = 0;
@@ -502,8 +491,7 @@ static int vmw_sou_init(struct vmw_private *dev_priv, unsigned unit)
 int vmw_kms_init_screen_object_display(struct vmw_private *dev_priv)
 {
        struct drm_device *dev = dev_priv->dev;
-       int i;
-       int ret;
+       int i, ret;
 
        if (dev_priv->sou_priv) {
                DRM_INFO("sou system already on\n");
@@ -523,14 +511,13 @@ int vmw_kms_init_screen_object_display(struct vmw_private *dev_priv)
 
        INIT_LIST_HEAD(&dev_priv->sou_priv->active);
        dev_priv->sou_priv->num_active = 0;
-       dev_priv->sou_priv->last_num_active = 0;
        dev_priv->sou_priv->fb = NULL;
 
        ret = drm_vblank_init(dev, VMWGFX_NUM_DISPLAY_UNITS);
        if (unlikely(ret != 0))
                goto err_free;
 
-       ret = drm_mode_create_dirty_info_property(dev_priv->dev);
+       ret = drm_mode_create_dirty_info_property(dev);
        if (unlikely(ret != 0))
                goto err_vblank_cleanup;
 
@@ -545,6 +532,7 @@ err_vblank_cleanup:
        drm_vblank_cleanup(dev);
 err_free:
        kfree(dev_priv->sou_priv);
+       dev_priv->sou_priv = NULL;
 err_no_mem:
        return ret;
 }
@@ -553,10 +541,11 @@ int vmw_kms_close_screen_object_display(struct vmw_private *dev_priv)
 {
        struct drm_device *dev = dev_priv->dev;
 
-       drm_vblank_cleanup(dev);
        if (!dev_priv->sou_priv)
                return -ENOSYS;
 
+       drm_vblank_cleanup(dev);
+
        if (!list_empty(&dev_priv->sou_priv->active))
                DRM_ERROR("Still have active outputs when unloading driver");