@@ -589,6 +589,21 @@ static void atp_close(struct input_dev *input)
589
589
dev -> open = 0 ;
590
590
}
591
591
592
+ static int atp_handle_geyser (struct atp * dev )
593
+ {
594
+ struct usb_device * udev = dev -> udev ;
595
+
596
+ if (!atp_is_fountain (dev )) {
597
+ /* switch to raw sensor mode */
598
+ if (atp_geyser_init (udev ))
599
+ return - EIO ;
600
+
601
+ printk (KERN_INFO "appletouch: Geyser mode initialized.\n" );
602
+ }
603
+
604
+ return 0 ;
605
+ }
606
+
592
607
static int atp_probe (struct usb_interface * iface , const struct usb_device_id * id )
593
608
{
594
609
struct atp * dev ;
@@ -633,14 +648,6 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
633
648
else
634
649
dev -> datalen = 81 ;
635
650
636
- if (!atp_is_fountain (dev )) {
637
- /* switch to raw sensor mode */
638
- if (atp_geyser_init (udev ))
639
- goto err_free_devs ;
640
-
641
- printk (KERN_INFO "appletouch: Geyser mode initialized.\n" );
642
- }
643
-
644
651
dev -> urb = usb_alloc_urb (0 , GFP_KERNEL );
645
652
if (!dev -> urb )
646
653
goto err_free_devs ;
@@ -654,6 +661,10 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
654
661
usb_rcvintpipe (udev , int_in_endpointAddr ),
655
662
dev -> data , dev -> datalen , atp_complete , dev , 1 );
656
663
664
+ error = atp_handle_geyser (dev );
665
+ if (error )
666
+ goto err_free_buffer ;
667
+
657
668
usb_make_path (udev , dev -> phys , sizeof (dev -> phys ));
658
669
strlcat (dev -> phys , "/input0" , sizeof (dev -> phys ));
659
670
@@ -744,6 +755,20 @@ static void atp_disconnect(struct usb_interface *iface)
744
755
printk (KERN_INFO "input: appletouch disconnected\n" );
745
756
}
746
757
758
+ static int atp_recover (struct atp * dev )
759
+ {
760
+ int error ;
761
+
762
+ error = atp_handle_geyser (dev );
763
+ if (error )
764
+ return error ;
765
+
766
+ if (dev -> open && usb_submit_urb (dev -> urb , GFP_ATOMIC ))
767
+ return - EIO ;
768
+
769
+ return 0 ;
770
+ }
771
+
747
772
static int atp_suspend (struct usb_interface * iface , pm_message_t message )
748
773
{
749
774
struct atp * dev = usb_get_intfdata (iface );
@@ -764,12 +789,20 @@ static int atp_resume(struct usb_interface *iface)
764
789
return 0 ;
765
790
}
766
791
792
+ static int atp_reset_resume (struct usb_interface * iface )
793
+ {
794
+ struct atp * dev = usb_get_intfdata (iface );
795
+
796
+ return atp_recover (dev );
797
+ }
798
+
767
799
static struct usb_driver atp_driver = {
768
800
.name = "appletouch" ,
769
801
.probe = atp_probe ,
770
802
.disconnect = atp_disconnect ,
771
803
.suspend = atp_suspend ,
772
804
.resume = atp_resume ,
805
+ .reset_resume = atp_reset_resume ,
773
806
.id_table = atp_table ,
774
807
};
775
808
0 commit comments