xref: /OK3568_Linux_fs/kernel/sound/usb/caiaq/input.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *   Copyright (c) 2006,2007 Daniel Mack, Tim Ruetz
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <linux/device.h>
7*4882a593Smuzhiyun #include <linux/gfp.h>
8*4882a593Smuzhiyun #include <linux/init.h>
9*4882a593Smuzhiyun #include <linux/usb.h>
10*4882a593Smuzhiyun #include <linux/usb/input.h>
11*4882a593Smuzhiyun #include <sound/core.h>
12*4882a593Smuzhiyun #include <sound/pcm.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include "device.h"
15*4882a593Smuzhiyun #include "input.h"
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun static const unsigned short keycode_ak1[] =  { KEY_C, KEY_B, KEY_A };
18*4882a593Smuzhiyun static const unsigned short keycode_rk2[] =  { KEY_1, KEY_2, KEY_3, KEY_4,
19*4882a593Smuzhiyun 					 KEY_5, KEY_6, KEY_7 };
20*4882a593Smuzhiyun static const unsigned short keycode_rk3[] =  { KEY_1, KEY_2, KEY_3, KEY_4,
21*4882a593Smuzhiyun 					 KEY_5, KEY_6, KEY_7, KEY_8, KEY_9 };
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun static const unsigned short keycode_kore[] = {
24*4882a593Smuzhiyun 	KEY_FN_F1,      /* "menu"               */
25*4882a593Smuzhiyun 	KEY_FN_F7,      /* "lcd backlight       */
26*4882a593Smuzhiyun 	KEY_FN_F2,      /* "control"            */
27*4882a593Smuzhiyun 	KEY_FN_F3,      /* "enter"              */
28*4882a593Smuzhiyun 	KEY_FN_F4,      /* "view"               */
29*4882a593Smuzhiyun 	KEY_FN_F5,      /* "esc"                */
30*4882a593Smuzhiyun 	KEY_FN_F6,      /* "sound"              */
31*4882a593Smuzhiyun 	KEY_FN_F8,      /* array spacer, never triggered. */
32*4882a593Smuzhiyun 	KEY_RIGHT,
33*4882a593Smuzhiyun 	KEY_DOWN,
34*4882a593Smuzhiyun 	KEY_UP,
35*4882a593Smuzhiyun 	KEY_LEFT,
36*4882a593Smuzhiyun 	KEY_SOUND,      /* "listen"             */
37*4882a593Smuzhiyun 	KEY_RECORD,
38*4882a593Smuzhiyun 	KEY_PLAYPAUSE,
39*4882a593Smuzhiyun 	KEY_STOP,
40*4882a593Smuzhiyun 	BTN_4,          /* 8 softkeys */
41*4882a593Smuzhiyun 	BTN_3,
42*4882a593Smuzhiyun 	BTN_2,
43*4882a593Smuzhiyun 	BTN_1,
44*4882a593Smuzhiyun 	BTN_8,
45*4882a593Smuzhiyun 	BTN_7,
46*4882a593Smuzhiyun 	BTN_6,
47*4882a593Smuzhiyun 	BTN_5,
48*4882a593Smuzhiyun 	KEY_BRL_DOT4,   /* touch sensitive knobs */
49*4882a593Smuzhiyun 	KEY_BRL_DOT3,
50*4882a593Smuzhiyun 	KEY_BRL_DOT2,
51*4882a593Smuzhiyun 	KEY_BRL_DOT1,
52*4882a593Smuzhiyun 	KEY_BRL_DOT8,
53*4882a593Smuzhiyun 	KEY_BRL_DOT7,
54*4882a593Smuzhiyun 	KEY_BRL_DOT6,
55*4882a593Smuzhiyun 	KEY_BRL_DOT5
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define MASCHINE_BUTTONS   (42)
59*4882a593Smuzhiyun #define MASCHINE_BUTTON(X) ((X) + BTN_MISC)
60*4882a593Smuzhiyun #define MASCHINE_PADS      (16)
61*4882a593Smuzhiyun #define MASCHINE_PAD(X)    ((X) + ABS_PRESSURE)
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun static const unsigned short keycode_maschine[] = {
64*4882a593Smuzhiyun 	MASCHINE_BUTTON(40), /* mute       */
65*4882a593Smuzhiyun 	MASCHINE_BUTTON(39), /* solo       */
66*4882a593Smuzhiyun 	MASCHINE_BUTTON(38), /* select     */
67*4882a593Smuzhiyun 	MASCHINE_BUTTON(37), /* duplicate  */
68*4882a593Smuzhiyun 	MASCHINE_BUTTON(36), /* navigate   */
69*4882a593Smuzhiyun 	MASCHINE_BUTTON(35), /* pad mode   */
70*4882a593Smuzhiyun 	MASCHINE_BUTTON(34), /* pattern    */
71*4882a593Smuzhiyun 	MASCHINE_BUTTON(33), /* scene      */
72*4882a593Smuzhiyun 	KEY_RESERVED, /* spacer */
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	MASCHINE_BUTTON(30), /* rec        */
75*4882a593Smuzhiyun 	MASCHINE_BUTTON(31), /* erase      */
76*4882a593Smuzhiyun 	MASCHINE_BUTTON(32), /* shift      */
77*4882a593Smuzhiyun 	MASCHINE_BUTTON(28), /* grid       */
78*4882a593Smuzhiyun 	MASCHINE_BUTTON(27), /* >          */
79*4882a593Smuzhiyun 	MASCHINE_BUTTON(26), /* <          */
80*4882a593Smuzhiyun 	MASCHINE_BUTTON(25), /* restart    */
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	MASCHINE_BUTTON(21), /* E          */
83*4882a593Smuzhiyun 	MASCHINE_BUTTON(22), /* F          */
84*4882a593Smuzhiyun 	MASCHINE_BUTTON(23), /* G          */
85*4882a593Smuzhiyun 	MASCHINE_BUTTON(24), /* H          */
86*4882a593Smuzhiyun 	MASCHINE_BUTTON(20), /* D          */
87*4882a593Smuzhiyun 	MASCHINE_BUTTON(19), /* C          */
88*4882a593Smuzhiyun 	MASCHINE_BUTTON(18), /* B          */
89*4882a593Smuzhiyun 	MASCHINE_BUTTON(17), /* A          */
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	MASCHINE_BUTTON(0),  /* control    */
92*4882a593Smuzhiyun 	MASCHINE_BUTTON(2),  /* browse     */
93*4882a593Smuzhiyun 	MASCHINE_BUTTON(4),  /* <          */
94*4882a593Smuzhiyun 	MASCHINE_BUTTON(6),  /* snap       */
95*4882a593Smuzhiyun 	MASCHINE_BUTTON(7),  /* autowrite  */
96*4882a593Smuzhiyun 	MASCHINE_BUTTON(5),  /* >          */
97*4882a593Smuzhiyun 	MASCHINE_BUTTON(3),  /* sampling   */
98*4882a593Smuzhiyun 	MASCHINE_BUTTON(1),  /* step       */
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	MASCHINE_BUTTON(15), /* 8 softkeys */
101*4882a593Smuzhiyun 	MASCHINE_BUTTON(14),
102*4882a593Smuzhiyun 	MASCHINE_BUTTON(13),
103*4882a593Smuzhiyun 	MASCHINE_BUTTON(12),
104*4882a593Smuzhiyun 	MASCHINE_BUTTON(11),
105*4882a593Smuzhiyun 	MASCHINE_BUTTON(10),
106*4882a593Smuzhiyun 	MASCHINE_BUTTON(9),
107*4882a593Smuzhiyun 	MASCHINE_BUTTON(8),
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	MASCHINE_BUTTON(16), /* note repeat */
110*4882a593Smuzhiyun 	MASCHINE_BUTTON(29)  /* play        */
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #define KONTROLX1_INPUTS	(40)
114*4882a593Smuzhiyun #define KONTROLS4_BUTTONS	(12 * 8)
115*4882a593Smuzhiyun #define KONTROLS4_AXIS		(46)
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun #define KONTROLS4_BUTTON(X)	((X) + BTN_MISC)
118*4882a593Smuzhiyun #define KONTROLS4_ABS(X)	((X) + ABS_HAT0X)
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun #define DEG90		(range / 2)
121*4882a593Smuzhiyun #define DEG180		(range)
122*4882a593Smuzhiyun #define DEG270		(DEG90 + DEG180)
123*4882a593Smuzhiyun #define DEG360		(DEG180 * 2)
124*4882a593Smuzhiyun #define HIGH_PEAK	(268)
125*4882a593Smuzhiyun #define LOW_PEAK	(-7)
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /* some of these devices have endless rotation potentiometers
128*4882a593Smuzhiyun  * built in which use two tapers, 90 degrees phase shifted.
129*4882a593Smuzhiyun  * this algorithm decodes them to one single value, ranging
130*4882a593Smuzhiyun  * from 0 to 999 */
decode_erp(unsigned char a,unsigned char b)131*4882a593Smuzhiyun static unsigned int decode_erp(unsigned char a, unsigned char b)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun 	int weight_a, weight_b;
134*4882a593Smuzhiyun 	int pos_a, pos_b;
135*4882a593Smuzhiyun 	int ret;
136*4882a593Smuzhiyun 	int range = HIGH_PEAK - LOW_PEAK;
137*4882a593Smuzhiyun 	int mid_value = (HIGH_PEAK + LOW_PEAK) / 2;
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	weight_b = abs(mid_value - a) - (range / 2 - 100) / 2;
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	if (weight_b < 0)
142*4882a593Smuzhiyun 		weight_b = 0;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	if (weight_b > 100)
145*4882a593Smuzhiyun 		weight_b = 100;
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	weight_a = 100 - weight_b;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	if (a < mid_value) {
150*4882a593Smuzhiyun 		/* 0..90 and 270..360 degrees */
151*4882a593Smuzhiyun 		pos_b = b - LOW_PEAK + DEG270;
152*4882a593Smuzhiyun 		if (pos_b >= DEG360)
153*4882a593Smuzhiyun 			pos_b -= DEG360;
154*4882a593Smuzhiyun 	} else
155*4882a593Smuzhiyun 		/* 90..270 degrees */
156*4882a593Smuzhiyun 		pos_b = HIGH_PEAK - b + DEG90;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	if (b > mid_value)
160*4882a593Smuzhiyun 		/* 0..180 degrees */
161*4882a593Smuzhiyun 		pos_a = a - LOW_PEAK;
162*4882a593Smuzhiyun 	else
163*4882a593Smuzhiyun 		/* 180..360 degrees */
164*4882a593Smuzhiyun 		pos_a = HIGH_PEAK - a + DEG180;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	/* interpolate both slider values, depending on weight factors */
167*4882a593Smuzhiyun 	/* 0..99 x DEG360 */
168*4882a593Smuzhiyun 	ret = pos_a * weight_a + pos_b * weight_b;
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 	/* normalize to 0..999 */
171*4882a593Smuzhiyun 	ret *= 10;
172*4882a593Smuzhiyun 	ret /= DEG360;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	if (ret < 0)
175*4882a593Smuzhiyun 		ret += 1000;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	if (ret >= 1000)
178*4882a593Smuzhiyun 		ret -= 1000;
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	return ret;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun #undef DEG90
184*4882a593Smuzhiyun #undef DEG180
185*4882a593Smuzhiyun #undef DEG270
186*4882a593Smuzhiyun #undef DEG360
187*4882a593Smuzhiyun #undef HIGH_PEAK
188*4882a593Smuzhiyun #undef LOW_PEAK
189*4882a593Smuzhiyun 
snd_caiaq_input_report_abs(struct snd_usb_caiaqdev * cdev,int axis,const unsigned char * buf,int offset)190*4882a593Smuzhiyun static inline void snd_caiaq_input_report_abs(struct snd_usb_caiaqdev *cdev,
191*4882a593Smuzhiyun 					      int axis, const unsigned char *buf,
192*4882a593Smuzhiyun 					      int offset)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun 	input_report_abs(cdev->input_dev, axis,
195*4882a593Smuzhiyun 			 (buf[offset * 2] << 8) | buf[offset * 2 + 1]);
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
snd_caiaq_input_read_analog(struct snd_usb_caiaqdev * cdev,const unsigned char * buf,unsigned int len)198*4882a593Smuzhiyun static void snd_caiaq_input_read_analog(struct snd_usb_caiaqdev *cdev,
199*4882a593Smuzhiyun 					const unsigned char *buf,
200*4882a593Smuzhiyun 					unsigned int len)
201*4882a593Smuzhiyun {
202*4882a593Smuzhiyun 	struct input_dev *input_dev = cdev->input_dev;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	switch (cdev->chip.usb_id) {
205*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL2):
206*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_X, buf, 2);
207*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_Y, buf, 0);
208*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_Z, buf, 1);
209*4882a593Smuzhiyun 		break;
210*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL3):
211*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER):
212*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER2):
213*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_X, buf, 0);
214*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_Y, buf, 1);
215*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_Z, buf, 2);
216*4882a593Smuzhiyun 		break;
217*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
218*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_HAT0X, buf, 4);
219*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_HAT0Y, buf, 2);
220*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_HAT1X, buf, 6);
221*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_HAT1Y, buf, 1);
222*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_HAT2X, buf, 7);
223*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_HAT2Y, buf, 0);
224*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_HAT3X, buf, 5);
225*4882a593Smuzhiyun 		snd_caiaq_input_report_abs(cdev, ABS_HAT3Y, buf, 3);
226*4882a593Smuzhiyun 		break;
227*4882a593Smuzhiyun 	}
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	input_sync(input_dev);
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun 
snd_caiaq_input_read_erp(struct snd_usb_caiaqdev * cdev,const char * buf,unsigned int len)232*4882a593Smuzhiyun static void snd_caiaq_input_read_erp(struct snd_usb_caiaqdev *cdev,
233*4882a593Smuzhiyun 				     const char *buf, unsigned int len)
234*4882a593Smuzhiyun {
235*4882a593Smuzhiyun 	struct input_dev *input_dev = cdev->input_dev;
236*4882a593Smuzhiyun 	int i;
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	switch (cdev->chip.usb_id) {
239*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AK1):
240*4882a593Smuzhiyun 		i = decode_erp(buf[0], buf[1]);
241*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_X, i);
242*4882a593Smuzhiyun 		input_sync(input_dev);
243*4882a593Smuzhiyun 		break;
244*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER):
245*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER2):
246*4882a593Smuzhiyun 		i = decode_erp(buf[7], buf[5]);
247*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT0X, i);
248*4882a593Smuzhiyun 		i = decode_erp(buf[12], buf[14]);
249*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT0Y, i);
250*4882a593Smuzhiyun 		i = decode_erp(buf[15], buf[13]);
251*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT1X, i);
252*4882a593Smuzhiyun 		i = decode_erp(buf[0], buf[2]);
253*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT1Y, i);
254*4882a593Smuzhiyun 		i = decode_erp(buf[3], buf[1]);
255*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT2X, i);
256*4882a593Smuzhiyun 		i = decode_erp(buf[8], buf[10]);
257*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT2Y, i);
258*4882a593Smuzhiyun 		i = decode_erp(buf[11], buf[9]);
259*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT3X, i);
260*4882a593Smuzhiyun 		i = decode_erp(buf[4], buf[6]);
261*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT3Y, i);
262*4882a593Smuzhiyun 		input_sync(input_dev);
263*4882a593Smuzhiyun 		break;
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER):
266*4882a593Smuzhiyun 		/* 4 under the left screen */
267*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT0X, decode_erp(buf[21], buf[20]));
268*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT0Y, decode_erp(buf[15], buf[14]));
269*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT1X, decode_erp(buf[9],  buf[8]));
270*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT1Y, decode_erp(buf[3],  buf[2]));
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 		/* 4 under the right screen */
273*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT2X, decode_erp(buf[19], buf[18]));
274*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT2Y, decode_erp(buf[13], buf[12]));
275*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT3X, decode_erp(buf[7],  buf[6]));
276*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_HAT3Y, decode_erp(buf[1],  buf[0]));
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 		/* volume */
279*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_RX, decode_erp(buf[17], buf[16]));
280*4882a593Smuzhiyun 		/* tempo */
281*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_RY, decode_erp(buf[11], buf[10]));
282*4882a593Smuzhiyun 		/* swing */
283*4882a593Smuzhiyun 		input_report_abs(input_dev, ABS_RZ, decode_erp(buf[5],  buf[4]));
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 		input_sync(input_dev);
286*4882a593Smuzhiyun 		break;
287*4882a593Smuzhiyun 	}
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun 
snd_caiaq_input_read_io(struct snd_usb_caiaqdev * cdev,unsigned char * buf,unsigned int len)290*4882a593Smuzhiyun static void snd_caiaq_input_read_io(struct snd_usb_caiaqdev *cdev,
291*4882a593Smuzhiyun 				    unsigned char *buf, unsigned int len)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun 	struct input_dev *input_dev = cdev->input_dev;
294*4882a593Smuzhiyun 	unsigned short *keycode = input_dev->keycode;
295*4882a593Smuzhiyun 	int i;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	if (!keycode)
298*4882a593Smuzhiyun 		return;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	if (input_dev->id.product == USB_PID_RIGKONTROL2)
301*4882a593Smuzhiyun 		for (i = 0; i < len; i++)
302*4882a593Smuzhiyun 			buf[i] = ~buf[i];
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	for (i = 0; i < input_dev->keycodemax && i < len * 8; i++)
305*4882a593Smuzhiyun 		input_report_key(input_dev, keycode[i],
306*4882a593Smuzhiyun 				 buf[i / 8] & (1 << (i % 8)));
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	switch (cdev->chip.usb_id) {
309*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER):
310*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER2):
311*4882a593Smuzhiyun 		input_report_abs(cdev->input_dev, ABS_MISC, 255 - buf[4]);
312*4882a593Smuzhiyun 		break;
313*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
314*4882a593Smuzhiyun 		/* rotary encoders */
315*4882a593Smuzhiyun 		input_report_abs(cdev->input_dev, ABS_X, buf[5] & 0xf);
316*4882a593Smuzhiyun 		input_report_abs(cdev->input_dev, ABS_Y, buf[5] >> 4);
317*4882a593Smuzhiyun 		input_report_abs(cdev->input_dev, ABS_Z, buf[6] & 0xf);
318*4882a593Smuzhiyun 		input_report_abs(cdev->input_dev, ABS_MISC, buf[6] >> 4);
319*4882a593Smuzhiyun 		break;
320*4882a593Smuzhiyun 	}
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	input_sync(input_dev);
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun #define TKS4_MSGBLOCK_SIZE	16
326*4882a593Smuzhiyun 
snd_usb_caiaq_tks4_dispatch(struct snd_usb_caiaqdev * cdev,const unsigned char * buf,unsigned int len)327*4882a593Smuzhiyun static void snd_usb_caiaq_tks4_dispatch(struct snd_usb_caiaqdev *cdev,
328*4882a593Smuzhiyun 					const unsigned char *buf,
329*4882a593Smuzhiyun 					unsigned int len)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	struct device *dev = caiaqdev_to_dev(cdev);
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	while (len) {
334*4882a593Smuzhiyun 		unsigned int i, block_id = (buf[0] << 8) | buf[1];
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 		switch (block_id) {
337*4882a593Smuzhiyun 		case 0:
338*4882a593Smuzhiyun 			/* buttons */
339*4882a593Smuzhiyun 			for (i = 0; i < KONTROLS4_BUTTONS; i++)
340*4882a593Smuzhiyun 				input_report_key(cdev->input_dev, KONTROLS4_BUTTON(i),
341*4882a593Smuzhiyun 						 (buf[4 + (i / 8)] >> (i % 8)) & 1);
342*4882a593Smuzhiyun 			break;
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 		case 1:
345*4882a593Smuzhiyun 			/* left wheel */
346*4882a593Smuzhiyun 			input_report_abs(cdev->input_dev, KONTROLS4_ABS(36), buf[9] | ((buf[8] & 0x3) << 8));
347*4882a593Smuzhiyun 			/* right wheel */
348*4882a593Smuzhiyun 			input_report_abs(cdev->input_dev, KONTROLS4_ABS(37), buf[13] | ((buf[12] & 0x3) << 8));
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 			/* rotary encoders */
351*4882a593Smuzhiyun 			input_report_abs(cdev->input_dev, KONTROLS4_ABS(38), buf[3] & 0xf);
352*4882a593Smuzhiyun 			input_report_abs(cdev->input_dev, KONTROLS4_ABS(39), buf[4] >> 4);
353*4882a593Smuzhiyun 			input_report_abs(cdev->input_dev, KONTROLS4_ABS(40), buf[4] & 0xf);
354*4882a593Smuzhiyun 			input_report_abs(cdev->input_dev, KONTROLS4_ABS(41), buf[5] >> 4);
355*4882a593Smuzhiyun 			input_report_abs(cdev->input_dev, KONTROLS4_ABS(42), buf[5] & 0xf);
356*4882a593Smuzhiyun 			input_report_abs(cdev->input_dev, KONTROLS4_ABS(43), buf[6] >> 4);
357*4882a593Smuzhiyun 			input_report_abs(cdev->input_dev, KONTROLS4_ABS(44), buf[6] & 0xf);
358*4882a593Smuzhiyun 			input_report_abs(cdev->input_dev, KONTROLS4_ABS(45), buf[7] >> 4);
359*4882a593Smuzhiyun 			input_report_abs(cdev->input_dev, KONTROLS4_ABS(46), buf[7] & 0xf);
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 			break;
362*4882a593Smuzhiyun 		case 2:
363*4882a593Smuzhiyun 			/* Volume Fader Channel D */
364*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(0), buf, 1);
365*4882a593Smuzhiyun 			/* Volume Fader Channel B */
366*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(1), buf, 2);
367*4882a593Smuzhiyun 			/* Volume Fader Channel A */
368*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(2), buf, 3);
369*4882a593Smuzhiyun 			/* Volume Fader Channel C */
370*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(3), buf, 4);
371*4882a593Smuzhiyun 			/* Loop Volume */
372*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(4), buf, 6);
373*4882a593Smuzhiyun 			/* Crossfader */
374*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(7), buf, 7);
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 			break;
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 		case 3:
379*4882a593Smuzhiyun 			/* Tempo Fader R */
380*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(6), buf, 3);
381*4882a593Smuzhiyun 			/* Tempo Fader L */
382*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(5), buf, 4);
383*4882a593Smuzhiyun 			/* Mic Volume */
384*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(8), buf, 6);
385*4882a593Smuzhiyun 			/* Cue Mix */
386*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(9), buf, 7);
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 			break;
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun 		case 4:
391*4882a593Smuzhiyun 			/* Wheel distance sensor L */
392*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(10), buf, 1);
393*4882a593Smuzhiyun 			/* Wheel distance sensor R */
394*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(11), buf, 2);
395*4882a593Smuzhiyun 			/* Channel D EQ - Filter */
396*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(12), buf, 3);
397*4882a593Smuzhiyun 			/* Channel D EQ - Low */
398*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(13), buf, 4);
399*4882a593Smuzhiyun 			/* Channel D EQ - Mid */
400*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(14), buf, 5);
401*4882a593Smuzhiyun 			/* Channel D EQ - Hi */
402*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(15), buf, 6);
403*4882a593Smuzhiyun 			/* FX2 - dry/wet */
404*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(16), buf, 7);
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun 			break;
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 		case 5:
409*4882a593Smuzhiyun 			/* FX2 - 1 */
410*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(17), buf, 1);
411*4882a593Smuzhiyun 			/* FX2 - 2 */
412*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(18), buf, 2);
413*4882a593Smuzhiyun 			/* FX2 - 3 */
414*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(19), buf, 3);
415*4882a593Smuzhiyun 			/* Channel B EQ - Filter */
416*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(20), buf, 4);
417*4882a593Smuzhiyun 			/* Channel B EQ - Low */
418*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(21), buf, 5);
419*4882a593Smuzhiyun 			/* Channel B EQ - Mid */
420*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(22), buf, 6);
421*4882a593Smuzhiyun 			/* Channel B EQ - Hi */
422*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(23), buf, 7);
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun 			break;
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun 		case 6:
427*4882a593Smuzhiyun 			/* Channel A EQ - Filter */
428*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(24), buf, 1);
429*4882a593Smuzhiyun 			/* Channel A EQ - Low */
430*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(25), buf, 2);
431*4882a593Smuzhiyun 			/* Channel A EQ - Mid */
432*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(26), buf, 3);
433*4882a593Smuzhiyun 			/* Channel A EQ - Hi */
434*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(27), buf, 4);
435*4882a593Smuzhiyun 			/* Channel C EQ - Filter */
436*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(28), buf, 5);
437*4882a593Smuzhiyun 			/* Channel C EQ - Low */
438*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(29), buf, 6);
439*4882a593Smuzhiyun 			/* Channel C EQ - Mid */
440*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(30), buf, 7);
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 			break;
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun 		case 7:
445*4882a593Smuzhiyun 			/* Channel C EQ - Hi */
446*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(31), buf, 1);
447*4882a593Smuzhiyun 			/* FX1 - wet/dry */
448*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(32), buf, 2);
449*4882a593Smuzhiyun 			/* FX1 - 1 */
450*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(33), buf, 3);
451*4882a593Smuzhiyun 			/* FX1 - 2 */
452*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(34), buf, 4);
453*4882a593Smuzhiyun 			/* FX1 - 3 */
454*4882a593Smuzhiyun 			snd_caiaq_input_report_abs(cdev, KONTROLS4_ABS(35), buf, 5);
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 			break;
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun 		default:
459*4882a593Smuzhiyun 			dev_dbg(dev, "%s(): bogus block (id %d)\n",
460*4882a593Smuzhiyun 				__func__, block_id);
461*4882a593Smuzhiyun 			return;
462*4882a593Smuzhiyun 		}
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 		len -= TKS4_MSGBLOCK_SIZE;
465*4882a593Smuzhiyun 		buf += TKS4_MSGBLOCK_SIZE;
466*4882a593Smuzhiyun 	}
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun 	input_sync(cdev->input_dev);
469*4882a593Smuzhiyun }
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun #define MASCHINE_MSGBLOCK_SIZE 2
472*4882a593Smuzhiyun 
snd_usb_caiaq_maschine_dispatch(struct snd_usb_caiaqdev * cdev,const unsigned char * buf,unsigned int len)473*4882a593Smuzhiyun static void snd_usb_caiaq_maschine_dispatch(struct snd_usb_caiaqdev *cdev,
474*4882a593Smuzhiyun 					const unsigned char *buf,
475*4882a593Smuzhiyun 					unsigned int len)
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun 	unsigned int i, pad_id;
478*4882a593Smuzhiyun 	__le16 *pressure = (__le16 *) buf;
479*4882a593Smuzhiyun 
480*4882a593Smuzhiyun 	for (i = 0; i < MASCHINE_PADS; i++) {
481*4882a593Smuzhiyun 		pad_id = le16_to_cpu(*pressure) >> 12;
482*4882a593Smuzhiyun 		input_report_abs(cdev->input_dev, MASCHINE_PAD(pad_id),
483*4882a593Smuzhiyun 				 le16_to_cpu(*pressure) & 0xfff);
484*4882a593Smuzhiyun 		pressure++;
485*4882a593Smuzhiyun 	}
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	input_sync(cdev->input_dev);
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun 
snd_usb_caiaq_ep4_reply_dispatch(struct urb * urb)490*4882a593Smuzhiyun static void snd_usb_caiaq_ep4_reply_dispatch(struct urb *urb)
491*4882a593Smuzhiyun {
492*4882a593Smuzhiyun 	struct snd_usb_caiaqdev *cdev = urb->context;
493*4882a593Smuzhiyun 	unsigned char *buf = urb->transfer_buffer;
494*4882a593Smuzhiyun 	struct device *dev = &urb->dev->dev;
495*4882a593Smuzhiyun 	int ret;
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	if (urb->status || !cdev || urb != cdev->ep4_in_urb)
498*4882a593Smuzhiyun 		return;
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun 	switch (cdev->chip.usb_id) {
501*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
502*4882a593Smuzhiyun 		if (urb->actual_length < 24)
503*4882a593Smuzhiyun 			goto requeue;
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 		if (buf[0] & 0x3)
506*4882a593Smuzhiyun 			snd_caiaq_input_read_io(cdev, buf + 1, 7);
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun 		if (buf[0] & 0x4)
509*4882a593Smuzhiyun 			snd_caiaq_input_read_analog(cdev, buf + 8, 16);
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun 		break;
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4):
514*4882a593Smuzhiyun 		snd_usb_caiaq_tks4_dispatch(cdev, buf, urb->actual_length);
515*4882a593Smuzhiyun 		break;
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER):
518*4882a593Smuzhiyun 		if (urb->actual_length < (MASCHINE_PADS * MASCHINE_MSGBLOCK_SIZE))
519*4882a593Smuzhiyun 			goto requeue;
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun 		snd_usb_caiaq_maschine_dispatch(cdev, buf, urb->actual_length);
522*4882a593Smuzhiyun 		break;
523*4882a593Smuzhiyun 	}
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun requeue:
526*4882a593Smuzhiyun 	cdev->ep4_in_urb->actual_length = 0;
527*4882a593Smuzhiyun 	ret = usb_submit_urb(cdev->ep4_in_urb, GFP_ATOMIC);
528*4882a593Smuzhiyun 	if (ret < 0)
529*4882a593Smuzhiyun 		dev_err(dev, "unable to submit urb. OOM!?\n");
530*4882a593Smuzhiyun }
531*4882a593Smuzhiyun 
snd_usb_caiaq_input_open(struct input_dev * idev)532*4882a593Smuzhiyun static int snd_usb_caiaq_input_open(struct input_dev *idev)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun 	struct snd_usb_caiaqdev *cdev = input_get_drvdata(idev);
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun 	if (!cdev)
537*4882a593Smuzhiyun 		return -EINVAL;
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 	switch (cdev->chip.usb_id) {
540*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
541*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4):
542*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER):
543*4882a593Smuzhiyun 		if (usb_submit_urb(cdev->ep4_in_urb, GFP_KERNEL) != 0)
544*4882a593Smuzhiyun 			return -EIO;
545*4882a593Smuzhiyun 		break;
546*4882a593Smuzhiyun 	}
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun 	return 0;
549*4882a593Smuzhiyun }
550*4882a593Smuzhiyun 
snd_usb_caiaq_input_close(struct input_dev * idev)551*4882a593Smuzhiyun static void snd_usb_caiaq_input_close(struct input_dev *idev)
552*4882a593Smuzhiyun {
553*4882a593Smuzhiyun 	struct snd_usb_caiaqdev *cdev = input_get_drvdata(idev);
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun 	if (!cdev)
556*4882a593Smuzhiyun 		return;
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	switch (cdev->chip.usb_id) {
559*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
560*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4):
561*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER):
562*4882a593Smuzhiyun 		usb_kill_urb(cdev->ep4_in_urb);
563*4882a593Smuzhiyun 		break;
564*4882a593Smuzhiyun 	}
565*4882a593Smuzhiyun }
566*4882a593Smuzhiyun 
snd_usb_caiaq_input_dispatch(struct snd_usb_caiaqdev * cdev,char * buf,unsigned int len)567*4882a593Smuzhiyun void snd_usb_caiaq_input_dispatch(struct snd_usb_caiaqdev *cdev,
568*4882a593Smuzhiyun 				  char *buf,
569*4882a593Smuzhiyun 				  unsigned int len)
570*4882a593Smuzhiyun {
571*4882a593Smuzhiyun 	if (!cdev->input_dev || len < 1)
572*4882a593Smuzhiyun 		return;
573*4882a593Smuzhiyun 
574*4882a593Smuzhiyun 	switch (buf[0]) {
575*4882a593Smuzhiyun 	case EP1_CMD_READ_ANALOG:
576*4882a593Smuzhiyun 		snd_caiaq_input_read_analog(cdev, buf + 1, len - 1);
577*4882a593Smuzhiyun 		break;
578*4882a593Smuzhiyun 	case EP1_CMD_READ_ERP:
579*4882a593Smuzhiyun 		snd_caiaq_input_read_erp(cdev, buf + 1, len - 1);
580*4882a593Smuzhiyun 		break;
581*4882a593Smuzhiyun 	case EP1_CMD_READ_IO:
582*4882a593Smuzhiyun 		snd_caiaq_input_read_io(cdev, buf + 1, len - 1);
583*4882a593Smuzhiyun 		break;
584*4882a593Smuzhiyun 	}
585*4882a593Smuzhiyun }
586*4882a593Smuzhiyun 
snd_usb_caiaq_input_init(struct snd_usb_caiaqdev * cdev)587*4882a593Smuzhiyun int snd_usb_caiaq_input_init(struct snd_usb_caiaqdev *cdev)
588*4882a593Smuzhiyun {
589*4882a593Smuzhiyun 	struct usb_device *usb_dev = cdev->chip.dev;
590*4882a593Smuzhiyun 	struct input_dev *input;
591*4882a593Smuzhiyun 	int i, ret = 0;
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun 	input = input_allocate_device();
594*4882a593Smuzhiyun 	if (!input)
595*4882a593Smuzhiyun 		return -ENOMEM;
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	usb_make_path(usb_dev, cdev->phys, sizeof(cdev->phys));
598*4882a593Smuzhiyun 	strlcat(cdev->phys, "/input0", sizeof(cdev->phys));
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun 	input->name = cdev->product_name;
601*4882a593Smuzhiyun 	input->phys = cdev->phys;
602*4882a593Smuzhiyun 	usb_to_input_id(usb_dev, &input->id);
603*4882a593Smuzhiyun 	input->dev.parent = &usb_dev->dev;
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun 	input_set_drvdata(input, cdev);
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun 	switch (cdev->chip.usb_id) {
608*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL2):
609*4882a593Smuzhiyun 		input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
610*4882a593Smuzhiyun 		input->absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) |
611*4882a593Smuzhiyun 			BIT_MASK(ABS_Z);
612*4882a593Smuzhiyun 		BUILD_BUG_ON(sizeof(cdev->keycode) < sizeof(keycode_rk2));
613*4882a593Smuzhiyun 		memcpy(cdev->keycode, keycode_rk2, sizeof(keycode_rk2));
614*4882a593Smuzhiyun 		input->keycodemax = ARRAY_SIZE(keycode_rk2);
615*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_X, 0, 4096, 0, 10);
616*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_Y, 0, 4096, 0, 10);
617*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_Z, 0, 4096, 0, 10);
618*4882a593Smuzhiyun 		snd_usb_caiaq_set_auto_msg(cdev, 1, 10, 0);
619*4882a593Smuzhiyun 		break;
620*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL3):
621*4882a593Smuzhiyun 		input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
622*4882a593Smuzhiyun 		input->absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) |
623*4882a593Smuzhiyun 			BIT_MASK(ABS_Z);
624*4882a593Smuzhiyun 		BUILD_BUG_ON(sizeof(cdev->keycode) < sizeof(keycode_rk3));
625*4882a593Smuzhiyun 		memcpy(cdev->keycode, keycode_rk3, sizeof(keycode_rk3));
626*4882a593Smuzhiyun 		input->keycodemax = ARRAY_SIZE(keycode_rk3);
627*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_X, 0, 1024, 0, 10);
628*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_Y, 0, 1024, 0, 10);
629*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_Z, 0, 1024, 0, 10);
630*4882a593Smuzhiyun 		snd_usb_caiaq_set_auto_msg(cdev, 1, 10, 0);
631*4882a593Smuzhiyun 		break;
632*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AK1):
633*4882a593Smuzhiyun 		input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
634*4882a593Smuzhiyun 		input->absbit[0] = BIT_MASK(ABS_X);
635*4882a593Smuzhiyun 		BUILD_BUG_ON(sizeof(cdev->keycode) < sizeof(keycode_ak1));
636*4882a593Smuzhiyun 		memcpy(cdev->keycode, keycode_ak1, sizeof(keycode_ak1));
637*4882a593Smuzhiyun 		input->keycodemax = ARRAY_SIZE(keycode_ak1);
638*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_X, 0, 999, 0, 10);
639*4882a593Smuzhiyun 		snd_usb_caiaq_set_auto_msg(cdev, 1, 0, 5);
640*4882a593Smuzhiyun 		break;
641*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER):
642*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER2):
643*4882a593Smuzhiyun 		input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
644*4882a593Smuzhiyun 		input->absbit[0] = BIT_MASK(ABS_HAT0X) | BIT_MASK(ABS_HAT0Y) |
645*4882a593Smuzhiyun 				   BIT_MASK(ABS_HAT1X) | BIT_MASK(ABS_HAT1Y) |
646*4882a593Smuzhiyun 				   BIT_MASK(ABS_HAT2X) | BIT_MASK(ABS_HAT2Y) |
647*4882a593Smuzhiyun 				   BIT_MASK(ABS_HAT3X) | BIT_MASK(ABS_HAT3Y) |
648*4882a593Smuzhiyun 				   BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) |
649*4882a593Smuzhiyun 				   BIT_MASK(ABS_Z);
650*4882a593Smuzhiyun 		input->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC);
651*4882a593Smuzhiyun 		BUILD_BUG_ON(sizeof(cdev->keycode) < sizeof(keycode_kore));
652*4882a593Smuzhiyun 		memcpy(cdev->keycode, keycode_kore, sizeof(keycode_kore));
653*4882a593Smuzhiyun 		input->keycodemax = ARRAY_SIZE(keycode_kore);
654*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT0X, 0, 999, 0, 10);
655*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT0Y, 0, 999, 0, 10);
656*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT1X, 0, 999, 0, 10);
657*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT1Y, 0, 999, 0, 10);
658*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT2X, 0, 999, 0, 10);
659*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT2Y, 0, 999, 0, 10);
660*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT3X, 0, 999, 0, 10);
661*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT3Y, 0, 999, 0, 10);
662*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_X, 0, 4096, 0, 10);
663*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_Y, 0, 4096, 0, 10);
664*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_Z, 0, 4096, 0, 10);
665*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_MISC, 0, 255, 0, 1);
666*4882a593Smuzhiyun 		snd_usb_caiaq_set_auto_msg(cdev, 1, 10, 5);
667*4882a593Smuzhiyun 		break;
668*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
669*4882a593Smuzhiyun 		input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
670*4882a593Smuzhiyun 		input->absbit[0] = BIT_MASK(ABS_HAT0X) | BIT_MASK(ABS_HAT0Y) |
671*4882a593Smuzhiyun 				   BIT_MASK(ABS_HAT1X) | BIT_MASK(ABS_HAT1Y) |
672*4882a593Smuzhiyun 				   BIT_MASK(ABS_HAT2X) | BIT_MASK(ABS_HAT2Y) |
673*4882a593Smuzhiyun 				   BIT_MASK(ABS_HAT3X) | BIT_MASK(ABS_HAT3Y) |
674*4882a593Smuzhiyun 				   BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) |
675*4882a593Smuzhiyun 				   BIT_MASK(ABS_Z);
676*4882a593Smuzhiyun 		input->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC);
677*4882a593Smuzhiyun 		BUILD_BUG_ON(sizeof(cdev->keycode) < KONTROLX1_INPUTS);
678*4882a593Smuzhiyun 		for (i = 0; i < KONTROLX1_INPUTS; i++)
679*4882a593Smuzhiyun 			cdev->keycode[i] = BTN_MISC + i;
680*4882a593Smuzhiyun 		input->keycodemax = KONTROLX1_INPUTS;
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun 		/* analog potentiometers */
683*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT0X, 0, 4096, 0, 10);
684*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT0Y, 0, 4096, 0, 10);
685*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT1X, 0, 4096, 0, 10);
686*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT1Y, 0, 4096, 0, 10);
687*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT2X, 0, 4096, 0, 10);
688*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT2Y, 0, 4096, 0, 10);
689*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT3X, 0, 4096, 0, 10);
690*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT3Y, 0, 4096, 0, 10);
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun 		/* rotary encoders */
693*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_X, 0, 0xf, 0, 1);
694*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_Y, 0, 0xf, 0, 1);
695*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_Z, 0, 0xf, 0, 1);
696*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_MISC, 0, 0xf, 0, 1);
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 		cdev->ep4_in_urb = usb_alloc_urb(0, GFP_KERNEL);
699*4882a593Smuzhiyun 		if (!cdev->ep4_in_urb) {
700*4882a593Smuzhiyun 			ret = -ENOMEM;
701*4882a593Smuzhiyun 			goto exit_free_idev;
702*4882a593Smuzhiyun 		}
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 		usb_fill_bulk_urb(cdev->ep4_in_urb, usb_dev,
705*4882a593Smuzhiyun 				  usb_rcvbulkpipe(usb_dev, 0x4),
706*4882a593Smuzhiyun 				  cdev->ep4_in_buf, EP4_BUFSIZE,
707*4882a593Smuzhiyun 				  snd_usb_caiaq_ep4_reply_dispatch, cdev);
708*4882a593Smuzhiyun 		ret = usb_urb_ep_type_check(cdev->ep4_in_urb);
709*4882a593Smuzhiyun 		if (ret < 0)
710*4882a593Smuzhiyun 			goto exit_free_idev;
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun 		snd_usb_caiaq_set_auto_msg(cdev, 1, 10, 5);
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun 		break;
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4):
717*4882a593Smuzhiyun 		input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
718*4882a593Smuzhiyun 		BUILD_BUG_ON(sizeof(cdev->keycode) < KONTROLS4_BUTTONS);
719*4882a593Smuzhiyun 		for (i = 0; i < KONTROLS4_BUTTONS; i++)
720*4882a593Smuzhiyun 			cdev->keycode[i] = KONTROLS4_BUTTON(i);
721*4882a593Smuzhiyun 		input->keycodemax = KONTROLS4_BUTTONS;
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun 		for (i = 0; i < KONTROLS4_AXIS; i++) {
724*4882a593Smuzhiyun 			int axis = KONTROLS4_ABS(i);
725*4882a593Smuzhiyun 			input->absbit[BIT_WORD(axis)] |= BIT_MASK(axis);
726*4882a593Smuzhiyun 		}
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun 		/* 36 analog potentiometers and faders */
729*4882a593Smuzhiyun 		for (i = 0; i < 36; i++)
730*4882a593Smuzhiyun 			input_set_abs_params(input, KONTROLS4_ABS(i), 0, 0xfff, 0, 10);
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun 		/* 2 encoder wheels */
733*4882a593Smuzhiyun 		input_set_abs_params(input, KONTROLS4_ABS(36), 0, 0x3ff, 0, 1);
734*4882a593Smuzhiyun 		input_set_abs_params(input, KONTROLS4_ABS(37), 0, 0x3ff, 0, 1);
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 		/* 9 rotary encoders */
737*4882a593Smuzhiyun 		for (i = 0; i < 9; i++)
738*4882a593Smuzhiyun 			input_set_abs_params(input, KONTROLS4_ABS(38+i), 0, 0xf, 0, 1);
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun 		cdev->ep4_in_urb = usb_alloc_urb(0, GFP_KERNEL);
741*4882a593Smuzhiyun 		if (!cdev->ep4_in_urb) {
742*4882a593Smuzhiyun 			ret = -ENOMEM;
743*4882a593Smuzhiyun 			goto exit_free_idev;
744*4882a593Smuzhiyun 		}
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun 		usb_fill_bulk_urb(cdev->ep4_in_urb, usb_dev,
747*4882a593Smuzhiyun 				  usb_rcvbulkpipe(usb_dev, 0x4),
748*4882a593Smuzhiyun 				  cdev->ep4_in_buf, EP4_BUFSIZE,
749*4882a593Smuzhiyun 				  snd_usb_caiaq_ep4_reply_dispatch, cdev);
750*4882a593Smuzhiyun 		ret = usb_urb_ep_type_check(cdev->ep4_in_urb);
751*4882a593Smuzhiyun 		if (ret < 0)
752*4882a593Smuzhiyun 			goto exit_free_idev;
753*4882a593Smuzhiyun 
754*4882a593Smuzhiyun 		snd_usb_caiaq_set_auto_msg(cdev, 1, 10, 5);
755*4882a593Smuzhiyun 
756*4882a593Smuzhiyun 		break;
757*4882a593Smuzhiyun 
758*4882a593Smuzhiyun 	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER):
759*4882a593Smuzhiyun 		input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
760*4882a593Smuzhiyun 		input->absbit[0] = BIT_MASK(ABS_HAT0X) | BIT_MASK(ABS_HAT0Y) |
761*4882a593Smuzhiyun 			BIT_MASK(ABS_HAT1X) | BIT_MASK(ABS_HAT1Y) |
762*4882a593Smuzhiyun 			BIT_MASK(ABS_HAT2X) | BIT_MASK(ABS_HAT2Y) |
763*4882a593Smuzhiyun 			BIT_MASK(ABS_HAT3X) | BIT_MASK(ABS_HAT3Y) |
764*4882a593Smuzhiyun 			BIT_MASK(ABS_RX) | BIT_MASK(ABS_RY) |
765*4882a593Smuzhiyun 			BIT_MASK(ABS_RZ);
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun 		BUILD_BUG_ON(sizeof(cdev->keycode) < sizeof(keycode_maschine));
768*4882a593Smuzhiyun 		memcpy(cdev->keycode, keycode_maschine, sizeof(keycode_maschine));
769*4882a593Smuzhiyun 		input->keycodemax = ARRAY_SIZE(keycode_maschine);
770*4882a593Smuzhiyun 
771*4882a593Smuzhiyun 		for (i = 0; i < MASCHINE_PADS; i++) {
772*4882a593Smuzhiyun 			input->absbit[0] |= MASCHINE_PAD(i);
773*4882a593Smuzhiyun 			input_set_abs_params(input, MASCHINE_PAD(i), 0, 0xfff, 5, 10);
774*4882a593Smuzhiyun 		}
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT0X, 0, 999, 0, 10);
777*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT0Y, 0, 999, 0, 10);
778*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT1X, 0, 999, 0, 10);
779*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT1Y, 0, 999, 0, 10);
780*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT2X, 0, 999, 0, 10);
781*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT2Y, 0, 999, 0, 10);
782*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT3X, 0, 999, 0, 10);
783*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_HAT3Y, 0, 999, 0, 10);
784*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_RX, 0, 999, 0, 10);
785*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_RY, 0, 999, 0, 10);
786*4882a593Smuzhiyun 		input_set_abs_params(input, ABS_RZ, 0, 999, 0, 10);
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 		cdev->ep4_in_urb = usb_alloc_urb(0, GFP_KERNEL);
789*4882a593Smuzhiyun 		if (!cdev->ep4_in_urb) {
790*4882a593Smuzhiyun 			ret = -ENOMEM;
791*4882a593Smuzhiyun 			goto exit_free_idev;
792*4882a593Smuzhiyun 		}
793*4882a593Smuzhiyun 
794*4882a593Smuzhiyun 		usb_fill_bulk_urb(cdev->ep4_in_urb, usb_dev,
795*4882a593Smuzhiyun 				  usb_rcvbulkpipe(usb_dev, 0x4),
796*4882a593Smuzhiyun 				  cdev->ep4_in_buf, EP4_BUFSIZE,
797*4882a593Smuzhiyun 				  snd_usb_caiaq_ep4_reply_dispatch, cdev);
798*4882a593Smuzhiyun 		ret = usb_urb_ep_type_check(cdev->ep4_in_urb);
799*4882a593Smuzhiyun 		if (ret < 0)
800*4882a593Smuzhiyun 			goto exit_free_idev;
801*4882a593Smuzhiyun 
802*4882a593Smuzhiyun 		snd_usb_caiaq_set_auto_msg(cdev, 1, 10, 5);
803*4882a593Smuzhiyun 		break;
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun 	default:
806*4882a593Smuzhiyun 		/* no input methods supported on this device */
807*4882a593Smuzhiyun 		goto exit_free_idev;
808*4882a593Smuzhiyun 	}
809*4882a593Smuzhiyun 
810*4882a593Smuzhiyun 	input->open = snd_usb_caiaq_input_open;
811*4882a593Smuzhiyun 	input->close = snd_usb_caiaq_input_close;
812*4882a593Smuzhiyun 	input->keycode = cdev->keycode;
813*4882a593Smuzhiyun 	input->keycodesize = sizeof(unsigned short);
814*4882a593Smuzhiyun 	for (i = 0; i < input->keycodemax; i++)
815*4882a593Smuzhiyun 		__set_bit(cdev->keycode[i], input->keybit);
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun 	cdev->input_dev = input;
818*4882a593Smuzhiyun 
819*4882a593Smuzhiyun 	ret = input_register_device(input);
820*4882a593Smuzhiyun 	if (ret < 0)
821*4882a593Smuzhiyun 		goto exit_free_idev;
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun 	return 0;
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun exit_free_idev:
826*4882a593Smuzhiyun 	input_free_device(input);
827*4882a593Smuzhiyun 	cdev->input_dev = NULL;
828*4882a593Smuzhiyun 	return ret;
829*4882a593Smuzhiyun }
830*4882a593Smuzhiyun 
snd_usb_caiaq_input_free(struct snd_usb_caiaqdev * cdev)831*4882a593Smuzhiyun void snd_usb_caiaq_input_free(struct snd_usb_caiaqdev *cdev)
832*4882a593Smuzhiyun {
833*4882a593Smuzhiyun 	if (!cdev || !cdev->input_dev)
834*4882a593Smuzhiyun 		return;
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun 	usb_kill_urb(cdev->ep4_in_urb);
837*4882a593Smuzhiyun 	usb_free_urb(cdev->ep4_in_urb);
838*4882a593Smuzhiyun 	cdev->ep4_in_urb = NULL;
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun 	input_unregister_device(cdev->input_dev);
841*4882a593Smuzhiyun 	cdev->input_dev = NULL;
842*4882a593Smuzhiyun }
843