Commit f6a01c85 authored by Anssi Hannula's avatar Anssi Hannula Committed by Dmitry Torokhov

Input: iforce - switch to the new FF interface

Signed-off-by: default avatarAnssi Hannula <anssi.hannula@gmail.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 7d928a2b
This diff is collapsed.
This diff is collapsed.
...@@ -140,7 +140,10 @@ static int mark_core_as_ready(struct iforce *iforce, unsigned short addr) ...@@ -140,7 +140,10 @@ static int mark_core_as_ready(struct iforce *iforce, unsigned short addr)
{ {
int i; int i;
for (i = 0; i < iforce->dev->ff_effects_max; ++i) { if (!iforce->dev->ff)
return 0;
for (i = 0; i < iforce->dev->ff->max_effects; ++i) {
if (test_bit(FF_CORE_IS_USED, iforce->core_effects[i].flags) && if (test_bit(FF_CORE_IS_USED, iforce->core_effects[i].flags) &&
(iforce->core_effects[i].mod1_chunk.start == addr || (iforce->core_effects[i].mod1_chunk.start == addr ||
iforce->core_effects[i].mod2_chunk.start == addr)) { iforce->core_effects[i].mod2_chunk.start == addr)) {
...@@ -229,19 +232,17 @@ void iforce_process_packet(struct iforce *iforce, u16 cmd, unsigned char *data, ...@@ -229,19 +232,17 @@ void iforce_process_packet(struct iforce *iforce, u16 cmd, unsigned char *data,
i = data[1] & 0x7f; i = data[1] & 0x7f;
if (data[1] & 0x80) { if (data[1] & 0x80) {
if (!test_and_set_bit(FF_CORE_IS_PLAYED, iforce->core_effects[i].flags)) { if (!test_and_set_bit(FF_CORE_IS_PLAYED, iforce->core_effects[i].flags)) {
/* Report play event */ /* Report play event */
input_report_ff_status(dev, i, FF_STATUS_PLAYING); input_report_ff_status(dev, i, FF_STATUS_PLAYING);
} }
} } else if (test_and_clear_bit(FF_CORE_IS_PLAYED, iforce->core_effects[i].flags)) {
else if (test_and_clear_bit(FF_CORE_IS_PLAYED, iforce->core_effects[i].flags)) {
/* Report stop event */ /* Report stop event */
input_report_ff_status(dev, i, FF_STATUS_STOPPED); input_report_ff_status(dev, i, FF_STATUS_STOPPED);
} }
if (LO(cmd) > 3) { if (LO(cmd) > 3) {
int j; int j;
for (j=3; j<LO(cmd); j+=2) { for (j = 3; j < LO(cmd); j += 2)
mark_core_as_ready(iforce, data[j] | (data[j+1]<<8)); mark_core_as_ready(iforce, data[j] | (data[j+1]<<8));
}
} }
break; break;
} }
......
...@@ -51,10 +51,7 @@ ...@@ -51,10 +51,7 @@
#define IFORCE_232 1 #define IFORCE_232 1
#define IFORCE_USB 2 #define IFORCE_USB 2
#define FALSE 0 #define IFORCE_EFFECTS_MAX 32
#define TRUE 1
#define FF_EFFECTS_MAX 32
/* Each force feedback effect is made of one core effect, which can be /* Each force feedback effect is made of one core effect, which can be
* associated to at most to effect modifiers * associated to at most to effect modifiers
...@@ -67,24 +64,11 @@ ...@@ -67,24 +64,11 @@
#define FF_CORE_UPDATE 5 /* Effect is being updated */ #define FF_CORE_UPDATE 5 /* Effect is being updated */
#define FF_MODCORE_MAX 5 #define FF_MODCORE_MAX 5
#define CHECK_OWNERSHIP(i, iforce) \
((i) < FF_EFFECTS_MAX && i >= 0 && \
test_bit(FF_CORE_IS_USED, (iforce)->core_effects[(i)].flags) && \
(current->pid == 0 || \
(iforce)->core_effects[(i)].owner == current->pid))
struct iforce_core_effect { struct iforce_core_effect {
/* Information about where modifiers are stored in the device's memory */ /* Information about where modifiers are stored in the device's memory */
struct resource mod1_chunk; struct resource mod1_chunk;
struct resource mod2_chunk; struct resource mod2_chunk;
unsigned long flags[NBITS(FF_MODCORE_MAX)]; unsigned long flags[NBITS(FF_MODCORE_MAX)];
pid_t owner;
/* Used to keep track of parameters of an effect. They are needed
* to know what parts of an effect changed in an update operation.
* We try to send only parameter packets if possible, as sending
* effect parameter requires the effect to be stoped and restarted
*/
struct ff_effect effect;
}; };
#define FF_CMD_EFFECT 0x010e #define FF_CMD_EFFECT 0x010e
...@@ -145,7 +129,7 @@ struct iforce { ...@@ -145,7 +129,7 @@ struct iforce {
/* Force Feedback */ /* Force Feedback */
wait_queue_head_t wait; wait_queue_head_t wait;
struct resource device_memory; struct resource device_memory;
struct iforce_core_effect core_effects[FF_EFFECTS_MAX]; struct iforce_core_effect core_effects[IFORCE_EFFECTS_MAX];
struct mutex mem_mutex; struct mutex mem_mutex;
}; };
...@@ -182,9 +166,9 @@ void iforce_dump_packet(char *msg, u16 cmd, unsigned char *data) ; ...@@ -182,9 +166,9 @@ void iforce_dump_packet(char *msg, u16 cmd, unsigned char *data) ;
int iforce_get_id_packet(struct iforce *iforce, char *packet); int iforce_get_id_packet(struct iforce *iforce, char *packet);
/* iforce-ff.c */ /* iforce-ff.c */
int iforce_upload_periodic(struct iforce*, struct ff_effect*, int is_update); int iforce_upload_periodic(struct iforce *, struct ff_effect *, struct ff_effect *);
int iforce_upload_constant(struct iforce*, struct ff_effect*, int is_update); int iforce_upload_constant(struct iforce *, struct ff_effect *, struct ff_effect *);
int iforce_upload_condition(struct iforce*, struct ff_effect*, int is_update); int iforce_upload_condition(struct iforce *, struct ff_effect *, struct ff_effect *);
/* Public variables */ /* Public variables */
extern struct serio_driver iforce_serio_drv; extern struct serio_driver iforce_serio_drv;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment