Lines Matching refs:tsdata
149 static bool edt_ft5x06_ts_check_crc(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_check_crc() argument
159 dev_err_ratelimited(&tsdata->client->dev, in edt_ft5x06_ts_check_crc()
170 struct edt_ft5x06_ts_data *tsdata = dev_id; in edt_ft5x06_ts_isr() local
171 struct device *dev = &tsdata->client->dev; in edt_ft5x06_ts_isr()
178 switch (tsdata->version) { in edt_ft5x06_ts_isr()
199 error = edt_ft5x06_ts_readwrite(tsdata->client, in edt_ft5x06_ts_isr()
209 if (tsdata->version == M06) { in edt_ft5x06_ts_isr()
218 if (!edt_ft5x06_ts_check_crc(tsdata, rdbuf, datalen)) in edt_ft5x06_ts_isr()
232 if (tsdata->version == M06 && type == TOUCH_EVENT_DOWN) in edt_ft5x06_ts_isr()
240 input_mt_slot(tsdata->input, id); in edt_ft5x06_ts_isr()
241 input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, down); in edt_ft5x06_ts_isr()
246 input_report_abs(tsdata->input, ABS_MT_POSITION_X, x); in edt_ft5x06_ts_isr()
247 input_report_abs(tsdata->input, ABS_MT_POSITION_Y, y); in edt_ft5x06_ts_isr()
250 input_mt_report_pointer_emulation(tsdata->input, true); in edt_ft5x06_ts_isr()
251 input_sync(tsdata->input); in edt_ft5x06_ts_isr()
257 static int edt_ft5x06_register_write(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_register_write() argument
262 switch (tsdata->version) { in edt_ft5x06_register_write()
264 wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; in edt_ft5x06_register_write()
265 wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; in edt_ft5x06_register_write()
268 return edt_ft5x06_ts_readwrite(tsdata->client, 4, in edt_ft5x06_register_write()
274 return edt_ft5x06_ts_readwrite(tsdata->client, 2, in edt_ft5x06_register_write()
282 static int edt_ft5x06_register_read(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_register_read() argument
288 switch (tsdata->version) { in edt_ft5x06_register_read()
290 wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; in edt_ft5x06_register_read()
291 wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; in edt_ft5x06_register_read()
292 wrbuf[1] |= tsdata->factory_mode ? 0x80 : 0x40; in edt_ft5x06_register_read()
294 error = edt_ft5x06_ts_readwrite(tsdata->client, 2, wrbuf, 2, in edt_ft5x06_register_read()
300 dev_err(&tsdata->client->dev, in edt_ft5x06_register_read()
310 error = edt_ft5x06_ts_readwrite(tsdata->client, 1, in edt_ft5x06_register_read()
350 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_setting_show() local
353 u8 *field = (u8 *)tsdata + attr->field_offset; in edt_ft5x06_setting_show()
359 mutex_lock(&tsdata->mutex); in edt_ft5x06_setting_show()
361 if (tsdata->factory_mode) { in edt_ft5x06_setting_show()
366 switch (tsdata->version) { in edt_ft5x06_setting_show()
381 val = edt_ft5x06_register_read(tsdata, addr); in edt_ft5x06_setting_show()
384 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_show()
394 dev_warn(&tsdata->client->dev, in edt_ft5x06_setting_show()
402 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_show()
411 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_setting_store() local
414 u8 *field = (u8 *)tsdata + attr->field_offset; in edt_ft5x06_setting_store()
419 mutex_lock(&tsdata->mutex); in edt_ft5x06_setting_store()
421 if (tsdata->factory_mode) { in edt_ft5x06_setting_store()
435 switch (tsdata->version) { in edt_ft5x06_setting_store()
450 error = edt_ft5x06_register_write(tsdata, addr, val); in edt_ft5x06_setting_store()
452 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_store()
461 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_store()
487 static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_factory_mode() argument
489 struct i2c_client *client = tsdata->client; in edt_ft5x06_factory_mode()
496 if (!tsdata->raw_buffer) { in edt_ft5x06_factory_mode()
497 tsdata->raw_bufsize = tsdata->num_x * tsdata->num_y * in edt_ft5x06_factory_mode()
499 tsdata->raw_buffer = kzalloc(tsdata->raw_bufsize, GFP_KERNEL); in edt_ft5x06_factory_mode()
500 if (!tsdata->raw_buffer) { in edt_ft5x06_factory_mode()
507 if (tsdata->version == M09) in edt_ft5x06_factory_mode()
510 error = edt_ft5x06_register_write(tsdata, WORK_REGISTER_OPMODE, 0x03); in edt_ft5x06_factory_mode()
517 tsdata->factory_mode = true; in edt_ft5x06_factory_mode()
521 ret = edt_ft5x06_register_read(tsdata, FACTORY_REGISTER_OPMODE); in edt_ft5x06_factory_mode()
536 kfree(tsdata->raw_buffer); in edt_ft5x06_factory_mode()
537 tsdata->raw_buffer = NULL; in edt_ft5x06_factory_mode()
538 tsdata->factory_mode = false; in edt_ft5x06_factory_mode()
549 static int edt_ft5x06_work_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_work_mode() argument
551 struct i2c_client *client = tsdata->client; in edt_ft5x06_work_mode()
553 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_work_mode()
558 error = edt_ft5x06_register_write(tsdata, FACTORY_REGISTER_OPMODE, 0x1); in edt_ft5x06_work_mode()
565 tsdata->factory_mode = false; in edt_ft5x06_work_mode()
570 ret = edt_ft5x06_register_read(tsdata, WORK_REGISTER_OPMODE); in edt_ft5x06_work_mode()
578 tsdata->factory_mode = true; in edt_ft5x06_work_mode()
582 kfree(tsdata->raw_buffer); in edt_ft5x06_work_mode()
583 tsdata->raw_buffer = NULL; in edt_ft5x06_work_mode()
586 edt_ft5x06_register_write(tsdata, reg_addr->reg_threshold, in edt_ft5x06_work_mode()
587 tsdata->threshold); in edt_ft5x06_work_mode()
588 edt_ft5x06_register_write(tsdata, reg_addr->reg_gain, in edt_ft5x06_work_mode()
589 tsdata->gain); in edt_ft5x06_work_mode()
590 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, in edt_ft5x06_work_mode()
591 tsdata->offset); in edt_ft5x06_work_mode()
593 edt_ft5x06_register_write(tsdata, reg_addr->reg_report_rate, in edt_ft5x06_work_mode()
594 tsdata->report_rate); in edt_ft5x06_work_mode()
603 struct edt_ft5x06_ts_data *tsdata = data; in edt_ft5x06_debugfs_mode_get() local
605 *mode = tsdata->factory_mode; in edt_ft5x06_debugfs_mode_get()
612 struct edt_ft5x06_ts_data *tsdata = data; in edt_ft5x06_debugfs_mode_set() local
618 mutex_lock(&tsdata->mutex); in edt_ft5x06_debugfs_mode_set()
620 if (mode != tsdata->factory_mode) { in edt_ft5x06_debugfs_mode_set()
621 retval = mode ? edt_ft5x06_factory_mode(tsdata) : in edt_ft5x06_debugfs_mode_set()
622 edt_ft5x06_work_mode(tsdata); in edt_ft5x06_debugfs_mode_set()
625 mutex_unlock(&tsdata->mutex); in edt_ft5x06_debugfs_mode_set()
636 struct edt_ft5x06_ts_data *tsdata = file->private_data; in edt_ft5x06_debugfs_raw_data_read() local
637 struct i2c_client *client = tsdata->client; in edt_ft5x06_debugfs_raw_data_read()
645 if (*off < 0 || *off >= tsdata->raw_bufsize) in edt_ft5x06_debugfs_raw_data_read()
648 mutex_lock(&tsdata->mutex); in edt_ft5x06_debugfs_raw_data_read()
650 if (!tsdata->factory_mode || !tsdata->raw_buffer) { in edt_ft5x06_debugfs_raw_data_read()
655 error = edt_ft5x06_register_write(tsdata, 0x08, 0x01); in edt_ft5x06_debugfs_raw_data_read()
664 val = edt_ft5x06_register_read(tsdata, 0x08); in edt_ft5x06_debugfs_raw_data_read()
683 rdbuf = tsdata->raw_buffer; in edt_ft5x06_debugfs_raw_data_read()
684 colbytes = tsdata->num_y * sizeof(u16); in edt_ft5x06_debugfs_raw_data_read()
688 for (i = 0; i < tsdata->num_x; i++) { in edt_ft5x06_debugfs_raw_data_read()
690 error = edt_ft5x06_ts_readwrite(tsdata->client, in edt_ft5x06_debugfs_raw_data_read()
699 read = min_t(size_t, count, tsdata->raw_bufsize - *off); in edt_ft5x06_debugfs_raw_data_read()
700 if (copy_to_user(buf, tsdata->raw_buffer + *off, read)) { in edt_ft5x06_debugfs_raw_data_read()
707 mutex_unlock(&tsdata->mutex); in edt_ft5x06_debugfs_raw_data_read()
717 edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_prepare_debugfs() argument
720 tsdata->debug_dir = debugfs_create_dir(debugfs_name, NULL); in edt_ft5x06_ts_prepare_debugfs()
721 if (!tsdata->debug_dir) in edt_ft5x06_ts_prepare_debugfs()
724 debugfs_create_u16("num_x", S_IRUSR, tsdata->debug_dir, &tsdata->num_x); in edt_ft5x06_ts_prepare_debugfs()
725 debugfs_create_u16("num_y", S_IRUSR, tsdata->debug_dir, &tsdata->num_y); in edt_ft5x06_ts_prepare_debugfs()
728 tsdata->debug_dir, tsdata, &debugfs_mode_fops); in edt_ft5x06_ts_prepare_debugfs()
730 tsdata->debug_dir, tsdata, &debugfs_raw_data_fops); in edt_ft5x06_ts_prepare_debugfs()
734 edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_teardown_debugfs() argument
736 debugfs_remove_recursive(tsdata->debug_dir); in edt_ft5x06_ts_teardown_debugfs()
737 kfree(tsdata->raw_buffer); in edt_ft5x06_ts_teardown_debugfs()
743 edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_prepare_debugfs() argument
749 edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_teardown_debugfs() argument
756 struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_reset() argument
760 if (gpio_is_valid(tsdata->wake_pin)) { in edt_ft5x06_ts_reset()
762 tsdata->wake_pin, GPIOF_OUT_INIT_LOW, in edt_ft5x06_ts_reset()
767 tsdata->wake_pin, error); in edt_ft5x06_ts_reset()
772 gpio_set_value(tsdata->wake_pin, 1); in edt_ft5x06_ts_reset()
774 if (gpio_is_valid(tsdata->reset_pin)) { in edt_ft5x06_ts_reset()
777 tsdata->reset_pin, GPIOF_OUT_INIT_LOW, in edt_ft5x06_ts_reset()
782 tsdata->reset_pin, error); in edt_ft5x06_ts_reset()
787 gpio_set_value(tsdata->reset_pin, 1); in edt_ft5x06_ts_reset()
795 struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_identify() argument
801 char *model_name = tsdata->name; in edt_ft5x06_ts_identify()
817 tsdata->version = M06; in edt_ft5x06_ts_identify()
832 tsdata->version = M09; in edt_ft5x06_ts_identify()
857 edt_ft5x06_register_write(tsdata, reg, pdata->name); \
863 edt_ft5x06_register_write(tsdata, reg, val); \
867 struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_get_dt_defaults() argument
869 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_get_dt_defaults()
877 edt_ft5x06_ts_get_defaults(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_get_defaults() argument
880 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_get_defaults()
894 edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_get_parameters() argument
896 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_get_parameters()
898 tsdata->threshold = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
900 tsdata->gain = edt_ft5x06_register_read(tsdata, reg_addr->reg_gain); in edt_ft5x06_ts_get_parameters()
901 tsdata->offset = edt_ft5x06_register_read(tsdata, reg_addr->reg_offset); in edt_ft5x06_ts_get_parameters()
903 tsdata->report_rate = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
905 tsdata->num_x = edt_ft5x06_register_read(tsdata, reg_addr->reg_num_x); in edt_ft5x06_ts_get_parameters()
906 tsdata->num_y = edt_ft5x06_register_read(tsdata, reg_addr->reg_num_y); in edt_ft5x06_ts_get_parameters()
910 edt_ft5x06_ts_set_regs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_set_regs() argument
912 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_set_regs()
914 switch (tsdata->version) { in edt_ft5x06_ts_set_regs()
936 struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_i2c_ts_probe_dt() argument
944 tsdata->irq_pin = -EINVAL; in edt_ft5x06_i2c_ts_probe_dt()
945 tsdata->reset_pin = of_get_named_gpio(np, "reset-gpios", 0); in edt_ft5x06_i2c_ts_probe_dt()
946 tsdata->wake_pin = of_get_named_gpio(np, "wake-gpios", 0); in edt_ft5x06_i2c_ts_probe_dt()
952 struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_i2c_ts_probe_dt() argument
963 struct edt_ft5x06_ts_data *tsdata; in edt_ft5x06_ts_probe() local
970 tsdata = devm_kzalloc(&client->dev, sizeof(*tsdata), GFP_KERNEL); in edt_ft5x06_ts_probe()
971 if (!tsdata) { in edt_ft5x06_ts_probe()
977 error = edt_ft5x06_i2c_ts_probe_dt(&client->dev, tsdata); in edt_ft5x06_ts_probe()
984 tsdata->reset_pin = pdata->reset_pin; in edt_ft5x06_ts_probe()
985 tsdata->irq_pin = pdata->irq_pin; in edt_ft5x06_ts_probe()
986 tsdata->wake_pin = -EINVAL; in edt_ft5x06_ts_probe()
989 error = edt_ft5x06_ts_reset(client, tsdata); in edt_ft5x06_ts_probe()
993 if (gpio_is_valid(tsdata->irq_pin)) { in edt_ft5x06_ts_probe()
994 error = devm_gpio_request_one(&client->dev, tsdata->irq_pin, in edt_ft5x06_ts_probe()
999 tsdata->irq_pin, error); in edt_ft5x06_ts_probe()
1010 mutex_init(&tsdata->mutex); in edt_ft5x06_ts_probe()
1011 tsdata->client = client; in edt_ft5x06_ts_probe()
1012 tsdata->input = input; in edt_ft5x06_ts_probe()
1013 tsdata->factory_mode = false; in edt_ft5x06_ts_probe()
1015 error = edt_ft5x06_ts_identify(client, tsdata, fw_version); in edt_ft5x06_ts_probe()
1021 edt_ft5x06_ts_set_regs(tsdata); in edt_ft5x06_ts_probe()
1024 edt_ft5x06_ts_get_dt_defaults(client->dev.of_node, tsdata); in edt_ft5x06_ts_probe()
1026 edt_ft5x06_ts_get_defaults(tsdata, pdata); in edt_ft5x06_ts_probe()
1028 edt_ft5x06_ts_get_parameters(tsdata); in edt_ft5x06_ts_probe()
1032 tsdata->name, fw_version, tsdata->num_x, tsdata->num_y); in edt_ft5x06_ts_probe()
1034 input->name = tsdata->name; in edt_ft5x06_ts_probe()
1041 input_set_abs_params(input, ABS_X, 0, tsdata->num_x * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
1042 input_set_abs_params(input, ABS_Y, 0, tsdata->num_y * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
1044 0, tsdata->num_x * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
1046 0, tsdata->num_y * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
1057 input_set_drvdata(input, tsdata); in edt_ft5x06_ts_probe()
1058 i2c_set_clientdata(client, tsdata); in edt_ft5x06_ts_probe()
1063 client->name, tsdata); in edt_ft5x06_ts_probe()
1077 edt_ft5x06_ts_prepare_debugfs(tsdata, dev_driver_string(&client->dev)); in edt_ft5x06_ts_probe()
1082 client->irq, tsdata->wake_pin, tsdata->reset_pin); in edt_ft5x06_ts_probe()
1093 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_ts_remove() local
1095 edt_ft5x06_ts_teardown_debugfs(tsdata); in edt_ft5x06_ts_remove()