Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: edt-ft5x06 - add offset support for ev-ft5726

Unfortunately the evervision focaltech implementation uses two offset
registers, one for the x coordinate and one for y.

This patch extends the driver to handle those offset registers only for
devices that support these.

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

Marco Felsch and committed by
Dmitry Torokhov
b6eba860 2ebc1919

+55
+9
Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.txt
··· 44 44 45 45 - offset: allows setting the edge compensation in the range from 46 46 0 to 31. 47 + 48 + - offset-x: Same as offset, but applies only to the horizontal position. 49 + Range from 0 to 80, only supported by evervision,ev-ft5726 50 + devices. 51 + 52 + - offset-y: Same as offset, but applies only to the vertical position. 53 + Range from 0 to 80, only supported by evervision,ev-ft5726 54 + devices. 55 + 47 56 - touchscreen-size-x : See touchscreen.txt 48 57 - touchscreen-size-y : See touchscreen.txt 49 58 - touchscreen-fuzz-x : See touchscreen.txt
+46
drivers/input/touchscreen/edt-ft5x06.c
··· 56 56 57 57 #define EV_REGISTER_THRESHOLD 0x40 58 58 #define EV_REGISTER_GAIN 0x41 59 + #define EV_REGISTER_OFFSET_Y 0x45 60 + #define EV_REGISTER_OFFSET_X 0x46 59 61 60 62 #define NO_REGISTER 0xff 61 63 ··· 88 86 int reg_report_rate; 89 87 int reg_gain; 90 88 int reg_offset; 89 + int reg_offset_x; 90 + int reg_offset_y; 91 91 int reg_num_x; 92 92 int reg_num_y; 93 93 }; ··· 115 111 int threshold; 116 112 int gain; 117 113 int offset; 114 + int offset_x; 115 + int offset_y; 118 116 int report_rate; 119 117 int max_support_points; 120 118 ··· 514 508 /* m06, m09: range 0-31, m12: range 0-16 */ 515 509 static EDT_ATTR(offset, S_IWUSR | S_IRUGO, WORK_REGISTER_OFFSET, 516 510 M09_REGISTER_OFFSET, NO_REGISTER, 0, 31); 511 + /* m06, m09, m12: no supported, ev_ft: range 0-80 */ 512 + static EDT_ATTR(offset_x, S_IWUSR | S_IRUGO, NO_REGISTER, NO_REGISTER, 513 + EV_REGISTER_OFFSET_X, 0, 80); 514 + /* m06, m09, m12: no supported, ev_ft: range 0-80 */ 515 + static EDT_ATTR(offset_y, S_IWUSR | S_IRUGO, NO_REGISTER, NO_REGISTER, 516 + EV_REGISTER_OFFSET_Y, 0, 80); 517 517 /* m06: range 20 to 80, m09: range 0 to 30, m12: range 1 to 255... */ 518 518 static EDT_ATTR(threshold, S_IWUSR | S_IRUGO, WORK_REGISTER_THRESHOLD, 519 519 M09_REGISTER_THRESHOLD, EV_REGISTER_THRESHOLD, 0, 255); ··· 530 518 static struct attribute *edt_ft5x06_attrs[] = { 531 519 &edt_ft5x06_attr_gain.dattr.attr, 532 520 &edt_ft5x06_attr_offset.dattr.attr, 521 + &edt_ft5x06_attr_offset_x.dattr.attr, 522 + &edt_ft5x06_attr_offset_y.dattr.attr, 533 523 &edt_ft5x06_attr_threshold.dattr.attr, 534 524 &edt_ft5x06_attr_report_rate.dattr.attr, 535 525 NULL ··· 646 632 if (reg_addr->reg_offset != NO_REGISTER) 647 633 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, 648 634 tsdata->offset); 635 + if (reg_addr->reg_offset_x != NO_REGISTER) 636 + edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_x, 637 + tsdata->offset_x); 638 + if (reg_addr->reg_offset_y != NO_REGISTER) 639 + edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_y, 640 + tsdata->offset_y); 649 641 if (reg_addr->reg_report_rate != NO_REGISTER) 650 642 edt_ft5x06_register_write(tsdata, reg_addr->reg_report_rate, 651 643 tsdata->report_rate); ··· 957 937 edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, val); 958 938 tsdata->offset = val; 959 939 } 940 + 941 + error = device_property_read_u32(dev, "offset-x", &val); 942 + if (!error) { 943 + edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_x, val); 944 + tsdata->offset_x = val; 945 + } 946 + 947 + error = device_property_read_u32(dev, "offset-y", &val); 948 + if (!error) { 949 + edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_y, val); 950 + tsdata->offset_y = val; 951 + } 960 952 } 961 953 962 954 static void ··· 982 950 if (reg_addr->reg_offset != NO_REGISTER) 983 951 tsdata->offset = 984 952 edt_ft5x06_register_read(tsdata, reg_addr->reg_offset); 953 + if (reg_addr->reg_offset_x != NO_REGISTER) 954 + tsdata->offset_x = edt_ft5x06_register_read(tsdata, 955 + reg_addr->reg_offset_x); 956 + if (reg_addr->reg_offset_y != NO_REGISTER) 957 + tsdata->offset_y = edt_ft5x06_register_read(tsdata, 958 + reg_addr->reg_offset_y); 985 959 if (reg_addr->reg_report_rate != NO_REGISTER) 986 960 tsdata->report_rate = edt_ft5x06_register_read(tsdata, 987 961 reg_addr->reg_report_rate); ··· 1015 977 reg_addr->reg_report_rate = WORK_REGISTER_REPORT_RATE; 1016 978 reg_addr->reg_gain = WORK_REGISTER_GAIN; 1017 979 reg_addr->reg_offset = WORK_REGISTER_OFFSET; 980 + reg_addr->reg_offset_x = NO_REGISTER; 981 + reg_addr->reg_offset_y = NO_REGISTER; 1018 982 reg_addr->reg_num_x = WORK_REGISTER_NUM_X; 1019 983 reg_addr->reg_num_y = WORK_REGISTER_NUM_Y; 1020 984 break; ··· 1027 987 reg_addr->reg_report_rate = NO_REGISTER; 1028 988 reg_addr->reg_gain = M09_REGISTER_GAIN; 1029 989 reg_addr->reg_offset = M09_REGISTER_OFFSET; 990 + reg_addr->reg_offset_x = NO_REGISTER; 991 + reg_addr->reg_offset_y = NO_REGISTER; 1030 992 reg_addr->reg_num_x = M09_REGISTER_NUM_X; 1031 993 reg_addr->reg_num_y = M09_REGISTER_NUM_Y; 1032 994 break; ··· 1037 995 reg_addr->reg_threshold = EV_REGISTER_THRESHOLD; 1038 996 reg_addr->reg_gain = EV_REGISTER_GAIN; 1039 997 reg_addr->reg_offset = NO_REGISTER; 998 + reg_addr->reg_offset_x = EV_REGISTER_OFFSET_X; 999 + reg_addr->reg_offset_y = EV_REGISTER_OFFSET_Y; 1040 1000 reg_addr->reg_num_x = NO_REGISTER; 1041 1001 reg_addr->reg_num_y = NO_REGISTER; 1042 1002 reg_addr->reg_report_rate = NO_REGISTER; ··· 1049 1005 reg_addr->reg_threshold = M09_REGISTER_THRESHOLD; 1050 1006 reg_addr->reg_gain = M09_REGISTER_GAIN; 1051 1007 reg_addr->reg_offset = M09_REGISTER_OFFSET; 1008 + reg_addr->reg_offset_x = NO_REGISTER; 1009 + reg_addr->reg_offset_y = NO_REGISTER; 1052 1010 break; 1053 1011 } 1054 1012 }