.trigger        = midi_phys_playback_trigger,
 };
 
+static int midi_ctl_open(struct snd_rawmidi_substream *substream)
+{
+       /* Do nothing. */
+       return 0;
+}
+
+static int midi_ctl_capture_close(struct snd_rawmidi_substream *substream)
+{
+       /* Do nothing. */
+       return 0;
+}
+
+static int midi_ctl_playback_close(struct snd_rawmidi_substream *substream)
+{
+       struct snd_dg00x *dg00x = substream->rmidi->private_data;
+
+       snd_fw_async_midi_port_finish(&dg00x->out_control);
+
+       return 0;
+}
+
+static void midi_ctl_capture_trigger(struct snd_rawmidi_substream *substream,
+                                    int up)
+{
+       struct snd_dg00x *dg00x = substream->rmidi->private_data;
+       unsigned long flags;
+
+       spin_lock_irqsave(&dg00x->lock, flags);
+
+       if (up)
+               dg00x->in_control = substream;
+       else
+               dg00x->in_control = NULL;
+
+       spin_unlock_irqrestore(&dg00x->lock, flags);
+}
+
+static void midi_ctl_playback_trigger(struct snd_rawmidi_substream *substream,
+                                     int up)
+{
+       struct snd_dg00x *dg00x = substream->rmidi->private_data;
+       unsigned long flags;
+
+       spin_lock_irqsave(&dg00x->lock, flags);
+
+       if (up)
+               snd_fw_async_midi_port_run(&dg00x->out_control, substream);
+
+       spin_unlock_irqrestore(&dg00x->lock, flags);
+}
+
+static struct snd_rawmidi_ops midi_ctl_capture_ops = {
+       .open           = midi_ctl_open,
+       .close          = midi_ctl_capture_close,
+       .trigger        = midi_ctl_capture_trigger,
+};
+
+static struct snd_rawmidi_ops midi_ctl_playback_ops = {
+       .open           = midi_ctl_open,
+       .close          = midi_ctl_playback_close,
+       .trigger        = midi_ctl_playback_trigger,
+};
+
 static void set_midi_substream_names(struct snd_dg00x *dg00x,
                                     struct snd_rawmidi_str *str)
 {