Lines Matching refs:tsdata

171 static bool edt_ft5x06_ts_check_crc(struct edt_ft5x06_ts_data *tsdata,  in edt_ft5x06_ts_check_crc()  argument
181 dev_err_ratelimited(&tsdata->client->dev, in edt_ft5x06_ts_check_crc()
192 struct edt_ft5x06_ts_data *tsdata = dev_id; in edt_ft5x06_ts_isr() local
193 struct device *dev = &tsdata->client->dev; in edt_ft5x06_ts_isr()
200 switch (tsdata->version) { in edt_ft5x06_ts_isr()
223 datalen = tplen * tsdata->max_support_points + offset + crclen; in edt_ft5x06_ts_isr()
225 error = edt_ft5x06_ts_readwrite(tsdata->client, in edt_ft5x06_ts_isr()
235 if (tsdata->version == EDT_M06) { in edt_ft5x06_ts_isr()
244 if (!edt_ft5x06_ts_check_crc(tsdata, rdbuf, datalen)) in edt_ft5x06_ts_isr()
248 for (i = 0; i < tsdata->max_support_points; i++) { in edt_ft5x06_ts_isr()
257 if (tsdata->version == EDT_M06 && type == TOUCH_EVENT_DOWN) in edt_ft5x06_ts_isr()
263 if (tsdata->version == EV_FT) in edt_ft5x06_ts_isr()
268 input_mt_slot(tsdata->input, id); in edt_ft5x06_ts_isr()
269 if (input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, in edt_ft5x06_ts_isr()
271 touchscreen_report_pos(tsdata->input, &tsdata->prop, in edt_ft5x06_ts_isr()
275 input_mt_report_pointer_emulation(tsdata->input, true); in edt_ft5x06_ts_isr()
276 input_sync(tsdata->input); in edt_ft5x06_ts_isr()
282 static int edt_ft5x06_register_write(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_register_write() argument
287 switch (tsdata->version) { in edt_ft5x06_register_write()
289 wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; in edt_ft5x06_register_write()
290 wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; in edt_ft5x06_register_write()
293 return edt_ft5x06_ts_readwrite(tsdata->client, 4, in edt_ft5x06_register_write()
303 return edt_ft5x06_ts_readwrite(tsdata->client, 2, in edt_ft5x06_register_write()
311 static int edt_ft5x06_register_read(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_register_read() argument
317 switch (tsdata->version) { in edt_ft5x06_register_read()
319 wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; in edt_ft5x06_register_read()
320 wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; in edt_ft5x06_register_read()
321 wrbuf[1] |= tsdata->factory_mode ? 0x80 : 0x40; in edt_ft5x06_register_read()
323 error = edt_ft5x06_ts_readwrite(tsdata->client, 2, wrbuf, 2, in edt_ft5x06_register_read()
329 dev_err(&tsdata->client->dev, in edt_ft5x06_register_read()
342 error = edt_ft5x06_ts_readwrite(tsdata->client, 1, in edt_ft5x06_register_read()
384 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_setting_show() local
387 u8 *field = (u8 *)tsdata + attr->field_offset; in edt_ft5x06_setting_show()
393 mutex_lock(&tsdata->mutex); in edt_ft5x06_setting_show()
395 if (tsdata->factory_mode) { in edt_ft5x06_setting_show()
400 switch (tsdata->version) { in edt_ft5x06_setting_show()
421 val = edt_ft5x06_register_read(tsdata, addr); in edt_ft5x06_setting_show()
424 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_show()
434 dev_warn(&tsdata->client->dev, in edt_ft5x06_setting_show()
442 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_show()
451 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_setting_store() local
454 u8 *field = (u8 *)tsdata + attr->field_offset; in edt_ft5x06_setting_store()
459 mutex_lock(&tsdata->mutex); in edt_ft5x06_setting_store()
461 if (tsdata->factory_mode) { in edt_ft5x06_setting_store()
475 switch (tsdata->version) { in edt_ft5x06_setting_store()
496 error = edt_ft5x06_register_write(tsdata, addr, val); in edt_ft5x06_setting_store()
498 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_store()
507 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_store()
544 static void edt_ft5x06_restore_reg_parameters(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_restore_reg_parameters() argument
546 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_restore_reg_parameters()
548 edt_ft5x06_register_write(tsdata, reg_addr->reg_threshold, in edt_ft5x06_restore_reg_parameters()
549 tsdata->threshold); in edt_ft5x06_restore_reg_parameters()
550 edt_ft5x06_register_write(tsdata, reg_addr->reg_gain, in edt_ft5x06_restore_reg_parameters()
551 tsdata->gain); in edt_ft5x06_restore_reg_parameters()
553 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, in edt_ft5x06_restore_reg_parameters()
554 tsdata->offset); in edt_ft5x06_restore_reg_parameters()
556 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_x, in edt_ft5x06_restore_reg_parameters()
557 tsdata->offset_x); in edt_ft5x06_restore_reg_parameters()
559 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_y, in edt_ft5x06_restore_reg_parameters()
560 tsdata->offset_y); in edt_ft5x06_restore_reg_parameters()
562 edt_ft5x06_register_write(tsdata, reg_addr->reg_report_rate, in edt_ft5x06_restore_reg_parameters()
563 tsdata->report_rate); in edt_ft5x06_restore_reg_parameters()
568 static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_factory_mode() argument
570 struct i2c_client *client = tsdata->client; in edt_ft5x06_factory_mode()
575 if (tsdata->version != EDT_M06) { in edt_ft5x06_factory_mode()
583 if (!tsdata->raw_buffer) { in edt_ft5x06_factory_mode()
584 tsdata->raw_bufsize = tsdata->num_x * tsdata->num_y * in edt_ft5x06_factory_mode()
586 tsdata->raw_buffer = kzalloc(tsdata->raw_bufsize, GFP_KERNEL); in edt_ft5x06_factory_mode()
587 if (!tsdata->raw_buffer) { in edt_ft5x06_factory_mode()
594 error = edt_ft5x06_register_write(tsdata, WORK_REGISTER_OPMODE, 0x03); in edt_ft5x06_factory_mode()
601 tsdata->factory_mode = true; in edt_ft5x06_factory_mode()
605 ret = edt_ft5x06_register_read(tsdata, FACTORY_REGISTER_OPMODE); in edt_ft5x06_factory_mode()
620 kfree(tsdata->raw_buffer); in edt_ft5x06_factory_mode()
621 tsdata->raw_buffer = NULL; in edt_ft5x06_factory_mode()
622 tsdata->factory_mode = false; in edt_ft5x06_factory_mode()
628 static int edt_ft5x06_work_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_work_mode() argument
630 struct i2c_client *client = tsdata->client; in edt_ft5x06_work_mode()
636 error = edt_ft5x06_register_write(tsdata, FACTORY_REGISTER_OPMODE, 0x1); in edt_ft5x06_work_mode()
643 tsdata->factory_mode = false; in edt_ft5x06_work_mode()
648 ret = edt_ft5x06_register_read(tsdata, WORK_REGISTER_OPMODE); in edt_ft5x06_work_mode()
656 tsdata->factory_mode = true; in edt_ft5x06_work_mode()
660 kfree(tsdata->raw_buffer); in edt_ft5x06_work_mode()
661 tsdata->raw_buffer = NULL; in edt_ft5x06_work_mode()
663 edt_ft5x06_restore_reg_parameters(tsdata); in edt_ft5x06_work_mode()
671 struct edt_ft5x06_ts_data *tsdata = data; in edt_ft5x06_debugfs_mode_get() local
673 *mode = tsdata->factory_mode; in edt_ft5x06_debugfs_mode_get()
680 struct edt_ft5x06_ts_data *tsdata = data; in edt_ft5x06_debugfs_mode_set() local
686 mutex_lock(&tsdata->mutex); in edt_ft5x06_debugfs_mode_set()
688 if (mode != tsdata->factory_mode) { in edt_ft5x06_debugfs_mode_set()
689 retval = mode ? edt_ft5x06_factory_mode(tsdata) : in edt_ft5x06_debugfs_mode_set()
690 edt_ft5x06_work_mode(tsdata); in edt_ft5x06_debugfs_mode_set()
693 mutex_unlock(&tsdata->mutex); in edt_ft5x06_debugfs_mode_set()
704 struct edt_ft5x06_ts_data *tsdata = file->private_data; in edt_ft5x06_debugfs_raw_data_read() local
705 struct i2c_client *client = tsdata->client; in edt_ft5x06_debugfs_raw_data_read()
713 if (*off < 0 || *off >= tsdata->raw_bufsize) in edt_ft5x06_debugfs_raw_data_read()
716 mutex_lock(&tsdata->mutex); in edt_ft5x06_debugfs_raw_data_read()
718 if (!tsdata->factory_mode || !tsdata->raw_buffer) { in edt_ft5x06_debugfs_raw_data_read()
723 error = edt_ft5x06_register_write(tsdata, 0x08, 0x01); in edt_ft5x06_debugfs_raw_data_read()
732 val = edt_ft5x06_register_read(tsdata, 0x08); in edt_ft5x06_debugfs_raw_data_read()
751 rdbuf = tsdata->raw_buffer; in edt_ft5x06_debugfs_raw_data_read()
752 colbytes = tsdata->num_y * sizeof(u16); in edt_ft5x06_debugfs_raw_data_read()
756 for (i = 0; i < tsdata->num_x; i++) { in edt_ft5x06_debugfs_raw_data_read()
758 error = edt_ft5x06_ts_readwrite(tsdata->client, in edt_ft5x06_debugfs_raw_data_read()
767 read = min_t(size_t, count, tsdata->raw_bufsize - *off); in edt_ft5x06_debugfs_raw_data_read()
768 if (copy_to_user(buf, tsdata->raw_buffer + *off, read)) { in edt_ft5x06_debugfs_raw_data_read()
775 mutex_unlock(&tsdata->mutex); in edt_ft5x06_debugfs_raw_data_read()
784 static void edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_prepare_debugfs() argument
787 tsdata->debug_dir = debugfs_create_dir(debugfs_name, NULL); in edt_ft5x06_ts_prepare_debugfs()
789 debugfs_create_u16("num_x", S_IRUSR, tsdata->debug_dir, &tsdata->num_x); in edt_ft5x06_ts_prepare_debugfs()
790 debugfs_create_u16("num_y", S_IRUSR, tsdata->debug_dir, &tsdata->num_y); in edt_ft5x06_ts_prepare_debugfs()
793 tsdata->debug_dir, tsdata, &debugfs_mode_fops); in edt_ft5x06_ts_prepare_debugfs()
795 tsdata->debug_dir, tsdata, &debugfs_raw_data_fops); in edt_ft5x06_ts_prepare_debugfs()
798 static void edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_teardown_debugfs() argument
800 debugfs_remove_recursive(tsdata->debug_dir); in edt_ft5x06_ts_teardown_debugfs()
801 kfree(tsdata->raw_buffer); in edt_ft5x06_ts_teardown_debugfs()
806 static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_factory_mode() argument
811 static void edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_prepare_debugfs() argument
816 static void edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_teardown_debugfs() argument
823 struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_identify() argument
829 char *model_name = tsdata->name; in edt_ft5x06_ts_identify()
846 tsdata->version = EDT_M06; in edt_ft5x06_ts_identify()
860 tsdata->version = EDT_M12; in edt_ft5x06_ts_identify()
883 tsdata->version = GENERIC_FT; in edt_ft5x06_ts_identify()
908 tsdata->version = EDT_M09; in edt_ft5x06_ts_identify()
913 tsdata->version = EDT_M09; in edt_ft5x06_ts_identify()
921 tsdata->version = EV_FT; in edt_ft5x06_ts_identify()
942 struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_get_defaults() argument
944 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_get_defaults()
950 edt_ft5x06_register_write(tsdata, reg_addr->reg_threshold, val); in edt_ft5x06_ts_get_defaults()
951 tsdata->threshold = val; in edt_ft5x06_ts_get_defaults()
956 edt_ft5x06_register_write(tsdata, reg_addr->reg_gain, val); in edt_ft5x06_ts_get_defaults()
957 tsdata->gain = val; in edt_ft5x06_ts_get_defaults()
963 edt_ft5x06_register_write(tsdata, in edt_ft5x06_ts_get_defaults()
965 tsdata->offset = val; in edt_ft5x06_ts_get_defaults()
971 edt_ft5x06_register_write(tsdata, in edt_ft5x06_ts_get_defaults()
973 tsdata->offset_x = val; in edt_ft5x06_ts_get_defaults()
979 edt_ft5x06_register_write(tsdata, in edt_ft5x06_ts_get_defaults()
981 tsdata->offset_y = val; in edt_ft5x06_ts_get_defaults()
985 static void edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_get_parameters() argument
987 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_get_parameters()
989 tsdata->threshold = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
991 tsdata->gain = edt_ft5x06_register_read(tsdata, reg_addr->reg_gain); in edt_ft5x06_ts_get_parameters()
993 tsdata->offset = in edt_ft5x06_ts_get_parameters()
994 edt_ft5x06_register_read(tsdata, reg_addr->reg_offset); in edt_ft5x06_ts_get_parameters()
996 tsdata->offset_x = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
999 tsdata->offset_y = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
1002 tsdata->report_rate = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
1004 tsdata->num_x = EDT_DEFAULT_NUM_X; in edt_ft5x06_ts_get_parameters()
1006 tsdata->num_x = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
1008 tsdata->num_y = EDT_DEFAULT_NUM_Y; in edt_ft5x06_ts_get_parameters()
1010 tsdata->num_y = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
1014 static void 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()
1079 struct edt_ft5x06_ts_data *tsdata; in edt_ft5x06_ts_probe() local
1088 tsdata = devm_kzalloc(&client->dev, sizeof(*tsdata), GFP_KERNEL); in edt_ft5x06_ts_probe()
1089 if (!tsdata) { in edt_ft5x06_ts_probe()
1102 tsdata->max_support_points = chip_data->max_support_points; in edt_ft5x06_ts_probe()
1104 tsdata->vcc = devm_regulator_get(&client->dev, "vcc"); in edt_ft5x06_ts_probe()
1105 if (IS_ERR(tsdata->vcc)) { in edt_ft5x06_ts_probe()
1106 error = PTR_ERR(tsdata->vcc); in edt_ft5x06_ts_probe()
1113 tsdata->iovcc = devm_regulator_get(&client->dev, "iovcc"); in edt_ft5x06_ts_probe()
1114 if (IS_ERR(tsdata->iovcc)) { in edt_ft5x06_ts_probe()
1115 error = PTR_ERR(tsdata->iovcc); in edt_ft5x06_ts_probe()
1122 error = regulator_enable(tsdata->iovcc); in edt_ft5x06_ts_probe()
1131 error = regulator_enable(tsdata->vcc); in edt_ft5x06_ts_probe()
1134 regulator_disable(tsdata->iovcc); in edt_ft5x06_ts_probe()
1140 tsdata); in edt_ft5x06_ts_probe()
1144 tsdata->reset_gpio = devm_gpiod_get_optional(&client->dev, in edt_ft5x06_ts_probe()
1146 if (IS_ERR(tsdata->reset_gpio)) { in edt_ft5x06_ts_probe()
1147 error = PTR_ERR(tsdata->reset_gpio); in edt_ft5x06_ts_probe()
1153 tsdata->wake_gpio = devm_gpiod_get_optional(&client->dev, in edt_ft5x06_ts_probe()
1155 if (IS_ERR(tsdata->wake_gpio)) { in edt_ft5x06_ts_probe()
1156 error = PTR_ERR(tsdata->wake_gpio); in edt_ft5x06_ts_probe()
1168 if (tsdata->reset_gpio) in edt_ft5x06_ts_probe()
1169 tsdata->suspend_mode = EDT_PMODE_POWEROFF; in edt_ft5x06_ts_probe()
1170 else if (tsdata->wake_gpio) in edt_ft5x06_ts_probe()
1171 tsdata->suspend_mode = EDT_PMODE_HIBERNATE; in edt_ft5x06_ts_probe()
1173 tsdata->suspend_mode = EDT_PMODE_NOT_SUPPORTED; in edt_ft5x06_ts_probe()
1175 if (tsdata->wake_gpio) { in edt_ft5x06_ts_probe()
1177 gpiod_set_value_cansleep(tsdata->wake_gpio, 1); in edt_ft5x06_ts_probe()
1180 if (tsdata->reset_gpio) { in edt_ft5x06_ts_probe()
1182 gpiod_set_value_cansleep(tsdata->reset_gpio, 0); in edt_ft5x06_ts_probe()
1192 mutex_init(&tsdata->mutex); in edt_ft5x06_ts_probe()
1193 tsdata->client = client; in edt_ft5x06_ts_probe()
1194 tsdata->input = input; in edt_ft5x06_ts_probe()
1195 tsdata->factory_mode = false; in edt_ft5x06_ts_probe()
1197 error = edt_ft5x06_ts_identify(client, tsdata, fw_version); in edt_ft5x06_ts_probe()
1207 edt_ft5x06_ts_readwrite(tsdata->client, 2, buf, 2, buf); in edt_ft5x06_ts_probe()
1209 edt_ft5x06_ts_set_regs(tsdata); in edt_ft5x06_ts_probe()
1210 edt_ft5x06_ts_get_defaults(&client->dev, tsdata); in edt_ft5x06_ts_probe()
1211 edt_ft5x06_ts_get_parameters(tsdata); in edt_ft5x06_ts_probe()
1215 tsdata->name, fw_version, tsdata->num_x, tsdata->num_y); in edt_ft5x06_ts_probe()
1217 input->name = tsdata->name; in edt_ft5x06_ts_probe()
1222 0, tsdata->num_x * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
1224 0, tsdata->num_y * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
1226 touchscreen_parse_properties(input, true, &tsdata->prop); in edt_ft5x06_ts_probe()
1228 error = input_mt_init_slots(input, tsdata->max_support_points, in edt_ft5x06_ts_probe()
1235 i2c_set_clientdata(client, tsdata); in edt_ft5x06_ts_probe()
1244 client->name, tsdata); in edt_ft5x06_ts_probe()
1258 edt_ft5x06_ts_prepare_debugfs(tsdata, dev_driver_string(&client->dev)); in edt_ft5x06_ts_probe()
1263 tsdata->wake_gpio ? desc_to_gpio(tsdata->wake_gpio) : -1, in edt_ft5x06_ts_probe()
1264 tsdata->reset_gpio ? desc_to_gpio(tsdata->reset_gpio) : -1); in edt_ft5x06_ts_probe()
1271 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_ts_remove() local
1273 edt_ft5x06_ts_teardown_debugfs(tsdata); in edt_ft5x06_ts_remove()
1281 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_ts_suspend() local
1282 struct gpio_desc *reset_gpio = tsdata->reset_gpio; in edt_ft5x06_ts_suspend()
1288 if (tsdata->suspend_mode == EDT_PMODE_NOT_SUPPORTED) in edt_ft5x06_ts_suspend()
1292 ret = edt_ft5x06_register_write(tsdata, PMOD_REGISTER_OPMODE, in edt_ft5x06_ts_suspend()
1297 if (tsdata->suspend_mode == EDT_PMODE_HIBERNATE) in edt_ft5x06_ts_suspend()
1306 disable_irq(tsdata->client->irq); in edt_ft5x06_ts_suspend()
1311 ret = regulator_disable(tsdata->vcc); in edt_ft5x06_ts_suspend()
1314 ret = regulator_disable(tsdata->iovcc); in edt_ft5x06_ts_suspend()
1324 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_ts_resume() local
1330 if (tsdata->suspend_mode == EDT_PMODE_NOT_SUPPORTED) in edt_ft5x06_ts_resume()
1333 if (tsdata->suspend_mode == EDT_PMODE_POWEROFF) { in edt_ft5x06_ts_resume()
1334 struct gpio_desc *reset_gpio = tsdata->reset_gpio; in edt_ft5x06_ts_resume()
1347 ret = regulator_enable(tsdata->iovcc); in edt_ft5x06_ts_resume()
1356 ret = regulator_enable(tsdata->vcc); in edt_ft5x06_ts_resume()
1359 regulator_disable(tsdata->iovcc); in edt_ft5x06_ts_resume()
1367 edt_ft5x06_restore_reg_parameters(tsdata); in edt_ft5x06_ts_resume()
1368 enable_irq(tsdata->client->irq); in edt_ft5x06_ts_resume()
1370 if (tsdata->factory_mode) in edt_ft5x06_ts_resume()
1371 ret = edt_ft5x06_factory_mode(tsdata); in edt_ft5x06_ts_resume()
1373 struct gpio_desc *wake_gpio = tsdata->wake_gpio; in edt_ft5x06_ts_resume()