Lines Matching refs:tsdata

153 static bool edt_ft5x06_ts_check_crc(struct edt_ft5x06_ts_data *tsdata,  in edt_ft5x06_ts_check_crc()  argument
163 dev_err_ratelimited(&tsdata->client->dev, in edt_ft5x06_ts_check_crc()
174 struct edt_ft5x06_ts_data *tsdata = dev_id; in edt_ft5x06_ts_isr() local
175 struct device *dev = &tsdata->client->dev; in edt_ft5x06_ts_isr()
182 switch (tsdata->version) { in edt_ft5x06_ts_isr()
205 datalen = tplen * tsdata->max_support_points + offset + crclen; in edt_ft5x06_ts_isr()
207 error = edt_ft5x06_ts_readwrite(tsdata->client, in edt_ft5x06_ts_isr()
217 if (tsdata->version == EDT_M06) { in edt_ft5x06_ts_isr()
226 if (!edt_ft5x06_ts_check_crc(tsdata, rdbuf, datalen)) in edt_ft5x06_ts_isr()
230 for (i = 0; i < tsdata->max_support_points; i++) { in edt_ft5x06_ts_isr()
239 if (tsdata->version == EDT_M06 && type == TOUCH_EVENT_DOWN) in edt_ft5x06_ts_isr()
245 if (tsdata->version == EV_FT) in edt_ft5x06_ts_isr()
250 input_mt_slot(tsdata->input, id); in edt_ft5x06_ts_isr()
251 if (input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, in edt_ft5x06_ts_isr()
253 touchscreen_report_pos(tsdata->input, &tsdata->prop, in edt_ft5x06_ts_isr()
257 input_mt_report_pointer_emulation(tsdata->input, true); in edt_ft5x06_ts_isr()
258 input_sync(tsdata->input); in edt_ft5x06_ts_isr()
264 static int edt_ft5x06_register_write(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_register_write() argument
269 switch (tsdata->version) { in edt_ft5x06_register_write()
271 wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; in edt_ft5x06_register_write()
272 wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; in edt_ft5x06_register_write()
275 return edt_ft5x06_ts_readwrite(tsdata->client, 4, in edt_ft5x06_register_write()
285 return edt_ft5x06_ts_readwrite(tsdata->client, 2, in edt_ft5x06_register_write()
293 static int edt_ft5x06_register_read(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_register_read() argument
299 switch (tsdata->version) { in edt_ft5x06_register_read()
301 wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; in edt_ft5x06_register_read()
302 wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; in edt_ft5x06_register_read()
303 wrbuf[1] |= tsdata->factory_mode ? 0x80 : 0x40; in edt_ft5x06_register_read()
305 error = edt_ft5x06_ts_readwrite(tsdata->client, 2, wrbuf, 2, in edt_ft5x06_register_read()
311 dev_err(&tsdata->client->dev, in edt_ft5x06_register_read()
325 error = edt_ft5x06_ts_readwrite(tsdata->client, 1, in edt_ft5x06_register_read()
367 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_setting_show() local
370 u8 *field = (u8 *)tsdata + attr->field_offset; in edt_ft5x06_setting_show()
376 mutex_lock(&tsdata->mutex); in edt_ft5x06_setting_show()
378 if (tsdata->factory_mode) { in edt_ft5x06_setting_show()
383 switch (tsdata->version) { in edt_ft5x06_setting_show()
404 val = edt_ft5x06_register_read(tsdata, addr); in edt_ft5x06_setting_show()
407 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_show()
417 dev_warn(&tsdata->client->dev, in edt_ft5x06_setting_show()
425 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_show()
434 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_setting_store() local
437 u8 *field = (u8 *)tsdata + attr->field_offset; in edt_ft5x06_setting_store()
442 mutex_lock(&tsdata->mutex); in edt_ft5x06_setting_store()
444 if (tsdata->factory_mode) { in edt_ft5x06_setting_store()
458 switch (tsdata->version) { in edt_ft5x06_setting_store()
479 error = edt_ft5x06_register_write(tsdata, addr, val); in edt_ft5x06_setting_store()
481 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_store()
490 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_store()
528 static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_factory_mode() argument
530 struct i2c_client *client = tsdata->client; in edt_ft5x06_factory_mode()
535 if (tsdata->version != EDT_M06) { in edt_ft5x06_factory_mode()
543 if (!tsdata->raw_buffer) { in edt_ft5x06_factory_mode()
544 tsdata->raw_bufsize = tsdata->num_x * tsdata->num_y * in edt_ft5x06_factory_mode()
546 tsdata->raw_buffer = kzalloc(tsdata->raw_bufsize, GFP_KERNEL); in edt_ft5x06_factory_mode()
547 if (!tsdata->raw_buffer) { in edt_ft5x06_factory_mode()
554 error = edt_ft5x06_register_write(tsdata, WORK_REGISTER_OPMODE, 0x03); in edt_ft5x06_factory_mode()
561 tsdata->factory_mode = true; in edt_ft5x06_factory_mode()
565 ret = edt_ft5x06_register_read(tsdata, FACTORY_REGISTER_OPMODE); in edt_ft5x06_factory_mode()
580 kfree(tsdata->raw_buffer); in edt_ft5x06_factory_mode()
581 tsdata->raw_buffer = NULL; in edt_ft5x06_factory_mode()
582 tsdata->factory_mode = false; in edt_ft5x06_factory_mode()
588 static int edt_ft5x06_work_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_work_mode() argument
590 struct i2c_client *client = tsdata->client; in edt_ft5x06_work_mode()
592 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_work_mode()
597 error = edt_ft5x06_register_write(tsdata, FACTORY_REGISTER_OPMODE, 0x1); in edt_ft5x06_work_mode()
604 tsdata->factory_mode = false; in edt_ft5x06_work_mode()
609 ret = edt_ft5x06_register_read(tsdata, WORK_REGISTER_OPMODE); in edt_ft5x06_work_mode()
617 tsdata->factory_mode = true; in edt_ft5x06_work_mode()
621 kfree(tsdata->raw_buffer); in edt_ft5x06_work_mode()
622 tsdata->raw_buffer = NULL; in edt_ft5x06_work_mode()
625 edt_ft5x06_register_write(tsdata, reg_addr->reg_threshold, in edt_ft5x06_work_mode()
626 tsdata->threshold); in edt_ft5x06_work_mode()
627 edt_ft5x06_register_write(tsdata, reg_addr->reg_gain, in edt_ft5x06_work_mode()
628 tsdata->gain); in edt_ft5x06_work_mode()
630 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, in edt_ft5x06_work_mode()
631 tsdata->offset); in edt_ft5x06_work_mode()
633 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_x, in edt_ft5x06_work_mode()
634 tsdata->offset_x); in edt_ft5x06_work_mode()
636 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_y, in edt_ft5x06_work_mode()
637 tsdata->offset_y); in edt_ft5x06_work_mode()
639 edt_ft5x06_register_write(tsdata, reg_addr->reg_report_rate, in edt_ft5x06_work_mode()
640 tsdata->report_rate); in edt_ft5x06_work_mode()
649 struct edt_ft5x06_ts_data *tsdata = data; in edt_ft5x06_debugfs_mode_get() local
651 *mode = tsdata->factory_mode; in edt_ft5x06_debugfs_mode_get()
658 struct edt_ft5x06_ts_data *tsdata = data; in edt_ft5x06_debugfs_mode_set() local
664 mutex_lock(&tsdata->mutex); in edt_ft5x06_debugfs_mode_set()
666 if (mode != tsdata->factory_mode) { in edt_ft5x06_debugfs_mode_set()
667 retval = mode ? edt_ft5x06_factory_mode(tsdata) : in edt_ft5x06_debugfs_mode_set()
668 edt_ft5x06_work_mode(tsdata); in edt_ft5x06_debugfs_mode_set()
671 mutex_unlock(&tsdata->mutex); in edt_ft5x06_debugfs_mode_set()
682 struct edt_ft5x06_ts_data *tsdata = file->private_data; in edt_ft5x06_debugfs_raw_data_read() local
683 struct i2c_client *client = tsdata->client; in edt_ft5x06_debugfs_raw_data_read()
691 if (*off < 0 || *off >= tsdata->raw_bufsize) in edt_ft5x06_debugfs_raw_data_read()
694 mutex_lock(&tsdata->mutex); in edt_ft5x06_debugfs_raw_data_read()
696 if (!tsdata->factory_mode || !tsdata->raw_buffer) { in edt_ft5x06_debugfs_raw_data_read()
701 error = edt_ft5x06_register_write(tsdata, 0x08, 0x01); in edt_ft5x06_debugfs_raw_data_read()
710 val = edt_ft5x06_register_read(tsdata, 0x08); in edt_ft5x06_debugfs_raw_data_read()
729 rdbuf = tsdata->raw_buffer; in edt_ft5x06_debugfs_raw_data_read()
730 colbytes = tsdata->num_y * sizeof(u16); in edt_ft5x06_debugfs_raw_data_read()
734 for (i = 0; i < tsdata->num_x; i++) { in edt_ft5x06_debugfs_raw_data_read()
736 error = edt_ft5x06_ts_readwrite(tsdata->client, in edt_ft5x06_debugfs_raw_data_read()
745 read = min_t(size_t, count, tsdata->raw_bufsize - *off); in edt_ft5x06_debugfs_raw_data_read()
746 if (copy_to_user(buf, tsdata->raw_buffer + *off, read)) { in edt_ft5x06_debugfs_raw_data_read()
753 mutex_unlock(&tsdata->mutex); in edt_ft5x06_debugfs_raw_data_read()
763 edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_prepare_debugfs() argument
766 tsdata->debug_dir = debugfs_create_dir(debugfs_name, NULL); in edt_ft5x06_ts_prepare_debugfs()
768 debugfs_create_u16("num_x", S_IRUSR, tsdata->debug_dir, &tsdata->num_x); in edt_ft5x06_ts_prepare_debugfs()
769 debugfs_create_u16("num_y", S_IRUSR, tsdata->debug_dir, &tsdata->num_y); in edt_ft5x06_ts_prepare_debugfs()
772 tsdata->debug_dir, tsdata, &debugfs_mode_fops); in edt_ft5x06_ts_prepare_debugfs()
774 tsdata->debug_dir, tsdata, &debugfs_raw_data_fops); in edt_ft5x06_ts_prepare_debugfs()
778 edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_teardown_debugfs() argument
780 debugfs_remove_recursive(tsdata->debug_dir); in edt_ft5x06_ts_teardown_debugfs()
781 kfree(tsdata->raw_buffer); in edt_ft5x06_ts_teardown_debugfs()
787 edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_prepare_debugfs() argument
793 edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_teardown_debugfs() argument
800 struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_identify() argument
806 char *model_name = tsdata->name; in edt_ft5x06_ts_identify()
823 tsdata->version = EDT_M06; in edt_ft5x06_ts_identify()
837 tsdata->version = EDT_M12; in edt_ft5x06_ts_identify()
860 tsdata->version = GENERIC_FT; in edt_ft5x06_ts_identify()
884 tsdata->version = EDT_M09; in edt_ft5x06_ts_identify()
889 tsdata->version = EDT_M09; in edt_ft5x06_ts_identify()
897 tsdata->version = EV_FT; in edt_ft5x06_ts_identify()
918 struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_get_defaults() argument
920 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_get_defaults()
926 edt_ft5x06_register_write(tsdata, reg_addr->reg_threshold, val); in edt_ft5x06_ts_get_defaults()
927 tsdata->threshold = val; in edt_ft5x06_ts_get_defaults()
932 edt_ft5x06_register_write(tsdata, reg_addr->reg_gain, val); in edt_ft5x06_ts_get_defaults()
933 tsdata->gain = val; in edt_ft5x06_ts_get_defaults()
938 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, val); in edt_ft5x06_ts_get_defaults()
939 tsdata->offset = val; in edt_ft5x06_ts_get_defaults()
944 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_x, val); in edt_ft5x06_ts_get_defaults()
945 tsdata->offset_x = val; in edt_ft5x06_ts_get_defaults()
950 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_y, val); in edt_ft5x06_ts_get_defaults()
951 tsdata->offset_y = val; in edt_ft5x06_ts_get_defaults()
956 edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_get_parameters() argument
958 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_get_parameters()
960 tsdata->threshold = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
962 tsdata->gain = edt_ft5x06_register_read(tsdata, reg_addr->reg_gain); in edt_ft5x06_ts_get_parameters()
964 tsdata->offset = in edt_ft5x06_ts_get_parameters()
965 edt_ft5x06_register_read(tsdata, reg_addr->reg_offset); in edt_ft5x06_ts_get_parameters()
967 tsdata->offset_x = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
970 tsdata->offset_y = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
973 tsdata->report_rate = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
975 if (tsdata->version == EDT_M06 || in edt_ft5x06_ts_get_parameters()
976 tsdata->version == EDT_M09 || in edt_ft5x06_ts_get_parameters()
977 tsdata->version == EDT_M12) { in edt_ft5x06_ts_get_parameters()
978 tsdata->num_x = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
980 tsdata->num_y = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
983 tsdata->num_x = -1; in edt_ft5x06_ts_get_parameters()
984 tsdata->num_y = -1; in edt_ft5x06_ts_get_parameters()
989 edt_ft5x06_ts_set_regs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_set_regs() argument
991 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_set_regs()
993 switch (tsdata->version) { in edt_ft5x06_ts_set_regs()
1043 struct edt_ft5x06_ts_data *tsdata; in edt_ft5x06_ts_probe() local
1051 tsdata = devm_kzalloc(&client->dev, sizeof(*tsdata), GFP_KERNEL); in edt_ft5x06_ts_probe()
1052 if (!tsdata) { in edt_ft5x06_ts_probe()
1065 tsdata->max_support_points = chip_data->max_support_points; in edt_ft5x06_ts_probe()
1067 tsdata->reset_gpio = devm_gpiod_get_optional(&client->dev, in edt_ft5x06_ts_probe()
1069 if (IS_ERR(tsdata->reset_gpio)) { in edt_ft5x06_ts_probe()
1070 error = PTR_ERR(tsdata->reset_gpio); in edt_ft5x06_ts_probe()
1076 tsdata->wake_gpio = devm_gpiod_get_optional(&client->dev, in edt_ft5x06_ts_probe()
1078 if (IS_ERR(tsdata->wake_gpio)) { in edt_ft5x06_ts_probe()
1079 error = PTR_ERR(tsdata->wake_gpio); in edt_ft5x06_ts_probe()
1085 if (tsdata->wake_gpio) { in edt_ft5x06_ts_probe()
1087 gpiod_set_value_cansleep(tsdata->wake_gpio, 1); in edt_ft5x06_ts_probe()
1090 if (tsdata->reset_gpio) { in edt_ft5x06_ts_probe()
1092 gpiod_set_value_cansleep(tsdata->reset_gpio, 0); in edt_ft5x06_ts_probe()
1102 mutex_init(&tsdata->mutex); in edt_ft5x06_ts_probe()
1103 tsdata->client = client; in edt_ft5x06_ts_probe()
1104 tsdata->input = input; in edt_ft5x06_ts_probe()
1105 tsdata->factory_mode = false; in edt_ft5x06_ts_probe()
1107 error = edt_ft5x06_ts_identify(client, tsdata, fw_version); in edt_ft5x06_ts_probe()
1113 edt_ft5x06_ts_set_regs(tsdata); in edt_ft5x06_ts_probe()
1114 edt_ft5x06_ts_get_defaults(&client->dev, tsdata); in edt_ft5x06_ts_probe()
1115 edt_ft5x06_ts_get_parameters(tsdata); in edt_ft5x06_ts_probe()
1119 tsdata->name, fw_version, tsdata->num_x, tsdata->num_y); in edt_ft5x06_ts_probe()
1121 input->name = tsdata->name; in edt_ft5x06_ts_probe()
1125 if (tsdata->version == EDT_M06 || in edt_ft5x06_ts_probe()
1126 tsdata->version == EDT_M09 || in edt_ft5x06_ts_probe()
1127 tsdata->version == EDT_M12) { in edt_ft5x06_ts_probe()
1129 0, tsdata->num_x * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
1131 0, tsdata->num_y * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
1140 touchscreen_parse_properties(input, true, &tsdata->prop); in edt_ft5x06_ts_probe()
1142 error = input_mt_init_slots(input, tsdata->max_support_points, in edt_ft5x06_ts_probe()
1149 i2c_set_clientdata(client, tsdata); in edt_ft5x06_ts_probe()
1158 client->name, tsdata); in edt_ft5x06_ts_probe()
1172 edt_ft5x06_ts_prepare_debugfs(tsdata, dev_driver_string(&client->dev)); in edt_ft5x06_ts_probe()
1178 tsdata->wake_gpio ? desc_to_gpio(tsdata->wake_gpio) : -1, in edt_ft5x06_ts_probe()
1179 tsdata->reset_gpio ? desc_to_gpio(tsdata->reset_gpio) : -1); in edt_ft5x06_ts_probe()
1186 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_ts_remove() local
1188 edt_ft5x06_ts_teardown_debugfs(tsdata); in edt_ft5x06_ts_remove()