@@ -80,7 +80,8 @@ struct w8001_touch_query {
80
80
*/
81
81
82
82
struct w8001 {
83
- struct input_dev * dev ;
83
+ struct input_dev * pen_dev ;
84
+ struct input_dev * touch_dev ;
84
85
struct serio * serio ;
85
86
struct completion cmd_done ;
86
87
int id ;
@@ -95,7 +96,10 @@ struct w8001 {
95
96
u16 max_touch_y ;
96
97
u16 max_pen_x ;
97
98
u16 max_pen_y ;
98
- char name [64 ];
99
+ char pen_name [64 ];
100
+ char touch_name [64 ];
101
+ int open_count ;
102
+ struct mutex mutex ;
99
103
};
100
104
101
105
static void parse_pen_data (u8 * data , struct w8001_coord * coord )
@@ -141,7 +145,7 @@ static void scale_touch_coordinates(struct w8001 *w8001,
141
145
142
146
static void parse_multi_touch (struct w8001 * w8001 )
143
147
{
144
- struct input_dev * dev = w8001 -> dev ;
148
+ struct input_dev * dev = w8001 -> touch_dev ;
145
149
unsigned char * data = w8001 -> data ;
146
150
unsigned int x , y ;
147
151
int i ;
@@ -207,7 +211,7 @@ static void parse_touchquery(u8 *data, struct w8001_touch_query *query)
207
211
208
212
static void report_pen_events (struct w8001 * w8001 , struct w8001_coord * coord )
209
213
{
210
- struct input_dev * dev = w8001 -> dev ;
214
+ struct input_dev * dev = w8001 -> pen_dev ;
211
215
212
216
/*
213
217
* We have 1 bit for proximity (rdy) and 3 bits for tip, side,
@@ -233,11 +237,6 @@ static void report_pen_events(struct w8001 *w8001, struct w8001_coord *coord)
233
237
break ;
234
238
235
239
case BTN_TOOL_FINGER :
236
- input_report_key (dev , BTN_TOUCH , 0 );
237
- input_report_key (dev , BTN_TOOL_FINGER , 0 );
238
- input_sync (dev );
239
- /* fall through */
240
-
241
240
case KEY_RESERVED :
242
241
w8001 -> type = coord -> f2 ? BTN_TOOL_RUBBER : BTN_TOOL_PEN ;
243
242
break ;
@@ -261,7 +260,7 @@ static void report_pen_events(struct w8001 *w8001, struct w8001_coord *coord)
261
260
262
261
static void report_single_touch (struct w8001 * w8001 , struct w8001_coord * coord )
263
262
{
264
- struct input_dev * dev = w8001 -> dev ;
263
+ struct input_dev * dev = w8001 -> touch_dev ;
265
264
unsigned int x = coord -> x ;
266
265
unsigned int y = coord -> y ;
267
266
@@ -271,7 +270,6 @@ static void report_single_touch(struct w8001 *w8001, struct w8001_coord *coord)
271
270
input_report_abs (dev , ABS_X , x );
272
271
input_report_abs (dev , ABS_Y , y );
273
272
input_report_key (dev , BTN_TOUCH , coord -> tsw );
274
- input_report_key (dev , BTN_TOOL_FINGER , coord -> tsw );
275
273
276
274
input_sync (dev );
277
275
@@ -369,20 +367,36 @@ static int w8001_command(struct w8001 *w8001, unsigned char command,
369
367
static int w8001_open (struct input_dev * dev )
370
368
{
371
369
struct w8001 * w8001 = input_get_drvdata (dev );
370
+ int err ;
371
+
372
+ err = mutex_lock_interruptible (& w8001 -> mutex );
373
+ if (err )
374
+ return err ;
375
+
376
+ if (w8001 -> open_count ++ == 0 ) {
377
+ err = w8001_command (w8001 , W8001_CMD_START , false);
378
+ if (err )
379
+ w8001 -> open_count -- ;
380
+ }
372
381
373
- return w8001_command (w8001 , W8001_CMD_START , false);
382
+ mutex_unlock (& w8001 -> mutex );
383
+ return err ;
374
384
}
375
385
376
386
static void w8001_close (struct input_dev * dev )
377
387
{
378
388
struct w8001 * w8001 = input_get_drvdata (dev );
379
389
380
- w8001_command (w8001 , W8001_CMD_STOP , false);
390
+ mutex_lock (& w8001 -> mutex );
391
+
392
+ if (-- w8001 -> open_count == 0 )
393
+ w8001_command (w8001 , W8001_CMD_STOP , false);
394
+
395
+ mutex_unlock (& w8001 -> mutex );
381
396
}
382
397
383
398
static int w8001_detect (struct w8001 * w8001 )
384
399
{
385
- struct input_dev * dev = w8001 -> dev ;
386
400
int error ;
387
401
388
402
error = w8001_command (w8001 , W8001_CMD_STOP , false);
@@ -391,18 +405,13 @@ static int w8001_detect(struct w8001 *w8001)
391
405
392
406
msleep (250 ); /* wait 250ms before querying the device */
393
407
394
- __set_bit (EV_KEY , dev -> evbit );
395
- __set_bit (EV_ABS , dev -> evbit );
396
- strlcat (w8001 -> name , "Wacom Serial" , sizeof (w8001 -> name ));
397
-
398
- __set_bit (INPUT_PROP_DIRECT , dev -> propbit );
399
-
400
408
return 0 ;
401
409
}
402
410
403
- static int w8001_setup_pen (struct w8001 * w8001 )
411
+ static int w8001_setup_pen (struct w8001 * w8001 , char * basename ,
412
+ size_t basename_sz )
404
413
{
405
- struct input_dev * dev = w8001 -> dev ;
414
+ struct input_dev * dev = w8001 -> pen_dev ;
406
415
struct w8001_coord coord ;
407
416
int error ;
408
417
@@ -411,11 +420,14 @@ static int w8001_setup_pen(struct w8001 *w8001)
411
420
if (error )
412
421
return error ;
413
422
423
+ __set_bit (EV_KEY , dev -> evbit );
424
+ __set_bit (EV_ABS , dev -> evbit );
414
425
__set_bit (BTN_TOUCH , dev -> keybit );
415
426
__set_bit (BTN_TOOL_PEN , dev -> keybit );
416
427
__set_bit (BTN_TOOL_RUBBER , dev -> keybit );
417
428
__set_bit (BTN_STYLUS , dev -> keybit );
418
429
__set_bit (BTN_STYLUS2 , dev -> keybit );
430
+ __set_bit (INPUT_PROP_DIRECT , dev -> propbit );
419
431
420
432
parse_pen_data (w8001 -> response , & coord );
421
433
w8001 -> max_pen_x = coord .x ;
@@ -432,17 +444,19 @@ static int w8001_setup_pen(struct w8001 *w8001)
432
444
}
433
445
434
446
w8001 -> id = 0x90 ;
435
- strlcat (w8001 -> name , " Penabled" , sizeof ( w8001 -> name ) );
447
+ strlcat (basename , " Penabled" , basename_sz );
436
448
437
449
return 0 ;
438
450
}
439
451
440
- static int w8001_setup_touch (struct w8001 * w8001 )
452
+ static int w8001_setup_touch (struct w8001 * w8001 , char * basename ,
453
+ size_t basename_sz )
441
454
{
442
- struct input_dev * dev = w8001 -> dev ;
455
+ struct input_dev * dev = w8001 -> touch_dev ;
443
456
struct w8001_touch_query touch ;
444
457
int error ;
445
458
459
+
446
460
/* Touch enabled? */
447
461
error = w8001_command (w8001 , W8001_CMD_TOUCHQUERY , true);
448
462
if (error )
@@ -454,8 +468,10 @@ static int w8001_setup_touch(struct w8001 *w8001)
454
468
if (!w8001 -> response [1 ])
455
469
return - ENXIO ;
456
470
471
+ __set_bit (EV_KEY , dev -> evbit );
472
+ __set_bit (EV_ABS , dev -> evbit );
457
473
__set_bit (BTN_TOUCH , dev -> keybit );
458
- __set_bit (BTN_TOOL_FINGER , dev -> keybit );
474
+ __set_bit (INPUT_PROP_DIRECT , dev -> propbit );
459
475
460
476
parse_touchquery (w8001 -> response , & touch );
461
477
w8001 -> max_touch_x = touch .x ;
@@ -478,14 +494,14 @@ static int w8001_setup_touch(struct w8001 *w8001)
478
494
case 2 :
479
495
w8001 -> pktlen = W8001_PKTLEN_TOUCH93 ;
480
496
w8001 -> id = 0x93 ;
481
- strlcat (w8001 -> name , " 1FG" , sizeof ( w8001 -> name ) );
497
+ strlcat (basename , " 1FG" , basename_sz );
482
498
break ;
483
499
484
500
case 1 :
485
501
case 3 :
486
502
case 4 :
487
503
w8001 -> pktlen = W8001_PKTLEN_TOUCH9A ;
488
- strlcat (w8001 -> name , " 1FG" , sizeof ( w8001 -> name ) );
504
+ strlcat (basename , " 1FG" , basename_sz );
489
505
w8001 -> id = 0x9a ;
490
506
break ;
491
507
@@ -501,19 +517,35 @@ static int w8001_setup_touch(struct w8001 *w8001)
501
517
input_set_abs_params (dev , ABS_MT_TOOL_TYPE ,
502
518
0 , MT_TOOL_MAX , 0 , 0 );
503
519
504
- strlcat (w8001 -> name , " 2FG" , sizeof ( w8001 -> name ) );
520
+ strlcat (basename , " 2FG" , basename_sz );
505
521
if (w8001 -> max_pen_x && w8001 -> max_pen_y )
506
522
w8001 -> id = 0xE3 ;
507
523
else
508
524
w8001 -> id = 0xE2 ;
509
525
break ;
510
526
}
511
527
512
- strlcat (w8001 -> name , " Touchscreen" , sizeof ( w8001 -> name ) );
528
+ strlcat (basename , " Touchscreen" , basename_sz );
513
529
514
530
return 0 ;
515
531
}
516
532
533
+ static void w8001_set_devdata (struct input_dev * dev , struct w8001 * w8001 ,
534
+ struct serio * serio )
535
+ {
536
+ dev -> phys = w8001 -> phys ;
537
+ dev -> id .bustype = BUS_RS232 ;
538
+ dev -> id .product = w8001 -> id ;
539
+ dev -> id .vendor = 0x056a ;
540
+ dev -> id .version = 0x0100 ;
541
+ dev -> open = w8001_open ;
542
+ dev -> close = w8001_close ;
543
+
544
+ dev -> dev .parent = & serio -> dev ;
545
+
546
+ input_set_drvdata (dev , w8001 );
547
+ }
548
+
517
549
/*
518
550
* w8001_disconnect() is the opposite of w8001_connect()
519
551
*/
@@ -524,7 +556,10 @@ static void w8001_disconnect(struct serio *serio)
524
556
525
557
serio_close (serio );
526
558
527
- input_unregister_device (w8001 -> dev );
559
+ if (w8001 -> pen_dev )
560
+ input_unregister_device (w8001 -> pen_dev );
561
+ if (w8001 -> touch_dev )
562
+ input_unregister_device (w8001 -> touch_dev );
528
563
kfree (w8001 );
529
564
530
565
serio_set_drvdata (serio , NULL );
@@ -539,18 +574,23 @@ static void w8001_disconnect(struct serio *serio)
539
574
static int w8001_connect (struct serio * serio , struct serio_driver * drv )
540
575
{
541
576
struct w8001 * w8001 ;
542
- struct input_dev * input_dev ;
577
+ struct input_dev * input_dev_pen ;
578
+ struct input_dev * input_dev_touch ;
579
+ char basename [64 ];
543
580
int err , err_pen , err_touch ;
544
581
545
582
w8001 = kzalloc (sizeof (struct w8001 ), GFP_KERNEL );
546
- input_dev = input_allocate_device ();
547
- if (!w8001 || !input_dev ) {
583
+ input_dev_pen = input_allocate_device ();
584
+ input_dev_touch = input_allocate_device ();
585
+ if (!w8001 || !input_dev_pen || !input_dev_touch ) {
548
586
err = - ENOMEM ;
549
587
goto fail1 ;
550
588
}
551
589
552
590
w8001 -> serio = serio ;
553
- w8001 -> dev = input_dev ;
591
+ w8001 -> pen_dev = input_dev_pen ;
592
+ w8001 -> touch_dev = input_dev_touch ;
593
+ mutex_init (& w8001 -> mutex );
554
594
init_completion (& w8001 -> cmd_done );
555
595
snprintf (w8001 -> phys , sizeof (w8001 -> phys ), "%s/input0" , serio -> phys );
556
596
@@ -563,38 +603,63 @@ static int w8001_connect(struct serio *serio, struct serio_driver *drv)
563
603
if (err )
564
604
goto fail3 ;
565
605
566
- err_pen = w8001_setup_pen (w8001 );
567
- err_touch = w8001_setup_touch (w8001 );
606
+ /* For backwards-compatibility we compose the basename based on
607
+ * capabilities and then just append the tool type
608
+ */
609
+ strlcpy (basename , "Wacom Serial" , sizeof (basename ));
610
+
611
+ err_pen = w8001_setup_pen (w8001 , basename , sizeof (basename ));
612
+ err_touch = w8001_setup_touch (w8001 , basename , sizeof (basename ));
568
613
if (err_pen && err_touch ) {
569
614
err = - ENXIO ;
570
615
goto fail3 ;
571
616
}
572
617
573
- input_dev -> name = w8001 -> name ;
574
- input_dev -> phys = w8001 -> phys ;
575
- input_dev -> id .product = w8001 -> id ;
576
- input_dev -> id .bustype = BUS_RS232 ;
577
- input_dev -> id .vendor = 0x056a ;
578
- input_dev -> id .version = 0x0100 ;
579
- input_dev -> dev .parent = & serio -> dev ;
618
+ if (!err_pen ) {
619
+ strlcpy (w8001 -> pen_name , basename , sizeof (w8001 -> pen_name ));
620
+ strlcat (w8001 -> pen_name , " Pen" , sizeof (w8001 -> pen_name ));
621
+ input_dev_pen -> name = w8001 -> pen_name ;
580
622
581
- input_dev -> open = w8001_open ;
582
- input_dev -> close = w8001_close ;
623
+ w8001_set_devdata (input_dev_pen , w8001 , serio );
583
624
584
- input_set_drvdata (input_dev , w8001 );
625
+ err = input_register_device (w8001 -> pen_dev );
626
+ if (err )
627
+ goto fail3 ;
628
+ } else {
629
+ input_free_device (input_dev_pen );
630
+ input_dev_pen = NULL ;
631
+ w8001 -> pen_dev = NULL ;
632
+ }
585
633
586
- err = input_register_device (w8001 -> dev );
587
- if (err )
588
- goto fail3 ;
634
+ if (!err_touch ) {
635
+ strlcpy (w8001 -> touch_name , basename , sizeof (w8001 -> touch_name ));
636
+ strlcat (w8001 -> touch_name , " Finger" ,
637
+ sizeof (w8001 -> touch_name ));
638
+ input_dev_touch -> name = w8001 -> touch_name ;
639
+
640
+ w8001_set_devdata (input_dev_touch , w8001 , serio );
641
+
642
+ err = input_register_device (w8001 -> touch_dev );
643
+ if (err )
644
+ goto fail4 ;
645
+ } else {
646
+ input_free_device (input_dev_touch );
647
+ input_dev_touch = NULL ;
648
+ w8001 -> touch_dev = NULL ;
649
+ }
589
650
590
651
return 0 ;
591
652
653
+ fail4 :
654
+ if (w8001 -> pen_dev )
655
+ input_unregister_device (w8001 -> pen_dev );
592
656
fail3 :
593
657
serio_close (serio );
594
658
fail2 :
595
659
serio_set_drvdata (serio , NULL );
596
660
fail1 :
597
- input_free_device (input_dev );
661
+ input_free_device (input_dev_pen );
662
+ input_free_device (input_dev_touch );
598
663
kfree (w8001 );
599
664
return err ;
600
665
}
0 commit comments