Lines Matching refs:ihid

65 #define i2c_hid_dbg(ihid, fmt, arg...)					  \  argument
68 dev_printk(KERN_DEBUG, &(ihid)->client->dev, fmt, ##arg); \
203 struct i2c_hid *ihid = i2c_get_clientdata(client); in __i2c_hid_command() local
204 union command *cmd = (union command *)ihid->cmdbuf; in __i2c_hid_command()
215 cmd->c.reg = ihid->wHIDDescRegister; in __i2c_hid_command()
217 cmd->data[0] = ihid->hdesc_buffer[registerIndex]; in __i2c_hid_command()
218 cmd->data[1] = ihid->hdesc_buffer[registerIndex + 1]; in __i2c_hid_command()
229 i2c_hid_dbg(ihid, "%s: cmd=%*ph\n", __func__, length, cmd->data); in __i2c_hid_command()
242 set_bit(I2C_HID_READ_PENDING, &ihid->flags); in __i2c_hid_command()
246 set_bit(I2C_HID_RESET_PENDING, &ihid->flags); in __i2c_hid_command()
251 clear_bit(I2C_HID_READ_PENDING, &ihid->flags); in __i2c_hid_command()
258 if (wait && (ihid->quirks & I2C_HID_QUIRK_NO_IRQ_AFTER_RESET)) { in __i2c_hid_command()
261 i2c_hid_dbg(ihid, "%s: waiting...\n", __func__); in __i2c_hid_command()
262 if (!wait_event_timeout(ihid->wait, in __i2c_hid_command()
263 !test_bit(I2C_HID_RESET_PENDING, &ihid->flags), in __i2c_hid_command()
266 i2c_hid_dbg(ihid, "%s: finished.\n", __func__); in __i2c_hid_command()
283 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_get_report() local
287 u16 readRegister = le16_to_cpu(ihid->hdesc.wDataRegister); in i2c_hid_get_report()
289 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_get_report()
322 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_set_or_send_report() local
323 u8 *args = ihid->argsbuf; in i2c_hid_set_or_send_report()
326 u16 dataRegister = le16_to_cpu(ihid->hdesc.wDataRegister); in i2c_hid_set_or_send_report()
327 u16 outputRegister = le16_to_cpu(ihid->hdesc.wOutputRegister); in i2c_hid_set_or_send_report()
328 u16 maxOutputLength = le16_to_cpu(ihid->hdesc.wMaxOutputLength); in i2c_hid_set_or_send_report()
333 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_set_or_send_report()
335 if (data_len > ihid->bufsize) in i2c_hid_set_or_send_report()
387 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_set_power() local
390 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_set_power()
398 ihid->quirks & I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV) { in i2c_hid_set_power()
418 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_hwreset() local
421 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_hwreset()
428 mutex_lock(&ihid->reset_lock); in i2c_hid_hwreset()
443 i2c_hid_dbg(ihid, "resetting...\n"); in i2c_hid_hwreset()
452 mutex_unlock(&ihid->reset_lock); in i2c_hid_hwreset()
456 static void i2c_hid_get_input(struct i2c_hid *ihid) in i2c_hid_get_input() argument
460 int size = le16_to_cpu(ihid->hdesc.wMaxInputLength); in i2c_hid_get_input()
462 if (size > ihid->bufsize) in i2c_hid_get_input()
463 size = ihid->bufsize; in i2c_hid_get_input()
465 ret = i2c_master_recv(ihid->client, ihid->inbuf, size); in i2c_hid_get_input()
470 dev_err(&ihid->client->dev, "%s: got %d data instead of %d\n", in i2c_hid_get_input()
475 ret_size = ihid->inbuf[0] | ihid->inbuf[1] << 8; in i2c_hid_get_input()
479 if (test_and_clear_bit(I2C_HID_RESET_PENDING, &ihid->flags)) in i2c_hid_get_input()
480 wake_up(&ihid->wait); in i2c_hid_get_input()
485 dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", in i2c_hid_get_input()
490 i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf); in i2c_hid_get_input()
492 if (test_bit(I2C_HID_STARTED, &ihid->flags)) in i2c_hid_get_input()
493 hid_input_report(ihid->hid, HID_INPUT_REPORT, ihid->inbuf + 2, in i2c_hid_get_input()
501 struct i2c_hid *ihid = dev_id; in i2c_hid_irq() local
503 if (test_bit(I2C_HID_READ_PENDING, &ihid->flags)) in i2c_hid_irq()
506 i2c_hid_get_input(ihid); in i2c_hid_irq()
535 static void i2c_hid_free_buffers(struct i2c_hid *ihid) in i2c_hid_free_buffers() argument
537 kfree(ihid->inbuf); in i2c_hid_free_buffers()
538 kfree(ihid->rawbuf); in i2c_hid_free_buffers()
539 kfree(ihid->argsbuf); in i2c_hid_free_buffers()
540 kfree(ihid->cmdbuf); in i2c_hid_free_buffers()
541 ihid->inbuf = NULL; in i2c_hid_free_buffers()
542 ihid->rawbuf = NULL; in i2c_hid_free_buffers()
543 ihid->cmdbuf = NULL; in i2c_hid_free_buffers()
544 ihid->argsbuf = NULL; in i2c_hid_free_buffers()
545 ihid->bufsize = 0; in i2c_hid_free_buffers()
548 static int i2c_hid_alloc_buffers(struct i2c_hid *ihid, size_t report_size) in i2c_hid_alloc_buffers() argument
558 ihid->inbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
559 ihid->rawbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
560 ihid->argsbuf = kzalloc(args_len, GFP_KERNEL); in i2c_hid_alloc_buffers()
561 ihid->cmdbuf = kzalloc(sizeof(union command) + args_len, GFP_KERNEL); in i2c_hid_alloc_buffers()
563 if (!ihid->inbuf || !ihid->rawbuf || !ihid->argsbuf || !ihid->cmdbuf) { in i2c_hid_alloc_buffers()
564 i2c_hid_free_buffers(ihid); in i2c_hid_alloc_buffers()
568 ihid->bufsize = report_size; in i2c_hid_alloc_buffers()
578 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_get_raw_report() local
586 ask_count = min(count + 2, (size_t)ihid->bufsize); in i2c_hid_get_raw_report()
590 report_number, ihid->rawbuf, ask_count); in i2c_hid_get_raw_report()
595 ret_count = ihid->rawbuf[0] | (ihid->rawbuf[1] << 8); in i2c_hid_get_raw_report()
604 memcpy(buf, ihid->rawbuf + 2, count); in i2c_hid_get_raw_report()
613 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_output_raw_report() local
620 mutex_lock(&ihid->reset_lock); in i2c_hid_output_raw_report()
634 mutex_unlock(&ihid->reset_lock); in i2c_hid_output_raw_report()
665 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_parse() local
666 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_parse()
672 i2c_hid_dbg(ihid, "entering %s\n", __func__); in i2c_hid_parse()
696 i2c_hid_dbg(ihid, "asking HID report descriptor\n"); in i2c_hid_parse()
705 i2c_hid_dbg(ihid, "Report Descriptor: %*ph\n", rsize, rdesc); in i2c_hid_parse()
720 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_start() local
728 if (bufsize > ihid->bufsize) { in i2c_hid_start()
730 i2c_hid_free_buffers(ihid); in i2c_hid_start()
732 ret = i2c_hid_alloc_buffers(ihid, bufsize); in i2c_hid_start()
750 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_open() local
757 set_bit(I2C_HID_STARTED, &ihid->flags); in i2c_hid_open()
764 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_close() local
766 clear_bit(I2C_HID_STARTED, &ihid->flags); in i2c_hid_close()
775 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_power() local
777 i2c_hid_dbg(ihid, "%s lvl:%d\n", __func__, lvl); in i2c_hid_power()
804 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_init_irq() local
814 irqflags | IRQF_ONESHOT, client->name, ihid); in i2c_hid_init_irq()
827 static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid) in i2c_hid_fetch_hid_descriptor() argument
829 struct i2c_client *client = ihid->client; in i2c_hid_fetch_hid_descriptor()
830 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_fetch_hid_descriptor()
835 i2c_hid_dbg(ihid, "Fetching the HID descriptor\n"); in i2c_hid_fetch_hid_descriptor()
836 ret = i2c_hid_command(client, &hid_descr_cmd, ihid->hdesc_buffer, in i2c_hid_fetch_hid_descriptor()
861 i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, ihid->hdesc_buffer); in i2c_hid_fetch_hid_descriptor()
982 struct i2c_hid *ihid; in i2c_hid_probe() local
1002 ihid = devm_kzalloc(&client->dev, sizeof(*ihid), GFP_KERNEL); in i2c_hid_probe()
1003 if (!ihid) in i2c_hid_probe()
1007 ret = i2c_hid_of_probe(client, &ihid->pdata); in i2c_hid_probe()
1011 ret = i2c_hid_acpi_pdata(client, &ihid->pdata); in i2c_hid_probe()
1015 ihid->pdata = *platform_data; in i2c_hid_probe()
1019 i2c_hid_fwnode_probe(client, &ihid->pdata); in i2c_hid_probe()
1021 ihid->pdata.supplies[0].supply = "vdd"; in i2c_hid_probe()
1022 ihid->pdata.supplies[1].supply = "vddl"; in i2c_hid_probe()
1025 ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_probe()
1026 ihid->pdata.supplies); in i2c_hid_probe()
1030 ret = regulator_bulk_enable(ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_probe()
1031 ihid->pdata.supplies); in i2c_hid_probe()
1035 if (ihid->pdata.post_power_delay_ms) in i2c_hid_probe()
1036 msleep(ihid->pdata.post_power_delay_ms); in i2c_hid_probe()
1038 i2c_set_clientdata(client, ihid); in i2c_hid_probe()
1040 ihid->client = client; in i2c_hid_probe()
1042 hidRegister = ihid->pdata.hid_descriptor_address; in i2c_hid_probe()
1043 ihid->wHIDDescRegister = cpu_to_le16(hidRegister); in i2c_hid_probe()
1045 init_waitqueue_head(&ihid->wait); in i2c_hid_probe()
1046 mutex_init(&ihid->reset_lock); in i2c_hid_probe()
1051 ret = i2c_hid_alloc_buffers(ihid, HID_MIN_BUFFER_SIZE); in i2c_hid_probe()
1070 ret = i2c_hid_fetch_hid_descriptor(ihid); in i2c_hid_probe()
1084 ihid->hid = hid; in i2c_hid_probe()
1090 hid->version = le16_to_cpu(ihid->hdesc.bcdVersion); in i2c_hid_probe()
1091 hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID); in i2c_hid_probe()
1092 hid->product = le16_to_cpu(ihid->hdesc.wProductID); in i2c_hid_probe()
1098 ihid->quirks = i2c_hid_lookup_quirk(hid->vendor, hid->product); in i2c_hid_probe()
1107 if (!(ihid->quirks & I2C_HID_QUIRK_NO_RUNTIME_PM)) in i2c_hid_probe()
1116 free_irq(client->irq, ihid); in i2c_hid_probe()
1123 regulator_bulk_disable(ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_probe()
1124 ihid->pdata.supplies); in i2c_hid_probe()
1125 i2c_hid_free_buffers(ihid); in i2c_hid_probe()
1131 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_remove() local
1134 if (!(ihid->quirks & I2C_HID_QUIRK_NO_RUNTIME_PM)) in i2c_hid_remove()
1140 hid = ihid->hid; in i2c_hid_remove()
1143 free_irq(client->irq, ihid); in i2c_hid_remove()
1145 if (ihid->bufsize) in i2c_hid_remove()
1146 i2c_hid_free_buffers(ihid); in i2c_hid_remove()
1148 regulator_bulk_disable(ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_remove()
1149 ihid->pdata.supplies); in i2c_hid_remove()
1156 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_shutdown() local
1159 free_irq(client->irq, ihid); in i2c_hid_shutdown()
1166 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_suspend() local
1167 struct hid_device *hid = ihid->hid; in i2c_hid_suspend()
1195 ihid->irq_wake_enabled = true; in i2c_hid_suspend()
1200 regulator_bulk_disable(ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_suspend()
1201 ihid->pdata.supplies); in i2c_hid_suspend()
1211 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_resume() local
1212 struct hid_device *hid = ihid->hid; in i2c_hid_resume()
1216 ret = regulator_bulk_enable(ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_resume()
1217 ihid->pdata.supplies); in i2c_hid_resume()
1221 if (ihid->pdata.post_power_delay_ms) in i2c_hid_resume()
1222 msleep(ihid->pdata.post_power_delay_ms); in i2c_hid_resume()
1223 } else if (ihid->irq_wake_enabled) { in i2c_hid_resume()
1226 ihid->irq_wake_enabled = false; in i2c_hid_resume()