.load = via_driver_load,
        .unload = via_driver_unload,
        .open = via_driver_open,
+       .preclose = via_reclaim_buffers_locked,
        .postclose = via_driver_postclose,
        .context_dtor = via_final_context,
        .get_vblank_counter = via_get_vblank_counter,
        .irq_uninstall = via_driver_irq_uninstall,
        .irq_handler = via_driver_irq_handler,
        .dma_quiescent = via_driver_dma_quiescent,
-       .reclaim_buffers = drm_core_reclaim_buffers,
-       .reclaim_buffers_locked = NULL,
-       .reclaim_buffers_idlelocked = via_reclaim_buffers_locked,
        .lastclose = via_lastclose,
        .ioctls = via_ioctls,
        .fops = &via_driver_fops,
 
        struct via_file_private *file_priv = file->driver_priv;
        struct via_memblock *entry, *next;
 
+       if (!(file->minor->master && file->master->lock.hw_lock))
+               return;
+
+       drm_idlelock_take(&file->master->lock);
+
        mutex_lock(&dev->struct_mutex);
        if (list_empty(&file_priv->obj_list)) {
                mutex_unlock(&dev->struct_mutex);
+               drm_idlelock_release(&file->master->lock);
+
                return;
        }
 
-       if (dev->driver->dma_quiescent)
-               dev->driver->dma_quiescent(dev);
+       via_driver_dma_quiescent(dev);
 
        list_for_each_entry_safe(entry, next, &file_priv->obj_list,
                                 owner_list) {
                kfree(entry);
        }
        mutex_unlock(&dev->struct_mutex);
+
+       drm_idlelock_release(&file->master->lock);
+
        return;
 }