Lines Matching refs:tsdata
151 static bool edt_ft5x06_ts_check_crc(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_check_crc() argument
161 dev_err_ratelimited(&tsdata->client->dev, in edt_ft5x06_ts_check_crc()
172 struct edt_ft5x06_ts_data *tsdata = dev_id; in edt_ft5x06_ts_isr() local
173 struct device *dev = &tsdata->client->dev; in edt_ft5x06_ts_isr()
180 switch (tsdata->version) { in edt_ft5x06_ts_isr()
200 datalen = tplen * tsdata->max_support_points + offset + crclen; in edt_ft5x06_ts_isr()
202 error = edt_ft5x06_ts_readwrite(tsdata->client, in edt_ft5x06_ts_isr()
212 if (tsdata->version == M06) { in edt_ft5x06_ts_isr()
221 if (!edt_ft5x06_ts_check_crc(tsdata, rdbuf, datalen)) in edt_ft5x06_ts_isr()
225 for (i = 0; i < tsdata->max_support_points; i++) { in edt_ft5x06_ts_isr()
235 if (tsdata->version == M06 && type == TOUCH_EVENT_DOWN) in edt_ft5x06_ts_isr()
243 input_mt_slot(tsdata->input, id); in edt_ft5x06_ts_isr()
244 input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, down); in edt_ft5x06_ts_isr()
249 input_report_abs(tsdata->input, ABS_MT_POSITION_X, x); in edt_ft5x06_ts_isr()
250 input_report_abs(tsdata->input, ABS_MT_POSITION_Y, y); in edt_ft5x06_ts_isr()
253 input_mt_report_pointer_emulation(tsdata->input, true); in edt_ft5x06_ts_isr()
254 input_sync(tsdata->input); in edt_ft5x06_ts_isr()
260 static int edt_ft5x06_register_write(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_register_write() argument
265 switch (tsdata->version) { in edt_ft5x06_register_write()
267 wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; in edt_ft5x06_register_write()
268 wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; in edt_ft5x06_register_write()
271 return edt_ft5x06_ts_readwrite(tsdata->client, 4, in edt_ft5x06_register_write()
277 return edt_ft5x06_ts_readwrite(tsdata->client, 2, in edt_ft5x06_register_write()
285 static int edt_ft5x06_register_read(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_register_read() argument
291 switch (tsdata->version) { in edt_ft5x06_register_read()
293 wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; in edt_ft5x06_register_read()
294 wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; in edt_ft5x06_register_read()
295 wrbuf[1] |= tsdata->factory_mode ? 0x80 : 0x40; in edt_ft5x06_register_read()
297 error = edt_ft5x06_ts_readwrite(tsdata->client, 2, wrbuf, 2, in edt_ft5x06_register_read()
303 dev_err(&tsdata->client->dev, in edt_ft5x06_register_read()
313 error = edt_ft5x06_ts_readwrite(tsdata->client, 1, in edt_ft5x06_register_read()
353 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_setting_show() local
356 u8 *field = (u8 *)tsdata + attr->field_offset; in edt_ft5x06_setting_show()
362 mutex_lock(&tsdata->mutex); in edt_ft5x06_setting_show()
364 if (tsdata->factory_mode) { in edt_ft5x06_setting_show()
369 switch (tsdata->version) { in edt_ft5x06_setting_show()
384 val = edt_ft5x06_register_read(tsdata, addr); in edt_ft5x06_setting_show()
387 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_show()
397 dev_warn(&tsdata->client->dev, in edt_ft5x06_setting_show()
405 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_show()
414 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_setting_store() local
417 u8 *field = (u8 *)tsdata + attr->field_offset; in edt_ft5x06_setting_store()
422 mutex_lock(&tsdata->mutex); in edt_ft5x06_setting_store()
424 if (tsdata->factory_mode) { in edt_ft5x06_setting_store()
438 switch (tsdata->version) { in edt_ft5x06_setting_store()
453 error = edt_ft5x06_register_write(tsdata, addr, val); in edt_ft5x06_setting_store()
455 dev_err(&tsdata->client->dev, in edt_ft5x06_setting_store()
464 mutex_unlock(&tsdata->mutex); in edt_ft5x06_setting_store()
490 static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_factory_mode() argument
492 struct i2c_client *client = tsdata->client; in edt_ft5x06_factory_mode()
499 if (!tsdata->raw_buffer) { in edt_ft5x06_factory_mode()
500 tsdata->raw_bufsize = tsdata->num_x * tsdata->num_y * in edt_ft5x06_factory_mode()
502 tsdata->raw_buffer = kzalloc(tsdata->raw_bufsize, GFP_KERNEL); in edt_ft5x06_factory_mode()
503 if (!tsdata->raw_buffer) { in edt_ft5x06_factory_mode()
510 if (tsdata->version == M09) in edt_ft5x06_factory_mode()
513 error = edt_ft5x06_register_write(tsdata, WORK_REGISTER_OPMODE, 0x03); in edt_ft5x06_factory_mode()
520 tsdata->factory_mode = true; in edt_ft5x06_factory_mode()
524 ret = edt_ft5x06_register_read(tsdata, FACTORY_REGISTER_OPMODE); in edt_ft5x06_factory_mode()
539 kfree(tsdata->raw_buffer); in edt_ft5x06_factory_mode()
540 tsdata->raw_buffer = NULL; in edt_ft5x06_factory_mode()
541 tsdata->factory_mode = false; in edt_ft5x06_factory_mode()
552 static int edt_ft5x06_work_mode(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_work_mode() argument
554 struct i2c_client *client = tsdata->client; in edt_ft5x06_work_mode()
556 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_work_mode()
561 error = edt_ft5x06_register_write(tsdata, FACTORY_REGISTER_OPMODE, 0x1); in edt_ft5x06_work_mode()
568 tsdata->factory_mode = false; in edt_ft5x06_work_mode()
573 ret = edt_ft5x06_register_read(tsdata, WORK_REGISTER_OPMODE); in edt_ft5x06_work_mode()
581 tsdata->factory_mode = true; in edt_ft5x06_work_mode()
585 kfree(tsdata->raw_buffer); in edt_ft5x06_work_mode()
586 tsdata->raw_buffer = NULL; in edt_ft5x06_work_mode()
589 edt_ft5x06_register_write(tsdata, reg_addr->reg_threshold, in edt_ft5x06_work_mode()
590 tsdata->threshold); in edt_ft5x06_work_mode()
591 edt_ft5x06_register_write(tsdata, reg_addr->reg_gain, in edt_ft5x06_work_mode()
592 tsdata->gain); in edt_ft5x06_work_mode()
593 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, in edt_ft5x06_work_mode()
594 tsdata->offset); in edt_ft5x06_work_mode()
596 edt_ft5x06_register_write(tsdata, reg_addr->reg_report_rate, in edt_ft5x06_work_mode()
597 tsdata->report_rate); in edt_ft5x06_work_mode()
606 struct edt_ft5x06_ts_data *tsdata = data; in edt_ft5x06_debugfs_mode_get() local
608 *mode = tsdata->factory_mode; in edt_ft5x06_debugfs_mode_get()
615 struct edt_ft5x06_ts_data *tsdata = data; in edt_ft5x06_debugfs_mode_set() local
621 mutex_lock(&tsdata->mutex); in edt_ft5x06_debugfs_mode_set()
623 if (mode != tsdata->factory_mode) { in edt_ft5x06_debugfs_mode_set()
624 retval = mode ? edt_ft5x06_factory_mode(tsdata) : in edt_ft5x06_debugfs_mode_set()
625 edt_ft5x06_work_mode(tsdata); in edt_ft5x06_debugfs_mode_set()
628 mutex_unlock(&tsdata->mutex); in edt_ft5x06_debugfs_mode_set()
639 struct edt_ft5x06_ts_data *tsdata = file->private_data; in edt_ft5x06_debugfs_raw_data_read() local
640 struct i2c_client *client = tsdata->client; in edt_ft5x06_debugfs_raw_data_read()
648 if (*off < 0 || *off >= tsdata->raw_bufsize) in edt_ft5x06_debugfs_raw_data_read()
651 mutex_lock(&tsdata->mutex); in edt_ft5x06_debugfs_raw_data_read()
653 if (!tsdata->factory_mode || !tsdata->raw_buffer) { in edt_ft5x06_debugfs_raw_data_read()
658 error = edt_ft5x06_register_write(tsdata, 0x08, 0x01); in edt_ft5x06_debugfs_raw_data_read()
667 val = edt_ft5x06_register_read(tsdata, 0x08); in edt_ft5x06_debugfs_raw_data_read()
686 rdbuf = tsdata->raw_buffer; in edt_ft5x06_debugfs_raw_data_read()
687 colbytes = tsdata->num_y * sizeof(u16); in edt_ft5x06_debugfs_raw_data_read()
691 for (i = 0; i < tsdata->num_x; i++) { in edt_ft5x06_debugfs_raw_data_read()
693 error = edt_ft5x06_ts_readwrite(tsdata->client, in edt_ft5x06_debugfs_raw_data_read()
702 read = min_t(size_t, count, tsdata->raw_bufsize - *off); in edt_ft5x06_debugfs_raw_data_read()
703 if (copy_to_user(buf, tsdata->raw_buffer + *off, read)) { in edt_ft5x06_debugfs_raw_data_read()
710 mutex_unlock(&tsdata->mutex); in edt_ft5x06_debugfs_raw_data_read()
720 edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_prepare_debugfs() argument
723 tsdata->debug_dir = debugfs_create_dir(debugfs_name, NULL); in edt_ft5x06_ts_prepare_debugfs()
724 if (!tsdata->debug_dir) in edt_ft5x06_ts_prepare_debugfs()
727 debugfs_create_u16("num_x", S_IRUSR, tsdata->debug_dir, &tsdata->num_x); in edt_ft5x06_ts_prepare_debugfs()
728 debugfs_create_u16("num_y", S_IRUSR, tsdata->debug_dir, &tsdata->num_y); in edt_ft5x06_ts_prepare_debugfs()
731 tsdata->debug_dir, tsdata, &debugfs_mode_fops); in edt_ft5x06_ts_prepare_debugfs()
733 tsdata->debug_dir, tsdata, &debugfs_raw_data_fops); in edt_ft5x06_ts_prepare_debugfs()
737 edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_teardown_debugfs() argument
739 debugfs_remove_recursive(tsdata->debug_dir); in edt_ft5x06_ts_teardown_debugfs()
740 kfree(tsdata->raw_buffer); in edt_ft5x06_ts_teardown_debugfs()
746 edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_prepare_debugfs() argument
752 edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_teardown_debugfs() argument
759 struct edt_ft5x06_ts_data *tsdata, in edt_ft5x06_ts_identify() argument
765 char *model_name = tsdata->name; in edt_ft5x06_ts_identify()
781 tsdata->version = M06; in edt_ft5x06_ts_identify()
796 tsdata->version = M09; in edt_ft5x06_ts_identify()
818 struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_get_defaults() argument
820 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_get_defaults()
838 edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_get_parameters() argument
840 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_get_parameters()
842 tsdata->threshold = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
844 tsdata->gain = edt_ft5x06_register_read(tsdata, reg_addr->reg_gain); in edt_ft5x06_ts_get_parameters()
845 tsdata->offset = edt_ft5x06_register_read(tsdata, reg_addr->reg_offset); in edt_ft5x06_ts_get_parameters()
847 tsdata->report_rate = edt_ft5x06_register_read(tsdata, in edt_ft5x06_ts_get_parameters()
849 tsdata->num_x = edt_ft5x06_register_read(tsdata, reg_addr->reg_num_x); in edt_ft5x06_ts_get_parameters()
850 tsdata->num_y = edt_ft5x06_register_read(tsdata, reg_addr->reg_num_y); in edt_ft5x06_ts_get_parameters()
854 edt_ft5x06_ts_set_regs(struct edt_ft5x06_ts_data *tsdata) in edt_ft5x06_ts_set_regs() argument
856 struct edt_reg_addr *reg_addr = &tsdata->reg_addr; in edt_ft5x06_ts_set_regs()
858 switch (tsdata->version) { in edt_ft5x06_ts_set_regs()
882 struct edt_ft5x06_ts_data *tsdata; in edt_ft5x06_ts_probe() local
890 tsdata = devm_kzalloc(&client->dev, sizeof(*tsdata), GFP_KERNEL); in edt_ft5x06_ts_probe()
891 if (!tsdata) { in edt_ft5x06_ts_probe()
904 tsdata->max_support_points = chip_data->max_support_points; in edt_ft5x06_ts_probe()
906 tsdata->reset_gpio = devm_gpiod_get_optional(&client->dev, in edt_ft5x06_ts_probe()
908 if (IS_ERR(tsdata->reset_gpio)) { in edt_ft5x06_ts_probe()
909 error = PTR_ERR(tsdata->reset_gpio); in edt_ft5x06_ts_probe()
915 tsdata->wake_gpio = devm_gpiod_get_optional(&client->dev, in edt_ft5x06_ts_probe()
917 if (IS_ERR(tsdata->wake_gpio)) { in edt_ft5x06_ts_probe()
918 error = PTR_ERR(tsdata->wake_gpio); in edt_ft5x06_ts_probe()
924 if (tsdata->wake_gpio) { in edt_ft5x06_ts_probe()
926 gpiod_set_value_cansleep(tsdata->wake_gpio, 1); in edt_ft5x06_ts_probe()
929 if (tsdata->reset_gpio) { in edt_ft5x06_ts_probe()
931 gpiod_set_value_cansleep(tsdata->reset_gpio, 0); in edt_ft5x06_ts_probe()
941 mutex_init(&tsdata->mutex); in edt_ft5x06_ts_probe()
942 tsdata->client = client; in edt_ft5x06_ts_probe()
943 tsdata->input = input; in edt_ft5x06_ts_probe()
944 tsdata->factory_mode = false; in edt_ft5x06_ts_probe()
946 error = edt_ft5x06_ts_identify(client, tsdata, fw_version); in edt_ft5x06_ts_probe()
952 edt_ft5x06_ts_set_regs(tsdata); in edt_ft5x06_ts_probe()
953 edt_ft5x06_ts_get_defaults(&client->dev, tsdata); in edt_ft5x06_ts_probe()
954 edt_ft5x06_ts_get_parameters(tsdata); in edt_ft5x06_ts_probe()
958 tsdata->name, fw_version, tsdata->num_x, tsdata->num_y); in edt_ft5x06_ts_probe()
960 input->name = tsdata->name; in edt_ft5x06_ts_probe()
965 0, tsdata->num_x * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
967 0, tsdata->num_y * 64 - 1, 0, 0); in edt_ft5x06_ts_probe()
971 error = input_mt_init_slots(input, tsdata->max_support_points, in edt_ft5x06_ts_probe()
978 input_set_drvdata(input, tsdata); in edt_ft5x06_ts_probe()
979 i2c_set_clientdata(client, tsdata); in edt_ft5x06_ts_probe()
988 client->name, tsdata); in edt_ft5x06_ts_probe()
1002 edt_ft5x06_ts_prepare_debugfs(tsdata, dev_driver_string(&client->dev)); in edt_ft5x06_ts_probe()
1008 tsdata->wake_gpio ? desc_to_gpio(tsdata->wake_gpio) : -1, in edt_ft5x06_ts_probe()
1009 tsdata->reset_gpio ? desc_to_gpio(tsdata->reset_gpio) : -1); in edt_ft5x06_ts_probe()
1020 struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); in edt_ft5x06_ts_remove() local
1022 edt_ft5x06_ts_teardown_debugfs(tsdata); in edt_ft5x06_ts_remove()