diff options
Diffstat (limited to 'drivers/input/joystick/magellan.c')
-rw-r--r-- | drivers/input/joystick/magellan.c | 71 |
1 files changed, 33 insertions, 38 deletions
diff --git a/drivers/input/joystick/magellan.c b/drivers/input/joystick/magellan.c index 1ba503627242..ca3cc2319d6a 100644 --- a/drivers/input/joystick/magellan.c +++ b/drivers/input/joystick/magellan.c | |||
@@ -49,14 +49,13 @@ MODULE_LICENSE("GPL"); | |||
49 | 49 | ||
50 | static int magellan_buttons[] = { BTN_0, BTN_1, BTN_2, BTN_3, BTN_4, BTN_5, BTN_6, BTN_7, BTN_8 }; | 50 | static int magellan_buttons[] = { BTN_0, BTN_1, BTN_2, BTN_3, BTN_4, BTN_5, BTN_6, BTN_7, BTN_8 }; |
51 | static int magellan_axes[] = { ABS_X, ABS_Y, ABS_Z, ABS_RX, ABS_RY, ABS_RZ }; | 51 | static int magellan_axes[] = { ABS_X, ABS_Y, ABS_Z, ABS_RX, ABS_RY, ABS_RZ }; |
52 | static char *magellan_name = "LogiCad3D Magellan / SpaceMouse"; | ||
53 | 52 | ||
54 | /* | 53 | /* |
55 | * Per-Magellan data. | 54 | * Per-Magellan data. |
56 | */ | 55 | */ |
57 | 56 | ||
58 | struct magellan { | 57 | struct magellan { |
59 | struct input_dev dev; | 58 | struct input_dev *dev; |
60 | int idx; | 59 | int idx; |
61 | unsigned char data[MAGELLAN_MAX_LENGTH]; | 60 | unsigned char data[MAGELLAN_MAX_LENGTH]; |
62 | char phys[32]; | 61 | char phys[32]; |
@@ -85,7 +84,7 @@ static int magellan_crunch_nibbles(unsigned char *data, int count) | |||
85 | 84 | ||
86 | static void magellan_process_packet(struct magellan* magellan, struct pt_regs *regs) | 85 | static void magellan_process_packet(struct magellan* magellan, struct pt_regs *regs) |
87 | { | 86 | { |
88 | struct input_dev *dev = &magellan->dev; | 87 | struct input_dev *dev = magellan->dev; |
89 | unsigned char *data = magellan->data; | 88 | unsigned char *data = magellan->data; |
90 | int i, t; | 89 | int i, t; |
91 | 90 | ||
@@ -138,9 +137,9 @@ static void magellan_disconnect(struct serio *serio) | |||
138 | { | 137 | { |
139 | struct magellan* magellan = serio_get_drvdata(serio); | 138 | struct magellan* magellan = serio_get_drvdata(serio); |
140 | 139 | ||
141 | input_unregister_device(&magellan->dev); | ||
142 | serio_close(serio); | 140 | serio_close(serio); |
143 | serio_set_drvdata(serio, NULL); | 141 | serio_set_drvdata(serio, NULL); |
142 | input_unregister_device(magellan->dev); | ||
144 | kfree(magellan); | 143 | kfree(magellan); |
145 | } | 144 | } |
146 | 145 | ||
@@ -153,52 +152,48 @@ static void magellan_disconnect(struct serio *serio) | |||
153 | static int magellan_connect(struct serio *serio, struct serio_driver *drv) | 152 | static int magellan_connect(struct serio *serio, struct serio_driver *drv) |
154 | { | 153 | { |
155 | struct magellan *magellan; | 154 | struct magellan *magellan; |
156 | int i, t; | 155 | struct input_dev *input_dev; |
157 | int err; | 156 | int err = -ENOMEM; |
158 | 157 | int i; | |
159 | if (!(magellan = kmalloc(sizeof(struct magellan), GFP_KERNEL))) | ||
160 | return -ENOMEM; | ||
161 | 158 | ||
162 | memset(magellan, 0, sizeof(struct magellan)); | 159 | magellan = kzalloc(sizeof(struct magellan), GFP_KERNEL); |
160 | input_dev = input_allocate_device(); | ||
161 | if (!magellan || !input_dev) | ||
162 | goto fail; | ||
163 | 163 | ||
164 | magellan->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | 164 | magellan->dev = input_dev; |
165 | sprintf(magellan->phys, "%s/input0", serio->phys); | ||
165 | 166 | ||
166 | for (i = 0; i < 9; i++) | 167 | input_dev->name = "LogiCad3D Magellan / SpaceMouse"; |
167 | set_bit(magellan_buttons[i], magellan->dev.keybit); | 168 | input_dev->phys = magellan->phys; |
169 | input_dev->id.bustype = BUS_RS232; | ||
170 | input_dev->id.vendor = SERIO_MAGELLAN; | ||
171 | input_dev->id.product = 0x0001; | ||
172 | input_dev->id.version = 0x0100; | ||
173 | input_dev->cdev.dev = &serio->dev; | ||
174 | input_dev->private = magellan; | ||
168 | 175 | ||
169 | for (i = 0; i < 6; i++) { | 176 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); |
170 | t = magellan_axes[i]; | ||
171 | set_bit(t, magellan->dev.absbit); | ||
172 | magellan->dev.absmin[t] = -360; | ||
173 | magellan->dev.absmax[t] = 360; | ||
174 | } | ||
175 | 177 | ||
176 | sprintf(magellan->phys, "%s/input0", serio->phys); | 178 | for (i = 0; i < 9; i++) |
179 | set_bit(magellan_buttons[i], input_dev->keybit); | ||
177 | 180 | ||
178 | init_input_dev(&magellan->dev); | 181 | for (i = 0; i < 6; i++) |
179 | magellan->dev.private = magellan; | 182 | input_set_abs_params(input_dev, magellan_axes[i], -360, 360, 0, 0); |
180 | magellan->dev.name = magellan_name; | ||
181 | magellan->dev.phys = magellan->phys; | ||
182 | magellan->dev.id.bustype = BUS_RS232; | ||
183 | magellan->dev.id.vendor = SERIO_MAGELLAN; | ||
184 | magellan->dev.id.product = 0x0001; | ||
185 | magellan->dev.id.version = 0x0100; | ||
186 | magellan->dev.dev = &serio->dev; | ||
187 | 183 | ||
188 | serio_set_drvdata(serio, magellan); | 184 | serio_set_drvdata(serio, magellan); |
189 | 185 | ||
190 | err = serio_open(serio, drv); | 186 | err = serio_open(serio, drv); |
191 | if (err) { | 187 | if (err) |
192 | serio_set_drvdata(serio, NULL); | 188 | goto fail; |
193 | kfree(magellan); | ||
194 | return err; | ||
195 | } | ||
196 | |||
197 | input_register_device(&magellan->dev); | ||
198 | |||
199 | printk(KERN_INFO "input: %s on %s\n", magellan_name, serio->phys); | ||
200 | 189 | ||
190 | input_register_device(magellan->dev); | ||
201 | return 0; | 191 | return 0; |
192 | |||
193 | fail: serio_set_drvdata(serio, NULL); | ||
194 | input_free_device(input_dev); | ||
195 | kfree(magellan); | ||
196 | return err; | ||
202 | } | 197 | } |
203 | 198 | ||
204 | /* | 199 | /* |