xref: /OK3568_Linux_fs/kernel/drivers/input/ff-memless.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  Force feedback support for memoryless devices
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *  Copyright (c) 2006 Anssi Hannula <anssi.hannula@gmail.com>
6*4882a593Smuzhiyun  *  Copyright (c) 2006 Dmitry Torokhov <dtor@mail.ru>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun /*
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /* #define DEBUG */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include <linux/slab.h>
17*4882a593Smuzhiyun #include <linux/input.h>
18*4882a593Smuzhiyun #include <linux/module.h>
19*4882a593Smuzhiyun #include <linux/mutex.h>
20*4882a593Smuzhiyun #include <linux/spinlock.h>
21*4882a593Smuzhiyun #include <linux/jiffies.h>
22*4882a593Smuzhiyun #include <linux/fixp-arith.h>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun MODULE_LICENSE("GPL");
25*4882a593Smuzhiyun MODULE_AUTHOR("Anssi Hannula <anssi.hannula@gmail.com>");
26*4882a593Smuzhiyun MODULE_DESCRIPTION("Force feedback support for memoryless devices");
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /* Number of effects handled with memoryless devices */
29*4882a593Smuzhiyun #define FF_MEMLESS_EFFECTS	16
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun /* Envelope update interval in ms */
32*4882a593Smuzhiyun #define FF_ENVELOPE_INTERVAL	50
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define FF_EFFECT_STARTED	0
35*4882a593Smuzhiyun #define FF_EFFECT_PLAYING	1
36*4882a593Smuzhiyun #define FF_EFFECT_ABORTING	2
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun struct ml_effect_state {
39*4882a593Smuzhiyun 	struct ff_effect *effect;
40*4882a593Smuzhiyun 	unsigned long flags;	/* effect state (STARTED, PLAYING, etc) */
41*4882a593Smuzhiyun 	int count;		/* loop count of the effect */
42*4882a593Smuzhiyun 	unsigned long play_at;	/* start time */
43*4882a593Smuzhiyun 	unsigned long stop_at;	/* stop time */
44*4882a593Smuzhiyun 	unsigned long adj_at;	/* last time the effect was sent */
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun struct ml_device {
48*4882a593Smuzhiyun 	void *private;
49*4882a593Smuzhiyun 	struct ml_effect_state states[FF_MEMLESS_EFFECTS];
50*4882a593Smuzhiyun 	int gain;
51*4882a593Smuzhiyun 	struct timer_list timer;
52*4882a593Smuzhiyun 	struct input_dev *dev;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	int (*play_effect)(struct input_dev *dev, void *data,
55*4882a593Smuzhiyun 			   struct ff_effect *effect);
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun 
get_envelope(const struct ff_effect * effect)58*4882a593Smuzhiyun static const struct ff_envelope *get_envelope(const struct ff_effect *effect)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	static const struct ff_envelope empty_envelope;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	switch (effect->type) {
63*4882a593Smuzhiyun 	case FF_PERIODIC:
64*4882a593Smuzhiyun 		return &effect->u.periodic.envelope;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	case FF_CONSTANT:
67*4882a593Smuzhiyun 		return &effect->u.constant.envelope;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	default:
70*4882a593Smuzhiyun 		return &empty_envelope;
71*4882a593Smuzhiyun 	}
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /*
75*4882a593Smuzhiyun  * Check for the next time envelope requires an update on memoryless devices
76*4882a593Smuzhiyun  */
calculate_next_time(struct ml_effect_state * state)77*4882a593Smuzhiyun static unsigned long calculate_next_time(struct ml_effect_state *state)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun 	const struct ff_envelope *envelope = get_envelope(state->effect);
80*4882a593Smuzhiyun 	unsigned long attack_stop, fade_start, next_fade;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	if (envelope->attack_length) {
83*4882a593Smuzhiyun 		attack_stop = state->play_at +
84*4882a593Smuzhiyun 			msecs_to_jiffies(envelope->attack_length);
85*4882a593Smuzhiyun 		if (time_before(state->adj_at, attack_stop))
86*4882a593Smuzhiyun 			return state->adj_at +
87*4882a593Smuzhiyun 					msecs_to_jiffies(FF_ENVELOPE_INTERVAL);
88*4882a593Smuzhiyun 	}
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	if (state->effect->replay.length) {
91*4882a593Smuzhiyun 		if (envelope->fade_length) {
92*4882a593Smuzhiyun 			/* check when fading should start */
93*4882a593Smuzhiyun 			fade_start = state->stop_at -
94*4882a593Smuzhiyun 					msecs_to_jiffies(envelope->fade_length);
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 			if (time_before(state->adj_at, fade_start))
97*4882a593Smuzhiyun 				return fade_start;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 			/* already fading, advance to next checkpoint */
100*4882a593Smuzhiyun 			next_fade = state->adj_at +
101*4882a593Smuzhiyun 					msecs_to_jiffies(FF_ENVELOPE_INTERVAL);
102*4882a593Smuzhiyun 			if (time_before(next_fade, state->stop_at))
103*4882a593Smuzhiyun 				return next_fade;
104*4882a593Smuzhiyun 		}
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 		return state->stop_at;
107*4882a593Smuzhiyun 	}
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	return state->play_at;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun 
ml_schedule_timer(struct ml_device * ml)112*4882a593Smuzhiyun static void ml_schedule_timer(struct ml_device *ml)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun 	struct ml_effect_state *state;
115*4882a593Smuzhiyun 	unsigned long now = jiffies;
116*4882a593Smuzhiyun 	unsigned long earliest = 0;
117*4882a593Smuzhiyun 	unsigned long next_at;
118*4882a593Smuzhiyun 	int events = 0;
119*4882a593Smuzhiyun 	int i;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	pr_debug("calculating next timer\n");
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	for (i = 0; i < FF_MEMLESS_EFFECTS; i++) {
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 		state = &ml->states[i];
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 		if (!test_bit(FF_EFFECT_STARTED, &state->flags))
128*4882a593Smuzhiyun 			continue;
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 		if (test_bit(FF_EFFECT_PLAYING, &state->flags))
131*4882a593Smuzhiyun 			next_at = calculate_next_time(state);
132*4882a593Smuzhiyun 		else
133*4882a593Smuzhiyun 			next_at = state->play_at;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 		if (time_before_eq(now, next_at) &&
136*4882a593Smuzhiyun 		    (++events == 1 || time_before(next_at, earliest)))
137*4882a593Smuzhiyun 			earliest = next_at;
138*4882a593Smuzhiyun 	}
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	if (!events) {
141*4882a593Smuzhiyun 		pr_debug("no actions\n");
142*4882a593Smuzhiyun 		del_timer(&ml->timer);
143*4882a593Smuzhiyun 	} else {
144*4882a593Smuzhiyun 		pr_debug("timer set\n");
145*4882a593Smuzhiyun 		mod_timer(&ml->timer, earliest);
146*4882a593Smuzhiyun 	}
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /*
150*4882a593Smuzhiyun  * Apply an envelope to a value
151*4882a593Smuzhiyun  */
apply_envelope(struct ml_effect_state * state,int value,struct ff_envelope * envelope)152*4882a593Smuzhiyun static int apply_envelope(struct ml_effect_state *state, int value,
153*4882a593Smuzhiyun 			  struct ff_envelope *envelope)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun 	struct ff_effect *effect = state->effect;
156*4882a593Smuzhiyun 	unsigned long now = jiffies;
157*4882a593Smuzhiyun 	int time_from_level;
158*4882a593Smuzhiyun 	int time_of_envelope;
159*4882a593Smuzhiyun 	int envelope_level;
160*4882a593Smuzhiyun 	int difference;
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	if (envelope->attack_length &&
163*4882a593Smuzhiyun 	    time_before(now,
164*4882a593Smuzhiyun 			state->play_at + msecs_to_jiffies(envelope->attack_length))) {
165*4882a593Smuzhiyun 		pr_debug("value = 0x%x, attack_level = 0x%x\n",
166*4882a593Smuzhiyun 			 value, envelope->attack_level);
167*4882a593Smuzhiyun 		time_from_level = jiffies_to_msecs(now - state->play_at);
168*4882a593Smuzhiyun 		time_of_envelope = envelope->attack_length;
169*4882a593Smuzhiyun 		envelope_level = min_t(u16, envelope->attack_level, 0x7fff);
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	} else if (envelope->fade_length && effect->replay.length &&
172*4882a593Smuzhiyun 		   time_after(now,
173*4882a593Smuzhiyun 			      state->stop_at - msecs_to_jiffies(envelope->fade_length)) &&
174*4882a593Smuzhiyun 		   time_before(now, state->stop_at)) {
175*4882a593Smuzhiyun 		time_from_level = jiffies_to_msecs(state->stop_at - now);
176*4882a593Smuzhiyun 		time_of_envelope = envelope->fade_length;
177*4882a593Smuzhiyun 		envelope_level = min_t(u16, envelope->fade_level, 0x7fff);
178*4882a593Smuzhiyun 	} else
179*4882a593Smuzhiyun 		return value;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	difference = abs(value) - envelope_level;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	pr_debug("difference = %d\n", difference);
184*4882a593Smuzhiyun 	pr_debug("time_from_level = 0x%x\n", time_from_level);
185*4882a593Smuzhiyun 	pr_debug("time_of_envelope = 0x%x\n", time_of_envelope);
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	difference = difference * time_from_level / time_of_envelope;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	pr_debug("difference = %d\n", difference);
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	return value < 0 ?
192*4882a593Smuzhiyun 		-(difference + envelope_level) : (difference + envelope_level);
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun /*
196*4882a593Smuzhiyun  * Return the type the effect has to be converted into (memless devices)
197*4882a593Smuzhiyun  */
get_compatible_type(struct ff_device * ff,int effect_type)198*4882a593Smuzhiyun static int get_compatible_type(struct ff_device *ff, int effect_type)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	if (test_bit(effect_type, ff->ffbit))
202*4882a593Smuzhiyun 		return effect_type;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	if (effect_type == FF_PERIODIC && test_bit(FF_RUMBLE, ff->ffbit))
205*4882a593Smuzhiyun 		return FF_RUMBLE;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	pr_err("invalid type in get_compatible_type()\n");
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	return 0;
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun /*
213*4882a593Smuzhiyun  * Only left/right direction should be used (under/over 0x8000) for
214*4882a593Smuzhiyun  * forward/reverse motor direction (to keep calculation fast & simple).
215*4882a593Smuzhiyun  */
ml_calculate_direction(u16 direction,u16 force,u16 new_direction,u16 new_force)216*4882a593Smuzhiyun static u16 ml_calculate_direction(u16 direction, u16 force,
217*4882a593Smuzhiyun 				  u16 new_direction, u16 new_force)
218*4882a593Smuzhiyun {
219*4882a593Smuzhiyun 	if (!force)
220*4882a593Smuzhiyun 		return new_direction;
221*4882a593Smuzhiyun 	if (!new_force)
222*4882a593Smuzhiyun 		return direction;
223*4882a593Smuzhiyun 	return (((u32)(direction >> 1) * force +
224*4882a593Smuzhiyun 		 (new_direction >> 1) * new_force) /
225*4882a593Smuzhiyun 		(force + new_force)) << 1;
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun #define FRAC_N 8
fixp_new16(s16 a)229*4882a593Smuzhiyun static inline s16 fixp_new16(s16 a)
230*4882a593Smuzhiyun {
231*4882a593Smuzhiyun 	return ((s32)a) >> (16 - FRAC_N);
232*4882a593Smuzhiyun }
233*4882a593Smuzhiyun 
fixp_mult(s16 a,s16 b)234*4882a593Smuzhiyun static inline s16 fixp_mult(s16 a, s16 b)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun 	a = ((s32)a * 0x100) / 0x7fff;
237*4882a593Smuzhiyun 	return ((s32)(a * b)) >> FRAC_N;
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun /*
241*4882a593Smuzhiyun  * Combine two effects and apply gain.
242*4882a593Smuzhiyun  */
ml_combine_effects(struct ff_effect * effect,struct ml_effect_state * state,int gain)243*4882a593Smuzhiyun static void ml_combine_effects(struct ff_effect *effect,
244*4882a593Smuzhiyun 			       struct ml_effect_state *state,
245*4882a593Smuzhiyun 			       int gain)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun 	struct ff_effect *new = state->effect;
248*4882a593Smuzhiyun 	unsigned int strong, weak, i;
249*4882a593Smuzhiyun 	int x, y;
250*4882a593Smuzhiyun 	s16 level;
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun 	switch (new->type) {
253*4882a593Smuzhiyun 	case FF_CONSTANT:
254*4882a593Smuzhiyun 		i = new->direction * 360 / 0xffff;
255*4882a593Smuzhiyun 		level = fixp_new16(apply_envelope(state,
256*4882a593Smuzhiyun 					new->u.constant.level,
257*4882a593Smuzhiyun 					&new->u.constant.envelope));
258*4882a593Smuzhiyun 		x = fixp_mult(fixp_sin16(i), level) * gain / 0xffff;
259*4882a593Smuzhiyun 		y = fixp_mult(-fixp_cos16(i), level) * gain / 0xffff;
260*4882a593Smuzhiyun 		/*
261*4882a593Smuzhiyun 		 * here we abuse ff_ramp to hold x and y of constant force
262*4882a593Smuzhiyun 		 * If in future any driver wants something else than x and y
263*4882a593Smuzhiyun 		 * in s8, this should be changed to something more generic
264*4882a593Smuzhiyun 		 */
265*4882a593Smuzhiyun 		effect->u.ramp.start_level =
266*4882a593Smuzhiyun 			clamp_val(effect->u.ramp.start_level + x, -0x80, 0x7f);
267*4882a593Smuzhiyun 		effect->u.ramp.end_level =
268*4882a593Smuzhiyun 			clamp_val(effect->u.ramp.end_level + y, -0x80, 0x7f);
269*4882a593Smuzhiyun 		break;
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	case FF_RUMBLE:
272*4882a593Smuzhiyun 		strong = (u32)new->u.rumble.strong_magnitude * gain / 0xffff;
273*4882a593Smuzhiyun 		weak = (u32)new->u.rumble.weak_magnitude * gain / 0xffff;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun 		if (effect->u.rumble.strong_magnitude + strong)
276*4882a593Smuzhiyun 			effect->direction = ml_calculate_direction(
277*4882a593Smuzhiyun 				effect->direction,
278*4882a593Smuzhiyun 				effect->u.rumble.strong_magnitude,
279*4882a593Smuzhiyun 				new->direction, strong);
280*4882a593Smuzhiyun 		else if (effect->u.rumble.weak_magnitude + weak)
281*4882a593Smuzhiyun 			effect->direction = ml_calculate_direction(
282*4882a593Smuzhiyun 				effect->direction,
283*4882a593Smuzhiyun 				effect->u.rumble.weak_magnitude,
284*4882a593Smuzhiyun 				new->direction, weak);
285*4882a593Smuzhiyun 		else
286*4882a593Smuzhiyun 			effect->direction = 0;
287*4882a593Smuzhiyun 		effect->u.rumble.strong_magnitude =
288*4882a593Smuzhiyun 			min(strong + effect->u.rumble.strong_magnitude,
289*4882a593Smuzhiyun 			    0xffffU);
290*4882a593Smuzhiyun 		effect->u.rumble.weak_magnitude =
291*4882a593Smuzhiyun 			min(weak + effect->u.rumble.weak_magnitude, 0xffffU);
292*4882a593Smuzhiyun 		break;
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 	case FF_PERIODIC:
295*4882a593Smuzhiyun 		i = apply_envelope(state, abs(new->u.periodic.magnitude),
296*4882a593Smuzhiyun 				   &new->u.periodic.envelope);
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 		/* here we also scale it 0x7fff => 0xffff */
299*4882a593Smuzhiyun 		i = i * gain / 0x7fff;
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun 		if (effect->u.rumble.strong_magnitude + i)
302*4882a593Smuzhiyun 			effect->direction = ml_calculate_direction(
303*4882a593Smuzhiyun 				effect->direction,
304*4882a593Smuzhiyun 				effect->u.rumble.strong_magnitude,
305*4882a593Smuzhiyun 				new->direction, i);
306*4882a593Smuzhiyun 		else
307*4882a593Smuzhiyun 			effect->direction = 0;
308*4882a593Smuzhiyun 		effect->u.rumble.strong_magnitude =
309*4882a593Smuzhiyun 			min(i + effect->u.rumble.strong_magnitude, 0xffffU);
310*4882a593Smuzhiyun 		effect->u.rumble.weak_magnitude =
311*4882a593Smuzhiyun 			min(i + effect->u.rumble.weak_magnitude, 0xffffU);
312*4882a593Smuzhiyun 		break;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	default:
315*4882a593Smuzhiyun 		pr_err("invalid type in ml_combine_effects()\n");
316*4882a593Smuzhiyun 		break;
317*4882a593Smuzhiyun 	}
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun /*
323*4882a593Smuzhiyun  * Because memoryless devices have only one effect per effect type active
324*4882a593Smuzhiyun  * at one time we have to combine multiple effects into one
325*4882a593Smuzhiyun  */
ml_get_combo_effect(struct ml_device * ml,unsigned long * effect_handled,struct ff_effect * combo_effect)326*4882a593Smuzhiyun static int ml_get_combo_effect(struct ml_device *ml,
327*4882a593Smuzhiyun 			       unsigned long *effect_handled,
328*4882a593Smuzhiyun 			       struct ff_effect *combo_effect)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun 	struct ff_effect *effect;
331*4882a593Smuzhiyun 	struct ml_effect_state *state;
332*4882a593Smuzhiyun 	int effect_type;
333*4882a593Smuzhiyun 	int i;
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	memset(combo_effect, 0, sizeof(struct ff_effect));
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun 	for (i = 0; i < FF_MEMLESS_EFFECTS; i++) {
338*4882a593Smuzhiyun 		if (__test_and_set_bit(i, effect_handled))
339*4882a593Smuzhiyun 			continue;
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 		state = &ml->states[i];
342*4882a593Smuzhiyun 		effect = state->effect;
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 		if (!test_bit(FF_EFFECT_STARTED, &state->flags))
345*4882a593Smuzhiyun 			continue;
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 		if (time_before(jiffies, state->play_at))
348*4882a593Smuzhiyun 			continue;
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 		/*
351*4882a593Smuzhiyun 		 * here we have started effects that are either
352*4882a593Smuzhiyun 		 * currently playing (and may need be aborted)
353*4882a593Smuzhiyun 		 * or need to start playing.
354*4882a593Smuzhiyun 		 */
355*4882a593Smuzhiyun 		effect_type = get_compatible_type(ml->dev->ff, effect->type);
356*4882a593Smuzhiyun 		if (combo_effect->type != effect_type) {
357*4882a593Smuzhiyun 			if (combo_effect->type != 0) {
358*4882a593Smuzhiyun 				__clear_bit(i, effect_handled);
359*4882a593Smuzhiyun 				continue;
360*4882a593Smuzhiyun 			}
361*4882a593Smuzhiyun 			combo_effect->type = effect_type;
362*4882a593Smuzhiyun 		}
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 		if (__test_and_clear_bit(FF_EFFECT_ABORTING, &state->flags)) {
365*4882a593Smuzhiyun 			__clear_bit(FF_EFFECT_PLAYING, &state->flags);
366*4882a593Smuzhiyun 			__clear_bit(FF_EFFECT_STARTED, &state->flags);
367*4882a593Smuzhiyun 		} else if (effect->replay.length &&
368*4882a593Smuzhiyun 			   time_after_eq(jiffies, state->stop_at)) {
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 			__clear_bit(FF_EFFECT_PLAYING, &state->flags);
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun 			if (--state->count <= 0) {
373*4882a593Smuzhiyun 				__clear_bit(FF_EFFECT_STARTED, &state->flags);
374*4882a593Smuzhiyun 			} else {
375*4882a593Smuzhiyun 				state->play_at = jiffies +
376*4882a593Smuzhiyun 					msecs_to_jiffies(effect->replay.delay);
377*4882a593Smuzhiyun 				state->stop_at = state->play_at +
378*4882a593Smuzhiyun 					msecs_to_jiffies(effect->replay.length);
379*4882a593Smuzhiyun 			}
380*4882a593Smuzhiyun 		} else {
381*4882a593Smuzhiyun 			__set_bit(FF_EFFECT_PLAYING, &state->flags);
382*4882a593Smuzhiyun 			state->adj_at = jiffies;
383*4882a593Smuzhiyun 			ml_combine_effects(combo_effect, state, ml->gain);
384*4882a593Smuzhiyun 		}
385*4882a593Smuzhiyun 	}
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 	return combo_effect->type != 0;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun 
ml_play_effects(struct ml_device * ml)390*4882a593Smuzhiyun static void ml_play_effects(struct ml_device *ml)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun 	struct ff_effect effect;
393*4882a593Smuzhiyun 	DECLARE_BITMAP(handled_bm, FF_MEMLESS_EFFECTS);
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	memset(handled_bm, 0, sizeof(handled_bm));
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 	while (ml_get_combo_effect(ml, handled_bm, &effect))
398*4882a593Smuzhiyun 		ml->play_effect(ml->dev, ml->private, &effect);
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 	ml_schedule_timer(ml);
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun 
ml_effect_timer(struct timer_list * t)403*4882a593Smuzhiyun static void ml_effect_timer(struct timer_list *t)
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun 	struct ml_device *ml = from_timer(ml, t, timer);
406*4882a593Smuzhiyun 	struct input_dev *dev = ml->dev;
407*4882a593Smuzhiyun 	unsigned long flags;
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 	pr_debug("timer: updating effects\n");
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 	spin_lock_irqsave(&dev->event_lock, flags);
412*4882a593Smuzhiyun 	ml_play_effects(ml);
413*4882a593Smuzhiyun 	spin_unlock_irqrestore(&dev->event_lock, flags);
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun /*
417*4882a593Smuzhiyun  * Sets requested gain for FF effects. Called with dev->event_lock held.
418*4882a593Smuzhiyun  */
ml_ff_set_gain(struct input_dev * dev,u16 gain)419*4882a593Smuzhiyun static void ml_ff_set_gain(struct input_dev *dev, u16 gain)
420*4882a593Smuzhiyun {
421*4882a593Smuzhiyun 	struct ml_device *ml = dev->ff->private;
422*4882a593Smuzhiyun 	int i;
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun 	ml->gain = gain;
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun 	for (i = 0; i < FF_MEMLESS_EFFECTS; i++)
427*4882a593Smuzhiyun 		__clear_bit(FF_EFFECT_PLAYING, &ml->states[i].flags);
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun 	ml_play_effects(ml);
430*4882a593Smuzhiyun }
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun /*
433*4882a593Smuzhiyun  * Start/stop specified FF effect. Called with dev->event_lock held.
434*4882a593Smuzhiyun  */
ml_ff_playback(struct input_dev * dev,int effect_id,int value)435*4882a593Smuzhiyun static int ml_ff_playback(struct input_dev *dev, int effect_id, int value)
436*4882a593Smuzhiyun {
437*4882a593Smuzhiyun 	struct ml_device *ml = dev->ff->private;
438*4882a593Smuzhiyun 	struct ml_effect_state *state = &ml->states[effect_id];
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun 	if (value > 0) {
441*4882a593Smuzhiyun 		pr_debug("initiated play\n");
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 		__set_bit(FF_EFFECT_STARTED, &state->flags);
444*4882a593Smuzhiyun 		state->count = value;
445*4882a593Smuzhiyun 		state->play_at = jiffies +
446*4882a593Smuzhiyun 				 msecs_to_jiffies(state->effect->replay.delay);
447*4882a593Smuzhiyun 		state->stop_at = state->play_at +
448*4882a593Smuzhiyun 				 msecs_to_jiffies(state->effect->replay.length);
449*4882a593Smuzhiyun 		state->adj_at = state->play_at;
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	} else {
452*4882a593Smuzhiyun 		pr_debug("initiated stop\n");
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun 		if (test_bit(FF_EFFECT_PLAYING, &state->flags))
455*4882a593Smuzhiyun 			__set_bit(FF_EFFECT_ABORTING, &state->flags);
456*4882a593Smuzhiyun 		else
457*4882a593Smuzhiyun 			__clear_bit(FF_EFFECT_STARTED, &state->flags);
458*4882a593Smuzhiyun 	}
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun 	ml_play_effects(ml);
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	return 0;
463*4882a593Smuzhiyun }
464*4882a593Smuzhiyun 
ml_ff_upload(struct input_dev * dev,struct ff_effect * effect,struct ff_effect * old)465*4882a593Smuzhiyun static int ml_ff_upload(struct input_dev *dev,
466*4882a593Smuzhiyun 			struct ff_effect *effect, struct ff_effect *old)
467*4882a593Smuzhiyun {
468*4882a593Smuzhiyun 	struct ml_device *ml = dev->ff->private;
469*4882a593Smuzhiyun 	struct ml_effect_state *state = &ml->states[effect->id];
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	spin_lock_irq(&dev->event_lock);
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 	if (test_bit(FF_EFFECT_STARTED, &state->flags)) {
474*4882a593Smuzhiyun 		__clear_bit(FF_EFFECT_PLAYING, &state->flags);
475*4882a593Smuzhiyun 		state->play_at = jiffies +
476*4882a593Smuzhiyun 				 msecs_to_jiffies(state->effect->replay.delay);
477*4882a593Smuzhiyun 		state->stop_at = state->play_at +
478*4882a593Smuzhiyun 				 msecs_to_jiffies(state->effect->replay.length);
479*4882a593Smuzhiyun 		state->adj_at = state->play_at;
480*4882a593Smuzhiyun 		ml_schedule_timer(ml);
481*4882a593Smuzhiyun 	}
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun 	spin_unlock_irq(&dev->event_lock);
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 	return 0;
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun 
ml_ff_destroy(struct ff_device * ff)488*4882a593Smuzhiyun static void ml_ff_destroy(struct ff_device *ff)
489*4882a593Smuzhiyun {
490*4882a593Smuzhiyun 	struct ml_device *ml = ff->private;
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	/*
493*4882a593Smuzhiyun 	 * Even though we stop all playing effects when tearing down
494*4882a593Smuzhiyun 	 * an input device (via input_device_flush() that calls into
495*4882a593Smuzhiyun 	 * input_ff_flush() that stops and erases all effects), we
496*4882a593Smuzhiyun 	 * do not actually stop the timer, and therefore we should
497*4882a593Smuzhiyun 	 * do it here.
498*4882a593Smuzhiyun 	 */
499*4882a593Smuzhiyun 	del_timer_sync(&ml->timer);
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun 	kfree(ml->private);
502*4882a593Smuzhiyun }
503*4882a593Smuzhiyun 
504*4882a593Smuzhiyun /**
505*4882a593Smuzhiyun  * input_ff_create_memless() - create memoryless force-feedback device
506*4882a593Smuzhiyun  * @dev: input device supporting force-feedback
507*4882a593Smuzhiyun  * @data: driver-specific data to be passed into @play_effect
508*4882a593Smuzhiyun  * @play_effect: driver-specific method for playing FF effect
509*4882a593Smuzhiyun  */
input_ff_create_memless(struct input_dev * dev,void * data,int (* play_effect)(struct input_dev *,void *,struct ff_effect *))510*4882a593Smuzhiyun int input_ff_create_memless(struct input_dev *dev, void *data,
511*4882a593Smuzhiyun 		int (*play_effect)(struct input_dev *, void *, struct ff_effect *))
512*4882a593Smuzhiyun {
513*4882a593Smuzhiyun 	struct ml_device *ml;
514*4882a593Smuzhiyun 	struct ff_device *ff;
515*4882a593Smuzhiyun 	int error;
516*4882a593Smuzhiyun 	int i;
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun 	ml = kzalloc(sizeof(struct ml_device), GFP_KERNEL);
519*4882a593Smuzhiyun 	if (!ml)
520*4882a593Smuzhiyun 		return -ENOMEM;
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun 	ml->dev = dev;
523*4882a593Smuzhiyun 	ml->private = data;
524*4882a593Smuzhiyun 	ml->play_effect = play_effect;
525*4882a593Smuzhiyun 	ml->gain = 0xffff;
526*4882a593Smuzhiyun 	timer_setup(&ml->timer, ml_effect_timer, 0);
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun 	set_bit(FF_GAIN, dev->ffbit);
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun 	error = input_ff_create(dev, FF_MEMLESS_EFFECTS);
531*4882a593Smuzhiyun 	if (error) {
532*4882a593Smuzhiyun 		kfree(ml);
533*4882a593Smuzhiyun 		return error;
534*4882a593Smuzhiyun 	}
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun 	ff = dev->ff;
537*4882a593Smuzhiyun 	ff->private = ml;
538*4882a593Smuzhiyun 	ff->upload = ml_ff_upload;
539*4882a593Smuzhiyun 	ff->playback = ml_ff_playback;
540*4882a593Smuzhiyun 	ff->set_gain = ml_ff_set_gain;
541*4882a593Smuzhiyun 	ff->destroy = ml_ff_destroy;
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 	/* we can emulate periodic effects with RUMBLE */
544*4882a593Smuzhiyun 	if (test_bit(FF_RUMBLE, ff->ffbit)) {
545*4882a593Smuzhiyun 		set_bit(FF_PERIODIC, dev->ffbit);
546*4882a593Smuzhiyun 		set_bit(FF_SINE, dev->ffbit);
547*4882a593Smuzhiyun 		set_bit(FF_TRIANGLE, dev->ffbit);
548*4882a593Smuzhiyun 		set_bit(FF_SQUARE, dev->ffbit);
549*4882a593Smuzhiyun 	}
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun 	for (i = 0; i < FF_MEMLESS_EFFECTS; i++)
552*4882a593Smuzhiyun 		ml->states[i].effect = &ff->effects[i];
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun 	return 0;
555*4882a593Smuzhiyun }
556*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(input_ff_create_memless);
557