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

44 #define GSLX680_I2C_NAME 	"gslX680-pad"
105 struct i2c_client *client; member
182 static u32 gsl_write_interface(struct i2c_client *client, const u8 reg, u8 *buf, u32 num) in gsl_write_interface() argument
188 xfer_msg[0].addr = client->addr; in gsl_write_interface()
190 xfer_msg[0].flags = client->flags & I2C_M_TEN; in gsl_write_interface()
194 return i2c_transfer(client->adapter, xfer_msg, 1) == 1 ? 0 : -EFAULT; in gsl_write_interface()
197 static int gsl_ts_write(struct i2c_client *client, u8 addr, u8 *pdata, int datalen) in gsl_ts_write() argument
204 dev_err(&client->dev,"%s too big datalen = %d!\n", __func__, datalen); in gsl_ts_write()
205 return -1; in gsl_ts_write()
217 ret = i2c_master_send(client, tmp_buf, bytelen); in gsl_ts_write()
221 static int gsl_ts_read(struct i2c_client *client, u8 addr, u8 *pdata, unsigned int datalen) in gsl_ts_read() argument
227 dev_err(&client->dev, "%s too big datalen = %d!\n", __func__, datalen); in gsl_ts_read()
228 return -1; in gsl_ts_read()
231 ret = gsl_ts_write(client, addr, NULL, 0); in gsl_ts_read()
234 dev_err(&client->dev, "%s set data address fail!\n", __func__); in gsl_ts_read()
238 return i2c_master_recv(client, pdata, datalen); in gsl_ts_read()
247 static void gsl_load_fw(struct i2c_client *client) in gsl_load_fw() argument
257 ptr_fw = ts->gsl_chip_info->ptr_fw; in gsl_load_fw()
259 source_len = ts->gsl_chip_info->ptr_fw_len; in gsl_load_fw()
266 gsl_write_interface(client, GSL_PAGE_REG, buf, 4); in gsl_load_fw()
267 //i2c_smbus_write_i2c_block_data(client, GSL_PAGE_REG,4, buf); in gsl_load_fw()
280 gsl_write_interface(client, buf[0], buf, cur - buf - 1); in gsl_load_fw()
281 //i2c_smbus_write_i2c_block_data(client, buf[0], cur - buf - 1, buf); in gsl_load_fw()
290 static int test_i2c(struct i2c_client *client) in test_i2c() argument
296 ret = gsl_ts_read( client, 0xf0, &read_buf, sizeof(read_buf) ); in test_i2c()
298 rc --; in test_i2c()
300 dev_info(&client->dev, "I read reg 0xf0 is %x\n", read_buf); in test_i2c()
303 ret = gsl_ts_write(client, 0xf0, &write_buf, sizeof(write_buf)); in test_i2c()
305 dev_info(&client->dev, "I write reg 0xf0 0x12\n"); in test_i2c()
308 ret = gsl_ts_read( client, 0xf0, &read_buf, sizeof(read_buf) ); in test_i2c()
310 rc --; in test_i2c()
312 dev_info(&client->dev, "I read reg 0xf0 is 0x%x\n", read_buf); in test_i2c()
318 static void startup_chip(struct i2c_client *client) in startup_chip() argument
323 struct gsl_ts *ts = i2c_get_clientdata(client); in startup_chip()
324 gsl_DataInit(ts->gsl_chip_info->conf_in); in startup_chip()
326 gsl_ts_write(client, 0xe0, &tmp, 1); in startup_chip()
329 static void reset_chip(struct i2c_client *client) in reset_chip() argument
334 gsl_ts_write(client, 0xe0, &tmp, sizeof(tmp)); in reset_chip()
337 gsl_ts_write(client, 0xe4, &tmp, sizeof(tmp)); in reset_chip()
339 gsl_ts_write(client, 0xbc, buf, sizeof(buf)); in reset_chip()
342 static void clr_reg(struct i2c_client *client) in clr_reg() argument
347 gsl_ts_write(client, 0xe0, &write_buf[0], 1); in clr_reg()
350 gsl_ts_write(client, 0x80, &write_buf[0], 1); in clr_reg()
353 gsl_ts_write(client, 0xe4, &write_buf[0], 1); in clr_reg()
356 gsl_ts_write(client, 0xe0, &write_buf[0], 1); in clr_reg()
360 static void init_chip(struct i2c_client *client) in init_chip() argument
363 struct gsl_ts *ts = i2c_get_clientdata(client); in init_chip()
370 rc = test_i2c(client); in init_chip()
373 dev_err(&client->dev, "------gslX680 test_i2c error------\n"); in init_chip()
376 queue_work(ts->wq, &ts->download_fw_work); in init_chip()
379 static void check_mem_data(struct i2c_client *client) in check_mem_data() argument
383 gsl_ts_read(client,0xb0, read_buf, sizeof(read_buf)); in check_mem_data()
387 …dev_info(&client->dev, "#########check mem read 0xb0 = %x %x %x %x #########\n", read_buf[3], read… in check_mem_data()
388 init_chip(client); in check_mem_data()
397 return (ch-'0'); in char_to_int()
399 return (ch-'a'+10); in char_to_int()
403 static int gsl_read_interface(struct i2c_client *client, u8 reg, u8 *buf, u32 num) in gsl_read_interface() argument
412 i2c_master_send(client,&temp,1); in gsl_read_interface()
413 err = i2c_master_recv(client,&buf[0],4); in gsl_read_interface()
416 i2c_master_send(client,&temp,1); in gsl_read_interface()
417 err = i2c_master_recv(client,&buf[0],4); in gsl_read_interface()
419 i2c_master_send(client,&reg,1); in gsl_read_interface()
420 err = i2c_master_recv(client,&buf[0],num); in gsl_read_interface()
471 print_info("[tp-gsl][%s] \n",__func__); in gsl_config_write_proc()
475 return -EFAULT; in gsl_config_write_proc()
524 else if('i'==temp_buf[0]&&'d'==temp_buf[1])//write id config // in gsl_config_write_proc()
528 if(tmp1>=0 && tmp1<ts->gsl_chip_info->conf_in_len) in gsl_config_write_proc()
530 ts->gsl_chip_info->conf_in[tmp1] = tmp; in gsl_config_write_proc()
552 static void filter_point(u16 x, u16 y , u8 id) in filter_point() argument
558 id_sign[id] = id_sign[id] + 1; in filter_point()
559 if(id_sign[id] == 1) in filter_point()
561 x_old[id] = x; in filter_point()
562 y_old[id] = y; in filter_point()
565 x_err = x > x_old[id] ? (x -x_old[id]) : (x_old[id] - x); in filter_point()
566 y_err = y > y_old[id] ? (y -y_old[id]) : (y_old[id] - y); in filter_point()
597 x_new = x > x_old[id] ? (x_old[id] + filter_step_x) : (x_old[id] - filter_step_x); in filter_point()
598 y_new = y > y_old[id] ? (y_old[id] + filter_step_y) : (y_old[id] - filter_step_y); in filter_point()
600 x_old[id] = x_new; in filter_point()
601 y_old[id] = y_new; in filter_point()
604 static void record_point(u16 x, u16 y , u8 id) in record_point() argument
609 id_sign[id]=id_sign[id]+1; in record_point()
611 if(id_sign[id]==1){ in record_point()
612 x_old[id]=x; in record_point()
613 y_old[id]=y; in record_point()
616 x = (x_old[id] + x)/2; in record_point()
617 y = (y_old[id] + y)/2; in record_point()
619 if(x>x_old[id]){ in record_point()
620 x_err=x -x_old[id]; in record_point()
623 x_err=x_old[id]-x; in record_point()
626 if(y>y_old[id]){ in record_point()
627 y_err=y -y_old[id]; in record_point()
630 y_err=y_old[id]-y; in record_point()
634 x_new = x; x_old[id] = x; in record_point()
635 y_new = y; y_old[id] = y; in record_point()
639 x_new = x; x_old[id] = x; in record_point()
642 x_new = x_old[id]; in record_point()
644 y_new = y; y_old[id] = y; in record_point()
647 y_new = y_old[id]; in record_point()
650 if(id_sign[id]==1){ in record_point()
651 x_new= x_old[id]; in record_point()
652 y_new= y_old[id]; in record_point()
658 static void report_data(struct gsl_ts *ts, u16 x, u16 y, u8 pressure, u8 id) in report_data() argument
664 if(x > ts->screen_max_x || y > ts->screen_max_y) in report_data()
670 x = ts->screen_max_x-x; in report_data()
672 y = ts->screen_max_y-y; in report_data()
676 input_mt_slot(ts->input, id); in report_data()
677 input_report_abs(ts->input, ABS_MT_TRACKING_ID, id); in report_data()
678 input_report_abs(ts->input, ABS_MT_TOUCH_MAJOR, pressure); in report_data()
679 input_report_abs(ts->input, ABS_MT_POSITION_X, x); in report_data()
680 input_report_abs(ts->input, ABS_MT_POSITION_Y, y); in report_data()
681 input_report_abs(ts->input, ABS_MT_WIDTH_MAJOR, 1); in report_data()
683 input_report_abs(ts->input, ABS_MT_TRACKING_ID, id); in report_data()
684 input_report_abs(ts->input, ABS_MT_TOUCH_MAJOR, pressure); in report_data()
685 input_report_abs(ts->input, ABS_MT_POSITION_X,x); in report_data()
686 input_report_abs(ts->input, ABS_MT_POSITION_Y, y); in report_data()
687 input_report_abs(ts->input, ABS_MT_WIDTH_MAJOR, 1); in report_data()
688 input_mt_sync(ts->input); in report_data()
695 u8 id, touches; in gslX680_ts_worker() local
709 rc = gsl_ts_read(ts->client, 0x80, ts->touch_data, ts->dd->data_size); in gslX680_ts_worker()
712 dev_err(&ts->client->dev, "read failed\n"); in gslX680_ts_worker()
713 reset_chip(ts->client); in gslX680_ts_worker()
714 startup_chip(ts->client); in gslX680_ts_worker()
718 touches = ts->touch_data[ts->dd->touch_index]; in gslX680_ts_worker()
723 cinfo.x[i] = join_bytes( ( ts->touch_data[ts->dd->x_index + 4 * i + 1] & 0xf), in gslX680_ts_worker()
724 ts->touch_data[ts->dd->x_index + 4 * i]); in gslX680_ts_worker()
725 cinfo.y[i] = join_bytes(ts->touch_data[ts->dd->y_index + 4 * i + 1], in gslX680_ts_worker()
726 ts->touch_data[ts->dd->y_index + 4 * i ]); in gslX680_ts_worker()
727 cinfo.id[i] = ((ts->touch_data[ts->dd->x_index + 4 * i + 1] & 0xf0)>>4); in gslX680_ts_worker()
729 cinfo.finger_num=(ts->touch_data[3]<<24)|(ts->touch_data[2]<<16) in gslX680_ts_worker()
730 |(ts->touch_data[1]<<8)|(ts->touch_data[0]); in gslX680_ts_worker()
736 gsl_ts_write(ts->client,0xf0,buf,4); in gslX680_ts_worker()
741 gsl_ts_write(ts->client,0x8,buf,4); in gslX680_ts_worker()
756 id = cinfo.id[i]; in gslX680_ts_worker()
762 x = join_bytes( ( ts->touch_data[ts->dd->x_index + 4 * i + 1] & 0xf), in gslX680_ts_worker()
763 ts->touch_data[ts->dd->x_index + 4 * i]); in gslX680_ts_worker()
764 y = join_bytes(ts->touch_data[ts->dd->y_index + 4 * i + 1], in gslX680_ts_worker()
765 ts->touch_data[ts->dd->y_index + 4 * i ]); in gslX680_ts_worker()
766 id = ts->touch_data[ts->dd->id_index + 4 * i] >> 4; in gslX680_ts_worker()
769 if(1 <=id && id <= MAX_CONTACTS) in gslX680_ts_worker()
772 filter_point(x, y ,id); in gslX680_ts_worker()
774 record_point(x, y , id); in gslX680_ts_worker()
776 //report_data(ts, x_new, y_new, 10, id); in gslX680_ts_worker()
777 report_data(ts, x, y, 10, id); in gslX680_ts_worker()
779 id_state_flag[id] = 1; in gslX680_ts_worker()
787 input_mt_slot(ts->input, i); in gslX680_ts_worker()
788 input_report_abs(ts->input, ABS_MT_TRACKING_ID, -1); in gslX680_ts_worker()
789 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); in gslX680_ts_worker()
798 input_mt_sync(ts->input); in gslX680_ts_worker()
801 input_sync(ts->input); in gslX680_ts_worker()
804 enable_irq(ts->irq); in gslX680_ts_worker()
812 disable_irq_nosync(ts->irq); in gsl_ts_irq()
814 if (!work_pending(&ts->work)) in gsl_ts_irq()
816 queue_work(ts->wq, &ts->work); in gsl_ts_irq()
823 static int gslX680_ts_init(struct i2c_client *client, struct gsl_ts *ts) in gslX680_ts_init() argument
828 ts->dd = &devices[ts->device_id]; in gslX680_ts_init()
830 if (ts->device_id == 0) { in gslX680_ts_init()
831 ts->dd->data_size = MAX_FINGERS * ts->dd->touch_bytes + ts->dd->touch_meta_data; in gslX680_ts_init()
832 ts->dd->touch_index = 0; in gslX680_ts_init()
835 ts->touch_data = kzalloc(ts->dd->data_size, GFP_KERNEL); in gslX680_ts_init()
836 if (!ts->touch_data) { in gslX680_ts_init()
838 return -ENOMEM; in gslX680_ts_init()
843 rc = -ENOMEM; in gslX680_ts_init()
847 ts->input = input_device; in gslX680_ts_init()
848 input_device->name = GSLX680_I2C_NAME; in gslX680_ts_init()
849 input_device->id.bustype = BUS_I2C; in gslX680_ts_init()
850 input_device->dev.parent = &client->dev; in gslX680_ts_init()
854 __set_bit(EV_ABS, input_device->evbit); in gslX680_ts_init()
855 __set_bit(EV_KEY, input_device->evbit); in gslX680_ts_init()
856 __set_bit(EV_REP, input_device->evbit); in gslX680_ts_init()
857 __set_bit(INPUT_PROP_DIRECT, input_device->propbit); in gslX680_ts_init()
861 set_bit(EV_ABS, input_device->evbit); in gslX680_ts_init()
862 set_bit(EV_KEY, input_device->evbit); in gslX680_ts_init()
863 __set_bit(INPUT_PROP_DIRECT, input_device->propbit); in gslX680_ts_init()
864 input_device->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); in gslX680_ts_init()
867 set_bit(ABS_MT_POSITION_X, input_device->absbit); in gslX680_ts_init()
868 set_bit(ABS_MT_POSITION_Y, input_device->absbit); in gslX680_ts_init()
869 set_bit(ABS_MT_TOUCH_MAJOR, input_device->absbit); in gslX680_ts_init()
870 set_bit(ABS_MT_WIDTH_MAJOR, input_device->absbit); in gslX680_ts_init()
872 input_set_abs_params(input_device,ABS_MT_POSITION_X, 0, ts->screen_max_x, 0, 0); in gslX680_ts_init()
873 input_set_abs_params(input_device,ABS_MT_POSITION_Y, 0, ts->screen_max_y, 0, 0); in gslX680_ts_init()
877 ts->wq = create_singlethread_workqueue("kworkqueue_ts"); in gslX680_ts_init()
878 if (!ts->wq) { in gslX680_ts_init()
879 dev_err(&client->dev, "Could not create workqueue\n"); in gslX680_ts_init()
882 flush_workqueue(ts->wq); in gslX680_ts_init()
883 INIT_WORK(&ts->work, gslX680_ts_worker); in gslX680_ts_init()
890 destroy_workqueue(ts->wq); in gslX680_ts_init()
894 kfree(ts->touch_data); in gslX680_ts_init()
907 disable_irq_nosync(ts->irq); in gsl_ts_suspend()
915 input_mt_slot(ts->input, i); in gsl_ts_suspend()
916 input_report_abs(ts->input, ABS_MT_TRACKING_ID, -1); in gsl_ts_suspend()
917 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); in gsl_ts_suspend()
920 input_mt_sync(ts->input); in gsl_ts_suspend()
922 input_sync(ts->input); in gsl_ts_suspend()
925 input_sync(ts->input); in gsl_ts_suspend()
935 queue_work(ts->wq, &ts->resume_work); in gsl_ts_resume()
944 gsl_ts_suspend(&ts->client->dev); in gsl_ts_early_suspend()
953 gsl_ts_resume(&ts->client->dev); in gsl_ts_late_resume()
960 struct gsl_ts *ts = dev_get_drvdata(&gsl_client->dev); in gsl_download_fw_work()
962 clr_reg(ts->client); in gsl_download_fw_work()
963 reset_chip(ts->client); in gsl_download_fw_work()
964 gsl_load_fw(ts->client); in gsl_download_fw_work()
965 startup_chip(ts->client); in gsl_download_fw_work()
966 reset_chip(ts->client); in gsl_download_fw_work()
967 startup_chip(ts->client); in gsl_download_fw_work()
972 struct gsl_ts *ts = dev_get_drvdata(&gsl_client->dev); in gsl_resume_work()
980 //reset_chip(ts->client); in gsl_resume_work()
981 //startup_chip(ts->client); in gsl_resume_work()
982 check_mem_data(ts->client); in gsl_resume_work()
983 check_mem_data(ts->client); in gsl_resume_work()
989 input_mt_slot(ts->input, i); in gsl_resume_work()
990 input_report_abs(ts->input, ABS_MT_TRACKING_ID, -1); in gsl_resume_work()
991 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); in gsl_resume_work()
994 input_mt_sync(ts->input); in gsl_resume_work()
996 input_sync(ts->input); in gsl_resume_work()
998 enable_irq(ts->irq); in gsl_resume_work()
1001 static int gsl_ts_probe(struct i2c_client *client, in gsl_ts_probe() argument
1002 const struct i2c_device_id *id) in gsl_ts_probe() argument
1004 struct device_node *np = client->dev.of_node; in gsl_ts_probe()
1013 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in gsl_ts_probe()
1014 dev_err(&client->dev, "I2C functionality not supported\n"); in gsl_ts_probe()
1015 return -ENODEV; in gsl_ts_probe()
1020 return -ENOMEM; in gsl_ts_probe()
1022 ts->client = client; in gsl_ts_probe()
1023 i2c_set_clientdata(client, ts); in gsl_ts_probe()
1024 ts->device_id = id->driver_data; in gsl_ts_probe()
1027 of_property_read_u32(np,"screen_max_x",&(ts->screen_max_x)); in gsl_ts_probe()
1028 of_property_read_u32(np,"screen_max_y",&(ts->screen_max_y)); in gsl_ts_probe()
1030 dev_info(&ts->client->dev, "[tp-gsl] screen_max_x =[%d] \n",ts->screen_max_x); in gsl_ts_probe()
1031 dev_info(&ts->client->dev, "[tp-gsl] screen_max_y =[%d] \n",ts->screen_max_y); in gsl_ts_probe()
1037 dev_info(&ts->client->dev, "[tp-gsl] revert_x =[%d] \n",revert_x); in gsl_ts_probe()
1038 dev_info(&ts->client->dev, "[tp-gsl] revert_y =[%d] \n",revert_y); in gsl_ts_probe()
1039 dev_info(&ts->client->dev, "[tp-gsl] revert_xy =[%d] \n",revert_xy); in gsl_ts_probe()
1041 ts->irq_pin=of_get_named_gpio_flags(np, "touch-gpio", 0, &irq_flags); in gsl_ts_probe()
1042 ts->wake_pin=of_get_named_gpio_flags(np, "reset-gpio", 0, &wake_flags); in gsl_ts_probe()
1048 dev_info(&ts->client->dev, "[tp-gsl] gsl_chip_id =[%d] \n",gsl_chip_id); in gsl_ts_probe()
1051 ts->gsl_chip_info = &gsl_chip_info[i]; in gsl_ts_probe()
1056 if (gpio_is_valid(ts->wake_pin)) { in gsl_ts_probe()
1057 …rc = devm_gpio_request_one(&ts->client->dev, ts->wake_pin, (wake_flags & OF_GPIO_ACTIVE_LOW) ? GPI… in gsl_ts_probe()
1059 dev_err(&ts->client->dev, "gslX680 wake pin error\n"); in gsl_ts_probe()
1060 return -EIO; in gsl_ts_probe()
1062 g_wake_pin = ts->wake_pin; in gsl_ts_probe()
1064 dev_info(&ts->client->dev, "wake pin invalid\n"); in gsl_ts_probe()
1066 if (gpio_is_valid(ts->irq_pin)) { in gsl_ts_probe()
1067 …rc = devm_gpio_request_one(&ts->client->dev, ts->irq_pin, (irq_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF… in gsl_ts_probe()
1069 dev_err(&ts->client->dev, "gslX680 irq pin error\n"); in gsl_ts_probe()
1070 return -EIO; in gsl_ts_probe()
1072 g_irq_pin = ts->irq_pin; in gsl_ts_probe()
1074 dev_info(&ts->client->dev, "irq pin invalid\n"); in gsl_ts_probe()
1077 INIT_WORK(&ts->download_fw_work, gsl_download_fw_work); in gsl_ts_probe()
1078 INIT_WORK(&ts->resume_work, gsl_resume_work); in gsl_ts_probe()
1081 rc = gslX680_ts_init(client, ts); in gsl_ts_probe()
1083 dev_err(&client->dev, "GSLX680 init failed\n"); in gsl_ts_probe()
1087 gsl_client = client; in gsl_ts_probe()
1088 init_chip(ts->client); in gsl_ts_probe()
1089 check_mem_data(ts->client); in gsl_ts_probe()
1091 ts->irq=gpio_to_irq(ts->irq_pin); //If not defined in client in gsl_ts_probe()
1092 if (ts->irq) in gsl_ts_probe()
1094 …rc = devm_request_threaded_irq(&client->dev, ts->irq, NULL, gsl_ts_irq, irq_flags | IRQF_ONESHOT, in gsl_ts_probe()
1096 dev_err(&client->dev, "Cannot allocate ts INT!ERRNO:%d\n", rc); in gsl_ts_probe()
1099 disable_irq(ts->irq); in gsl_ts_probe()
1103 dev_err(&client->dev, "gsl x680 irq req fail\n"); in gsl_ts_probe()
1113 gpio_set_value(ts->irq_pin, 0); in gsl_ts_probe()
1114 enable_irq(ts->irq); in gsl_ts_probe()
1116 ts->tp.tp_resume = gsl_ts_late_resume; in gsl_ts_probe()
1117 ts->tp.tp_suspend = gsl_ts_early_suspend; in gsl_ts_probe()
1118 tp_register_fb(&ts->tp); in gsl_ts_probe()
1124 free_irq(ts->irq, ts); in gsl_ts_probe()
1127 input_free_device(ts->input); in gsl_ts_probe()
1132 static int gsl_ts_remove(struct i2c_client *client) in gsl_ts_remove() argument
1134 struct gsl_ts *ts = i2c_get_clientdata(client); in gsl_ts_remove()
1136 device_init_wakeup(&client->dev, 0); in gsl_ts_remove()
1137 cancel_work_sync(&ts->work); in gsl_ts_remove()
1138 free_irq(ts->irq, ts); in gsl_ts_remove()
1139 destroy_workqueue(ts->wq); in gsl_ts_remove()
1140 input_unregister_device(ts->input); in gsl_ts_remove()
1142 kfree(ts->touch_data); in gsl_ts_remove()
1149 {.compatible = "gslX680-pad"},