1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2936e7d03SDaniel Mack #ifndef CAIAQ_DEVICE_H 3936e7d03SDaniel Mack #define CAIAQ_DEVICE_H 4936e7d03SDaniel Mack 5936e7d03SDaniel Mack #include "../usbaudio.h" 6936e7d03SDaniel Mack 7936e7d03SDaniel Mack #define USB_VID_NATIVEINSTRUMENTS 0x17cc 8936e7d03SDaniel Mack 9936e7d03SDaniel Mack #define USB_PID_RIGKONTROL2 0x1969 10936e7d03SDaniel Mack #define USB_PID_RIGKONTROL3 0x1940 11936e7d03SDaniel Mack #define USB_PID_KORECONTROLLER 0x4711 12936e7d03SDaniel Mack #define USB_PID_KORECONTROLLER2 0x4712 13936e7d03SDaniel Mack #define USB_PID_AK1 0x0815 14b30c4947SDaniel Mack #define USB_PID_AUDIO2DJ 0x041c 15936e7d03SDaniel Mack #define USB_PID_AUDIO4DJ 0x0839 16936e7d03SDaniel Mack #define USB_PID_AUDIO8DJ 0x1978 17936e7d03SDaniel Mack #define USB_PID_SESSIONIO 0x1915 18936e7d03SDaniel Mack #define USB_PID_GUITARRIGMOBILE 0x0d8d 196da7a2aaSDaniel Mack #define USB_PID_TRAKTORKONTROLX1 0x2305 2015c5ab60SDaniel Mack #define USB_PID_TRAKTORKONTROLS4 0xbaff 21df8d81a3SDaniel Mack #define USB_PID_TRAKTORAUDIO2 0x041d 22e653510aSWilliam Light #define USB_PID_MASCHINECONTROLLER 0x0808 23936e7d03SDaniel Mack 24936e7d03SDaniel Mack #define EP1_BUFSIZE 64 256da7a2aaSDaniel Mack #define EP4_BUFSIZE 512 26936e7d03SDaniel Mack #define CAIAQ_USB_STR_LEN 0xff 27936e7d03SDaniel Mack #define MAX_STREAMS 32 28936e7d03SDaniel Mack 29936e7d03SDaniel Mack #define MODNAME "snd-usb-caiaq" 30936e7d03SDaniel Mack 31936e7d03SDaniel Mack #define EP1_CMD_GET_DEVICE_INFO 0x1 32936e7d03SDaniel Mack #define EP1_CMD_READ_ERP 0x2 33936e7d03SDaniel Mack #define EP1_CMD_READ_ANALOG 0x3 34936e7d03SDaniel Mack #define EP1_CMD_READ_IO 0x4 35936e7d03SDaniel Mack #define EP1_CMD_WRITE_IO 0x5 36936e7d03SDaniel Mack #define EP1_CMD_MIDI_READ 0x6 37936e7d03SDaniel Mack #define EP1_CMD_MIDI_WRITE 0x7 38936e7d03SDaniel Mack #define EP1_CMD_AUDIO_PARAMS 0x9 39936e7d03SDaniel Mack #define EP1_CMD_AUTO_MSG 0xb 40936e7d03SDaniel Mack #define EP1_CMD_DIMM_LEDS 0xc 41936e7d03SDaniel Mack 42936e7d03SDaniel Mack struct caiaq_device_spec { 43936e7d03SDaniel Mack unsigned short fw_version; 44936e7d03SDaniel Mack unsigned char hw_subtype; 45936e7d03SDaniel Mack unsigned char num_erp; 46936e7d03SDaniel Mack unsigned char num_analog_in; 47936e7d03SDaniel Mack unsigned char num_digital_in; 48936e7d03SDaniel Mack unsigned char num_digital_out; 49936e7d03SDaniel Mack unsigned char num_analog_audio_out; 50936e7d03SDaniel Mack unsigned char num_analog_audio_in; 51936e7d03SDaniel Mack unsigned char num_digital_audio_out; 52936e7d03SDaniel Mack unsigned char num_digital_audio_in; 53936e7d03SDaniel Mack unsigned char num_midi_out; 54936e7d03SDaniel Mack unsigned char num_midi_in; 55936e7d03SDaniel Mack unsigned char data_alignment; 56936e7d03SDaniel Mack } __attribute__ ((packed)); 57936e7d03SDaniel Mack 58936e7d03SDaniel Mack struct snd_usb_caiaq_cb_info; 59936e7d03SDaniel Mack 60936e7d03SDaniel Mack struct snd_usb_caiaqdev { 61936e7d03SDaniel Mack struct snd_usb_audio chip; 62936e7d03SDaniel Mack 63936e7d03SDaniel Mack struct urb ep1_in_urb; 64936e7d03SDaniel Mack struct urb midi_out_urb; 65936e7d03SDaniel Mack struct urb **data_urbs_in; 66936e7d03SDaniel Mack struct urb **data_urbs_out; 67936e7d03SDaniel Mack struct snd_usb_caiaq_cb_info *data_cb_info; 68936e7d03SDaniel Mack 69936e7d03SDaniel Mack unsigned char ep1_in_buf[EP1_BUFSIZE]; 70936e7d03SDaniel Mack unsigned char ep1_out_buf[EP1_BUFSIZE]; 71936e7d03SDaniel Mack unsigned char midi_out_buf[EP1_BUFSIZE]; 72936e7d03SDaniel Mack 73936e7d03SDaniel Mack struct caiaq_device_spec spec; 74936e7d03SDaniel Mack spinlock_t spinlock; 75936e7d03SDaniel Mack wait_queue_head_t ep1_wait_queue; 76936e7d03SDaniel Mack wait_queue_head_t prepare_wait_queue; 77936e7d03SDaniel Mack int spec_received, audio_parm_answer; 78936e7d03SDaniel Mack int midi_out_active; 79936e7d03SDaniel Mack 80936e7d03SDaniel Mack char vendor_name[CAIAQ_USB_STR_LEN]; 81936e7d03SDaniel Mack char product_name[CAIAQ_USB_STR_LEN]; 82936e7d03SDaniel Mack 83936e7d03SDaniel Mack int n_streams, n_audio_in, n_audio_out; 84936e7d03SDaniel Mack int streaming, first_packet, output_running; 85936e7d03SDaniel Mack int audio_in_buf_pos[MAX_STREAMS]; 86936e7d03SDaniel Mack int audio_out_buf_pos[MAX_STREAMS]; 87936e7d03SDaniel Mack int period_in_count[MAX_STREAMS]; 88936e7d03SDaniel Mack int period_out_count[MAX_STREAMS]; 89936e7d03SDaniel Mack int input_panic, output_panic, warned; 90936e7d03SDaniel Mack char *audio_in_buf, *audio_out_buf; 91936e7d03SDaniel Mack unsigned int samplerates, bpp; 92da6094eaSDaniel Mack unsigned long outurb_active_mask; 93936e7d03SDaniel Mack 94936e7d03SDaniel Mack struct snd_pcm_substream *sub_playback[MAX_STREAMS]; 95936e7d03SDaniel Mack struct snd_pcm_substream *sub_capture[MAX_STREAMS]; 96936e7d03SDaniel Mack 97936e7d03SDaniel Mack /* Controls */ 9815c5ab60SDaniel Mack unsigned char control_state[256]; 9915c5ab60SDaniel Mack unsigned char ep8_out_buf[2]; 100936e7d03SDaniel Mack 101936e7d03SDaniel Mack /* Linux input */ 102936e7d03SDaniel Mack #ifdef CONFIG_SND_USB_CAIAQ_INPUT 103936e7d03SDaniel Mack struct input_dev *input_dev; 104936e7d03SDaniel Mack char phys[64]; /* physical device path */ 10515c5ab60SDaniel Mack unsigned short keycode[128]; 1066da7a2aaSDaniel Mack struct urb *ep4_in_urb; 1076da7a2aaSDaniel Mack unsigned char ep4_in_buf[EP4_BUFSIZE]; 108936e7d03SDaniel Mack #endif 109936e7d03SDaniel Mack 110936e7d03SDaniel Mack /* ALSA */ 111936e7d03SDaniel Mack struct snd_pcm *pcm; 112936e7d03SDaniel Mack struct snd_pcm_hardware pcm_info; 113936e7d03SDaniel Mack struct snd_rawmidi *rmidi; 114936e7d03SDaniel Mack struct snd_rawmidi_substream *midi_receive_substream; 115936e7d03SDaniel Mack struct snd_rawmidi_substream *midi_out_substream; 116936e7d03SDaniel Mack }; 117936e7d03SDaniel Mack 118936e7d03SDaniel Mack struct snd_usb_caiaq_cb_info { 1191c8470ceSDaniel Mack struct snd_usb_caiaqdev *cdev; 120936e7d03SDaniel Mack int index; 121936e7d03SDaniel Mack }; 122936e7d03SDaniel Mack 123936e7d03SDaniel Mack #define caiaqdev(c) ((struct snd_usb_caiaqdev*)(c)->private_data) 124f1f6b8f6SDaniel Mack #define caiaqdev_to_dev(d) (d->chip.card->dev) 125936e7d03SDaniel Mack 1261c8470ceSDaniel Mack int snd_usb_caiaq_set_audio_params (struct snd_usb_caiaqdev *cdev, int rate, int depth, int bbp); 1271c8470ceSDaniel Mack int snd_usb_caiaq_set_auto_msg (struct snd_usb_caiaqdev *cdev, int digital, int analog, int erp); 1281c8470ceSDaniel Mack int snd_usb_caiaq_send_command(struct snd_usb_caiaqdev *cdev, 129936e7d03SDaniel Mack unsigned char command, 130936e7d03SDaniel Mack const unsigned char *buffer, 131936e7d03SDaniel Mack int len); 132d2724de1SHannes Gräuler int snd_usb_caiaq_send_command_bank(struct snd_usb_caiaqdev *cdev, 133d2724de1SHannes Gräuler unsigned char command, 134d2724de1SHannes Gräuler unsigned char bank, 135d2724de1SHannes Gräuler const unsigned char *buffer, 136d2724de1SHannes Gräuler int len); 137936e7d03SDaniel Mack 138936e7d03SDaniel Mack #endif /* CAIAQ_DEVICE_H */ 139