xref: /openbmc/linux/drivers/hid/usbhid/hid-pidff.c (revision 6db3dfefa28739e7c9c60809c3a5aef7cc088b97)
1*6db3dfefSJiri Kosina /*
2*6db3dfefSJiri Kosina  *  Force feedback driver for USB HID PID compliant devices
3*6db3dfefSJiri Kosina  *
4*6db3dfefSJiri Kosina  *  Copyright (c) 2005, 2006 Anssi Hannula <anssi.hannula@gmail.com>
5*6db3dfefSJiri Kosina  */
6*6db3dfefSJiri Kosina 
7*6db3dfefSJiri Kosina /*
8*6db3dfefSJiri Kosina  * This program is free software; you can redistribute it and/or modify
9*6db3dfefSJiri Kosina  * it under the terms of the GNU General Public License as published by
10*6db3dfefSJiri Kosina  * the Free Software Foundation; either version 2 of the License, or
11*6db3dfefSJiri Kosina  * (at your option) any later version.
12*6db3dfefSJiri Kosina  *
13*6db3dfefSJiri Kosina  * This program is distributed in the hope that it will be useful,
14*6db3dfefSJiri Kosina  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15*6db3dfefSJiri Kosina  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*6db3dfefSJiri Kosina  * GNU General Public License for more details.
17*6db3dfefSJiri Kosina  *
18*6db3dfefSJiri Kosina  * You should have received a copy of the GNU General Public License
19*6db3dfefSJiri Kosina  * along with this program; if not, write to the Free Software
20*6db3dfefSJiri Kosina  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21*6db3dfefSJiri Kosina  */
22*6db3dfefSJiri Kosina 
23*6db3dfefSJiri Kosina /* #define DEBUG */
24*6db3dfefSJiri Kosina 
25*6db3dfefSJiri Kosina #define debug(format, arg...) pr_debug("hid-pidff: " format "\n" , ## arg)
26*6db3dfefSJiri Kosina 
27*6db3dfefSJiri Kosina #include <linux/input.h>
28*6db3dfefSJiri Kosina #include <linux/usb.h>
29*6db3dfefSJiri Kosina 
30*6db3dfefSJiri Kosina #include <linux/hid.h>
31*6db3dfefSJiri Kosina 
32*6db3dfefSJiri Kosina #include "usbhid.h"
33*6db3dfefSJiri Kosina 
34*6db3dfefSJiri Kosina #define	PID_EFFECTS_MAX		64
35*6db3dfefSJiri Kosina 
36*6db3dfefSJiri Kosina /* Report usage table used to put reports into an array */
37*6db3dfefSJiri Kosina 
38*6db3dfefSJiri Kosina #define PID_SET_EFFECT		0
39*6db3dfefSJiri Kosina #define PID_EFFECT_OPERATION	1
40*6db3dfefSJiri Kosina #define PID_DEVICE_GAIN		2
41*6db3dfefSJiri Kosina #define PID_POOL		3
42*6db3dfefSJiri Kosina #define PID_BLOCK_LOAD		4
43*6db3dfefSJiri Kosina #define PID_BLOCK_FREE		5
44*6db3dfefSJiri Kosina #define PID_DEVICE_CONTROL	6
45*6db3dfefSJiri Kosina #define PID_CREATE_NEW_EFFECT	7
46*6db3dfefSJiri Kosina 
47*6db3dfefSJiri Kosina #define PID_REQUIRED_REPORTS	7
48*6db3dfefSJiri Kosina 
49*6db3dfefSJiri Kosina #define PID_SET_ENVELOPE	8
50*6db3dfefSJiri Kosina #define PID_SET_CONDITION	9
51*6db3dfefSJiri Kosina #define PID_SET_PERIODIC	10
52*6db3dfefSJiri Kosina #define PID_SET_CONSTANT	11
53*6db3dfefSJiri Kosina #define PID_SET_RAMP		12
54*6db3dfefSJiri Kosina static const u8 pidff_reports[] = {
55*6db3dfefSJiri Kosina 	0x21, 0x77, 0x7d, 0x7f, 0x89, 0x90, 0x96, 0xab,
56*6db3dfefSJiri Kosina 	0x5a, 0x5f, 0x6e, 0x73, 0x74
57*6db3dfefSJiri Kosina };
58*6db3dfefSJiri Kosina 
59*6db3dfefSJiri Kosina /* device_control is really 0x95, but 0x96 specified as it is the usage of
60*6db3dfefSJiri Kosina the only field in that report */
61*6db3dfefSJiri Kosina 
62*6db3dfefSJiri Kosina /* Value usage tables used to put fields and values into arrays */
63*6db3dfefSJiri Kosina 
64*6db3dfefSJiri Kosina #define PID_EFFECT_BLOCK_INDEX	0
65*6db3dfefSJiri Kosina 
66*6db3dfefSJiri Kosina #define PID_DURATION		1
67*6db3dfefSJiri Kosina #define PID_GAIN		2
68*6db3dfefSJiri Kosina #define PID_TRIGGER_BUTTON	3
69*6db3dfefSJiri Kosina #define PID_TRIGGER_REPEAT_INT	4
70*6db3dfefSJiri Kosina #define PID_DIRECTION_ENABLE	5
71*6db3dfefSJiri Kosina #define PID_START_DELAY		6
72*6db3dfefSJiri Kosina static const u8 pidff_set_effect[] = {
73*6db3dfefSJiri Kosina 	0x22, 0x50, 0x52, 0x53, 0x54, 0x56, 0xa7
74*6db3dfefSJiri Kosina };
75*6db3dfefSJiri Kosina 
76*6db3dfefSJiri Kosina #define PID_ATTACK_LEVEL	1
77*6db3dfefSJiri Kosina #define PID_ATTACK_TIME		2
78*6db3dfefSJiri Kosina #define PID_FADE_LEVEL		3
79*6db3dfefSJiri Kosina #define PID_FADE_TIME		4
80*6db3dfefSJiri Kosina static const u8 pidff_set_envelope[] = { 0x22, 0x5b, 0x5c, 0x5d, 0x5e };
81*6db3dfefSJiri Kosina 
82*6db3dfefSJiri Kosina #define PID_PARAM_BLOCK_OFFSET	1
83*6db3dfefSJiri Kosina #define PID_CP_OFFSET		2
84*6db3dfefSJiri Kosina #define PID_POS_COEFFICIENT	3
85*6db3dfefSJiri Kosina #define PID_NEG_COEFFICIENT	4
86*6db3dfefSJiri Kosina #define PID_POS_SATURATION	5
87*6db3dfefSJiri Kosina #define PID_NEG_SATURATION	6
88*6db3dfefSJiri Kosina #define PID_DEAD_BAND		7
89*6db3dfefSJiri Kosina static const u8 pidff_set_condition[] = {
90*6db3dfefSJiri Kosina 	0x22, 0x23, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65
91*6db3dfefSJiri Kosina };
92*6db3dfefSJiri Kosina 
93*6db3dfefSJiri Kosina #define PID_MAGNITUDE		1
94*6db3dfefSJiri Kosina #define PID_OFFSET		2
95*6db3dfefSJiri Kosina #define PID_PHASE		3
96*6db3dfefSJiri Kosina #define PID_PERIOD		4
97*6db3dfefSJiri Kosina static const u8 pidff_set_periodic[] = { 0x22, 0x70, 0x6f, 0x71, 0x72 };
98*6db3dfefSJiri Kosina static const u8 pidff_set_constant[] = { 0x22, 0x70 };
99*6db3dfefSJiri Kosina 
100*6db3dfefSJiri Kosina #define PID_RAMP_START		1
101*6db3dfefSJiri Kosina #define PID_RAMP_END		2
102*6db3dfefSJiri Kosina static const u8 pidff_set_ramp[] = { 0x22, 0x75, 0x76 };
103*6db3dfefSJiri Kosina 
104*6db3dfefSJiri Kosina #define PID_RAM_POOL_AVAILABLE	1
105*6db3dfefSJiri Kosina static const u8 pidff_block_load[] = { 0x22, 0xac };
106*6db3dfefSJiri Kosina 
107*6db3dfefSJiri Kosina #define PID_LOOP_COUNT		1
108*6db3dfefSJiri Kosina static const u8 pidff_effect_operation[] = { 0x22, 0x7c };
109*6db3dfefSJiri Kosina 
110*6db3dfefSJiri Kosina static const u8 pidff_block_free[] = { 0x22 };
111*6db3dfefSJiri Kosina 
112*6db3dfefSJiri Kosina #define PID_DEVICE_GAIN_FIELD	0
113*6db3dfefSJiri Kosina static const u8 pidff_device_gain[] = { 0x7e };
114*6db3dfefSJiri Kosina 
115*6db3dfefSJiri Kosina #define PID_RAM_POOL_SIZE	0
116*6db3dfefSJiri Kosina #define PID_SIMULTANEOUS_MAX	1
117*6db3dfefSJiri Kosina #define PID_DEVICE_MANAGED_POOL	2
118*6db3dfefSJiri Kosina static const u8 pidff_pool[] = { 0x80, 0x83, 0xa9 };
119*6db3dfefSJiri Kosina 
120*6db3dfefSJiri Kosina /* Special field key tables used to put special field keys into arrays */
121*6db3dfefSJiri Kosina 
122*6db3dfefSJiri Kosina #define PID_ENABLE_ACTUATORS	0
123*6db3dfefSJiri Kosina #define PID_RESET		1
124*6db3dfefSJiri Kosina static const u8 pidff_device_control[] = { 0x97, 0x9a };
125*6db3dfefSJiri Kosina 
126*6db3dfefSJiri Kosina #define PID_CONSTANT	0
127*6db3dfefSJiri Kosina #define PID_RAMP	1
128*6db3dfefSJiri Kosina #define PID_SQUARE	2
129*6db3dfefSJiri Kosina #define PID_SINE	3
130*6db3dfefSJiri Kosina #define PID_TRIANGLE	4
131*6db3dfefSJiri Kosina #define PID_SAW_UP	5
132*6db3dfefSJiri Kosina #define PID_SAW_DOWN	6
133*6db3dfefSJiri Kosina #define PID_SPRING	7
134*6db3dfefSJiri Kosina #define PID_DAMPER	8
135*6db3dfefSJiri Kosina #define PID_INERTIA	9
136*6db3dfefSJiri Kosina #define PID_FRICTION	10
137*6db3dfefSJiri Kosina static const u8 pidff_effect_types[] = {
138*6db3dfefSJiri Kosina 	0x26, 0x27, 0x30, 0x31, 0x32, 0x33, 0x34,
139*6db3dfefSJiri Kosina 	0x40, 0x41, 0x42, 0x43
140*6db3dfefSJiri Kosina };
141*6db3dfefSJiri Kosina 
142*6db3dfefSJiri Kosina #define PID_BLOCK_LOAD_SUCCESS	0
143*6db3dfefSJiri Kosina #define PID_BLOCK_LOAD_FULL	1
144*6db3dfefSJiri Kosina static const u8 pidff_block_load_status[] = { 0x8c, 0x8d };
145*6db3dfefSJiri Kosina 
146*6db3dfefSJiri Kosina #define PID_EFFECT_START	0
147*6db3dfefSJiri Kosina #define PID_EFFECT_STOP		1
148*6db3dfefSJiri Kosina static const u8 pidff_effect_operation_status[] = { 0x79, 0x7b };
149*6db3dfefSJiri Kosina 
150*6db3dfefSJiri Kosina struct pidff_usage {
151*6db3dfefSJiri Kosina 	struct hid_field *field;
152*6db3dfefSJiri Kosina 	s32 *value;
153*6db3dfefSJiri Kosina };
154*6db3dfefSJiri Kosina 
155*6db3dfefSJiri Kosina struct pidff_device {
156*6db3dfefSJiri Kosina 	struct hid_device *hid;
157*6db3dfefSJiri Kosina 
158*6db3dfefSJiri Kosina 	struct hid_report *reports[sizeof(pidff_reports)];
159*6db3dfefSJiri Kosina 
160*6db3dfefSJiri Kosina 	struct pidff_usage set_effect[sizeof(pidff_set_effect)];
161*6db3dfefSJiri Kosina 	struct pidff_usage set_envelope[sizeof(pidff_set_envelope)];
162*6db3dfefSJiri Kosina 	struct pidff_usage set_condition[sizeof(pidff_set_condition)];
163*6db3dfefSJiri Kosina 	struct pidff_usage set_periodic[sizeof(pidff_set_periodic)];
164*6db3dfefSJiri Kosina 	struct pidff_usage set_constant[sizeof(pidff_set_constant)];
165*6db3dfefSJiri Kosina 	struct pidff_usage set_ramp[sizeof(pidff_set_ramp)];
166*6db3dfefSJiri Kosina 
167*6db3dfefSJiri Kosina 	struct pidff_usage device_gain[sizeof(pidff_device_gain)];
168*6db3dfefSJiri Kosina 	struct pidff_usage block_load[sizeof(pidff_block_load)];
169*6db3dfefSJiri Kosina 	struct pidff_usage pool[sizeof(pidff_pool)];
170*6db3dfefSJiri Kosina 	struct pidff_usage effect_operation[sizeof(pidff_effect_operation)];
171*6db3dfefSJiri Kosina 	struct pidff_usage block_free[sizeof(pidff_block_free)];
172*6db3dfefSJiri Kosina 
173*6db3dfefSJiri Kosina 	/* Special field is a field that is not composed of
174*6db3dfefSJiri Kosina 	   usage<->value pairs that pidff_usage values are */
175*6db3dfefSJiri Kosina 
176*6db3dfefSJiri Kosina 	/* Special field in create_new_effect */
177*6db3dfefSJiri Kosina 	struct hid_field *create_new_effect_type;
178*6db3dfefSJiri Kosina 
179*6db3dfefSJiri Kosina 	/* Special fields in set_effect */
180*6db3dfefSJiri Kosina 	struct hid_field *set_effect_type;
181*6db3dfefSJiri Kosina 	struct hid_field *effect_direction;
182*6db3dfefSJiri Kosina 
183*6db3dfefSJiri Kosina 	/* Special field in device_control */
184*6db3dfefSJiri Kosina 	struct hid_field *device_control;
185*6db3dfefSJiri Kosina 
186*6db3dfefSJiri Kosina 	/* Special field in block_load */
187*6db3dfefSJiri Kosina 	struct hid_field *block_load_status;
188*6db3dfefSJiri Kosina 
189*6db3dfefSJiri Kosina 	/* Special field in effect_operation */
190*6db3dfefSJiri Kosina 	struct hid_field *effect_operation_status;
191*6db3dfefSJiri Kosina 
192*6db3dfefSJiri Kosina 	int control_id[sizeof(pidff_device_control)];
193*6db3dfefSJiri Kosina 	int type_id[sizeof(pidff_effect_types)];
194*6db3dfefSJiri Kosina 	int status_id[sizeof(pidff_block_load_status)];
195*6db3dfefSJiri Kosina 	int operation_id[sizeof(pidff_effect_operation_status)];
196*6db3dfefSJiri Kosina 
197*6db3dfefSJiri Kosina 	int pid_id[PID_EFFECTS_MAX];
198*6db3dfefSJiri Kosina };
199*6db3dfefSJiri Kosina 
200*6db3dfefSJiri Kosina /*
201*6db3dfefSJiri Kosina  * Scale an unsigned value with range 0..max for the given field
202*6db3dfefSJiri Kosina  */
203*6db3dfefSJiri Kosina static int pidff_rescale(int i, int max, struct hid_field *field)
204*6db3dfefSJiri Kosina {
205*6db3dfefSJiri Kosina 	return i * (field->logical_maximum - field->logical_minimum) / max +
206*6db3dfefSJiri Kosina 	    field->logical_minimum;
207*6db3dfefSJiri Kosina }
208*6db3dfefSJiri Kosina 
209*6db3dfefSJiri Kosina /*
210*6db3dfefSJiri Kosina  * Scale a signed value in range -0x8000..0x7fff for the given field
211*6db3dfefSJiri Kosina  */
212*6db3dfefSJiri Kosina static int pidff_rescale_signed(int i, struct hid_field *field)
213*6db3dfefSJiri Kosina {
214*6db3dfefSJiri Kosina 	return i == 0 ? 0 : i >
215*6db3dfefSJiri Kosina 	    0 ? i * field->logical_maximum / 0x7fff : i *
216*6db3dfefSJiri Kosina 	    field->logical_minimum / -0x8000;
217*6db3dfefSJiri Kosina }
218*6db3dfefSJiri Kosina 
219*6db3dfefSJiri Kosina static void pidff_set(struct pidff_usage *usage, u16 value)
220*6db3dfefSJiri Kosina {
221*6db3dfefSJiri Kosina 	usage->value[0] = pidff_rescale(value, 0xffff, usage->field);
222*6db3dfefSJiri Kosina 	debug("calculated from %d to %d", value, usage->value[0]);
223*6db3dfefSJiri Kosina }
224*6db3dfefSJiri Kosina 
225*6db3dfefSJiri Kosina static void pidff_set_signed(struct pidff_usage *usage, s16 value)
226*6db3dfefSJiri Kosina {
227*6db3dfefSJiri Kosina 	if (usage->field->logical_minimum < 0)
228*6db3dfefSJiri Kosina 		usage->value[0] = pidff_rescale_signed(value, usage->field);
229*6db3dfefSJiri Kosina 	else {
230*6db3dfefSJiri Kosina 		if (value < 0)
231*6db3dfefSJiri Kosina 			usage->value[0] =
232*6db3dfefSJiri Kosina 			    pidff_rescale(-value, 0x8000, usage->field);
233*6db3dfefSJiri Kosina 		else
234*6db3dfefSJiri Kosina 			usage->value[0] =
235*6db3dfefSJiri Kosina 			    pidff_rescale(value, 0x7fff, usage->field);
236*6db3dfefSJiri Kosina 	}
237*6db3dfefSJiri Kosina 	debug("calculated from %d to %d", value, usage->value[0]);
238*6db3dfefSJiri Kosina }
239*6db3dfefSJiri Kosina 
240*6db3dfefSJiri Kosina /*
241*6db3dfefSJiri Kosina  * Send envelope report to the device
242*6db3dfefSJiri Kosina  */
243*6db3dfefSJiri Kosina static void pidff_set_envelope_report(struct pidff_device *pidff,
244*6db3dfefSJiri Kosina 				      struct ff_envelope *envelope)
245*6db3dfefSJiri Kosina {
246*6db3dfefSJiri Kosina 	pidff->set_envelope[PID_EFFECT_BLOCK_INDEX].value[0] =
247*6db3dfefSJiri Kosina 	    pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0];
248*6db3dfefSJiri Kosina 
249*6db3dfefSJiri Kosina 	pidff->set_envelope[PID_ATTACK_LEVEL].value[0] =
250*6db3dfefSJiri Kosina 	    pidff_rescale(envelope->attack_level >
251*6db3dfefSJiri Kosina 			  0x7fff ? 0x7fff : envelope->attack_level, 0x7fff,
252*6db3dfefSJiri Kosina 			  pidff->set_envelope[PID_ATTACK_LEVEL].field);
253*6db3dfefSJiri Kosina 	pidff->set_envelope[PID_FADE_LEVEL].value[0] =
254*6db3dfefSJiri Kosina 	    pidff_rescale(envelope->fade_level >
255*6db3dfefSJiri Kosina 			  0x7fff ? 0x7fff : envelope->fade_level, 0x7fff,
256*6db3dfefSJiri Kosina 			  pidff->set_envelope[PID_FADE_LEVEL].field);
257*6db3dfefSJiri Kosina 
258*6db3dfefSJiri Kosina 	pidff->set_envelope[PID_ATTACK_TIME].value[0] = envelope->attack_length;
259*6db3dfefSJiri Kosina 	pidff->set_envelope[PID_FADE_TIME].value[0] = envelope->fade_length;
260*6db3dfefSJiri Kosina 
261*6db3dfefSJiri Kosina 	debug("attack %u => %d", envelope->attack_level,
262*6db3dfefSJiri Kosina 	      pidff->set_envelope[PID_ATTACK_LEVEL].value[0]);
263*6db3dfefSJiri Kosina 
264*6db3dfefSJiri Kosina 	usbhid_submit_report(pidff->hid, pidff->reports[PID_SET_ENVELOPE],
265*6db3dfefSJiri Kosina 			  USB_DIR_OUT);
266*6db3dfefSJiri Kosina }
267*6db3dfefSJiri Kosina 
268*6db3dfefSJiri Kosina /*
269*6db3dfefSJiri Kosina  * Test if the new envelope differs from old one
270*6db3dfefSJiri Kosina  */
271*6db3dfefSJiri Kosina static int pidff_needs_set_envelope(struct ff_envelope *envelope,
272*6db3dfefSJiri Kosina 				    struct ff_envelope *old)
273*6db3dfefSJiri Kosina {
274*6db3dfefSJiri Kosina 	return envelope->attack_level != old->attack_level ||
275*6db3dfefSJiri Kosina 	       envelope->fade_level != old->fade_level ||
276*6db3dfefSJiri Kosina 	       envelope->attack_length != old->attack_length ||
277*6db3dfefSJiri Kosina 	       envelope->fade_length != old->fade_length;
278*6db3dfefSJiri Kosina }
279*6db3dfefSJiri Kosina 
280*6db3dfefSJiri Kosina /*
281*6db3dfefSJiri Kosina  * Send constant force report to the device
282*6db3dfefSJiri Kosina  */
283*6db3dfefSJiri Kosina static void pidff_set_constant_force_report(struct pidff_device *pidff,
284*6db3dfefSJiri Kosina 					    struct ff_effect *effect)
285*6db3dfefSJiri Kosina {
286*6db3dfefSJiri Kosina 	pidff->set_constant[PID_EFFECT_BLOCK_INDEX].value[0] =
287*6db3dfefSJiri Kosina 		pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0];
288*6db3dfefSJiri Kosina 	pidff_set_signed(&pidff->set_constant[PID_MAGNITUDE],
289*6db3dfefSJiri Kosina 			 effect->u.constant.level);
290*6db3dfefSJiri Kosina 
291*6db3dfefSJiri Kosina 	usbhid_submit_report(pidff->hid, pidff->reports[PID_SET_CONSTANT],
292*6db3dfefSJiri Kosina 			  USB_DIR_OUT);
293*6db3dfefSJiri Kosina }
294*6db3dfefSJiri Kosina 
295*6db3dfefSJiri Kosina /*
296*6db3dfefSJiri Kosina  * Test if the constant parameters have changed between effects
297*6db3dfefSJiri Kosina  */
298*6db3dfefSJiri Kosina static int pidff_needs_set_constant(struct ff_effect *effect,
299*6db3dfefSJiri Kosina 				    struct ff_effect *old)
300*6db3dfefSJiri Kosina {
301*6db3dfefSJiri Kosina 	return effect->u.constant.level != old->u.constant.level;
302*6db3dfefSJiri Kosina }
303*6db3dfefSJiri Kosina 
304*6db3dfefSJiri Kosina /*
305*6db3dfefSJiri Kosina  * Send set effect report to the device
306*6db3dfefSJiri Kosina  */
307*6db3dfefSJiri Kosina static void pidff_set_effect_report(struct pidff_device *pidff,
308*6db3dfefSJiri Kosina 				    struct ff_effect *effect)
309*6db3dfefSJiri Kosina {
310*6db3dfefSJiri Kosina 	pidff->set_effect[PID_EFFECT_BLOCK_INDEX].value[0] =
311*6db3dfefSJiri Kosina 		pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0];
312*6db3dfefSJiri Kosina 	pidff->set_effect_type->value[0] =
313*6db3dfefSJiri Kosina 		pidff->create_new_effect_type->value[0];
314*6db3dfefSJiri Kosina 	pidff->set_effect[PID_DURATION].value[0] = effect->replay.length;
315*6db3dfefSJiri Kosina 	pidff->set_effect[PID_TRIGGER_BUTTON].value[0] = effect->trigger.button;
316*6db3dfefSJiri Kosina 	pidff->set_effect[PID_TRIGGER_REPEAT_INT].value[0] =
317*6db3dfefSJiri Kosina 		effect->trigger.interval;
318*6db3dfefSJiri Kosina 	pidff->set_effect[PID_GAIN].value[0] =
319*6db3dfefSJiri Kosina 		pidff->set_effect[PID_GAIN].field->logical_maximum;
320*6db3dfefSJiri Kosina 	pidff->set_effect[PID_DIRECTION_ENABLE].value[0] = 1;
321*6db3dfefSJiri Kosina 	pidff->effect_direction->value[0] =
322*6db3dfefSJiri Kosina 		pidff_rescale(effect->direction, 0xffff,
323*6db3dfefSJiri Kosina 				pidff->effect_direction);
324*6db3dfefSJiri Kosina 	pidff->set_effect[PID_START_DELAY].value[0] = effect->replay.delay;
325*6db3dfefSJiri Kosina 
326*6db3dfefSJiri Kosina 	usbhid_submit_report(pidff->hid, pidff->reports[PID_SET_EFFECT],
327*6db3dfefSJiri Kosina 			  USB_DIR_OUT);
328*6db3dfefSJiri Kosina }
329*6db3dfefSJiri Kosina 
330*6db3dfefSJiri Kosina /*
331*6db3dfefSJiri Kosina  * Test if the values used in set_effect have changed
332*6db3dfefSJiri Kosina  */
333*6db3dfefSJiri Kosina static int pidff_needs_set_effect(struct ff_effect *effect,
334*6db3dfefSJiri Kosina 				  struct ff_effect *old)
335*6db3dfefSJiri Kosina {
336*6db3dfefSJiri Kosina 	return effect->replay.length != old->replay.length ||
337*6db3dfefSJiri Kosina 	       effect->trigger.interval != old->trigger.interval ||
338*6db3dfefSJiri Kosina 	       effect->trigger.button != old->trigger.button ||
339*6db3dfefSJiri Kosina 	       effect->direction != old->direction ||
340*6db3dfefSJiri Kosina 	       effect->replay.delay != old->replay.delay;
341*6db3dfefSJiri Kosina }
342*6db3dfefSJiri Kosina 
343*6db3dfefSJiri Kosina /*
344*6db3dfefSJiri Kosina  * Send periodic effect report to the device
345*6db3dfefSJiri Kosina  */
346*6db3dfefSJiri Kosina static void pidff_set_periodic_report(struct pidff_device *pidff,
347*6db3dfefSJiri Kosina 				      struct ff_effect *effect)
348*6db3dfefSJiri Kosina {
349*6db3dfefSJiri Kosina 	pidff->set_periodic[PID_EFFECT_BLOCK_INDEX].value[0] =
350*6db3dfefSJiri Kosina 		pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0];
351*6db3dfefSJiri Kosina 	pidff_set_signed(&pidff->set_periodic[PID_MAGNITUDE],
352*6db3dfefSJiri Kosina 			 effect->u.periodic.magnitude);
353*6db3dfefSJiri Kosina 	pidff_set_signed(&pidff->set_periodic[PID_OFFSET],
354*6db3dfefSJiri Kosina 			 effect->u.periodic.offset);
355*6db3dfefSJiri Kosina 	pidff_set(&pidff->set_periodic[PID_PHASE], effect->u.periodic.phase);
356*6db3dfefSJiri Kosina 	pidff->set_periodic[PID_PERIOD].value[0] = effect->u.periodic.period;
357*6db3dfefSJiri Kosina 
358*6db3dfefSJiri Kosina 	usbhid_submit_report(pidff->hid, pidff->reports[PID_SET_PERIODIC],
359*6db3dfefSJiri Kosina 			  USB_DIR_OUT);
360*6db3dfefSJiri Kosina 
361*6db3dfefSJiri Kosina }
362*6db3dfefSJiri Kosina 
363*6db3dfefSJiri Kosina /*
364*6db3dfefSJiri Kosina  * Test if periodic effect parameters have changed
365*6db3dfefSJiri Kosina  */
366*6db3dfefSJiri Kosina static int pidff_needs_set_periodic(struct ff_effect *effect,
367*6db3dfefSJiri Kosina 				    struct ff_effect *old)
368*6db3dfefSJiri Kosina {
369*6db3dfefSJiri Kosina 	return effect->u.periodic.magnitude != old->u.periodic.magnitude ||
370*6db3dfefSJiri Kosina 	       effect->u.periodic.offset != old->u.periodic.offset ||
371*6db3dfefSJiri Kosina 	       effect->u.periodic.phase != old->u.periodic.phase ||
372*6db3dfefSJiri Kosina 	       effect->u.periodic.period != old->u.periodic.period;
373*6db3dfefSJiri Kosina }
374*6db3dfefSJiri Kosina 
375*6db3dfefSJiri Kosina /*
376*6db3dfefSJiri Kosina  * Send condition effect reports to the device
377*6db3dfefSJiri Kosina  */
378*6db3dfefSJiri Kosina static void pidff_set_condition_report(struct pidff_device *pidff,
379*6db3dfefSJiri Kosina 				       struct ff_effect *effect)
380*6db3dfefSJiri Kosina {
381*6db3dfefSJiri Kosina 	int i;
382*6db3dfefSJiri Kosina 
383*6db3dfefSJiri Kosina 	pidff->set_condition[PID_EFFECT_BLOCK_INDEX].value[0] =
384*6db3dfefSJiri Kosina 		pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0];
385*6db3dfefSJiri Kosina 
386*6db3dfefSJiri Kosina 	for (i = 0; i < 2; i++) {
387*6db3dfefSJiri Kosina 		pidff->set_condition[PID_PARAM_BLOCK_OFFSET].value[0] = i;
388*6db3dfefSJiri Kosina 		pidff_set_signed(&pidff->set_condition[PID_CP_OFFSET],
389*6db3dfefSJiri Kosina 				 effect->u.condition[i].center);
390*6db3dfefSJiri Kosina 		pidff_set_signed(&pidff->set_condition[PID_POS_COEFFICIENT],
391*6db3dfefSJiri Kosina 				 effect->u.condition[i].right_coeff);
392*6db3dfefSJiri Kosina 		pidff_set_signed(&pidff->set_condition[PID_NEG_COEFFICIENT],
393*6db3dfefSJiri Kosina 				 effect->u.condition[i].left_coeff);
394*6db3dfefSJiri Kosina 		pidff_set(&pidff->set_condition[PID_POS_SATURATION],
395*6db3dfefSJiri Kosina 			  effect->u.condition[i].right_saturation);
396*6db3dfefSJiri Kosina 		pidff_set(&pidff->set_condition[PID_NEG_SATURATION],
397*6db3dfefSJiri Kosina 			  effect->u.condition[i].left_saturation);
398*6db3dfefSJiri Kosina 		pidff_set(&pidff->set_condition[PID_DEAD_BAND],
399*6db3dfefSJiri Kosina 			  effect->u.condition[i].deadband);
400*6db3dfefSJiri Kosina 		usbhid_wait_io(pidff->hid);
401*6db3dfefSJiri Kosina 		usbhid_submit_report(pidff->hid, pidff->reports[PID_SET_CONDITION],
402*6db3dfefSJiri Kosina 				  USB_DIR_OUT);
403*6db3dfefSJiri Kosina 	}
404*6db3dfefSJiri Kosina }
405*6db3dfefSJiri Kosina 
406*6db3dfefSJiri Kosina /*
407*6db3dfefSJiri Kosina  * Test if condition effect parameters have changed
408*6db3dfefSJiri Kosina  */
409*6db3dfefSJiri Kosina static int pidff_needs_set_condition(struct ff_effect *effect,
410*6db3dfefSJiri Kosina 				     struct ff_effect *old)
411*6db3dfefSJiri Kosina {
412*6db3dfefSJiri Kosina 	int i;
413*6db3dfefSJiri Kosina 	int ret = 0;
414*6db3dfefSJiri Kosina 
415*6db3dfefSJiri Kosina 	for (i = 0; i < 2; i++) {
416*6db3dfefSJiri Kosina 		struct ff_condition_effect *cond = &effect->u.condition[i];
417*6db3dfefSJiri Kosina 		struct ff_condition_effect *old_cond = &old->u.condition[i];
418*6db3dfefSJiri Kosina 
419*6db3dfefSJiri Kosina 		ret |= cond->center != old_cond->center ||
420*6db3dfefSJiri Kosina 		       cond->right_coeff != old_cond->right_coeff ||
421*6db3dfefSJiri Kosina 		       cond->left_coeff != old_cond->left_coeff ||
422*6db3dfefSJiri Kosina 		       cond->right_saturation != old_cond->right_saturation ||
423*6db3dfefSJiri Kosina 		       cond->left_saturation != old_cond->left_saturation ||
424*6db3dfefSJiri Kosina 		       cond->deadband != old_cond->deadband;
425*6db3dfefSJiri Kosina 	}
426*6db3dfefSJiri Kosina 
427*6db3dfefSJiri Kosina 	return ret;
428*6db3dfefSJiri Kosina }
429*6db3dfefSJiri Kosina 
430*6db3dfefSJiri Kosina /*
431*6db3dfefSJiri Kosina  * Send ramp force report to the device
432*6db3dfefSJiri Kosina  */
433*6db3dfefSJiri Kosina static void pidff_set_ramp_force_report(struct pidff_device *pidff,
434*6db3dfefSJiri Kosina 					struct ff_effect *effect)
435*6db3dfefSJiri Kosina {
436*6db3dfefSJiri Kosina 	pidff->set_ramp[PID_EFFECT_BLOCK_INDEX].value[0] =
437*6db3dfefSJiri Kosina 		pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0];
438*6db3dfefSJiri Kosina 	pidff_set_signed(&pidff->set_ramp[PID_RAMP_START],
439*6db3dfefSJiri Kosina 			 effect->u.ramp.start_level);
440*6db3dfefSJiri Kosina 	pidff_set_signed(&pidff->set_ramp[PID_RAMP_END],
441*6db3dfefSJiri Kosina 			 effect->u.ramp.end_level);
442*6db3dfefSJiri Kosina 	usbhid_submit_report(pidff->hid, pidff->reports[PID_SET_RAMP],
443*6db3dfefSJiri Kosina 			  USB_DIR_OUT);
444*6db3dfefSJiri Kosina }
445*6db3dfefSJiri Kosina 
446*6db3dfefSJiri Kosina /*
447*6db3dfefSJiri Kosina  * Test if ramp force parameters have changed
448*6db3dfefSJiri Kosina  */
449*6db3dfefSJiri Kosina static int pidff_needs_set_ramp(struct ff_effect *effect, struct ff_effect *old)
450*6db3dfefSJiri Kosina {
451*6db3dfefSJiri Kosina 	return effect->u.ramp.start_level != old->u.ramp.start_level ||
452*6db3dfefSJiri Kosina 	       effect->u.ramp.end_level != old->u.ramp.end_level;
453*6db3dfefSJiri Kosina }
454*6db3dfefSJiri Kosina 
455*6db3dfefSJiri Kosina /*
456*6db3dfefSJiri Kosina  * Send a request for effect upload to the device
457*6db3dfefSJiri Kosina  *
458*6db3dfefSJiri Kosina  * Returns 0 if device reported success, -ENOSPC if the device reported memory
459*6db3dfefSJiri Kosina  * is full. Upon unknown response the function will retry for 60 times, if
460*6db3dfefSJiri Kosina  * still unsuccessful -EIO is returned.
461*6db3dfefSJiri Kosina  */
462*6db3dfefSJiri Kosina static int pidff_request_effect_upload(struct pidff_device *pidff, int efnum)
463*6db3dfefSJiri Kosina {
464*6db3dfefSJiri Kosina 	int j;
465*6db3dfefSJiri Kosina 
466*6db3dfefSJiri Kosina 	pidff->create_new_effect_type->value[0] = efnum;
467*6db3dfefSJiri Kosina 	usbhid_submit_report(pidff->hid, pidff->reports[PID_CREATE_NEW_EFFECT],
468*6db3dfefSJiri Kosina 			  USB_DIR_OUT);
469*6db3dfefSJiri Kosina 	debug("create_new_effect sent, type: %d", efnum);
470*6db3dfefSJiri Kosina 
471*6db3dfefSJiri Kosina 	pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0] = 0;
472*6db3dfefSJiri Kosina 	pidff->block_load_status->value[0] = 0;
473*6db3dfefSJiri Kosina 	usbhid_wait_io(pidff->hid);
474*6db3dfefSJiri Kosina 
475*6db3dfefSJiri Kosina 	for (j = 0; j < 60; j++) {
476*6db3dfefSJiri Kosina 		debug("pid_block_load requested");
477*6db3dfefSJiri Kosina 		usbhid_submit_report(pidff->hid, pidff->reports[PID_BLOCK_LOAD],
478*6db3dfefSJiri Kosina 				  USB_DIR_IN);
479*6db3dfefSJiri Kosina 		usbhid_wait_io(pidff->hid);
480*6db3dfefSJiri Kosina 		if (pidff->block_load_status->value[0] ==
481*6db3dfefSJiri Kosina 		    pidff->status_id[PID_BLOCK_LOAD_SUCCESS]) {
482*6db3dfefSJiri Kosina 			debug("device reported free memory: %d bytes",
483*6db3dfefSJiri Kosina 			      pidff->block_load[PID_RAM_POOL_AVAILABLE].value ?
484*6db3dfefSJiri Kosina 				pidff->block_load[PID_RAM_POOL_AVAILABLE].value[0] : -1);
485*6db3dfefSJiri Kosina 			return 0;
486*6db3dfefSJiri Kosina 		}
487*6db3dfefSJiri Kosina 		if (pidff->block_load_status->value[0] ==
488*6db3dfefSJiri Kosina 		    pidff->status_id[PID_BLOCK_LOAD_FULL]) {
489*6db3dfefSJiri Kosina 			debug("not enough memory free: %d bytes",
490*6db3dfefSJiri Kosina 			      pidff->block_load[PID_RAM_POOL_AVAILABLE].value ?
491*6db3dfefSJiri Kosina 				pidff->block_load[PID_RAM_POOL_AVAILABLE].value[0] : -1);
492*6db3dfefSJiri Kosina 			return -ENOSPC;
493*6db3dfefSJiri Kosina 		}
494*6db3dfefSJiri Kosina 	}
495*6db3dfefSJiri Kosina 	printk(KERN_ERR "hid-pidff: pid_block_load failed 60 times\n");
496*6db3dfefSJiri Kosina 	return -EIO;
497*6db3dfefSJiri Kosina }
498*6db3dfefSJiri Kosina 
499*6db3dfefSJiri Kosina /*
500*6db3dfefSJiri Kosina  * Play the effect with PID id n times
501*6db3dfefSJiri Kosina  */
502*6db3dfefSJiri Kosina static void pidff_playback_pid(struct pidff_device *pidff, int pid_id, int n)
503*6db3dfefSJiri Kosina {
504*6db3dfefSJiri Kosina 	pidff->effect_operation[PID_EFFECT_BLOCK_INDEX].value[0] = pid_id;
505*6db3dfefSJiri Kosina 
506*6db3dfefSJiri Kosina 	if (n == 0) {
507*6db3dfefSJiri Kosina 		pidff->effect_operation_status->value[0] =
508*6db3dfefSJiri Kosina 			pidff->operation_id[PID_EFFECT_STOP];
509*6db3dfefSJiri Kosina 	} else {
510*6db3dfefSJiri Kosina 		pidff->effect_operation_status->value[0] =
511*6db3dfefSJiri Kosina 			pidff->operation_id[PID_EFFECT_START];
512*6db3dfefSJiri Kosina 		pidff->effect_operation[PID_LOOP_COUNT].value[0] = n;
513*6db3dfefSJiri Kosina 	}
514*6db3dfefSJiri Kosina 
515*6db3dfefSJiri Kosina 	usbhid_wait_io(pidff->hid);
516*6db3dfefSJiri Kosina 	usbhid_submit_report(pidff->hid, pidff->reports[PID_EFFECT_OPERATION],
517*6db3dfefSJiri Kosina 			  USB_DIR_OUT);
518*6db3dfefSJiri Kosina }
519*6db3dfefSJiri Kosina 
520*6db3dfefSJiri Kosina /**
521*6db3dfefSJiri Kosina  * Play the effect with effect id @effect_id for @value times
522*6db3dfefSJiri Kosina  */
523*6db3dfefSJiri Kosina static int pidff_playback(struct input_dev *dev, int effect_id, int value)
524*6db3dfefSJiri Kosina {
525*6db3dfefSJiri Kosina 	struct pidff_device *pidff = dev->ff->private;
526*6db3dfefSJiri Kosina 
527*6db3dfefSJiri Kosina 	pidff_playback_pid(pidff, pidff->pid_id[effect_id], value);
528*6db3dfefSJiri Kosina 
529*6db3dfefSJiri Kosina 	return 0;
530*6db3dfefSJiri Kosina }
531*6db3dfefSJiri Kosina 
532*6db3dfefSJiri Kosina /*
533*6db3dfefSJiri Kosina  * Erase effect with PID id
534*6db3dfefSJiri Kosina  */
535*6db3dfefSJiri Kosina static void pidff_erase_pid(struct pidff_device *pidff, int pid_id)
536*6db3dfefSJiri Kosina {
537*6db3dfefSJiri Kosina 	pidff->block_free[PID_EFFECT_BLOCK_INDEX].value[0] = pid_id;
538*6db3dfefSJiri Kosina 	usbhid_submit_report(pidff->hid, pidff->reports[PID_BLOCK_FREE],
539*6db3dfefSJiri Kosina 			  USB_DIR_OUT);
540*6db3dfefSJiri Kosina }
541*6db3dfefSJiri Kosina 
542*6db3dfefSJiri Kosina /*
543*6db3dfefSJiri Kosina  * Stop and erase effect with effect_id
544*6db3dfefSJiri Kosina  */
545*6db3dfefSJiri Kosina static int pidff_erase_effect(struct input_dev *dev, int effect_id)
546*6db3dfefSJiri Kosina {
547*6db3dfefSJiri Kosina 	struct pidff_device *pidff = dev->ff->private;
548*6db3dfefSJiri Kosina 	int pid_id = pidff->pid_id[effect_id];
549*6db3dfefSJiri Kosina 
550*6db3dfefSJiri Kosina 	debug("starting to erase %d/%d", effect_id, pidff->pid_id[effect_id]);
551*6db3dfefSJiri Kosina 	pidff_playback_pid(pidff, pid_id, 0);
552*6db3dfefSJiri Kosina 	pidff_erase_pid(pidff, pid_id);
553*6db3dfefSJiri Kosina 
554*6db3dfefSJiri Kosina 	return 0;
555*6db3dfefSJiri Kosina }
556*6db3dfefSJiri Kosina 
557*6db3dfefSJiri Kosina /*
558*6db3dfefSJiri Kosina  * Effect upload handler
559*6db3dfefSJiri Kosina  */
560*6db3dfefSJiri Kosina static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect,
561*6db3dfefSJiri Kosina 			       struct ff_effect *old)
562*6db3dfefSJiri Kosina {
563*6db3dfefSJiri Kosina 	struct pidff_device *pidff = dev->ff->private;
564*6db3dfefSJiri Kosina 	int type_id;
565*6db3dfefSJiri Kosina 	int error;
566*6db3dfefSJiri Kosina 
567*6db3dfefSJiri Kosina 	switch (effect->type) {
568*6db3dfefSJiri Kosina 	case FF_CONSTANT:
569*6db3dfefSJiri Kosina 		if (!old) {
570*6db3dfefSJiri Kosina 			error = pidff_request_effect_upload(pidff,
571*6db3dfefSJiri Kosina 					pidff->type_id[PID_CONSTANT]);
572*6db3dfefSJiri Kosina 			if (error)
573*6db3dfefSJiri Kosina 				return error;
574*6db3dfefSJiri Kosina 		}
575*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_effect(effect, old))
576*6db3dfefSJiri Kosina 			pidff_set_effect_report(pidff, effect);
577*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_constant(effect, old))
578*6db3dfefSJiri Kosina 			pidff_set_constant_force_report(pidff, effect);
579*6db3dfefSJiri Kosina 		if (!old ||
580*6db3dfefSJiri Kosina 		    pidff_needs_set_envelope(&effect->u.constant.envelope,
581*6db3dfefSJiri Kosina 					&old->u.constant.envelope))
582*6db3dfefSJiri Kosina 			pidff_set_envelope_report(pidff,
583*6db3dfefSJiri Kosina 					&effect->u.constant.envelope);
584*6db3dfefSJiri Kosina 		break;
585*6db3dfefSJiri Kosina 
586*6db3dfefSJiri Kosina 	case FF_PERIODIC:
587*6db3dfefSJiri Kosina 		if (!old) {
588*6db3dfefSJiri Kosina 			switch (effect->u.periodic.waveform) {
589*6db3dfefSJiri Kosina 			case FF_SQUARE:
590*6db3dfefSJiri Kosina 				type_id = PID_SQUARE;
591*6db3dfefSJiri Kosina 				break;
592*6db3dfefSJiri Kosina 			case FF_TRIANGLE:
593*6db3dfefSJiri Kosina 				type_id = PID_TRIANGLE;
594*6db3dfefSJiri Kosina 				break;
595*6db3dfefSJiri Kosina 			case FF_SINE:
596*6db3dfefSJiri Kosina 				type_id = PID_SINE;
597*6db3dfefSJiri Kosina 				break;
598*6db3dfefSJiri Kosina 			case FF_SAW_UP:
599*6db3dfefSJiri Kosina 				type_id = PID_SAW_UP;
600*6db3dfefSJiri Kosina 				break;
601*6db3dfefSJiri Kosina 			case FF_SAW_DOWN:
602*6db3dfefSJiri Kosina 				type_id = PID_SAW_DOWN;
603*6db3dfefSJiri Kosina 				break;
604*6db3dfefSJiri Kosina 			default:
605*6db3dfefSJiri Kosina 				printk(KERN_ERR
606*6db3dfefSJiri Kosina 				       "hid-pidff: invalid waveform\n");
607*6db3dfefSJiri Kosina 				return -EINVAL;
608*6db3dfefSJiri Kosina 			}
609*6db3dfefSJiri Kosina 
610*6db3dfefSJiri Kosina 			error = pidff_request_effect_upload(pidff,
611*6db3dfefSJiri Kosina 					pidff->type_id[type_id]);
612*6db3dfefSJiri Kosina 			if (error)
613*6db3dfefSJiri Kosina 				return error;
614*6db3dfefSJiri Kosina 		}
615*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_effect(effect, old))
616*6db3dfefSJiri Kosina 			pidff_set_effect_report(pidff, effect);
617*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_periodic(effect, old))
618*6db3dfefSJiri Kosina 			pidff_set_periodic_report(pidff, effect);
619*6db3dfefSJiri Kosina 		if (!old ||
620*6db3dfefSJiri Kosina 		    pidff_needs_set_envelope(&effect->u.periodic.envelope,
621*6db3dfefSJiri Kosina 					&old->u.periodic.envelope))
622*6db3dfefSJiri Kosina 			pidff_set_envelope_report(pidff,
623*6db3dfefSJiri Kosina 					&effect->u.periodic.envelope);
624*6db3dfefSJiri Kosina 		break;
625*6db3dfefSJiri Kosina 
626*6db3dfefSJiri Kosina 	case FF_RAMP:
627*6db3dfefSJiri Kosina 		if (!old) {
628*6db3dfefSJiri Kosina 			error = pidff_request_effect_upload(pidff,
629*6db3dfefSJiri Kosina 					pidff->type_id[PID_RAMP]);
630*6db3dfefSJiri Kosina 			if (error)
631*6db3dfefSJiri Kosina 				return error;
632*6db3dfefSJiri Kosina 		}
633*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_effect(effect, old))
634*6db3dfefSJiri Kosina 			pidff_set_effect_report(pidff, effect);
635*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_ramp(effect, old))
636*6db3dfefSJiri Kosina 			pidff_set_ramp_force_report(pidff, effect);
637*6db3dfefSJiri Kosina 		if (!old ||
638*6db3dfefSJiri Kosina 		    pidff_needs_set_envelope(&effect->u.ramp.envelope,
639*6db3dfefSJiri Kosina 					&old->u.ramp.envelope))
640*6db3dfefSJiri Kosina 			pidff_set_envelope_report(pidff,
641*6db3dfefSJiri Kosina 					&effect->u.ramp.envelope);
642*6db3dfefSJiri Kosina 		break;
643*6db3dfefSJiri Kosina 
644*6db3dfefSJiri Kosina 	case FF_SPRING:
645*6db3dfefSJiri Kosina 		if (!old) {
646*6db3dfefSJiri Kosina 			error = pidff_request_effect_upload(pidff,
647*6db3dfefSJiri Kosina 					pidff->type_id[PID_SPRING]);
648*6db3dfefSJiri Kosina 			if (error)
649*6db3dfefSJiri Kosina 				return error;
650*6db3dfefSJiri Kosina 		}
651*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_effect(effect, old))
652*6db3dfefSJiri Kosina 			pidff_set_effect_report(pidff, effect);
653*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_condition(effect, old))
654*6db3dfefSJiri Kosina 			pidff_set_condition_report(pidff, effect);
655*6db3dfefSJiri Kosina 		break;
656*6db3dfefSJiri Kosina 
657*6db3dfefSJiri Kosina 	case FF_FRICTION:
658*6db3dfefSJiri Kosina 		if (!old) {
659*6db3dfefSJiri Kosina 			error = pidff_request_effect_upload(pidff,
660*6db3dfefSJiri Kosina 					pidff->type_id[PID_FRICTION]);
661*6db3dfefSJiri Kosina 			if (error)
662*6db3dfefSJiri Kosina 				return error;
663*6db3dfefSJiri Kosina 		}
664*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_effect(effect, old))
665*6db3dfefSJiri Kosina 			pidff_set_effect_report(pidff, effect);
666*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_condition(effect, old))
667*6db3dfefSJiri Kosina 			pidff_set_condition_report(pidff, effect);
668*6db3dfefSJiri Kosina 		break;
669*6db3dfefSJiri Kosina 
670*6db3dfefSJiri Kosina 	case FF_DAMPER:
671*6db3dfefSJiri Kosina 		if (!old) {
672*6db3dfefSJiri Kosina 			error = pidff_request_effect_upload(pidff,
673*6db3dfefSJiri Kosina 					pidff->type_id[PID_DAMPER]);
674*6db3dfefSJiri Kosina 			if (error)
675*6db3dfefSJiri Kosina 				return error;
676*6db3dfefSJiri Kosina 		}
677*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_effect(effect, old))
678*6db3dfefSJiri Kosina 			pidff_set_effect_report(pidff, effect);
679*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_condition(effect, old))
680*6db3dfefSJiri Kosina 			pidff_set_condition_report(pidff, effect);
681*6db3dfefSJiri Kosina 		break;
682*6db3dfefSJiri Kosina 
683*6db3dfefSJiri Kosina 	case FF_INERTIA:
684*6db3dfefSJiri Kosina 		if (!old) {
685*6db3dfefSJiri Kosina 			error = pidff_request_effect_upload(pidff,
686*6db3dfefSJiri Kosina 					pidff->type_id[PID_INERTIA]);
687*6db3dfefSJiri Kosina 			if (error)
688*6db3dfefSJiri Kosina 				return error;
689*6db3dfefSJiri Kosina 		}
690*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_effect(effect, old))
691*6db3dfefSJiri Kosina 			pidff_set_effect_report(pidff, effect);
692*6db3dfefSJiri Kosina 		if (!old || pidff_needs_set_condition(effect, old))
693*6db3dfefSJiri Kosina 			pidff_set_condition_report(pidff, effect);
694*6db3dfefSJiri Kosina 		break;
695*6db3dfefSJiri Kosina 
696*6db3dfefSJiri Kosina 	default:
697*6db3dfefSJiri Kosina 		printk(KERN_ERR "hid-pidff: invalid type\n");
698*6db3dfefSJiri Kosina 		return -EINVAL;
699*6db3dfefSJiri Kosina 	}
700*6db3dfefSJiri Kosina 
701*6db3dfefSJiri Kosina 	if (!old)
702*6db3dfefSJiri Kosina 		pidff->pid_id[effect->id] =
703*6db3dfefSJiri Kosina 		    pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0];
704*6db3dfefSJiri Kosina 
705*6db3dfefSJiri Kosina 	debug("uploaded");
706*6db3dfefSJiri Kosina 
707*6db3dfefSJiri Kosina 	return 0;
708*6db3dfefSJiri Kosina }
709*6db3dfefSJiri Kosina 
710*6db3dfefSJiri Kosina /*
711*6db3dfefSJiri Kosina  * set_gain() handler
712*6db3dfefSJiri Kosina  */
713*6db3dfefSJiri Kosina static void pidff_set_gain(struct input_dev *dev, u16 gain)
714*6db3dfefSJiri Kosina {
715*6db3dfefSJiri Kosina 	struct pidff_device *pidff = dev->ff->private;
716*6db3dfefSJiri Kosina 
717*6db3dfefSJiri Kosina 	pidff_set(&pidff->device_gain[PID_DEVICE_GAIN_FIELD], gain);
718*6db3dfefSJiri Kosina 	usbhid_submit_report(pidff->hid, pidff->reports[PID_DEVICE_GAIN],
719*6db3dfefSJiri Kosina 			  USB_DIR_OUT);
720*6db3dfefSJiri Kosina }
721*6db3dfefSJiri Kosina 
722*6db3dfefSJiri Kosina static void pidff_autocenter(struct pidff_device *pidff, u16 magnitude)
723*6db3dfefSJiri Kosina {
724*6db3dfefSJiri Kosina 	struct hid_field *field =
725*6db3dfefSJiri Kosina 		pidff->block_load[PID_EFFECT_BLOCK_INDEX].field;
726*6db3dfefSJiri Kosina 
727*6db3dfefSJiri Kosina 	if (!magnitude) {
728*6db3dfefSJiri Kosina 		pidff_playback_pid(pidff, field->logical_minimum, 0);
729*6db3dfefSJiri Kosina 		return;
730*6db3dfefSJiri Kosina 	}
731*6db3dfefSJiri Kosina 
732*6db3dfefSJiri Kosina 	pidff_playback_pid(pidff, field->logical_minimum, 1);
733*6db3dfefSJiri Kosina 
734*6db3dfefSJiri Kosina 	pidff->set_effect[PID_EFFECT_BLOCK_INDEX].value[0] =
735*6db3dfefSJiri Kosina 		pidff->block_load[PID_EFFECT_BLOCK_INDEX].field->logical_minimum;
736*6db3dfefSJiri Kosina 	pidff->set_effect_type->value[0] = pidff->type_id[PID_SPRING];
737*6db3dfefSJiri Kosina 	pidff->set_effect[PID_DURATION].value[0] = 0;
738*6db3dfefSJiri Kosina 	pidff->set_effect[PID_TRIGGER_BUTTON].value[0] = 0;
739*6db3dfefSJiri Kosina 	pidff->set_effect[PID_TRIGGER_REPEAT_INT].value[0] = 0;
740*6db3dfefSJiri Kosina 	pidff_set(&pidff->set_effect[PID_GAIN], magnitude);
741*6db3dfefSJiri Kosina 	pidff->set_effect[PID_START_DELAY].value[0] = 0;
742*6db3dfefSJiri Kosina 
743*6db3dfefSJiri Kosina 	usbhid_submit_report(pidff->hid, pidff->reports[PID_SET_EFFECT],
744*6db3dfefSJiri Kosina 			  USB_DIR_OUT);
745*6db3dfefSJiri Kosina }
746*6db3dfefSJiri Kosina 
747*6db3dfefSJiri Kosina /*
748*6db3dfefSJiri Kosina  * pidff_set_autocenter() handler
749*6db3dfefSJiri Kosina  */
750*6db3dfefSJiri Kosina static void pidff_set_autocenter(struct input_dev *dev, u16 magnitude)
751*6db3dfefSJiri Kosina {
752*6db3dfefSJiri Kosina 	struct pidff_device *pidff = dev->ff->private;
753*6db3dfefSJiri Kosina 
754*6db3dfefSJiri Kosina 	pidff_autocenter(pidff, magnitude);
755*6db3dfefSJiri Kosina }
756*6db3dfefSJiri Kosina 
757*6db3dfefSJiri Kosina /*
758*6db3dfefSJiri Kosina  * Find fields from a report and fill a pidff_usage
759*6db3dfefSJiri Kosina  */
760*6db3dfefSJiri Kosina static int pidff_find_fields(struct pidff_usage *usage, const u8 *table,
761*6db3dfefSJiri Kosina 			     struct hid_report *report, int count, int strict)
762*6db3dfefSJiri Kosina {
763*6db3dfefSJiri Kosina 	int i, j, k, found;
764*6db3dfefSJiri Kosina 
765*6db3dfefSJiri Kosina 	for (k = 0; k < count; k++) {
766*6db3dfefSJiri Kosina 		found = 0;
767*6db3dfefSJiri Kosina 		for (i = 0; i < report->maxfield; i++) {
768*6db3dfefSJiri Kosina 			if (report->field[i]->maxusage !=
769*6db3dfefSJiri Kosina 			    report->field[i]->report_count) {
770*6db3dfefSJiri Kosina 				debug("maxusage and report_count do not match, "
771*6db3dfefSJiri Kosina 				      "skipping");
772*6db3dfefSJiri Kosina 				continue;
773*6db3dfefSJiri Kosina 			}
774*6db3dfefSJiri Kosina 			for (j = 0; j < report->field[i]->maxusage; j++) {
775*6db3dfefSJiri Kosina 				if (report->field[i]->usage[j].hid ==
776*6db3dfefSJiri Kosina 				    (HID_UP_PID | table[k])) {
777*6db3dfefSJiri Kosina 					debug("found %d at %d->%d", k, i, j);
778*6db3dfefSJiri Kosina 					usage[k].field = report->field[i];
779*6db3dfefSJiri Kosina 					usage[k].value =
780*6db3dfefSJiri Kosina 						&report->field[i]->value[j];
781*6db3dfefSJiri Kosina 					found = 1;
782*6db3dfefSJiri Kosina 					break;
783*6db3dfefSJiri Kosina 				}
784*6db3dfefSJiri Kosina 			}
785*6db3dfefSJiri Kosina 			if (found)
786*6db3dfefSJiri Kosina 				break;
787*6db3dfefSJiri Kosina 		}
788*6db3dfefSJiri Kosina 		if (!found && strict) {
789*6db3dfefSJiri Kosina 			debug("failed to locate %d", k);
790*6db3dfefSJiri Kosina 			return -1;
791*6db3dfefSJiri Kosina 		}
792*6db3dfefSJiri Kosina 	}
793*6db3dfefSJiri Kosina 	return 0;
794*6db3dfefSJiri Kosina }
795*6db3dfefSJiri Kosina 
796*6db3dfefSJiri Kosina /*
797*6db3dfefSJiri Kosina  * Return index into pidff_reports for the given usage
798*6db3dfefSJiri Kosina  */
799*6db3dfefSJiri Kosina static int pidff_check_usage(int usage)
800*6db3dfefSJiri Kosina {
801*6db3dfefSJiri Kosina 	int i;
802*6db3dfefSJiri Kosina 
803*6db3dfefSJiri Kosina 	for (i = 0; i < sizeof(pidff_reports); i++)
804*6db3dfefSJiri Kosina 		if (usage == (HID_UP_PID | pidff_reports[i]))
805*6db3dfefSJiri Kosina 			return i;
806*6db3dfefSJiri Kosina 
807*6db3dfefSJiri Kosina 	return -1;
808*6db3dfefSJiri Kosina }
809*6db3dfefSJiri Kosina 
810*6db3dfefSJiri Kosina /*
811*6db3dfefSJiri Kosina  * Find the reports and fill pidff->reports[]
812*6db3dfefSJiri Kosina  * report_type specifies either OUTPUT or FEATURE reports
813*6db3dfefSJiri Kosina  */
814*6db3dfefSJiri Kosina static void pidff_find_reports(struct hid_device *hid, int report_type,
815*6db3dfefSJiri Kosina 			       struct pidff_device *pidff)
816*6db3dfefSJiri Kosina {
817*6db3dfefSJiri Kosina 	struct hid_report *report;
818*6db3dfefSJiri Kosina 	int i, ret;
819*6db3dfefSJiri Kosina 
820*6db3dfefSJiri Kosina 	list_for_each_entry(report,
821*6db3dfefSJiri Kosina 			    &hid->report_enum[report_type].report_list, list) {
822*6db3dfefSJiri Kosina 		if (report->maxfield < 1)
823*6db3dfefSJiri Kosina 			continue;
824*6db3dfefSJiri Kosina 		ret = pidff_check_usage(report->field[0]->logical);
825*6db3dfefSJiri Kosina 		if (ret != -1) {
826*6db3dfefSJiri Kosina 			debug("found usage 0x%02x from field->logical",
827*6db3dfefSJiri Kosina 			      pidff_reports[ret]);
828*6db3dfefSJiri Kosina 			pidff->reports[ret] = report;
829*6db3dfefSJiri Kosina 			continue;
830*6db3dfefSJiri Kosina 		}
831*6db3dfefSJiri Kosina 
832*6db3dfefSJiri Kosina 		/*
833*6db3dfefSJiri Kosina 		 * Sometimes logical collections are stacked to indicate
834*6db3dfefSJiri Kosina 		 * different usages for the report and the field, in which
835*6db3dfefSJiri Kosina 		 * case we want the usage of the parent. However, Linux HID
836*6db3dfefSJiri Kosina 		 * implementation hides this fact, so we have to dig it up
837*6db3dfefSJiri Kosina 		 * ourselves
838*6db3dfefSJiri Kosina 		 */
839*6db3dfefSJiri Kosina 		i = report->field[0]->usage[0].collection_index;
840*6db3dfefSJiri Kosina 		if (i <= 0 ||
841*6db3dfefSJiri Kosina 		    hid->collection[i - 1].type != HID_COLLECTION_LOGICAL)
842*6db3dfefSJiri Kosina 			continue;
843*6db3dfefSJiri Kosina 		ret = pidff_check_usage(hid->collection[i - 1].usage);
844*6db3dfefSJiri Kosina 		if (ret != -1 && !pidff->reports[ret]) {
845*6db3dfefSJiri Kosina 			debug("found usage 0x%02x from collection array",
846*6db3dfefSJiri Kosina 			      pidff_reports[ret]);
847*6db3dfefSJiri Kosina 			pidff->reports[ret] = report;
848*6db3dfefSJiri Kosina 		}
849*6db3dfefSJiri Kosina 	}
850*6db3dfefSJiri Kosina }
851*6db3dfefSJiri Kosina 
852*6db3dfefSJiri Kosina /*
853*6db3dfefSJiri Kosina  * Test if the required reports have been found
854*6db3dfefSJiri Kosina  */
855*6db3dfefSJiri Kosina static int pidff_reports_ok(struct pidff_device *pidff)
856*6db3dfefSJiri Kosina {
857*6db3dfefSJiri Kosina 	int i;
858*6db3dfefSJiri Kosina 
859*6db3dfefSJiri Kosina 	for (i = 0; i <= PID_REQUIRED_REPORTS; i++) {
860*6db3dfefSJiri Kosina 		if (!pidff->reports[i]) {
861*6db3dfefSJiri Kosina 			debug("%d missing", i);
862*6db3dfefSJiri Kosina 			return 0;
863*6db3dfefSJiri Kosina 		}
864*6db3dfefSJiri Kosina 	}
865*6db3dfefSJiri Kosina 
866*6db3dfefSJiri Kosina 	return 1;
867*6db3dfefSJiri Kosina }
868*6db3dfefSJiri Kosina 
869*6db3dfefSJiri Kosina /*
870*6db3dfefSJiri Kosina  * Find a field with a specific usage within a report
871*6db3dfefSJiri Kosina  */
872*6db3dfefSJiri Kosina static struct hid_field *pidff_find_special_field(struct hid_report *report,
873*6db3dfefSJiri Kosina 						  int usage, int enforce_min)
874*6db3dfefSJiri Kosina {
875*6db3dfefSJiri Kosina 	int i;
876*6db3dfefSJiri Kosina 
877*6db3dfefSJiri Kosina 	for (i = 0; i < report->maxfield; i++) {
878*6db3dfefSJiri Kosina 		if (report->field[i]->logical == (HID_UP_PID | usage) &&
879*6db3dfefSJiri Kosina 		    report->field[i]->report_count > 0) {
880*6db3dfefSJiri Kosina 			if (!enforce_min ||
881*6db3dfefSJiri Kosina 			    report->field[i]->logical_minimum == 1)
882*6db3dfefSJiri Kosina 				return report->field[i];
883*6db3dfefSJiri Kosina 			else {
884*6db3dfefSJiri Kosina 				printk(KERN_ERR "hid-pidff: logical_minimum "
885*6db3dfefSJiri Kosina 					"is not 1 as it should be\n");
886*6db3dfefSJiri Kosina 				return NULL;
887*6db3dfefSJiri Kosina 			}
888*6db3dfefSJiri Kosina 		}
889*6db3dfefSJiri Kosina 	}
890*6db3dfefSJiri Kosina 	return NULL;
891*6db3dfefSJiri Kosina }
892*6db3dfefSJiri Kosina 
893*6db3dfefSJiri Kosina /*
894*6db3dfefSJiri Kosina  * Fill a pidff->*_id struct table
895*6db3dfefSJiri Kosina  */
896*6db3dfefSJiri Kosina static int pidff_find_special_keys(int *keys, struct hid_field *fld,
897*6db3dfefSJiri Kosina 				   const u8 *usagetable, int count)
898*6db3dfefSJiri Kosina {
899*6db3dfefSJiri Kosina 
900*6db3dfefSJiri Kosina 	int i, j;
901*6db3dfefSJiri Kosina 	int found = 0;
902*6db3dfefSJiri Kosina 
903*6db3dfefSJiri Kosina 	for (i = 0; i < count; i++) {
904*6db3dfefSJiri Kosina 		for (j = 0; j < fld->maxusage; j++) {
905*6db3dfefSJiri Kosina 			if (fld->usage[j].hid == (HID_UP_PID | usagetable[i])) {
906*6db3dfefSJiri Kosina 				keys[i] = j + 1;
907*6db3dfefSJiri Kosina 				found++;
908*6db3dfefSJiri Kosina 				break;
909*6db3dfefSJiri Kosina 			}
910*6db3dfefSJiri Kosina 		}
911*6db3dfefSJiri Kosina 	}
912*6db3dfefSJiri Kosina 	return found;
913*6db3dfefSJiri Kosina }
914*6db3dfefSJiri Kosina 
915*6db3dfefSJiri Kosina #define PIDFF_FIND_SPECIAL_KEYS(keys, field, name) \
916*6db3dfefSJiri Kosina 	pidff_find_special_keys(pidff->keys, pidff->field, pidff_ ## name, \
917*6db3dfefSJiri Kosina 		sizeof(pidff_ ## name))
918*6db3dfefSJiri Kosina 
919*6db3dfefSJiri Kosina /*
920*6db3dfefSJiri Kosina  * Find and check the special fields
921*6db3dfefSJiri Kosina  */
922*6db3dfefSJiri Kosina static int pidff_find_special_fields(struct pidff_device *pidff)
923*6db3dfefSJiri Kosina {
924*6db3dfefSJiri Kosina 	debug("finding special fields");
925*6db3dfefSJiri Kosina 
926*6db3dfefSJiri Kosina 	pidff->create_new_effect_type =
927*6db3dfefSJiri Kosina 		pidff_find_special_field(pidff->reports[PID_CREATE_NEW_EFFECT],
928*6db3dfefSJiri Kosina 					 0x25, 1);
929*6db3dfefSJiri Kosina 	pidff->set_effect_type =
930*6db3dfefSJiri Kosina 		pidff_find_special_field(pidff->reports[PID_SET_EFFECT],
931*6db3dfefSJiri Kosina 					 0x25, 1);
932*6db3dfefSJiri Kosina 	pidff->effect_direction =
933*6db3dfefSJiri Kosina 		pidff_find_special_field(pidff->reports[PID_SET_EFFECT],
934*6db3dfefSJiri Kosina 					 0x57, 0);
935*6db3dfefSJiri Kosina 	pidff->device_control =
936*6db3dfefSJiri Kosina 		pidff_find_special_field(pidff->reports[PID_DEVICE_CONTROL],
937*6db3dfefSJiri Kosina 					 0x96, 1);
938*6db3dfefSJiri Kosina 	pidff->block_load_status =
939*6db3dfefSJiri Kosina 		pidff_find_special_field(pidff->reports[PID_BLOCK_LOAD],
940*6db3dfefSJiri Kosina 					 0x8b, 1);
941*6db3dfefSJiri Kosina 	pidff->effect_operation_status =
942*6db3dfefSJiri Kosina 		pidff_find_special_field(pidff->reports[PID_EFFECT_OPERATION],
943*6db3dfefSJiri Kosina 					 0x78, 1);
944*6db3dfefSJiri Kosina 
945*6db3dfefSJiri Kosina 	debug("search done");
946*6db3dfefSJiri Kosina 
947*6db3dfefSJiri Kosina 	if (!pidff->create_new_effect_type || !pidff->set_effect_type) {
948*6db3dfefSJiri Kosina 		printk(KERN_ERR "hid-pidff: effect lists not found\n");
949*6db3dfefSJiri Kosina 		return -1;
950*6db3dfefSJiri Kosina 	}
951*6db3dfefSJiri Kosina 
952*6db3dfefSJiri Kosina 	if (!pidff->effect_direction) {
953*6db3dfefSJiri Kosina 		printk(KERN_ERR "hid-pidff: direction field not found\n");
954*6db3dfefSJiri Kosina 		return -1;
955*6db3dfefSJiri Kosina 	}
956*6db3dfefSJiri Kosina 
957*6db3dfefSJiri Kosina 	if (!pidff->device_control) {
958*6db3dfefSJiri Kosina 		printk(KERN_ERR "hid-pidff: device control field not found\n");
959*6db3dfefSJiri Kosina 		return -1;
960*6db3dfefSJiri Kosina 	}
961*6db3dfefSJiri Kosina 
962*6db3dfefSJiri Kosina 	if (!pidff->block_load_status) {
963*6db3dfefSJiri Kosina 		printk(KERN_ERR
964*6db3dfefSJiri Kosina 		       "hid-pidff: block load status field not found\n");
965*6db3dfefSJiri Kosina 		return -1;
966*6db3dfefSJiri Kosina 	}
967*6db3dfefSJiri Kosina 
968*6db3dfefSJiri Kosina 	if (!pidff->effect_operation_status) {
969*6db3dfefSJiri Kosina 		printk(KERN_ERR
970*6db3dfefSJiri Kosina 		       "hid-pidff: effect operation field not found\n");
971*6db3dfefSJiri Kosina 		return -1;
972*6db3dfefSJiri Kosina 	}
973*6db3dfefSJiri Kosina 
974*6db3dfefSJiri Kosina 	pidff_find_special_keys(pidff->control_id, pidff->device_control,
975*6db3dfefSJiri Kosina 				pidff_device_control,
976*6db3dfefSJiri Kosina 				sizeof(pidff_device_control));
977*6db3dfefSJiri Kosina 
978*6db3dfefSJiri Kosina 	PIDFF_FIND_SPECIAL_KEYS(control_id, device_control, device_control);
979*6db3dfefSJiri Kosina 
980*6db3dfefSJiri Kosina 	if (!PIDFF_FIND_SPECIAL_KEYS(type_id, create_new_effect_type,
981*6db3dfefSJiri Kosina 				     effect_types)) {
982*6db3dfefSJiri Kosina 		printk(KERN_ERR "hid-pidff: no effect types found\n");
983*6db3dfefSJiri Kosina 		return -1;
984*6db3dfefSJiri Kosina 	}
985*6db3dfefSJiri Kosina 
986*6db3dfefSJiri Kosina 	if (PIDFF_FIND_SPECIAL_KEYS(status_id, block_load_status,
987*6db3dfefSJiri Kosina 				    block_load_status) !=
988*6db3dfefSJiri Kosina 			sizeof(pidff_block_load_status)) {
989*6db3dfefSJiri Kosina 		printk(KERN_ERR
990*6db3dfefSJiri Kosina 		       "hidpidff: block load status identifiers not found\n");
991*6db3dfefSJiri Kosina 		return -1;
992*6db3dfefSJiri Kosina 	}
993*6db3dfefSJiri Kosina 
994*6db3dfefSJiri Kosina 	if (PIDFF_FIND_SPECIAL_KEYS(operation_id, effect_operation_status,
995*6db3dfefSJiri Kosina 				    effect_operation_status) !=
996*6db3dfefSJiri Kosina 			sizeof(pidff_effect_operation_status)) {
997*6db3dfefSJiri Kosina 		printk(KERN_ERR
998*6db3dfefSJiri Kosina 		       "hidpidff: effect operation identifiers not found\n");
999*6db3dfefSJiri Kosina 		return -1;
1000*6db3dfefSJiri Kosina 	}
1001*6db3dfefSJiri Kosina 
1002*6db3dfefSJiri Kosina 	return 0;
1003*6db3dfefSJiri Kosina }
1004*6db3dfefSJiri Kosina 
1005*6db3dfefSJiri Kosina /**
1006*6db3dfefSJiri Kosina  * Find the implemented effect types
1007*6db3dfefSJiri Kosina  */
1008*6db3dfefSJiri Kosina static int pidff_find_effects(struct pidff_device *pidff,
1009*6db3dfefSJiri Kosina 			      struct input_dev *dev)
1010*6db3dfefSJiri Kosina {
1011*6db3dfefSJiri Kosina 	int i;
1012*6db3dfefSJiri Kosina 
1013*6db3dfefSJiri Kosina 	for (i = 0; i < sizeof(pidff_effect_types); i++) {
1014*6db3dfefSJiri Kosina 		int pidff_type = pidff->type_id[i];
1015*6db3dfefSJiri Kosina 		if (pidff->set_effect_type->usage[pidff_type].hid !=
1016*6db3dfefSJiri Kosina 		    pidff->create_new_effect_type->usage[pidff_type].hid) {
1017*6db3dfefSJiri Kosina 			printk(KERN_ERR "hid-pidff: "
1018*6db3dfefSJiri Kosina 			       "effect type number %d is invalid\n", i);
1019*6db3dfefSJiri Kosina 			return -1;
1020*6db3dfefSJiri Kosina 		}
1021*6db3dfefSJiri Kosina 	}
1022*6db3dfefSJiri Kosina 
1023*6db3dfefSJiri Kosina 	if (pidff->type_id[PID_CONSTANT])
1024*6db3dfefSJiri Kosina 		set_bit(FF_CONSTANT, dev->ffbit);
1025*6db3dfefSJiri Kosina 	if (pidff->type_id[PID_RAMP])
1026*6db3dfefSJiri Kosina 		set_bit(FF_RAMP, dev->ffbit);
1027*6db3dfefSJiri Kosina 	if (pidff->type_id[PID_SQUARE]) {
1028*6db3dfefSJiri Kosina 		set_bit(FF_SQUARE, dev->ffbit);
1029*6db3dfefSJiri Kosina 		set_bit(FF_PERIODIC, dev->ffbit);
1030*6db3dfefSJiri Kosina 	}
1031*6db3dfefSJiri Kosina 	if (pidff->type_id[PID_SINE]) {
1032*6db3dfefSJiri Kosina 		set_bit(FF_SINE, dev->ffbit);
1033*6db3dfefSJiri Kosina 		set_bit(FF_PERIODIC, dev->ffbit);
1034*6db3dfefSJiri Kosina 	}
1035*6db3dfefSJiri Kosina 	if (pidff->type_id[PID_TRIANGLE]) {
1036*6db3dfefSJiri Kosina 		set_bit(FF_TRIANGLE, dev->ffbit);
1037*6db3dfefSJiri Kosina 		set_bit(FF_PERIODIC, dev->ffbit);
1038*6db3dfefSJiri Kosina 	}
1039*6db3dfefSJiri Kosina 	if (pidff->type_id[PID_SAW_UP]) {
1040*6db3dfefSJiri Kosina 		set_bit(FF_SAW_UP, dev->ffbit);
1041*6db3dfefSJiri Kosina 		set_bit(FF_PERIODIC, dev->ffbit);
1042*6db3dfefSJiri Kosina 	}
1043*6db3dfefSJiri Kosina 	if (pidff->type_id[PID_SAW_DOWN]) {
1044*6db3dfefSJiri Kosina 		set_bit(FF_SAW_DOWN, dev->ffbit);
1045*6db3dfefSJiri Kosina 		set_bit(FF_PERIODIC, dev->ffbit);
1046*6db3dfefSJiri Kosina 	}
1047*6db3dfefSJiri Kosina 	if (pidff->type_id[PID_SPRING])
1048*6db3dfefSJiri Kosina 		set_bit(FF_SPRING, dev->ffbit);
1049*6db3dfefSJiri Kosina 	if (pidff->type_id[PID_DAMPER])
1050*6db3dfefSJiri Kosina 		set_bit(FF_DAMPER, dev->ffbit);
1051*6db3dfefSJiri Kosina 	if (pidff->type_id[PID_INERTIA])
1052*6db3dfefSJiri Kosina 		set_bit(FF_INERTIA, dev->ffbit);
1053*6db3dfefSJiri Kosina 	if (pidff->type_id[PID_FRICTION])
1054*6db3dfefSJiri Kosina 		set_bit(FF_FRICTION, dev->ffbit);
1055*6db3dfefSJiri Kosina 
1056*6db3dfefSJiri Kosina 	return 0;
1057*6db3dfefSJiri Kosina 
1058*6db3dfefSJiri Kosina }
1059*6db3dfefSJiri Kosina 
1060*6db3dfefSJiri Kosina #define PIDFF_FIND_FIELDS(name, report, strict) \
1061*6db3dfefSJiri Kosina 	pidff_find_fields(pidff->name, pidff_ ## name, \
1062*6db3dfefSJiri Kosina 		pidff->reports[report], \
1063*6db3dfefSJiri Kosina 		sizeof(pidff_ ## name), strict)
1064*6db3dfefSJiri Kosina 
1065*6db3dfefSJiri Kosina /*
1066*6db3dfefSJiri Kosina  * Fill and check the pidff_usages
1067*6db3dfefSJiri Kosina  */
1068*6db3dfefSJiri Kosina static int pidff_init_fields(struct pidff_device *pidff, struct input_dev *dev)
1069*6db3dfefSJiri Kosina {
1070*6db3dfefSJiri Kosina 	int envelope_ok = 0;
1071*6db3dfefSJiri Kosina 
1072*6db3dfefSJiri Kosina 	if (PIDFF_FIND_FIELDS(set_effect, PID_SET_EFFECT, 1)) {
1073*6db3dfefSJiri Kosina 		printk(KERN_ERR
1074*6db3dfefSJiri Kosina 		       "hid-pidff: unknown set_effect report layout\n");
1075*6db3dfefSJiri Kosina 		return -ENODEV;
1076*6db3dfefSJiri Kosina 	}
1077*6db3dfefSJiri Kosina 
1078*6db3dfefSJiri Kosina 	PIDFF_FIND_FIELDS(block_load, PID_BLOCK_LOAD, 0);
1079*6db3dfefSJiri Kosina 	if (!pidff->block_load[PID_EFFECT_BLOCK_INDEX].value) {
1080*6db3dfefSJiri Kosina 		printk(KERN_ERR
1081*6db3dfefSJiri Kosina 		       "hid-pidff: unknown pid_block_load report layout\n");
1082*6db3dfefSJiri Kosina 		return -ENODEV;
1083*6db3dfefSJiri Kosina 	}
1084*6db3dfefSJiri Kosina 
1085*6db3dfefSJiri Kosina 	if (PIDFF_FIND_FIELDS(effect_operation, PID_EFFECT_OPERATION, 1)) {
1086*6db3dfefSJiri Kosina 		printk(KERN_ERR
1087*6db3dfefSJiri Kosina 		       "hid-pidff: unknown effect_operation report layout\n");
1088*6db3dfefSJiri Kosina 		return -ENODEV;
1089*6db3dfefSJiri Kosina 	}
1090*6db3dfefSJiri Kosina 
1091*6db3dfefSJiri Kosina 	if (PIDFF_FIND_FIELDS(block_free, PID_BLOCK_FREE, 1)) {
1092*6db3dfefSJiri Kosina 		printk(KERN_ERR
1093*6db3dfefSJiri Kosina 		       "hid-pidff: unknown pid_block_free report layout\n");
1094*6db3dfefSJiri Kosina 		return -ENODEV;
1095*6db3dfefSJiri Kosina 	}
1096*6db3dfefSJiri Kosina 
1097*6db3dfefSJiri Kosina 	if (!PIDFF_FIND_FIELDS(set_envelope, PID_SET_ENVELOPE, 1))
1098*6db3dfefSJiri Kosina 		envelope_ok = 1;
1099*6db3dfefSJiri Kosina 
1100*6db3dfefSJiri Kosina 	if (pidff_find_special_fields(pidff) || pidff_find_effects(pidff, dev))
1101*6db3dfefSJiri Kosina 		return -ENODEV;
1102*6db3dfefSJiri Kosina 
1103*6db3dfefSJiri Kosina 	if (!envelope_ok) {
1104*6db3dfefSJiri Kosina 		if (test_and_clear_bit(FF_CONSTANT, dev->ffbit))
1105*6db3dfefSJiri Kosina 			printk(KERN_WARNING "hid-pidff: "
1106*6db3dfefSJiri Kosina 			       "has constant effect but no envelope\n");
1107*6db3dfefSJiri Kosina 		if (test_and_clear_bit(FF_RAMP, dev->ffbit))
1108*6db3dfefSJiri Kosina 			printk(KERN_WARNING "hid-pidff: "
1109*6db3dfefSJiri Kosina 				"has ramp effect but no envelope\n");
1110*6db3dfefSJiri Kosina 
1111*6db3dfefSJiri Kosina 		if (test_and_clear_bit(FF_PERIODIC, dev->ffbit))
1112*6db3dfefSJiri Kosina 			printk(KERN_WARNING "hid-pidff: "
1113*6db3dfefSJiri Kosina 				"has periodic effect but no envelope\n");
1114*6db3dfefSJiri Kosina 	}
1115*6db3dfefSJiri Kosina 
1116*6db3dfefSJiri Kosina 	if (test_bit(FF_CONSTANT, dev->ffbit) &&
1117*6db3dfefSJiri Kosina 	    PIDFF_FIND_FIELDS(set_constant, PID_SET_CONSTANT, 1)) {
1118*6db3dfefSJiri Kosina 		printk(KERN_WARNING
1119*6db3dfefSJiri Kosina 		       "hid-pidff: unknown constant effect layout\n");
1120*6db3dfefSJiri Kosina 		clear_bit(FF_CONSTANT, dev->ffbit);
1121*6db3dfefSJiri Kosina 	}
1122*6db3dfefSJiri Kosina 
1123*6db3dfefSJiri Kosina 	if (test_bit(FF_RAMP, dev->ffbit) &&
1124*6db3dfefSJiri Kosina 	    PIDFF_FIND_FIELDS(set_ramp, PID_SET_RAMP, 1)) {
1125*6db3dfefSJiri Kosina 		printk(KERN_WARNING "hid-pidff: unknown ramp effect layout\n");
1126*6db3dfefSJiri Kosina 		clear_bit(FF_RAMP, dev->ffbit);
1127*6db3dfefSJiri Kosina 	}
1128*6db3dfefSJiri Kosina 
1129*6db3dfefSJiri Kosina 	if ((test_bit(FF_SPRING, dev->ffbit) ||
1130*6db3dfefSJiri Kosina 	     test_bit(FF_DAMPER, dev->ffbit) ||
1131*6db3dfefSJiri Kosina 	     test_bit(FF_FRICTION, dev->ffbit) ||
1132*6db3dfefSJiri Kosina 	     test_bit(FF_INERTIA, dev->ffbit)) &&
1133*6db3dfefSJiri Kosina 	    PIDFF_FIND_FIELDS(set_condition, PID_SET_CONDITION, 1)) {
1134*6db3dfefSJiri Kosina 		printk(KERN_WARNING
1135*6db3dfefSJiri Kosina 		       "hid-pidff: unknown condition effect layout\n");
1136*6db3dfefSJiri Kosina 		clear_bit(FF_SPRING, dev->ffbit);
1137*6db3dfefSJiri Kosina 		clear_bit(FF_DAMPER, dev->ffbit);
1138*6db3dfefSJiri Kosina 		clear_bit(FF_FRICTION, dev->ffbit);
1139*6db3dfefSJiri Kosina 		clear_bit(FF_INERTIA, dev->ffbit);
1140*6db3dfefSJiri Kosina 	}
1141*6db3dfefSJiri Kosina 
1142*6db3dfefSJiri Kosina 	if (test_bit(FF_PERIODIC, dev->ffbit) &&
1143*6db3dfefSJiri Kosina 	    PIDFF_FIND_FIELDS(set_periodic, PID_SET_PERIODIC, 1)) {
1144*6db3dfefSJiri Kosina 		printk(KERN_WARNING
1145*6db3dfefSJiri Kosina 		       "hid-pidff: unknown periodic effect layout\n");
1146*6db3dfefSJiri Kosina 		clear_bit(FF_PERIODIC, dev->ffbit);
1147*6db3dfefSJiri Kosina 	}
1148*6db3dfefSJiri Kosina 
1149*6db3dfefSJiri Kosina 	PIDFF_FIND_FIELDS(pool, PID_POOL, 0);
1150*6db3dfefSJiri Kosina 
1151*6db3dfefSJiri Kosina 	if (!PIDFF_FIND_FIELDS(device_gain, PID_DEVICE_GAIN, 1))
1152*6db3dfefSJiri Kosina 		set_bit(FF_GAIN, dev->ffbit);
1153*6db3dfefSJiri Kosina 
1154*6db3dfefSJiri Kosina 	return 0;
1155*6db3dfefSJiri Kosina }
1156*6db3dfefSJiri Kosina 
1157*6db3dfefSJiri Kosina /*
1158*6db3dfefSJiri Kosina  * Reset the device
1159*6db3dfefSJiri Kosina  */
1160*6db3dfefSJiri Kosina static void pidff_reset(struct pidff_device *pidff)
1161*6db3dfefSJiri Kosina {
1162*6db3dfefSJiri Kosina 	struct hid_device *hid = pidff->hid;
1163*6db3dfefSJiri Kosina 	int i = 0;
1164*6db3dfefSJiri Kosina 
1165*6db3dfefSJiri Kosina 	pidff->device_control->value[0] = pidff->control_id[PID_RESET];
1166*6db3dfefSJiri Kosina 	/* We reset twice as sometimes hid_wait_io isn't waiting long enough */
1167*6db3dfefSJiri Kosina 	usbhid_submit_report(hid, pidff->reports[PID_DEVICE_CONTROL], USB_DIR_OUT);
1168*6db3dfefSJiri Kosina 	usbhid_wait_io(hid);
1169*6db3dfefSJiri Kosina 	usbhid_submit_report(hid, pidff->reports[PID_DEVICE_CONTROL], USB_DIR_OUT);
1170*6db3dfefSJiri Kosina 	usbhid_wait_io(hid);
1171*6db3dfefSJiri Kosina 
1172*6db3dfefSJiri Kosina 	pidff->device_control->value[0] =
1173*6db3dfefSJiri Kosina 		pidff->control_id[PID_ENABLE_ACTUATORS];
1174*6db3dfefSJiri Kosina 	usbhid_submit_report(hid, pidff->reports[PID_DEVICE_CONTROL], USB_DIR_OUT);
1175*6db3dfefSJiri Kosina 	usbhid_wait_io(hid);
1176*6db3dfefSJiri Kosina 
1177*6db3dfefSJiri Kosina 	/* pool report is sometimes messed up, refetch it */
1178*6db3dfefSJiri Kosina 	usbhid_submit_report(hid, pidff->reports[PID_POOL], USB_DIR_IN);
1179*6db3dfefSJiri Kosina 	usbhid_wait_io(hid);
1180*6db3dfefSJiri Kosina 
1181*6db3dfefSJiri Kosina 	if (pidff->pool[PID_SIMULTANEOUS_MAX].value) {
1182*6db3dfefSJiri Kosina 		int sim_effects = pidff->pool[PID_SIMULTANEOUS_MAX].value[0];
1183*6db3dfefSJiri Kosina 		while (sim_effects < 2) {
1184*6db3dfefSJiri Kosina 			if (i++ > 20) {
1185*6db3dfefSJiri Kosina 				printk(KERN_WARNING "hid-pidff: device reports "
1186*6db3dfefSJiri Kosina 				       "%d simultaneous effects\n",
1187*6db3dfefSJiri Kosina 				       sim_effects);
1188*6db3dfefSJiri Kosina 				break;
1189*6db3dfefSJiri Kosina 			}
1190*6db3dfefSJiri Kosina 			debug("pid_pool requested again");
1191*6db3dfefSJiri Kosina 			usbhid_submit_report(hid, pidff->reports[PID_POOL],
1192*6db3dfefSJiri Kosina 					  USB_DIR_IN);
1193*6db3dfefSJiri Kosina 			usbhid_wait_io(hid);
1194*6db3dfefSJiri Kosina 		}
1195*6db3dfefSJiri Kosina 	}
1196*6db3dfefSJiri Kosina }
1197*6db3dfefSJiri Kosina 
1198*6db3dfefSJiri Kosina /*
1199*6db3dfefSJiri Kosina  * Test if autocenter modification is using the supported method
1200*6db3dfefSJiri Kosina  */
1201*6db3dfefSJiri Kosina static int pidff_check_autocenter(struct pidff_device *pidff,
1202*6db3dfefSJiri Kosina 				  struct input_dev *dev)
1203*6db3dfefSJiri Kosina {
1204*6db3dfefSJiri Kosina 	int error;
1205*6db3dfefSJiri Kosina 
1206*6db3dfefSJiri Kosina 	/*
1207*6db3dfefSJiri Kosina 	 * Let's find out if autocenter modification is supported
1208*6db3dfefSJiri Kosina 	 * Specification doesn't specify anything, so we request an
1209*6db3dfefSJiri Kosina 	 * effect upload and cancel it immediately. If the approved
1210*6db3dfefSJiri Kosina 	 * effect id was one above the minimum, then we assume the first
1211*6db3dfefSJiri Kosina 	 * effect id is a built-in spring type effect used for autocenter
1212*6db3dfefSJiri Kosina 	 */
1213*6db3dfefSJiri Kosina 
1214*6db3dfefSJiri Kosina 	error = pidff_request_effect_upload(pidff, 1);
1215*6db3dfefSJiri Kosina 	if (error) {
1216*6db3dfefSJiri Kosina 		printk(KERN_ERR "hid-pidff: upload request failed\n");
1217*6db3dfefSJiri Kosina 		return error;
1218*6db3dfefSJiri Kosina 	}
1219*6db3dfefSJiri Kosina 
1220*6db3dfefSJiri Kosina 	if (pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0] ==
1221*6db3dfefSJiri Kosina 	    pidff->block_load[PID_EFFECT_BLOCK_INDEX].field->logical_minimum + 1) {
1222*6db3dfefSJiri Kosina 		pidff_autocenter(pidff, 0xffff);
1223*6db3dfefSJiri Kosina 		set_bit(FF_AUTOCENTER, dev->ffbit);
1224*6db3dfefSJiri Kosina 	} else {
1225*6db3dfefSJiri Kosina 		printk(KERN_NOTICE "hid-pidff: "
1226*6db3dfefSJiri Kosina 		       "device has unknown autocenter control method\n");
1227*6db3dfefSJiri Kosina 	}
1228*6db3dfefSJiri Kosina 
1229*6db3dfefSJiri Kosina 	pidff_erase_pid(pidff,
1230*6db3dfefSJiri Kosina 			pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0]);
1231*6db3dfefSJiri Kosina 
1232*6db3dfefSJiri Kosina 	return 0;
1233*6db3dfefSJiri Kosina 
1234*6db3dfefSJiri Kosina }
1235*6db3dfefSJiri Kosina 
1236*6db3dfefSJiri Kosina /*
1237*6db3dfefSJiri Kosina  * Check if the device is PID and initialize it
1238*6db3dfefSJiri Kosina  */
1239*6db3dfefSJiri Kosina int hid_pidff_init(struct hid_device *hid)
1240*6db3dfefSJiri Kosina {
1241*6db3dfefSJiri Kosina 	struct pidff_device *pidff;
1242*6db3dfefSJiri Kosina 	struct hid_input *hidinput = list_entry(hid->inputs.next,
1243*6db3dfefSJiri Kosina 						struct hid_input, list);
1244*6db3dfefSJiri Kosina 	struct input_dev *dev = hidinput->input;
1245*6db3dfefSJiri Kosina 	struct ff_device *ff;
1246*6db3dfefSJiri Kosina 	int max_effects;
1247*6db3dfefSJiri Kosina 	int error;
1248*6db3dfefSJiri Kosina 
1249*6db3dfefSJiri Kosina 	debug("starting pid init");
1250*6db3dfefSJiri Kosina 
1251*6db3dfefSJiri Kosina 	if (list_empty(&hid->report_enum[HID_OUTPUT_REPORT].report_list)) {
1252*6db3dfefSJiri Kosina 		debug("not a PID device, no output report");
1253*6db3dfefSJiri Kosina 		return -ENODEV;
1254*6db3dfefSJiri Kosina 	}
1255*6db3dfefSJiri Kosina 
1256*6db3dfefSJiri Kosina 	pidff = kzalloc(sizeof(*pidff), GFP_KERNEL);
1257*6db3dfefSJiri Kosina 	if (!pidff)
1258*6db3dfefSJiri Kosina 		return -ENOMEM;
1259*6db3dfefSJiri Kosina 
1260*6db3dfefSJiri Kosina 	pidff->hid = hid;
1261*6db3dfefSJiri Kosina 
1262*6db3dfefSJiri Kosina 	pidff_find_reports(hid, HID_OUTPUT_REPORT, pidff);
1263*6db3dfefSJiri Kosina 	pidff_find_reports(hid, HID_FEATURE_REPORT, pidff);
1264*6db3dfefSJiri Kosina 
1265*6db3dfefSJiri Kosina 	if (!pidff_reports_ok(pidff)) {
1266*6db3dfefSJiri Kosina 		debug("reports not ok, aborting");
1267*6db3dfefSJiri Kosina 		error = -ENODEV;
1268*6db3dfefSJiri Kosina 		goto fail;
1269*6db3dfefSJiri Kosina 	}
1270*6db3dfefSJiri Kosina 
1271*6db3dfefSJiri Kosina 	error = pidff_init_fields(pidff, dev);
1272*6db3dfefSJiri Kosina 	if (error)
1273*6db3dfefSJiri Kosina 		goto fail;
1274*6db3dfefSJiri Kosina 
1275*6db3dfefSJiri Kosina 	pidff_reset(pidff);
1276*6db3dfefSJiri Kosina 
1277*6db3dfefSJiri Kosina 	if (test_bit(FF_GAIN, dev->ffbit)) {
1278*6db3dfefSJiri Kosina 		pidff_set(&pidff->device_gain[PID_DEVICE_GAIN_FIELD], 0xffff);
1279*6db3dfefSJiri Kosina 		usbhid_submit_report(pidff->hid, pidff->reports[PID_DEVICE_GAIN],
1280*6db3dfefSJiri Kosina 				  USB_DIR_OUT);
1281*6db3dfefSJiri Kosina 	}
1282*6db3dfefSJiri Kosina 
1283*6db3dfefSJiri Kosina 	error = pidff_check_autocenter(pidff, dev);
1284*6db3dfefSJiri Kosina 	if (error)
1285*6db3dfefSJiri Kosina 		goto fail;
1286*6db3dfefSJiri Kosina 
1287*6db3dfefSJiri Kosina 	max_effects =
1288*6db3dfefSJiri Kosina 	    pidff->block_load[PID_EFFECT_BLOCK_INDEX].field->logical_maximum -
1289*6db3dfefSJiri Kosina 	    pidff->block_load[PID_EFFECT_BLOCK_INDEX].field->logical_minimum +
1290*6db3dfefSJiri Kosina 	    1;
1291*6db3dfefSJiri Kosina 	debug("max effects is %d", max_effects);
1292*6db3dfefSJiri Kosina 
1293*6db3dfefSJiri Kosina 	if (max_effects > PID_EFFECTS_MAX)
1294*6db3dfefSJiri Kosina 		max_effects = PID_EFFECTS_MAX;
1295*6db3dfefSJiri Kosina 
1296*6db3dfefSJiri Kosina 	if (pidff->pool[PID_SIMULTANEOUS_MAX].value)
1297*6db3dfefSJiri Kosina 		debug("max simultaneous effects is %d",
1298*6db3dfefSJiri Kosina 		      pidff->pool[PID_SIMULTANEOUS_MAX].value[0]);
1299*6db3dfefSJiri Kosina 
1300*6db3dfefSJiri Kosina 	if (pidff->pool[PID_RAM_POOL_SIZE].value)
1301*6db3dfefSJiri Kosina 		debug("device memory size is %d bytes",
1302*6db3dfefSJiri Kosina 		      pidff->pool[PID_RAM_POOL_SIZE].value[0]);
1303*6db3dfefSJiri Kosina 
1304*6db3dfefSJiri Kosina 	if (pidff->pool[PID_DEVICE_MANAGED_POOL].value &&
1305*6db3dfefSJiri Kosina 	    pidff->pool[PID_DEVICE_MANAGED_POOL].value[0] == 0) {
1306*6db3dfefSJiri Kosina 		printk(KERN_NOTICE "hid-pidff: "
1307*6db3dfefSJiri Kosina 		       "device does not support device managed pool\n");
1308*6db3dfefSJiri Kosina 		goto fail;
1309*6db3dfefSJiri Kosina 	}
1310*6db3dfefSJiri Kosina 
1311*6db3dfefSJiri Kosina 	error = input_ff_create(dev, max_effects);
1312*6db3dfefSJiri Kosina 	if (error)
1313*6db3dfefSJiri Kosina 		goto fail;
1314*6db3dfefSJiri Kosina 
1315*6db3dfefSJiri Kosina 	ff = dev->ff;
1316*6db3dfefSJiri Kosina 	ff->private = pidff;
1317*6db3dfefSJiri Kosina 	ff->upload = pidff_upload_effect;
1318*6db3dfefSJiri Kosina 	ff->erase = pidff_erase_effect;
1319*6db3dfefSJiri Kosina 	ff->set_gain = pidff_set_gain;
1320*6db3dfefSJiri Kosina 	ff->set_autocenter = pidff_set_autocenter;
1321*6db3dfefSJiri Kosina 	ff->playback = pidff_playback;
1322*6db3dfefSJiri Kosina 
1323*6db3dfefSJiri Kosina 	printk(KERN_INFO "Force feedback for USB HID PID devices by "
1324*6db3dfefSJiri Kosina 	       "Anssi Hannula <anssi.hannula@gmail.com>\n");
1325*6db3dfefSJiri Kosina 
1326*6db3dfefSJiri Kosina 	return 0;
1327*6db3dfefSJiri Kosina 
1328*6db3dfefSJiri Kosina  fail:
1329*6db3dfefSJiri Kosina 	kfree(pidff);
1330*6db3dfefSJiri Kosina 	return error;
1331*6db3dfefSJiri Kosina }
1332