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"
94 struct hid_device *hid; /* pointer to corresponding HID dev */ member
95 struct i2c_hid_desc hdesc; /* the HID Descriptor */
97 * register of the HID
147 * i2c_hid_lookup_quirk: return any quirks associated with a I2C HID device
310 * @ihid: the i2c hid device
315 * @do_set: true: use SET_REPORT HID command, false: send plain OUTPUT report
414 * The HID over I2C specification states that if a DEVICE needs time in i2c_hid_set_power()
544 if (ihid->hid->group != HID_GROUP_RMI) in i2c_hid_get_input()
547 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()
785 ret = hid_parse_report(hid, rdesc, rsize); in i2c_hid_parse()
796 static int i2c_hid_start(struct hid_device *hid) in i2c_hid_start() argument
798 struct i2c_client *client = hid->driver_data; in i2c_hid_start()
803 i2c_hid_find_max_report(hid, HID_INPUT_REPORT, &bufsize); in i2c_hid_start()
804 i2c_hid_find_max_report(hid, HID_OUTPUT_REPORT, &bufsize); in i2c_hid_start()
805 i2c_hid_find_max_report(hid, HID_FEATURE_REPORT, &bufsize); in i2c_hid_start()
821 static void i2c_hid_stop(struct hid_device *hid) in i2c_hid_stop() argument
823 hid->claimed = 0; in i2c_hid_stop()
826 static int i2c_hid_open(struct hid_device *hid) in i2c_hid_open() argument
828 struct i2c_client *client = hid->driver_data; in i2c_hid_open()
835 static void i2c_hid_close(struct hid_device *hid) in i2c_hid_close() argument
837 struct i2c_client *client = hid->driver_data; in i2c_hid_close()
886 /* i2c hid fetch using a fixed descriptor size (30 bytes) */ in i2c_hid_fetch_hid_descriptor()
888 i2c_hid_dbg(ihid, "Using a HID descriptor override\n"); in i2c_hid_fetch_hid_descriptor()
892 i2c_hid_dbg(ihid, "Fetching the HID descriptor\n"); in i2c_hid_fetch_hid_descriptor()
899 "failed to fetch HID descriptor: %d\n", in i2c_hid_fetch_hid_descriptor()
905 /* Validate the length of HID descriptor, the 4 first bytes: in i2c_hid_fetch_hid_descriptor()
911 "unexpected HID descriptor bcdVersion (0x%04hx)\n", in i2c_hid_fetch_hid_descriptor()
920 "weird size of HID descriptor (%u)\n", dsize); in i2c_hid_fetch_hid_descriptor()
923 i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, &ihid->hdesc); in i2c_hid_fetch_hid_descriptor()
954 struct hid_device *hid = ihid->hid; in i2c_hid_core_suspend() local
957 ret = hid_driver_suspend(hid, PMSG_SUSPEND); in i2c_hid_core_suspend()
976 struct hid_device *hid = ihid->hid; in i2c_hid_core_resume() local
1005 return hid_driver_reset_resume(hid); in i2c_hid_core_resume()
1009 * Check that the device exists and parse the HID descriptor.
1014 struct hid_device *hid = ihid->hid; in __i2c_hid_core_probe() local
1027 "Failed to fetch the HID Descriptor\n"); in __i2c_hid_core_probe()
1031 hid->version = le16_to_cpu(ihid->hdesc.bcdVersion); in __i2c_hid_core_probe()
1032 hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID); in __i2c_hid_core_probe()
1033 hid->product = le16_to_cpu(ihid->hdesc.wProductID); in __i2c_hid_core_probe()
1035 hid->initial_quirks |= i2c_hid_get_dmi_quirks(hid->vendor, in __i2c_hid_core_probe()
1036 hid->product); in __i2c_hid_core_probe()
1038 snprintf(hid->name, sizeof(hid->name), "%s %04X:%04X", in __i2c_hid_core_probe()
1039 client->name, (u16)hid->vendor, (u16)hid->product); in __i2c_hid_core_probe()
1040 strscpy(hid->phys, dev_name(&client->dev), sizeof(hid->phys)); in __i2c_hid_core_probe()
1042 ihid->quirks = i2c_hid_lookup_quirk(hid->vendor, hid->product); in __i2c_hid_core_probe()
1050 struct hid_device *hid = ihid->hid; in i2c_hid_core_register_hid() local
1055 ret = hid_add_device(hid); in i2c_hid_core_register_hid()
1058 hid_err(client, "can't add hid device: %d\n", ret); in i2c_hid_core_register_hid()
1094 struct hid_device *hid = ihid->hid; in ihid_core_panel_prepare_work() local
1098 * hid->version is set on the first power up. If it's still zero then in ihid_core_panel_prepare_work()
1102 if (!hid->version) in ihid_core_panel_prepare_work()
1186 struct hid_device *hid; in i2c_hid_core_probe() local
1188 dbg_hid("HID probe called for i2c 0x%02x\n", client->addr); in i2c_hid_core_probe()
1192 "HID over i2c has not been provided an Int IRQ\n"); in i2c_hid_core_probe()
1199 "HID over i2c doesn't have a valid IRQ\n"); in i2c_hid_core_probe()
1226 hid = hid_allocate_device(); in i2c_hid_core_probe()
1227 if (IS_ERR(hid)) { in i2c_hid_core_probe()
1228 ret = PTR_ERR(hid); in i2c_hid_core_probe()
1232 ihid->hid = hid; in i2c_hid_core_probe()
1234 hid->driver_data = client; in i2c_hid_core_probe()
1235 hid->ll_driver = &i2c_hid_ll_driver; in i2c_hid_core_probe()
1236 hid->dev.parent = &client->dev; in i2c_hid_core_probe()
1237 hid->bus = BUS_I2C; in i2c_hid_core_probe()
1238 hid->initial_quirks = quirks; in i2c_hid_core_probe()
1274 hid_destroy_device(hid); in i2c_hid_core_probe()
1285 struct hid_device *hid; in i2c_hid_core_remove() local
1296 hid = ihid->hid; in i2c_hid_core_remove()
1297 hid_destroy_device(hid); in i2c_hid_core_remove()
1344 MODULE_DESCRIPTION("HID over I2C core driver");