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