Lines Matching full:data

147 	u8 data[MXT_DIAGNOSTIC_SIZE];  member
277 /* Each client has this additional data */
391 static void mxt_dump_message(struct mxt_data *data, u8 *message) in mxt_dump_message() argument
393 dev_dbg(&data->client->dev, "message: %*ph\n", in mxt_dump_message()
394 data->T5_msg_size, message); in mxt_dump_message()
397 static int mxt_wait_for_completion(struct mxt_data *data, in mxt_wait_for_completion() argument
401 struct device *dev = &data->client->dev; in mxt_wait_for_completion()
415 static int mxt_bootloader_read(struct mxt_data *data, in mxt_bootloader_read() argument
421 msg.addr = data->bootloader_addr; in mxt_bootloader_read()
422 msg.flags = data->client->flags & I2C_M_TEN; in mxt_bootloader_read()
427 ret = i2c_transfer(data->client->adapter, &msg, 1); in mxt_bootloader_read()
432 dev_err(&data->client->dev, "%s: i2c recv failed (%d)\n", in mxt_bootloader_read()
439 static int mxt_bootloader_write(struct mxt_data *data, in mxt_bootloader_write() argument
445 msg.addr = data->bootloader_addr; in mxt_bootloader_write()
446 msg.flags = data->client->flags & I2C_M_TEN; in mxt_bootloader_write()
450 ret = i2c_transfer(data->client->adapter, &msg, 1); in mxt_bootloader_write()
455 dev_err(&data->client->dev, "%s: i2c send failed (%d)\n", in mxt_bootloader_write()
462 static int mxt_lookup_bootloader_address(struct mxt_data *data, bool retry) in mxt_lookup_bootloader_address() argument
464 u8 appmode = data->client->addr; in mxt_lookup_bootloader_address()
466 u8 family_id = data->info ? data->info->family_id : 0; in mxt_lookup_bootloader_address()
485 dev_err(&data->client->dev, in mxt_lookup_bootloader_address()
491 data->bootloader_addr = bootloader; in mxt_lookup_bootloader_address()
495 static int mxt_probe_bootloader(struct mxt_data *data, bool alt_address) in mxt_probe_bootloader() argument
497 struct device *dev = &data->client->dev; in mxt_probe_bootloader()
502 error = mxt_lookup_bootloader_address(data, alt_address); in mxt_probe_bootloader()
506 error = mxt_bootloader_read(data, &val, 1); in mxt_probe_bootloader()
519 static u8 mxt_get_bootloader_version(struct mxt_data *data, u8 val) in mxt_get_bootloader_version() argument
521 struct device *dev = &data->client->dev; in mxt_get_bootloader_version()
525 if (mxt_bootloader_read(data, &buf[0], 3) != 0) { in mxt_get_bootloader_version()
540 static int mxt_check_bootloader(struct mxt_data *data, unsigned int state, in mxt_check_bootloader() argument
543 struct device *dev = &data->client->dev; in mxt_check_bootloader()
555 ret = mxt_wait_for_completion(data, &data->bl_completion, in mxt_check_bootloader()
569 ret = mxt_bootloader_read(data, &val, 1); in mxt_check_bootloader()
574 val = mxt_get_bootloader_version(data, val); in mxt_check_bootloader()
603 static int mxt_send_bootloader_cmd(struct mxt_data *data, bool unlock) in mxt_send_bootloader_cmd() argument
616 ret = mxt_bootloader_write(data, buf, 2); in mxt_send_bootloader_cmd()
639 /* Read data */ in __mxt_read_reg()
694 mxt_get_object(struct mxt_data *data, u8 type) in mxt_get_object() argument
699 for (i = 0; i < data->info->object_num; i++) { in mxt_get_object()
700 object = data->object_table + i; in mxt_get_object()
705 dev_warn(&data->client->dev, "Invalid object type T%u\n", type); in mxt_get_object()
709 static void mxt_proc_t6_messages(struct mxt_data *data, u8 *msg) in mxt_proc_t6_messages() argument
711 struct device *dev = &data->client->dev; in mxt_proc_t6_messages()
715 if (crc != data->config_crc) { in mxt_proc_t6_messages()
716 data->config_crc = crc; in mxt_proc_t6_messages()
720 complete(&data->crc_completion); in mxt_proc_t6_messages()
724 complete(&data->reset_completion); in mxt_proc_t6_messages()
727 if (status != data->t6_status) in mxt_proc_t6_messages()
739 data->t6_status = status; in mxt_proc_t6_messages()
742 static int mxt_write_object(struct mxt_data *data, in mxt_write_object() argument
748 object = mxt_get_object(data, type); in mxt_write_object()
753 return mxt_write_reg(data->client, reg + offset, val); in mxt_write_object()
756 static void mxt_input_button(struct mxt_data *data, u8 *message) in mxt_input_button() argument
758 struct input_dev *input = data->input_dev; in mxt_input_button()
761 for (i = 0; i < data->t19_num_keys; i++) { in mxt_input_button()
762 if (data->t19_keymap[i] == KEY_RESERVED) in mxt_input_button()
766 input_report_key(input, data->t19_keymap[i], in mxt_input_button()
771 static void mxt_input_sync(struct mxt_data *data) in mxt_input_sync() argument
773 input_mt_report_pointer_emulation(data->input_dev, in mxt_input_sync()
774 data->t19_num_keys); in mxt_input_sync()
775 input_sync(data->input_dev); in mxt_input_sync()
778 static void mxt_proc_t9_message(struct mxt_data *data, u8 *message) in mxt_proc_t9_message() argument
780 struct device *dev = &data->client->dev; in mxt_proc_t9_message()
781 struct input_dev *input_dev = data->input_dev; in mxt_proc_t9_message()
789 id = message[0] - data->T9_reportid_min; in mxt_proc_t9_message()
795 if (data->max_x < 1024) in mxt_proc_t9_message()
797 if (data->max_y < 1024) in mxt_proc_t9_message()
827 mxt_input_sync(data); in mxt_proc_t9_message()
845 data->update_input = true; in mxt_proc_t9_message()
848 static void mxt_proc_t100_message(struct mxt_data *data, u8 *message) in mxt_proc_t100_message() argument
850 struct device *dev = &data->client->dev; in mxt_proc_t100_message()
851 struct input_dev *input_dev = data->input_dev; in mxt_proc_t100_message()
863 id = message[0] - data->T100_reportid_min - 2; in mxt_proc_t100_message()
881 if (data->t100_aux_vect) in mxt_proc_t100_message()
882 orientation = message[data->t100_aux_vect]; in mxt_proc_t100_message()
891 if (data->t100_aux_area) in mxt_proc_t100_message()
892 major = message[data->t100_aux_area]; in mxt_proc_t100_message()
894 if (data->t100_aux_ampl) in mxt_proc_t100_message()
895 pressure = message[data->t100_aux_ampl]; in mxt_proc_t100_message()
897 if (data->t100_aux_vect) in mxt_proc_t100_message()
898 orientation = message[data->t100_aux_vect]; in mxt_proc_t100_message()
911 if (data->t100_aux_ampl) in mxt_proc_t100_message()
912 pressure = message[data->t100_aux_ampl]; in mxt_proc_t100_message()
953 data->update_input = true; in mxt_proc_t100_message()
956 static int mxt_proc_message(struct mxt_data *data, u8 *message) in mxt_proc_message() argument
963 if (report_id == data->T6_reportid) { in mxt_proc_message()
964 mxt_proc_t6_messages(data, message); in mxt_proc_message()
965 } else if (!data->input_dev) { in mxt_proc_message()
970 mxt_dump_message(data, message); in mxt_proc_message()
971 } else if (report_id >= data->T9_reportid_min && in mxt_proc_message()
972 report_id <= data->T9_reportid_max) { in mxt_proc_message()
973 mxt_proc_t9_message(data, message); in mxt_proc_message()
974 } else if (report_id >= data->T100_reportid_min && in mxt_proc_message()
975 report_id <= data->T100_reportid_max) { in mxt_proc_message()
976 mxt_proc_t100_message(data, message); in mxt_proc_message()
977 } else if (report_id == data->T19_reportid) { in mxt_proc_message()
978 mxt_input_button(data, message); in mxt_proc_message()
979 data->update_input = true; in mxt_proc_message()
981 mxt_dump_message(data, message); in mxt_proc_message()
987 static int mxt_read_and_process_messages(struct mxt_data *data, u8 count) in mxt_read_and_process_messages() argument
989 struct device *dev = &data->client->dev; in mxt_read_and_process_messages()
995 if (count > data->max_reportid) in mxt_read_and_process_messages()
999 ret = __mxt_read_reg(data->client, data->T5_address, in mxt_read_and_process_messages()
1000 data->T5_msg_size * count, data->msg_buf); in mxt_read_and_process_messages()
1007 ret = mxt_proc_message(data, in mxt_read_and_process_messages()
1008 data->msg_buf + data->T5_msg_size * i); in mxt_read_and_process_messages()
1018 static irqreturn_t mxt_process_messages_t44(struct mxt_data *data) in mxt_process_messages_t44() argument
1020 struct device *dev = &data->client->dev; in mxt_process_messages_t44()
1025 ret = __mxt_read_reg(data->client, data->T44_address, in mxt_process_messages_t44()
1026 data->T5_msg_size + 1, data->msg_buf); in mxt_process_messages_t44()
1032 count = data->msg_buf[0]; in mxt_process_messages_t44()
1041 if (count > data->max_reportid) { in mxt_process_messages_t44()
1043 count = data->max_reportid; in mxt_process_messages_t44()
1047 ret = mxt_proc_message(data, data->msg_buf + 1); in mxt_process_messages_t44()
1057 ret = mxt_read_and_process_messages(data, num_left); in mxt_process_messages_t44()
1065 if (data->update_input) { in mxt_process_messages_t44()
1066 mxt_input_sync(data); in mxt_process_messages_t44()
1067 data->update_input = false; in mxt_process_messages_t44()
1073 static int mxt_process_messages_until_invalid(struct mxt_data *data) in mxt_process_messages_until_invalid() argument
1075 struct device *dev = &data->client->dev; in mxt_process_messages_until_invalid()
1079 count = data->max_reportid; in mxt_process_messages_until_invalid()
1083 read = mxt_read_and_process_messages(data, count); in mxt_process_messages_until_invalid()
1088 if (data->update_input) { in mxt_process_messages_until_invalid()
1089 mxt_input_sync(data); in mxt_process_messages_until_invalid()
1090 data->update_input = false; in mxt_process_messages_until_invalid()
1097 static irqreturn_t mxt_process_messages(struct mxt_data *data) in mxt_process_messages() argument
1100 u8 count = data->last_message_count; in mxt_process_messages()
1102 if (count < 1 || count > data->max_reportid) in mxt_process_messages()
1106 total_handled = mxt_read_and_process_messages(data, count + 1); in mxt_process_messages()
1115 num_handled = mxt_read_and_process_messages(data, 2); in mxt_process_messages()
1123 } while (total_handled < data->num_touchids); in mxt_process_messages()
1126 data->last_message_count = total_handled; in mxt_process_messages()
1128 if (data->update_input) { in mxt_process_messages()
1129 mxt_input_sync(data); in mxt_process_messages()
1130 data->update_input = false; in mxt_process_messages()
1138 struct mxt_data *data = dev_id; in mxt_interrupt() local
1140 if (data->in_bootloader) { in mxt_interrupt()
1142 complete(&data->bl_completion); in mxt_interrupt()
1146 if (!data->object_table) in mxt_interrupt()
1149 if (data->T44_address) { in mxt_interrupt()
1150 return mxt_process_messages_t44(data); in mxt_interrupt()
1152 return mxt_process_messages(data); in mxt_interrupt()
1156 static int mxt_t6_command(struct mxt_data *data, u16 cmd_offset, in mxt_t6_command() argument
1164 reg = data->T6_address + cmd_offset; in mxt_t6_command()
1166 ret = mxt_write_reg(data->client, reg, value); in mxt_t6_command()
1175 ret = __mxt_read_reg(data->client, reg, 1, &command_register); in mxt_t6_command()
1181 dev_err(&data->client->dev, "Command failed!\n"); in mxt_t6_command()
1188 static int mxt_acquire_irq(struct mxt_data *data) in mxt_acquire_irq() argument
1192 enable_irq(data->irq); in mxt_acquire_irq()
1194 error = mxt_process_messages_until_invalid(data); in mxt_acquire_irq()
1201 static int mxt_soft_reset(struct mxt_data *data) in mxt_soft_reset() argument
1203 struct device *dev = &data->client->dev; in mxt_soft_reset()
1208 disable_irq(data->irq); in mxt_soft_reset()
1210 reinit_completion(&data->reset_completion); in mxt_soft_reset()
1212 ret = mxt_t6_command(data, MXT_COMMAND_RESET, MXT_RESET_VALUE, false); in mxt_soft_reset()
1219 mxt_acquire_irq(data); in mxt_soft_reset()
1221 ret = mxt_wait_for_completion(data, &data->reset_completion, in mxt_soft_reset()
1229 static void mxt_update_crc(struct mxt_data *data, u8 cmd, u8 value) in mxt_update_crc() argument
1235 data->config_crc = 0; in mxt_update_crc()
1236 reinit_completion(&data->crc_completion); in mxt_update_crc()
1238 mxt_t6_command(data, cmd, value, true); in mxt_update_crc()
1244 mxt_wait_for_completion(data, &data->crc_completion, MXT_CRC_TIMEOUT); in mxt_update_crc()
1286 static int mxt_prepare_cfg_mem(struct mxt_data *data, struct mxt_cfg *cfg) in mxt_prepare_cfg_mem() argument
1288 struct device *dev = &data->client->dev; in mxt_prepare_cfg_mem()
1310 object = mxt_get_object(data, type); in mxt_prepare_cfg_mem()
1384 static int mxt_upload_cfg_mem(struct mxt_data *data, struct mxt_cfg *cfg) in mxt_upload_cfg_mem() argument
1396 error = __mxt_write_reg(data->client, in mxt_upload_cfg_mem()
1400 dev_err(&data->client->dev, in mxt_upload_cfg_mem()
1411 static int mxt_init_t7_power_cfg(struct mxt_data *data);
1432 static int mxt_update_cfg(struct mxt_data *data, const struct firmware *fw) in mxt_update_cfg() argument
1434 struct device *dev = &data->client->dev; in mxt_update_cfg()
1443 cfg.raw = kmemdup_nul(fw->data, fw->size, GFP_KERNEL); in mxt_update_cfg()
1449 mxt_update_crc(data, MXT_COMMAND_REPORTALL, 1); in mxt_update_cfg()
1473 if (cfg.info.family_id != data->info->family_id) { in mxt_update_cfg()
1479 if (cfg.info.variant_id != data->info->variant_id) { in mxt_update_cfg()
1508 if (info_crc == data->info_crc) { in mxt_update_cfg()
1509 if (config_crc == 0 || data->config_crc == 0) { in mxt_update_cfg()
1511 } else if (config_crc == data->config_crc) { in mxt_update_cfg()
1513 data->config_crc); in mxt_update_cfg()
1518 data->config_crc, config_crc); in mxt_update_cfg()
1523 data->info_crc, info_crc); in mxt_update_cfg()
1528 data->info->object_num * sizeof(struct mxt_object) + in mxt_update_cfg()
1530 cfg.mem_size = data->mem_size - cfg.start_ofs; in mxt_update_cfg()
1537 ret = mxt_prepare_cfg_mem(data, &cfg); in mxt_update_cfg()
1542 if (data->T71_address) in mxt_update_cfg()
1543 crc_start = data->T71_address; in mxt_update_cfg()
1544 else if (data->T7_address) in mxt_update_cfg()
1545 crc_start = data->T7_address; in mxt_update_cfg()
1559 ret = mxt_upload_cfg_mem(data, &cfg); in mxt_update_cfg()
1563 mxt_update_crc(data, MXT_COMMAND_BACKUPNV, MXT_BACKUP_VALUE); in mxt_update_cfg()
1565 ret = mxt_soft_reset(data); in mxt_update_cfg()
1572 mxt_init_t7_power_cfg(data); in mxt_update_cfg()
1581 static void mxt_free_input_device(struct mxt_data *data) in mxt_free_input_device() argument
1583 if (data->input_dev) { in mxt_free_input_device()
1584 input_unregister_device(data->input_dev); in mxt_free_input_device()
1585 data->input_dev = NULL; in mxt_free_input_device()
1589 static void mxt_free_object_table(struct mxt_data *data) in mxt_free_object_table() argument
1592 video_unregister_device(&data->dbg.vdev); in mxt_free_object_table()
1593 v4l2_device_unregister(&data->dbg.v4l2); in mxt_free_object_table()
1595 data->object_table = NULL; in mxt_free_object_table()
1596 data->info = NULL; in mxt_free_object_table()
1597 kfree(data->raw_info_block); in mxt_free_object_table()
1598 data->raw_info_block = NULL; in mxt_free_object_table()
1599 kfree(data->msg_buf); in mxt_free_object_table()
1600 data->msg_buf = NULL; in mxt_free_object_table()
1601 data->T5_address = 0; in mxt_free_object_table()
1602 data->T5_msg_size = 0; in mxt_free_object_table()
1603 data->T6_reportid = 0; in mxt_free_object_table()
1604 data->T7_address = 0; in mxt_free_object_table()
1605 data->T71_address = 0; in mxt_free_object_table()
1606 data->T9_reportid_min = 0; in mxt_free_object_table()
1607 data->T9_reportid_max = 0; in mxt_free_object_table()
1608 data->T19_reportid = 0; in mxt_free_object_table()
1609 data->T44_address = 0; in mxt_free_object_table()
1610 data->T100_reportid_min = 0; in mxt_free_object_table()
1611 data->T100_reportid_max = 0; in mxt_free_object_table()
1612 data->max_reportid = 0; in mxt_free_object_table()
1615 static int mxt_parse_object_table(struct mxt_data *data, in mxt_parse_object_table() argument
1618 struct i2c_client *client = data->client; in mxt_parse_object_table()
1625 data->mem_size = 0; in mxt_parse_object_table()
1626 for (i = 0; i < data->info->object_num; i++) { in mxt_parse_object_table()
1642 dev_dbg(&data->client->dev, in mxt_parse_object_table()
1650 if (data->info->family_id == 0x80 && in mxt_parse_object_table()
1651 data->info->version < 0x20) { in mxt_parse_object_table()
1657 data->T5_msg_size = mxt_obj_size(object); in mxt_parse_object_table()
1660 data->T5_msg_size = mxt_obj_size(object) - 1; in mxt_parse_object_table()
1662 data->T5_address = object->start_address; in mxt_parse_object_table()
1665 data->T6_reportid = min_id; in mxt_parse_object_table()
1666 data->T6_address = object->start_address; in mxt_parse_object_table()
1669 data->T7_address = object->start_address; in mxt_parse_object_table()
1672 data->T71_address = object->start_address; in mxt_parse_object_table()
1675 data->multitouch = MXT_TOUCH_MULTI_T9; in mxt_parse_object_table()
1677 data->T9_reportid_min = min_id; in mxt_parse_object_table()
1678 data->T9_reportid_max = min_id + in mxt_parse_object_table()
1680 data->num_touchids = object->num_report_ids; in mxt_parse_object_table()
1683 data->T44_address = object->start_address; in mxt_parse_object_table()
1686 data->T19_reportid = min_id; in mxt_parse_object_table()
1689 data->multitouch = MXT_TOUCH_MULTITOUCHSCREEN_T100; in mxt_parse_object_table()
1690 data->T100_reportid_min = min_id; in mxt_parse_object_table()
1691 data->T100_reportid_max = max_id; in mxt_parse_object_table()
1693 data->num_touchids = object->num_report_ids - 2; in mxt_parse_object_table()
1700 if (end_address >= data->mem_size) in mxt_parse_object_table()
1701 data->mem_size = end_address + 1; in mxt_parse_object_table()
1705 data->max_reportid = reportid; in mxt_parse_object_table()
1708 if (data->T44_address && (data->T5_address != data->T44_address + 1)) { in mxt_parse_object_table()
1713 data->msg_buf = kcalloc(data->max_reportid, in mxt_parse_object_table()
1714 data->T5_msg_size, GFP_KERNEL); in mxt_parse_object_table()
1715 if (!data->msg_buf) in mxt_parse_object_table()
1721 static int mxt_read_info_block(struct mxt_data *data) in mxt_read_info_block() argument
1723 struct i2c_client *client = data->client; in mxt_read_info_block()
1732 if (data->raw_info_block) in mxt_read_info_block()
1733 mxt_free_object_table(data); in mxt_read_info_block()
1766 data->info_crc = crc_ptr[0] | (crc_ptr[1] << 8) | (crc_ptr[2] << 16); in mxt_read_info_block()
1772 * CRC mismatch can be caused by data corruption due to I2C comms in mxt_read_info_block()
1775 if ((data->info_crc == 0) || (data->info_crc != calculated_crc)) { in mxt_read_info_block()
1778 calculated_crc, data->info_crc); in mxt_read_info_block()
1783 data->raw_info_block = id_buf; in mxt_read_info_block()
1784 data->info = (struct mxt_info *)id_buf; in mxt_read_info_block()
1788 data->info->family_id, data->info->variant_id, in mxt_read_info_block()
1789 data->info->version >> 4, data->info->version & 0xf, in mxt_read_info_block()
1790 data->info->build, data->info->object_num); in mxt_read_info_block()
1793 error = mxt_parse_object_table(data, id_buf + MXT_OBJECT_START); in mxt_read_info_block()
1796 mxt_free_object_table(data); in mxt_read_info_block()
1800 data->object_table = (struct mxt_object *)(id_buf + MXT_OBJECT_START); in mxt_read_info_block()
1809 static int mxt_read_t9_resolution(struct mxt_data *data) in mxt_read_t9_resolution() argument
1811 struct i2c_client *client = data->client; in mxt_read_t9_resolution()
1817 object = mxt_get_object(data, MXT_TOUCH_MULTI_T9); in mxt_read_t9_resolution()
1823 sizeof(data->xsize), &data->xsize); in mxt_read_t9_resolution()
1829 sizeof(data->ysize), &data->ysize); in mxt_read_t9_resolution()
1839 data->max_x = get_unaligned_le16(&range.x); in mxt_read_t9_resolution()
1840 data->max_y = get_unaligned_le16(&range.y); in mxt_read_t9_resolution()
1848 data->xy_switch = orient & MXT_T9_ORIENT_SWITCH; in mxt_read_t9_resolution()
1849 data->invertx = orient & MXT_T9_ORIENT_INVERTX; in mxt_read_t9_resolution()
1850 data->inverty = orient & MXT_T9_ORIENT_INVERTY; in mxt_read_t9_resolution()
1855 static int mxt_read_t100_config(struct mxt_data *data) in mxt_read_t100_config() argument
1857 struct i2c_client *client = data->client; in mxt_read_t100_config()
1864 object = mxt_get_object(data, MXT_TOUCH_MULTITOUCHSCREEN_T100); in mxt_read_t100_config()
1875 data->max_x = get_unaligned_le16(&range_x); in mxt_read_t100_config()
1883 data->max_y = get_unaligned_le16(&range_y); in mxt_read_t100_config()
1887 sizeof(data->xsize), &data->xsize); in mxt_read_t100_config()
1893 sizeof(data->ysize), &data->ysize); in mxt_read_t100_config()
1904 data->xy_switch = cfg & MXT_T100_CFG_SWITCHXY; in mxt_read_t100_config()
1905 data->invertx = cfg & MXT_T100_CFG_INVERTX; in mxt_read_t100_config()
1906 data->inverty = cfg & MXT_T100_CFG_INVERTY; in mxt_read_t100_config()
1918 data->t100_aux_vect = aux++; in mxt_read_t100_config()
1921 data->t100_aux_ampl = aux++; in mxt_read_t100_config()
1924 data->t100_aux_area = aux++; in mxt_read_t100_config()
1928 data->t100_aux_vect, data->t100_aux_ampl, data->t100_aux_area); in mxt_read_t100_config()
1937 struct mxt_data *data) in mxt_set_up_as_touchpad() argument
1952 for (i = 0; i < data->t19_num_keys; i++) in mxt_set_up_as_touchpad()
1953 if (data->t19_keymap[i] != KEY_RESERVED) in mxt_set_up_as_touchpad()
1955 data->t19_keymap[i]); in mxt_set_up_as_touchpad()
1958 static int mxt_initialize_input_device(struct mxt_data *data) in mxt_initialize_input_device() argument
1960 struct device *dev = &data->client->dev; in mxt_initialize_input_device()
1966 switch (data->multitouch) { in mxt_initialize_input_device()
1968 num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1; in mxt_initialize_input_device()
1969 error = mxt_read_t9_resolution(data); in mxt_initialize_input_device()
1975 num_mt_slots = data->num_touchids; in mxt_initialize_input_device()
1976 error = mxt_read_t100_config(data); in mxt_initialize_input_device()
1987 if (data->max_x == 0) in mxt_initialize_input_device()
1988 data->max_x = 1023; in mxt_initialize_input_device()
1990 if (data->max_y == 0) in mxt_initialize_input_device()
1991 data->max_y = 1023; in mxt_initialize_input_device()
1993 if (data->xy_switch) in mxt_initialize_input_device()
1994 swap(data->max_x, data->max_y); in mxt_initialize_input_device()
1996 dev_info(dev, "Touchscreen size X%uY%u\n", data->max_x, data->max_y); in mxt_initialize_input_device()
2004 input_dev->phys = data->phys; in mxt_initialize_input_device()
2013 input_set_abs_params(input_dev, ABS_X, 0, data->max_x, 0, 0); in mxt_initialize_input_device()
2014 input_set_abs_params(input_dev, ABS_Y, 0, data->max_y, 0, 0); in mxt_initialize_input_device()
2016 if (data->multitouch == MXT_TOUCH_MULTI_T9 || in mxt_initialize_input_device()
2017 (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 && in mxt_initialize_input_device()
2018 data->t100_aux_ampl)) { in mxt_initialize_input_device()
2023 if (data->t19_num_keys) { in mxt_initialize_input_device()
2024 mxt_set_up_as_touchpad(input_dev, data); in mxt_initialize_input_device()
2037 if (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100) { in mxt_initialize_input_device()
2047 0, data->max_x, 0, 0); in mxt_initialize_input_device()
2049 0, data->max_y, 0, 0); in mxt_initialize_input_device()
2051 if (data->multitouch == MXT_TOUCH_MULTI_T9 || in mxt_initialize_input_device()
2052 (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 && in mxt_initialize_input_device()
2053 data->t100_aux_area)) { in mxt_initialize_input_device()
2058 if (data->multitouch == MXT_TOUCH_MULTI_T9 || in mxt_initialize_input_device()
2059 (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 && in mxt_initialize_input_device()
2060 data->t100_aux_ampl)) { in mxt_initialize_input_device()
2065 if (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 && in mxt_initialize_input_device()
2066 data->t100_aux_vect) { in mxt_initialize_input_device()
2071 if (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 && in mxt_initialize_input_device()
2072 data->t100_aux_vect) { in mxt_initialize_input_device()
2077 input_set_drvdata(input_dev, data); in mxt_initialize_input_device()
2085 data->input_dev = input_dev; in mxt_initialize_input_device()
2094 static int mxt_configure_objects(struct mxt_data *data,
2103 static int mxt_initialize(struct mxt_data *data) in mxt_initialize() argument
2105 struct i2c_client *client = data->client; in mxt_initialize()
2110 error = mxt_read_info_block(data); in mxt_initialize()
2115 error = mxt_probe_bootloader(data, false); in mxt_initialize()
2118 error = mxt_probe_bootloader(data, true); in mxt_initialize()
2132 data->in_bootloader = true; in mxt_initialize()
2137 mxt_send_bootloader_cmd(data, false); in mxt_initialize()
2141 error = mxt_acquire_irq(data); in mxt_initialize()
2146 &client->dev, GFP_KERNEL, data, in mxt_initialize()
2157 static int mxt_set_t7_power_cfg(struct mxt_data *data, u8 sleep) in mxt_set_t7_power_cfg() argument
2159 struct device *dev = &data->client->dev; in mxt_set_t7_power_cfg()
2167 new_config = &data->t7_cfg; in mxt_set_t7_power_cfg()
2169 error = __mxt_write_reg(data->client, data->T7_address, in mxt_set_t7_power_cfg()
2170 sizeof(data->t7_cfg), new_config); in mxt_set_t7_power_cfg()
2180 static int mxt_init_t7_power_cfg(struct mxt_data *data) in mxt_init_t7_power_cfg() argument
2182 struct device *dev = &data->client->dev; in mxt_init_t7_power_cfg()
2187 error = __mxt_read_reg(data->client, data->T7_address, in mxt_init_t7_power_cfg()
2188 sizeof(data->t7_cfg), &data->t7_cfg); in mxt_init_t7_power_cfg()
2192 if (data->t7_cfg.active == 0 || data->t7_cfg.idle == 0) { in mxt_init_t7_power_cfg()
2195 mxt_soft_reset(data); in mxt_init_t7_power_cfg()
2200 data->t7_cfg.active = 20; in mxt_init_t7_power_cfg()
2201 data->t7_cfg.idle = 100; in mxt_init_t7_power_cfg()
2202 return mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN); in mxt_init_t7_power_cfg()
2207 data->t7_cfg.active, data->t7_cfg.idle); in mxt_init_t7_power_cfg()
2222 static u16 mxt_get_debug_value(struct mxt_data *data, unsigned int x, in mxt_get_debug_value() argument
2225 struct mxt_info *info = data->info; in mxt_get_debug_value()
2226 struct mxt_dbg *dbg = &data->dbg; in mxt_get_debug_value()
2246 return get_unaligned_le16(&dbg->t37_buf[page].data[ofs]); in mxt_get_debug_value()
2249 static int mxt_convert_debug_pages(struct mxt_data *data, u16 *outbuf) in mxt_convert_debug_pages() argument
2251 struct mxt_dbg *dbg = &data->dbg; in mxt_convert_debug_pages()
2258 rx = data->xy_switch ? y : x; in mxt_convert_debug_pages()
2259 ry = data->xy_switch ? x : y; in mxt_convert_debug_pages()
2260 rx = data->invertx ? (data->xsize - 1 - rx) : rx; in mxt_convert_debug_pages()
2261 ry = data->inverty ? (data->ysize - 1 - ry) : ry; in mxt_convert_debug_pages()
2263 outbuf[i] = mxt_get_debug_value(data, rx, ry); in mxt_convert_debug_pages()
2266 if (++x >= (data->xy_switch ? data->ysize : data->xsize)) { in mxt_convert_debug_pages()
2275 static int mxt_read_diagnostic_debug(struct mxt_data *data, u8 mode, in mxt_read_diagnostic_debug() argument
2278 struct mxt_dbg *dbg = &data->dbg; in mxt_read_diagnostic_debug()
2289 ret = mxt_write_reg(data->client, dbg->diag_cmd_address, in mxt_read_diagnostic_debug()
2298 ret = __mxt_read_reg(data->client, dbg->diag_cmd_address, in mxt_read_diagnostic_debug()
2313 ret = __mxt_read_reg(data->client, dbg->t37_address, in mxt_read_diagnostic_debug()
2319 dev_err(&data->client->dev, "T37 page mismatch\n"); in mxt_read_diagnostic_debug()
2323 dev_dbg(&data->client->dev, "%s page:%d retries:%d\n", in mxt_read_diagnostic_debug()
2330 return mxt_convert_debug_pages(data, outbuf); in mxt_read_diagnostic_debug()
2337 struct mxt_data *data = q->drv_priv; in mxt_queue_setup() local
2338 size_t size = data->dbg.t37_nodes * sizeof(u16); in mxt_queue_setup()
2351 struct mxt_data *data = vb2_get_drv_priv(vb->vb2_queue); in mxt_buffer_queue() local
2358 dev_err(&data->client->dev, "Error acquiring frame ptr\n"); in mxt_buffer_queue()
2362 switch (data->dbg.input) { in mxt_buffer_queue()
2373 ret = mxt_read_diagnostic_debug(data, mode, ptr); in mxt_buffer_queue()
2377 vb2_set_plane_payload(vb, 0, data->dbg.t37_nodes * sizeof(u16)); in mxt_buffer_queue()
2406 struct mxt_data *data = video_drvdata(file); in mxt_vidioc_querycap() local
2411 "I2C:%s", dev_name(&data->client->dev)); in mxt_vidioc_querycap()
2436 static int mxt_set_input(struct mxt_data *data, unsigned int i) in mxt_set_input() argument
2438 struct v4l2_pix_format *f = &data->dbg.format; in mxt_set_input()
2448 f->width = data->xy_switch ? data->ysize : data->xsize; in mxt_set_input()
2449 f->height = data->xy_switch ? data->xsize : data->ysize; in mxt_set_input()
2455 data->dbg.input = i; in mxt_set_input()
2467 struct mxt_data *data = video_drvdata(file); in mxt_vidioc_g_input() local
2469 *i = data->dbg.input; in mxt_vidioc_g_input()
2476 struct mxt_data *data = video_drvdata(file); in mxt_vidioc_fmt() local
2479 f->fmt.pix = data->dbg.format; in mxt_vidioc_fmt()
2551 static void mxt_debug_init(struct mxt_data *data) in mxt_debug_init() argument
2553 struct mxt_info *info = data->info; in mxt_debug_init()
2554 struct mxt_dbg *dbg = &data->dbg; in mxt_debug_init()
2558 object = mxt_get_object(data, MXT_GEN_COMMAND_T6); in mxt_debug_init()
2564 object = mxt_get_object(data, MXT_DEBUG_DIAGNOSTIC_T37); in mxt_debug_init()
2569 dev_warn(&data->client->dev, "Bad T37 size"); in mxt_debug_init()
2575 /* Calculate size of data and allocate buffer */ in mxt_debug_init()
2576 dbg->t37_nodes = data->xsize * data->ysize; in mxt_debug_init()
2581 dbg->t37_pages = DIV_ROUND_UP(data->xsize * in mxt_debug_init()
2584 sizeof(dbg->t37_buf->data)); in mxt_debug_init()
2586 dbg->t37_buf = devm_kmalloc_array(&data->client->dev, dbg->t37_pages, in mxt_debug_init()
2592 mxt_set_input(data, 0); in mxt_debug_init()
2596 error = v4l2_device_register(&data->client->dev, &dbg->v4l2); in mxt_debug_init()
2603 dbg->queue.drv_priv = data; in mxt_debug_init()
2605 dbg->queue.dev = &data->client->dev; in mxt_debug_init()
2616 video_set_drvdata(&dbg->vdev, data); in mxt_debug_init()
2627 dev_warn(&data->client->dev, "Error initializing T37\n"); in mxt_debug_init()
2630 static void mxt_debug_init(struct mxt_data *data) in mxt_debug_init() argument
2635 static int mxt_configure_objects(struct mxt_data *data, in mxt_configure_objects() argument
2638 struct device *dev = &data->client->dev; in mxt_configure_objects()
2641 error = mxt_init_t7_power_cfg(data); in mxt_configure_objects()
2648 error = mxt_update_cfg(data, cfg); in mxt_configure_objects()
2653 if (data->multitouch) { in mxt_configure_objects()
2654 error = mxt_initialize_input_device(data); in mxt_configure_objects()
2661 mxt_debug_init(data); in mxt_configure_objects()
2670 struct mxt_data *data = dev_get_drvdata(dev); in mxt_fw_version_show() local
2671 struct mxt_info *info = data->info; in mxt_fw_version_show()
2680 struct mxt_data *data = dev_get_drvdata(dev); in mxt_hw_version_show() local
2681 struct mxt_info *info = data->info; in mxt_hw_version_show()
2707 struct mxt_data *data = dev_get_drvdata(dev); in mxt_object_show() local
2720 for (i = 0; i < data->info->object_num; i++) { in mxt_object_show()
2721 object = data->object_table + i; in mxt_object_show()
2733 error = __mxt_read_reg(data->client, addr, size, obuf); in mxt_object_show()
2753 c = *(fw->data + pos); in mxt_check_firmware_format()
2772 struct mxt_data *data = dev_get_drvdata(dev); in mxt_load_fw() local
2791 if (!data->in_bootloader) { in mxt_load_fw()
2793 data->in_bootloader = true; in mxt_load_fw()
2795 ret = mxt_t6_command(data, MXT_COMMAND_RESET, in mxt_load_fw()
2803 ret = mxt_lookup_bootloader_address(data, 0); in mxt_load_fw()
2807 mxt_free_input_device(data); in mxt_load_fw()
2808 mxt_free_object_table(data); in mxt_load_fw()
2810 enable_irq(data->irq); in mxt_load_fw()
2813 reinit_completion(&data->bl_completion); in mxt_load_fw()
2815 ret = mxt_check_bootloader(data, MXT_WAITING_BOOTLOAD_CMD, false); in mxt_load_fw()
2818 ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, false); in mxt_load_fw()
2825 ret = mxt_send_bootloader_cmd(data, true); in mxt_load_fw()
2831 ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, true); in mxt_load_fw()
2835 frame_size = ((*(fw->data + pos) << 8) | *(fw->data + pos + 1)); in mxt_load_fw()
2841 ret = mxt_bootloader_write(data, fw->data + pos, frame_size); in mxt_load_fw()
2845 ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS, true); in mxt_load_fw()
2868 ret = mxt_wait_for_completion(data, &data->bl_completion, in mxt_load_fw()
2880 mxt_wait_for_completion(data, &data->bl_completion, MXT_FW_RESET_TIME); in mxt_load_fw()
2882 data->in_bootloader = false; in mxt_load_fw()
2885 disable_irq(data->irq); in mxt_load_fw()
2895 struct mxt_data *data = dev_get_drvdata(dev); in mxt_update_fw_store() local
2905 error = mxt_initialize(data); in mxt_update_fw_store()
2930 static void mxt_start(struct mxt_data *data) in mxt_start() argument
2932 switch (data->suspend_mode) { in mxt_start()
2934 mxt_soft_reset(data); in mxt_start()
2938 mxt_write_object(data, in mxt_start()
2944 mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN); in mxt_start()
2947 mxt_t6_command(data, MXT_COMMAND_CALIBRATE, 1, false); in mxt_start()
2952 static void mxt_stop(struct mxt_data *data) in mxt_stop() argument
2954 switch (data->suspend_mode) { in mxt_stop()
2957 mxt_write_object(data, in mxt_stop()
2963 mxt_set_t7_power_cfg(data, MXT_POWER_CFG_DEEPSLEEP); in mxt_stop()
2970 struct mxt_data *data = input_get_drvdata(dev); in mxt_input_open() local
2972 mxt_start(data); in mxt_input_open()
2979 struct mxt_data *data = input_get_drvdata(dev); in mxt_input_close() local
2981 mxt_stop(data); in mxt_input_close()
2984 static int mxt_parse_device_properties(struct mxt_data *data) in mxt_parse_device_properties() argument
2987 struct device *dev = &data->client->dev; in mxt_parse_device_properties()
3014 data->t19_keymap = keymap; in mxt_parse_device_properties()
3015 data->t19_num_keys = n_keys; in mxt_parse_device_properties()
3038 struct mxt_data *data; in mxt_probe() local
3066 data = devm_kzalloc(&client->dev, sizeof(struct mxt_data), GFP_KERNEL); in mxt_probe()
3067 if (!data) in mxt_probe()
3070 snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0", in mxt_probe()
3073 data->client = client; in mxt_probe()
3074 data->irq = client->irq; in mxt_probe()
3075 i2c_set_clientdata(client, data); in mxt_probe()
3077 init_completion(&data->bl_completion); in mxt_probe()
3078 init_completion(&data->reset_completion); in mxt_probe()
3079 init_completion(&data->crc_completion); in mxt_probe()
3081 data->suspend_mode = dmi_check_system(chromebook_T9_suspend_dmi) ? in mxt_probe()
3084 error = mxt_parse_device_properties(data); in mxt_probe()
3088 data->reset_gpio = devm_gpiod_get_optional(&client->dev, in mxt_probe()
3090 if (IS_ERR(data->reset_gpio)) { in mxt_probe()
3091 error = PTR_ERR(data->reset_gpio); in mxt_probe()
3098 client->name, data); in mxt_probe()
3106 if (data->reset_gpio) { in mxt_probe()
3108 gpiod_set_value(data->reset_gpio, 1); in mxt_probe()
3112 error = mxt_initialize(data); in mxt_probe()
3126 mxt_free_input_device(data); in mxt_probe()
3127 mxt_free_object_table(data); in mxt_probe()
3133 struct mxt_data *data = i2c_get_clientdata(client); in mxt_remove() local
3135 disable_irq(data->irq); in mxt_remove()
3137 mxt_free_input_device(data); in mxt_remove()
3138 mxt_free_object_table(data); in mxt_remove()
3146 struct mxt_data *data = i2c_get_clientdata(client); in mxt_suspend() local
3147 struct input_dev *input_dev = data->input_dev; in mxt_suspend()
3155 mxt_stop(data); in mxt_suspend()
3165 struct mxt_data *data = i2c_get_clientdata(client); in mxt_resume() local
3166 struct input_dev *input_dev = data->input_dev; in mxt_resume()
3174 mxt_start(data); in mxt_resume()