Lines Matching refs:ihid

57 #define i2c_hid_dbg(ihid, fmt, arg...)					  \  argument
60 dev_printk(KERN_DEBUG, &(ihid)->client->dev, fmt, ##arg); \
159 struct i2c_hid *ihid = i2c_get_clientdata(client); in __i2c_hid_command() local
160 union command *cmd = (union command *)ihid->cmdbuf; in __i2c_hid_command()
171 cmd->c.reg = ihid->wHIDDescRegister; in __i2c_hid_command()
173 cmd->data[0] = ihid->hdesc_buffer[registerIndex]; in __i2c_hid_command()
174 cmd->data[1] = ihid->hdesc_buffer[registerIndex + 1]; in __i2c_hid_command()
185 i2c_hid_dbg(ihid, "%s: cmd=%*ph\n", __func__, length, cmd->data); in __i2c_hid_command()
198 set_bit(I2C_HID_READ_PENDING, &ihid->flags); in __i2c_hid_command()
202 set_bit(I2C_HID_RESET_PENDING, &ihid->flags); in __i2c_hid_command()
207 clear_bit(I2C_HID_READ_PENDING, &ihid->flags); in __i2c_hid_command()
215 i2c_hid_dbg(ihid, "%s: waiting...\n", __func__); in __i2c_hid_command()
216 if (!wait_event_timeout(ihid->wait, in __i2c_hid_command()
217 !test_bit(I2C_HID_RESET_PENDING, &ihid->flags), in __i2c_hid_command()
220 i2c_hid_dbg(ihid, "%s: finished.\n", __func__); in __i2c_hid_command()
237 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_get_report() local
241 u16 readRegister = le16_to_cpu(ihid->hdesc.wDataRegister); in i2c_hid_get_report()
243 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_get_report()
276 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_set_or_send_report() local
277 u8 *args = ihid->argsbuf; in i2c_hid_set_or_send_report()
280 u16 dataRegister = le16_to_cpu(ihid->hdesc.wDataRegister); in i2c_hid_set_or_send_report()
281 u16 outputRegister = le16_to_cpu(ihid->hdesc.wOutputRegister); in i2c_hid_set_or_send_report()
282 u16 maxOutputLength = le16_to_cpu(ihid->hdesc.wMaxOutputLength); in i2c_hid_set_or_send_report()
287 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_set_or_send_report()
289 if (data_len > ihid->bufsize) in i2c_hid_set_or_send_report()
341 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_set_power() local
344 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_set_power()
356 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_hwreset() local
359 i2c_hid_dbg(ihid, "%s\n", __func__); in i2c_hid_hwreset()
365 i2c_hid_dbg(ihid, "resetting...\n"); in i2c_hid_hwreset()
377 static void i2c_hid_get_input(struct i2c_hid *ihid) in i2c_hid_get_input() argument
380 int size = le16_to_cpu(ihid->hdesc.wMaxInputLength); in i2c_hid_get_input()
382 if (size > ihid->bufsize) in i2c_hid_get_input()
383 size = ihid->bufsize; in i2c_hid_get_input()
385 ret = i2c_master_recv(ihid->client, ihid->inbuf, size); in i2c_hid_get_input()
390 dev_err(&ihid->client->dev, "%s: got %d data instead of %d\n", in i2c_hid_get_input()
395 ret_size = ihid->inbuf[0] | ihid->inbuf[1] << 8; in i2c_hid_get_input()
399 if (test_and_clear_bit(I2C_HID_RESET_PENDING, &ihid->flags)) in i2c_hid_get_input()
400 wake_up(&ihid->wait); in i2c_hid_get_input()
405 dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", in i2c_hid_get_input()
410 i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf); in i2c_hid_get_input()
412 if (test_bit(I2C_HID_STARTED, &ihid->flags)) in i2c_hid_get_input()
413 hid_input_report(ihid->hid, HID_INPUT_REPORT, ihid->inbuf + 2, in i2c_hid_get_input()
421 struct i2c_hid *ihid = dev_id; in i2c_hid_irq() local
423 if (test_bit(I2C_HID_READ_PENDING, &ihid->flags)) in i2c_hid_irq()
426 i2c_hid_get_input(ihid); in i2c_hid_irq()
442 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_init_report() local
451 i2c_hid_dbg(ihid, "report (len=%d): %*ph\n", size, size, buffer); in i2c_hid_init_report()
474 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_init_reports() local
475 u8 *inbuf = kzalloc(ihid->bufsize, GFP_KERNEL); in i2c_hid_init_reports()
490 i2c_hid_init_report(report, inbuf, ihid->bufsize); in i2c_hid_init_reports()
515 static void i2c_hid_free_buffers(struct i2c_hid *ihid) in i2c_hid_free_buffers() argument
517 kfree(ihid->inbuf); in i2c_hid_free_buffers()
518 kfree(ihid->rawbuf); in i2c_hid_free_buffers()
519 kfree(ihid->argsbuf); in i2c_hid_free_buffers()
520 kfree(ihid->cmdbuf); in i2c_hid_free_buffers()
521 ihid->inbuf = NULL; in i2c_hid_free_buffers()
522 ihid->rawbuf = NULL; in i2c_hid_free_buffers()
523 ihid->cmdbuf = NULL; in i2c_hid_free_buffers()
524 ihid->argsbuf = NULL; in i2c_hid_free_buffers()
525 ihid->bufsize = 0; in i2c_hid_free_buffers()
528 static int i2c_hid_alloc_buffers(struct i2c_hid *ihid, size_t report_size) in i2c_hid_alloc_buffers() argument
537 ihid->inbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
538 ihid->rawbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
539 ihid->argsbuf = kzalloc(args_len, GFP_KERNEL); in i2c_hid_alloc_buffers()
540 ihid->cmdbuf = kzalloc(sizeof(union command) + args_len, GFP_KERNEL); in i2c_hid_alloc_buffers()
542 if (!ihid->inbuf || !ihid->rawbuf || !ihid->argsbuf || !ihid->cmdbuf) { in i2c_hid_alloc_buffers()
543 i2c_hid_free_buffers(ihid); in i2c_hid_alloc_buffers()
547 ihid->bufsize = report_size; in i2c_hid_alloc_buffers()
557 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_get_raw_report() local
565 ask_count = min(count + 2, (size_t)ihid->bufsize); in i2c_hid_get_raw_report()
569 report_number, ihid->rawbuf, ask_count); in i2c_hid_get_raw_report()
574 ret_count = ihid->rawbuf[0] | (ihid->rawbuf[1] << 8); in i2c_hid_get_raw_report()
583 memcpy(buf, ihid->rawbuf + 2, count); in i2c_hid_get_raw_report()
639 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_parse() local
640 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_parse()
646 i2c_hid_dbg(ihid, "entering %s\n", __func__); in i2c_hid_parse()
670 i2c_hid_dbg(ihid, "asking HID report descriptor\n"); in i2c_hid_parse()
679 i2c_hid_dbg(ihid, "Report Descriptor: %*ph\n", rsize, rdesc); in i2c_hid_parse()
694 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_start() local
702 if (bufsize > ihid->bufsize) { in i2c_hid_start()
703 i2c_hid_free_buffers(ihid); in i2c_hid_start()
705 ret = i2c_hid_alloc_buffers(ihid, bufsize); in i2c_hid_start()
725 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_open() local
735 set_bit(I2C_HID_STARTED, &ihid->flags); in i2c_hid_open()
745 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_close() local
753 clear_bit(I2C_HID_STARTED, &ihid->flags); in i2c_hid_close()
764 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_power() local
766 i2c_hid_dbg(ihid, "%s lvl:%d\n", __func__, lvl); in i2c_hid_power()
792 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_init_irq() local
795 dev_dbg(&client->dev, "Requesting IRQ: %d\n", ihid->irq); in i2c_hid_init_irq()
797 ret = request_threaded_irq(ihid->irq, NULL, i2c_hid_irq, in i2c_hid_init_irq()
799 client->name, ihid); in i2c_hid_init_irq()
804 client->name, ihid->irq, ret); in i2c_hid_init_irq()
812 static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid) in i2c_hid_fetch_hid_descriptor() argument
814 struct i2c_client *client = ihid->client; in i2c_hid_fetch_hid_descriptor()
815 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_fetch_hid_descriptor()
820 i2c_hid_dbg(ihid, "Fetching the HID descriptor\n"); in i2c_hid_fetch_hid_descriptor()
821 ret = i2c_hid_command(client, &hid_descr_cmd, ihid->hdesc_buffer, in i2c_hid_fetch_hid_descriptor()
846 i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, ihid->hdesc_buffer); in i2c_hid_fetch_hid_descriptor()
944 struct i2c_hid *ihid; in i2c_hid_probe() local
951 ihid = kzalloc(sizeof(struct i2c_hid), GFP_KERNEL); in i2c_hid_probe()
952 if (!ihid) in i2c_hid_probe()
956 ret = i2c_hid_of_probe(client, &ihid->pdata); in i2c_hid_probe()
960 ret = i2c_hid_acpi_pdata(client, &ihid->pdata); in i2c_hid_probe()
967 ihid->pdata = *platform_data; in i2c_hid_probe()
971 ihid->irq = client->irq; in i2c_hid_probe()
973 ihid->desc = gpiod_get(&client->dev, NULL, GPIOD_IN); in i2c_hid_probe()
974 if (IS_ERR(ihid->desc)) { in i2c_hid_probe()
976 return PTR_ERR(ihid->desc); in i2c_hid_probe()
979 ihid->irq = gpiod_to_irq(ihid->desc); in i2c_hid_probe()
980 if (ihid->irq < 0) { in i2c_hid_probe()
981 gpiod_put(ihid->desc); in i2c_hid_probe()
983 return ihid->irq; in i2c_hid_probe()
987 i2c_set_clientdata(client, ihid); in i2c_hid_probe()
989 ihid->client = client; in i2c_hid_probe()
991 hidRegister = ihid->pdata.hid_descriptor_address; in i2c_hid_probe()
992 ihid->wHIDDescRegister = cpu_to_le16(hidRegister); in i2c_hid_probe()
994 init_waitqueue_head(&ihid->wait); in i2c_hid_probe()
999 ret = i2c_hid_alloc_buffers(ihid, HID_MIN_BUFFER_SIZE); in i2c_hid_probe()
1007 ret = i2c_hid_fetch_hid_descriptor(ihid); in i2c_hid_probe()
1021 ihid->hid = hid; in i2c_hid_probe()
1028 hid->version = le16_to_cpu(ihid->hdesc.bcdVersion); in i2c_hid_probe()
1029 hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID); in i2c_hid_probe()
1030 hid->product = le16_to_cpu(ihid->hdesc.wProductID); in i2c_hid_probe()
1049 free_irq(ihid->irq, ihid); in i2c_hid_probe()
1056 if (ihid->desc) in i2c_hid_probe()
1057 gpiod_put(ihid->desc); in i2c_hid_probe()
1059 i2c_hid_free_buffers(ihid); in i2c_hid_probe()
1060 kfree(ihid); in i2c_hid_probe()
1066 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_remove() local
1074 hid = ihid->hid; in i2c_hid_remove()
1077 free_irq(ihid->irq, ihid); in i2c_hid_remove()
1079 if (ihid->bufsize) in i2c_hid_remove()
1080 i2c_hid_free_buffers(ihid); in i2c_hid_remove()
1082 if (ihid->desc) in i2c_hid_remove()
1083 gpiod_put(ihid->desc); in i2c_hid_remove()
1085 kfree(ihid); in i2c_hid_remove()
1096 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_suspend() local
1097 struct hid_device *hid = ihid->hid; in i2c_hid_suspend()
1100 disable_irq(ihid->irq); in i2c_hid_suspend()
1102 enable_irq_wake(ihid->irq); in i2c_hid_suspend()
1117 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_resume() local
1118 struct hid_device *hid = ihid->hid; in i2c_hid_resume()
1120 enable_irq(ihid->irq); in i2c_hid_resume()
1126 disable_irq_wake(ihid->irq); in i2c_hid_resume()
1141 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_runtime_suspend() local
1144 disable_irq(ihid->irq); in i2c_hid_runtime_suspend()
1151 struct i2c_hid *ihid = i2c_get_clientdata(client); in i2c_hid_runtime_resume() local
1153 enable_irq(ihid->irq); in i2c_hid_runtime_resume()