Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 30 Apr 2013 16:37:55 +0000 (09:37 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 30 Apr 2013 16:37:55 +0000 (09:37 -0700)
Pull HID updates from Jiri Kosina:

 - hid driver transport cleanup, finalizing the long-desired decoupling
   of core from transport layers, by Benjamin Tissoires and Henrik
   Rydberg

 - support for hybrid finger/pen multitouch HID devices, by Benjamin
   Tissoires

 - fix for long-standing issue in Logitech unifying driver sometimes not
   inializing properly due to device specifics, by Andrew de los Reyes

 - Wii remote driver updates to support 2nd generation of devices, by
   David Herrmann

 - support for Apple IR remote

 - roccat driver now supports new devices (Roccat Kone Pure, IskuFX), by
   Stefan Achatz

 - debugfs locking fixes in hid debug interface, by Jiri Kosina

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: (43 commits)
  HID: protect hid_debug_list
  HID: debug: break out hid_dump_report() into hid-debug
  HID: Add PID for Japanese version of NE4K keyboard
  HID: hid-lg4ff add support for new version of DFGT wheel
  HID: icade: u16 which never < 0
  HID: clarify Magic Mouse Kconfig description
  HID: appleir: add support for Apple ir devices
  HID: roccat: added media key support for Kone
  HID: hid-lenovo-tpkbd: remove doubled hid_get_drvdata
  HID: i2c-hid: fix length for set/get report in i2c hid
  HID: wiimote: parse reduced status reports
  HID: wiimote: add 2nd generation Wii Remote IDs
  HID: wiimote: use unique battery names
  HID: hidraw: warn if userspace headers are outdated
  HID: multitouch: force BTN_STYLUS for pen devices
  HID: multitouch: append " Pen" to the name of the stylus input
  HID: multitouch: add handling for pen in dual-sensors device
  HID: multitouch: change touch sensor detection in mt_input_configured()
  HID: multitouch: do not map usage from non used reports
  HID: multitouch: breaks out touch handling in specific functions
  ...

1  2 
drivers/hid/usbhid/hid-core.c

@@@ -639,7 -639,7 +639,7 @@@ static void __usbhid_submit_report(stru
        }
  }
  
- void usbhid_submit_report(struct hid_device *hid, struct hid_report *report, unsigned char dir)
static void usbhid_submit_report(struct hid_device *hid, struct hid_report *report, unsigned char dir)
  {
        struct usbhid_device *usbhid = hid->driver_data;
        unsigned long flags;
        __usbhid_submit_report(hid, report, dir);
        spin_unlock_irqrestore(&usbhid->lock, flags);
  }
- EXPORT_SYMBOL_GPL(usbhid_submit_report);
  
  /* Workqueue routine to send requests to change LEDs */
  static void hid_led(struct work_struct *work)
@@@ -706,7 -705,7 +705,7 @@@ static int usb_hidinput_input_event(str
        return 0;
  }
  
- int usbhid_wait_io(struct hid_device *hid)
static int usbhid_wait_io(struct hid_device *hid)
  {
        struct usbhid_device *usbhid = hid->driver_data;
  
  
        return 0;
  }
- EXPORT_SYMBOL_GPL(usbhid_wait_io);
  
  static int hid_set_idle(struct usb_device *dev, int ifnum, int report, int idle)
  {
@@@ -1243,6 -1241,32 +1241,32 @@@ static int usbhid_power(struct hid_devi
        return r;
  }
  
+ static void usbhid_request(struct hid_device *hid, struct hid_report *rep, int reqtype)
+ {
+       switch (reqtype) {
+       case HID_REQ_GET_REPORT:
+               usbhid_submit_report(hid, rep, USB_DIR_IN);
+               break;
+       case HID_REQ_SET_REPORT:
+               usbhid_submit_report(hid, rep, USB_DIR_OUT);
+               break;
+       }
+ }
+ static int usbhid_idle(struct hid_device *hid, int report, int idle,
+               int reqtype)
+ {
+       struct usb_device *dev = hid_to_usb_dev(hid);
+       struct usb_interface *intf = to_usb_interface(hid->dev.parent);
+       struct usb_host_interface *interface = intf->cur_altsetting;
+       int ifnum = interface->desc.bInterfaceNumber;
+       if (reqtype != HID_REQ_SET_IDLE)
+               return -EINVAL;
+       return hid_set_idle(dev, ifnum, report, idle);
+ }
  static struct hid_ll_driver usb_hid_driver = {
        .parse = usbhid_parse,
        .start = usbhid_start,
        .close = usbhid_close,
        .power = usbhid_power,
        .hidinput_input_event = usb_hidinput_input_event,
+       .request = usbhid_request,
+       .wait = usbhid_wait_io,
+       .idle = usbhid_idle,
  };
  
  static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id)
@@@ -1493,7 -1520,7 +1520,7 @@@ static int hid_suspend(struct usb_inter
  {
        struct hid_device *hid = usb_get_intfdata(intf);
        struct usbhid_device *usbhid = hid->driver_data;
 -      int status;
 +      int status = 0;
        bool driver_suspended = false;
  
        if (PMSG_IS_AUTO(message)) {
                }
  
        } else {
 -              if (hid->driver && hid->driver->suspend) {
 +              /* TODO: resume() might need to handle suspend failure */
 +              if (hid->driver && hid->driver->suspend)
                        status = hid->driver->suspend(hid, message);
 -                      if (status < 0)
 -                              return status;
 -              }
                driver_suspended = true;
                spin_lock_irq(&usbhid->lock);
                set_bit(HID_SUSPENDED, &usbhid->iofl);
                spin_unlock_irq(&usbhid->lock);
 -              if (usbhid_wait_io(hid) < 0) {
 +              if (usbhid_wait_io(hid) < 0)
                        status = -EIO;
 -                      goto failed;
 -              }
        }
  
        hid_cancel_delayed_stuff(usbhid);
                goto failed;
        }
        dev_dbg(&intf->dev, "suspend\n");
 -      return 0;
 +      return status;
  
   failed:
        hid_resume_common(hid, driver_suspended);