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"
93 struct hid_device *hid; /* pointer to corresponding HID dev */ member
94 struct i2c_hid_desc hdesc; /* the HID Descriptor */
96 * register of the HID
146 * i2c_hid_lookup_quirk: return any quirks associated with a I2C HID device
304 * @ihid: the i2c hid device
309 * @do_set: true: use SET_REPORT HID command, false: send plain OUTPUT report
408 * The HID over I2C specification states that if a DEVICE needs time in i2c_hid_set_power()
547 if (ihid->hid->group != HID_GROUP_RMI) in i2c_hid_get_input()
550 hid_input_report(ihid->hid, HID_INPUT_REPORT, in i2c_hid_get_input()
576 static void i2c_hid_find_max_report(struct hid_device *hid, unsigned int type, in i2c_hid_find_max_report() argument
584 list_for_each_entry(report, &hid->report_enum[type].report_list, list) { in i2c_hid_find_max_report()
631 static int i2c_hid_get_raw_report(struct hid_device *hid, in i2c_hid_get_raw_report() argument
635 struct i2c_client *client = hid->driver_data; in i2c_hid_get_raw_report()
663 static int i2c_hid_output_raw_report(struct hid_device *hid, u8 report_type, in i2c_hid_output_raw_report() argument
666 struct i2c_client *client = hid->driver_data; in i2c_hid_output_raw_report()
695 static int i2c_hid_output_report(struct hid_device *hid, u8 *buf, size_t count) in i2c_hid_output_report() argument
697 return i2c_hid_output_raw_report(hid, HID_OUTPUT_REPORT, buf, count, in i2c_hid_output_report()
701 static int i2c_hid_raw_request(struct hid_device *hid, unsigned char reportnum, in i2c_hid_raw_request() argument
707 return i2c_hid_get_raw_report(hid, rtype, reportnum, buf, len); in i2c_hid_raw_request()
711 return i2c_hid_output_raw_report(hid, rtype, buf, len, true); in i2c_hid_raw_request()
717 static int i2c_hid_parse(struct hid_device *hid) in i2c_hid_parse() argument
719 struct i2c_client *client = hid->driver_data; in i2c_hid_parse()
750 i2c_hid_dbg(ihid, "Using a HID report descriptor override\n"); in i2c_hid_parse()
759 i2c_hid_dbg(ihid, "asking HID report descriptor\n"); in i2c_hid_parse()
765 hid_err(hid, "reading report descriptor failed\n"); in i2c_hid_parse()
773 ret = hid_parse_report(hid, rdesc, rsize); in i2c_hid_parse()
785 static int i2c_hid_start(struct hid_device *hid) in i2c_hid_start() argument
787 struct i2c_client *client = hid->driver_data; in i2c_hid_start()
792 i2c_hid_find_max_report(hid, HID_INPUT_REPORT, &bufsize); in i2c_hid_start()
793 i2c_hid_find_max_report(hid, HID_OUTPUT_REPORT, &bufsize); in i2c_hid_start()
794 i2c_hid_find_max_report(hid, HID_FEATURE_REPORT, &bufsize); in i2c_hid_start()
810 static void i2c_hid_stop(struct hid_device *hid) in i2c_hid_stop() argument
812 hid->claimed = 0; in i2c_hid_stop()
815 static int i2c_hid_open(struct hid_device *hid) in i2c_hid_open() argument
817 struct i2c_client *client = hid->driver_data; in i2c_hid_open()
824 static void i2c_hid_close(struct hid_device *hid) in i2c_hid_close() argument
826 struct i2c_client *client = hid->driver_data; in i2c_hid_close()
875 /* i2c hid fetch using a fixed descriptor size (30 bytes) */ in i2c_hid_fetch_hid_descriptor()
877 i2c_hid_dbg(ihid, "Using a HID descriptor override\n"); in i2c_hid_fetch_hid_descriptor()
881 i2c_hid_dbg(ihid, "Fetching the HID descriptor\n"); in i2c_hid_fetch_hid_descriptor()
888 "failed to fetch HID descriptor: %d\n", in i2c_hid_fetch_hid_descriptor()
894 /* Validate the length of HID descriptor, the 4 first bytes: in i2c_hid_fetch_hid_descriptor()
900 "unexpected HID descriptor bcdVersion (0x%04hx)\n", in i2c_hid_fetch_hid_descriptor()
909 "weird size of HID descriptor (%u)\n", dsize); in i2c_hid_fetch_hid_descriptor()
912 i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, &ihid->hdesc); in i2c_hid_fetch_hid_descriptor()
943 struct hid_device *hid = ihid->hid; in i2c_hid_core_suspend() local
946 ret = hid_driver_suspend(hid, PMSG_SUSPEND); in i2c_hid_core_suspend()
965 struct hid_device *hid = ihid->hid; in i2c_hid_core_resume() local
989 return hid_driver_reset_resume(hid); in i2c_hid_core_resume()
993 * Check that the device exists and parse the HID descriptor.
998 struct hid_device *hid = ihid->hid; in __i2c_hid_core_probe() local
1011 "Failed to fetch the HID Descriptor\n"); in __i2c_hid_core_probe()
1015 hid->version = le16_to_cpu(ihid->hdesc.bcdVersion); in __i2c_hid_core_probe()
1016 hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID); in __i2c_hid_core_probe()
1017 hid->product = le16_to_cpu(ihid->hdesc.wProductID); in __i2c_hid_core_probe()
1019 hid->initial_quirks |= i2c_hid_get_dmi_quirks(hid->vendor, in __i2c_hid_core_probe()
1020 hid->product); in __i2c_hid_core_probe()
1022 snprintf(hid->name, sizeof(hid->name), "%s %04X:%04X", in __i2c_hid_core_probe()
1023 client->name, (u16)hid->vendor, (u16)hid->product); in __i2c_hid_core_probe()
1024 strscpy(hid->phys, dev_name(&client->dev), sizeof(hid->phys)); in __i2c_hid_core_probe()
1026 ihid->quirks = i2c_hid_lookup_quirk(hid->vendor, hid->product); in __i2c_hid_core_probe()
1034 struct hid_device *hid = ihid->hid; in i2c_hid_core_register_hid() local
1039 ret = hid_add_device(hid); in i2c_hid_core_register_hid()
1042 hid_err(client, "can't add hid device: %d\n", ret); in i2c_hid_core_register_hid()
1078 struct hid_device *hid = ihid->hid; in ihid_core_panel_prepare_work() local
1082 * hid->version is set on the first power up. If it's still zero then in ihid_core_panel_prepare_work()
1086 if (!hid->version) in ihid_core_panel_prepare_work()
1170 struct hid_device *hid; in i2c_hid_core_probe() local
1172 dbg_hid("HID probe called for i2c 0x%02x\n", client->addr); in i2c_hid_core_probe()
1176 "HID over i2c has not been provided an Int IRQ\n"); in i2c_hid_core_probe()
1183 "HID over i2c doesn't have a valid IRQ\n"); in i2c_hid_core_probe()
1210 hid = hid_allocate_device(); in i2c_hid_core_probe()
1211 if (IS_ERR(hid)) { in i2c_hid_core_probe()
1212 ret = PTR_ERR(hid); in i2c_hid_core_probe()
1216 ihid->hid = hid; in i2c_hid_core_probe()
1218 hid->driver_data = client; in i2c_hid_core_probe()
1219 hid->ll_driver = &i2c_hid_ll_driver; in i2c_hid_core_probe()
1220 hid->dev.parent = &client->dev; in i2c_hid_core_probe()
1221 hid->bus = BUS_I2C; in i2c_hid_core_probe()
1222 hid->initial_quirks = quirks; in i2c_hid_core_probe()
1258 hid_destroy_device(hid); in i2c_hid_core_probe()
1269 struct hid_device *hid; in i2c_hid_core_remove() local
1280 hid = ihid->hid; in i2c_hid_core_remove()
1281 hid_destroy_device(hid); in i2c_hid_core_remove()
1328 MODULE_DESCRIPTION("HID over I2C core driver");