aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSemih Hazar <semih.hazar@indefia.com>2007-07-18 00:35:56 -0400
committerDmitry Torokhov <dtor@insightbb.com>2007-07-18 00:35:56 -0400
commite4f48861993294c27849076741eb0c090482560b (patch)
tree667d35586e7e7a4dc561f5b24bb8694ead7e2719
parent4994cd8dadcf9d484ab3ec19f3c7c7a4e5353c1c (diff)
Input: ads7846 - introduce sample settling delay
The ads7846 driver has support for filtering, but when the chip gets deselected between samples this causes noise. This patch adds support for an optional settling delay time, so that two consecutive samples will be taken with the specified delay time apart. This ensures that the chip won't be deselected, so the noise won't appear. Filtering can still be done, but will have less work to do since each time a new sample is taken the same delay applies. Signed-off-by: Semih Hazar <semih.hazar@indefia.com> Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
-rw-r--r--drivers/input/touchscreen/ads7846.c65
-rw-r--r--include/linux/spi/ads7846.h8
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