Lines Matching +full:vddl +full:- +full:supply
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
42 #include <linux/platform_data/i2c-hid.h>
44 #include "../hid-ids.h"
45 #include "i2c-hid.h"
71 dev_printk(KERN_DEBUG, &(ihid)->client->dev, fmt, ##arg); \
189 * @idVendor: the 16-bit vendor ID
190 * @idProduct: the 16-bit product ID
214 union command *cmd = (union command *)ihid->cmdbuf; in __i2c_hid_command()
219 int length = command->length; in __i2c_hid_command()
220 bool wait = command->wait; in __i2c_hid_command()
221 unsigned int registerIndex = command->registerIndex; in __i2c_hid_command()
225 cmd->c.reg = ihid->wHIDDescRegister; in __i2c_hid_command()
227 cmd->data[0] = ihid->hdesc_buffer[registerIndex]; in __i2c_hid_command()
228 cmd->data[1] = ihid->hdesc_buffer[registerIndex + 1]; in __i2c_hid_command()
232 cmd->c.opcode = command->opcode; in __i2c_hid_command()
233 cmd->c.reportTypeID = reportID | reportType << 4; in __i2c_hid_command()
236 memcpy(cmd->data + length, args, args_len); in __i2c_hid_command()
239 i2c_hid_dbg(ihid, "%s: cmd=%*ph\n", __func__, length, cmd->data); in __i2c_hid_command()
241 msg[0].addr = client->addr; in __i2c_hid_command()
242 msg[0].flags = client->flags & I2C_M_TEN; in __i2c_hid_command()
244 msg[0].buf = cmd->data; in __i2c_hid_command()
246 msg[1].addr = client->addr; in __i2c_hid_command()
247 msg[1].flags = client->flags & I2C_M_TEN; in __i2c_hid_command()
252 set_bit(I2C_HID_READ_PENDING, &ihid->flags); in __i2c_hid_command()
256 set_bit(I2C_HID_RESET_PENDING, &ihid->flags); in __i2c_hid_command()
258 ret = i2c_transfer(client->adapter, msg, msg_num); in __i2c_hid_command()
261 clear_bit(I2C_HID_READ_PENDING, &ihid->flags); in __i2c_hid_command()
264 return ret < 0 ? ret : -EIO; in __i2c_hid_command()
268 if (wait && (ihid->quirks & I2C_HID_QUIRK_NO_IRQ_AFTER_RESET)) { in __i2c_hid_command()
272 if (!wait_event_timeout(ihid->wait, in __i2c_hid_command()
273 !test_bit(I2C_HID_RESET_PENDING, &ihid->flags), in __i2c_hid_command()
275 ret = -ENODATA; in __i2c_hid_command()
297 u16 readRegister = le16_to_cpu(ihid->hdesc.wDataRegister); in i2c_hid_get_report()
312 dev_err(&client->dev, in i2c_hid_get_report()
333 u8 *args = ihid->argsbuf; in i2c_hid_set_or_send_report()
336 u16 dataRegister = le16_to_cpu(ihid->hdesc.wDataRegister); in i2c_hid_set_or_send_report()
337 u16 outputRegister = le16_to_cpu(ihid->hdesc.wOutputRegister); in i2c_hid_set_or_send_report()
338 u16 maxOutputLength = le16_to_cpu(ihid->hdesc.wMaxOutputLength); in i2c_hid_set_or_send_report()
345 if (data_len > ihid->bufsize) in i2c_hid_set_or_send_report()
346 return -EINVAL; in i2c_hid_set_or_send_report()
356 return -ENOSYS; in i2c_hid_set_or_send_report()
388 dev_err(&client->dev, "failed to set a report to device.\n"); in i2c_hid_set_or_send_report()
408 ihid->quirks & I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV) { in i2c_hid_set_power()
420 dev_err(&client->dev, "failed to change power setting.\n"); in i2c_hid_set_power()
451 mutex_lock(&ihid->reset_lock); in i2c_hid_hwreset()
461 dev_err(&client->dev, "failed to reset device.\n"); in i2c_hid_hwreset()
470 mutex_unlock(&ihid->reset_lock); in i2c_hid_hwreset()
478 int size = le16_to_cpu(ihid->hdesc.wMaxInputLength); in i2c_hid_get_input()
480 if (size > ihid->bufsize) in i2c_hid_get_input()
481 size = ihid->bufsize; in i2c_hid_get_input()
483 ret = i2c_master_recv(ihid->client, ihid->inbuf, size); in i2c_hid_get_input()
488 dev_err(&ihid->client->dev, "%s: got %d data instead of %d\n", in i2c_hid_get_input()
493 ret_size = ihid->inbuf[0] | ihid->inbuf[1] << 8; in i2c_hid_get_input()
497 if (test_and_clear_bit(I2C_HID_RESET_PENDING, &ihid->flags)) in i2c_hid_get_input()
498 wake_up(&ihid->wait); in i2c_hid_get_input()
502 if (ihid->quirks & I2C_HID_QUIRK_BOGUS_IRQ && ret_size == 0xffff) { in i2c_hid_get_input()
503 dev_warn_once(&ihid->client->dev, "%s: IRQ triggered but " in i2c_hid_get_input()
509 if (ihid->quirks & I2C_HID_QUIRK_BAD_INPUT_SIZE) { in i2c_hid_get_input()
510 ihid->inbuf[0] = size & 0xff; in i2c_hid_get_input()
511 ihid->inbuf[1] = size >> 8; in i2c_hid_get_input()
514 dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", in i2c_hid_get_input()
520 i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf); in i2c_hid_get_input()
522 if (test_bit(I2C_HID_STARTED, &ihid->flags)) in i2c_hid_get_input()
523 hid_input_report(ihid->hid, HID_INPUT_REPORT, ihid->inbuf + 2, in i2c_hid_get_input()
524 ret_size - 2, 1); in i2c_hid_get_input()
533 if (test_bit(I2C_HID_READ_PENDING, &ihid->flags)) in i2c_hid_irq()
543 return ((report->size - 1) >> 3) + 1 + in i2c_hid_get_report_length()
544 report->device->report_enum[report->type].numbered + 2; in i2c_hid_get_report_length()
558 list_for_each_entry(report, &hid->report_enum[type].report_list, list) { in i2c_hid_find_max_report()
567 kfree(ihid->inbuf); in i2c_hid_free_buffers()
568 kfree(ihid->rawbuf); in i2c_hid_free_buffers()
569 kfree(ihid->argsbuf); in i2c_hid_free_buffers()
570 kfree(ihid->cmdbuf); in i2c_hid_free_buffers()
571 ihid->inbuf = NULL; in i2c_hid_free_buffers()
572 ihid->rawbuf = NULL; in i2c_hid_free_buffers()
573 ihid->cmdbuf = NULL; in i2c_hid_free_buffers()
574 ihid->argsbuf = NULL; in i2c_hid_free_buffers()
575 ihid->bufsize = 0; in i2c_hid_free_buffers()
588 ihid->inbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
589 ihid->rawbuf = kzalloc(report_size, GFP_KERNEL); in i2c_hid_alloc_buffers()
590 ihid->argsbuf = kzalloc(args_len, GFP_KERNEL); in i2c_hid_alloc_buffers()
591 ihid->cmdbuf = kzalloc(sizeof(union command) + args_len, GFP_KERNEL); in i2c_hid_alloc_buffers()
593 if (!ihid->inbuf || !ihid->rawbuf || !ihid->argsbuf || !ihid->cmdbuf) { in i2c_hid_alloc_buffers()
595 return -ENOMEM; in i2c_hid_alloc_buffers()
598 ihid->bufsize = report_size; in i2c_hid_alloc_buffers()
607 struct i2c_client *client = hid->driver_data; in i2c_hid_get_raw_report()
613 return -EINVAL; in i2c_hid_get_raw_report()
616 ask_count = min(count + 2, (size_t)ihid->bufsize); in i2c_hid_get_raw_report()
620 report_number, ihid->rawbuf, ask_count); in i2c_hid_get_raw_report()
625 ret_count = ihid->rawbuf[0] | (ihid->rawbuf[1] << 8); in i2c_hid_get_raw_report()
633 count = min(count, ret_count - 2); in i2c_hid_get_raw_report()
634 memcpy(buf, ihid->rawbuf + 2, count); in i2c_hid_get_raw_report()
642 struct i2c_client *client = hid->driver_data; in i2c_hid_output_raw_report()
648 return -EINVAL; in i2c_hid_output_raw_report()
650 mutex_lock(&ihid->reset_lock); in i2c_hid_output_raw_report()
654 count--; in i2c_hid_output_raw_report()
664 mutex_unlock(&ihid->reset_lock); in i2c_hid_output_raw_report()
685 return -EINVAL; in i2c_hid_raw_request()
688 return -EIO; in i2c_hid_raw_request()
694 struct i2c_client *client = hid->driver_data; in i2c_hid_parse()
696 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_parse()
705 rsize = le16_to_cpu(hdesc->wReportDescLength); in i2c_hid_parse()
708 return -EINVAL; in i2c_hid_parse()
715 } while (tries-- > 0 && ret); in i2c_hid_parse()
720 use_override = i2c_hid_get_dmi_hid_report_desc_override(client->name, in i2c_hid_parse()
731 return -ENOMEM; in i2c_hid_parse()
741 return -EIO; in i2c_hid_parse()
761 struct i2c_client *client = hid->driver_data; in i2c_hid_start()
770 if (bufsize > ihid->bufsize) { in i2c_hid_start()
771 disable_irq(client->irq); in i2c_hid_start()
775 enable_irq(client->irq); in i2c_hid_start()
786 hid->claimed = 0; in i2c_hid_stop()
791 struct i2c_client *client = hid->driver_data; in i2c_hid_open()
794 set_bit(I2C_HID_STARTED, &ihid->flags); in i2c_hid_open()
800 struct i2c_client *client = hid->driver_data; in i2c_hid_close()
803 clear_bit(I2C_HID_STARTED, &ihid->flags); in i2c_hid_close()
823 dev_dbg(&client->dev, "Requesting IRQ: %d\n", client->irq); in i2c_hid_init_irq()
825 if (!irq_get_trigger_type(client->irq)) in i2c_hid_init_irq()
828 ret = request_threaded_irq(client->irq, NULL, i2c_hid_irq, in i2c_hid_init_irq()
829 irqflags | IRQF_ONESHOT, client->name, ihid); in i2c_hid_init_irq()
831 dev_warn(&client->dev, in i2c_hid_init_irq()
834 client->name, client->irq, ret); in i2c_hid_init_irq()
844 struct i2c_client *client = ihid->client; in i2c_hid_fetch_hid_descriptor()
845 struct i2c_hid_desc *hdesc = &ihid->hdesc; in i2c_hid_fetch_hid_descriptor()
850 if (i2c_hid_get_dmi_i2c_hid_desc_override(client->name)) { in i2c_hid_fetch_hid_descriptor()
852 ihid->hdesc = in i2c_hid_fetch_hid_descriptor()
853 *i2c_hid_get_dmi_i2c_hid_desc_override(client->name); in i2c_hid_fetch_hid_descriptor()
857 ihid->hdesc_buffer, in i2c_hid_fetch_hid_descriptor()
860 dev_err(&client->dev, "hid_descr_cmd failed\n"); in i2c_hid_fetch_hid_descriptor()
861 return -ENODEV; in i2c_hid_fetch_hid_descriptor()
866 * bytes 0-1 -> length in i2c_hid_fetch_hid_descriptor()
867 * bytes 2-3 -> bcdVersion (has to be 1.00) */ in i2c_hid_fetch_hid_descriptor()
869 if (le16_to_cpu(hdesc->bcdVersion) != 0x0100) { in i2c_hid_fetch_hid_descriptor()
870 dev_err(&client->dev, in i2c_hid_fetch_hid_descriptor()
872 le16_to_cpu(hdesc->bcdVersion)); in i2c_hid_fetch_hid_descriptor()
873 return -ENODEV; in i2c_hid_fetch_hid_descriptor()
877 dsize = le16_to_cpu(hdesc->wHIDDescLength); in i2c_hid_fetch_hid_descriptor()
879 dev_err(&client->dev, "weird size of HID descriptor (%u)\n", in i2c_hid_fetch_hid_descriptor()
881 return -ENODEV; in i2c_hid_fetch_hid_descriptor()
883 i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, ihid->hdesc_buffer); in i2c_hid_fetch_hid_descriptor()
907 handle = ACPI_HANDLE(&client->dev); in i2c_hid_acpi_pdata()
909 dev_err(&client->dev, "Error could not get ACPI device\n"); in i2c_hid_acpi_pdata()
910 return -ENODEV; in i2c_hid_acpi_pdata()
914 return -ENODEV; in i2c_hid_acpi_pdata()
919 dev_err(&client->dev, "Error _DSM call to get HID descriptor address failed\n"); in i2c_hid_acpi_pdata()
920 return -ENODEV; in i2c_hid_acpi_pdata()
923 pdata->hid_descriptor_address = obj->integer.value; in i2c_hid_acpi_pdata()
961 return -ENODEV; in i2c_hid_acpi_pdata()
975 struct device *dev = &client->dev; in i2c_hid_of_probe()
979 ret = of_property_read_u32(dev->of_node, "hid-descr-addr", &val); in i2c_hid_of_probe()
981 dev_err(&client->dev, "HID register address not provided\n"); in i2c_hid_of_probe()
982 return -ENODEV; in i2c_hid_of_probe()
985 dev_err(&client->dev, "Bad HID register address: 0x%08x\n", in i2c_hid_of_probe()
987 return -EINVAL; in i2c_hid_of_probe()
989 pdata->hid_descriptor_address = val; in i2c_hid_of_probe()
995 { .compatible = "hid-over-i2c" },
1003 return -ENODEV; in i2c_hid_of_probe()
1012 if (!device_property_read_u32(&client->dev, "post-power-on-delay-ms", in i2c_hid_fwnode_probe()
1014 pdata->post_power_delay_ms = val; in i2c_hid_fwnode_probe()
1024 struct i2c_hid_platform_data *platform_data = client->dev.platform_data; in i2c_hid_probe()
1026 dbg_hid("HID probe called for i2c 0x%02x\n", client->addr); in i2c_hid_probe()
1028 if (!client->irq) { in i2c_hid_probe()
1029 dev_err(&client->dev, in i2c_hid_probe()
1031 return -EINVAL; in i2c_hid_probe()
1034 if (client->irq < 0) { in i2c_hid_probe()
1035 if (client->irq != -EPROBE_DEFER) in i2c_hid_probe()
1036 dev_err(&client->dev, in i2c_hid_probe()
1038 return client->irq; in i2c_hid_probe()
1041 ihid = devm_kzalloc(&client->dev, sizeof(*ihid), GFP_KERNEL); in i2c_hid_probe()
1043 return -ENOMEM; in i2c_hid_probe()
1045 if (client->dev.of_node) { in i2c_hid_probe()
1046 ret = i2c_hid_of_probe(client, &ihid->pdata); in i2c_hid_probe()
1050 ret = i2c_hid_acpi_pdata(client, &ihid->pdata); in i2c_hid_probe()
1054 ihid->pdata = *platform_data; in i2c_hid_probe()
1058 i2c_hid_fwnode_probe(client, &ihid->pdata); in i2c_hid_probe()
1060 ihid->pdata.supplies[0].supply = "vdd"; in i2c_hid_probe()
1061 ihid->pdata.supplies[1].supply = "vddl"; in i2c_hid_probe()
1063 ret = devm_regulator_bulk_get(&client->dev, in i2c_hid_probe()
1064 ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_probe()
1065 ihid->pdata.supplies); in i2c_hid_probe()
1069 ret = regulator_bulk_enable(ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_probe()
1070 ihid->pdata.supplies); in i2c_hid_probe()
1074 if (ihid->pdata.post_power_delay_ms) in i2c_hid_probe()
1075 msleep(ihid->pdata.post_power_delay_ms); in i2c_hid_probe()
1079 ihid->client = client; in i2c_hid_probe()
1081 hidRegister = ihid->pdata.hid_descriptor_address; in i2c_hid_probe()
1082 ihid->wHIDDescRegister = cpu_to_le16(hidRegister); in i2c_hid_probe()
1084 init_waitqueue_head(&ihid->wait); in i2c_hid_probe()
1085 mutex_init(&ihid->reset_lock); in i2c_hid_probe()
1094 i2c_hid_acpi_fix_up_power(&client->dev); in i2c_hid_probe()
1096 i2c_hid_acpi_enable_wakeup(&client->dev); in i2c_hid_probe()
1098 device_enable_async_suspend(&client->dev); in i2c_hid_probe()
1103 dev_dbg(&client->dev, "nothing at this address: %d\n", ret); in i2c_hid_probe()
1104 ret = -ENXIO; in i2c_hid_probe()
1122 ihid->hid = hid; in i2c_hid_probe()
1124 hid->driver_data = client; in i2c_hid_probe()
1125 hid->ll_driver = &i2c_hid_ll_driver; in i2c_hid_probe()
1126 hid->dev.parent = &client->dev; in i2c_hid_probe()
1127 hid->bus = BUS_I2C; in i2c_hid_probe()
1128 hid->version = le16_to_cpu(ihid->hdesc.bcdVersion); in i2c_hid_probe()
1129 hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID); in i2c_hid_probe()
1130 hid->product = le16_to_cpu(ihid->hdesc.wProductID); in i2c_hid_probe()
1132 snprintf(hid->name, sizeof(hid->name), "%s %04hX:%04hX", in i2c_hid_probe()
1133 client->name, hid->vendor, hid->product); in i2c_hid_probe()
1134 strlcpy(hid->phys, dev_name(&client->dev), sizeof(hid->phys)); in i2c_hid_probe()
1136 ihid->quirks = i2c_hid_lookup_quirk(hid->vendor, hid->product); in i2c_hid_probe()
1140 if (ret != -ENODEV) in i2c_hid_probe()
1151 free_irq(client->irq, ihid); in i2c_hid_probe()
1154 regulator_bulk_disable(ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_probe()
1155 ihid->pdata.supplies); in i2c_hid_probe()
1165 hid = ihid->hid; in i2c_hid_remove()
1168 free_irq(client->irq, ihid); in i2c_hid_remove()
1170 if (ihid->bufsize) in i2c_hid_remove()
1173 regulator_bulk_disable(ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_remove()
1174 ihid->pdata.supplies); in i2c_hid_remove()
1184 free_irq(client->irq, ihid); in i2c_hid_shutdown()
1186 i2c_hid_acpi_shutdown(&client->dev); in i2c_hid_shutdown()
1194 struct hid_device *hid = ihid->hid; in i2c_hid_suspend()
1198 if (hid->driver && hid->driver->suspend) { in i2c_hid_suspend()
1199 ret = hid->driver->suspend(hid, PMSG_SUSPEND); in i2c_hid_suspend()
1207 disable_irq(client->irq); in i2c_hid_suspend()
1209 if (device_may_wakeup(&client->dev)) { in i2c_hid_suspend()
1210 wake_status = enable_irq_wake(client->irq); in i2c_hid_suspend()
1212 ihid->irq_wake_enabled = true; in i2c_hid_suspend()
1217 regulator_bulk_disable(ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_suspend()
1218 ihid->pdata.supplies); in i2c_hid_suspend()
1229 struct hid_device *hid = ihid->hid; in i2c_hid_resume()
1232 if (!device_may_wakeup(&client->dev)) { in i2c_hid_resume()
1233 ret = regulator_bulk_enable(ARRAY_SIZE(ihid->pdata.supplies), in i2c_hid_resume()
1234 ihid->pdata.supplies); in i2c_hid_resume()
1238 if (ihid->pdata.post_power_delay_ms) in i2c_hid_resume()
1239 msleep(ihid->pdata.post_power_delay_ms); in i2c_hid_resume()
1240 } else if (ihid->irq_wake_enabled) { in i2c_hid_resume()
1241 wake_status = disable_irq_wake(client->irq); in i2c_hid_resume()
1243 ihid->irq_wake_enabled = false; in i2c_hid_resume()
1249 enable_irq(client->irq); in i2c_hid_resume()
1259 if (ihid->quirks & I2C_HID_QUIRK_RESET_ON_RESUME) in i2c_hid_resume()
1267 if (hid->driver && hid->driver->reset_resume) { in i2c_hid_resume()
1268 ret = hid->driver->reset_resume(hid); in i2c_hid_resume()
1282 { "hid-over-i2c", 0 },