Skip to content

Commit

Permalink
HID: Extend the interface with report requests
Browse files Browse the repository at this point in the history
Some drivers send reports directly to underlying device, creating an
unwanted dependency on the underlying transport layer. This patch adds
hid_hw_request() to the interface, thereby removing usbhid from the
lion share of the drivers.

Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
  • Loading branch information
Henrik Rydberg authored and Jiri Kosina committed Feb 25, 2013
1 parent 48a732d commit e90a6df
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
13 changes: 13 additions & 0 deletions drivers/hid/usbhid/hid-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1243,6 +1243,18 @@ static int usbhid_power(struct hid_device *hid, int lvl)
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 struct hid_ll_driver usb_hid_driver = {
.parse = usbhid_parse,
.start = usbhid_start,
Expand All @@ -1251,6 +1263,7 @@ static struct hid_ll_driver usb_hid_driver = {
.close = usbhid_close,
.power = usbhid_power,
.hidinput_input_event = usb_hidinput_input_event,
.request = usbhid_request,
};

static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id)
Expand Down
20 changes: 20 additions & 0 deletions include/linux/hid.h
Original file line number Diff line number Diff line change
Expand Up @@ -662,6 +662,7 @@ struct hid_driver {
* @hidinput_input_event: event input event (e.g. ff or leds)
* @parse: this method is called only once to parse the device data,
* shouldn't allocate anything to not leak memory
* @request: send report request to device (e.g. feature report)
*/
struct hid_ll_driver {
int (*start)(struct hid_device *hdev);
Expand All @@ -676,6 +677,10 @@ struct hid_ll_driver {
unsigned int code, int value);

int (*parse)(struct hid_device *hdev);

void (*request)(struct hid_device *hdev,
struct hid_report *report, int reqtype);

};

#define PM_HINT_FULLON 1<<5
Expand Down Expand Up @@ -883,6 +888,21 @@ static inline int hid_hw_power(struct hid_device *hdev, int level)
return hdev->ll_driver->power ? hdev->ll_driver->power(hdev, level) : 0;
}


/**
* hid_hw_request - send report request to device
*
* @hdev: hid device
* @report: report to send
* @reqtype: hid request type
*/
static inline void hid_hw_request(struct hid_device *hdev,
struct hid_report *report, int reqtype)
{
if (hdev->ll_driver->request)
hdev->ll_driver->request(hdev, report, reqtype);
}

int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
int interrupt);

Expand Down

0 comments on commit e90a6df

Please sign in to comment.