Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
[powerpc.git] / drivers / char / drm / drm_drv.c
index 654b95c..a70af0d 100644 (file)
@@ -116,6 +116,8 @@ static drm_ioctl_desc_t drm_ioctls[] = {
        [DRM_IOCTL_NR(DRM_IOCTL_SG_FREE)] = {drm_sg_free, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
 
        [DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK)] = {drm_wait_vblank, 0},
+
+       [DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW)] = {drm_update_drawable_info, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
 };
 
 #define DRIVER_IOCTL_COUNT     ARRAY_SIZE( drm_ioctls )
@@ -151,6 +153,18 @@ int drm_lastclose(drm_device_t * dev)
        if (dev->irq_enabled)
                drm_irq_uninstall(dev);
 
+       /* Free drawable information memory */
+       for (i = 0; i < dev->drw_bitfield_length / sizeof(*dev->drw_bitfield);
+            i++) {
+               drm_drawable_info_t *info = drm_get_drawable_info(dev, i);
+
+               if (info) {
+                       drm_free(info->rects, info->num_rects *
+                                sizeof(drm_clip_rect_t), DRM_MEM_BUFS);
+                       drm_free(info, sizeof(*info), DRM_MEM_BUFS);
+               }
+       }
+
        mutex_lock(&dev->struct_mutex);
        del_timer(&dev->timer);
 
@@ -161,6 +175,7 @@ int drm_lastclose(drm_device_t * dev)
                        drm_ht_remove_item(&dev->magiclist, &pt->hash_item);
                        drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC);
                }
+               drm_ht_remove(&dev->magiclist);
        }
 
        /* Clear AGP information */
@@ -299,6 +314,7 @@ static void drm_cleanup(drm_device_t * dev)
        if (dev->maplist) {
                drm_free(dev->maplist, sizeof(*dev->maplist), DRM_MEM_MAPS);
                dev->maplist = NULL;
+               drm_ht_remove(&dev->map_hash);
        }
 
        drm_ctxbitmap_cleanup(dev);