drm/radeon/kms/pm: voltage fixes
[safe/jmp/linux-2.6] / drivers / gpu / drm / drm_drawable.c
index 1839c57..c53c976 100644 (file)
@@ -76,11 +76,17 @@ int drm_rmdraw(struct drm_device *dev, void *data, struct drm_file *file_priv)
 {
        struct drm_draw *draw = data;
        unsigned long irqflags;
+       struct drm_drawable_info *info;
 
        spin_lock_irqsave(&dev->drw_lock, irqflags);
 
-       drm_free(drm_get_drawable_info(dev, draw->handle),
-                sizeof(struct drm_drawable_info), DRM_MEM_BUFS);
+       info = drm_get_drawable_info(dev, draw->handle);
+       if (info == NULL) {
+               spin_unlock_irqrestore(&dev->drw_lock, irqflags);
+               return -EINVAL;
+       }
+       kfree(info->rects);
+       kfree(info);
 
        idr_remove(&dev->drw_idr, draw->handle);
 
@@ -99,21 +105,24 @@ int drm_update_drawable_info(struct drm_device *dev, void *data, struct drm_file
 
        info = idr_find(&dev->drw_idr, update->handle);
        if (!info) {
-               info = drm_calloc(1, sizeof(*info), DRM_MEM_BUFS);
+               info = kzalloc(sizeof(*info), GFP_KERNEL);
                if (!info)
                        return -ENOMEM;
                if (IS_ERR(idr_replace(&dev->drw_idr, info, update->handle))) {
                        DRM_ERROR("No such drawable %d\n", update->handle);
-                       drm_free(info, sizeof(*info), DRM_MEM_BUFS);
+                       kfree(info);
                        return -EINVAL;
                }
        }
 
        switch (update->type) {
        case DRM_DRAWABLE_CLIPRECTS:
-               if (update->num != info->num_rects) {
-                       rects = drm_alloc(update->num * sizeof(struct drm_clip_rect),
-                                        DRM_MEM_BUFS);
+               if (update->num == 0)
+                       rects = NULL;
+               else if (update->num != info->num_rects) {
+                       rects = kmalloc(update->num *
+                                       sizeof(struct drm_clip_rect),
+                                       GFP_KERNEL);
                } else
                        rects = info->rects;
 
@@ -136,8 +145,7 @@ int drm_update_drawable_info(struct drm_device *dev, void *data, struct drm_file
                spin_lock_irqsave(&dev->drw_lock, irqflags);
 
                if (rects != info->rects) {
-                       drm_free(info->rects, info->num_rects *
-                                sizeof(struct drm_clip_rect), DRM_MEM_BUFS);
+                       kfree(info->rects);
                }
 
                info->rects = rects;
@@ -157,8 +165,7 @@ int drm_update_drawable_info(struct drm_device *dev, void *data, struct drm_file
 
 error:
        if (rects != info->rects)
-               drm_free(rects, update->num * sizeof(struct drm_clip_rect),
-                        DRM_MEM_BUFS);
+               kfree(rects);
 
        return err;
 }
@@ -177,9 +184,8 @@ static int drm_drawable_free(int idr, void *p, void *data)
        struct drm_drawable_info *info = p;
 
        if (info) {
-               drm_free(info->rects, info->num_rects *
-                        sizeof(struct drm_clip_rect), DRM_MEM_BUFS);
-               drm_free(info, sizeof(*info), DRM_MEM_BUFS);
+               kfree(info->rects);
+               kfree(info);
        }
 
        return 0;