Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: gadget: midi2: MIDI 1.0 interface (altset 0) support

This patch extends MIDI 2.0 function driver to add more proper support
for MIDI 1.0 interface. Before this patch, the driver only exposes
the USB descriptor of a MIDI 1.0 interface in altset 0 while no actual
I/O is running for it. This patch enables the actual I/O for the
altset 0; the backend UMP rawmidi is translated from/to the MIDI 1.0
USB commands.

For converting to USB MIDI 1.0 data protocol, a helper function is
copied from the existing f_midi driver, in addition to a few other UMP
Core helper functions. For the MIDI 1.0 OUT (that is, input for
gadget), the incoming USB MIDI 1.0 packet is translated to UMP packets
via UMP Core helper, and tossed to the attached UMP rawmidi. It's a
relatively straightforward. OTOH, for MIDI 1.0 IN (i.e. output for
gadget), it's a bit more complex: we need to convert a source UMP
packet once to the standard MIDI 1.0 byte stream, and convert it again
to USB MIDI 1.0 packets, then send them out.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/20230725062206.9674-5-tiwai@suse.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Takashi Iwai and committed by
Greg Kroah-Hartman
d6468be7 856fa444

+452 -42
+452 -42
drivers/usb/gadget/function/f_midi2.c
··· 11 11 #include <sound/core.h> 12 12 #include <sound/ump.h> 13 13 #include <sound/ump_msg.h> 14 + #include <sound/ump_convert.h> 14 15 15 16 #include <linux/usb/ch9.h> 16 17 #include <linux/usb/gadget.h> ··· 49 48 struct snd_ump_block *fb; /* assigned FB */ 50 49 unsigned int gtb_id; /* assigned GTB id */ 51 50 unsigned int string_id; /* assigned string id */ 51 + }; 52 + 53 + /* Temporary buffer for altset 0 MIDI 1.0 handling */ 54 + struct f_midi2_midi1_port { 55 + unsigned int pending; /* pending bytes on the input buffer */ 56 + u8 buf[32]; /* raw MIDI 1.0 byte input */ 57 + u8 state; /* running status */ 58 + u8 data[2]; /* rendered USB MIDI 1.0 packet data */ 59 + }; 60 + 61 + /* MIDI 1.0 message states */ 62 + enum { 63 + STATE_INITIAL = 0, /* pseudo state */ 64 + STATE_1PARAM, 65 + STATE_2PARAM_1, 66 + STATE_2PARAM_2, 67 + STATE_SYSEX_0, 68 + STATE_SYSEX_1, 69 + STATE_SYSEX_2, 70 + STATE_REAL_TIME, 71 + STATE_FINISHED, /* pseudo state */ 52 72 }; 53 73 54 74 /* Resources for UMP Endpoint */ ··· 110 88 /* MIDI 1.0 in/out USB EPs */ 111 89 struct f_midi2_usb_ep midi1_ep_in; 112 90 struct f_midi2_usb_ep midi1_ep_out; 91 + 92 + /* conversion for MIDI 1.0 EP-in */ 93 + struct f_midi2_midi1_port midi1_port[MAX_CABLES]; 94 + /* conversion for MIDI 1.0 EP-out */ 95 + struct ump_cvt_to_ump midi1_ump_cvt; 113 96 114 97 int midi_if; /* USB MIDI interface number */ 115 98 int operation_mode; /* current operation mode */ ··· 734 707 process_ump_transmit(ep); 735 708 } 736 709 710 + /* 711 + * MIDI1 (altset 0) USB request handling 712 + */ 713 + 714 + /* process one MIDI byte -- copied from f_midi.c 715 + * 716 + * fill the packet or request if needed 717 + * returns true if the request became empty (queued) 718 + */ 719 + static bool process_midi1_byte(struct f_midi2 *midi2, u8 cable, u8 b, 720 + struct usb_request **req_p) 721 + { 722 + struct f_midi2_midi1_port *port = &midi2->midi1_port[cable]; 723 + u8 p[4] = { cable << 4, 0, 0, 0 }; 724 + int next_state = STATE_INITIAL; 725 + struct usb_request *req = *req_p; 726 + 727 + switch (b) { 728 + case 0xf8 ... 0xff: 729 + /* System Real-Time Messages */ 730 + p[0] |= 0x0f; 731 + p[1] = b; 732 + next_state = port->state; 733 + port->state = STATE_REAL_TIME; 734 + break; 735 + 736 + case 0xf7: 737 + /* End of SysEx */ 738 + switch (port->state) { 739 + case STATE_SYSEX_0: 740 + p[0] |= 0x05; 741 + p[1] = 0xf7; 742 + next_state = STATE_FINISHED; 743 + break; 744 + case STATE_SYSEX_1: 745 + p[0] |= 0x06; 746 + p[1] = port->data[0]; 747 + p[2] = 0xf7; 748 + next_state = STATE_FINISHED; 749 + break; 750 + case STATE_SYSEX_2: 751 + p[0] |= 0x07; 752 + p[1] = port->data[0]; 753 + p[2] = port->data[1]; 754 + p[3] = 0xf7; 755 + next_state = STATE_FINISHED; 756 + break; 757 + default: 758 + /* Ignore byte */ 759 + next_state = port->state; 760 + port->state = STATE_INITIAL; 761 + } 762 + break; 763 + 764 + case 0xf0 ... 0xf6: 765 + /* System Common Messages */ 766 + port->data[0] = port->data[1] = 0; 767 + port->state = STATE_INITIAL; 768 + switch (b) { 769 + case 0xf0: 770 + port->data[0] = b; 771 + port->data[1] = 0; 772 + next_state = STATE_SYSEX_1; 773 + break; 774 + case 0xf1: 775 + case 0xf3: 776 + port->data[0] = b; 777 + next_state = STATE_1PARAM; 778 + break; 779 + case 0xf2: 780 + port->data[0] = b; 781 + next_state = STATE_2PARAM_1; 782 + break; 783 + case 0xf4: 784 + case 0xf5: 785 + next_state = STATE_INITIAL; 786 + break; 787 + case 0xf6: 788 + p[0] |= 0x05; 789 + p[1] = 0xf6; 790 + next_state = STATE_FINISHED; 791 + break; 792 + } 793 + break; 794 + 795 + case 0x80 ... 0xef: 796 + /* 797 + * Channel Voice Messages, Channel Mode Messages 798 + * and Control Change Messages. 799 + */ 800 + port->data[0] = b; 801 + port->data[1] = 0; 802 + port->state = STATE_INITIAL; 803 + if (b >= 0xc0 && b <= 0xdf) 804 + next_state = STATE_1PARAM; 805 + else 806 + next_state = STATE_2PARAM_1; 807 + break; 808 + 809 + case 0x00 ... 0x7f: 810 + /* Message parameters */ 811 + switch (port->state) { 812 + case STATE_1PARAM: 813 + if (port->data[0] < 0xf0) 814 + p[0] |= port->data[0] >> 4; 815 + else 816 + p[0] |= 0x02; 817 + 818 + p[1] = port->data[0]; 819 + p[2] = b; 820 + /* This is to allow Running State Messages */ 821 + next_state = STATE_1PARAM; 822 + break; 823 + case STATE_2PARAM_1: 824 + port->data[1] = b; 825 + next_state = STATE_2PARAM_2; 826 + break; 827 + case STATE_2PARAM_2: 828 + if (port->data[0] < 0xf0) 829 + p[0] |= port->data[0] >> 4; 830 + else 831 + p[0] |= 0x03; 832 + 833 + p[1] = port->data[0]; 834 + p[2] = port->data[1]; 835 + p[3] = b; 836 + /* This is to allow Running State Messages */ 837 + next_state = STATE_2PARAM_1; 838 + break; 839 + case STATE_SYSEX_0: 840 + port->data[0] = b; 841 + next_state = STATE_SYSEX_1; 842 + break; 843 + case STATE_SYSEX_1: 844 + port->data[1] = b; 845 + next_state = STATE_SYSEX_2; 846 + break; 847 + case STATE_SYSEX_2: 848 + p[0] |= 0x04; 849 + p[1] = port->data[0]; 850 + p[2] = port->data[1]; 851 + p[3] = b; 852 + next_state = STATE_SYSEX_0; 853 + break; 854 + } 855 + break; 856 + } 857 + 858 + /* States where we have to write into the USB request */ 859 + if (next_state == STATE_FINISHED || 860 + port->state == STATE_SYSEX_2 || 861 + port->state == STATE_1PARAM || 862 + port->state == STATE_2PARAM_2 || 863 + port->state == STATE_REAL_TIME) { 864 + memcpy(req->buf + req->length, p, sizeof(p)); 865 + req->length += sizeof(p); 866 + 867 + if (next_state == STATE_FINISHED) { 868 + next_state = STATE_INITIAL; 869 + port->data[0] = port->data[1] = 0; 870 + } 871 + 872 + if (midi2->info.req_buf_size - req->length <= 4) { 873 + queue_request_ep_raw(req); 874 + *req_p = NULL; 875 + return true; 876 + } 877 + } 878 + 879 + port->state = next_state; 880 + return false; 881 + } 882 + 883 + /* process all pending MIDI bytes in the internal buffer; 884 + * returns true if the request gets empty 885 + * returns false if all have been processed 886 + */ 887 + static bool process_midi1_pending_buf(struct f_midi2 *midi2, 888 + struct usb_request **req_p) 889 + { 890 + unsigned int cable, c; 891 + 892 + for (cable = 0; cable < midi2->midi2_eps[0].blks[0].info.num_groups; 893 + cable++) { 894 + struct f_midi2_midi1_port *port = &midi2->midi1_port[cable]; 895 + 896 + if (!port->pending) 897 + continue; 898 + for (c = 0; c < port->pending; c++) { 899 + if (process_midi1_byte(midi2, cable, port->buf[c], 900 + req_p)) { 901 + port->pending -= c; 902 + if (port->pending) 903 + memmove(port->buf, port->buf + c, 904 + port->pending); 905 + return true; 906 + } 907 + } 908 + port->pending = 0; 909 + } 910 + 911 + return false; 912 + } 913 + 914 + /* fill the MIDI bytes onto the temporary buffer 915 + */ 916 + static void fill_midi1_pending_buf(struct f_midi2 *midi2, u8 cable, u8 *buf, 917 + unsigned int size) 918 + { 919 + struct f_midi2_midi1_port *port = &midi2->midi1_port[cable]; 920 + 921 + if (port->pending + size > sizeof(port->buf)) 922 + return; 923 + memcpy(port->buf + port->pending, buf, size); 924 + port->pending += size; 925 + } 926 + 927 + /* try to process data given from the associated UMP stream */ 928 + static void process_midi1_transmit(struct f_midi2 *midi2) 929 + { 930 + struct f_midi2_usb_ep *usb_ep = &midi2->midi1_ep_in; 931 + struct f_midi2_ep *ep = &midi2->midi2_eps[0]; 932 + struct usb_request *req = NULL; 933 + /* 12 is the largest outcome (4 MIDI1 cmds) for a single UMP packet */ 934 + unsigned char outbuf[12]; 935 + unsigned char group; 936 + int len, size, cable; 937 + u32 ump; 938 + 939 + if (!usb_ep->usb_ep || !usb_ep->usb_ep->enabled) 940 + return; 941 + 942 + for (;;) { 943 + if (!req) { 944 + req = get_empty_request(usb_ep); 945 + if (!req) 946 + break; 947 + } 948 + 949 + if (process_midi1_pending_buf(midi2, &req)) 950 + continue; 951 + 952 + len = snd_ump_transmit(ep->ump, &ump, 4); 953 + if (len <= 0) 954 + break; 955 + if (snd_ump_receive_ump_val(ep->ump, ump) <= 0) 956 + continue; 957 + size = snd_ump_convert_from_ump(ep->ump->input_buf, outbuf, 958 + &group); 959 + if (size <= 0) 960 + continue; 961 + cable = group - ep->blks[0].info.first_group; 962 + if (cable < 0 || cable >= ep->blks[0].info.num_groups) 963 + continue; 964 + fill_midi1_pending_buf(midi2, cable, outbuf, size); 965 + } 966 + 967 + if (req) { 968 + if (req->length) 969 + queue_request_ep_raw(req); 970 + else 971 + put_empty_request(req); 972 + } 973 + } 974 + 975 + /* complete handler for MIDI1 EP-in requests */ 976 + static void f_midi2_midi1_ep_in_complete(struct usb_ep *usb_ep, 977 + struct usb_request *req) 978 + { 979 + struct f_midi2_req_ctx *ctx = req->context; 980 + struct f_midi2 *midi2 = ctx->usb_ep->card; 981 + int status = req->status; 982 + 983 + put_empty_request(req); 984 + 985 + if (status) { 986 + DBG(midi2, "%s complete error %d: %d/%d\n", 987 + usb_ep->name, status, req->actual, req->length); 988 + return; 989 + } 990 + 991 + process_midi1_transmit(midi2); 992 + } 993 + 994 + /* complete handler for MIDI1 EP-out requests */ 995 + static void f_midi2_midi1_ep_out_complete(struct usb_ep *usb_ep, 996 + struct usb_request *req) 997 + { 998 + struct f_midi2_req_ctx *ctx = req->context; 999 + struct f_midi2 *midi2 = ctx->usb_ep->card; 1000 + struct f_midi2_ep *ep = &midi2->midi2_eps[0]; 1001 + struct ump_cvt_to_ump *cvt = &midi2->midi1_ump_cvt; 1002 + static const u8 midi1_packet_bytes[16] = { 1003 + 0, 0, 2, 3, 3, 1, 2, 3, 3, 3, 3, 3, 2, 2, 3, 1 1004 + }; 1005 + unsigned int group, bytes, c, len; 1006 + int status = req->status; 1007 + const u8 *buf = req->buf; 1008 + 1009 + if (status) { 1010 + DBG(midi2, "%s complete error %d: %d/%d\n", 1011 + usb_ep->name, status, req->actual, req->length); 1012 + goto error; 1013 + } 1014 + 1015 + len = req->actual >> 2; 1016 + for (; len; len--, buf += 4) { 1017 + group = *buf >> 4; 1018 + if (group >= ep->blks[0].info.num_groups) 1019 + continue; 1020 + group += ep->blks[0].info.first_group; 1021 + bytes = midi1_packet_bytes[*buf & 0x0f]; 1022 + for (c = 0; c < bytes; c++) { 1023 + snd_ump_convert_to_ump(cvt, group, ep->info.protocol, 1024 + buf[c + 1]); 1025 + if (cvt->ump_bytes) { 1026 + snd_ump_receive(ep->ump, cvt->ump, 1027 + cvt->ump_bytes); 1028 + cvt->ump_bytes = 0; 1029 + } 1030 + } 1031 + } 1032 + 1033 + if (midi2->operation_mode != MIDI_OP_MODE_MIDI1) 1034 + goto error; 1035 + 1036 + if (queue_request_ep_raw(req)) 1037 + goto error; 1038 + return; 1039 + 1040 + error: 1041 + put_empty_request(req); 1042 + } 1043 + 1044 + /* 1045 + * Common EP handling helpers 1046 + */ 1047 + 737 1048 /* Start MIDI EP */ 738 1049 static int f_midi2_start_ep(struct f_midi2_usb_ep *usb_ep, 739 1050 struct usb_function *fn) 740 1051 { 741 1052 int err; 1053 + 1054 + if (!usb_ep->usb_ep) 1055 + return 0; 742 1056 743 1057 usb_ep_disable(usb_ep->usb_ep); 744 1058 err = config_ep_by_speed(usb_ep->card->gadget, fn, usb_ep->usb_ep); ··· 1093 725 { 1094 726 int i; 1095 727 1096 - if (!usb_ep->num_reqs) 728 + if (!usb_ep->usb_ep || !usb_ep->num_reqs) 1097 729 return; 1098 730 1099 731 for (i = 0; i < usb_ep->num_reqs; i++) { ··· 1110 742 struct f_midi2 *midi2 = usb_ep->card; 1111 743 int i; 1112 744 745 + if (!usb_ep->usb_ep) 746 + return 0; 1113 747 if (!usb_ep->reqs) 1114 748 return -EINVAL; 1115 749 ··· 1144 774 /* Initialize EP */ 1145 775 static int f_midi2_init_ep(struct f_midi2 *midi2, struct f_midi2_ep *ep, 1146 776 struct f_midi2_usb_ep *usb_ep, 1147 - void *desc, int num_reqs, 777 + void *desc, 1148 778 void (*complete)(struct usb_ep *usb_ep, 1149 779 struct usb_request *req)) 1150 780 { ··· 1157 787 return -ENODEV; 1158 788 usb_ep->complete = complete; 1159 789 1160 - if (num_reqs) { 1161 - usb_ep->reqs = kcalloc(num_reqs, sizeof(*usb_ep->reqs), 1162 - GFP_KERNEL); 1163 - if (!usb_ep->reqs) 1164 - return -ENOMEM; 1165 - for (i = 0; i < num_reqs; i++) { 1166 - usb_ep->reqs[i].index = i; 1167 - usb_ep->reqs[i].usb_ep = usb_ep; 1168 - set_bit(i, &usb_ep->free_reqs); 1169 - usb_ep->num_reqs++; 1170 - } 790 + usb_ep->reqs = kcalloc(midi2->info.num_reqs, sizeof(*usb_ep->reqs), 791 + GFP_KERNEL); 792 + if (!usb_ep->reqs) 793 + return -ENOMEM; 794 + for (i = 0; i < midi2->info.num_reqs; i++) { 795 + usb_ep->reqs[i].index = i; 796 + usb_ep->reqs[i].usb_ep = usb_ep; 797 + set_bit(i, &usb_ep->free_reqs); 798 + usb_ep->num_reqs++; 1171 799 } 1172 800 1173 801 return 0; ··· 1189 821 { 1190 822 int i, err; 1191 823 824 + if (!usb_ep->usb_ep) 825 + return; 826 + 1192 827 for (i = 0; i < usb_ep->num_reqs; i++) { 1193 828 if (!test_bit(i, &usb_ep->free_reqs) || !usb_ep->reqs[i].req) 1194 829 continue; ··· 1206 835 /* 1207 836 * Gadget Function callbacks 1208 837 */ 838 + 839 + /* stop both IN and OUT EPs */ 840 + static void f_midi2_stop_eps(struct f_midi2_usb_ep *ep_in, 841 + struct f_midi2_usb_ep *ep_out) 842 + { 843 + f_midi2_drop_reqs(ep_in); 844 + f_midi2_drop_reqs(ep_out); 845 + f_midi2_free_ep_reqs(ep_in); 846 + f_midi2_free_ep_reqs(ep_out); 847 + } 848 + 849 + /* start/queue both IN and OUT EPs */ 850 + static int f_midi2_start_eps(struct f_midi2_usb_ep *ep_in, 851 + struct f_midi2_usb_ep *ep_out, 852 + struct usb_function *fn) 853 + { 854 + int err; 855 + 856 + err = f_midi2_start_ep(ep_in, fn); 857 + if (err) 858 + return err; 859 + err = f_midi2_start_ep(ep_out, fn); 860 + if (err) 861 + return err; 862 + 863 + err = f_midi2_alloc_ep_reqs(ep_in); 864 + if (err) 865 + return err; 866 + err = f_midi2_alloc_ep_reqs(ep_out); 867 + if (err) 868 + return err; 869 + 870 + f_midi2_queue_out_reqs(ep_out); 871 + return 0; 872 + } 1209 873 1210 874 /* gadget function set_alt callback */ 1211 875 static int f_midi2_set_alt(struct usb_function *fn, unsigned int intf, ··· 1265 859 1266 860 midi2->operation_mode = op_mode; 1267 861 862 + if (op_mode != MIDI_OP_MODE_MIDI1) 863 + f_midi2_stop_eps(&midi2->midi1_ep_in, &midi2->midi1_ep_out); 864 + 1268 865 if (op_mode != MIDI_OP_MODE_MIDI2) { 1269 866 for (i = 0; i < midi2->num_eps; i++) { 1270 867 ep = &midi2->midi2_eps[i]; 1271 - f_midi2_drop_reqs(&ep->ep_in); 1272 - f_midi2_drop_reqs(&ep->ep_out); 1273 - f_midi2_free_ep_reqs(&ep->ep_in); 1274 - f_midi2_free_ep_reqs(&ep->ep_out); 868 + f_midi2_stop_eps(&ep->ep_in, &ep->ep_out); 1275 869 } 1276 - return 0; 1277 870 } 1278 871 1279 - for (i = 0; i < midi2->num_eps; i++) { 1280 - ep = &midi2->midi2_eps[i]; 872 + if (op_mode == MIDI_OP_MODE_MIDI1) 873 + return f_midi2_start_eps(&midi2->midi1_ep_in, 874 + &midi2->midi1_ep_out, fn); 1281 875 1282 - err = f_midi2_start_ep(&ep->ep_in, fn); 1283 - if (err) 1284 - return err; 1285 - err = f_midi2_start_ep(&ep->ep_out, fn); 1286 - if (err) 1287 - return err; 876 + if (op_mode == MIDI_OP_MODE_MIDI2) { 877 + for (i = 0; i < midi2->num_eps; i++) { 878 + ep = &midi2->midi2_eps[i]; 1288 879 1289 - err = f_midi2_alloc_ep_reqs(&ep->ep_in); 1290 - if (err) 1291 - return err; 1292 - err = f_midi2_alloc_ep_reqs(&ep->ep_out); 1293 - if (err) 1294 - return err; 1295 - 1296 - f_midi2_queue_out_reqs(&ep->ep_out); 880 + err = f_midi2_start_eps(&ep->ep_in, &ep->ep_out, fn); 881 + if (err) 882 + return err; 883 + } 1297 884 } 1298 885 1299 886 return 0; ··· 1425 1026 static void f_midi2_ump_trigger(struct snd_ump_endpoint *ump, int dir, int up) 1426 1027 { 1427 1028 struct f_midi2_ep *ep = ump->private_data; 1029 + struct f_midi2 *midi2 = ep->card; 1428 1030 1429 - if (up && dir == SNDRV_RAWMIDI_STREAM_OUTPUT) 1430 - process_ump_transmit(ep); 1031 + if (up && dir == SNDRV_RAWMIDI_STREAM_OUTPUT) { 1032 + switch (midi2->operation_mode) { 1033 + case MIDI_OP_MODE_MIDI1: 1034 + process_midi1_transmit(midi2); 1035 + break; 1036 + case MIDI_OP_MODE_MIDI2: 1037 + process_ump_transmit(ep); 1038 + break; 1039 + } 1040 + } 1431 1041 } 1432 1042 1433 1043 static void f_midi2_ump_drain(struct snd_ump_endpoint *ump, int dir) ··· 1568 1160 1569 1161 /* MIDI 1.0 jacks */ 1570 1162 unsigned char jack_in, jack_out, jack_id; 1571 - struct usb_midi_in_jack_descriptor jack_ins[16]; 1572 - struct usb_midi_out_jack_descriptor_1 jack_outs[16]; 1163 + struct usb_midi_in_jack_descriptor jack_ins[MAX_CABLES]; 1164 + struct usb_midi_out_jack_descriptor_1 jack_outs[MAX_CABLES]; 1573 1165 }; 1574 1166 1575 1167 static int append_config(struct f_midi2_usb_config *config, void *d) ··· 1830 1422 fill_midi2_class_desc(ep, &midi2_midi2_ep_in_class_desc[index]); 1831 1423 1832 1424 return f_midi2_init_ep(midi2, ep, &ep->ep_in, desc, 1833 - midi2->info.num_reqs, f_midi2_ep_in_complete); 1425 + f_midi2_ep_in_complete); 1834 1426 } 1835 1427 1836 1428 /* initialize MIDI2 EP-out */ ··· 1847 1439 fill_midi2_class_desc(ep, &midi2_midi2_ep_out_class_desc[index]); 1848 1440 1849 1441 return f_midi2_init_ep(midi2, ep, &ep->ep_out, desc, 1850 - midi2->info.num_reqs, f_midi2_ep_out_complete); 1442 + f_midi2_ep_out_complete); 1851 1443 } 1852 1444 1853 1445 /* gadget function bind callback */ ··· 1912 1504 /* allocate instance-specific endpoints */ 1913 1505 if (midi2->midi2_eps[0].blks[0].info.direction != SNDRV_UMP_DIR_OUTPUT) { 1914 1506 status = f_midi2_init_ep(midi2, NULL, &midi2->midi1_ep_in, 1915 - &midi2_midi1_ep_in_desc, 0, NULL); 1507 + &midi2_midi1_ep_in_desc, 1508 + f_midi2_midi1_ep_in_complete); 1916 1509 if (status) 1917 1510 goto fail; 1918 1511 } 1919 1512 1920 1513 if (midi2->midi2_eps[0].blks[0].info.direction != SNDRV_UMP_DIR_INPUT) { 1921 1514 status = f_midi2_init_ep(midi2, NULL, &midi2->midi1_ep_out, 1922 - &midi2_midi1_ep_out_desc, 0, NULL); 1515 + &midi2_midi1_ep_out_desc, 1516 + f_midi2_midi1_ep_out_complete); 1923 1517 if (status) 1924 1518 goto fail; 1925 1519 }