Lines Matching full:hid
2 * HID over I2C protocol implementation
8 * This code is partly based on "USB HID support for Linux":
37 #include <linux/hid.h>
43 #include "../hid-ids.h"
44 #include "i2c-hid.h"
95 struct hid_device *hid; /* pointer to corresponding HID dev */ member
96 struct i2c_hid_desc hdesc; /* the HID Descriptor */
98 * register of the HID
156 * i2c_hid_lookup_quirk: return any quirks associated with a I2C HID device
336 * @ihid: the i2c hid device
341 * @do_set: true: use SET_REPORT HID command, false: send plain OUTPUT report
441 * The HID over I2C specification states that if a DEVICE needs time in i2c_hid_set_power()
573 if (ihid->hid->group != HID_GROUP_RMI) in i2c_hid_get_input()
576 hid_input_report(ihid->hid, HID_INPUT_REPORT, in i2c_hid_get_input()
602 static void i2c_hid_find_max_report(struct hid_device *hid, unsigned int type, in i2c_hid_find_max_report() argument
610 list_for_each_entry(report, &hid->report_enum[type].report_list, list) { in i2c_hid_find_max_report()
657 static int i2c_hid_get_raw_report(struct hid_device *hid, in i2c_hid_get_raw_report() argument
661 struct i2c_client *client = hid->driver_data; in i2c_hid_get_raw_report()
689 static int i2c_hid_output_raw_report(struct hid_device *hid, u8 report_type, in i2c_hid_output_raw_report() argument
692 struct i2c_client *client = hid->driver_data; in i2c_hid_output_raw_report()
721 static int i2c_hid_output_report(struct hid_device *hid, u8 *buf, size_t count) in i2c_hid_output_report() argument
723 return i2c_hid_output_raw_report(hid, HID_OUTPUT_REPORT, buf, count, in i2c_hid_output_report()
727 static int i2c_hid_raw_request(struct hid_device *hid, unsigned char reportnum, in i2c_hid_raw_request() argument
733 return i2c_hid_get_raw_report(hid, rtype, reportnum, buf, len); in i2c_hid_raw_request()
737 return i2c_hid_output_raw_report(hid, rtype, buf, len, true); in i2c_hid_raw_request()
743 static int i2c_hid_parse(struct hid_device *hid) in i2c_hid_parse() argument
745 struct i2c_client *client = hid->driver_data; in i2c_hid_parse()
779 i2c_hid_dbg(ihid, "Using a HID report descriptor override\n"); in i2c_hid_parse()
785 i2c_hid_dbg(ihid, "asking HID report descriptor\n"); in i2c_hid_parse()
791 hid_err(hid, "reading report descriptor failed\n"); in i2c_hid_parse()
798 ret = hid_parse_report(hid, rdesc, rsize); in i2c_hid_parse()
809 static int i2c_hid_start(struct hid_device *hid) in i2c_hid_start() argument
811 struct i2c_client *client = hid->driver_data; in i2c_hid_start()
816 i2c_hid_find_max_report(hid, HID_INPUT_REPORT, &bufsize); in i2c_hid_start()
817 i2c_hid_find_max_report(hid, HID_OUTPUT_REPORT, &bufsize); in i2c_hid_start()
818 i2c_hid_find_max_report(hid, HID_FEATURE_REPORT, &bufsize); in i2c_hid_start()
834 static void i2c_hid_stop(struct hid_device *hid) in i2c_hid_stop() argument
836 hid->claimed = 0; in i2c_hid_stop()
839 static int i2c_hid_open(struct hid_device *hid) in i2c_hid_open() argument
841 struct i2c_client *client = hid->driver_data; in i2c_hid_open()
848 static void i2c_hid_close(struct hid_device *hid) in i2c_hid_close() argument
850 struct i2c_client *client = hid->driver_data; in i2c_hid_close()
899 /* i2c hid fetch using a fixed descriptor size (30 bytes) */ in i2c_hid_fetch_hid_descriptor()
901 i2c_hid_dbg(ihid, "Using a HID descriptor override\n"); in i2c_hid_fetch_hid_descriptor()
905 i2c_hid_dbg(ihid, "Fetching the HID descriptor\n"); in i2c_hid_fetch_hid_descriptor()
912 "failed to fetch HID descriptor: %d\n", in i2c_hid_fetch_hid_descriptor()
918 /* Validate the length of HID descriptor, the 4 first bytes: in i2c_hid_fetch_hid_descriptor()
924 "unexpected HID descriptor bcdVersion (0x%04hx)\n", in i2c_hid_fetch_hid_descriptor()
933 "weird size of HID descriptor (%u)\n", dsize); in i2c_hid_fetch_hid_descriptor()
936 i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, &ihid->hdesc); in i2c_hid_fetch_hid_descriptor()
967 struct hid_device *hid = ihid->hid; in i2c_hid_core_suspend() local
970 ret = hid_driver_suspend(hid, PMSG_SUSPEND); in i2c_hid_core_suspend()
989 struct hid_device *hid = ihid->hid; in i2c_hid_core_resume() local
1025 return hid_driver_reset_resume(hid); in i2c_hid_core_resume()
1029 * Check that the device exists and parse the HID descriptor.
1034 struct hid_device *hid = ihid->hid; in __i2c_hid_core_probe() local
1046 "Failed to fetch the HID Descriptor\n"); in __i2c_hid_core_probe()
1050 hid->version = le16_to_cpu(ihid->hdesc.bcdVersion); in __i2c_hid_core_probe()
1051 hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID); in __i2c_hid_core_probe()
1052 hid->product = le16_to_cpu(ihid->hdesc.wProductID); in __i2c_hid_core_probe()
1054 hid->initial_quirks |= i2c_hid_get_dmi_quirks(hid->vendor, in __i2c_hid_core_probe()
1055 hid->product); in __i2c_hid_core_probe()
1057 snprintf(hid->name, sizeof(hid->name), "%s %04X:%04X", in __i2c_hid_core_probe()
1058 client->name, (u16)hid->vendor, (u16)hid->product); in __i2c_hid_core_probe()
1059 strscpy(hid->phys, dev_name(&client->dev), sizeof(hid->phys)); in __i2c_hid_core_probe()
1061 ihid->quirks = i2c_hid_lookup_quirk(hid->vendor, hid->product); in __i2c_hid_core_probe()
1069 struct hid_device *hid = ihid->hid; in i2c_hid_core_register_hid() local
1074 ret = hid_add_device(hid); in i2c_hid_core_register_hid()
1077 hid_err(client, "can't add hid device: %d\n", ret); in i2c_hid_core_register_hid()
1117 struct hid_device *hid = ihid->hid; in ihid_core_panel_prepare_work() local
1121 * hid->version is set on the first power up. If it's still zero then in ihid_core_panel_prepare_work()
1125 if (!hid->version) in ihid_core_panel_prepare_work()
1209 struct hid_device *hid; in i2c_hid_core_probe() local
1211 dbg_hid("HID probe called for i2c 0x%02x\n", client->addr); in i2c_hid_core_probe()
1215 "HID over i2c has not been provided an Int IRQ\n"); in i2c_hid_core_probe()
1222 "HID over i2c doesn't have a valid IRQ\n"); in i2c_hid_core_probe()
1250 hid = hid_allocate_device(); in i2c_hid_core_probe()
1251 if (IS_ERR(hid)) { in i2c_hid_core_probe()
1252 ret = PTR_ERR(hid); in i2c_hid_core_probe()
1256 ihid->hid = hid; in i2c_hid_core_probe()
1258 hid->driver_data = client; in i2c_hid_core_probe()
1259 hid->ll_driver = &i2c_hid_ll_driver; in i2c_hid_core_probe()
1260 hid->dev.parent = &client->dev; in i2c_hid_core_probe()
1261 hid->bus = BUS_I2C; in i2c_hid_core_probe()
1262 hid->initial_quirks = quirks; in i2c_hid_core_probe()
1298 hid_destroy_device(hid); in i2c_hid_core_probe()
1309 struct hid_device *hid; in i2c_hid_core_remove() local
1320 hid = ihid->hid; in i2c_hid_core_remove()
1321 hid_destroy_device(hid); in i2c_hid_core_remove()
1368 MODULE_DESCRIPTION("HID over I2C core driver");