aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/usbhid/hid-core.c15
-rw-r--r--include/linux/hid.h19
2 files changed, 34 insertions, 0 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 420466bc481a..effcd3d6f5cf 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -1253,6 +1253,20 @@ static void usbhid_request(struct hid_device *hid, struct hid_report *rep, int r
1253 } 1253 }
1254} 1254}
1255 1255
1256static int usbhid_idle(struct hid_device *hid, int report, int idle,
1257 int reqtype)
1258{
1259 struct usb_device *dev = hid_to_usb_dev(hid);
1260 struct usb_interface *intf = to_usb_interface(hid->dev.parent);
1261 struct usb_host_interface *interface = intf->cur_altsetting;
1262 int ifnum = interface->desc.bInterfaceNumber;
1263
1264 if (reqtype != HID_REQ_SET_IDLE)
1265 return -EINVAL;
1266
1267 return hid_set_idle(dev, ifnum, report, idle);
1268}
1269
1256static struct hid_ll_driver usb_hid_driver = { 1270static struct hid_ll_driver usb_hid_driver = {
1257 .parse = usbhid_parse, 1271 .parse = usbhid_parse,
1258 .start = usbhid_start, 1272 .start = usbhid_start,
@@ -1263,6 +1277,7 @@ static struct hid_ll_driver usb_hid_driver = {
1263 .hidinput_input_event = usb_hidinput_input_event, 1277 .hidinput_input_event = usb_hidinput_input_event,
1264 .request = usbhid_request, 1278 .request = usbhid_request,
1265 .wait = usbhid_wait_io, 1279 .wait = usbhid_wait_io,
1280 .idle = usbhid_idle,
1266}; 1281};
1267 1282
1268static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id) 1283static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id)
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 7071eb3d36c7..863744c38ddc 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -664,6 +664,7 @@ struct hid_driver {
664 * shouldn't allocate anything to not leak memory 664 * shouldn't allocate anything to not leak memory
665 * @request: send report request to device (e.g. feature report) 665 * @request: send report request to device (e.g. feature report)
666 * @wait: wait for buffered io to complete (send/recv reports) 666 * @wait: wait for buffered io to complete (send/recv reports)
667 * @idle: send idle request to device
667 */ 668 */
668struct hid_ll_driver { 669struct hid_ll_driver {
669 int (*start)(struct hid_device *hdev); 670 int (*start)(struct hid_device *hdev);
@@ -683,6 +684,7 @@ struct hid_ll_driver {
683 struct hid_report *report, int reqtype); 684 struct hid_report *report, int reqtype);
684 685
685 int (*wait)(struct hid_device *hdev); 686 int (*wait)(struct hid_device *hdev);
687 int (*idle)(struct hid_device *hdev, int report, int idle, int reqtype);
686 688
687}; 689};
688 690
@@ -907,6 +909,23 @@ static inline void hid_hw_request(struct hid_device *hdev,
907} 909}
908 910
909/** 911/**
912 * hid_hw_idle - send idle request to device
913 *
914 * @hdev: hid device
915 * @report: report to control
916 * @idle: idle state
917 * @reqtype: hid request type
918 */
919static inline int hid_hw_idle(struct hid_device *hdev, int report, int idle,
920 int reqtype)
921{
922 if (hdev->ll_driver->idle)
923 return hdev->ll_driver->idle(hdev, report, idle, reqtype);
924
925 return 0;
926}
927
928/**
910 * hid_hw_wait - wait for buffered io to complete 929 * hid_hw_wait - wait for buffered io to complete
911 * 930 *
912 * @hdev: hid device 931 * @hdev: hid device