Lines Matching refs:tsdata

167 static bool edt_ft5x06_ts_check_crc(struct edt_ft5x06_ts_data *tsdata,  in edt_ft5x06_ts_check_crc()  argument
177 dev_err_ratelimited(&tsdata->client->dev, in edt_ft5x06_ts_check_crc()
188 struct edt_ft5x06_ts_data *tsdata = dev_id; in edt_ft5x06_ts_isr() local
189 struct device *dev = &tsdata->client->dev; in edt_ft5x06_ts_isr()
196 switch (tsdata->version) { in edt_ft5x06_ts_isr()
219 datalen = tplen * tsdata->max_support_points + offset + crclen; in edt_ft5x06_ts_isr()
221 error = edt_ft5x06_ts_readwrite(tsdata->client, in edt_ft5x06_ts_isr()
231 if (tsdata->version == EDT_M06) { in edt_ft5x06_ts_isr()
240 if (!edt_ft5x06_ts_check_crc(tsdata, rdbuf, datalen)) in edt_ft5x06_ts_isr()
244 for (i = 0; i < tsdata->max_support_points; i++) { in edt_ft5x06_ts_isr()
253 if (tsdata->version == EDT_M06 && type == TOUCH_EVENT_DOWN) in edt_ft5x06_ts_isr()
259 if (tsdata->version == EV_FT) in edt_ft5x06_ts_isr()
264 input_mt_slot(tsdata->input, id); in edt_ft5x06_ts_isr()
265 if (input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, in edt_ft5x06_ts_isr()
267 touchscreen_report_pos(tsdata->input, &tsdata->prop, in edt_ft5x06_ts_isr()
271 input_mt_report_pointer_emulation(tsdata->input, true); in edt_ft5x06_ts_isr()
272 input_sync(tsdata->input); in edt_ft5x06_ts_isr()
278 static int edt_ft5x06_register_write(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_register_write() argument
283 switch (tsdata->version) { in edt_ft5x06_register_write()
285 wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; in edt_ft5x06_register_write()
286 wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; in edt_ft5x06_register_write()
289 return edt_ft5x06_ts_readwrite(tsdata->client, 4, in edt_ft5x06_register_write()
299 return edt_ft5x06_ts_readwrite(tsdata->client, 2, in edt_ft5x06_register_write()
307 static int edt_ft5x06_register_read(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_register_read() argument
313 switch (tsdata->version) { in edt_ft5x06_register_read()
315 wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; in edt_ft5x06_register_read()
316 wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; in edt_ft5x06_register_read()
317 wrbuf[1] |= tsdata->factory_mode ? 0x80 : 0x40; in edt_ft5x06_register_read()
319 error = edt_ft5x06_ts_readwrite(tsdata->client, 2, wrbuf, 2, in edt_ft5x06_register_read()
325 dev_err(&tsdata->client->dev, in edt_ft5x06_register_read()
338 error = edt_ft5x06_ts_readwrite(tsdata->client, 1, in edt_ft5x06_register_read()
380 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_setting_show() local
383 u8 *field = (u8 *)tsdata + attr->field_offset; in edt_ft5x06_setting_show()
389 mutex_lock(&tsdata->mutex); in edt_ft5x06_setting_show()
391 if (tsdata->factory_mode) { in edt_ft5x06_setting_show()
396 switch (tsdata->version) { in edt_ft5x06_setting_show()
417 val = edt_ft5x06_register_read(tsdata, addr); in edt_ft5x06_setting_show()
420 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_show()
430 dev_warn(&tsdata->client->dev, in edt_ft5x06_setting_show()
438 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_show()
447 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_setting_store() local
450 u8 *field = (u8 *)tsdata + attr->field_offset; in edt_ft5x06_setting_store()
455 mutex_lock(&tsdata->mutex); in edt_ft5x06_setting_store()
457 if (tsdata->factory_mode) { in edt_ft5x06_setting_store()
471 switch (tsdata->version) { in edt_ft5x06_setting_store()
492 error = edt_ft5x06_register_write(tsdata, addr, val); in edt_ft5x06_setting_store()
494 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_store()
503 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_store()
540 static void edt_ft5x06_restore_reg_parameters(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_restore_reg_parameters() argument
542 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_restore_reg_parameters()
544 edt_ft5x06_register_write(tsdata, reg_addr->reg_threshold, in edt_ft5x06_restore_reg_parameters()
545 tsdata->threshold); in edt_ft5x06_restore_reg_parameters()
546 edt_ft5x06_register_write(tsdata, reg_addr->reg_gain, in edt_ft5x06_restore_reg_parameters()
547 tsdata->gain); in edt_ft5x06_restore_reg_parameters()
549 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, in edt_ft5x06_restore_reg_parameters()
550 tsdata->offset); in edt_ft5x06_restore_reg_parameters()
552 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_x, in edt_ft5x06_restore_reg_parameters()
553 tsdata->offset_x); in edt_ft5x06_restore_reg_parameters()
555 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_y, in edt_ft5x06_restore_reg_parameters()
556 tsdata->offset_y); in edt_ft5x06_restore_reg_parameters()
558 edt_ft5x06_register_write(tsdata, reg_addr->reg_report_rate, in edt_ft5x06_restore_reg_parameters()
559 tsdata->report_rate); in edt_ft5x06_restore_reg_parameters()
564 static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_factory_mode() argument
566 struct i2c_client *client = tsdata->client; in edt_ft5x06_factory_mode()
571 if (tsdata->version != EDT_M06) { in edt_ft5x06_factory_mode()
579 if (!tsdata->raw_buffer) { in edt_ft5x06_factory_mode()
580 tsdata->raw_bufsize = tsdata->num_x * tsdata->num_y * in edt_ft5x06_factory_mode()
582 tsdata->raw_buffer = kzalloc(tsdata->raw_bufsize, GFP_KERNEL); in edt_ft5x06_factory_mode()
583 if (!tsdata->raw_buffer) { in edt_ft5x06_factory_mode()
590 error = edt_ft5x06_register_write(tsdata, WORK_REGISTER_OPMODE, 0x03); in edt_ft5x06_factory_mode()
597 tsdata->factory_mode = true; in edt_ft5x06_factory_mode()
601 ret = edt_ft5x06_register_read(tsdata, FACTORY_REGISTER_OPMODE); in edt_ft5x06_factory_mode()
616 kfree(tsdata->raw_buffer); in edt_ft5x06_factory_mode()
617 tsdata->raw_buffer = NULL; in edt_ft5x06_factory_mode()
618 tsdata->factory_mode = false; in edt_ft5x06_factory_mode()
624 static int edt_ft5x06_work_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_work_mode() argument
626 struct i2c_client *client = tsdata->client; in edt_ft5x06_work_mode()
632 error = edt_ft5x06_register_write(tsdata, FACTORY_REGISTER_OPMODE, 0x1); in edt_ft5x06_work_mode()
639 tsdata->factory_mode = false; in edt_ft5x06_work_mode()
644 ret = edt_ft5x06_register_read(tsdata, WORK_REGISTER_OPMODE); in edt_ft5x06_work_mode()
652 tsdata->factory_mode = true; in edt_ft5x06_work_mode()
656 kfree(tsdata->raw_buffer); in edt_ft5x06_work_mode()
657 tsdata->raw_buffer = NULL; in edt_ft5x06_work_mode()
659 edt_ft5x06_restore_reg_parameters(tsdata); in edt_ft5x06_work_mode()
667 struct edt_ft5x06_ts_data *tsdata = data; in edt_ft5x06_debugfs_mode_get() local
669 *mode = tsdata->factory_mode; in edt_ft5x06_debugfs_mode_get()
676 struct edt_ft5x06_ts_data *tsdata = data; in edt_ft5x06_debugfs_mode_set() local
682 mutex_lock(&tsdata->mutex); in edt_ft5x06_debugfs_mode_set()
684 if (mode != tsdata->factory_mode) { in edt_ft5x06_debugfs_mode_set()
685 retval = mode ? edt_ft5x06_factory_mode(tsdata) : in edt_ft5x06_debugfs_mode_set()
686 edt_ft5x06_work_mode(tsdata); in edt_ft5x06_debugfs_mode_set()
689 mutex_unlock(&tsdata->mutex); in edt_ft5x06_debugfs_mode_set()
700 struct edt_ft5x06_ts_data *tsdata = file->private_data; in edt_ft5x06_debugfs_raw_data_read() local
701 struct i2c_client *client = tsdata->client; in edt_ft5x06_debugfs_raw_data_read()
709 if (*off < 0 || *off >= tsdata->raw_bufsize) in edt_ft5x06_debugfs_raw_data_read()
712 mutex_lock(&tsdata->mutex); in edt_ft5x06_debugfs_raw_data_read()
714 if (!tsdata->factory_mode || !tsdata->raw_buffer) { in edt_ft5x06_debugfs_raw_data_read()
719 error = edt_ft5x06_register_write(tsdata, 0x08, 0x01); in edt_ft5x06_debugfs_raw_data_read()
728 val = edt_ft5x06_register_read(tsdata, 0x08); in edt_ft5x06_debugfs_raw_data_read()
747 rdbuf = tsdata->raw_buffer; in edt_ft5x06_debugfs_raw_data_read()
748 colbytes = tsdata->num_y * sizeof(u16); in edt_ft5x06_debugfs_raw_data_read()
752 for (i = 0; i < tsdata->num_x; i++) { in edt_ft5x06_debugfs_raw_data_read()
754 error = edt_ft5x06_ts_readwrite(tsdata->client, in edt_ft5x06_debugfs_raw_data_read()
763 read = min_t(size_t, count, tsdata->raw_bufsize - *off); in edt_ft5x06_debugfs_raw_data_read()
764 if (copy_to_user(buf, tsdata->raw_buffer + *off, read)) { in edt_ft5x06_debugfs_raw_data_read()
771 mutex_unlock(&tsdata->mutex); in edt_ft5x06_debugfs_raw_data_read()
780 static void edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_prepare_debugfs() argument
783 tsdata->debug_dir = debugfs_create_dir(debugfs_name, NULL); in edt_ft5x06_ts_prepare_debugfs()
785 debugfs_create_u16("num_x", S_IRUSR, tsdata->debug_dir, &tsdata->num_x); in edt_ft5x06_ts_prepare_debugfs()
786 debugfs_create_u16("num_y", S_IRUSR, tsdata->debug_dir, &tsdata->num_y); in edt_ft5x06_ts_prepare_debugfs()
789 tsdata->debug_dir, tsdata, &debugfs_mode_fops); in edt_ft5x06_ts_prepare_debugfs()
791 tsdata->debug_dir, tsdata, &debugfs_raw_data_fops); in edt_ft5x06_ts_prepare_debugfs()
794 static void edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_teardown_debugfs() argument
796 debugfs_remove_recursive(tsdata->debug_dir); in edt_ft5x06_ts_teardown_debugfs()
797 kfree(tsdata->raw_buffer); in edt_ft5x06_ts_teardown_debugfs()
802 static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_factory_mode() argument
807 static void edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_prepare_debugfs() argument
812 static void edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_teardown_debugfs() argument
819 struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_identify() argument
825 char *model_name = tsdata->name; in edt_ft5x06_ts_identify()
842 tsdata->version = EDT_M06; in edt_ft5x06_ts_identify()
856 tsdata->version = EDT_M12; in edt_ft5x06_ts_identify()
879 tsdata->version = GENERIC_FT; in edt_ft5x06_ts_identify()
903 tsdata->version = EDT_M09; in edt_ft5x06_ts_identify()
908 tsdata->version = EDT_M09; in edt_ft5x06_ts_identify()
916 tsdata->version = EV_FT; in edt_ft5x06_ts_identify()
937 struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_get_defaults() argument
939 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_get_defaults()
945 edt_ft5x06_register_write(tsdata, reg_addr->reg_threshold, val); in edt_ft5x06_ts_get_defaults()
946 tsdata->threshold = val; in edt_ft5x06_ts_get_defaults()
951 edt_ft5x06_register_write(tsdata, reg_addr->reg_gain, val); in edt_ft5x06_ts_get_defaults()
952 tsdata->gain = val; in edt_ft5x06_ts_get_defaults()
958 edt_ft5x06_register_write(tsdata, in edt_ft5x06_ts_get_defaults()
960 tsdata->offset = val; in edt_ft5x06_ts_get_defaults()
966 edt_ft5x06_register_write(tsdata, in edt_ft5x06_ts_get_defaults()
968 tsdata->offset_x = val; in edt_ft5x06_ts_get_defaults()
974 edt_ft5x06_register_write(tsdata, in edt_ft5x06_ts_get_defaults()
976 tsdata->offset_y = val; in edt_ft5x06_ts_get_defaults()
981 edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_get_parameters() argument
983 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_get_parameters()
985 tsdata->threshold = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
987 tsdata->gain = edt_ft5x06_register_read(tsdata, reg_addr->reg_gain); in edt_ft5x06_ts_get_parameters()
989 tsdata->offset = in edt_ft5x06_ts_get_parameters()
990 edt_ft5x06_register_read(tsdata, reg_addr->reg_offset); in edt_ft5x06_ts_get_parameters()
992 tsdata->offset_x = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
995 tsdata->offset_y = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
998 tsdata->report_rate = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
1000 if (tsdata->version == EDT_M06 || in edt_ft5x06_ts_get_parameters()
1001 tsdata->version == EDT_M09 || in edt_ft5x06_ts_get_parameters()
1002 tsdata->version == EDT_M12) { in edt_ft5x06_ts_get_parameters()
1003 tsdata->num_x = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
1005 tsdata->num_y = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
1008 tsdata->num_x = -1; in edt_ft5x06_ts_get_parameters()
1009 tsdata->num_y = -1; in edt_ft5x06_ts_get_parameters()
1014 edt_ft5x06_ts_set_regs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_set_regs() argument
1016 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_set_regs()
1018 switch (tsdata->version) { in edt_ft5x06_ts_set_regs()
1075 struct edt_ft5x06_ts_data *tsdata; in edt_ft5x06_ts_probe() local
1084 tsdata = devm_kzalloc(&client->dev, sizeof(*tsdata), GFP_KERNEL); in edt_ft5x06_ts_probe()
1085 if (!tsdata) { in edt_ft5x06_ts_probe()
1098 tsdata->max_support_points = chip_data->max_support_points; in edt_ft5x06_ts_probe()
1100 tsdata->vcc = devm_regulator_get(&client->dev, "vcc"); in edt_ft5x06_ts_probe()
1101 if (IS_ERR(tsdata->vcc)) { in edt_ft5x06_ts_probe()
1102 error = PTR_ERR(tsdata->vcc); in edt_ft5x06_ts_probe()
1109 error = regulator_enable(tsdata->vcc); in edt_ft5x06_ts_probe()
1117 tsdata); in edt_ft5x06_ts_probe()
1121 tsdata->reset_gpio = devm_gpiod_get_optional(&client->dev, in edt_ft5x06_ts_probe()
1123 if (IS_ERR(tsdata->reset_gpio)) { in edt_ft5x06_ts_probe()
1124 error = PTR_ERR(tsdata->reset_gpio); in edt_ft5x06_ts_probe()
1130 tsdata->wake_gpio = devm_gpiod_get_optional(&client->dev, in edt_ft5x06_ts_probe()
1132 if (IS_ERR(tsdata->wake_gpio)) { in edt_ft5x06_ts_probe()
1133 error = PTR_ERR(tsdata->wake_gpio); in edt_ft5x06_ts_probe()
1145 if (tsdata->reset_gpio) in edt_ft5x06_ts_probe()
1146 tsdata->suspend_mode = EDT_PMODE_POWEROFF; in edt_ft5x06_ts_probe()
1147 else if (tsdata->wake_gpio) in edt_ft5x06_ts_probe()
1148 tsdata->suspend_mode = EDT_PMODE_HIBERNATE; in edt_ft5x06_ts_probe()
1150 tsdata->suspend_mode = EDT_PMODE_NOT_SUPPORTED; in edt_ft5x06_ts_probe()
1152 if (tsdata->wake_gpio) { in edt_ft5x06_ts_probe()
1154 gpiod_set_value_cansleep(tsdata->wake_gpio, 1); in edt_ft5x06_ts_probe()
1157 if (tsdata->reset_gpio) { in edt_ft5x06_ts_probe()
1159 gpiod_set_value_cansleep(tsdata->reset_gpio, 0); in edt_ft5x06_ts_probe()
1169 mutex_init(&tsdata->mutex); in edt_ft5x06_ts_probe()
1170 tsdata->client = client; in edt_ft5x06_ts_probe()
1171 tsdata->input = input; in edt_ft5x06_ts_probe()
1172 tsdata->factory_mode = false; in edt_ft5x06_ts_probe()
1174 error = edt_ft5x06_ts_identify(client, tsdata, fw_version); in edt_ft5x06_ts_probe()
1184 edt_ft5x06_ts_readwrite(tsdata->client, 2, buf, 2, buf); in edt_ft5x06_ts_probe()
1186 edt_ft5x06_ts_set_regs(tsdata); in edt_ft5x06_ts_probe()
1187 edt_ft5x06_ts_get_defaults(&client->dev, tsdata); in edt_ft5x06_ts_probe()
1188 edt_ft5x06_ts_get_parameters(tsdata); in edt_ft5x06_ts_probe()
1192 tsdata->name, fw_version, tsdata->num_x, tsdata->num_y); in edt_ft5x06_ts_probe()
1194 input->name = tsdata->name; in edt_ft5x06_ts_probe()
1198 if (tsdata->version == EDT_M06 || in edt_ft5x06_ts_probe()
1199 tsdata->version == EDT_M09 || in edt_ft5x06_ts_probe()
1200 tsdata->version == EDT_M12) { in edt_ft5x06_ts_probe()
1202 0, tsdata->num_x * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
1204 0, tsdata->num_y * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
1213 touchscreen_parse_properties(input, true, &tsdata->prop); in edt_ft5x06_ts_probe()
1215 error = input_mt_init_slots(input, tsdata->max_support_points, in edt_ft5x06_ts_probe()
1222 i2c_set_clientdata(client, tsdata); in edt_ft5x06_ts_probe()
1231 client->name, tsdata); in edt_ft5x06_ts_probe()
1245 edt_ft5x06_ts_prepare_debugfs(tsdata, dev_driver_string(&client->dev)); in edt_ft5x06_ts_probe()
1250 tsdata->wake_gpio ? desc_to_gpio(tsdata->wake_gpio) : -1, in edt_ft5x06_ts_probe()
1251 tsdata->reset_gpio ? desc_to_gpio(tsdata->reset_gpio) : -1); in edt_ft5x06_ts_probe()
1258 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_ts_remove() local
1260 edt_ft5x06_ts_teardown_debugfs(tsdata); in edt_ft5x06_ts_remove()
1268 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_ts_suspend() local
1269 struct gpio_desc *reset_gpio = tsdata->reset_gpio; in edt_ft5x06_ts_suspend()
1275 if (tsdata->suspend_mode == EDT_PMODE_NOT_SUPPORTED) in edt_ft5x06_ts_suspend()
1279 ret = edt_ft5x06_register_write(tsdata, PMOD_REGISTER_OPMODE, in edt_ft5x06_ts_suspend()
1284 if (tsdata->suspend_mode == EDT_PMODE_HIBERNATE) in edt_ft5x06_ts_suspend()
1293 disable_irq(tsdata->client->irq); in edt_ft5x06_ts_suspend()
1298 ret = regulator_disable(tsdata->vcc); in edt_ft5x06_ts_suspend()
1308 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_ts_resume() local
1314 if (tsdata->suspend_mode == EDT_PMODE_NOT_SUPPORTED) in edt_ft5x06_ts_resume()
1317 if (tsdata->suspend_mode == EDT_PMODE_POWEROFF) { in edt_ft5x06_ts_resume()
1318 struct gpio_desc *reset_gpio = tsdata->reset_gpio; in edt_ft5x06_ts_resume()
1331 ret = regulator_enable(tsdata->vcc); in edt_ft5x06_ts_resume()
1341 edt_ft5x06_restore_reg_parameters(tsdata); in edt_ft5x06_ts_resume()
1342 enable_irq(tsdata->client->irq); in edt_ft5x06_ts_resume()
1344 if (tsdata->factory_mode) in edt_ft5x06_ts_resume()
1345 ret = edt_ft5x06_factory_mode(tsdata); in edt_ft5x06_ts_resume()
1347 struct gpio_desc *wake_gpio = tsdata->wake_gpio; in edt_ft5x06_ts_resume()