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:

committed by
Jiri Kosina

parent
48a732dfaa
commit
e90a6df80d
@@ -1243,6 +1243,18 @@ static int usbhid_power(struct hid_device *hid, int lvl)
|
|||||||
return r;
|
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 = {
|
static struct hid_ll_driver usb_hid_driver = {
|
||||||
.parse = usbhid_parse,
|
.parse = usbhid_parse,
|
||||||
.start = usbhid_start,
|
.start = usbhid_start,
|
||||||
@@ -1251,6 +1263,7 @@ static struct hid_ll_driver usb_hid_driver = {
|
|||||||
.close = usbhid_close,
|
.close = usbhid_close,
|
||||||
.power = usbhid_power,
|
.power = usbhid_power,
|
||||||
.hidinput_input_event = usb_hidinput_input_event,
|
.hidinput_input_event = usb_hidinput_input_event,
|
||||||
|
.request = usbhid_request,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
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)
|
* @hidinput_input_event: event input event (e.g. ff or leds)
|
||||||
* @parse: this method is called only once to parse the device data,
|
* @parse: this method is called only once to parse the device data,
|
||||||
* shouldn't allocate anything to not leak memory
|
* shouldn't allocate anything to not leak memory
|
||||||
|
* @request: send report request to device (e.g. feature report)
|
||||||
*/
|
*/
|
||||||
struct hid_ll_driver {
|
struct hid_ll_driver {
|
||||||
int (*start)(struct hid_device *hdev);
|
int (*start)(struct hid_device *hdev);
|
||||||
@@ -676,6 +677,10 @@ struct hid_ll_driver {
|
|||||||
unsigned int code, int value);
|
unsigned int code, int value);
|
||||||
|
|
||||||
int (*parse)(struct hid_device *hdev);
|
int (*parse)(struct hid_device *hdev);
|
||||||
|
|
||||||
|
void (*request)(struct hid_device *hdev,
|
||||||
|
struct hid_report *report, int reqtype);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define PM_HINT_FULLON 1<<5
|
#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;
|
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 hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
|
||||||
int interrupt);
|
int interrupt);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user