Lines Matching refs:ihid
57 #define i2c_hid_dbg(ihid, fmt, arg...) \ argument
60 dev_printk(KERN_DEBUG, &(ihid)->client->dev, fmt, ##arg); \
161 struct i2c_hid *ihid = i2c_get_clientdata(client); in __i2c_hid_command() local
162 union command *cmd = (union command *)ihid->cmdbuf; in __i2c_hid_command()
173 cmd->c.reg = ihid->wHIDDescRegister; in __i2c_hid_command()
175 cmd->data[0] = ihid->hdesc_buffer[registerIndex]; in __i2c_hid_command()
176 cmd->data[1] = ihid->hdesc_buffer[registerIndex + 1]; in __i2c_hid_command()
187 i2c_hid_dbg(ihid, "%s: cmd=%*ph\n", __func__, length, cmd->data); in __i2c_hid_command()
200 set_bit(I2C_HID_READ_PENDING, &ihid->flags); in __i2c_hid_command()
204 set_bit(I2C_HID_RESET_PENDING, &ihid->flags); in __i2c_hid_command()
209 clear_bit(I2C_HID_READ_PENDING, &ihid->flags); in __i2c_hid_command()
217 i2c_hid_dbg(ihid, "%s: waiting...\n", __func__); in __i2c_hid_command()
218 if (!wait_event_timeout(ihid->wait, in __i2c_hid_command()
219 !test_bit(I2C_HID_RESET_PENDING, &ihid->flags), in __i2c_hid_command()
222 i2c_hid_dbg(ihid, "%s: finished.\n", __func__); in __i2c_hid_command()
239 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_get_report() local
243 u16 readRegister = le16_to_cpu(ihid->hdesc.wDataRegister); in i2c_hid_get_report()
245 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_get_report()
278 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_set_or_send_report() local
279 u8 *args = ihid->argsbuf; in i2c_hid_set_or_send_report()
282 u16 dataRegister = le16_to_cpu(ihid->hdesc.wDataRegister); in i2c_hid_set_or_send_report()
283 u16 outputRegister = le16_to_cpu(ihid->hdesc.wOutputRegister); in i2c_hid_set_or_send_report()
284 u16 maxOutputLength = le16_to_cpu(ihid->hdesc.wMaxOutputLength); in i2c_hid_set_or_send_report()
289 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_set_or_send_report()
291 if (data_len > ihid->bufsize) in i2c_hid_set_or_send_report()
343 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_set_power() local
346 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_set_power()
358 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_hwreset() local
361 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_hwreset()
367 i2c_hid_dbg(ihid, "resetting...\n"); in i2c_hid_hwreset()
379 static void i2c_hid_get_input(struct i2c_hid *ihid) in i2c_hid_get_input() argument
382 int size = le16_to_cpu(ihid->hdesc.wMaxInputLength); in i2c_hid_get_input()
384 if (size > ihid->bufsize) in i2c_hid_get_input()
385 size = ihid->bufsize; in i2c_hid_get_input()
387 ret = i2c_master_recv(ihid->client, ihid->inbuf, size); in i2c_hid_get_input()
392 dev_err(&ihid->client->dev, "%s: got %d data instead of %d\n", in i2c_hid_get_input()
397 ret_size = ihid->inbuf[0] | ihid->inbuf[1] << 8; in i2c_hid_get_input()
401 if (test_and_clear_bit(I2C_HID_RESET_PENDING, &ihid->flags)) in i2c_hid_get_input()
402 wake_up(&ihid->wait); in i2c_hid_get_input()
407 dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", in i2c_hid_get_input()
412 i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf); in i2c_hid_get_input()
414 if (test_bit(I2C_HID_STARTED, &ihid->flags)) in i2c_hid_get_input()
415 hid_input_report(ihid->hid, HID_INPUT_REPORT, ihid->inbuf + 2, in i2c_hid_get_input()
423 struct i2c_hid *ihid = dev_id; in i2c_hid_irq() local
425 if (test_bit(I2C_HID_READ_PENDING, &ihid->flags)) in i2c_hid_irq()
428 i2c_hid_get_input(ihid); in i2c_hid_irq()
444 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_init_report() local
453 i2c_hid_dbg(ihid, "report (len=%d): %*ph\n", size, size, buffer); in i2c_hid_init_report()
476 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_init_reports() local
477 u8 *inbuf = kzalloc(ihid->bufsize, GFP_KERNEL); in i2c_hid_init_reports()
492 i2c_hid_init_report(report, inbuf, ihid->bufsize); in i2c_hid_init_reports()
517 static void i2c_hid_free_buffers(struct i2c_hid *ihid) in i2c_hid_free_buffers() argument
519 kfree(ihid->inbuf); in i2c_hid_free_buffers()
520 kfree(ihid->rawbuf); in i2c_hid_free_buffers()
521 kfree(ihid->argsbuf); in i2c_hid_free_buffers()
522 kfree(ihid->cmdbuf); in i2c_hid_free_buffers()
523 ihid->inbuf = NULL; in i2c_hid_free_buffers()
524 ihid->rawbuf = NULL; in i2c_hid_free_buffers()
525 ihid->cmdbuf = NULL; in i2c_hid_free_buffers()
526 ihid->argsbuf = NULL; in i2c_hid_free_buffers()
527 ihid->bufsize = 0; in i2c_hid_free_buffers()
530 static int i2c_hid_alloc_buffers(struct i2c_hid *ihid, size_t report_size) in i2c_hid_alloc_buffers() argument
539 ihid->inbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
540 ihid->rawbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
541 ihid->argsbuf = kzalloc(args_len, GFP_KERNEL); in i2c_hid_alloc_buffers()
542 ihid->cmdbuf = kzalloc(sizeof(union command) + args_len, GFP_KERNEL); in i2c_hid_alloc_buffers()
544 if (!ihid->inbuf || !ihid->rawbuf || !ihid->argsbuf || !ihid->cmdbuf) { in i2c_hid_alloc_buffers()
545 i2c_hid_free_buffers(ihid); in i2c_hid_alloc_buffers()
549 ihid->bufsize = report_size; in i2c_hid_alloc_buffers()
559 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_get_raw_report() local
567 ask_count = min(count + 2, (size_t)ihid->bufsize); in i2c_hid_get_raw_report()
571 report_number, ihid->rawbuf, ask_count); in i2c_hid_get_raw_report()
576 ret_count = ihid->rawbuf[0] | (ihid->rawbuf[1] << 8); in i2c_hid_get_raw_report()
585 memcpy(buf, ihid->rawbuf + 2, count); in i2c_hid_get_raw_report()
641 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_parse() local
642 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_parse()
648 i2c_hid_dbg(ihid, "entering %s\n", __func__); in i2c_hid_parse()
672 i2c_hid_dbg(ihid, "asking HID report descriptor\n"); in i2c_hid_parse()
681 i2c_hid_dbg(ihid, "Report Descriptor: %*ph\n", rsize, rdesc); in i2c_hid_parse()
696 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_start() local
704 if (bufsize > ihid->bufsize) { in i2c_hid_start()
705 i2c_hid_free_buffers(ihid); in i2c_hid_start()
707 ret = i2c_hid_alloc_buffers(ihid, bufsize); in i2c_hid_start()
727 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_open() local
737 set_bit(I2C_HID_STARTED, &ihid->flags); in i2c_hid_open()
747 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_close() local
755 clear_bit(I2C_HID_STARTED, &ihid->flags); in i2c_hid_close()
766 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_power() local
768 i2c_hid_dbg(ihid, "%s lvl:%d\n", __func__, lvl); in i2c_hid_power()
794 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_init_irq() local
797 dev_dbg(&client->dev, "Requesting IRQ: %d\n", ihid->irq); in i2c_hid_init_irq()
799 ret = request_threaded_irq(ihid->irq, NULL, i2c_hid_irq, in i2c_hid_init_irq()
801 client->name, ihid); in i2c_hid_init_irq()
806 client->name, ihid->irq, ret); in i2c_hid_init_irq()
814 static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid) in i2c_hid_fetch_hid_descriptor() argument
816 struct i2c_client *client = ihid->client; in i2c_hid_fetch_hid_descriptor()
817 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_fetch_hid_descriptor()
822 i2c_hid_dbg(ihid, "Fetching the HID descriptor\n"); in i2c_hid_fetch_hid_descriptor()
823 ret = i2c_hid_command(client, &hid_descr_cmd, ihid->hdesc_buffer, in i2c_hid_fetch_hid_descriptor()
848 i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, ihid->hdesc_buffer); in i2c_hid_fetch_hid_descriptor()
946 struct i2c_hid *ihid; in i2c_hid_probe() local
953 ihid = kzalloc(sizeof(struct i2c_hid), GFP_KERNEL); in i2c_hid_probe()
954 if (!ihid) in i2c_hid_probe()
958 ret = i2c_hid_of_probe(client, &ihid->pdata); in i2c_hid_probe()
962 ret = i2c_hid_acpi_pdata(client, &ihid->pdata); in i2c_hid_probe()
969 ihid->pdata = *platform_data; in i2c_hid_probe()
973 ihid->irq = client->irq; in i2c_hid_probe()
975 ihid->desc = gpiod_get(&client->dev, NULL, GPIOD_IN); in i2c_hid_probe()
976 if (IS_ERR(ihid->desc)) { in i2c_hid_probe()
978 return PTR_ERR(ihid->desc); in i2c_hid_probe()
981 ihid->irq = gpiod_to_irq(ihid->desc); in i2c_hid_probe()
982 if (ihid->irq < 0) { in i2c_hid_probe()
983 gpiod_put(ihid->desc); in i2c_hid_probe()
985 return ihid->irq; in i2c_hid_probe()
989 i2c_set_clientdata(client, ihid); in i2c_hid_probe()
991 ihid->client = client; in i2c_hid_probe()
993 hidRegister = ihid->pdata.hid_descriptor_address; in i2c_hid_probe()
994 ihid->wHIDDescRegister = cpu_to_le16(hidRegister); in i2c_hid_probe()
996 init_waitqueue_head(&ihid->wait); in i2c_hid_probe()
1001 ret = i2c_hid_alloc_buffers(ihid, HID_MIN_BUFFER_SIZE); in i2c_hid_probe()
1009 ret = i2c_hid_fetch_hid_descriptor(ihid); in i2c_hid_probe()
1023 ihid->hid = hid; in i2c_hid_probe()
1029 hid->version = le16_to_cpu(ihid->hdesc.bcdVersion); in i2c_hid_probe()
1030 hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID); in i2c_hid_probe()
1031 hid->product = le16_to_cpu(ihid->hdesc.wProductID); in i2c_hid_probe()
1051 free_irq(ihid->irq, ihid); in i2c_hid_probe()
1058 if (ihid->desc) in i2c_hid_probe()
1059 gpiod_put(ihid->desc); in i2c_hid_probe()
1061 i2c_hid_free_buffers(ihid); in i2c_hid_probe()
1062 kfree(ihid); in i2c_hid_probe()
1068 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_remove() local
1076 hid = ihid->hid; in i2c_hid_remove()
1079 free_irq(ihid->irq, ihid); in i2c_hid_remove()
1081 if (ihid->bufsize) in i2c_hid_remove()
1082 i2c_hid_free_buffers(ihid); in i2c_hid_remove()
1084 if (ihid->desc) in i2c_hid_remove()
1085 gpiod_put(ihid->desc); in i2c_hid_remove()
1087 kfree(ihid); in i2c_hid_remove()
1098 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_suspend() local
1099 struct hid_device *hid = ihid->hid; in i2c_hid_suspend()
1106 disable_irq(ihid->irq); in i2c_hid_suspend()
1108 wake_status = enable_irq_wake(ihid->irq); in i2c_hid_suspend()
1110 ihid->irq_wake_enabled = true; in i2c_hid_suspend()
1126 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_resume() local
1127 struct hid_device *hid = ihid->hid; in i2c_hid_resume()
1130 enable_irq(ihid->irq); in i2c_hid_resume()
1135 if (device_may_wakeup(&client->dev) && ihid->irq_wake_enabled) { in i2c_hid_resume()
1136 wake_status = disable_irq_wake(ihid->irq); in i2c_hid_resume()
1138 ihid->irq_wake_enabled = false; in i2c_hid_resume()
1157 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_runtime_suspend() local
1160 disable_irq(ihid->irq); in i2c_hid_runtime_suspend()
1167 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_runtime_resume() local
1169 enable_irq(ihid->irq); in i2c_hid_runtime_resume()