dev->open = 0;
  }
  
 -      if (!atp_is_fountain(dev)) {
+ static int atp_handle_geyser(struct atp *dev)
+ {
+       struct usb_device *udev = dev->udev;
+ 
 -static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id)
++      if (dev->type != ATP_FOUNTAIN) {
+               /* 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;
        struct input_dev *input_dev;
  
        dev->udev = udev;
        dev->input = input_dev;
 -      dev->overflowwarn = 0;
 -      if (atp_is_geyser_3(dev))
 -              dev->datalen = 64;
 -      else if (atp_is_geyser_2(dev))
 -              dev->datalen = 64;
 -      else
 +      dev->type = id->driver_info;
 +      dev->overflow_warned = false;
 +      if (dev->type == ATP_FOUNTAIN || dev->type == ATP_GEYSER1)
                dev->datalen = 81;
 +      else
 +              dev->datalen = 64;
  
-       if (dev->type != ATP_FOUNTAIN) {
-               /* 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;