HID: Extend the interface with report requests
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>
This commit is contained in:
parent
48a732dfaa
commit
e90a6df80d
|
@ -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,
|
||||
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue