Lines Matching +full:hid +full:- +full:over +full:- +full:i2c

2  * HID over I2C protocol implementation
8 * This code is partly based on "USB HID support for Linux":
11 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
12 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
13 * Copyright (c) 2007-2008 Oliver Neukum
14 * Copyright (c) 2006-2010 Jiri Kosina
22 #include <linux/i2c.h>
37 #include <linux/hid.h>
43 #include "../hid-ids.h"
44 #include "i2c-hid.h"
72 #define i2c_hid_dbg(ihid, ...) dev_dbg(&(ihid)->client->dev, __VA_ARGS__)
93 struct i2c_client *client; /* i2c client */
94 struct hid_device *hid; /* pointer to corresponding HID dev */ member
95 struct i2c_hid_desc hdesc; /* the HID Descriptor */
96 __le16 wHIDDescRegister; /* location of the i2c
97 * register of the HID
99 unsigned int bufsize; /* i2c buffer size */
147 * i2c_hid_lookup_quirk: return any quirks associated with a I2C HID device
148 * @idVendor: the 16-bit vendor ID
149 * @idProduct: the 16-bit product ID
170 struct i2c_client *client = ihid->client; in i2c_hid_xfer()
179 msgs[n].addr = client->addr; in i2c_hid_xfer()
180 msgs[n].flags = (client->flags & I2C_M_TEN) | I2C_M_DMA_SAFE; in i2c_hid_xfer()
187 msgs[n].addr = client->addr; in i2c_hid_xfer()
188 msgs[n].flags = (client->flags & I2C_M_TEN) | in i2c_hid_xfer()
194 set_bit(I2C_HID_READ_PENDING, &ihid->flags); in i2c_hid_xfer()
197 ret = i2c_transfer(client->adapter, msgs, n); in i2c_hid_xfer()
200 clear_bit(I2C_HID_READ_PENDING, &ihid->flags); in i2c_hid_xfer()
203 return ret < 0 ? ret : -EIO; in i2c_hid_xfer()
211 *(__le16 *)ihid->cmdbuf = reg; in i2c_hid_read_register()
213 return i2c_hid_xfer(ihid, ihid->cmdbuf, sizeof(__le16), buf, len); in i2c_hid_read_register()
244 *(__le16 *)ihid->cmdbuf = ihid->hdesc.wCommandRegister; in i2c_hid_get_report()
247 length += i2c_hid_encode_command(ihid->cmdbuf + length, in i2c_hid_get_report()
255 put_unaligned_le16(le16_to_cpu(ihid->hdesc.wDataRegister), in i2c_hid_get_report()
256 ihid->cmdbuf + length); in i2c_hid_get_report()
263 error = i2c_hid_xfer(ihid, ihid->cmdbuf, length, in i2c_hid_get_report()
264 ihid->rawbuf, recv_len + sizeof(__le16)); in i2c_hid_get_report()
266 dev_err(&ihid->client->dev, in i2c_hid_get_report()
272 ret_count = le16_to_cpup((__le16 *)ihid->rawbuf); in i2c_hid_get_report()
278 recv_len = min(recv_len, ret_count - sizeof(__le16)); in i2c_hid_get_report()
279 memcpy(recv_buf, ihid->rawbuf + sizeof(__le16), recv_len); in i2c_hid_get_report()
282 dev_err(&ihid->client->dev, in i2c_hid_get_report()
285 return -EINVAL; in i2c_hid_get_report()
310 * @ihid: the i2c hid device
315 * @do_set: true: use SET_REPORT HID command, false: send plain OUTPUT report
327 if (data_len > ihid->bufsize) in i2c_hid_set_or_send_report()
328 return -EINVAL; in i2c_hid_set_or_send_report()
330 if (!do_set && le16_to_cpu(ihid->hdesc.wMaxOutputLength) == 0) in i2c_hid_set_or_send_report()
331 return -ENOSYS; in i2c_hid_set_or_send_report()
335 *(__le16 *)ihid->cmdbuf = ihid->hdesc.wCommandRegister; in i2c_hid_set_or_send_report()
338 length += i2c_hid_encode_command(ihid->cmdbuf + length, in i2c_hid_set_or_send_report()
346 put_unaligned_le16(le16_to_cpu(ihid->hdesc.wDataRegister), in i2c_hid_set_or_send_report()
347 ihid->cmdbuf + length); in i2c_hid_set_or_send_report()
354 *(__le16 *)ihid->cmdbuf = ihid->hdesc.wOutputRegister; in i2c_hid_set_or_send_report()
358 length += i2c_hid_format_report(ihid->cmdbuf + length, in i2c_hid_set_or_send_report()
361 error = i2c_hid_xfer(ihid, ihid->cmdbuf, length, NULL, 0); in i2c_hid_set_or_send_report()
363 dev_err(&ihid->client->dev, in i2c_hid_set_or_send_report()
376 *(__le16 *)ihid->cmdbuf = ihid->hdesc.wCommandRegister; in i2c_hid_set_power_command()
380 length += i2c_hid_encode_command(ihid->cmdbuf + length, in i2c_hid_set_power_command()
384 return i2c_hid_xfer(ihid, ihid->cmdbuf, length, NULL, 0); in i2c_hid_set_power_command()
408 dev_err(&ihid->client->dev, in i2c_hid_set_power()
414 * The HID over I2C specification states that if a DEVICE needs time in i2c_hid_set_power()
440 lockdep_assert_held(&ihid->reset_lock); in i2c_hid_start_hwreset()
447 *(__le16 *)ihid->cmdbuf = ihid->hdesc.wCommandRegister; in i2c_hid_start_hwreset()
450 length += i2c_hid_encode_command(ihid->cmdbuf + length, in i2c_hid_start_hwreset()
453 set_bit(I2C_HID_RESET_PENDING, &ihid->flags); in i2c_hid_start_hwreset()
455 ret = i2c_hid_xfer(ihid, ihid->cmdbuf, length, NULL, 0); in i2c_hid_start_hwreset()
457 dev_err(&ihid->client->dev, in i2c_hid_start_hwreset()
465 clear_bit(I2C_HID_RESET_PENDING, &ihid->flags); in i2c_hid_start_hwreset()
476 if (ihid->quirks & I2C_HID_QUIRK_NO_IRQ_AFTER_RESET) { in i2c_hid_finish_hwreset()
478 clear_bit(I2C_HID_RESET_PENDING, &ihid->flags); in i2c_hid_finish_hwreset()
479 } else if (!wait_event_timeout(ihid->wait, in i2c_hid_finish_hwreset()
480 !test_bit(I2C_HID_RESET_PENDING, &ihid->flags), in i2c_hid_finish_hwreset()
482 dev_warn(&ihid->client->dev, "device did not ack reset within 1000 ms\n"); in i2c_hid_finish_hwreset()
483 clear_bit(I2C_HID_RESET_PENDING, &ihid->flags); in i2c_hid_finish_hwreset()
488 if (!(ihid->quirks & I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET)) in i2c_hid_finish_hwreset()
496 u16 size = le16_to_cpu(ihid->hdesc.wMaxInputLength); in i2c_hid_get_input()
500 if (size > ihid->bufsize) in i2c_hid_get_input()
501 size = ihid->bufsize; in i2c_hid_get_input()
503 ret = i2c_master_recv(ihid->client, ihid->inbuf, size); in i2c_hid_get_input()
508 dev_err(&ihid->client->dev, "%s: got %d data instead of %d\n", in i2c_hid_get_input()
514 ret_size = le16_to_cpup((__le16 *)ihid->inbuf); in i2c_hid_get_input()
517 if (test_and_clear_bit(I2C_HID_RESET_PENDING, &ihid->flags)) in i2c_hid_get_input()
518 wake_up(&ihid->wait); in i2c_hid_get_input()
522 if ((ihid->quirks & I2C_HID_QUIRK_BOGUS_IRQ) && ret_size == 0xffff) { in i2c_hid_get_input()
523 dev_warn_once(&ihid->client->dev, in i2c_hid_get_input()
530 if (ihid->quirks & I2C_HID_QUIRK_BAD_INPUT_SIZE) { in i2c_hid_get_input()
531 *(__le16 *)ihid->inbuf = cpu_to_le16(size); in i2c_hid_get_input()
534 dev_err(&ihid->client->dev, in i2c_hid_get_input()
541 i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf); in i2c_hid_get_input()
543 if (test_bit(I2C_HID_STARTED, &ihid->flags)) { in i2c_hid_get_input()
544 if (ihid->hid->group != HID_GROUP_RMI) in i2c_hid_get_input()
545 pm_wakeup_event(&ihid->client->dev, 0); in i2c_hid_get_input()
547 hid_input_report(ihid->hid, HID_INPUT_REPORT, in i2c_hid_get_input()
548 ihid->inbuf + sizeof(__le16), in i2c_hid_get_input()
549 ret_size - sizeof(__le16), 1); in i2c_hid_get_input()
559 if (test_bit(I2C_HID_READ_PENDING, &ihid->flags)) in i2c_hid_irq()
569 return ((report->size - 1) >> 3) + 1 + in i2c_hid_get_report_length()
570 report->device->report_enum[report->type].numbered + 2; in i2c_hid_get_report_length()
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()
593 kfree(ihid->inbuf); in i2c_hid_free_buffers()
594 kfree(ihid->rawbuf); in i2c_hid_free_buffers()
595 kfree(ihid->cmdbuf); in i2c_hid_free_buffers()
596 ihid->inbuf = NULL; in i2c_hid_free_buffers()
597 ihid->rawbuf = NULL; in i2c_hid_free_buffers()
598 ihid->cmdbuf = NULL; in i2c_hid_free_buffers()
599 ihid->bufsize = 0; in i2c_hid_free_buffers()
617 ihid->inbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
618 ihid->rawbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
619 ihid->cmdbuf = kzalloc(cmd_len, GFP_KERNEL); in i2c_hid_alloc_buffers()
621 if (!ihid->inbuf || !ihid->rawbuf || !ihid->cmdbuf) { in i2c_hid_alloc_buffers()
623 return -ENOMEM; in i2c_hid_alloc_buffers()
626 ihid->bufsize = report_size; in i2c_hid_alloc_buffers()
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()
640 return -EINVAL; in i2c_hid_get_raw_report()
650 count--; 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()
672 return -EINVAL; in i2c_hid_output_raw_report()
674 mutex_lock(&ihid->reset_lock); in i2c_hid_output_raw_report()
685 report_id, buf + 1, count - 1, do_set); in i2c_hid_output_raw_report()
690 mutex_unlock(&ihid->reset_lock); 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()
710 return -EINVAL; in i2c_hid_raw_request()
711 return i2c_hid_output_raw_report(hid, rtype, buf, len, true); in i2c_hid_raw_request()
713 return -EIO; 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()
721 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_parse()
729 rsize = le16_to_cpu(hdesc->wReportDescLength); in i2c_hid_parse()
732 return -EINVAL; in i2c_hid_parse()
735 mutex_lock(&ihid->reset_lock); in i2c_hid_parse()
740 } while (tries-- > 0 && ret); in i2c_hid_parse()
745 use_override = i2c_hid_get_dmi_hid_report_desc_override(client->name, in i2c_hid_parse()
750 i2c_hid_dbg(ihid, "Using a HID report descriptor override\n"); in i2c_hid_parse()
755 ret = -ENOMEM; in i2c_hid_parse()
759 i2c_hid_dbg(ihid, "asking HID report descriptor\n"); in i2c_hid_parse()
762 ihid->hdesc.wReportDescRegister, in i2c_hid_parse()
765 hid_err(hid, "reading report descriptor failed\n"); in i2c_hid_parse()
771 * Windows directly reads the report-descriptor after sending reset in i2c_hid_parse()
773 * actually wait for the report-descriptor to be read before signalling in i2c_hid_parse()
778 clear_bit(I2C_HID_RESET_PENDING, &ihid->flags); in i2c_hid_parse()
779 mutex_unlock(&ihid->reset_lock); 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()
807 if (bufsize > ihid->bufsize) { in i2c_hid_start()
808 disable_irq(client->irq); in i2c_hid_start()
812 enable_irq(client->irq); 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()
831 set_bit(I2C_HID_STARTED, &ihid->flags); 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()
840 clear_bit(I2C_HID_STARTED, &ihid->flags); in i2c_hid_close()
859 i2c_hid_dbg(ihid, "Requesting IRQ: %d\n", client->irq); in i2c_hid_init_irq()
861 if (!irq_get_trigger_type(client->irq)) in i2c_hid_init_irq()
864 ret = request_threaded_irq(client->irq, NULL, i2c_hid_irq, in i2c_hid_init_irq()
866 client->name, ihid); in i2c_hid_init_irq()
868 dev_warn(&client->dev, in i2c_hid_init_irq()
871 client->name, client->irq, ret); in i2c_hid_init_irq()
881 struct i2c_client *client = ihid->client; in i2c_hid_fetch_hid_descriptor()
882 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_fetch_hid_descriptor()
886 /* i2c hid fetch using a fixed descriptor size (30 bytes) */ in i2c_hid_fetch_hid_descriptor()
887 if (i2c_hid_get_dmi_i2c_hid_desc_override(client->name)) { in i2c_hid_fetch_hid_descriptor()
888 i2c_hid_dbg(ihid, "Using a HID descriptor override\n"); in i2c_hid_fetch_hid_descriptor()
889 ihid->hdesc = in i2c_hid_fetch_hid_descriptor()
890 *i2c_hid_get_dmi_i2c_hid_desc_override(client->name); in i2c_hid_fetch_hid_descriptor()
892 i2c_hid_dbg(ihid, "Fetching the HID descriptor\n"); in i2c_hid_fetch_hid_descriptor()
894 ihid->wHIDDescRegister, in i2c_hid_fetch_hid_descriptor()
895 &ihid->hdesc, in i2c_hid_fetch_hid_descriptor()
896 sizeof(ihid->hdesc)); in i2c_hid_fetch_hid_descriptor()
898 dev_err(&ihid->client->dev, in i2c_hid_fetch_hid_descriptor()
899 "failed to fetch HID descriptor: %d\n", in i2c_hid_fetch_hid_descriptor()
901 return -ENODEV; in i2c_hid_fetch_hid_descriptor()
905 /* Validate the length of HID descriptor, the 4 first bytes: in i2c_hid_fetch_hid_descriptor()
906 * bytes 0-1 -> length in i2c_hid_fetch_hid_descriptor()
907 * bytes 2-3 -> bcdVersion (has to be 1.00) */ in i2c_hid_fetch_hid_descriptor()
909 if (le16_to_cpu(hdesc->bcdVersion) != 0x0100) { in i2c_hid_fetch_hid_descriptor()
910 dev_err(&ihid->client->dev, in i2c_hid_fetch_hid_descriptor()
911 "unexpected HID descriptor bcdVersion (0x%04hx)\n", in i2c_hid_fetch_hid_descriptor()
912 le16_to_cpu(hdesc->bcdVersion)); in i2c_hid_fetch_hid_descriptor()
913 return -ENODEV; in i2c_hid_fetch_hid_descriptor()
917 dsize = le16_to_cpu(hdesc->wHIDDescLength); in i2c_hid_fetch_hid_descriptor()
919 dev_err(&ihid->client->dev, in i2c_hid_fetch_hid_descriptor()
920 "weird size of HID descriptor (%u)\n", dsize); in i2c_hid_fetch_hid_descriptor()
921 return -ENODEV; in i2c_hid_fetch_hid_descriptor()
923 i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, &ihid->hdesc); in i2c_hid_fetch_hid_descriptor()
929 if (!ihid->ops->power_up) in i2c_hid_core_power_up()
932 return ihid->ops->power_up(ihid->ops); in i2c_hid_core_power_up()
937 if (!ihid->ops->power_down) in i2c_hid_core_power_down()
940 ihid->ops->power_down(ihid->ops); in i2c_hid_core_power_down()
945 if (!ihid->ops->shutdown_tail) in i2c_hid_core_shutdown_tail()
948 ihid->ops->shutdown_tail(ihid->ops); in i2c_hid_core_shutdown_tail()
953 struct i2c_client *client = ihid->client; in i2c_hid_core_suspend()
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()
962 if (!(ihid->quirks & I2C_HID_QUIRK_NO_SLEEP_ON_SUSPEND)) in i2c_hid_core_suspend()
965 disable_irq(client->irq); in i2c_hid_core_suspend()
967 if (force_poweroff || !device_may_wakeup(&client->dev)) in i2c_hid_core_suspend()
975 struct i2c_client *client = ihid->client; in i2c_hid_core_resume()
976 struct hid_device *hid = ihid->hid; in i2c_hid_core_resume() local
979 if (!device_may_wakeup(&client->dev)) in i2c_hid_core_resume()
982 enable_irq(client->irq); in i2c_hid_core_resume()
992 if (ihid->quirks & I2C_HID_QUIRK_RESET_ON_RESUME) { in i2c_hid_core_resume()
993 mutex_lock(&ihid->reset_lock); in i2c_hid_core_resume()
997 mutex_unlock(&ihid->reset_lock); in i2c_hid_core_resume()
1005 return hid_driver_reset_resume(hid); in i2c_hid_core_resume()
1009 * Check that the device exists and parse the HID descriptor.
1013 struct i2c_client *client = ihid->client; in __i2c_hid_core_probe()
1014 struct hid_device *hid = ihid->hid; in __i2c_hid_core_probe() local
1021 return -ENXIO; in __i2c_hid_core_probe()
1026 dev_err(&client->dev, in __i2c_hid_core_probe()
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()
1049 struct i2c_client *client = ihid->client; in i2c_hid_core_register_hid()
1050 struct hid_device *hid = ihid->hid; in i2c_hid_core_register_hid() local
1053 enable_irq(client->irq); in i2c_hid_core_register_hid()
1055 ret = hid_add_device(hid); in i2c_hid_core_register_hid()
1057 if (ret != -ENODEV) in i2c_hid_core_register_hid()
1058 hid_err(client, "can't add hid device: %d\n", ret); in i2c_hid_core_register_hid()
1059 disable_irq(client->irq); 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()
1108 dev_warn(&ihid->client->dev, "Power on failed: %d\n", ret); in ihid_core_panel_prepare_work()
1110 WRITE_ONCE(ihid->prepare_work_finished, true); in ihid_core_panel_prepare_work()
1132 WRITE_ONCE(ihid->prepare_work_finished, false); in i2c_hid_core_panel_prepared()
1133 schedule_work(&ihid->panel_follower_prepare_work); in i2c_hid_core_panel_prepared()
1142 cancel_work_sync(&ihid->panel_follower_prepare_work); in i2c_hid_core_panel_unpreparing()
1146 if (!READ_ONCE(ihid->prepare_work_finished)) in i2c_hid_core_panel_unpreparing()
1159 struct device *dev = &ihid->client->dev; in i2c_hid_core_register_panel_follower()
1162 ihid->panel_follower.funcs = &i2c_hid_core_panel_follower_funcs; in i2c_hid_core_register_panel_follower()
1174 ret = drm_panel_add_follower(dev, &ihid->panel_follower); in i2c_hid_core_register_panel_follower()
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()
1190 if (!client->irq) { in i2c_hid_core_probe()
1191 dev_err(&client->dev, in i2c_hid_core_probe()
1192 "HID over i2c has not been provided an Int IRQ\n"); in i2c_hid_core_probe()
1193 return -EINVAL; in i2c_hid_core_probe()
1196 if (client->irq < 0) { in i2c_hid_core_probe()
1197 if (client->irq != -EPROBE_DEFER) in i2c_hid_core_probe()
1198 dev_err(&client->dev, in i2c_hid_core_probe()
1199 "HID over i2c doesn't have a valid IRQ\n"); in i2c_hid_core_probe()
1200 return client->irq; in i2c_hid_core_probe()
1203 ihid = devm_kzalloc(&client->dev, sizeof(*ihid), GFP_KERNEL); in i2c_hid_core_probe()
1205 return -ENOMEM; in i2c_hid_core_probe()
1209 ihid->ops = ops; in i2c_hid_core_probe()
1210 ihid->client = client; in i2c_hid_core_probe()
1211 ihid->wHIDDescRegister = cpu_to_le16(hid_descriptor_address); in i2c_hid_core_probe()
1212 ihid->is_panel_follower = drm_is_panel_follower(&client->dev); in i2c_hid_core_probe()
1214 init_waitqueue_head(&ihid->wait); in i2c_hid_core_probe()
1215 mutex_init(&ihid->reset_lock); in i2c_hid_core_probe()
1216 INIT_WORK(&ihid->panel_follower_prepare_work, ihid_core_panel_prepare_work); in i2c_hid_core_probe()
1224 device_enable_async_suspend(&client->dev); 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()
1241 if (!ihid->is_panel_follower) { in i2c_hid_core_probe()
1259 if (ihid->is_panel_follower) in i2c_hid_core_probe()
1269 free_irq(client->irq, ihid); in i2c_hid_core_probe()
1271 if (!ihid->is_panel_follower) 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
1291 if (ihid->is_panel_follower) in i2c_hid_core_remove()
1292 drm_panel_remove_follower(&ihid->panel_follower); in i2c_hid_core_remove()
1296 hid = ihid->hid; in i2c_hid_core_remove()
1297 hid_destroy_device(hid); in i2c_hid_core_remove()
1299 free_irq(client->irq, ihid); in i2c_hid_core_remove()
1301 if (ihid->bufsize) in i2c_hid_core_remove()
1311 free_irq(client->irq, ihid); in i2c_hid_core_shutdown()
1322 if (ihid->is_panel_follower) in i2c_hid_core_pm_suspend()
1333 if (ihid->is_panel_follower) in i2c_hid_core_pm_resume()
1344 MODULE_DESCRIPTION("HID over I2C core driver");