Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 98203
b: refs/heads/master
c: 90d95ef
h: refs/heads/master
i:
  98201: ea6a2c6
  98199: 339d5c2
v: v3
  • Loading branch information
Oliver Neukum authored and Dmitry Torokhov committed Jun 17, 2008
1 parent 70f9d89 commit 9169b37
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2f6a77d56523c14651236bc401a99b0e2aca2fdd
refs/heads/master: 90d95ef617a535a8832bdcb8dee07bf591e5dd82
49 changes: 41 additions & 8 deletions trunk/drivers/input/mouse/appletouch.c
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,21 @@ static void atp_close(struct input_dev *input)
dev->open = 0;
}

static int atp_handle_geyser(struct atp *dev)
{
struct usb_device *udev = dev->udev;

if (!atp_is_fountain(dev)) {
/* switch to raw sensor mode */
if (atp_geyser_init(udev))
return -EIO;

printk(KERN_INFO "appletouch: Geyser mode initialized.\n");
}

return 0;
}

static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id)
{
struct atp *dev;
Expand Down Expand Up @@ -633,14 +648,6 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
else
dev->datalen = 81;

if (!atp_is_fountain(dev)) {
/* switch to raw sensor mode */
if (atp_geyser_init(udev))
goto err_free_devs;

printk(KERN_INFO "appletouch: Geyser mode initialized.\n");
}

dev->urb = usb_alloc_urb(0, GFP_KERNEL);
if (!dev->urb)
goto err_free_devs;
Expand All @@ -654,6 +661,10 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
usb_rcvintpipe(udev, int_in_endpointAddr),
dev->data, dev->datalen, atp_complete, dev, 1);

error = atp_handle_geyser(dev);
if (error)
goto err_free_buffer;

usb_make_path(udev, dev->phys, sizeof(dev->phys));
strlcat(dev->phys, "/input0", sizeof(dev->phys));

Expand Down Expand Up @@ -744,6 +755,20 @@ static void atp_disconnect(struct usb_interface *iface)
printk(KERN_INFO "input: appletouch disconnected\n");
}

static int atp_recover(struct atp *dev)
{
int error;

error = atp_handle_geyser(dev);
if (error)
return error;

if (dev->open && usb_submit_urb(dev->urb, GFP_ATOMIC))
return -EIO;

return 0;
}

static int atp_suspend(struct usb_interface *iface, pm_message_t message)
{
struct atp *dev = usb_get_intfdata(iface);
Expand All @@ -764,12 +789,20 @@ static int atp_resume(struct usb_interface *iface)
return 0;
}

static int atp_reset_resume(struct usb_interface *iface)
{
struct atp *dev = usb_get_intfdata(iface);

return atp_recover(dev);
}

static struct usb_driver atp_driver = {
.name = "appletouch",
.probe = atp_probe,
.disconnect = atp_disconnect,
.suspend = atp_suspend,
.resume = atp_resume,
.reset_resume = atp_reset_resume,
.id_table = atp_table,
};

Expand Down
3 changes: 3 additions & 0 deletions trunk/drivers/usb/core/quirks.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ static const struct usb_device_id usb_quirk_list[] = {
/* Edirol SD-20 */
{ USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME },

/* appletouch */
{ USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME },

/* M-Systems Flash Disk Pioneers */
{ USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },

Expand Down

0 comments on commit 9169b37

Please sign in to comment.