• Home
  • Raw
  • Download

Lines Matching +full:ev +full:- +full:ft5726

1 // SPDX-License-Identifier: GPL-2.0
5 * Lothar Waßmann <LW@KARO-electronics.de> (DT support)
144 wrmsg[i].addr = client->addr; in edt_ft5x06_ts_readwrite()
151 wrmsg[i].addr = client->addr; in edt_ft5x06_ts_readwrite()
158 ret = i2c_transfer(client->adapter, wrmsg, i); in edt_ft5x06_ts_readwrite()
162 return -EIO; in edt_ft5x06_ts_readwrite()
173 for (i = 0; i < buflen - 1; i++) in edt_ft5x06_ts_check_crc()
176 if (crc != buf[buflen-1]) { in edt_ft5x06_ts_check_crc()
177 dev_err_ratelimited(&tsdata->client->dev, in edt_ft5x06_ts_check_crc()
179 crc, buf[buflen-1]); in edt_ft5x06_ts_check_crc()
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()
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()
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()
303 return -EINVAL; in edt_ft5x06_register_write()
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()
329 return -EIO; in edt_ft5x06_register_read()
338 error = edt_ft5x06_ts_readwrite(tsdata->client, 1, in edt_ft5x06_register_read()
345 return -EINVAL; in edt_ft5x06_register_read()
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()
392 error = -EIO; in edt_ft5x06_setting_show()
396 switch (tsdata->version) { in edt_ft5x06_setting_show()
398 addr = attr->addr_m06; in edt_ft5x06_setting_show()
404 addr = attr->addr_m09; in edt_ft5x06_setting_show()
408 addr = attr->addr_ev; in edt_ft5x06_setting_show()
412 error = -ENODEV; in edt_ft5x06_setting_show()
420 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_show()
422 dattr->attr.name, error); in edt_ft5x06_setting_show()
430 dev_warn(&tsdata->client->dev, in edt_ft5x06_setting_show()
432 dattr->attr.name, val, *field); in edt_ft5x06_setting_show()
438 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_show()
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()
458 error = -EIO; in edt_ft5x06_setting_store()
466 if (val < attr->limit_low || val > attr->limit_high) { in edt_ft5x06_setting_store()
467 error = -ERANGE; in edt_ft5x06_setting_store()
471 switch (tsdata->version) { in edt_ft5x06_setting_store()
473 addr = attr->addr_m06; in edt_ft5x06_setting_store()
479 addr = attr->addr_m09; in edt_ft5x06_setting_store()
483 addr = attr->addr_ev; in edt_ft5x06_setting_store()
487 error = -ENODEV; in edt_ft5x06_setting_store()
494 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_store()
496 dattr->attr.name, error); in edt_ft5x06_setting_store()
503 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_store()
507 /* m06, m09: range 0-31, m12: range 0-5 */
510 /* m06, m09: range 0-31, m12: range 0-16 */
513 /* m06, m09, m12: no supported, ev_ft: range 0-80 */
516 /* m06, m09, m12: no supported, ev_ft: range 0-80 */
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()
548 if (reg_addr->reg_offset != NO_REGISTER) 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()
551 if (reg_addr->reg_offset_x != NO_REGISTER) 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()
554 if (reg_addr->reg_offset_y != NO_REGISTER) 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()
557 if (reg_addr->reg_report_rate != NO_REGISTER) 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()
566 struct i2c_client *client = tsdata->client; in edt_ft5x06_factory_mode()
571 if (tsdata->version != EDT_M06) { in edt_ft5x06_factory_mode()
572 dev_err(&client->dev, in edt_ft5x06_factory_mode()
573 "No factory mode support for non-M06 devices\n"); in edt_ft5x06_factory_mode()
574 return -EINVAL; in edt_ft5x06_factory_mode()
577 disable_irq(client->irq); 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()
584 error = -ENOMEM; in edt_ft5x06_factory_mode()
592 dev_err(&client->dev, in edt_ft5x06_factory_mode()
597 tsdata->factory_mode = true; in edt_ft5x06_factory_mode()
604 } while (--retries > 0); in edt_ft5x06_factory_mode()
607 dev_err(&client->dev, "not in factory mode after %dms.\n", in edt_ft5x06_factory_mode()
609 error = -EIO; 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()
619 enable_irq(client->irq); in edt_ft5x06_factory_mode()
626 struct i2c_client *client = tsdata->client; in edt_ft5x06_work_mode()
634 dev_err(&client->dev, in edt_ft5x06_work_mode()
639 tsdata->factory_mode = false; in edt_ft5x06_work_mode()
647 } while (--retries > 0); in edt_ft5x06_work_mode()
650 dev_err(&client->dev, "not in work mode after %dms.\n", in edt_ft5x06_work_mode()
652 tsdata->factory_mode = true; in edt_ft5x06_work_mode()
653 return -EIO; 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()
660 enable_irq(client->irq); in edt_ft5x06_work_mode()
669 *mode = tsdata->factory_mode; in edt_ft5x06_debugfs_mode_get()
680 return -ERANGE; in edt_ft5x06_debugfs_mode_set()
682 mutex_lock(&tsdata->mutex); in edt_ft5x06_debugfs_mode_set()
684 if (mode != tsdata->factory_mode) { 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()
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()
715 error = -EIO; in edt_ft5x06_debugfs_raw_data_read()
721 dev_dbg(&client->dev, in edt_ft5x06_debugfs_raw_data_read()
731 } while (--retries > 0); in edt_ft5x06_debugfs_raw_data_read()
735 dev_dbg(&client->dev, in edt_ft5x06_debugfs_raw_data_read()
741 dev_dbg(&client->dev, in edt_ft5x06_debugfs_raw_data_read()
743 error = -ETIMEDOUT; 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()
765 error = -EFAULT; in edt_ft5x06_debugfs_raw_data_read()
771 mutex_unlock(&tsdata->mutex); in edt_ft5x06_debugfs_raw_data_read()
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()
796 debugfs_remove_recursive(tsdata->debug_dir); in edt_ft5x06_ts_teardown_debugfs()
797 kfree(tsdata->raw_buffer); in edt_ft5x06_ts_teardown_debugfs()
804 return -ENOSYS; in edt_ft5x06_factory_mode()
825 char *model_name = tsdata->name; in edt_ft5x06_ts_identify()
833 EDT_NAME_LEN - 1, rdbuf); in edt_ft5x06_ts_identify()
842 tsdata->version = EDT_M06; in edt_ft5x06_ts_identify()
845 rdbuf[EDT_NAME_LEN - 1] = '\0'; in edt_ft5x06_ts_identify()
846 if (rdbuf[EDT_NAME_LEN - 2] == '$') in edt_ft5x06_ts_identify()
847 rdbuf[EDT_NAME_LEN - 2] = '\0'; in edt_ft5x06_ts_identify()
856 tsdata->version = EDT_M12; in edt_ft5x06_ts_identify()
859 rdbuf[EDT_NAME_LEN - 2] = '\0'; in edt_ft5x06_ts_identify()
860 if (rdbuf[EDT_NAME_LEN - 3] == '$') in edt_ft5x06_ts_identify()
861 rdbuf[EDT_NAME_LEN - 3] = '\0'; 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()
923 "EVERVISION-FT5726NEi"); in edt_ft5x06_ts_identify()
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()
957 if (reg_addr->reg_offset != NO_REGISTER) in edt_ft5x06_ts_get_defaults()
959 reg_addr->reg_offset, val); in edt_ft5x06_ts_get_defaults()
960 tsdata->offset = val; in edt_ft5x06_ts_get_defaults()
963 error = device_property_read_u32(dev, "offset-x", &val); in edt_ft5x06_ts_get_defaults()
965 if (reg_addr->reg_offset_x != NO_REGISTER) in edt_ft5x06_ts_get_defaults()
967 reg_addr->reg_offset_x, val); in edt_ft5x06_ts_get_defaults()
968 tsdata->offset_x = val; in edt_ft5x06_ts_get_defaults()
971 error = device_property_read_u32(dev, "offset-y", &val); in edt_ft5x06_ts_get_defaults()
973 if (reg_addr->reg_offset_y != NO_REGISTER) in edt_ft5x06_ts_get_defaults()
975 reg_addr->reg_offset_y, val); in edt_ft5x06_ts_get_defaults()
976 tsdata->offset_y = val; in edt_ft5x06_ts_get_defaults()
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()
986 reg_addr->reg_threshold); in edt_ft5x06_ts_get_parameters()
987 tsdata->gain = edt_ft5x06_register_read(tsdata, reg_addr->reg_gain); in edt_ft5x06_ts_get_parameters()
988 if (reg_addr->reg_offset != NO_REGISTER) 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()
991 if (reg_addr->reg_offset_x != NO_REGISTER) in edt_ft5x06_ts_get_parameters()
992 tsdata->offset_x = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
993 reg_addr->reg_offset_x); in edt_ft5x06_ts_get_parameters()
994 if (reg_addr->reg_offset_y != NO_REGISTER) in edt_ft5x06_ts_get_parameters()
995 tsdata->offset_y = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
996 reg_addr->reg_offset_y); in edt_ft5x06_ts_get_parameters()
997 if (reg_addr->reg_report_rate != NO_REGISTER) in edt_ft5x06_ts_get_parameters()
998 tsdata->report_rate = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
999 reg_addr->reg_report_rate); 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()
1004 reg_addr->reg_num_x); in edt_ft5x06_ts_get_parameters()
1005 tsdata->num_y = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
1006 reg_addr->reg_num_y); 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()
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()
1020 reg_addr->reg_threshold = WORK_REGISTER_THRESHOLD; in edt_ft5x06_ts_set_regs()
1021 reg_addr->reg_report_rate = WORK_REGISTER_REPORT_RATE; in edt_ft5x06_ts_set_regs()
1022 reg_addr->reg_gain = WORK_REGISTER_GAIN; in edt_ft5x06_ts_set_regs()
1023 reg_addr->reg_offset = WORK_REGISTER_OFFSET; in edt_ft5x06_ts_set_regs()
1024 reg_addr->reg_offset_x = NO_REGISTER; in edt_ft5x06_ts_set_regs()
1025 reg_addr->reg_offset_y = NO_REGISTER; in edt_ft5x06_ts_set_regs()
1026 reg_addr->reg_num_x = WORK_REGISTER_NUM_X; in edt_ft5x06_ts_set_regs()
1027 reg_addr->reg_num_y = WORK_REGISTER_NUM_Y; in edt_ft5x06_ts_set_regs()
1032 reg_addr->reg_threshold = M09_REGISTER_THRESHOLD; in edt_ft5x06_ts_set_regs()
1033 reg_addr->reg_report_rate = NO_REGISTER; in edt_ft5x06_ts_set_regs()
1034 reg_addr->reg_gain = M09_REGISTER_GAIN; in edt_ft5x06_ts_set_regs()
1035 reg_addr->reg_offset = M09_REGISTER_OFFSET; in edt_ft5x06_ts_set_regs()
1036 reg_addr->reg_offset_x = NO_REGISTER; in edt_ft5x06_ts_set_regs()
1037 reg_addr->reg_offset_y = NO_REGISTER; in edt_ft5x06_ts_set_regs()
1038 reg_addr->reg_num_x = M09_REGISTER_NUM_X; in edt_ft5x06_ts_set_regs()
1039 reg_addr->reg_num_y = M09_REGISTER_NUM_Y; in edt_ft5x06_ts_set_regs()
1043 reg_addr->reg_threshold = EV_REGISTER_THRESHOLD; in edt_ft5x06_ts_set_regs()
1044 reg_addr->reg_gain = EV_REGISTER_GAIN; in edt_ft5x06_ts_set_regs()
1045 reg_addr->reg_offset = NO_REGISTER; in edt_ft5x06_ts_set_regs()
1046 reg_addr->reg_offset_x = EV_REGISTER_OFFSET_X; in edt_ft5x06_ts_set_regs()
1047 reg_addr->reg_offset_y = EV_REGISTER_OFFSET_Y; in edt_ft5x06_ts_set_regs()
1048 reg_addr->reg_num_x = NO_REGISTER; in edt_ft5x06_ts_set_regs()
1049 reg_addr->reg_num_y = NO_REGISTER; in edt_ft5x06_ts_set_regs()
1050 reg_addr->reg_report_rate = NO_REGISTER; in edt_ft5x06_ts_set_regs()
1055 reg_addr->reg_threshold = M09_REGISTER_THRESHOLD; in edt_ft5x06_ts_set_regs()
1056 reg_addr->reg_gain = M09_REGISTER_GAIN; in edt_ft5x06_ts_set_regs()
1057 reg_addr->reg_offset = M09_REGISTER_OFFSET; in edt_ft5x06_ts_set_regs()
1058 reg_addr->reg_offset_x = NO_REGISTER; in edt_ft5x06_ts_set_regs()
1059 reg_addr->reg_offset_y = NO_REGISTER; in edt_ft5x06_ts_set_regs()
1068 regulator_disable(data->vcc); in edt_ft5x06_disable_regulator()
1082 dev_dbg(&client->dev, "probing for EDT FT5x06 I2C\n"); in edt_ft5x06_ts_probe()
1084 tsdata = devm_kzalloc(&client->dev, sizeof(*tsdata), GFP_KERNEL); in edt_ft5x06_ts_probe()
1086 dev_err(&client->dev, "failed to allocate driver data.\n"); in edt_ft5x06_ts_probe()
1087 return -ENOMEM; in edt_ft5x06_ts_probe()
1090 chip_data = device_get_match_data(&client->dev); in edt_ft5x06_ts_probe()
1092 chip_data = (const struct edt_i2c_chip_data *)id->driver_data; in edt_ft5x06_ts_probe()
1093 if (!chip_data || !chip_data->max_support_points) { in edt_ft5x06_ts_probe()
1094 dev_err(&client->dev, "invalid or missing chip data\n"); in edt_ft5x06_ts_probe()
1095 return -EINVAL; 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()
1103 if (error != -EPROBE_DEFER) in edt_ft5x06_ts_probe()
1104 dev_err(&client->dev, in edt_ft5x06_ts_probe()
1109 error = regulator_enable(tsdata->vcc); in edt_ft5x06_ts_probe()
1111 dev_err(&client->dev, "failed to enable vcc: %d\n", error); in edt_ft5x06_ts_probe()
1115 error = devm_add_action_or_reset(&client->dev, 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()
1125 dev_err(&client->dev, 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()
1134 dev_err(&client->dev, in edt_ft5x06_ts_probe()
1140 * Check which sleep modes we can support. Power-off requieres the in edt_ft5x06_ts_probe()
1141 * reset-pin to ensure correct power-down/power-up behaviour. Start with 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()
1163 input = devm_input_allocate_device(&client->dev); in edt_ft5x06_ts_probe()
1165 dev_err(&client->dev, "failed to allocate input device.\n"); in edt_ft5x06_ts_probe()
1166 return -ENOMEM; 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()
1176 dev_err(&client->dev, "touchscreen probe failed\n"); in edt_ft5x06_ts_probe()
1184 edt_ft5x06_ts_readwrite(tsdata->client, 2, buf, 2, buf); in edt_ft5x06_ts_probe()
1187 edt_ft5x06_ts_get_defaults(&client->dev, tsdata); in edt_ft5x06_ts_probe()
1190 dev_dbg(&client->dev, 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()
1195 input->id.bustype = BUS_I2C; in edt_ft5x06_ts_probe()
1196 input->dev.parent = &client->dev; 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()
1218 dev_err(&client->dev, "Unable to init MT slots.\n"); in edt_ft5x06_ts_probe()
1224 irq_flags = irq_get_trigger_type(client->irq); in edt_ft5x06_ts_probe()
1229 error = devm_request_threaded_irq(&client->dev, client->irq, in edt_ft5x06_ts_probe()
1231 client->name, tsdata); in edt_ft5x06_ts_probe()
1233 dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); in edt_ft5x06_ts_probe()
1237 error = devm_device_add_group(&client->dev, &edt_ft5x06_attr_group); in edt_ft5x06_ts_probe()
1245 edt_ft5x06_ts_prepare_debugfs(tsdata, dev_driver_string(&client->dev)); in edt_ft5x06_ts_probe()
1247 dev_dbg(&client->dev, in edt_ft5x06_ts_probe()
1249 client->irq, 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()
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()
1284 if (tsdata->suspend_mode == EDT_PMODE_HIBERNATE) in edt_ft5x06_ts_suspend()
1288 * Power-off according the datasheet. Cut the power may leaf the irq 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()
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()
1342 enable_irq(tsdata->client->irq); in edt_ft5x06_ts_resume()
1344 if (tsdata->factory_mode) in edt_ft5x06_ts_resume()
1347 struct gpio_desc *wake_gpio = tsdata->wake_gpio; in edt_ft5x06_ts_resume()
1374 { .name = "edt-ft5x06", .driver_data = (long)&edt_ft5x06_data },
1375 { .name = "edt-ft5506", .driver_data = (long)&edt_ft5506_data },
1376 { .name = "ev-ft5726", .driver_data = (long)&edt_ft5506_data },
1377 /* Note no edt- prefix for compatibility with the ft6236.c driver */
1384 { .compatible = "edt,edt-ft5206", .data = &edt_ft5x06_data },
1385 { .compatible = "edt,edt-ft5306", .data = &edt_ft5x06_data },
1386 { .compatible = "edt,edt-ft5406", .data = &edt_ft5x06_data },
1387 { .compatible = "edt,edt-ft5506", .data = &edt_ft5506_data },
1388 { .compatible = "evervision,ev-ft5726", .data = &edt_ft5506_data },