/* Initialize the Line6 MIDI subsystem. */ int line6_init_midi(struct usb_line6 *line6) { static struct snd_device_ops midi_ops = { .dev_free = snd_line6_midi_free, }; int err; struct snd_line6_midi *line6midi; if (!(line6->properties->capabilities & LINE6_BIT_CONTROL)) { /* skip MIDI initialization and report success */ return 0; } line6midi = kzalloc(sizeof(struct snd_line6_midi), GFP_KERNEL); if (line6midi == NULL) return -ENOMEM; err = line6_midibuf_init(&line6midi->midibuf_in, MIDI_BUFFER_SIZE, 0); if (err < 0) return err; err = line6_midibuf_init(&line6midi->midibuf_out, MIDI_BUFFER_SIZE, 1); if (err < 0) return err; line6midi->line6 = line6; line6midi->midi_mask_transmit = 1; line6midi->midi_mask_receive = 4; line6->line6midi = line6midi; err = snd_device_new(line6->card, SNDRV_DEV_RAWMIDI, line6midi, &midi_ops); if (err < 0) return err; snd_card_set_dev(line6->card, line6->ifcdev); err = snd_line6_new_midi(line6midi); if (err < 0) return err; err = device_create_file(line6->ifcdev, &dev_attr_midi_mask_transmit); if (err < 0) return err; err = device_create_file(line6->ifcdev, &dev_attr_midi_mask_receive); if (err < 0) return err; init_waitqueue_head(&line6midi->send_wait); spin_lock_init(&line6midi->send_urb_lock); spin_lock_init(&line6midi->midi_transmit_lock); return 0; }
/* Initialize the Line 6 MIDI subsystem. */ int line6_init_midi(struct usb_line6 *line6) { int err; struct snd_rawmidi *rmidi; struct snd_line6_midi *line6midi; if (!(line6->properties->capabilities & LINE6_CAP_CONTROL)) { /* skip MIDI initialization and report success */ return 0; } err = snd_line6_new_midi(line6, &rmidi); if (err < 0) return err; line6midi = kzalloc(sizeof(struct snd_line6_midi), GFP_KERNEL); if (!line6midi) return -ENOMEM; rmidi->private_data = line6midi; rmidi->private_free = snd_line6_midi_free; init_waitqueue_head(&line6midi->send_wait); spin_lock_init(&line6midi->lock); line6midi->line6 = line6; err = line6_midibuf_init(&line6midi->midibuf_in, MIDI_BUFFER_SIZE, 0); if (err < 0) return err; err = line6_midibuf_init(&line6midi->midibuf_out, MIDI_BUFFER_SIZE, 1); if (err < 0) return err; line6->line6midi = line6midi; return 0; }
int line6_init_midi(struct usb_line6 *line6) { static struct snd_device_ops midi_ops = { .dev_free = snd_line6_midi_free, }; int err; struct snd_line6_midi *line6midi; if (!(line6->properties->capabilities & LINE6_BIT_CONTROL)) { return 0; } line6midi = kzalloc(sizeof(struct snd_line6_midi), GFP_KERNEL); if (line6midi == NULL) return -ENOMEM; err = line6_midibuf_init(&line6midi->midibuf_in, MIDI_BUFFER_SIZE, 0); if (err < 0) { kfree(line6midi); return err; } err = line6_midibuf_init(&line6midi->midibuf_out, MIDI_BUFFER_SIZE, 1); if (err < 0) { kfree(line6midi->midibuf_in.buf); kfree(line6midi); return err; } line6midi->line6 = line6; switch(line6->product) { case LINE6_DEVID_PODHD300: case LINE6_DEVID_PODHD500: line6midi->midi_mask_transmit = 1; line6midi->midi_mask_receive = 1; break; default: line6midi->midi_mask_transmit = 1; line6midi->midi_mask_receive = 4; } line6->line6midi = line6midi; err = snd_device_new(line6->card, SNDRV_DEV_RAWMIDI, line6midi, &midi_ops); if (err < 0) return err; snd_card_set_dev(line6->card, line6->ifcdev); err = snd_line6_new_midi(line6midi); if (err < 0) return err; err = device_create_file(line6->ifcdev, &dev_attr_midi_mask_transmit); if (err < 0) return err; err = device_create_file(line6->ifcdev, &dev_attr_midi_mask_receive); if (err < 0) return err; init_waitqueue_head(&line6midi->send_wait); spin_lock_init(&line6midi->send_urb_lock); spin_lock_init(&line6midi->midi_transmit_lock); return 0; }