diff options
-rw-r--r-- | drivers/input/touchscreen/ads7846.c | 65 | ||||
-rw-r--r-- | include/linux/spi/ads7846.h | 8 |
2 files changed, 72 insertions, 1 deletions
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 1c9069cd3bae..103ee6ad299e 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c | |||
@@ -95,7 +95,7 @@ struct ads7846 { | |||
95 | u16 dummy; /* for the pwrdown read */ | 95 | u16 dummy; /* for the pwrdown read */ |
96 | struct ts_event tc; | 96 | struct ts_event tc; |
97 | 97 | ||
98 | struct spi_transfer xfer[10]; | 98 | struct spi_transfer xfer[18]; |
99 | struct spi_message msg[5]; | 99 | struct spi_message msg[5]; |
100 | struct spi_message *last_msg; | 100 | struct spi_message *last_msg; |
101 | int msg_idx; | 101 | int msg_idx; |
@@ -936,6 +936,24 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
936 | x->len = 2; | 936 | x->len = 2; |
937 | spi_message_add_tail(x, m); | 937 | spi_message_add_tail(x, m); |
938 | 938 | ||
939 | /* the first sample after switching drivers can be low quality; | ||
940 | * optionally discard it, using a second one after the signals | ||
941 | * have had enough time to stabilize. | ||
942 | */ | ||
943 | if (pdata->settle_delay_usecs) { | ||
944 | x->delay_usecs = pdata->settle_delay_usecs; | ||
945 | |||
946 | x++; | ||
947 | x->tx_buf = &ts->read_y; | ||
948 | x->len = 1; | ||
949 | spi_message_add_tail(x, m); | ||
950 | |||
951 | x++; | ||
952 | x->rx_buf = &ts->tc.y; | ||
953 | x->len = 2; | ||
954 | spi_message_add_tail(x, m); | ||
955 | } | ||
956 | |||
939 | m->complete = ads7846_rx_val; | 957 | m->complete = ads7846_rx_val; |
940 | m->context = ts; | 958 | m->context = ts; |
941 | 959 | ||
@@ -954,6 +972,21 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
954 | x->len = 2; | 972 | x->len = 2; |
955 | spi_message_add_tail(x, m); | 973 | spi_message_add_tail(x, m); |
956 | 974 | ||
975 | /* ... maybe discard first sample ... */ | ||
976 | if (pdata->settle_delay_usecs) { | ||
977 | x->delay_usecs = pdata->settle_delay_usecs; | ||
978 | |||
979 | x++; | ||
980 | x->tx_buf = &ts->read_x; | ||
981 | x->len = 1; | ||
982 | spi_message_add_tail(x, m); | ||
983 | |||
984 | x++; | ||
985 | x->rx_buf = &ts->tc.x; | ||
986 | x->len = 2; | ||
987 | spi_message_add_tail(x, m); | ||
988 | } | ||
989 | |||
957 | m->complete = ads7846_rx_val; | 990 | m->complete = ads7846_rx_val; |
958 | m->context = ts; | 991 | m->context = ts; |
959 | 992 | ||
@@ -973,6 +1006,21 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
973 | x->len = 2; | 1006 | x->len = 2; |
974 | spi_message_add_tail(x, m); | 1007 | spi_message_add_tail(x, m); |
975 | 1008 | ||
1009 | /* ... maybe discard first sample ... */ | ||
1010 | if (pdata->settle_delay_usecs) { | ||
1011 | x->delay_usecs = pdata->settle_delay_usecs; | ||
1012 | |||
1013 | x++; | ||
1014 | x->tx_buf = &ts->read_z1; | ||
1015 | x->len = 1; | ||
1016 | spi_message_add_tail(x, m); | ||
1017 | |||
1018 | x++; | ||
1019 | x->rx_buf = &ts->tc.z1; | ||
1020 | x->len = 2; | ||
1021 | spi_message_add_tail(x, m); | ||
1022 | } | ||
1023 | |||
976 | m->complete = ads7846_rx_val; | 1024 | m->complete = ads7846_rx_val; |
977 | m->context = ts; | 1025 | m->context = ts; |
978 | 1026 | ||
@@ -990,6 +1038,21 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
990 | x->len = 2; | 1038 | x->len = 2; |
991 | spi_message_add_tail(x, m); | 1039 | spi_message_add_tail(x, m); |
992 | 1040 | ||
1041 | /* ... maybe discard first sample ... */ | ||
1042 | if (pdata->settle_delay_usecs) { | ||
1043 | x->delay_usecs = pdata->settle_delay_usecs; | ||
1044 | |||
1045 | x++; | ||
1046 | x->tx_buf = &ts->read_z2; | ||
1047 | x->len = 1; | ||
1048 | spi_message_add_tail(x, m); | ||
1049 | |||
1050 | x++; | ||
1051 | x->rx_buf = &ts->tc.z2; | ||
1052 | x->len = 2; | ||
1053 | spi_message_add_tail(x, m); | ||
1054 | } | ||
1055 | |||
993 | m->complete = ads7846_rx_val; | 1056 | m->complete = ads7846_rx_val; |
994 | m->context = ts; | 1057 | m->context = ts; |
995 | } | 1058 | } |
diff --git a/include/linux/spi/ads7846.h b/include/linux/spi/ads7846.h index 3387e44dfd13..a44fa7a02bd9 100644 --- a/include/linux/spi/ads7846.h +++ b/include/linux/spi/ads7846.h | |||
@@ -16,6 +16,14 @@ struct ads7846_platform_data { | |||
16 | u16 vref_delay_usecs; /* 0 for external vref; etc */ | 16 | u16 vref_delay_usecs; /* 0 for external vref; etc */ |
17 | int keep_vref_on:1; /* set to keep vref on for differential | 17 | int keep_vref_on:1; /* set to keep vref on for differential |
18 | * measurements as well */ | 18 | * measurements as well */ |
19 | |||
20 | /* Settling time of the analog signals; a function of Vcc and the | ||
21 | * capacitance on the X/Y drivers. If set to non-zero, two samples | ||
22 | * are taken with settle_delay us apart, and the second one is used. | ||
23 | * ~150 uSec with 0.01uF caps. | ||
24 | */ | ||
25 | u16 settle_delay_usecs; | ||
26 | |||
19 | u16 x_plate_ohms; | 27 | u16 x_plate_ohms; |
20 | u16 y_plate_ohms; | 28 | u16 y_plate_ohms; |
21 | 29 | ||