aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/joystick
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2013-02-20 01:05:39 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2013-02-20 01:05:39 -0500
commit2d9f0d964be94fd51c7303288c6f9c88bf2381fe (patch)
tree2631c3e82abc145a6e9c8e2c18687833c71de012 /drivers/input/joystick
parent9937c026820baabd1e908a9c1e6bdc846293000a (diff)
parent005a69d632cd8694061c2dd27492fe874780b5ee (diff)
Merge branch 'next' into for-linus
Prepare first set of updates for 3.9 merge window.
Diffstat (limited to 'drivers/input/joystick')
-rw-r--r--drivers/input/joystick/walkera0701.c82
1 files changed, 46 insertions, 36 deletions
diff --git a/drivers/input/joystick/walkera0701.c b/drivers/input/joystick/walkera0701.c
index f8f892b076e8..b76ac580703c 100644
--- a/drivers/input/joystick/walkera0701.c
+++ b/drivers/input/joystick/walkera0701.c
@@ -12,7 +12,7 @@
12 * the Free Software Foundation. 12 * the Free Software Foundation.
13*/ 13*/
14 14
15/* #define WK0701_DEBUG */ 15#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
16 16
17#define RESERVE 20000 17#define RESERVE 20000
18#define SYNC_PULSE 1306000 18#define SYNC_PULSE 1306000
@@ -67,6 +67,7 @@ static inline void walkera0701_parse_frame(struct walkera_dev *w)
67{ 67{
68 int i; 68 int i;
69 int val1, val2, val3, val4, val5, val6, val7, val8; 69 int val1, val2, val3, val4, val5, val6, val7, val8;
70 int magic, magic_bit;
70 int crc1, crc2; 71 int crc1, crc2;
71 72
72 for (crc1 = crc2 = i = 0; i < 10; i++) { 73 for (crc1 = crc2 = i = 0; i < 10; i++) {
@@ -102,17 +103,12 @@ static inline void walkera0701_parse_frame(struct walkera_dev *w)
102 val8 = (w->buf[18] & 1) << 8 | (w->buf[19] << 4) | w->buf[20]; 103 val8 = (w->buf[18] & 1) << 8 | (w->buf[19] << 4) | w->buf[20];
103 val8 *= (w->buf[18] & 2) - 1; /*sign */ 104 val8 *= (w->buf[18] & 2) - 1; /*sign */
104 105
105#ifdef WK0701_DEBUG 106 magic = (w->buf[21] << 4) | w->buf[22];
106 { 107 magic_bit = (w->buf[24] & 8) >> 3;
107 int magic, magic_bit; 108 pr_debug("%4d %4d %4d %4d %4d %4d %4d %4d (magic %2x %d)\n",
108 magic = (w->buf[21] << 4) | w->buf[22]; 109 val1, val2, val3, val4, val5, val6, val7, val8,
109 magic_bit = (w->buf[24] & 8) >> 3; 110 magic, magic_bit);
110 printk(KERN_DEBUG 111
111 "walkera0701: %4d %4d %4d %4d %4d %4d %4d %4d (magic %2x %d)\n",
112 val1, val2, val3, val4, val5, val6, val7, val8, magic,
113 magic_bit);
114 }
115#endif
116 input_report_abs(w->input_dev, ABS_X, val2); 112 input_report_abs(w->input_dev, ABS_X, val2);
117 input_report_abs(w->input_dev, ABS_Y, val1); 113 input_report_abs(w->input_dev, ABS_Y, val1);
118 input_report_abs(w->input_dev, ABS_Z, val6); 114 input_report_abs(w->input_dev, ABS_Z, val6);
@@ -187,6 +183,9 @@ static int walkera0701_open(struct input_dev *dev)
187{ 183{
188 struct walkera_dev *w = input_get_drvdata(dev); 184 struct walkera_dev *w = input_get_drvdata(dev);
189 185
186 if (parport_claim(w->pardevice))
187 return -EBUSY;
188
190 parport_enable_irq(w->parport); 189 parport_enable_irq(w->parport);
191 return 0; 190 return 0;
192} 191}
@@ -197,40 +196,51 @@ static void walkera0701_close(struct input_dev *dev)
197 196
198 parport_disable_irq(w->parport); 197 parport_disable_irq(w->parport);
199 hrtimer_cancel(&w->timer); 198 hrtimer_cancel(&w->timer);
199
200 parport_release(w->pardevice);
200} 201}
201 202
202static int walkera0701_connect(struct walkera_dev *w, int parport) 203static int walkera0701_connect(struct walkera_dev *w, int parport)
203{ 204{
204 int err = -ENODEV; 205 int error;
205 206
206 w->parport = parport_find_number(parport); 207 w->parport = parport_find_number(parport);
207 if (w->parport == NULL) 208 if (!w->parport) {
209 pr_err("parport %d does not exist\n", parport);
208 return -ENODEV; 210 return -ENODEV;
211 }
209 212
210 if (w->parport->irq == -1) { 213 if (w->parport->irq == -1) {
211 printk(KERN_ERR "walkera0701: parport without interrupt\n"); 214 pr_err("parport %d does not have interrupt assigned\n",
212 goto init_err; 215 parport);
216 error = -EINVAL;
217 goto err_put_parport;
213 } 218 }
214 219
215 err = -EBUSY;
216 w->pardevice = parport_register_device(w->parport, "walkera0701", 220 w->pardevice = parport_register_device(w->parport, "walkera0701",
217 NULL, NULL, walkera0701_irq_handler, 221 NULL, NULL, walkera0701_irq_handler,
218 PARPORT_DEV_EXCL, w); 222 PARPORT_DEV_EXCL, w);
219 if (!w->pardevice) 223 if (!w->pardevice) {
220 goto init_err; 224 pr_err("failed to register parport device\n");
221 225 error = -EIO;
222 if (parport_negotiate(w->pardevice->port, IEEE1284_MODE_COMPAT)) 226 goto err_put_parport;
223 goto init_err1; 227 }
224 228
225 if (parport_claim(w->pardevice)) 229 if (parport_negotiate(w->pardevice->port, IEEE1284_MODE_COMPAT)) {
226 goto init_err1; 230 pr_err("failed to negotiate parport mode\n");
231 error = -EIO;
232 goto err_unregister_device;
233 }
227 234
228 hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); 235 hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
229 w->timer.function = timer_handler; 236 w->timer.function = timer_handler;
230 237
231 w->input_dev = input_allocate_device(); 238 w->input_dev = input_allocate_device();
232 if (!w->input_dev) 239 if (!w->input_dev) {
233 goto init_err2; 240 pr_err("failed to allocate input device\n");
241 error = -ENOMEM;
242 goto err_unregister_device;
243 }
234 244
235 input_set_drvdata(w->input_dev, w); 245 input_set_drvdata(w->input_dev, w);
236 w->input_dev->name = "Walkera WK-0701 TX"; 246 w->input_dev->name = "Walkera WK-0701 TX";
@@ -241,6 +251,7 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
241 w->input_dev->id.vendor = 0x0001; 251 w->input_dev->id.vendor = 0x0001;
242 w->input_dev->id.product = 0x0001; 252 w->input_dev->id.product = 0x0001;
243 w->input_dev->id.version = 0x0100; 253 w->input_dev->id.version = 0x0100;
254 w->input_dev->dev.parent = w->parport->dev;
244 w->input_dev->open = walkera0701_open; 255 w->input_dev->open = walkera0701_open;
245 w->input_dev->close = walkera0701_close; 256 w->input_dev->close = walkera0701_close;
246 257
@@ -254,27 +265,26 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
254 input_set_abs_params(w->input_dev, ABS_RUDDER, -512, 512, 0, 0); 265 input_set_abs_params(w->input_dev, ABS_RUDDER, -512, 512, 0, 0);
255 input_set_abs_params(w->input_dev, ABS_MISC, -512, 512, 0, 0); 266 input_set_abs_params(w->input_dev, ABS_MISC, -512, 512, 0, 0);
256 267
257 err = input_register_device(w->input_dev); 268 error = input_register_device(w->input_dev);
258 if (err) 269 if (error) {
259 goto init_err3; 270 pr_err("failed to register input device\n");
271 goto err_free_input_dev;
272 }
260 273
261 return 0; 274 return 0;
262 275
263 init_err3: 276err_free_input_dev:
264 input_free_device(w->input_dev); 277 input_free_device(w->input_dev);
265 init_err2: 278err_unregister_device:
266 parport_release(w->pardevice);
267 init_err1:
268 parport_unregister_device(w->pardevice); 279 parport_unregister_device(w->pardevice);
269 init_err: 280err_put_parport:
270 parport_put_port(w->parport); 281 parport_put_port(w->parport);
271 return err; 282 return error;
272} 283}
273 284
274static void walkera0701_disconnect(struct walkera_dev *w) 285static void walkera0701_disconnect(struct walkera_dev *w)
275{ 286{
276 input_unregister_device(w->input_dev); 287 input_unregister_device(w->input_dev);
277 parport_release(w->pardevice);
278 parport_unregister_device(w->pardevice); 288 parport_unregister_device(w->pardevice);
279 parport_put_port(w->parport); 289 parport_put_port(w->parport);
280} 290}