return 0;
 
 free_streams:
-       cx18_streams_cleanup(cx);
+       cx18_streams_cleanup(cx, 1);
 free_irq:
        free_irq(cx->dev->irq, (void *)cx);
 free_i2c:
 
        cx18_halt_firmware(cx);
 
-       cx18_streams_cleanup(cx);
+       cx18_streams_cleanup(cx, 1);
 
        exit_cx18_i2c(cx);
 
 
 
        /* allocate stream buffers. Initially all buffers are in q_free. */
        for (i = 0; i < s->buffers; i++) {
-               struct cx18_buffer *buf =
-                       kzalloc(sizeof(struct cx18_buffer), GFP_KERNEL);
+               struct cx18_buffer *buf = kzalloc(sizeof(struct cx18_buffer),
+                                               GFP_KERNEL|__GFP_NOWARN);
 
                if (buf == NULL)
                        break;
-               buf->buf = kmalloc(s->buf_size, GFP_KERNEL);
+               buf->buf = kmalloc(s->buf_size, GFP_KERNEL|__GFP_NOWARN);
                if (buf->buf == NULL) {
                        kfree(buf);
                        break;
 
                return 0;
 
        /* One or more streams could not be initialized. Clean 'em all up. */
-       cx18_streams_cleanup(cx);
+       cx18_streams_cleanup(cx, 0);
        return -ENOMEM;
 }
 
                return 0;
 
        /* One or more streams could not be initialized. Clean 'em all up. */
-       cx18_streams_cleanup(cx);
+       cx18_streams_cleanup(cx, 1);
        return -ENOMEM;
 }
 
 /* Unregister v4l2 devices */
-void cx18_streams_cleanup(struct cx18 *cx)
+void cx18_streams_cleanup(struct cx18 *cx, int unregister)
 {
        struct video_device *vdev;
        int type;
 
                cx18_stream_free(&cx->streams[type]);
 
-               /* Unregister device */
-               video_unregister_device(vdev);
+               /* Unregister or release device */
+               if (unregister)
+                       video_unregister_device(vdev);
+               else
+                       video_device_release(vdev);
        }
 }
 
 
 u32 cx18_find_handle(struct cx18 *cx);
 int cx18_streams_setup(struct cx18 *cx);
 int cx18_streams_register(struct cx18 *cx);
-void cx18_streams_cleanup(struct cx18 *cx);
+void cx18_streams_cleanup(struct cx18 *cx, int unregister);
 
 /* Capture related */
 int cx18_start_v4l2_encode_stream(struct cx18_stream *s);
 
        return 0;
 
 free_streams:
-       ivtv_streams_cleanup(itv);
+       ivtv_streams_cleanup(itv, 1);
 free_irq:
        free_irq(itv->dev->irq, (void *)itv);
 free_i2c:
        flush_workqueue(itv->irq_work_queues);
        destroy_workqueue(itv->irq_work_queues);
 
-       ivtv_streams_cleanup(itv);
+       ivtv_streams_cleanup(itv, 1);
        ivtv_udma_free(itv);
 
        exit_ivtv_i2c(itv);
 
                s->dma != PCI_DMA_NONE ? "DMA " : "",
                s->name, s->buffers, s->buf_size, s->buffers * s->buf_size / 1024);
 
-       s->sg_pending = kzalloc(SGsize, GFP_KERNEL);
+       s->sg_pending = kzalloc(SGsize, GFP_KERNEL|__GFP_NOWARN);
        if (s->sg_pending == NULL) {
                IVTV_ERR("Could not allocate sg_pending for %s stream\n", s->name);
                return -ENOMEM;
        }
        s->sg_pending_size = 0;
 
-       s->sg_processing = kzalloc(SGsize, GFP_KERNEL);
+       s->sg_processing = kzalloc(SGsize, GFP_KERNEL|__GFP_NOWARN);
        if (s->sg_processing == NULL) {
                IVTV_ERR("Could not allocate sg_processing for %s stream\n", s->name);
                kfree(s->sg_pending);
        }
        s->sg_processing_size = 0;
 
