diff options
Diffstat (limited to 'drivers/input/joystick/stinger.c')
| -rw-r--r-- | drivers/input/joystick/stinger.c | 75 |
1 files changed, 33 insertions, 42 deletions
diff --git a/drivers/input/joystick/stinger.c b/drivers/input/joystick/stinger.c index 6f6e6753d590..0a9ed1d30636 100644 --- a/drivers/input/joystick/stinger.c +++ b/drivers/input/joystick/stinger.c | |||
| @@ -48,14 +48,12 @@ MODULE_LICENSE("GPL"); | |||
| 48 | 48 | ||
| 49 | #define STINGER_MAX_LENGTH 8 | 49 | #define STINGER_MAX_LENGTH 8 |
| 50 | 50 | ||
| 51 | static char *stinger_name = "Gravis Stinger"; | ||
| 52 | |||
| 53 | /* | 51 | /* |
| 54 | * Per-Stinger data. | 52 | * Per-Stinger data. |
| 55 | */ | 53 | */ |
| 56 | 54 | ||
| 57 | struct stinger { | 55 | struct stinger { |
| 58 | struct input_dev dev; | 56 | struct input_dev *dev; |
| 59 | int idx; | 57 | int idx; |
| 60 | unsigned char data[STINGER_MAX_LENGTH]; | 58 | unsigned char data[STINGER_MAX_LENGTH]; |
| 61 | char phys[32]; | 59 | char phys[32]; |
| @@ -68,7 +66,7 @@ struct stinger { | |||
| 68 | 66 | ||
| 69 | static void stinger_process_packet(struct stinger *stinger, struct pt_regs *regs) | 67 | static void stinger_process_packet(struct stinger *stinger, struct pt_regs *regs) |
| 70 | { | 68 | { |
| 71 | struct input_dev *dev = &stinger->dev; | 69 | struct input_dev *dev = stinger->dev; |
| 72 | unsigned char *data = stinger->data; | 70 | unsigned char *data = stinger->data; |
| 73 | 71 | ||
| 74 | if (!stinger->idx) return; | 72 | if (!stinger->idx) return; |
| @@ -126,9 +124,9 @@ static void stinger_disconnect(struct serio *serio) | |||
| 126 | { | 124 | { |
| 127 | struct stinger *stinger = serio_get_drvdata(serio); | 125 | struct stinger *stinger = serio_get_drvdata(serio); |
| 128 | 126 | ||
| 129 | input_unregister_device(&stinger->dev); | ||
| 130 | serio_close(serio); | 127 | serio_close(serio); |
| 131 | serio_set_drvdata(serio, NULL); | 128 | serio_set_drvdata(serio, NULL); |
| 129 | input_unregister_device(stinger->dev); | ||
| 132 | kfree(stinger); | 130 | kfree(stinger); |
| 133 | } | 131 | } |
| 134 | 132 | ||
| @@ -141,53 +139,46 @@ static void stinger_disconnect(struct serio *serio) | |||
| 141 | static int stinger_connect(struct serio *serio, struct serio_driver *drv) | 139 | static int stinger_connect(struct serio *serio, struct serio_driver *drv) |
| 142 | { | 140 | { |
| 143 | struct stinger *stinger; | 141 | struct stinger *stinger; |
| 144 | int i; | 142 | struct input_dev *input_dev; |
| 145 | int err; | 143 | int err = -ENOMEM; |
| 146 | |||
| 147 | if (!(stinger = kmalloc(sizeof(struct stinger), GFP_KERNEL))) | ||
| 148 | return -ENOMEM; | ||
| 149 | |||
| 150 | memset(stinger, 0, sizeof(struct stinger)); | ||
| 151 | 144 | ||
| 152 | stinger->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | 145 | stinger = kmalloc(sizeof(struct stinger), GFP_KERNEL); |
| 153 | stinger->dev.keybit[LONG(BTN_A)] = BIT(BTN_A) | BIT(BTN_B) | BIT(BTN_C) | BIT(BTN_X) | \ | 146 | input_dev = input_allocate_device(); |
| 154 | BIT(BTN_Y) | BIT(BTN_Z) | BIT(BTN_TL) | BIT(BTN_TR) | \ | 147 | if (!stinger || !input_dev) |
| 155 | BIT(BTN_START) | BIT(BTN_SELECT); | 148 | goto fail; |
| 156 | stinger->dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y); | ||
| 157 | 149 | ||
| 150 | stinger->dev = input_dev; | ||
| 158 | sprintf(stinger->phys, "%s/serio0", serio->phys); | 151 | sprintf(stinger->phys, "%s/serio0", serio->phys); |
| 159 | 152 | ||
| 160 | init_input_dev(&stinger->dev); | 153 | input_dev->name = "Gravis Stinger"; |
| 161 | stinger->dev.name = stinger_name; | 154 | input_dev->phys = stinger->phys; |
| 162 | stinger->dev.phys = stinger->phys; | 155 | input_dev->id.bustype = BUS_RS232; |
| 163 | stinger->dev.id.bustype = BUS_RS232; | 156 | input_dev->id.vendor = SERIO_STINGER; |
| 164 | stinger->dev.id.vendor = SERIO_STINGER; | 157 | input_dev->id.product = 0x0001; |
| 165 | stinger->dev.id.product = 0x0001; | 158 | input_dev->id.version = 0x0100; |
| 166 | stinger->dev.id.version = 0x0100; | 159 | input_dev->cdev.dev = &serio->dev; |
| 167 | stinger->dev.dev = &serio->dev; | 160 | input_dev->private = stinger; |
| 168 | 161 | ||
| 169 | for (i = 0; i < 2; i++) { | 162 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); |
| 170 | stinger->dev.absmax[ABS_X+i] = 64; | 163 | input_dev->keybit[LONG(BTN_A)] = BIT(BTN_A) | BIT(BTN_B) | BIT(BTN_C) | BIT(BTN_X) | |
| 171 | stinger->dev.absmin[ABS_X+i] = -64; | 164 | BIT(BTN_Y) | BIT(BTN_Z) | BIT(BTN_TL) | BIT(BTN_TR) | |
| 172 | stinger->dev.absflat[ABS_X+i] = 4; | 165 | BIT(BTN_START) | BIT(BTN_SELECT); |
| 173 | } | 166 | input_set_abs_params(input_dev, ABS_X, -64, 64, 0, 4); |
| 174 | 167 | input_set_abs_params(input_dev, ABS_Y, -64, 64, 0, 4); | |
| 175 | stinger->dev.private = stinger; | ||
| 176 | 168 | ||
| 177 | serio_set_drvdata(serio, stinger); | 169 | serio_set_drvdata(serio, stinger); |
| 178 | 170 | ||
| 179 | err = serio_open(serio, drv); | 171 | err = serio_open(serio, drv); |
| 180 | if (err) { | 172 | if (err) |
| 181 | serio_set_drvdata(serio, NULL); | 173 | goto fail; |
| 182 | kfree(stinger); | ||
| 183 | return err; | ||
| 184 | } | ||
| 185 | |||
| 186 | input_register_device(&stinger->dev); | ||
| 187 | |||
| 188 | printk(KERN_INFO "input: %s on %s\n", stinger_name, serio->phys); | ||
| 189 | 174 | ||
| 175 | input_register_device(stinger->dev); | ||
| 190 | return 0; | 176 | return 0; |
| 177 | |||
| 178 | fail: serio_set_drvdata(serio, NULL); | ||
| 179 | input_free_device(input_dev); | ||
| 180 | kfree(stinger); | ||
| 181 | return err; | ||
| 191 | } | 182 | } |
| 192 | 183 | ||
| 193 | /* | 184 | /* |
