Lines Matching refs:data
153 u8 data[MXT_DIAGNOSTIC_SIZE]; member
414 static void mxt_dump_message(struct mxt_data *data, u8 *message) in mxt_dump_message() argument
416 dev_dbg(&data->client->dev, "message: %*ph\n", in mxt_dump_message()
417 data->T5_msg_size, message); in mxt_dump_message()
420 static int mxt_wait_for_completion(struct mxt_data *data, in mxt_wait_for_completion() argument
424 struct device *dev = &data->client->dev; in mxt_wait_for_completion()
438 static int mxt_bootloader_read(struct mxt_data *data, in mxt_bootloader_read() argument
444 msg.addr = data->bootloader_addr; in mxt_bootloader_read()
445 msg.flags = data->client->flags & I2C_M_TEN; in mxt_bootloader_read()
450 ret = i2c_transfer(data->client->adapter, &msg, 1); in mxt_bootloader_read()
455 dev_err(&data->client->dev, "%s: i2c recv failed (%d)\n", in mxt_bootloader_read()
462 static int mxt_bootloader_write(struct mxt_data *data, in mxt_bootloader_write() argument
468 msg.addr = data->bootloader_addr; in mxt_bootloader_write()
469 msg.flags = data->client->flags & I2C_M_TEN; in mxt_bootloader_write()
473 ret = i2c_transfer(data->client->adapter, &msg, 1); in mxt_bootloader_write()
478 dev_err(&data->client->dev, "%s: i2c send failed (%d)\n", in mxt_bootloader_write()
485 static int mxt_lookup_bootloader_address(struct mxt_data *data, bool retry) in mxt_lookup_bootloader_address() argument
487 u8 appmode = data->client->addr; in mxt_lookup_bootloader_address()
489 u8 family_id = data->info ? data->info->family_id : 0; in mxt_lookup_bootloader_address()
508 dev_err(&data->client->dev, in mxt_lookup_bootloader_address()
514 data->bootloader_addr = bootloader; in mxt_lookup_bootloader_address()
518 static int mxt_probe_bootloader(struct mxt_data *data, bool alt_address) in mxt_probe_bootloader() argument
520 struct device *dev = &data->client->dev; in mxt_probe_bootloader()
525 error = mxt_lookup_bootloader_address(data, alt_address); in mxt_probe_bootloader()
529 error = mxt_bootloader_read(data, &val, 1); in mxt_probe_bootloader()
542 static u8 mxt_get_bootloader_version(struct mxt_data *data, u8 val) in mxt_get_bootloader_version() argument
544 struct device *dev = &data->client->dev; in mxt_get_bootloader_version()
548 if (mxt_bootloader_read(data, &buf[0], 3) != 0) { in mxt_get_bootloader_version()
563 static int mxt_check_bootloader(struct mxt_data *data, unsigned int state, in mxt_check_bootloader() argument
566 struct device *dev = &data->client->dev; in mxt_check_bootloader()
578 ret = mxt_wait_for_completion(data, &data->bl_completion, in mxt_check_bootloader()
592 ret = mxt_bootloader_read(data, &val, 1); in mxt_check_bootloader()
597 val = mxt_get_bootloader_version(data, val); in mxt_check_bootloader()
626 static int mxt_send_bootloader_cmd(struct mxt_data *data, bool unlock) in mxt_send_bootloader_cmd() argument
638 return mxt_bootloader_write(data, buf, sizeof(buf)); in mxt_send_bootloader_cmd()
644 struct mxt_data *data = i2c_get_clientdata(client); in mxt_wakeup_toggle() local
646 switch (data->wakeup_method) { in mxt_wakeup_toggle()
656 gpiod_set_value(data->wake_gpio, wake_up); in mxt_wakeup_toggle()
749 mxt_get_object(struct mxt_data *data, u8 type) in mxt_get_object() argument
754 for (i = 0; i < data->info->object_num; i++) { in mxt_get_object()
755 object = data->object_table + i; in mxt_get_object()
760 dev_warn(&data->client->dev, "Invalid object type T%u\n", type); in mxt_get_object()
764 static void mxt_proc_t6_messages(struct mxt_data *data, u8 *msg) in mxt_proc_t6_messages() argument
766 struct device *dev = &data->client->dev; in mxt_proc_t6_messages()
770 if (crc != data->config_crc) { in mxt_proc_t6_messages()
771 data->config_crc = crc; in mxt_proc_t6_messages()
775 complete(&data->crc_completion); in mxt_proc_t6_messages()
779 complete(&data->reset_completion); in mxt_proc_t6_messages()
782 if (status != data->t6_status) in mxt_proc_t6_messages()
794 data->t6_status = status; in mxt_proc_t6_messages()
797 static int mxt_write_object(struct mxt_data *data, in mxt_write_object() argument
803 object = mxt_get_object(data, type); in mxt_write_object()
808 return mxt_write_reg(data->client, reg + offset, val); in mxt_write_object()
811 static void mxt_input_button(struct mxt_data *data, u8 *message) in mxt_input_button() argument
813 struct input_dev *input = data->input_dev; in mxt_input_button()
816 for (i = 0; i < data->t19_num_keys; i++) { in mxt_input_button()
817 if (data->t19_keymap[i] == KEY_RESERVED) in mxt_input_button()
821 input_report_key(input, data->t19_keymap[i], in mxt_input_button()
826 static void mxt_input_sync(struct mxt_data *data) in mxt_input_sync() argument
828 input_mt_report_pointer_emulation(data->input_dev, in mxt_input_sync()
829 data->t19_num_keys); in mxt_input_sync()
830 input_sync(data->input_dev); in mxt_input_sync()
833 static void mxt_proc_t9_message(struct mxt_data *data, u8 *message) in mxt_proc_t9_message() argument
835 struct device *dev = &data->client->dev; in mxt_proc_t9_message()
836 struct input_dev *input_dev = data->input_dev; in mxt_proc_t9_message()
844 id = message[0] - data->T9_reportid_min; in mxt_proc_t9_message()
850 if (data->max_x < 1024) in mxt_proc_t9_message()
852 if (data->max_y < 1024) in mxt_proc_t9_message()
881 mxt_input_sync(data); in mxt_proc_t9_message()
890 touchscreen_report_pos(input_dev, &data->prop, x, y, true); in mxt_proc_t9_message()
898 data->update_input = true; in mxt_proc_t9_message()
901 static void mxt_proc_t15_messages(struct mxt_data *data, u8 *message) in mxt_proc_t15_messages() argument
903 struct input_dev *input_dev = data->input_dev; in mxt_proc_t15_messages()
907 for (key = 0; key < data->t15_num_keys; key++) in mxt_proc_t15_messages()
908 input_report_key(input_dev, data->t15_keymap[key], in mxt_proc_t15_messages()
911 data->update_input = true; in mxt_proc_t15_messages()
914 static void mxt_proc_t97_messages(struct mxt_data *data, u8 *message) in mxt_proc_t97_messages() argument
916 mxt_proc_t15_messages(data, message); in mxt_proc_t97_messages()
919 static void mxt_proc_t100_message(struct mxt_data *data, u8 *message) in mxt_proc_t100_message() argument
921 struct device *dev = &data->client->dev; in mxt_proc_t100_message()
922 struct input_dev *input_dev = data->input_dev; in mxt_proc_t100_message()
934 id = message[0] - data->T100_reportid_min - 2; in mxt_proc_t100_message()
952 if (data->t100_aux_vect) in mxt_proc_t100_message()
953 orientation = message[data->t100_aux_vect]; in mxt_proc_t100_message()
962 if (data->t100_aux_area) in mxt_proc_t100_message()
963 major = message[data->t100_aux_area]; in mxt_proc_t100_message()
965 if (data->t100_aux_ampl) in mxt_proc_t100_message()
966 pressure = message[data->t100_aux_ampl]; in mxt_proc_t100_message()
968 if (data->t100_aux_vect) in mxt_proc_t100_message()
969 orientation = message[data->t100_aux_vect]; in mxt_proc_t100_message()
982 if (data->t100_aux_ampl) in mxt_proc_t100_message()
983 pressure = message[data->t100_aux_ampl]; in mxt_proc_t100_message()
1011 touchscreen_report_pos(input_dev, &data->prop, x, y, true); in mxt_proc_t100_message()
1023 data->update_input = true; in mxt_proc_t100_message()
1026 static int mxt_proc_message(struct mxt_data *data, u8 *message) in mxt_proc_message() argument
1033 if (report_id == data->T6_reportid) { in mxt_proc_message()
1034 mxt_proc_t6_messages(data, message); in mxt_proc_message()
1035 } else if (!data->input_dev) { in mxt_proc_message()
1040 mxt_dump_message(data, message); in mxt_proc_message()
1041 } else if (report_id >= data->T9_reportid_min && in mxt_proc_message()
1042 report_id <= data->T9_reportid_max) { in mxt_proc_message()
1043 mxt_proc_t9_message(data, message); in mxt_proc_message()
1044 } else if (report_id >= data->T15_reportid_min && in mxt_proc_message()
1045 report_id <= data->T15_reportid_max) { in mxt_proc_message()
1046 mxt_proc_t15_messages(data, message); in mxt_proc_message()
1047 } else if (report_id >= data->T97_reportid_min && in mxt_proc_message()
1048 report_id <= data->T97_reportid_max) { in mxt_proc_message()
1049 mxt_proc_t97_messages(data, message); in mxt_proc_message()
1050 } else if (report_id >= data->T100_reportid_min && in mxt_proc_message()
1051 report_id <= data->T100_reportid_max) { in mxt_proc_message()
1052 mxt_proc_t100_message(data, message); in mxt_proc_message()
1053 } else if (report_id == data->T19_reportid) { in mxt_proc_message()
1054 mxt_input_button(data, message); in mxt_proc_message()
1055 data->update_input = true; in mxt_proc_message()
1057 mxt_dump_message(data, message); in mxt_proc_message()
1063 static int mxt_read_and_process_messages(struct mxt_data *data, u8 count) in mxt_read_and_process_messages() argument
1065 struct device *dev = &data->client->dev; in mxt_read_and_process_messages()
1071 if (count > data->max_reportid) in mxt_read_and_process_messages()
1075 ret = __mxt_read_reg(data->client, data->T5_address, in mxt_read_and_process_messages()
1076 data->T5_msg_size * count, data->msg_buf); in mxt_read_and_process_messages()
1083 ret = mxt_proc_message(data, in mxt_read_and_process_messages()
1084 data->msg_buf + data->T5_msg_size * i); in mxt_read_and_process_messages()
1094 static irqreturn_t mxt_process_messages_t44(struct mxt_data *data) in mxt_process_messages_t44() argument
1096 struct device *dev = &data->client->dev; in mxt_process_messages_t44()
1101 ret = __mxt_read_reg(data->client, data->T44_address, in mxt_process_messages_t44()
1102 data->T5_msg_size + 1, data->msg_buf); in mxt_process_messages_t44()
1108 count = data->msg_buf[0]; in mxt_process_messages_t44()
1117 if (count > data->max_reportid) { in mxt_process_messages_t44()
1119 count = data->max_reportid; in mxt_process_messages_t44()
1123 ret = mxt_proc_message(data, data->msg_buf + 1); in mxt_process_messages_t44()
1133 ret = mxt_read_and_process_messages(data, num_left); in mxt_process_messages_t44()
1141 if (data->update_input) { in mxt_process_messages_t44()
1142 mxt_input_sync(data); in mxt_process_messages_t44()
1143 data->update_input = false; in mxt_process_messages_t44()
1149 static int mxt_process_messages_until_invalid(struct mxt_data *data) in mxt_process_messages_until_invalid() argument
1151 struct device *dev = &data->client->dev; in mxt_process_messages_until_invalid()
1155 count = data->max_reportid; in mxt_process_messages_until_invalid()
1159 read = mxt_read_and_process_messages(data, count); in mxt_process_messages_until_invalid()
1164 if (data->update_input) { in mxt_process_messages_until_invalid()
1165 mxt_input_sync(data); in mxt_process_messages_until_invalid()
1166 data->update_input = false; in mxt_process_messages_until_invalid()
1173 static irqreturn_t mxt_process_messages(struct mxt_data *data) in mxt_process_messages() argument
1176 u8 count = data->last_message_count; in mxt_process_messages()
1178 if (count < 1 || count > data->max_reportid) in mxt_process_messages()
1182 total_handled = mxt_read_and_process_messages(data, count + 1); in mxt_process_messages()
1191 num_handled = mxt_read_and_process_messages(data, 2); in mxt_process_messages()
1199 } while (total_handled < data->num_touchids); in mxt_process_messages()
1202 data->last_message_count = total_handled; in mxt_process_messages()
1204 if (data->update_input) { in mxt_process_messages()
1205 mxt_input_sync(data); in mxt_process_messages()
1206 data->update_input = false; in mxt_process_messages()
1214 struct mxt_data *data = dev_id; in mxt_interrupt() local
1216 if (data->in_bootloader) { in mxt_interrupt()
1218 complete(&data->bl_completion); in mxt_interrupt()
1222 if (!data->object_table) in mxt_interrupt()
1225 if (data->T44_address) { in mxt_interrupt()
1226 return mxt_process_messages_t44(data); in mxt_interrupt()
1228 return mxt_process_messages(data); in mxt_interrupt()
1232 static int mxt_t6_command(struct mxt_data *data, u16 cmd_offset, in mxt_t6_command() argument
1240 reg = data->T6_address + cmd_offset; in mxt_t6_command()
1242 ret = mxt_write_reg(data->client, reg, value); in mxt_t6_command()
1251 ret = __mxt_read_reg(data->client, reg, 1, &command_register); in mxt_t6_command()
1257 dev_err(&data->client->dev, "Command failed!\n"); in mxt_t6_command()
1264 static int mxt_acquire_irq(struct mxt_data *data) in mxt_acquire_irq() argument
1268 enable_irq(data->irq); in mxt_acquire_irq()
1270 if (data->use_retrigen_workaround) { in mxt_acquire_irq()
1271 error = mxt_process_messages_until_invalid(data); in mxt_acquire_irq()
1279 static int mxt_soft_reset(struct mxt_data *data) in mxt_soft_reset() argument
1281 struct device *dev = &data->client->dev; in mxt_soft_reset()
1286 disable_irq(data->irq); in mxt_soft_reset()
1288 reinit_completion(&data->reset_completion); in mxt_soft_reset()
1290 ret = mxt_t6_command(data, MXT_COMMAND_RESET, MXT_RESET_VALUE, false); in mxt_soft_reset()
1297 mxt_acquire_irq(data); in mxt_soft_reset()
1299 ret = mxt_wait_for_completion(data, &data->reset_completion, in mxt_soft_reset()
1307 static void mxt_update_crc(struct mxt_data *data, u8 cmd, u8 value) in mxt_update_crc() argument
1313 data->config_crc = 0; in mxt_update_crc()
1314 reinit_completion(&data->crc_completion); in mxt_update_crc()
1316 mxt_t6_command(data, cmd, value, true); in mxt_update_crc()
1322 mxt_wait_for_completion(data, &data->crc_completion, MXT_CRC_TIMEOUT); in mxt_update_crc()
1364 static int mxt_check_retrigen(struct mxt_data *data) in mxt_check_retrigen() argument
1366 struct i2c_client *client = data->client; in mxt_check_retrigen()
1371 data->use_retrigen_workaround = false; in mxt_check_retrigen()
1373 irqd = irq_get_irq_data(data->irq); in mxt_check_retrigen()
1380 if (data->T18_address) { in mxt_check_retrigen()
1382 data->T18_address + MXT_COMMS_CTRL, in mxt_check_retrigen()
1392 data->use_retrigen_workaround = true; in mxt_check_retrigen()
1396 static int mxt_prepare_cfg_mem(struct mxt_data *data, struct mxt_cfg *cfg) in mxt_prepare_cfg_mem() argument
1398 struct device *dev = &data->client->dev; in mxt_prepare_cfg_mem()
1420 object = mxt_get_object(data, type); in mxt_prepare_cfg_mem()
1494 static int mxt_upload_cfg_mem(struct mxt_data *data, struct mxt_cfg *cfg) in mxt_upload_cfg_mem() argument
1506 error = __mxt_write_reg(data->client, in mxt_upload_cfg_mem()
1510 dev_err(&data->client->dev, in mxt_upload_cfg_mem()
1521 static int mxt_init_t7_power_cfg(struct mxt_data *data);
1542 static int mxt_update_cfg(struct mxt_data *data, const struct firmware *fw) in mxt_update_cfg() argument
1544 struct device *dev = &data->client->dev; in mxt_update_cfg()
1553 u8 *raw_buf __free(kfree) = cfg.raw = kmemdup_nul(fw->data, fw->size, in mxt_update_cfg()
1560 mxt_update_crc(data, MXT_COMMAND_REPORTALL, 1); in mxt_update_cfg()
1580 if (cfg.info.family_id != data->info->family_id) { in mxt_update_cfg()
1585 if (cfg.info.variant_id != data->info->variant_id) { in mxt_update_cfg()
1609 if (info_crc == data->info_crc) { in mxt_update_cfg()
1610 if (config_crc == 0 || data->config_crc == 0) { in mxt_update_cfg()
1612 } else if (config_crc == data->config_crc) { in mxt_update_cfg()
1614 data->config_crc); in mxt_update_cfg()
1618 data->config_crc, config_crc); in mxt_update_cfg()
1623 data->info_crc, info_crc); in mxt_update_cfg()
1628 data->info->object_num * sizeof(struct mxt_object) + in mxt_update_cfg()
1631 if (data->mem_size <= cfg.start_ofs) { in mxt_update_cfg()
1633 data->mem_size, cfg.start_ofs); in mxt_update_cfg()
1637 cfg.mem_size = data->mem_size - cfg.start_ofs; in mxt_update_cfg()
1643 error = mxt_prepare_cfg_mem(data, &cfg); in mxt_update_cfg()
1648 if (data->T71_address) in mxt_update_cfg()
1649 crc_start = data->T71_address; in mxt_update_cfg()
1650 else if (data->T7_address) in mxt_update_cfg()
1651 crc_start = data->T7_address; in mxt_update_cfg()
1665 error = mxt_upload_cfg_mem(data, &cfg); in mxt_update_cfg()
1669 mxt_update_crc(data, MXT_COMMAND_BACKUPNV, MXT_BACKUP_VALUE); in mxt_update_cfg()
1671 error = mxt_check_retrigen(data); in mxt_update_cfg()
1675 error = mxt_soft_reset(data); in mxt_update_cfg()
1682 mxt_init_t7_power_cfg(data); in mxt_update_cfg()
1687 static void mxt_free_input_device(struct mxt_data *data) in mxt_free_input_device() argument
1689 if (data->input_dev) { in mxt_free_input_device()
1690 input_unregister_device(data->input_dev); in mxt_free_input_device()
1691 data->input_dev = NULL; in mxt_free_input_device()
1695 static void mxt_free_object_table(struct mxt_data *data) in mxt_free_object_table() argument
1698 video_unregister_device(&data->dbg.vdev); in mxt_free_object_table()
1699 v4l2_device_unregister(&data->dbg.v4l2); in mxt_free_object_table()
1701 data->object_table = NULL; in mxt_free_object_table()
1702 data->info = NULL; in mxt_free_object_table()
1703 kfree(data->raw_info_block); in mxt_free_object_table()
1704 data->raw_info_block = NULL; in mxt_free_object_table()
1705 kfree(data->msg_buf); in mxt_free_object_table()
1706 data->msg_buf = NULL; in mxt_free_object_table()
1707 data->T5_address = 0; in mxt_free_object_table()
1708 data->T5_msg_size = 0; in mxt_free_object_table()
1709 data->T6_reportid = 0; in mxt_free_object_table()
1710 data->T7_address = 0; in mxt_free_object_table()
1711 data->T71_address = 0; in mxt_free_object_table()
1712 data->T9_reportid_min = 0; in mxt_free_object_table()
1713 data->T9_reportid_max = 0; in mxt_free_object_table()
1714 data->T15_reportid_min = 0; in mxt_free_object_table()
1715 data->T15_reportid_max = 0; in mxt_free_object_table()
1716 data->T18_address = 0; in mxt_free_object_table()
1717 data->T19_reportid = 0; in mxt_free_object_table()
1718 data->T44_address = 0; in mxt_free_object_table()
1719 data->T97_reportid_min = 0; in mxt_free_object_table()
1720 data->T97_reportid_max = 0; in mxt_free_object_table()
1721 data->T100_reportid_min = 0; in mxt_free_object_table()
1722 data->T100_reportid_max = 0; in mxt_free_object_table()
1723 data->max_reportid = 0; in mxt_free_object_table()
1726 static int mxt_parse_object_table(struct mxt_data *data, in mxt_parse_object_table() argument
1729 struct i2c_client *client = data->client; in mxt_parse_object_table()
1736 data->mem_size = 0; in mxt_parse_object_table()
1737 for (i = 0; i < data->info->object_num; i++) { in mxt_parse_object_table()
1753 dev_dbg(&data->client->dev, in mxt_parse_object_table()
1761 if (data->info->family_id == 0x80 && in mxt_parse_object_table()
1762 data->info->version < 0x20) { in mxt_parse_object_table()
1768 data->T5_msg_size = mxt_obj_size(object); in mxt_parse_object_table()
1771 data->T5_msg_size = mxt_obj_size(object) - 1; in mxt_parse_object_table()
1773 data->T5_address = object->start_address; in mxt_parse_object_table()
1776 data->T6_reportid = min_id; in mxt_parse_object_table()
1777 data->T6_address = object->start_address; in mxt_parse_object_table()
1780 data->T7_address = object->start_address; in mxt_parse_object_table()
1783 data->T71_address = object->start_address; in mxt_parse_object_table()
1786 data->multitouch = MXT_TOUCH_MULTI_T9; in mxt_parse_object_table()
1788 data->T9_reportid_min = min_id; in mxt_parse_object_table()
1789 data->T9_reportid_max = min_id + in mxt_parse_object_table()
1791 data->num_touchids = object->num_report_ids; in mxt_parse_object_table()
1794 data->T15_reportid_min = min_id; in mxt_parse_object_table()
1795 data->T15_reportid_max = max_id; in mxt_parse_object_table()
1798 data->T18_address = object->start_address; in mxt_parse_object_table()
1801 data->T44_address = object->start_address; in mxt_parse_object_table()
1804 data->T19_reportid = min_id; in mxt_parse_object_table()
1807 data->T97_reportid_min = min_id; in mxt_parse_object_table()
1808 data->T97_reportid_max = max_id; in mxt_parse_object_table()
1811 data->multitouch = MXT_TOUCH_MULTITOUCHSCREEN_T100; in mxt_parse_object_table()
1812 data->T100_reportid_min = min_id; in mxt_parse_object_table()
1813 data->T100_reportid_max = max_id; in mxt_parse_object_table()
1815 data->num_touchids = object->num_report_ids - 2; in mxt_parse_object_table()
1822 if (end_address >= data->mem_size) in mxt_parse_object_table()
1823 data->mem_size = end_address + 1; in mxt_parse_object_table()
1827 data->max_reportid = reportid; in mxt_parse_object_table()
1830 if (data->T44_address && (data->T5_address != data->T44_address + 1)) { in mxt_parse_object_table()
1835 data->msg_buf = kcalloc(data->max_reportid, in mxt_parse_object_table()
1836 data->T5_msg_size, GFP_KERNEL); in mxt_parse_object_table()
1837 if (!data->msg_buf) in mxt_parse_object_table()
1843 static int mxt_read_info_block(struct mxt_data *data) in mxt_read_info_block() argument
1845 struct i2c_client *client = data->client; in mxt_read_info_block()
1853 if (data->raw_info_block) in mxt_read_info_block()
1854 mxt_free_object_table(data); in mxt_read_info_block()
1886 data->info_crc = crc_ptr[0] | (crc_ptr[1] << 8) | (crc_ptr[2] << 16); in mxt_read_info_block()
1895 if ((data->info_crc == 0) || (data->info_crc != calculated_crc)) { in mxt_read_info_block()
1898 calculated_crc, data->info_crc); in mxt_read_info_block()
1902 data->raw_info_block = no_free_ptr(id_buf); in mxt_read_info_block()
1903 data->info = (struct mxt_info *)data->raw_info_block; in mxt_read_info_block()
1907 data->info->family_id, data->info->variant_id, in mxt_read_info_block()
1908 data->info->version >> 4, data->info->version & 0xf, in mxt_read_info_block()
1909 data->info->build, data->info->object_num); in mxt_read_info_block()
1912 error = mxt_parse_object_table(data, in mxt_read_info_block()
1913 data->raw_info_block + MXT_OBJECT_START); in mxt_read_info_block()
1916 mxt_free_object_table(data); in mxt_read_info_block()
1920 data->object_table = in mxt_read_info_block()
1921 (struct mxt_object *)(data->raw_info_block + MXT_OBJECT_START); in mxt_read_info_block()
1926 static int mxt_read_t9_resolution(struct mxt_data *data) in mxt_read_t9_resolution() argument
1928 struct i2c_client *client = data->client; in mxt_read_t9_resolution()
1934 object = mxt_get_object(data, MXT_TOUCH_MULTI_T9); in mxt_read_t9_resolution()
1940 sizeof(data->xsize), &data->xsize); in mxt_read_t9_resolution()
1946 sizeof(data->ysize), &data->ysize); in mxt_read_t9_resolution()
1956 data->max_x = get_unaligned_le16(&range.x); in mxt_read_t9_resolution()
1957 data->max_y = get_unaligned_le16(&range.y); in mxt_read_t9_resolution()
1965 data->xy_switch = orient & MXT_T9_ORIENT_SWITCH; in mxt_read_t9_resolution()
1966 data->invertx = orient & MXT_T9_ORIENT_INVERTX; in mxt_read_t9_resolution()
1967 data->inverty = orient & MXT_T9_ORIENT_INVERTY; in mxt_read_t9_resolution()
1972 static int mxt_read_t100_config(struct mxt_data *data) in mxt_read_t100_config() argument
1974 struct i2c_client *client = data->client; in mxt_read_t100_config()
1981 object = mxt_get_object(data, MXT_TOUCH_MULTITOUCHSCREEN_T100); in mxt_read_t100_config()
1992 data->max_x = get_unaligned_le16(&range_x); in mxt_read_t100_config()
2000 data->max_y = get_unaligned_le16(&range_y); in mxt_read_t100_config()
2004 sizeof(data->xsize), &data->xsize); in mxt_read_t100_config()
2010 sizeof(data->ysize), &data->ysize); in mxt_read_t100_config()
2021 data->xy_switch = cfg & MXT_T100_CFG_SWITCHXY; in mxt_read_t100_config()
2022 data->invertx = cfg & MXT_T100_CFG_INVERTX; in mxt_read_t100_config()
2023 data->inverty = cfg & MXT_T100_CFG_INVERTY; in mxt_read_t100_config()
2035 data->t100_aux_vect = aux++; in mxt_read_t100_config()
2038 data->t100_aux_ampl = aux++; in mxt_read_t100_config()
2041 data->t100_aux_area = aux++; in mxt_read_t100_config()
2045 data->t100_aux_vect, data->t100_aux_ampl, data->t100_aux_area); in mxt_read_t100_config()
2054 struct mxt_data *data) in mxt_set_up_as_touchpad() argument
2069 for (i = 0; i < data->t19_num_keys; i++) in mxt_set_up_as_touchpad()
2070 if (data->t19_keymap[i] != KEY_RESERVED) in mxt_set_up_as_touchpad()
2072 data->t19_keymap[i]); in mxt_set_up_as_touchpad()
2075 static int mxt_initialize_input_device(struct mxt_data *data) in mxt_initialize_input_device() argument
2077 struct device *dev = &data->client->dev; in mxt_initialize_input_device()
2084 switch (data->multitouch) { in mxt_initialize_input_device()
2086 num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1; in mxt_initialize_input_device()
2087 error = mxt_read_t9_resolution(data); in mxt_initialize_input_device()
2093 num_mt_slots = data->num_touchids; in mxt_initialize_input_device()
2094 error = mxt_read_t100_config(data); in mxt_initialize_input_device()
2105 if (data->max_x == 0) in mxt_initialize_input_device()
2106 data->max_x = 1023; in mxt_initialize_input_device()
2108 if (data->max_y == 0) in mxt_initialize_input_device()
2109 data->max_y = 1023; in mxt_initialize_input_device()
2111 if (data->xy_switch) in mxt_initialize_input_device()
2112 swap(data->max_x, data->max_y); in mxt_initialize_input_device()
2114 dev_info(dev, "Touchscreen size X%uY%u\n", data->max_x, data->max_y); in mxt_initialize_input_device()
2122 input_dev->phys = data->phys; in mxt_initialize_input_device()
2128 input_dev->keycode = data->t15_keymap; in mxt_initialize_input_device()
2129 input_dev->keycodemax = data->t15_num_keys; in mxt_initialize_input_device()
2130 input_dev->keycodesize = sizeof(data->t15_keymap[0]); in mxt_initialize_input_device()
2135 input_set_abs_params(input_dev, ABS_X, 0, data->max_x, 0, 0); in mxt_initialize_input_device()
2136 input_set_abs_params(input_dev, ABS_Y, 0, data->max_y, 0, 0); in mxt_initialize_input_device()
2138 if (data->multitouch == MXT_TOUCH_MULTI_T9 || in mxt_initialize_input_device()
2139 (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 && in mxt_initialize_input_device()
2140 data->t100_aux_ampl)) { in mxt_initialize_input_device()
2145 if (data->t19_num_keys) { in mxt_initialize_input_device()
2146 mxt_set_up_as_touchpad(input_dev, data); in mxt_initialize_input_device()
2159 if (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100) { in mxt_initialize_input_device()
2169 0, data->max_x, 0, 0); in mxt_initialize_input_device()
2171 0, data->max_y, 0, 0); in mxt_initialize_input_device()
2173 if (data->multitouch == MXT_TOUCH_MULTI_T9 || in mxt_initialize_input_device()
2174 (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 && in mxt_initialize_input_device()
2175 data->t100_aux_area)) { in mxt_initialize_input_device()
2180 if (data->multitouch == MXT_TOUCH_MULTI_T9 || in mxt_initialize_input_device()
2181 (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 && in mxt_initialize_input_device()
2182 data->t100_aux_ampl)) { in mxt_initialize_input_device()
2187 if (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 && in mxt_initialize_input_device()
2188 data->t100_aux_vect) { in mxt_initialize_input_device()
2193 if (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 && in mxt_initialize_input_device()
2194 data->t100_aux_vect) { in mxt_initialize_input_device()
2199 touchscreen_parse_properties(input_dev, true, &data->prop); in mxt_initialize_input_device()
2202 if (data->T15_reportid_min || data->T97_reportid_min) { in mxt_initialize_input_device()
2203 for (i = 0; i < data->t15_num_keys; i++) in mxt_initialize_input_device()
2205 EV_KEY, data->t15_keymap[i]); in mxt_initialize_input_device()
2208 input_set_drvdata(input_dev, data); in mxt_initialize_input_device()
2216 data->input_dev = input_dev; in mxt_initialize_input_device()
2225 static int mxt_configure_objects(struct mxt_data *data,
2234 static int mxt_initialize(struct mxt_data *data) in mxt_initialize() argument
2236 struct i2c_client *client = data->client; in mxt_initialize()
2241 error = mxt_read_info_block(data); in mxt_initialize()
2246 error = mxt_probe_bootloader(data, false); in mxt_initialize()
2249 error = mxt_probe_bootloader(data, true); in mxt_initialize()
2263 data->in_bootloader = true; in mxt_initialize()
2268 mxt_send_bootloader_cmd(data, false); in mxt_initialize()
2272 error = mxt_check_retrigen(data); in mxt_initialize()
2276 error = mxt_acquire_irq(data); in mxt_initialize()
2281 &client->dev, GFP_KERNEL, data, in mxt_initialize()
2292 static int mxt_set_t7_power_cfg(struct mxt_data *data, u8 sleep) in mxt_set_t7_power_cfg() argument
2294 struct device *dev = &data->client->dev; in mxt_set_t7_power_cfg()
2302 new_config = &data->t7_cfg; in mxt_set_t7_power_cfg()
2304 error = __mxt_write_reg(data->client, data->T7_address, in mxt_set_t7_power_cfg()
2305 sizeof(data->t7_cfg), new_config); in mxt_set_t7_power_cfg()
2315 static int mxt_init_t7_power_cfg(struct mxt_data *data) in mxt_init_t7_power_cfg() argument
2317 struct device *dev = &data->client->dev; in mxt_init_t7_power_cfg()
2322 error = __mxt_read_reg(data->client, data->T7_address, in mxt_init_t7_power_cfg()
2323 sizeof(data->t7_cfg), &data->t7_cfg); in mxt_init_t7_power_cfg()
2327 if (data->t7_cfg.active == 0 || data->t7_cfg.idle == 0) { in mxt_init_t7_power_cfg()
2330 mxt_soft_reset(data); in mxt_init_t7_power_cfg()
2335 data->t7_cfg.active = 20; in mxt_init_t7_power_cfg()
2336 data->t7_cfg.idle = 100; in mxt_init_t7_power_cfg()
2337 return mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN); in mxt_init_t7_power_cfg()
2342 data->t7_cfg.active, data->t7_cfg.idle); in mxt_init_t7_power_cfg()
2357 static u16 mxt_get_debug_value(struct mxt_data *data, unsigned int x, in mxt_get_debug_value() argument
2360 struct mxt_info *info = data->info; in mxt_get_debug_value()
2361 struct mxt_dbg *dbg = &data->dbg; in mxt_get_debug_value()
2381 return get_unaligned_le16(&dbg->t37_buf[page].data[ofs]); in mxt_get_debug_value()
2384 static int mxt_convert_debug_pages(struct mxt_data *data, u16 *outbuf) in mxt_convert_debug_pages() argument
2386 struct mxt_dbg *dbg = &data->dbg; in mxt_convert_debug_pages()
2393 rx = data->xy_switch ? y : x; in mxt_convert_debug_pages()
2394 ry = data->xy_switch ? x : y; in mxt_convert_debug_pages()
2395 rx = data->invertx ? (data->xsize - 1 - rx) : rx; in mxt_convert_debug_pages()
2396 ry = data->inverty ? (data->ysize - 1 - ry) : ry; in mxt_convert_debug_pages()
2398 outbuf[i] = mxt_get_debug_value(data, rx, ry); in mxt_convert_debug_pages()
2401 if (++x >= (data->xy_switch ? data->ysize : data->xsize)) { in mxt_convert_debug_pages()
2410 static int mxt_read_diagnostic_debug(struct mxt_data *data, u8 mode, in mxt_read_diagnostic_debug() argument
2413 struct mxt_dbg *dbg = &data->dbg; in mxt_read_diagnostic_debug()
2424 ret = mxt_write_reg(data->client, dbg->diag_cmd_address, in mxt_read_diagnostic_debug()
2433 ret = __mxt_read_reg(data->client, dbg->diag_cmd_address, in mxt_read_diagnostic_debug()
2448 ret = __mxt_read_reg(data->client, dbg->t37_address, in mxt_read_diagnostic_debug()
2454 dev_err(&data->client->dev, "T37 page mismatch\n"); in mxt_read_diagnostic_debug()
2458 dev_dbg(&data->client->dev, "%s page:%d retries:%d\n", in mxt_read_diagnostic_debug()
2465 return mxt_convert_debug_pages(data, outbuf); in mxt_read_diagnostic_debug()
2472 struct mxt_data *data = q->drv_priv; in mxt_queue_setup() local
2473 size_t size = data->dbg.t37_nodes * sizeof(u16); in mxt_queue_setup()
2486 struct mxt_data *data = vb2_get_drv_priv(vb->vb2_queue); in mxt_buffer_queue() local
2493 dev_err(&data->client->dev, "Error acquiring frame ptr\n"); in mxt_buffer_queue()
2497 switch (data->dbg.input) { in mxt_buffer_queue()
2508 ret = mxt_read_diagnostic_debug(data, mode, ptr); in mxt_buffer_queue()
2512 vb2_set_plane_payload(vb, 0, data->dbg.t37_nodes * sizeof(u16)); in mxt_buffer_queue()
2539 struct mxt_data *data = video_drvdata(file); in mxt_vidioc_querycap() local
2544 "I2C:%s", dev_name(&data->client->dev)); in mxt_vidioc_querycap()
2569 static int mxt_set_input(struct mxt_data *data, unsigned int i) in mxt_set_input() argument
2571 struct v4l2_pix_format *f = &data->dbg.format; in mxt_set_input()
2581 f->width = data->xy_switch ? data->ysize : data->xsize; in mxt_set_input()
2582 f->height = data->xy_switch ? data->xsize : data->ysize; in mxt_set_input()
2588 data->dbg.input = i; in mxt_set_input()
2600 struct mxt_data *data = video_drvdata(file); in mxt_vidioc_g_input() local
2602 *i = data->dbg.input; in mxt_vidioc_g_input()
2609 struct mxt_data *data = video_drvdata(file); in mxt_vidioc_fmt() local
2612 f->fmt.pix = data->dbg.format; in mxt_vidioc_fmt()
2684 static void mxt_debug_init(struct mxt_data *data) in mxt_debug_init() argument
2686 struct mxt_info *info = data->info; in mxt_debug_init()
2687 struct mxt_dbg *dbg = &data->dbg; in mxt_debug_init()
2691 object = mxt_get_object(data, MXT_GEN_COMMAND_T6); in mxt_debug_init()
2697 object = mxt_get_object(data, MXT_DEBUG_DIAGNOSTIC_T37); in mxt_debug_init()
2702 dev_warn(&data->client->dev, "Bad T37 size"); in mxt_debug_init()
2709 dbg->t37_nodes = data->xsize * data->ysize; in mxt_debug_init()
2714 dbg->t37_pages = DIV_ROUND_UP(data->xsize * in mxt_debug_init()
2717 sizeof(dbg->t37_buf->data)); in mxt_debug_init()
2719 dbg->t37_buf = devm_kmalloc_array(&data->client->dev, dbg->t37_pages, in mxt_debug_init()
2725 mxt_set_input(data, 0); in mxt_debug_init()
2729 error = v4l2_device_register(&data->client->dev, &dbg->v4l2); in mxt_debug_init()
2736 dbg->queue.drv_priv = data; in mxt_debug_init()
2738 dbg->queue.dev = &data->client->dev; in mxt_debug_init()
2749 video_set_drvdata(&dbg->vdev, data); in mxt_debug_init()
2760 dev_warn(&data->client->dev, "Error initializing T37\n"); in mxt_debug_init()
2763 static void mxt_debug_init(struct mxt_data *data) in mxt_debug_init() argument
2768 static int mxt_configure_objects(struct mxt_data *data, in mxt_configure_objects() argument
2771 struct device *dev = &data->client->dev; in mxt_configure_objects()
2774 error = mxt_init_t7_power_cfg(data); in mxt_configure_objects()
2781 error = mxt_update_cfg(data, cfg); in mxt_configure_objects()
2786 if (data->multitouch) { in mxt_configure_objects()
2787 error = mxt_initialize_input_device(data); in mxt_configure_objects()
2794 mxt_debug_init(data); in mxt_configure_objects()
2803 struct mxt_data *data = dev_get_drvdata(dev); in mxt_fw_version_show() local
2804 struct mxt_info *info = data->info; in mxt_fw_version_show()
2813 struct mxt_data *data = dev_get_drvdata(dev); in mxt_hw_version_show() local
2814 struct mxt_info *info = data->info; in mxt_hw_version_show()
2838 struct mxt_data *data = dev_get_drvdata(dev); in mxt_object_show() local
2851 for (i = 0; i < data->info->object_num; i++) { in mxt_object_show()
2852 object = data->object_table + i; in mxt_object_show()
2863 error = __mxt_read_reg(data->client, addr, size, obuf); in mxt_object_show()
2883 c = *(fw->data + pos); in mxt_check_firmware_format()
2900 static int mxt_flash_fw(struct mxt_data *data, const struct firmware *fw) in mxt_flash_fw() argument
2902 struct device *dev = &data->client->dev; in mxt_flash_fw()
2909 reinit_completion(&data->bl_completion); in mxt_flash_fw()
2911 error = mxt_check_bootloader(data, MXT_WAITING_BOOTLOAD_CMD, false); in mxt_flash_fw()
2914 error = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, in mxt_flash_fw()
2922 error = mxt_send_bootloader_cmd(data, true); in mxt_flash_fw()
2928 error = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, in mxt_flash_fw()
2933 frame_size = ((*(fw->data + pos) << 8) | *(fw->data + pos + 1)); in mxt_flash_fw()
2939 error = mxt_bootloader_write(data, fw->data + pos, frame_size); in mxt_flash_fw()
2943 error = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS, true); in mxt_flash_fw()
2966 error = mxt_wait_for_completion(data, &data->bl_completion, in mxt_flash_fw()
2978 mxt_wait_for_completion(data, &data->bl_completion, MXT_FW_RESET_TIME); in mxt_flash_fw()
2979 data->in_bootloader = false; in mxt_flash_fw()
2986 struct mxt_data *data = dev_get_drvdata(dev); in mxt_load_fw() local
3002 if (!data->in_bootloader) { in mxt_load_fw()
3004 data->in_bootloader = true; in mxt_load_fw()
3006 error = mxt_t6_command(data, MXT_COMMAND_RESET, in mxt_load_fw()
3014 error = mxt_lookup_bootloader_address(data, 0); in mxt_load_fw()
3018 mxt_free_input_device(data); in mxt_load_fw()
3019 mxt_free_object_table(data); in mxt_load_fw()
3021 enable_irq(data->irq); in mxt_load_fw()
3024 retval = mxt_flash_fw(data, fw); in mxt_load_fw()
3026 disable_irq(data->irq); in mxt_load_fw()
3035 struct mxt_data *data = dev_get_drvdata(dev); in mxt_update_fw_store() local
3045 error = mxt_initialize(data); in mxt_update_fw_store()
3068 static void mxt_start(struct mxt_data *data) in mxt_start() argument
3070 mxt_wakeup_toggle(data->client, true, false); in mxt_start()
3072 switch (data->suspend_mode) { in mxt_start()
3074 mxt_soft_reset(data); in mxt_start()
3078 mxt_write_object(data, in mxt_start()
3084 mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN); in mxt_start()
3087 mxt_t6_command(data, MXT_COMMAND_CALIBRATE, 1, false); in mxt_start()
3092 static void mxt_stop(struct mxt_data *data) in mxt_stop() argument
3094 switch (data->suspend_mode) { in mxt_stop()
3097 mxt_write_object(data, in mxt_stop()
3103 mxt_set_t7_power_cfg(data, MXT_POWER_CFG_DEEPSLEEP); in mxt_stop()
3107 mxt_wakeup_toggle(data->client, false, false); in mxt_stop()
3112 struct mxt_data *data = input_get_drvdata(dev); in mxt_input_open() local
3114 mxt_start(data); in mxt_input_open()
3121 struct mxt_data *data = input_get_drvdata(dev); in mxt_input_close() local
3123 mxt_stop(data); in mxt_input_close()
3126 static int mxt_parse_device_properties(struct mxt_data *data) in mxt_parse_device_properties() argument
3130 struct device *dev = &data->client->dev; in mxt_parse_device_properties()
3158 data->t19_keymap = keymap; in mxt_parse_device_properties()
3159 data->t19_num_keys = n_keys; in mxt_parse_device_properties()
3184 data->t15_keymap = buttonmap; in mxt_parse_device_properties()
3185 data->t15_num_keys = n_keys; in mxt_parse_device_properties()
3208 struct mxt_data *data; in mxt_probe() local
3236 data = devm_kzalloc(&client->dev, sizeof(struct mxt_data), GFP_KERNEL); in mxt_probe()
3237 if (!data) in mxt_probe()
3240 snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0", in mxt_probe()
3243 data->client = client; in mxt_probe()
3244 data->irq = client->irq; in mxt_probe()
3245 i2c_set_clientdata(client, data); in mxt_probe()
3247 init_completion(&data->bl_completion); in mxt_probe()
3248 init_completion(&data->reset_completion); in mxt_probe()
3249 init_completion(&data->crc_completion); in mxt_probe()
3251 data->suspend_mode = dmi_check_system(chromebook_T9_suspend_dmi) ? in mxt_probe()
3254 error = mxt_parse_device_properties(data); in mxt_probe()
3262 data->regulators[0].supply = "vdda"; in mxt_probe()
3263 data->regulators[1].supply = "vdd"; in mxt_probe()
3264 error = devm_regulator_bulk_get(&client->dev, ARRAY_SIZE(data->regulators), in mxt_probe()
3265 data->regulators); in mxt_probe()
3274 data->reset_gpio = devm_gpiod_get_optional(&client->dev, in mxt_probe()
3276 if (IS_ERR(data->reset_gpio)) { in mxt_probe()
3277 error = PTR_ERR(data->reset_gpio); in mxt_probe()
3283 data->wake_gpio = devm_gpiod_get_optional(&client->dev, in mxt_probe()
3285 if (IS_ERR(data->wake_gpio)) { in mxt_probe()
3286 error = PTR_ERR(data->wake_gpio); in mxt_probe()
3294 client->name, data); in mxt_probe()
3300 error = regulator_bulk_enable(ARRAY_SIZE(data->regulators), in mxt_probe()
3301 data->regulators); in mxt_probe()
3313 if (data->reset_gpio) { in mxt_probe()
3316 gpiod_set_value_cansleep(data->reset_gpio, 0); in mxt_probe()
3337 &data->wakeup_method); in mxt_probe()
3339 error = mxt_initialize(data); in mxt_probe()
3346 regulator_bulk_disable(ARRAY_SIZE(data->regulators), in mxt_probe()
3347 data->regulators); in mxt_probe()
3353 struct mxt_data *data = i2c_get_clientdata(client); in mxt_remove() local
3355 disable_irq(data->irq); in mxt_remove()
3356 mxt_free_input_device(data); in mxt_remove()
3357 mxt_free_object_table(data); in mxt_remove()
3358 regulator_bulk_disable(ARRAY_SIZE(data->regulators), in mxt_remove()
3359 data->regulators); in mxt_remove()
3365 struct mxt_data *data = i2c_get_clientdata(client); in mxt_suspend() local
3366 struct input_dev *input_dev = data->input_dev; in mxt_suspend()
3373 mxt_stop(data); in mxt_suspend()
3376 disable_irq(data->irq); in mxt_suspend()
3384 struct mxt_data *data = i2c_get_clientdata(client); in mxt_resume() local
3385 struct input_dev *input_dev = data->input_dev; in mxt_resume()
3390 enable_irq(data->irq); in mxt_resume()
3394 mxt_start(data); in mxt_resume()