return -EBUSY;
                }
 
+               if (!test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags)) {
+                       if (atomic_read(&itv->capturing) > 0) {
+                               /* switching to radio while capture is
+                                  in progress is not polite */
+                               kfree(item);
+                               return -EBUSY;
+                       }
+               }
+               /* Mark that the radio is being used. */
+               set_bit(IVTV_F_I_RADIO_USER, &itv->i_flags);
                /* We have the radio */
                ivtv_mute(itv);
                /* Switch tuner to radio */
                ivtv_call_i2c_clients(itv, AUDC_SET_RADIO, NULL);
-               /* Mark that the radio is being used. */
-               set_bit(IVTV_F_I_RADIO_USER, &itv->i_flags);
                /* Select the correct audio input (i.e. radio tuner) */
                ivtv_audio_set_io(itv);
                if (itv->hw_flags & IVTV_HW_SAA711X)
 
 void ivtv_unmute(struct ivtv *itv)
 {
-       /* initialize or refresh input */
-       if (atomic_read(&itv->capturing) == 0)
-               ivtv_vapi(itv, CX2341X_ENC_INITIALIZE_INPUT, 0);
-
-       ivtv_msleep_timeout(100, 0);
-
        if (atomic_read(&itv->capturing)) {
+               ivtv_msleep_timeout(100, 0);
                ivtv_vapi(itv, CX2341X_ENC_MISC, 1, 12);
                ivtv_vapi(itv, CX2341X_ENC_MUTE_AUDIO, 1, 0);
        }
 
                clear_bit(IVTV_F_I_EOS, &itv->i_flags);
 
                /* Initialize Digitizer for Capture */
+               itv->video_dec_func(itv, VIDIOC_STREAMOFF, 0);
+               ivtv_msleep_timeout(300, 1);
                ivtv_vapi(itv, CX2341X_ENC_INITIALIZE_INPUT, 0);
-
-               ivtv_msleep_timeout(100, 0);
+               itv->video_dec_func(itv, VIDIOC_STREAMON, 0);
        }
 
        /* begin_capture */
        int cap_type;
        unsigned long then;
        int stopmode;
-       u32 data[CX2341X_MBOX_MAX_DATA];
 
        if (s->v4l2dev == NULL)
                return -EINVAL;
                }
 
                then = jiffies;
-               /* Make sure DMA is complete */
-               add_wait_queue(&s->waitq, &wait);
-               do {
-                       /* check if DMA is pending */
-                       if ((s->type == IVTV_ENC_STREAM_TYPE_MPG) &&    /* MPG Only */
-                           (read_reg(IVTV_REG_DMASTATUS) & 0x02)) {
-                               /* Check for last DMA */
-                               ivtv_vapi_result(itv, data, CX2341X_ENC_GET_SEQ_END, 2, 0, 0);
-
-                               if (data[0] == 1) {
-                                       IVTV_DEBUG_DMA("%s: Last DMA of size 0x%08x\n", s->name, data[1]);
-                                       break;
-                               }
-                       } else if (read_reg(IVTV_REG_DMASTATUS) & 0x02) {
-                               break;
-                       }
-               } while (!ivtv_msleep_timeout(10, 1) &&
-                        then + msecs_to_jiffies(2000) > jiffies);
 
-               set_current_state(TASK_RUNNING);
-               remove_wait_queue(&s->waitq, &wait);
+               /* Handle any pending interrupts */
+               ivtv_msleep_timeout(100, 1);
        }
 
        atomic_dec(&itv->capturing);