diff options
Diffstat (limited to 'drivers/input/joystick/interact.c')
-rw-r--r-- | drivers/input/joystick/interact.c | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/drivers/input/joystick/interact.c b/drivers/input/joystick/interact.c index d7b3472bd686..8511ee7bb263 100644 --- a/drivers/input/joystick/interact.c +++ b/drivers/input/joystick/interact.c | |||
@@ -54,7 +54,7 @@ MODULE_LICENSE("GPL"); | |||
54 | 54 | ||
55 | struct interact { | 55 | struct interact { |
56 | struct gameport *gameport; | 56 | struct gameport *gameport; |
57 | struct input_dev dev; | 57 | struct input_dev *dev; |
58 | int bads; | 58 | int bads; |
59 | int reads; | 59 | int reads; |
60 | unsigned char type; | 60 | unsigned char type; |
@@ -130,7 +130,7 @@ static int interact_read_packet(struct gameport *gameport, int length, u32 *data | |||
130 | static void interact_poll(struct gameport *gameport) | 130 | static void interact_poll(struct gameport *gameport) |
131 | { | 131 | { |
132 | struct interact *interact = gameport_get_drvdata(gameport); | 132 | struct interact *interact = gameport_get_drvdata(gameport); |
133 | struct input_dev *dev = &interact->dev; | 133 | struct input_dev *dev = interact->dev; |
134 | u32 data[3]; | 134 | u32 data[3]; |
135 | int i; | 135 | int i; |
136 | 136 | ||
@@ -208,14 +208,20 @@ static void interact_close(struct input_dev *dev) | |||
208 | static int interact_connect(struct gameport *gameport, struct gameport_driver *drv) | 208 | static int interact_connect(struct gameport *gameport, struct gameport_driver *drv) |
209 | { | 209 | { |
210 | struct interact *interact; | 210 | struct interact *interact; |
211 | struct input_dev *input_dev; | ||
211 | __u32 data[3]; | 212 | __u32 data[3]; |
212 | int i, t; | 213 | int i, t; |
213 | int err; | 214 | int err; |
214 | 215 | ||
215 | if (!(interact = kzalloc(sizeof(struct interact), GFP_KERNEL))) | 216 | interact = kzalloc(sizeof(struct interact), GFP_KERNEL); |
216 | return -ENOMEM; | 217 | input_dev = input_allocate_device(); |
218 | if (!interact || !input_dev) { | ||
219 | err = -ENOMEM; | ||
220 | goto fail1; | ||
221 | } | ||
217 | 222 | ||
218 | interact->gameport = gameport; | 223 | interact->gameport = gameport; |
224 | interact->dev = input_dev; | ||
219 | 225 | ||
220 | gameport_set_drvdata(gameport, interact); | 226 | gameport_set_drvdata(gameport, interact); |
221 | 227 | ||
@@ -249,41 +255,40 @@ static int interact_connect(struct gameport *gameport, struct gameport_driver *d | |||
249 | interact->type = i; | 255 | interact->type = i; |
250 | interact->length = interact_type[i].length; | 256 | interact->length = interact_type[i].length; |
251 | 257 | ||
252 | interact->dev.private = interact; | 258 | input_dev->name = interact_type[i].name; |
253 | interact->dev.open = interact_open; | 259 | input_dev->phys = interact->phys; |
254 | interact->dev.close = interact_close; | 260 | input_dev->id.bustype = BUS_GAMEPORT; |
261 | input_dev->id.vendor = GAMEPORT_ID_VENDOR_INTERACT; | ||
262 | input_dev->id.product = interact_type[i].id; | ||
263 | input_dev->id.version = 0x0100; | ||
264 | input_dev->private = interact; | ||
255 | 265 | ||
256 | interact->dev.name = interact_type[i].name; | 266 | input_dev->open = interact_open; |
257 | interact->dev.phys = interact->phys; | 267 | input_dev->close = interact_close; |
258 | interact->dev.id.bustype = BUS_GAMEPORT; | ||
259 | interact->dev.id.vendor = GAMEPORT_ID_VENDOR_INTERACT; | ||
260 | interact->dev.id.product = interact_type[i].id; | ||
261 | interact->dev.id.version = 0x0100; | ||
262 | 268 | ||
263 | interact->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | 269 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); |
264 | 270 | ||
265 | for (i = 0; (t = interact_type[interact->type].abs[i]) >= 0; i++) { | 271 | for (i = 0; (t = interact_type[interact->type].abs[i]) >= 0; i++) { |
266 | set_bit(t, interact->dev.absbit); | 272 | set_bit(t, input_dev->absbit); |
267 | if (i < interact_type[interact->type].b8) { | 273 | if (i < interact_type[interact->type].b8) { |
268 | interact->dev.absmin[t] = 0; | 274 | input_dev->absmin[t] = 0; |
269 | interact->dev.absmax[t] = 255; | 275 | input_dev->absmax[t] = 255; |
270 | } else { | 276 | } else { |
271 | interact->dev.absmin[t] = -1; | 277 | input_dev->absmin[t] = -1; |
272 | interact->dev.absmax[t] = 1; | 278 | input_dev->absmax[t] = 1; |
273 | } | 279 | } |
274 | } | 280 | } |
275 | 281 | ||
276 | for (i = 0; (t = interact_type[interact->type].btn[i]) >= 0; i++) | 282 | for (i = 0; (t = interact_type[interact->type].btn[i]) >= 0; i++) |
277 | set_bit(t, interact->dev.keybit); | 283 | set_bit(t, input_dev->keybit); |
278 | 284 | ||
279 | input_register_device(&interact->dev); | 285 | input_register_device(interact->dev); |
280 | printk(KERN_INFO "input: %s on %s\n", | ||
281 | interact_type[interact->type].name, gameport->phys); | ||
282 | 286 | ||
283 | return 0; | 287 | return 0; |
284 | 288 | ||
285 | fail2: gameport_close(gameport); | 289 | fail2: gameport_close(gameport); |
286 | fail1: gameport_set_drvdata(gameport, NULL); | 290 | fail1: gameport_set_drvdata(gameport, NULL); |
291 | input_free_device(input_dev); | ||
287 | kfree(interact); | 292 | kfree(interact); |
288 | return err; | 293 | return err; |
289 | } | 294 | } |
@@ -292,7 +297,7 @@ static void interact_disconnect(struct gameport *gameport) | |||
292 | { | 297 | { |
293 | struct interact *interact = gameport_get_drvdata(gameport); | 298 | struct interact *interact = gameport_get_drvdata(gameport); |
294 | 299 | ||
295 | input_unregister_device(&interact->dev); | 300 | input_unregister_device(interact->dev); |
296 | gameport_close(gameport); | 301 | gameport_close(gameport); |
297 | gameport_set_drvdata(gameport, NULL); | 302 | gameport_set_drvdata(gameport, NULL); |
298 | kfree(interact); | 303 | kfree(interact); |