Lines Matching +full:even +full:- +full:numbered
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
40 #include "../hid-ids.h"
41 #include "i2c-hid.h"
77 dev_printk(KERN_DEBUG, &(ihid)->client->dev, fmt, ##arg); \
151 * @idVendor: the 16-bit vendor ID
152 * @idProduct: the 16-bit product ID
173 struct i2c_client *client = ihid->client; in i2c_hid_xfer()
182 msgs[n].addr = client->addr; in i2c_hid_xfer()
183 msgs[n].flags = (client->flags & I2C_M_TEN) | I2C_M_DMA_SAFE; in i2c_hid_xfer()
190 msgs[n].addr = client->addr; in i2c_hid_xfer()
191 msgs[n].flags = (client->flags & I2C_M_TEN) | in i2c_hid_xfer()
197 set_bit(I2C_HID_READ_PENDING, &ihid->flags); in i2c_hid_xfer()
200 ret = i2c_transfer(client->adapter, msgs, n); in i2c_hid_xfer()
203 clear_bit(I2C_HID_READ_PENDING, &ihid->flags); in i2c_hid_xfer()
206 return ret < 0 ? ret : -EIO; in i2c_hid_xfer()
214 *(__le16 *)ihid->cmdbuf = reg; in i2c_hid_read_register()
216 return i2c_hid_xfer(ihid, ihid->cmdbuf, sizeof(__le16), buf, len); in i2c_hid_read_register()
247 *(__le16 *)ihid->cmdbuf = ihid->hdesc.wCommandRegister; in i2c_hid_get_report()
250 length += i2c_hid_encode_command(ihid->cmdbuf + length, in i2c_hid_get_report()
258 put_unaligned_le16(le16_to_cpu(ihid->hdesc.wDataRegister), in i2c_hid_get_report()
259 ihid->cmdbuf + length); in i2c_hid_get_report()
266 error = i2c_hid_xfer(ihid, ihid->cmdbuf, length, in i2c_hid_get_report()
267 ihid->rawbuf, recv_len + sizeof(__le16)); in i2c_hid_get_report()
269 dev_err(&ihid->client->dev, in i2c_hid_get_report()
275 ret_count = le16_to_cpup((__le16 *)ihid->rawbuf); in i2c_hid_get_report()
281 recv_len = min(recv_len, ret_count - sizeof(__le16)); in i2c_hid_get_report()
282 memcpy(recv_buf, ihid->rawbuf + sizeof(__le16), recv_len); in i2c_hid_get_report()
285 dev_err(&ihid->client->dev, in i2c_hid_get_report()
288 return -EINVAL; in i2c_hid_get_report()
330 if (data_len > ihid->bufsize) in i2c_hid_set_or_send_report()
331 return -EINVAL; in i2c_hid_set_or_send_report()
333 if (!do_set && le16_to_cpu(ihid->hdesc.wMaxOutputLength) == 0) in i2c_hid_set_or_send_report()
334 return -ENOSYS; in i2c_hid_set_or_send_report()
338 *(__le16 *)ihid->cmdbuf = ihid->hdesc.wCommandRegister; in i2c_hid_set_or_send_report()
341 length += i2c_hid_encode_command(ihid->cmdbuf + length, in i2c_hid_set_or_send_report()
349 put_unaligned_le16(le16_to_cpu(ihid->hdesc.wDataRegister), in i2c_hid_set_or_send_report()
350 ihid->cmdbuf + length); in i2c_hid_set_or_send_report()
357 *(__le16 *)ihid->cmdbuf = ihid->hdesc.wOutputRegister; in i2c_hid_set_or_send_report()
361 length += i2c_hid_format_report(ihid->cmdbuf + length, in i2c_hid_set_or_send_report()
364 error = i2c_hid_xfer(ihid, ihid->cmdbuf, length, NULL, 0); in i2c_hid_set_or_send_report()
366 dev_err(&ihid->client->dev, in i2c_hid_set_or_send_report()
379 *(__le16 *)ihid->cmdbuf = ihid->hdesc.wCommandRegister; in i2c_hid_set_power_command()
383 length += i2c_hid_encode_command(ihid->cmdbuf + length, in i2c_hid_set_power_command()
387 return i2c_hid_xfer(ihid, ihid->cmdbuf, length, NULL, 0); in i2c_hid_set_power_command()
402 ihid->quirks & I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV) { in i2c_hid_set_power()
412 dev_err(&ihid->client->dev, in i2c_hid_set_power()
422 * According to Goodix Windows even waits 60 ms after (other?) in i2c_hid_set_power()
440 *(__le16 *)ihid->cmdbuf = ihid->hdesc.wCommandRegister; in i2c_hid_execute_reset()
443 length += i2c_hid_encode_command(ihid->cmdbuf + length, in i2c_hid_execute_reset()
446 set_bit(I2C_HID_RESET_PENDING, &ihid->flags); in i2c_hid_execute_reset()
448 ret = i2c_hid_xfer(ihid, ihid->cmdbuf, length, NULL, 0); in i2c_hid_execute_reset()
450 dev_err(&ihid->client->dev, "failed to reset device.\n"); in i2c_hid_execute_reset()
454 if (ihid->quirks & I2C_HID_QUIRK_NO_IRQ_AFTER_RESET) { in i2c_hid_execute_reset()
460 if (!wait_event_timeout(ihid->wait, in i2c_hid_execute_reset()
461 !test_bit(I2C_HID_RESET_PENDING, &ihid->flags), in i2c_hid_execute_reset()
463 ret = -ENODATA; in i2c_hid_execute_reset()
469 clear_bit(I2C_HID_RESET_PENDING, &ihid->flags); in i2c_hid_execute_reset()
484 mutex_lock(&ihid->reset_lock); in i2c_hid_hwreset()
492 dev_err(&ihid->client->dev, in i2c_hid_hwreset()
499 if (!(ihid->quirks & I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET)) in i2c_hid_hwreset()
503 mutex_unlock(&ihid->reset_lock); in i2c_hid_hwreset()
509 u16 size = le16_to_cpu(ihid->hdesc.wMaxInputLength); in i2c_hid_get_input()
513 if (size > ihid->bufsize) in i2c_hid_get_input()
514 size = ihid->bufsize; in i2c_hid_get_input()
516 ret = i2c_master_recv(ihid->client, ihid->inbuf, size); in i2c_hid_get_input()
521 dev_err(&ihid->client->dev, "%s: got %d data instead of %d\n", in i2c_hid_get_input()
527 ret_size = le16_to_cpup((__le16 *)ihid->inbuf); in i2c_hid_get_input()
530 if (test_and_clear_bit(I2C_HID_RESET_PENDING, &ihid->flags)) in i2c_hid_get_input()
531 wake_up(&ihid->wait); in i2c_hid_get_input()
535 if ((ihid->quirks & I2C_HID_QUIRK_BOGUS_IRQ) && ret_size == 0xffff) { in i2c_hid_get_input()
536 dev_warn_once(&ihid->client->dev, in i2c_hid_get_input()
543 if (ihid->quirks & I2C_HID_QUIRK_BAD_INPUT_SIZE) { in i2c_hid_get_input()
544 *(__le16 *)ihid->inbuf = cpu_to_le16(size); in i2c_hid_get_input()
547 dev_err(&ihid->client->dev, in i2c_hid_get_input()
554 i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf); in i2c_hid_get_input()
556 if (test_bit(I2C_HID_STARTED, &ihid->flags)) { in i2c_hid_get_input()
557 pm_wakeup_event(&ihid->client->dev, 0); in i2c_hid_get_input()
559 hid_input_report(ihid->hid, HID_INPUT_REPORT, in i2c_hid_get_input()
560 ihid->inbuf + sizeof(__le16), in i2c_hid_get_input()
561 ret_size - sizeof(__le16), 1); in i2c_hid_get_input()
571 if (test_bit(I2C_HID_READ_PENDING, &ihid->flags)) in i2c_hid_irq()
581 return ((report->size - 1) >> 3) + 1 + in i2c_hid_get_report_length()
582 report->device->report_enum[report->type].numbered + 2; in i2c_hid_get_report_length()
596 list_for_each_entry(report, &hid->report_enum[type].report_list, list) { in i2c_hid_find_max_report()
605 kfree(ihid->inbuf); in i2c_hid_free_buffers()
606 kfree(ihid->rawbuf); in i2c_hid_free_buffers()
607 kfree(ihid->cmdbuf); in i2c_hid_free_buffers()
608 ihid->inbuf = NULL; in i2c_hid_free_buffers()
609 ihid->rawbuf = NULL; in i2c_hid_free_buffers()
610 ihid->cmdbuf = NULL; in i2c_hid_free_buffers()
611 ihid->bufsize = 0; in i2c_hid_free_buffers()
626 sizeof(u8) + /* report ID if numbered report */ in i2c_hid_alloc_buffers()
629 ihid->inbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
630 ihid->rawbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
631 ihid->cmdbuf = kzalloc(cmd_len, GFP_KERNEL); in i2c_hid_alloc_buffers()
633 if (!ihid->inbuf || !ihid->rawbuf || !ihid->cmdbuf) { in i2c_hid_alloc_buffers()
635 return -ENOMEM; in i2c_hid_alloc_buffers()
638 ihid->bufsize = report_size; in i2c_hid_alloc_buffers()
647 struct i2c_client *client = hid->driver_data; in i2c_hid_get_raw_report()
652 return -EINVAL; in i2c_hid_get_raw_report()
662 count--; in i2c_hid_get_raw_report()
678 struct i2c_client *client = hid->driver_data; in i2c_hid_output_raw_report()
684 return -EINVAL; in i2c_hid_output_raw_report()
686 mutex_lock(&ihid->reset_lock); in i2c_hid_output_raw_report()
689 * Note that both numbered and unnumbered reports passed here in i2c_hid_output_raw_report()
697 report_id, buf + 1, count - 1, do_set); in i2c_hid_output_raw_report()
702 mutex_unlock(&ihid->reset_lock); in i2c_hid_output_raw_report()
722 return -EINVAL; in i2c_hid_raw_request()
725 return -EIO; in i2c_hid_raw_request()
731 struct i2c_client *client = hid->driver_data; in i2c_hid_parse()
733 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_parse()
742 rsize = le16_to_cpu(hdesc->wReportDescLength); in i2c_hid_parse()
745 return -EINVAL; in i2c_hid_parse()
752 } while (tries-- > 0 && ret); in i2c_hid_parse()
757 use_override = i2c_hid_get_dmi_hid_report_desc_override(client->name, in i2c_hid_parse()
768 return -ENOMEM; in i2c_hid_parse()
774 ihid->hdesc.wReportDescRegister, in i2c_hid_parse()
779 return -EIO; in i2c_hid_parse()
799 struct i2c_client *client = hid->driver_data; in i2c_hid_start()
808 if (bufsize > ihid->bufsize) { in i2c_hid_start()
809 disable_irq(client->irq); in i2c_hid_start()
813 enable_irq(client->irq); in i2c_hid_start()
824 hid->claimed = 0; in i2c_hid_stop()
829 struct i2c_client *client = hid->driver_data; in i2c_hid_open()
832 set_bit(I2C_HID_STARTED, &ihid->flags); in i2c_hid_open()
838 struct i2c_client *client = hid->driver_data; in i2c_hid_close()
841 clear_bit(I2C_HID_STARTED, &ihid->flags); in i2c_hid_close()
861 dev_dbg(&client->dev, "Requesting IRQ: %d\n", client->irq); in i2c_hid_init_irq()
863 if (!irq_get_trigger_type(client->irq)) in i2c_hid_init_irq()
866 ret = request_threaded_irq(client->irq, NULL, i2c_hid_irq, in i2c_hid_init_irq()
867 irqflags | IRQF_ONESHOT, client->name, ihid); in i2c_hid_init_irq()
869 dev_warn(&client->dev, in i2c_hid_init_irq()
872 client->name, client->irq, ret); in i2c_hid_init_irq()
882 struct i2c_client *client = ihid->client; in i2c_hid_fetch_hid_descriptor()
883 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_fetch_hid_descriptor()
888 if (i2c_hid_get_dmi_i2c_hid_desc_override(client->name)) { in i2c_hid_fetch_hid_descriptor()
890 ihid->hdesc = in i2c_hid_fetch_hid_descriptor()
891 *i2c_hid_get_dmi_i2c_hid_desc_override(client->name); in i2c_hid_fetch_hid_descriptor()
895 ihid->wHIDDescRegister, in i2c_hid_fetch_hid_descriptor()
896 &ihid->hdesc, in i2c_hid_fetch_hid_descriptor()
897 sizeof(ihid->hdesc)); in i2c_hid_fetch_hid_descriptor()
899 dev_err(&ihid->client->dev, in i2c_hid_fetch_hid_descriptor()
902 return -ENODEV; in i2c_hid_fetch_hid_descriptor()
907 * bytes 0-1 -> length in i2c_hid_fetch_hid_descriptor()
908 * bytes 2-3 -> bcdVersion (has to be 1.00) */ in i2c_hid_fetch_hid_descriptor()
910 if (le16_to_cpu(hdesc->bcdVersion) != 0x0100) { in i2c_hid_fetch_hid_descriptor()
911 dev_err(&ihid->client->dev, in i2c_hid_fetch_hid_descriptor()
913 le16_to_cpu(hdesc->bcdVersion)); in i2c_hid_fetch_hid_descriptor()
914 return -ENODEV; in i2c_hid_fetch_hid_descriptor()
918 dsize = le16_to_cpu(hdesc->wHIDDescLength); in i2c_hid_fetch_hid_descriptor()
920 dev_err(&ihid->client->dev, in i2c_hid_fetch_hid_descriptor()
922 return -ENODEV; in i2c_hid_fetch_hid_descriptor()
924 i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, &ihid->hdesc); in i2c_hid_fetch_hid_descriptor()
930 if (!ihid->ops->power_up) in i2c_hid_core_power_up()
933 return ihid->ops->power_up(ihid->ops); in i2c_hid_core_power_up()
938 if (!ihid->ops->power_down) in i2c_hid_core_power_down()
941 ihid->ops->power_down(ihid->ops); in i2c_hid_core_power_down()
946 if (!ihid->ops->shutdown_tail) in i2c_hid_core_shutdown_tail()
949 ihid->ops->shutdown_tail(ihid->ops); in i2c_hid_core_shutdown_tail()
959 dbg_hid("HID probe called for i2c 0x%02x\n", client->addr); in i2c_hid_core_probe()
961 if (!client->irq) { in i2c_hid_core_probe()
962 dev_err(&client->dev, in i2c_hid_core_probe()
964 return -EINVAL; in i2c_hid_core_probe()
967 if (client->irq < 0) { in i2c_hid_core_probe()
968 if (client->irq != -EPROBE_DEFER) in i2c_hid_core_probe()
969 dev_err(&client->dev, in i2c_hid_core_probe()
971 return client->irq; in i2c_hid_core_probe()
974 ihid = devm_kzalloc(&client->dev, sizeof(*ihid), GFP_KERNEL); in i2c_hid_core_probe()
976 return -ENOMEM; in i2c_hid_core_probe()
978 ihid->ops = ops; in i2c_hid_core_probe()
986 ihid->client = client; in i2c_hid_core_probe()
988 ihid->wHIDDescRegister = cpu_to_le16(hid_descriptor_address); in i2c_hid_core_probe()
990 init_waitqueue_head(&ihid->wait); in i2c_hid_core_probe()
991 mutex_init(&ihid->reset_lock); in i2c_hid_core_probe()
1000 device_enable_async_suspend(&client->dev); in i2c_hid_core_probe()
1005 dev_dbg(&client->dev, "nothing at this address: %d\n", ret); in i2c_hid_core_probe()
1006 ret = -ENXIO; in i2c_hid_core_probe()
1012 dev_err(&client->dev, in i2c_hid_core_probe()
1027 ihid->hid = hid; in i2c_hid_core_probe()
1029 hid->driver_data = client; in i2c_hid_core_probe()
1030 hid->ll_driver = &i2c_hid_ll_driver; in i2c_hid_core_probe()
1031 hid->dev.parent = &client->dev; in i2c_hid_core_probe()
1032 hid->bus = BUS_I2C; in i2c_hid_core_probe()
1033 hid->version = le16_to_cpu(ihid->hdesc.bcdVersion); in i2c_hid_core_probe()
1034 hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID); in i2c_hid_core_probe()
1035 hid->product = le16_to_cpu(ihid->hdesc.wProductID); in i2c_hid_core_probe()
1037 snprintf(hid->name, sizeof(hid->name), "%s %04X:%04X", in i2c_hid_core_probe()
1038 client->name, (u16)hid->vendor, (u16)hid->product); in i2c_hid_core_probe()
1039 strscpy(hid->phys, dev_name(&client->dev), sizeof(hid->phys)); in i2c_hid_core_probe()
1041 ihid->quirks = i2c_hid_lookup_quirk(hid->vendor, hid->product); in i2c_hid_core_probe()
1045 if (ret != -ENODEV) in i2c_hid_core_probe()
1050 hid->quirks |= quirks; in i2c_hid_core_probe()
1058 free_irq(client->irq, ihid); in i2c_hid_core_probe()
1072 hid = ihid->hid; in i2c_hid_core_remove()
1075 free_irq(client->irq, ihid); in i2c_hid_core_remove()
1077 if (ihid->bufsize) in i2c_hid_core_remove()
1089 free_irq(client->irq, ihid); in i2c_hid_core_shutdown()
1100 struct hid_device *hid = ihid->hid; in i2c_hid_core_suspend()
1111 disable_irq(client->irq); in i2c_hid_core_suspend()
1113 if (device_may_wakeup(&client->dev)) { in i2c_hid_core_suspend()
1114 wake_status = enable_irq_wake(client->irq); in i2c_hid_core_suspend()
1116 ihid->irq_wake_enabled = true; in i2c_hid_core_suspend()
1132 struct hid_device *hid = ihid->hid; in i2c_hid_core_resume()
1135 if (!device_may_wakeup(&client->dev)) { in i2c_hid_core_resume()
1137 } else if (ihid->irq_wake_enabled) { in i2c_hid_core_resume()
1138 wake_status = disable_irq_wake(client->irq); in i2c_hid_core_resume()
1140 ihid->irq_wake_enabled = false; in i2c_hid_core_resume()
1146 enable_irq(client->irq); in i2c_hid_core_resume()
1156 if (ihid->quirks & I2C_HID_QUIRK_RESET_ON_RESUME) in i2c_hid_core_resume()