-       s->sg_dma = kzalloc(sizeof(struct ivtv_sg_element), GFP_KERNEL);
+       s->sg_dma = kzalloc(sizeof(struct ivtv_sg_element),
+                                       GFP_KERNEL|__GFP_NOWARN);
        if (s->sg_dma == NULL) {
                IVTV_ERR("Could not allocate sg_dma for %s stream\n", s->name);
                kfree(s->sg_pending);
 
        /* allocate stream buffers. Initially all buffers are in q_free. */
        for (i = 0; i < s->buffers; i++) {
-               struct ivtv_buffer *buf = kzalloc(sizeof(struct ivtv_buffer), GFP_KERNEL);
+               struct ivtv_buffer *buf = kzalloc(sizeof(struct ivtv_buffer),
+                                               GFP_KERNEL|__GFP_NOWARN);
 
                if (buf == NULL)
                        break;
-               buf->buf = kmalloc(s->buf_size + 256, GFP_KERNEL);
+               buf->buf = kmalloc(s->buf_size + 256, GFP_KERNEL|__GFP_NOWARN);
                if (buf->buf == NULL) {
                        kfree(buf);
                        break;
 
                return 0;
 
        /* One or more streams could not be initialized. Clean 'em all up. */
-       ivtv_streams_cleanup(itv);
+       ivtv_streams_cleanup(itv, 0);
        return -ENOMEM;
 }
 
                return 0;
 
        /* One or more streams could not be initialized. Clean 'em all up. */
-       ivtv_streams_cleanup(itv);
+       ivtv_streams_cleanup(itv, 1);
        return -ENOMEM;
 }
 
 /* Unregister v4l2 devices */
-void ivtv_streams_cleanup(struct ivtv *itv)
+void ivtv_streams_cleanup(struct ivtv *itv, int unregister)
 {
        int type;
 
                        continue;
 
                ivtv_stream_free(&itv->streams[type]);
-               /* Unregister device */
-               video_unregister_device(vdev);
+               /* Unregister or release device */
+               if (unregister)
+                       video_unregister_device(vdev);
+               else
+                       video_device_release(vdev);
        }
 }
 
 
 
 int ivtv_streams_setup(struct ivtv *itv);
 int ivtv_streams_register(struct ivtv *itv);
-void ivtv_streams_cleanup(struct ivtv *itv);
+void ivtv_streams_cleanup(struct ivtv *itv, int unregister);
 
 /* Capture related */
 int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s);
 
        }
 
        /* We need a buffer for blanking when Y plane is offset - non-fatal if we can't get one */
-       yi->blanking_ptr = kzalloc(720 * 16, GFP_KERNEL);
+       yi->blanking_ptr = kzalloc(720 * 16, GFP_KERNEL|__GFP_NOWARN);
        if (yi->blanking_ptr) {
                yi->blanking_dmaptr = pci_map_single(itv->dev, yi->blanking_ptr, 720*16, PCI_DMA_TODEVICE);
        } else {
 
        }
 
        /* Allocate the pseudo palette */
-       oi->ivtvfb_info.pseudo_palette = kmalloc(sizeof(u32) * 16, GFP_KERNEL);
+       oi->ivtvfb_info.pseudo_palette =
+               kmalloc(sizeof(u32) * 16, GFP_KERNEL|__GFP_NOWARN);
 
        if (!oi->ivtvfb_info.pseudo_palette) {
                IVTVFB_ERR("abort, unable to alloc pseudo pallete\n");
                return -EBUSY;
        }
 
-       itv->osd_info = kzalloc(sizeof(struct osd_info), GFP_ATOMIC);
+       itv->osd_info = kzalloc(sizeof(struct osd_info),
+                                       GFP_ATOMIC|__GFP_NOWARN);
        if (itv->osd_info == NULL) {
                IVTVFB_ERR("Failed to allocate memory for osd_info\n");
                return -ENOMEM;