Lines Matching +full:client +full:- +full:id

242 	struct i2c_client *client;  member
302 static u32 gsl_write_interface(struct i2c_client *client, const u8 reg, u8 *buf, u32 num) in gsl_write_interface() argument
308 xfer_msg[0].addr = client->addr; in gsl_write_interface()
310 xfer_msg[0].flags = client->flags & I2C_M_TEN; in gsl_write_interface()
313 return i2c_transfer(client->adapter, xfer_msg, 1) == 1 ? 0 : -EFAULT; in gsl_write_interface()
316 static int gsl_ts_write(struct i2c_client *client, u8 addr, u8 *pdata, int datalen) in gsl_ts_write() argument
324 return -1; in gsl_ts_write()
335 ret = i2c_master_send(client, tmp_buf, bytelen); in gsl_ts_write()
339 static int gsl_ts_read(struct i2c_client *client, u8 addr, u8 *pdata, unsigned int datalen) in gsl_ts_read() argument
345 return -1; in gsl_ts_read()
348 ret = gsl_ts_write(client, addr, NULL, 0); in gsl_ts_read()
354 return i2c_master_recv(client, pdata, datalen); in gsl_ts_read()
363 static void gsl_load_fw(struct i2c_client *client) in gsl_load_fw() argument
381 gsl_write_interface(client, GSL_PAGE_REG, buf, 4); in gsl_load_fw()
391 gsl_write_interface(client, buf[0], buf, cur - buf - 1); in gsl_load_fw()
402 static int test_i2c(struct i2c_client *client) in test_i2c() argument
408 ret = gsl_ts_read(client, 0xf0, &read_buf, sizeof(read_buf)); in test_i2c()
410 rc--; in test_i2c()
415 ret = gsl_ts_write(client, 0xf0, &write_buf, sizeof(write_buf)); in test_i2c()
419 ret = gsl_ts_read(client, 0xf0, &read_buf, sizeof(read_buf)); in test_i2c()
421 rc--; in test_i2c()
428 static void startup_chip(struct i2c_client *client) in startup_chip() argument
435 gsl_ts_write(client, 0xe0, &tmp, 1); in startup_chip()
439 static void reset_chip(struct i2c_client *client) in reset_chip() argument
444 gsl_ts_write(client, 0xe0, &tmp, sizeof(tmp)); in reset_chip()
447 gsl_ts_write(client, 0xe4, &tmp, sizeof(tmp)); in reset_chip()
449 gsl_ts_write(client, 0xbc, buf, sizeof(buf)); in reset_chip()
453 static void clr_reg(struct i2c_client *client) in clr_reg() argument
458 gsl_ts_write(client, 0xe0, &write_buf[0], 1); in clr_reg()
461 gsl_ts_write(client, 0x80, &write_buf[0], 1); in clr_reg()
464 gsl_ts_write(client, 0xe4, &write_buf[0], 1); in clr_reg()
467 gsl_ts_write(client, 0xe0, &write_buf[0], 1); in clr_reg()
471 static void init_chip(struct i2c_client *client) in init_chip() argument
481 rc = test_i2c(client); in init_chip()
486 pr_info("------gslX680 test_i2c error------\n"); in init_chip()
489 clr_reg(client); in init_chip()
490 reset_chip(client); in init_chip()
491 gsl_load_fw(client); in init_chip()
492 startup_chip(client); in init_chip()
493 reset_chip(client); in init_chip()
494 startup_chip(client); in init_chip()
497 static void check_mem_data(struct i2c_client *client) in check_mem_data() argument
502 gsl_ts_read(client, 0xb0, read_buf, sizeof(read_buf)); in check_mem_data()
506 init_chip(client); in check_mem_data()
514 return (ch - '0'); in char_to_int()
516 return (ch - 'a' + 10); in char_to_int()
564 print_info("[tp-gsl][%s] \n", __func__); in gsl_config_write_proc()
567 return -EFAULT; in gsl_config_write_proc()
572 return -ENOMEM; in gsl_config_write_proc()
579 print_info("[tp-gsl][%s][%s]\n", __func__, temp_buf); in gsl_config_write_proc()
638 static void filter_point(u16 x, u16 y, u8 id) in filter_point() argument
644 id_sign[id] = id_sign[id] + 1; in filter_point()
645 if (id_sign[id] == 1) { in filter_point()
646 x_old[id] = x; in filter_point()
647 y_old[id] = y; in filter_point()
650 x_err = x > x_old[id] ? (x - x_old[id]) : (x_old[id] - x); in filter_point()
651 y_err = y > y_old[id] ? (y - y_old[id]) : (y_old[id] - y); in filter_point()
674 x_new = x > x_old[id] ? (x_old[id] + filter_step_x) : (x_old[id] - filter_step_x); in filter_point()
675 y_new = y > y_old[id] ? (y_old[id] + filter_step_y) : (y_old[id] - filter_step_y); in filter_point()
677 x_old[id] = x_new; in filter_point()
678 y_old[id] = y_new; in filter_point()
681 static void record_point(u16 x, u16 y, u8 id) in record_point() argument
686 id_sign[id] = id_sign[id] + 1; in record_point()
688 if (id_sign[id] == 1) { in record_point()
689 x_old[id] = x; in record_point()
690 y_old[id] = y; in record_point()
693 x = (x_old[id] + x) / 2; in record_point()
694 y = (y_old[id] + y) / 2; in record_point()
696 if (x > x_old[id]) in record_point()
697 x_err = x - x_old[id]; in record_point()
699 x_err = x_old[id] - x; in record_point()
701 if (y > y_old[id]) in record_point()
702 y_err = y - y_old[id]; in record_point()
704 y_err = y_old[id] - y; in record_point()
708 x_old[id] = x; in record_point()
710 y_old[id] = y; in record_point()
714 x_old[id] = x; in record_point()
716 x_new = x_old[id]; in record_point()
720 y_old[id] = y; in record_point()
722 y_new = y_old[id]; in record_point()
726 if (id_sign[id] == 1) { in record_point()
727 x_new = x_old[id]; in record_point()
728 y_new = y_old[id]; in record_point()
741 input_report_key(ts->input, key, 1); in report_key()
742 input_sync(ts->input); in report_key()
750 static void report_data(struct gsl_ts *ts, u16 x, u16 y, u8 pressure, u8 id) in report_data() argument
755 print_info("#####id=%d,x=%d,y=%d######\n", id, x, y); in report_data()
765 x = SCREEN_MAX_X - x - 1; in report_data()
767 y = SCREEN_MAX_Y - y - 1; in report_data()
769 input_mt_slot(ts->input, id); in report_data()
770 input_report_abs(ts->input, ABS_MT_TRACKING_ID, id); in report_data()
771 input_report_abs(ts->input, ABS_MT_TOUCH_MAJOR, pressure); in report_data()
772 input_report_abs(ts->input, ABS_MT_POSITION_X, x); in report_data()
773 input_report_abs(ts->input, ABS_MT_POSITION_Y, y); in report_data()
774 input_report_abs(ts->input, ABS_MT_WIDTH_MAJOR, 1); in report_data()
776 input_report_abs(ts->input, ABS_MT_TRACKING_ID, id); in report_data()
777 input_report_abs(ts->input, ABS_MT_TOUCH_MAJOR, pressure); in report_data()
778 input_report_abs(ts->input, ABS_MT_POSITION_X, x); in report_data()
779 input_report_abs(ts->input, ABS_MT_POSITION_Y, y); in report_data()
780 input_report_abs(ts->input, ABS_MT_WIDTH_MAJOR, 1); in report_data()
781 input_mt_sync(ts->input); in report_data()
788 u8 id, touches; in gslX680_ts_worker() local
811 rc = gsl_ts_read(ts->client, 0x80, ts->touch_data, ts->dd->data_size); in gslX680_ts_worker()
813 dev_err(&ts->client->dev, "read failed\n"); in gslX680_ts_worker()
814 reset_chip(ts->client); in gslX680_ts_worker()
815 startup_chip(ts->client); in gslX680_ts_worker()
819 touches = ts->touch_data[ts->dd->touch_index]; in gslX680_ts_worker()
820 print_info("-----touches: %d -----\n", touches); in gslX680_ts_worker()
823 print_info("tp-gsl finger_num = %d\n", cinfo.finger_num); in gslX680_ts_worker()
825 cinfo.x[i] = join_bytes((ts->touch_data[ts->dd->x_index + 4 * i + 1] & 0xf), in gslX680_ts_worker()
826 ts->touch_data[ts->dd->x_index + 4 * i]); in gslX680_ts_worker()
827 cinfo.y[i] = join_bytes(ts->touch_data[ts->dd->y_index + 4 * i + 1], in gslX680_ts_worker()
828 ts->touch_data[ts->dd->y_index + 4 * i]); in gslX680_ts_worker()
829 print_info("tp-gsl x = %d y = %d \n", cinfo.x[i], cinfo.y[i]); in gslX680_ts_worker()
831 cinfo.finger_num = (ts->touch_data[3] << 24) | (ts->touch_data[2] << 16) in gslX680_ts_worker()
832 | (ts->touch_data[1] << 8) | (ts->touch_data[0]); in gslX680_ts_worker()
835 print_info("[tp-gsl] tmp1=%x\n", tmp1); in gslX680_ts_worker()
841 gsl_ts_write(ts->client, 0xf0, buf, 4); in gslX680_ts_worker()
848 gsl_ts_write(ts->client, 0x8, buf, 4); in gslX680_ts_worker()
860 id = cinfo.id[i]; in gslX680_ts_worker()
864 x = join_bytes((ts->touch_data[ts->dd->x_index + 4 * i + 1] & 0xf), in gslX680_ts_worker()
865 ts->touch_data[ts->dd->x_index + 4 * i]); in gslX680_ts_worker()
866 y = join_bytes(ts->touch_data[ts->dd->y_index + 4 * i + 1], in gslX680_ts_worker()
867 ts->touch_data[ts->dd->y_index + 4 * i]); in gslX680_ts_worker()
868 id = ts->touch_data[ts->dd->id_index + 4 * i] >> 4; in gslX680_ts_worker()
871 if (id >= 1 && id <= MAX_CONTACTS) { in gslX680_ts_worker()
873 filter_point(x, y, id); in gslX680_ts_worker()
875 record_point(x, y, id); in gslX680_ts_worker()
877 report_data(ts, x_new, y_new, 10, id); in gslX680_ts_worker()
878 id_state_flag[id] = 1; in gslX680_ts_worker()
884 input_mt_slot(ts->input, i); in gslX680_ts_worker()
885 input_report_abs(ts->input, ABS_MT_TRACKING_ID, -1); in gslX680_ts_worker()
886 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); in gslX680_ts_worker()
894 input_mt_sync(ts->input); in gslX680_ts_worker()
897 input_report_key(ts->input, key, 0); in gslX680_ts_worker()
898 input_sync(ts->input); in gslX680_ts_worker()
904 input_sync(ts->input); in gslX680_ts_worker()
911 enable_irq(ts->irq); in gslX680_ts_worker()
920 print_info("----------------gsl_monitor_worker-----------------\n"); in gsl_monitor_worker()
986 disable_irq_nosync(ts->irq); in gsl_ts_irq()
988 if (!work_pending(&ts->work)) in gsl_ts_irq()
989 queue_work(ts->wq, &ts->work); in gsl_ts_irq()
994 static int gslX680_ts_init(struct i2c_client *client, struct gsl_ts *ts) in gslX680_ts_init() argument
1001 ts->dd = &devices[ts->device_id]; in gslX680_ts_init()
1003 if (ts->device_id == 0) { in gslX680_ts_init()
1004 ts->dd->data_size = MAX_FINGERS * ts->dd->touch_bytes + ts->dd->touch_meta_data; in gslX680_ts_init()
1005 ts->dd->touch_index = 0; in gslX680_ts_init()
1008 ts->touch_data = devm_kzalloc(&client->dev, ts->dd->data_size, GFP_KERNEL); in gslX680_ts_init()
1009 if (!ts->touch_data) { in gslX680_ts_init()
1011 return -ENOMEM; in gslX680_ts_init()
1014 input_device = devm_input_allocate_device(&client->dev); in gslX680_ts_init()
1016 rc = -ENOMEM; in gslX680_ts_init()
1020 ts->input = input_device; in gslX680_ts_init()
1021 input_device->name = GSLX680_I2C_NAME; in gslX680_ts_init()
1022 input_device->id.bustype = BUS_I2C; in gslX680_ts_init()
1023 input_device->dev.parent = &client->dev; in gslX680_ts_init()
1027 __set_bit(EV_ABS, input_device->evbit); in gslX680_ts_init()
1028 __set_bit(EV_KEY, input_device->evbit); in gslX680_ts_init()
1029 __set_bit(EV_REP, input_device->evbit); in gslX680_ts_init()
1030 __set_bit(INPUT_PROP_DIRECT, input_device->propbit); in gslX680_ts_init()
1034 set_bit(EV_ABS, input_device->evbit); in gslX680_ts_init()
1035 set_bit(EV_KEY, input_device->evbit); in gslX680_ts_init()
1036 __set_bit(INPUT_PROP_DIRECT, input_device->propbit); in gslX680_ts_init()
1037 input_device->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); in gslX680_ts_init()
1041 input_device->evbit[0] = BIT_MASK(EV_KEY); in gslX680_ts_init()
1043 set_bit(key_array[i], input_device->keybit); in gslX680_ts_init()
1046 set_bit(ABS_MT_POSITION_X, input_device->absbit); in gslX680_ts_init()
1047 set_bit(ABS_MT_POSITION_Y, input_device->absbit); in gslX680_ts_init()
1048 set_bit(ABS_MT_TOUCH_MAJOR, input_device->absbit); in gslX680_ts_init()
1049 set_bit(ABS_MT_WIDTH_MAJOR, input_device->absbit); in gslX680_ts_init()
1056 ts->wq = create_singlethread_workqueue("kworkqueue_ts"); in gslX680_ts_init()
1057 if (!ts->wq) { in gslX680_ts_init()
1058 dev_err(&client->dev, "Could not create workqueue\n"); in gslX680_ts_init()
1061 flush_workqueue(ts->wq); in gslX680_ts_init()
1063 INIT_WORK(&ts->work, gslX680_ts_worker); in gslX680_ts_init()
1072 destroy_workqueue(ts->wq); in gslX680_ts_init()
1090 disable_irq_nosync(ts->irq); in gsl_ts_suspend()
1098 input_mt_slot(ts->input, i); in gsl_ts_suspend()
1099 input_report_abs(ts->input, ABS_MT_TRACKING_ID, -1); in gsl_ts_suspend()
1100 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); in gsl_ts_suspend()
1103 input_mt_sync(ts->input); in gsl_ts_suspend()
1105 input_sync(ts->input); in gsl_ts_suspend()
1108 input_sync(ts->input); in gsl_ts_suspend()
1123 reset_chip(ts->client); in gsl_ts_resume()
1124 startup_chip(ts->client); in gsl_ts_resume()
1125 check_mem_data(ts->client); in gsl_ts_resume()
1130 input_mt_slot(ts->input, i); in gsl_ts_resume()
1131 input_report_abs(ts->input, ABS_MT_TRACKING_ID, -1); in gsl_ts_resume()
1132 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); in gsl_ts_resume()
1135 input_mt_sync(ts->input); in gsl_ts_resume()
1137 input_sync(ts->input); in gsl_ts_resume()
1144 enable_irq(ts->irq); in gsl_ts_resume()
1154 return gsl_ts_suspend(&ts->client->dev); in gsl_ts_early_suspend()
1162 return gsl_ts_resume(&ts->client->dev); in gsl_ts_late_resume()
1166 static int gsl_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) in gsl_ts_probe() argument
1170 struct device_node *np = client->dev.of_node; in gsl_ts_probe()
1175 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in gsl_ts_probe()
1176 dev_err(&client->dev, "I2C functionality not supported\n"); in gsl_ts_probe()
1177 return -ENODEV; in gsl_ts_probe()
1179 ts = devm_kzalloc(&client->dev, sizeof(*ts), GFP_KERNEL); in gsl_ts_probe()
1181 return -ENOMEM; in gsl_ts_probe()
1184 ts->client = client; in gsl_ts_probe()
1185 i2c_set_clientdata(client, ts); in gsl_ts_probe()
1186 ts->device_id = id->driver_data; in gsl_ts_probe()
1188 ts->irq_pin = of_get_named_gpio_flags(np, "irq-gpio", 0, (enum of_gpio_flags *)&irq_flags); in gsl_ts_probe()
1189 ts->wake_pin = of_get_named_gpio_flags(np, "wake-gpio", 0, &wake_flags); in gsl_ts_probe()
1191 if (gpio_is_valid(ts->wake_pin)) { in gsl_ts_probe()
1192 …rc = devm_gpio_request_one(&client->dev, ts->wake_pin, (wake_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF_O… in gsl_ts_probe()
1194 dev_err(&client->dev, "gslX680 wake pin error\n"); in gsl_ts_probe()
1195 return -EIO; in gsl_ts_probe()
1197 g_wake_pin = ts->wake_pin; in gsl_ts_probe()
1199 dev_info(&client->dev, "wake pin invalid\n"); in gsl_ts_probe()
1201 if (gpio_is_valid(ts->irq_pin)) { in gsl_ts_probe()
1202 …rc = devm_gpio_request_one(&client->dev, ts->irq_pin, (irq_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF_OUT… in gsl_ts_probe()
1204 dev_err(&client->dev, "gslX680 irq pin error\n"); in gsl_ts_probe()
1205 return -EIO; in gsl_ts_probe()
1208 dev_info(&client->dev, "irq pin invalid\n"); in gsl_ts_probe()
1211 rc = gslX680_ts_init(client, ts); in gsl_ts_probe()
1213 dev_err(&client->dev, "GSLX680 init failed\n"); in gsl_ts_probe()
1217 gsl_client = client; in gsl_ts_probe()
1219 init_chip(ts->client); in gsl_ts_probe()
1220 check_mem_data(ts->client); in gsl_ts_probe()
1222 ts->irq = gpio_to_irq(ts->irq_pin); in gsl_ts_probe()
1223 if (ts->irq) { in gsl_ts_probe()
1224 rc = devm_request_irq(&client->dev, ts->irq, gsl_ts_irq, IRQF_TRIGGER_RISING, client->name, ts); in gsl_ts_probe()
1234 ts->tp.tp_resume = gsl_ts_late_resume; in gsl_ts_probe()
1235 ts->tp.tp_suspend = gsl_ts_early_suspend; in gsl_ts_probe()
1236 tp_register_fb(&ts->tp); in gsl_ts_probe()
1239 ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; in gsl_ts_probe()
1240 ts->early_suspend.suspend = gsl_ts_early_suspend; in gsl_ts_probe()
1241 ts->early_suspend.resume = gsl_ts_late_resume; in gsl_ts_probe()
1242 register_early_suspend(&ts->early_suspend); in gsl_ts_probe()
1268 static int gsl_ts_remove(struct i2c_client *client) in gsl_ts_remove() argument
1270 struct gsl_ts *ts = i2c_get_clientdata(client); in gsl_ts_remove()
1275 unregister_early_suspend(&ts->early_suspend); in gsl_ts_remove()
1283 device_init_wakeup(&client->dev, 0); in gsl_ts_remove()
1284 cancel_work_sync(&ts->work); in gsl_ts_remove()
1285 destroy_workqueue(ts->wq); in gsl_ts_remove()