1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef CAIAQ_DEVICE_H 3*4882a593Smuzhiyun #define CAIAQ_DEVICE_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include "../usbaudio.h" 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #define USB_VID_NATIVEINSTRUMENTS 0x17cc 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define USB_PID_RIGKONTROL2 0x1969 10*4882a593Smuzhiyun #define USB_PID_RIGKONTROL3 0x1940 11*4882a593Smuzhiyun #define USB_PID_KORECONTROLLER 0x4711 12*4882a593Smuzhiyun #define USB_PID_KORECONTROLLER2 0x4712 13*4882a593Smuzhiyun #define USB_PID_AK1 0x0815 14*4882a593Smuzhiyun #define USB_PID_AUDIO2DJ 0x041c 15*4882a593Smuzhiyun #define USB_PID_AUDIO4DJ 0x0839 16*4882a593Smuzhiyun #define USB_PID_AUDIO8DJ 0x1978 17*4882a593Smuzhiyun #define USB_PID_SESSIONIO 0x1915 18*4882a593Smuzhiyun #define USB_PID_GUITARRIGMOBILE 0x0d8d 19*4882a593Smuzhiyun #define USB_PID_TRAKTORKONTROLX1 0x2305 20*4882a593Smuzhiyun #define USB_PID_TRAKTORKONTROLS4 0xbaff 21*4882a593Smuzhiyun #define USB_PID_TRAKTORAUDIO2 0x041d 22*4882a593Smuzhiyun #define USB_PID_MASCHINECONTROLLER 0x0808 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define EP1_BUFSIZE 64 25*4882a593Smuzhiyun #define EP4_BUFSIZE 512 26*4882a593Smuzhiyun #define CAIAQ_USB_STR_LEN 0xff 27*4882a593Smuzhiyun #define MAX_STREAMS 32 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #define MODNAME "snd-usb-caiaq" 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define EP1_CMD_GET_DEVICE_INFO 0x1 32*4882a593Smuzhiyun #define EP1_CMD_READ_ERP 0x2 33*4882a593Smuzhiyun #define EP1_CMD_READ_ANALOG 0x3 34*4882a593Smuzhiyun #define EP1_CMD_READ_IO 0x4 35*4882a593Smuzhiyun #define EP1_CMD_WRITE_IO 0x5 36*4882a593Smuzhiyun #define EP1_CMD_MIDI_READ 0x6 37*4882a593Smuzhiyun #define EP1_CMD_MIDI_WRITE 0x7 38*4882a593Smuzhiyun #define EP1_CMD_AUDIO_PARAMS 0x9 39*4882a593Smuzhiyun #define EP1_CMD_AUTO_MSG 0xb 40*4882a593Smuzhiyun #define EP1_CMD_DIMM_LEDS 0xc 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun struct caiaq_device_spec { 43*4882a593Smuzhiyun unsigned short fw_version; 44*4882a593Smuzhiyun unsigned char hw_subtype; 45*4882a593Smuzhiyun unsigned char num_erp; 46*4882a593Smuzhiyun unsigned char num_analog_in; 47*4882a593Smuzhiyun unsigned char num_digital_in; 48*4882a593Smuzhiyun unsigned char num_digital_out; 49*4882a593Smuzhiyun unsigned char num_analog_audio_out; 50*4882a593Smuzhiyun unsigned char num_analog_audio_in; 51*4882a593Smuzhiyun unsigned char num_digital_audio_out; 52*4882a593Smuzhiyun unsigned char num_digital_audio_in; 53*4882a593Smuzhiyun unsigned char num_midi_out; 54*4882a593Smuzhiyun unsigned char num_midi_in; 55*4882a593Smuzhiyun unsigned char data_alignment; 56*4882a593Smuzhiyun } __attribute__ ((packed)); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct snd_usb_caiaq_cb_info; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun struct snd_usb_caiaqdev { 61*4882a593Smuzhiyun struct snd_usb_audio chip; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun struct urb ep1_in_urb; 64*4882a593Smuzhiyun struct urb midi_out_urb; 65*4882a593Smuzhiyun struct urb **data_urbs_in; 66*4882a593Smuzhiyun struct urb **data_urbs_out; 67*4882a593Smuzhiyun struct snd_usb_caiaq_cb_info *data_cb_info; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun unsigned char ep1_in_buf[EP1_BUFSIZE]; 70*4882a593Smuzhiyun unsigned char ep1_out_buf[EP1_BUFSIZE]; 71*4882a593Smuzhiyun unsigned char midi_out_buf[EP1_BUFSIZE]; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun struct caiaq_device_spec spec; 74*4882a593Smuzhiyun spinlock_t spinlock; 75*4882a593Smuzhiyun wait_queue_head_t ep1_wait_queue; 76*4882a593Smuzhiyun wait_queue_head_t prepare_wait_queue; 77*4882a593Smuzhiyun int spec_received, audio_parm_answer; 78*4882a593Smuzhiyun int midi_out_active; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun char vendor_name[CAIAQ_USB_STR_LEN]; 81*4882a593Smuzhiyun char product_name[CAIAQ_USB_STR_LEN]; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun int n_streams, n_audio_in, n_audio_out; 84*4882a593Smuzhiyun int streaming, first_packet, output_running; 85*4882a593Smuzhiyun int audio_in_buf_pos[MAX_STREAMS]; 86*4882a593Smuzhiyun int audio_out_buf_pos[MAX_STREAMS]; 87*4882a593Smuzhiyun int period_in_count[MAX_STREAMS]; 88*4882a593Smuzhiyun int period_out_count[MAX_STREAMS]; 89*4882a593Smuzhiyun int input_panic, output_panic, warned; 90*4882a593Smuzhiyun char *audio_in_buf, *audio_out_buf; 91*4882a593Smuzhiyun unsigned int samplerates, bpp; 92*4882a593Smuzhiyun unsigned long outurb_active_mask; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun struct snd_pcm_substream *sub_playback[MAX_STREAMS]; 95*4882a593Smuzhiyun struct snd_pcm_substream *sub_capture[MAX_STREAMS]; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* Controls */ 98*4882a593Smuzhiyun unsigned char control_state[256]; 99*4882a593Smuzhiyun unsigned char ep8_out_buf[2]; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /* Linux input */ 102*4882a593Smuzhiyun #ifdef CONFIG_SND_USB_CAIAQ_INPUT 103*4882a593Smuzhiyun struct input_dev *input_dev; 104*4882a593Smuzhiyun char phys[64]; /* physical device path */ 105*4882a593Smuzhiyun unsigned short keycode[128]; 106*4882a593Smuzhiyun struct urb *ep4_in_urb; 107*4882a593Smuzhiyun unsigned char ep4_in_buf[EP4_BUFSIZE]; 108*4882a593Smuzhiyun #endif 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* ALSA */ 111*4882a593Smuzhiyun struct snd_pcm *pcm; 112*4882a593Smuzhiyun struct snd_pcm_hardware pcm_info; 113*4882a593Smuzhiyun struct snd_rawmidi *rmidi; 114*4882a593Smuzhiyun struct snd_rawmidi_substream *midi_receive_substream; 115*4882a593Smuzhiyun struct snd_rawmidi_substream *midi_out_substream; 116*4882a593Smuzhiyun }; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun struct snd_usb_caiaq_cb_info { 119*4882a593Smuzhiyun struct snd_usb_caiaqdev *cdev; 120*4882a593Smuzhiyun int index; 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #define caiaqdev(c) ((struct snd_usb_caiaqdev*)(c)->private_data) 124*4882a593Smuzhiyun #define caiaqdev_to_dev(d) (d->chip.card->dev) 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun int snd_usb_caiaq_set_audio_params (struct snd_usb_caiaqdev *cdev, int rate, int depth, int bbp); 127*4882a593Smuzhiyun int snd_usb_caiaq_set_auto_msg (struct snd_usb_caiaqdev *cdev, int digital, int analog, int erp); 128*4882a593Smuzhiyun int snd_usb_caiaq_send_command(struct snd_usb_caiaqdev *cdev, 129*4882a593Smuzhiyun unsigned char command, 130*4882a593Smuzhiyun const unsigned char *buffer, 131*4882a593Smuzhiyun int len); 132*4882a593Smuzhiyun int snd_usb_caiaq_send_command_bank(struct snd_usb_caiaqdev *cdev, 133*4882a593Smuzhiyun unsigned char command, 134*4882a593Smuzhiyun unsigned char bank, 135*4882a593Smuzhiyun const unsigned char *buffer, 136*4882a593Smuzhiyun int len); 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun #endif /* CAIAQ_DEVICE_H */ 139