26 #define pr_fmt(fmt) KBUILD_BASENAME ": " fmt
28 #include <linux/input.h>
29 #include <linux/module.h>
31 #include <linux/sched.h>
32 #include <linux/slab.h>
38 static int check_effect_access(
struct ff_device *ff,
int effect_id,
41 if (effect_id < 0 || effect_id >= ff->max_effects ||
42 !ff->effect_owners[effect_id])
45 if (file && ff->effect_owners[effect_id] != file)
54 static inline int check_effects_compatible(
struct ff_effect *
e1,
65 static int compat_effect(
struct ff_device *ff,
struct ff_effect *effect)
69 switch (effect->
type) {
78 magnitude = effect->
u.
rumble.strong_magnitude / 3 +
79 effect->
u.
rumble.weak_magnitude / 6;
87 effect->
u.
periodic.envelope.attack_length = 0;
88 effect->
u.
periodic.envelope.attack_level = 0;
89 effect->
u.
periodic.envelope.fade_length = 0;
90 effect->
u.
periodic.envelope.fade_level = 0;
109 struct ff_device *ff = dev->ff;
119 pr_debug(
"invalid or not supported effect type in upload\n");
127 pr_debug(
"invalid or not supported wave form in upload\n");
132 ret = compat_effect(ff, effect);
139 if (effect->
id == -1) {
140 for (
id = 0;
id < ff->max_effects;
id++)
141 if (!ff->effect_owners[
id])
144 if (
id >= ff->max_effects) {
155 ret = check_effect_access(ff,
id, file);
159 old = &ff->effects[
id];
161 if (!check_effects_compatible(effect, old)) {
167 ret = ff->upload(dev, effect, old);
171 spin_lock_irq(&dev->event_lock);
172 ff->effects[
id] = *effect;
173 ff->effect_owners[
id] =
file;
174 spin_unlock_irq(&dev->event_lock);
186 static int erase_effect(
struct input_dev *
dev,
int effect_id,
189 struct ff_device *ff = dev->ff;
192 error = check_effect_access(ff, effect_id, file);
196 spin_lock_irq(&dev->event_lock);
197 ff->playback(dev, effect_id, 0);
198 ff->effect_owners[effect_id] =
NULL;
199 spin_unlock_irq(&dev->event_lock);
202 error = ff->erase(dev, effect_id);
204 spin_lock_irq(&dev->event_lock);
205 ff->effect_owners[effect_id] =
file;
206 spin_unlock_irq(&dev->event_lock);
227 struct ff_device *ff = dev->ff;
234 ret = erase_effect(dev, effect_id, file);
244 static int flush_effects(
struct input_dev *dev,
struct file *file)
246 struct ff_device *ff = dev->ff;
253 for (i = 0; i < ff->max_effects; i++)
254 erase_effect(dev, i, file);
268 int input_ff_event(
struct input_dev *dev,
unsigned int type,
271 struct ff_device *ff = dev->ff;
281 ff->set_gain(dev, value);
288 ff->set_autocenter(dev, value);
292 if (check_effect_access(ff, code,
NULL) == 0)
293 ff->playback(dev, code, value);
312 int input_ff_create(
struct input_dev *dev,
unsigned int max_effects)
314 struct ff_device *ff;
319 pr_err(
"cannot allocate device without any effects\n");
323 ff_dev_size =
sizeof(
struct ff_device) +
324 max_effects *
sizeof(
struct file *);
325 if (ff_dev_size < max_effects)
332 ff->effects = kcalloc(max_effects,
sizeof(
struct ff_effect),
339 ff->max_effects = max_effects;
343 dev->flush = flush_effects;
344 dev->event = input_ff_event;
348 for (i = 0; i <=
FF_MAX; i++)
368 void input_ff_destroy(
struct input_dev *dev)
370 struct ff_device *ff = dev->ff;