xref: /OK3568_Linux_fs/kernel/sound/usb/caiaq/device.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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