Lines Matching full:ts
187 static int gslx680_set_pinctrl_state(struct gsl_ts *ts, in gslx680_set_pinctrl_state() argument
192 if (!IS_ERR(ts->pinctrl)) in gslx680_set_pinctrl_state()
193 return PTR_ERR(ts->pinctrl); in gslx680_set_pinctrl_state()
196 ret = pinctrl_select_state(ts->pinctrl, state); in gslx680_set_pinctrl_state()
204 static int gslX680_init(struct gsl_ts *ts) in gslX680_init() argument
206 struct device_node *np = ts->client->dev.of_node; in gslX680_init()
209 ts->irq = of_get_named_gpio_flags(np, "touch-gpio", 0, NULL); in gslX680_init()
210 ts->rst = of_get_named_gpio_flags(np, "reset-gpio", 0, NULL); in gslX680_init()
213 ts->pinctrl = devm_pinctrl_get(&ts->client->dev); in gslX680_init()
214 if (!IS_ERR(ts->pinctrl)) { in gslX680_init()
215 ts->pins_default = in gslX680_init()
216 pinctrl_lookup_state(ts->pinctrl, PINCTRL_STATE_DEFAULT); in gslX680_init()
217 ts->pins_sleep = in gslX680_init()
218 pinctrl_lookup_state(ts->pinctrl, PINCTRL_STATE_SLEEP); in gslX680_init()
219 ts->pins_inactive = in gslX680_init()
220 pinctrl_lookup_state(ts->pinctrl, "inactive"); in gslX680_init()
221 gslx680_set_pinctrl_state(ts, ts->pins_default); in gslX680_init()
224 err = gpio_request(ts->rst, "tp reset"); in gslX680_init()
230 gpio_direction_output(ts->rst, 1); in gslX680_init()
231 gpio_set_value(ts->rst, 1); in gslX680_init()
236 static int gslX680_shutdown_low(struct gsl_ts *ts) in gslX680_shutdown_low() argument
239 gpio_direction_output(ts->rst, 0); in gslX680_shutdown_low()
240 gpio_set_value(ts->rst, 0); in gslX680_shutdown_low()
245 static int gslX680_shutdown_high(struct gsl_ts *ts) in gslX680_shutdown_high() argument
248 gpio_direction_output(ts->rst, 1); in gslX680_shutdown_high()
249 gpio_set_value(ts->rst, 1); in gslX680_shutdown_high()
530 static void init_chip(struct i2c_client *client, struct gsl_ts *ts) in init_chip() argument
538 gslX680_shutdown_low(ts); in init_chip()
540 gslX680_shutdown_high(ts); in init_chip()
564 static void check_mem_data(struct i2c_client *client, struct gsl_ts *ts) in check_mem_data() argument
574 init_chip(client, ts); in check_mem_data()
816 static void report_key(struct gsl_ts *ts, u16 x, u16 y) in report_key() argument
826 input_report_key(ts->input, key, 1); in report_key()
827 input_sync(ts->input); in report_key()
836 static void report_data(struct gsl_ts *ts, u16 x, u16 y, u8 pressure, u8 id) in report_data() argument
848 input_event(ts->input, EV_MSC, MSC_SCAN, 0x90001); in report_data()
849 input_report_key(ts->input, 0x110, 1); in report_data()
850 input_sync(ts->input); in report_data()
856 input_report_rel(ts->input, REL_Y, -delt_x); in report_data()
857 input_report_rel(ts->input, REL_X, -delt_y); in report_data()
858 input_sync(ts->input); in report_data()
868 input_mt_slot(ts->input, id); in report_data()
869 input_report_abs(ts->input, ABS_MT_TRACKING_ID, id); in report_data()
870 input_report_abs(ts->input, ABS_MT_TOUCH_MAJOR, pressure); in report_data()
871 input_report_abs(ts->input, ABS_MT_POSITION_X, x); in report_data()
872 input_report_abs(ts->input, ABS_MT_POSITION_Y, y); in report_data()
873 input_report_abs(ts->input, ABS_MT_WIDTH_MAJOR, 1); in report_data()
875 input_report_abs(ts->input, ABS_MT_TRACKING_ID, id); in report_data()
876 input_report_abs(ts->input, ABS_MT_TOUCH_MAJOR, pressure); in report_data()
877 input_report_abs(ts->input, ABS_MT_POSITION_X, x); in report_data()
878 input_report_abs(ts->input, ABS_MT_POSITION_Y, y); in report_data()
879 input_report_abs(ts->input, ABS_MT_WIDTH_MAJOR, 1); in report_data()
880 input_mt_sync(ts->input); in report_data()
884 static void glsx680_ts_irq_disable(struct gsl_ts *ts) in glsx680_ts_irq_disable() argument
888 spin_lock_irqsave(&ts->irq_lock, irqflags); in glsx680_ts_irq_disable()
889 if (!ts->flag_irq_is_disable) { in glsx680_ts_irq_disable()
890 disable_irq_nosync(ts->client->irq); in glsx680_ts_irq_disable()
891 ts->flag_irq_is_disable = 1; in glsx680_ts_irq_disable()
893 spin_unlock_irqrestore(&ts->irq_lock, irqflags); in glsx680_ts_irq_disable()
896 static void glsx680_ts_irq_enable(struct gsl_ts *ts) in glsx680_ts_irq_enable() argument
900 spin_lock_irqsave(&ts->irq_lock, irqflags); in glsx680_ts_irq_enable()
901 if (ts->flag_irq_is_disable) { in glsx680_ts_irq_enable()
902 enable_irq(ts->client->irq); in glsx680_ts_irq_enable()
903 ts->flag_irq_is_disable = 0; in glsx680_ts_irq_enable()
905 spin_unlock_irqrestore(&ts->irq_lock, irqflags); in glsx680_ts_irq_enable()
920 struct gsl_ts *ts = container_of(work, struct gsl_ts, work); in gslX680_ts_worker() local
934 rc = gsl_ts_read(ts->client, 0x80, ts->touch_data, ts->dd->data_size); in gslX680_ts_worker()
936 dev_err(&ts->client->dev, "read failed\n"); in gslX680_ts_worker()
940 touches = ts->touch_data[ts->dd->touch_index]; in gslX680_ts_worker()
947 join_bytes((ts-> in gslX680_ts_worker()
948 touch_data[ts->dd->x_index + 4 * i + 1] & 0xf), in gslX680_ts_worker()
949 ts->touch_data[ts->dd->x_index + 4 * i]); in gslX680_ts_worker()
951 join_bytes(ts->touch_data[ts->dd->y_index + 4 * i + 1], in gslX680_ts_worker()
952 ts->touch_data[ts->dd->y_index + 4 * i]); in gslX680_ts_worker()
954 ((ts->touch_data[ts->dd->x_index + 4 * i + 1] & 0xf0) >> 4); in gslX680_ts_worker()
957 cinfo.finger_num = (ts->touch_data[3] << 24) | (ts->touch_data[2] << 16) in gslX680_ts_worker()
958 | (ts->touch_data[1] << 8) | (ts->touch_data[0]); in gslX680_ts_worker()
966 gsl_ts_write(ts->client, 0xf0, buf, 4); in gslX680_ts_worker()
971 gsl_ts_write(ts->client, 0x8, buf, 4); in gslX680_ts_worker()
987 x = join_bytes((ts-> in gslX680_ts_worker()
988 touch_data[ts->dd->x_index + 4 * i + 1] & 0xf), in gslX680_ts_worker()
989 ts->touch_data[ts->dd->x_index + 4 * i]); in gslX680_ts_worker()
990 y = join_bytes(ts->touch_data[ts->dd->y_index + 4 * i + 1], in gslX680_ts_worker()
991 ts->touch_data[ts->dd->y_index + 4 * i]); in gslX680_ts_worker()
992 id = ts->touch_data[ts->dd->id_index + 4 * i] >> 4; in gslX680_ts_worker()
1001 report_data(ts, x, y, 10, id); in gslX680_ts_worker()
1016 input_event(ts->input, EV_MSC, in gslX680_ts_worker()
1018 input_report_key(ts->input, 0x110, 0); in gslX680_ts_worker()
1019 input_sync(ts->input); in gslX680_ts_worker()
1025 input_mt_slot(ts->input, i); in gslX680_ts_worker()
1026 input_report_abs(ts->input, ABS_MT_TRACKING_ID, -1); in gslX680_ts_worker()
1027 input_mt_report_slot_state(ts->input, in gslX680_ts_worker()
1038 input_report_abs(ts->input, ABS_MT_TOUCH_MAJOR, 0); in gslX680_ts_worker()
1039 input_report_abs(ts->input, ABS_MT_WIDTH_MAJOR, 0); in gslX680_ts_worker()
1040 input_mt_sync(ts->input); in gslX680_ts_worker()
1057 input_report_key(ts->input, in gslX680_ts_worker()
1059 input_sync(ts->input); in gslX680_ts_worker()
1060 input_report_key(ts->input, in gslX680_ts_worker()
1062 input_sync(ts->input); in gslX680_ts_worker()
1066 input_report_key(ts->input, in gslX680_ts_worker()
1068 input_sync(ts->input); in gslX680_ts_worker()
1069 input_report_key(ts->input, in gslX680_ts_worker()
1071 input_sync(ts->input); in gslX680_ts_worker()
1076 input_report_key(ts->input, in gslX680_ts_worker()
1078 input_sync(ts->input); in gslX680_ts_worker()
1079 input_report_key(ts->input, in gslX680_ts_worker()
1081 input_sync(ts->input); in gslX680_ts_worker()
1085 input_report_key(ts->input, in gslX680_ts_worker()
1087 input_sync(ts->input); in gslX680_ts_worker()
1088 input_report_key(ts->input, in gslX680_ts_worker()
1090 input_sync(ts->input); in gslX680_ts_worker()
1100 &ts->click_work); in gslX680_ts_worker()
1104 input_report_key(ts->input, in gslX680_ts_worker()
1106 input_sync(ts->input); in gslX680_ts_worker()
1107 input_report_key(ts->input, in gslX680_ts_worker()
1109 input_sync(ts->input); in gslX680_ts_worker()
1120 input_report_key(ts->input, in gslX680_ts_worker()
1122 input_sync(ts->input); in gslX680_ts_worker()
1123 input_report_key(ts->input, in gslX680_ts_worker()
1125 input_sync(ts->input); in gslX680_ts_worker()
1128 input_report_key(ts->input, in gslX680_ts_worker()
1130 input_sync(ts->input); in gslX680_ts_worker()
1131 input_report_key(ts->input, in gslX680_ts_worker()
1133 input_sync(ts->input); in gslX680_ts_worker()
1138 input_report_key(ts->input, in gslX680_ts_worker()
1140 input_sync(ts->input); in gslX680_ts_worker()
1141 input_report_key(ts->input, in gslX680_ts_worker()
1143 input_sync(ts->input); in gslX680_ts_worker()
1146 input_report_key(ts->input, in gslX680_ts_worker()
1148 input_sync(ts->input); in gslX680_ts_worker()
1149 input_report_key(ts->input, in gslX680_ts_worker()
1151 input_sync(ts->input); in gslX680_ts_worker()
1162 input_report_key(ts->input, key, 0); in gslX680_ts_worker()
1163 input_sync(ts->input); in gslX680_ts_worker()
1169 input_sync(ts->input); in gslX680_ts_worker()
1176 glsx680_ts_irq_enable(ts); in gslX680_ts_worker()
1197 struct gsl_ts *ts = in gsl_monitor_worker() local
1204 gsl_ts_read(ts->client, 0xb0, read_buf, 4); in gsl_monitor_worker()
1216 gsl_ts_read(ts->client, 0xb4, read_buf, 4); in gsl_monitor_worker()
1234 gsl_ts_read(ts->client, 0xbc, read_buf, 4); in gsl_monitor_worker()
1248 init_chip(ts->client, ts); in gsl_monitor_worker()
1256 struct gsl_ts *ts = (struct gsl_ts *)dev_id; in gsl_ts_irq() local
1258 glsx680_ts_irq_disable(ts); in gsl_ts_irq()
1260 if (!work_pending(&ts->work)) in gsl_ts_irq()
1261 queue_work(ts->wq, &ts->work); in gsl_ts_irq()
1266 static int gslX680_ts_init(struct i2c_client *client, struct gsl_ts *ts) in gslX680_ts_init() argument
1274 ts->dd = &devices[ts->device_id]; in gslX680_ts_init()
1276 if (ts->device_id == 0) { in gslX680_ts_init()
1277 ts->dd->data_size = in gslX680_ts_init()
1278 MAX_FINGERS * ts->dd->touch_bytes + ts->dd->touch_meta_data; in gslX680_ts_init()
1279 ts->dd->touch_index = 0; in gslX680_ts_init()
1282 ts->touch_data = in gslX680_ts_init()
1283 devm_kzalloc(&client->dev, ts->dd->data_size, GFP_KERNEL); in gslX680_ts_init()
1284 if (!ts->touch_data) { in gslX680_ts_init()
1289 input_device = devm_input_allocate_device(&ts->client->dev); in gslX680_ts_init()
1295 ts->input = input_device; in gslX680_ts_init()
1299 input_set_drvdata(input_device, ts); in gslX680_ts_init()
1345 /* ts->irq = client->irq; */ in gslX680_ts_init()
1347 ts->wq = create_singlethread_workqueue("kworkqueue_ts"); in gslX680_ts_init()
1348 if (!ts->wq) { in gslX680_ts_init()
1352 flush_workqueue(ts->wq); in gslX680_ts_init()
1354 INIT_WORK(&ts->work, gslX680_ts_worker); in gslX680_ts_init()
1363 destroy_workqueue(ts->wq); in gslX680_ts_init()
1370 struct gsl_ts *ts = container_of(tp_d, struct gsl_ts, tp); in gsl_ts_early_suspend() local
1373 cancel_delayed_work_sync(&ts->gsl_monitor_work); in gsl_ts_early_suspend()
1380 glsx680_ts_irq_disable(ts); in gsl_ts_early_suspend()
1381 cancel_work_sync(&ts->work); in gsl_ts_early_suspend()
1387 input_mt_slot(ts->input, i); in gsl_ts_early_suspend()
1388 input_report_abs(ts->input, ABS_MT_TRACKING_ID, -1); in gsl_ts_early_suspend()
1389 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); in gsl_ts_early_suspend()
1392 input_mt_sync(ts->input); in gsl_ts_early_suspend()
1394 input_sync(ts->input); in gsl_ts_early_suspend()
1396 report_data(ts, 1, 1, 10, 1); in gsl_ts_early_suspend()
1397 input_sync(ts->input); in gsl_ts_early_suspend()
1399 gslX680_shutdown_low(ts); in gsl_ts_early_suspend()
1405 struct gsl_ts *ts = container_of(tp_d, struct gsl_ts, tp); in gsl_ts_late_resume() local
1408 gslX680_shutdown_high(ts); in gsl_ts_late_resume()
1410 reset_chip(ts->client); in gsl_ts_late_resume()
1411 startup_chip(ts->client); in gsl_ts_late_resume()
1412 check_mem_data(ts->client, ts); in gsl_ts_late_resume()
1417 input_mt_slot(ts->input, i); in gsl_ts_late_resume()
1418 input_report_abs(ts->input, ABS_MT_TRACKING_ID, -1); in gsl_ts_late_resume()
1419 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); in gsl_ts_late_resume()
1422 input_mt_sync(ts->input); in gsl_ts_late_resume()
1424 input_sync(ts->input); in gsl_ts_late_resume()
1428 queue_delayed_work(gsl_monitor_workqueue, &ts->gsl_monitor_work, 300); in gsl_ts_late_resume()
1430 glsx680_ts_irq_enable(ts); in gsl_ts_late_resume()
1439 struct gsl_ts *ts = container_of(h, struct gsl_ts, early_suspend); in gsl_ts_early_suspend() local
1442 cancel_delayed_work_sync(&ts->gsl_monitor_work); in gsl_ts_early_suspend()
1445 glsx680_ts_irq_disable(ts); in gsl_ts_early_suspend()
1446 cancel_work_sync(&ts->work); in gsl_ts_early_suspend()
1452 input_mt_slot(ts->input, i); in gsl_ts_early_suspend()
1453 input_report_abs(ts->input, ABS_MT_TRACKING_ID, -1); in gsl_ts_early_suspend()
1454 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); in gsl_ts_early_suspend()
1457 input_mt_sync(ts->input); in gsl_ts_early_suspend()
1459 input_sync(ts->input); in gsl_ts_early_suspend()
1461 report_data(ts, 1, 1, 10, 1); in gsl_ts_early_suspend()
1462 input_sync(ts->input); in gsl_ts_early_suspend()
1464 gslX680_shutdown_low(ts); in gsl_ts_early_suspend()
1471 struct gsl_ts *ts = container_of(h, struct gsl_ts, early_suspend); in gsl_ts_late_resume() local
1476 gslX680_shutdown_high(ts); in gsl_ts_late_resume()
1478 reset_chip(ts->client); in gsl_ts_late_resume()
1479 startup_chip(ts->client); in gsl_ts_late_resume()
1480 check_mem_data(ts->client, ts); in gsl_ts_late_resume()
1485 input_mt_slot(ts->input, i); in gsl_ts_late_resume()
1486 input_report_abs(ts->input, ABS_MT_TRACKING_ID, -1); in gsl_ts_late_resume()
1487 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); in gsl_ts_late_resume()
1490 input_mt_sync(ts->input); in gsl_ts_late_resume()
1492 input_sync(ts->input); in gsl_ts_late_resume()
1496 queue_delayed_work(gsl_monitor_workqueue, &ts->gsl_monitor_work, 300); in gsl_ts_late_resume()
1498 glsx680_ts_irq_enable(ts); in gsl_ts_late_resume()
1502 static void gsl_ts_power_on(struct gsl_ts *ts, bool enable) in gsl_ts_power_on() argument
1507 ret = regulator_enable(ts->regulator); in gsl_ts_power_on()
1509 dev_err(&ts->client->dev, in gsl_ts_power_on()
1513 ret = regulator_disable(ts->regulator); in gsl_ts_power_on()
1515 dev_err(&ts->client->dev, in gsl_ts_power_on()
1524 struct gsl_ts *ts; in gsl_ts_probe() local
1532 ts = devm_kzalloc(&client->dev, sizeof(*ts), GFP_KERNEL); in gsl_ts_probe()
1533 if (!ts) in gsl_ts_probe()
1538 ts->regulator = devm_regulator_get_optional(&client->dev, "power"); in gsl_ts_probe()
1539 if (IS_ERR(ts->regulator)) { in gsl_ts_probe()
1540 if (PTR_ERR(ts->regulator) == -EPROBE_DEFER) in gsl_ts_probe()
1543 ts->regulator = NULL; in gsl_ts_probe()
1545 gsl_ts_power_on(ts, true); in gsl_ts_probe()
1548 ts->tp.tp_suspend = gsl_ts_early_suspend; in gsl_ts_probe()
1549 ts->tp.tp_resume = gsl_ts_late_resume; in gsl_ts_probe()
1550 tp_register_fb(&ts->tp); in gsl_ts_probe()
1551 ts->client = client; in gsl_ts_probe()
1552 i2c_set_clientdata(client, ts); in gsl_ts_probe()
1553 /* ts->device_id = id->driver_data; */ in gsl_ts_probe()
1555 gslX680_init(ts); in gsl_ts_probe()
1556 rc = gslX680_ts_init(client, ts); in gsl_ts_probe()
1562 init_chip(ts->client, ts); in gsl_ts_probe()
1563 check_mem_data(ts->client, ts); in gsl_ts_probe()
1564 spin_lock_init(&ts->irq_lock); in gsl_ts_probe()
1565 client->irq = gpio_to_irq(ts->irq); in gsl_ts_probe()
1567 client->name, ts); in gsl_ts_probe()
1572 glsx680_ts_irq_enable(ts); in gsl_ts_probe()
1576 ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; in gsl_ts_probe()
1577 ts->early_suspend.suspend = gsl_ts_early_suspend; in gsl_ts_probe()
1578 ts->early_suspend.resume = gsl_ts_late_resume; in gsl_ts_probe()
1579 register_early_suspend(&ts->early_suspend); in gsl_ts_probe()
1584 INIT_DELAYED_WORK(&ts->gsl_monitor_work, gsl_monitor_worker); in gsl_ts_probe()
1587 queue_delayed_work(gsl_monitor_workqueue, &ts->gsl_monitor_work, 1000); in gsl_ts_probe()
1592 INIT_WORK(&ts->click_work, click_timer_worker); in gsl_ts_probe()
1594 queue_work(gsl_timer_workqueue, &ts->click_work); in gsl_ts_probe()
1612 struct gsl_ts *ts = i2c_get_clientdata(client); in gsl_ts_remove() local
1615 unregister_early_suspend(&ts->early_suspend); in gsl_ts_remove()
1619 cancel_delayed_work_sync(&ts->gsl_monitor_work); in gsl_ts_remove()
1624 cancel_work_sync(&ts->click_work); in gsl_ts_remove()
1629 cancel_work_sync(&ts->work); in gsl_ts_remove()
1630 free_irq(ts->client->irq, ts); in gsl_ts_remove()
1631 destroy_workqueue(ts->wq); in gsl_ts_remove()
1632 gsl_ts_power_on(ts, false); in gsl_ts_remove()