1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef USBUSX2Y_H 3*4882a593Smuzhiyun #define USBUSX2Y_H 4*4882a593Smuzhiyun #include "../usbaudio.h" 5*4882a593Smuzhiyun #include "../midi.h" 6*4882a593Smuzhiyun #include "usbus428ctldefs.h" 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #define NRURBS 2 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define URBS_ASYNC_SEQ 10 12*4882a593Smuzhiyun #define URB_DATA_LEN_ASYNC_SEQ 32 13*4882a593Smuzhiyun struct snd_usx2y_async_seq { 14*4882a593Smuzhiyun struct urb *urb[URBS_ASYNC_SEQ]; 15*4882a593Smuzhiyun char *buffer; 16*4882a593Smuzhiyun }; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun struct snd_usx2y_urb_seq { 19*4882a593Smuzhiyun int submitted; 20*4882a593Smuzhiyun int len; 21*4882a593Smuzhiyun struct urb *urb[]; 22*4882a593Smuzhiyun }; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #include "usx2yhwdeppcm.h" 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct usx2ydev { 27*4882a593Smuzhiyun struct usb_device *dev; 28*4882a593Smuzhiyun int card_index; 29*4882a593Smuzhiyun int stride; 30*4882a593Smuzhiyun struct urb *in04_urb; 31*4882a593Smuzhiyun void *in04_buf; 32*4882a593Smuzhiyun char in04_last[24]; 33*4882a593Smuzhiyun unsigned in04_int_calls; 34*4882a593Smuzhiyun struct snd_usx2y_urb_seq *us04; 35*4882a593Smuzhiyun wait_queue_head_t in04_wait_queue; 36*4882a593Smuzhiyun struct snd_usx2y_async_seq as04; 37*4882a593Smuzhiyun unsigned int rate, 38*4882a593Smuzhiyun format; 39*4882a593Smuzhiyun int chip_status; 40*4882a593Smuzhiyun struct mutex pcm_mutex; 41*4882a593Smuzhiyun struct us428ctls_sharedmem *us428ctls_sharedmem; 42*4882a593Smuzhiyun int wait_iso_frame; 43*4882a593Smuzhiyun wait_queue_head_t us428ctls_wait_queue_head; 44*4882a593Smuzhiyun struct snd_usx2y_hwdep_pcm_shm *hwdep_pcm_shm; 45*4882a593Smuzhiyun struct snd_usx2y_substream *subs[4]; 46*4882a593Smuzhiyun struct snd_usx2y_substream * volatile prepare_subs; 47*4882a593Smuzhiyun wait_queue_head_t prepare_wait_queue; 48*4882a593Smuzhiyun struct list_head midi_list; 49*4882a593Smuzhiyun struct list_head pcm_list; 50*4882a593Smuzhiyun int pcm_devs; 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun struct snd_usx2y_substream { 55*4882a593Smuzhiyun struct usx2ydev *usx2y; 56*4882a593Smuzhiyun struct snd_pcm_substream *pcm_substream; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun int endpoint; 59*4882a593Smuzhiyun unsigned int maxpacksize; /* max packet size in bytes */ 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun atomic_t state; 62*4882a593Smuzhiyun #define STATE_STOPPED 0 63*4882a593Smuzhiyun #define STATE_STARTING1 1 64*4882a593Smuzhiyun #define STATE_STARTING2 2 65*4882a593Smuzhiyun #define STATE_STARTING3 3 66*4882a593Smuzhiyun #define STATE_PREPARED 4 67*4882a593Smuzhiyun #define STATE_PRERUNNING 6 68*4882a593Smuzhiyun #define STATE_RUNNING 8 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun int hwptr; /* free frame position in the buffer (only for playback) */ 71*4882a593Smuzhiyun int hwptr_done; /* processed frame position in the buffer */ 72*4882a593Smuzhiyun int transfer_done; /* processed frames since last period update */ 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct urb *urb[NRURBS]; /* data urb table */ 75*4882a593Smuzhiyun struct urb *completed_urb; 76*4882a593Smuzhiyun char *tmpbuf; /* temporary buffer for playback */ 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun #define usx2y(c) ((struct usx2ydev *)(c)->private_data) 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun int usx2y_audio_create(struct snd_card *card); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun int usx2y_async_seq04_init(struct usx2ydev *usx2y); 85*4882a593Smuzhiyun int usx2y_in04_init(struct usx2ydev *usx2y); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #define NAME_ALLCAPS "US-X2Y" 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun #endif 90