1*8b645922STakashi Iwai // SPDX-License-Identifier: GPL-2.0+ 2*8b645922STakashi Iwai /* 3*8b645922STakashi Iwai * Utility definitions for MIDI 2.0 function 4*8b645922STakashi Iwai */ 5*8b645922STakashi Iwai 6*8b645922STakashi Iwai #ifndef U_MIDI2_H 7*8b645922STakashi Iwai #define U_MIDI2_H 8*8b645922STakashi Iwai 9*8b645922STakashi Iwai #include <linux/usb/composite.h> 10*8b645922STakashi Iwai #include <sound/asound.h> 11*8b645922STakashi Iwai 12*8b645922STakashi Iwai struct f_midi2_opts; 13*8b645922STakashi Iwai struct f_midi2_ep_opts; 14*8b645922STakashi Iwai struct f_midi2_block_opts; 15*8b645922STakashi Iwai 16*8b645922STakashi Iwai /* UMP Function Block info */ 17*8b645922STakashi Iwai struct f_midi2_block_info { 18*8b645922STakashi Iwai unsigned int direction; /* FB direction: 1-3 */ 19*8b645922STakashi Iwai unsigned int first_group; /* first UMP group: 0-15 */ 20*8b645922STakashi Iwai unsigned int num_groups; /* number of UMP groups: 1-16 */ 21*8b645922STakashi Iwai unsigned int ui_hint; /* UI-hint: 0-3 */ 22*8b645922STakashi Iwai unsigned int midi_ci_version; /* MIDI-CI version: 0-255 */ 23*8b645922STakashi Iwai unsigned int sysex8_streams; /* number of sysex8 streams: 0-255 */ 24*8b645922STakashi Iwai unsigned int is_midi1; /* MIDI 1.0 port: 0-2 */ 25*8b645922STakashi Iwai bool active; /* FB active flag: bool */ 26*8b645922STakashi Iwai const char *name; /* FB name */ 27*8b645922STakashi Iwai }; 28*8b645922STakashi Iwai 29*8b645922STakashi Iwai /* UMP Endpoint info */ 30*8b645922STakashi Iwai struct f_midi2_ep_info { 31*8b645922STakashi Iwai unsigned int protocol_caps; /* protocol capabilities: 1-3 */ 32*8b645922STakashi Iwai unsigned int protocol; /* default protocol: 1-2 */ 33*8b645922STakashi Iwai unsigned int manufacturer; /* manufacturer id: 0-0xffffff */ 34*8b645922STakashi Iwai unsigned int family; /* device family id: 0-0xffff */ 35*8b645922STakashi Iwai unsigned int model; /* device model id: 0x-0xffff */ 36*8b645922STakashi Iwai unsigned int sw_revision; /* software revision: 32bit */ 37*8b645922STakashi Iwai 38*8b645922STakashi Iwai const char *ep_name; /* Endpoint name */ 39*8b645922STakashi Iwai const char *product_id; /* Product ID */ 40*8b645922STakashi Iwai }; 41*8b645922STakashi Iwai 42*8b645922STakashi Iwai struct f_midi2_card_info { 43*8b645922STakashi Iwai bool process_ump; /* process UMP stream: bool */ 44*8b645922STakashi Iwai bool static_block; /* static FBs: bool */ 45*8b645922STakashi Iwai unsigned int req_buf_size; /* request buffer size */ 46*8b645922STakashi Iwai unsigned int num_reqs; /* number of requests */ 47*8b645922STakashi Iwai const char *iface_name; /* interface name */ 48*8b645922STakashi Iwai }; 49*8b645922STakashi Iwai 50*8b645922STakashi Iwai struct f_midi2_block_opts { 51*8b645922STakashi Iwai struct config_group group; 52*8b645922STakashi Iwai unsigned int id; 53*8b645922STakashi Iwai struct f_midi2_block_info info; 54*8b645922STakashi Iwai struct f_midi2_ep_opts *ep; 55*8b645922STakashi Iwai }; 56*8b645922STakashi Iwai 57*8b645922STakashi Iwai struct f_midi2_ep_opts { 58*8b645922STakashi Iwai struct config_group group; 59*8b645922STakashi Iwai unsigned int index; 60*8b645922STakashi Iwai struct f_midi2_ep_info info; 61*8b645922STakashi Iwai struct f_midi2_block_opts *blks[SNDRV_UMP_MAX_BLOCKS]; 62*8b645922STakashi Iwai struct f_midi2_opts *opts; 63*8b645922STakashi Iwai }; 64*8b645922STakashi Iwai 65*8b645922STakashi Iwai #define MAX_UMP_EPS 4 66*8b645922STakashi Iwai #define MAX_CABLES 16 67*8b645922STakashi Iwai 68*8b645922STakashi Iwai struct f_midi2_opts { 69*8b645922STakashi Iwai struct usb_function_instance func_inst; 70*8b645922STakashi Iwai struct mutex lock; 71*8b645922STakashi Iwai int refcnt; 72*8b645922STakashi Iwai 73*8b645922STakashi Iwai struct f_midi2_card_info info; 74*8b645922STakashi Iwai 75*8b645922STakashi Iwai unsigned int num_eps; 76*8b645922STakashi Iwai struct f_midi2_ep_opts *eps[MAX_UMP_EPS]; 77*8b645922STakashi Iwai }; 78*8b645922STakashi Iwai 79*8b645922STakashi Iwai #endif /* U_MIDI2_H */ 80