*/
        unsigned int frame = read_reg(0x28c0) & 1;
        struct yuv_playback_info *yi = &itv->yuv_info;
-       int last_dma_frame = atomic_read(&itv->yuv_info.next_dma_frame);
+       int last_dma_frame = atomic_read(&yi->next_dma_frame);
        struct yuv_frame_info *f = &yi->new_frame_info[last_dma_frame];
 
        if (0) IVTV_DEBUG_IRQ("DEC VSYNC\n");
                                next_dma_frame = (next_dma_frame + 1) % IVTV_YUV_BUFFERS;
                                atomic_set(&yi->next_dma_frame, next_dma_frame);
                                yi->fields_lapsed = -1;
+                               yi->running = 1;
                        }
                }
        }
                }
 
                /* Check if we need to update the yuv registers */
-               if ((yi->yuv_forced_update || f->update) && last_dma_frame != -1) {
+               if (yi->running && (yi->yuv_forced_update || f->update)) {
                        if (!f->update) {
-                               last_dma_frame = (u8)(last_dma_frame - 1) % IVTV_YUV_BUFFERS;
+                               last_dma_frame =
+                                       (u8)(atomic_read(&yi->next_dma_frame) -
+                                                1) % IVTV_YUV_BUFFERS;
                                f = &yi->new_frame_info[last_dma_frame];
                        }
 
 
        IVTV_DEBUG_YUV("ivtv_yuv_close\n");
        ivtv_waitq(&itv->vsync_waitq);
 
+       yi->running = 0;
        atomic_set(&yi->next_dma_frame, -1);
        atomic_set(&yi->next_fill_frame, 0);