Lines Matching +full:touch +full:- +full:max +full:- +full:x

1 // SPDX-License-Identifier: GPL-2.0
3 * ILITEK Touch IC driver for 23XX, 25XX and Lego series
98 struct i2c_client *client = ts->client; in ilitek_i2c_write_and_read()
101 .addr = client->addr, in ilitek_i2c_write_and_read()
107 .addr = client->addr, in ilitek_i2c_write_and_read()
115 error = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in ilitek_i2c_write_and_read()
120 error = i2c_transfer(client->adapter, msgs, 1); in ilitek_i2c_write_and_read()
128 error = i2c_transfer(client->adapter, msgs + 1, 1); in ilitek_i2c_write_and_read()
139 unsigned int x, unsigned int y) in ilitek_touch_down() argument
141 struct input_dev *input = ts->input_dev; in ilitek_touch_down()
146 touchscreen_report_pos(input, &ts->prop, x, y, true); in ilitek_touch_down()
157 struct input_dev *input = ts->input_dev; in ilitek_process_and_report_v6()
158 struct device *dev = &ts->client->dev; in ilitek_process_and_report_v6()
159 unsigned int x, y, status, id; in ilitek_process_and_report_v6() local
163 dev_err(dev, "get touch info failed, err:%d\n", error); in ilitek_process_and_report_v6()
168 dev_err(dev, "get touch info failed. Wrong id: 0x%02X\n", buf[0]); in ilitek_process_and_report_v6()
169 return -EINVAL; in ilitek_process_and_report_v6()
173 if (report_max_point > ts->max_tp) { in ilitek_process_and_report_v6()
174 dev_err(dev, "FW report max point:%d > panel info. max:%d\n", in ilitek_process_and_report_v6()
175 report_max_point, ts->max_tp); in ilitek_process_and_report_v6()
176 return -EINVAL; in ilitek_process_and_report_v6()
184 dev_err(dev, "get touch info. failed, cnt:%d, err:%d\n", in ilitek_process_and_report_v6()
197 x = get_unaligned_le16(buf + i * packet_len + 2); in ilitek_process_and_report_v6()
200 if (x > ts->screen_max_x || x < ts->screen_min_x || in ilitek_process_and_report_v6()
201 y > ts->screen_max_y || y < ts->screen_min_y) { in ilitek_process_and_report_v6()
202 dev_warn(dev, "invalid position, X[%d,%u,%d], Y[%d,%u,%d]\n", in ilitek_process_and_report_v6()
203 ts->screen_min_x, x, ts->screen_max_x, in ilitek_process_and_report_v6()
204 ts->screen_min_y, y, ts->screen_max_y); in ilitek_process_and_report_v6()
208 ilitek_touch_down(ts, id, x, y); in ilitek_process_and_report_v6()
217 /* APIs of cmds for ILITEK Touch IC */
225 return -EINVAL; in api_protocol_set_cmd()
227 cmd = ts->ptl_cb_func[idx].cmd; in api_protocol_set_cmd()
228 error = ts->ptl_cb_func[idx].func(ts, cmd, inbuf, outbuf); in api_protocol_set_cmd()
246 ts->ptl.ver = get_unaligned_be16(outbuf); in api_protocol_get_ptl_ver()
247 ts->ptl.ver_major = outbuf[0]; in api_protocol_get_ptl_ver()
263 ts->mcu_ver = get_unaligned_le16(outbuf); in api_protocol_get_mcu_ver()
264 memset(ts->product_id, 0, sizeof(ts->product_id)); in api_protocol_get_mcu_ver()
265 memcpy(ts->product_id, outbuf + 6, 26); in api_protocol_get_mcu_ver()
281 memcpy(ts->firmware_ver, outbuf, 8); in api_protocol_get_fw_ver()
297 ts->screen_min_x = get_unaligned_le16(outbuf); in api_protocol_get_scrn_res()
298 ts->screen_min_y = get_unaligned_le16(outbuf + 2); in api_protocol_get_scrn_res()
299 ts->screen_max_x = get_unaligned_le16(outbuf + 4); in api_protocol_get_scrn_res()
300 ts->screen_max_y = get_unaligned_le16(outbuf + 6); in api_protocol_get_scrn_res()
316 ts->max_tp = outbuf[8]; in api_protocol_get_tp_res()
317 if (ts->max_tp > ILITEK_SUPPORT_MAX_POINT) { in api_protocol_get_tp_res()
318 dev_err(&ts->client->dev, "Invalid MAX_TP:%d from FW\n", in api_protocol_get_tp_res()
319 ts->max_tp); in api_protocol_get_tp_res()
320 return -EINVAL; in api_protocol_get_tp_res()
337 ts->ic_mode = outbuf[0]; in api_protocol_get_ic_mode()
398 if (ts->reset_gpio) { in ilitek_reset()
399 gpiod_set_value(ts->reset_gpio, 1); in ilitek_reset()
401 gpiod_set_value(ts->reset_gpio, 0); in ilitek_reset()
411 ts->ptl_cb_func = ptl_func_map; in ilitek_protocol_init()
412 ts->reset_time = 600; in ilitek_protocol_init()
419 if (ts->ptl.ver_major == 0x3 || in ilitek_protocol_init()
420 ts->ptl.ver == BL_V1_6 || in ilitek_protocol_init()
421 ts->ptl.ver == BL_V1_7) in ilitek_protocol_init()
422 return -EINVAL; in ilitek_protocol_init()
469 return -ENOMEM; in ilitek_input_dev_init()
471 ts->input_dev = input; in ilitek_input_dev_init()
472 input->name = ILITEK_TS_NAME; in ilitek_input_dev_init()
473 input->id.bustype = BUS_I2C; in ilitek_input_dev_init()
475 __set_bit(INPUT_PROP_DIRECT, input->propbit); in ilitek_input_dev_init()
478 ts->screen_min_x, ts->screen_max_x, 0, 0); in ilitek_input_dev_init()
480 ts->screen_min_y, ts->screen_max_y, 0, 0); in ilitek_input_dev_init()
482 touchscreen_parse_properties(input, true, &ts->prop); in ilitek_input_dev_init()
484 error = input_mt_init_slots(input, ts->max_tp, in ilitek_input_dev_init()
507 dev_err(&ts->client->dev, "[%s] err:%d\n", __func__, error); in ilitek_i2c_isr()
521 "fw version: [%02X%02X.%02X%02X.%02X%02X.%02X%02X]\n", in firmware_version_show()
522 ts->firmware_ver[0], ts->firmware_ver[1], in firmware_version_show()
523 ts->firmware_ver[2], ts->firmware_ver[3], in firmware_version_show()
524 ts->firmware_ver[4], ts->firmware_ver[5], in firmware_version_show()
525 ts->firmware_ver[6], ts->firmware_ver[7]); in firmware_version_show()
535 return sysfs_emit(buf, "product id: [%04X], module: [%s]\n", in product_id_show()
536 ts->mcu_ver, ts->product_id); in product_id_show()
550 struct device *dev = &client->dev; in ilitek_ts_i2c_probe()
553 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in ilitek_ts_i2c_probe()
555 return -ENXIO; in ilitek_ts_i2c_probe()
560 return -ENOMEM; in ilitek_ts_i2c_probe()
562 ts->client = client; in ilitek_ts_i2c_probe()
565 ts->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in ilitek_ts_i2c_probe()
566 if (IS_ERR(ts->reset_gpio)) { in ilitek_ts_i2c_probe()
567 error = PTR_ERR(ts->reset_gpio); in ilitek_ts_i2c_probe()
592 error = devm_request_threaded_irq(dev, ts->client->irq, in ilitek_ts_i2c_probe()
609 disable_irq(client->irq); in ilitek_suspend()
631 ilitek_reset(ts, ts->reset_time); in ilitek_resume()
634 enable_irq(client->irq); in ilitek_resume()