diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-16 14:52:08 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-16 14:52:08 -0400 |
commit | 36ac1d2f323f8bf8bc10c25b88f617657720e241 (patch) | |
tree | d51f87bdf16eaa19ce0c5a682c10dccfaef4b48d /drivers/input/touchscreen | |
parent | d7a6119f457f48a94985fdbdc400cbb03e136a76 (diff) | |
parent | 4c0e799a9a6dc64426ddb6c03aea1a154357658f (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (32 commits)
Input: wm97xx - update email address for Liam Girdwood
Input: i8042 - add Thinkpad R31 to nomux list
Input: move map_to_7segment.h to include/linux
Input: ads7846 - fix cache line sharing issue
Input: cm109 - add missing newlines to messages
Input: document i8042.debug in kernel-parameters.txt
Input: keyboard - fix potential out of bound access to key_map
Input: psmouse - add OLPC touchpad driver
Input: psmouse - tweak PSMOUSE_DEFINE_ATTR to support raw set callbacks
Input: psmouse - add psmouse_queue_work() for ps/2 extension to make use of
Input: psmouse - export psmouse_set_state for ps/2 extensions to use
Input: ads7846 - introduce .gpio_pendown to get pendown state
Input: ALPS - add signature for DualPoint found in Dell Latitude E6500
Input: serio_raw - allow attaching to translated (SERIO_I8042XL) ports
Input: cm109 - don't use obsolete logging macros
Input: atkbd - expand Latitude's force release quirk to other Dells
Input: bf54x-keys - add power management support
Input: atmel_tsadcc - improve accuracy
Input: convert drivers to use strict_strtoul()
Input: appletouch - handle geyser 3/4 status bits
...
Diffstat (limited to 'drivers/input/touchscreen')
-rw-r--r-- | drivers/input/touchscreen/ads7846.c | 94 | ||||
-rw-r--r-- | drivers/input/touchscreen/atmel_tsadcc.c | 37 | ||||
-rw-r--r-- | drivers/input/touchscreen/mainstone-wm97xx.c | 5 | ||||
-rw-r--r-- | drivers/input/touchscreen/wm9705.c | 5 | ||||
-rw-r--r-- | drivers/input/touchscreen/wm9712.c | 5 | ||||
-rw-r--r-- | drivers/input/touchscreen/wm9713.c | 5 | ||||
-rw-r--r-- | drivers/input/touchscreen/wm97xx-core.c | 5 |
7 files changed, 89 insertions, 67 deletions
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 8583c766d565..b9b7fc6ff1eb 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c | |||
@@ -69,6 +69,17 @@ struct ts_event { | |||
69 | int ignore; | 69 | int ignore; |
70 | }; | 70 | }; |
71 | 71 | ||
72 | /* | ||
73 | * We allocate this separately to avoid cache line sharing issues when | ||
74 | * driver is used with DMA-based SPI controllers (like atmel_spi) on | ||
75 | * systems where main memory is not DMA-coherent (most non-x86 boards). | ||
76 | */ | ||
77 | struct ads7846_packet { | ||
78 | u8 read_x, read_y, read_z1, read_z2, pwrdown; | ||
79 | u16 dummy; /* for the pwrdown read */ | ||
80 | struct ts_event tc; | ||
81 | }; | ||
82 | |||
72 | struct ads7846 { | 83 | struct ads7846 { |
73 | struct input_dev *input; | 84 | struct input_dev *input; |
74 | char phys[32]; | 85 | char phys[32]; |
@@ -86,9 +97,7 @@ struct ads7846 { | |||
86 | u16 x_plate_ohms; | 97 | u16 x_plate_ohms; |
87 | u16 pressure_max; | 98 | u16 pressure_max; |
88 | 99 | ||
89 | u8 read_x, read_y, read_z1, read_z2, pwrdown; | 100 | struct ads7846_packet *packet; |
90 | u16 dummy; /* for the pwrdown read */ | ||
91 | struct ts_event tc; | ||
92 | 101 | ||
93 | struct spi_transfer xfer[18]; | 102 | struct spi_transfer xfer[18]; |
94 | struct spi_message msg[5]; | 103 | struct spi_message msg[5]; |
@@ -463,10 +472,11 @@ static ssize_t ads7846_disable_store(struct device *dev, | |||
463 | const char *buf, size_t count) | 472 | const char *buf, size_t count) |
464 | { | 473 | { |
465 | struct ads7846 *ts = dev_get_drvdata(dev); | 474 | struct ads7846 *ts = dev_get_drvdata(dev); |
466 | char *endp; | 475 | long i; |
467 | int i; | 476 | |
477 | if (strict_strtoul(buf, 10, &i)) | ||
478 | return -EINVAL; | ||
468 | 479 | ||
469 | i = simple_strtoul(buf, &endp, 10); | ||
470 | spin_lock_irq(&ts->lock); | 480 | spin_lock_irq(&ts->lock); |
471 | 481 | ||
472 | if (i) | 482 | if (i) |
@@ -512,16 +522,17 @@ static int get_pendown_state(struct ads7846 *ts) | |||
512 | static void ads7846_rx(void *ads) | 522 | static void ads7846_rx(void *ads) |
513 | { | 523 | { |
514 | struct ads7846 *ts = ads; | 524 | struct ads7846 *ts = ads; |
525 | struct ads7846_packet *packet = ts->packet; | ||
515 | unsigned Rt; | 526 | unsigned Rt; |
516 | u16 x, y, z1, z2; | 527 | u16 x, y, z1, z2; |
517 | 528 | ||
518 | /* ads7846_rx_val() did in-place conversion (including byteswap) from | 529 | /* ads7846_rx_val() did in-place conversion (including byteswap) from |
519 | * on-the-wire format as part of debouncing to get stable readings. | 530 | * on-the-wire format as part of debouncing to get stable readings. |
520 | */ | 531 | */ |
521 | x = ts->tc.x; | 532 | x = packet->tc.x; |
522 | y = ts->tc.y; | 533 | y = packet->tc.y; |
523 | z1 = ts->tc.z1; | 534 | z1 = packet->tc.z1; |
524 | z2 = ts->tc.z2; | 535 | z2 = packet->tc.z2; |
525 | 536 | ||
526 | /* range filtering */ | 537 | /* range filtering */ |
527 | if (x == MAX_12BIT) | 538 | if (x == MAX_12BIT) |
@@ -545,10 +556,10 @@ static void ads7846_rx(void *ads) | |||
545 | * the maximum. Don't report it to user space, repeat at least | 556 | * the maximum. Don't report it to user space, repeat at least |
546 | * once more the measurement | 557 | * once more the measurement |
547 | */ | 558 | */ |
548 | if (ts->tc.ignore || Rt > ts->pressure_max) { | 559 | if (packet->tc.ignore || Rt > ts->pressure_max) { |
549 | #ifdef VERBOSE | 560 | #ifdef VERBOSE |
550 | pr_debug("%s: ignored %d pressure %d\n", | 561 | pr_debug("%s: ignored %d pressure %d\n", |
551 | ts->spi->dev.bus_id, ts->tc.ignore, Rt); | 562 | ts->spi->dev.bus_id, packet->tc.ignore, Rt); |
552 | #endif | 563 | #endif |
553 | hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD), | 564 | hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD), |
554 | HRTIMER_MODE_REL); | 565 | HRTIMER_MODE_REL); |
@@ -641,6 +652,7 @@ static int ads7846_no_filter(void *ads, int data_idx, int *val) | |||
641 | static void ads7846_rx_val(void *ads) | 652 | static void ads7846_rx_val(void *ads) |
642 | { | 653 | { |
643 | struct ads7846 *ts = ads; | 654 | struct ads7846 *ts = ads; |
655 | struct ads7846_packet *packet = ts->packet; | ||
644 | struct spi_message *m; | 656 | struct spi_message *m; |
645 | struct spi_transfer *t; | 657 | struct spi_transfer *t; |
646 | int val; | 658 | int val; |
@@ -660,7 +672,7 @@ static void ads7846_rx_val(void *ads) | |||
660 | case ADS7846_FILTER_REPEAT: | 672 | case ADS7846_FILTER_REPEAT: |
661 | break; | 673 | break; |
662 | case ADS7846_FILTER_IGNORE: | 674 | case ADS7846_FILTER_IGNORE: |
663 | ts->tc.ignore = 1; | 675 | packet->tc.ignore = 1; |
664 | /* Last message will contain ads7846_rx() as the | 676 | /* Last message will contain ads7846_rx() as the |
665 | * completion function. | 677 | * completion function. |
666 | */ | 678 | */ |
@@ -668,7 +680,7 @@ static void ads7846_rx_val(void *ads) | |||
668 | break; | 680 | break; |
669 | case ADS7846_FILTER_OK: | 681 | case ADS7846_FILTER_OK: |
670 | *(u16 *)t->rx_buf = val; | 682 | *(u16 *)t->rx_buf = val; |
671 | ts->tc.ignore = 0; | 683 | packet->tc.ignore = 0; |
672 | m = &ts->msg[++ts->msg_idx]; | 684 | m = &ts->msg[++ts->msg_idx]; |
673 | break; | 685 | break; |
674 | default: | 686 | default: |
@@ -773,7 +785,6 @@ static void ads7846_disable(struct ads7846 *ts) | |||
773 | /* we know the chip's in lowpower mode since we always | 785 | /* we know the chip's in lowpower mode since we always |
774 | * leave it that way after every request | 786 | * leave it that way after every request |
775 | */ | 787 | */ |
776 | |||
777 | } | 788 | } |
778 | 789 | ||
779 | /* Must be called with ts->lock held */ | 790 | /* Must be called with ts->lock held */ |
@@ -849,6 +860,7 @@ static int __devinit setup_pendown(struct spi_device *spi, struct ads7846 *ts) | |||
849 | static int __devinit ads7846_probe(struct spi_device *spi) | 860 | static int __devinit ads7846_probe(struct spi_device *spi) |
850 | { | 861 | { |
851 | struct ads7846 *ts; | 862 | struct ads7846 *ts; |
863 | struct ads7846_packet *packet; | ||
852 | struct input_dev *input_dev; | 864 | struct input_dev *input_dev; |
853 | struct ads7846_platform_data *pdata = spi->dev.platform_data; | 865 | struct ads7846_platform_data *pdata = spi->dev.platform_data; |
854 | struct spi_message *m; | 866 | struct spi_message *m; |
@@ -884,14 +896,16 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
884 | return err; | 896 | return err; |
885 | 897 | ||
886 | ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL); | 898 | ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL); |
899 | packet = kzalloc(sizeof(struct ads7846_packet), GFP_KERNEL); | ||
887 | input_dev = input_allocate_device(); | 900 | input_dev = input_allocate_device(); |
888 | if (!ts || !input_dev) { | 901 | if (!ts || !packet || !input_dev) { |
889 | err = -ENOMEM; | 902 | err = -ENOMEM; |
890 | goto err_free_mem; | 903 | goto err_free_mem; |
891 | } | 904 | } |
892 | 905 | ||
893 | dev_set_drvdata(&spi->dev, ts); | 906 | dev_set_drvdata(&spi->dev, ts); |
894 | 907 | ||
908 | ts->packet = packet; | ||
895 | ts->spi = spi; | 909 | ts->spi = spi; |
896 | ts->input = input_dev; | 910 | ts->input = input_dev; |
897 | ts->vref_mv = pdata->vref_mv; | 911 | ts->vref_mv = pdata->vref_mv; |
@@ -963,13 +977,13 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
963 | spi_message_init(m); | 977 | spi_message_init(m); |
964 | 978 | ||
965 | /* y- still on; turn on only y+ (and ADC) */ | 979 | /* y- still on; turn on only y+ (and ADC) */ |
966 | ts->read_y = READ_Y(vref); | 980 | packet->read_y = READ_Y(vref); |
967 | x->tx_buf = &ts->read_y; | 981 | x->tx_buf = &packet->read_y; |
968 | x->len = 1; | 982 | x->len = 1; |
969 | spi_message_add_tail(x, m); | 983 | spi_message_add_tail(x, m); |
970 | 984 | ||
971 | x++; | 985 | x++; |
972 | x->rx_buf = &ts->tc.y; | 986 | x->rx_buf = &packet->tc.y; |
973 | x->len = 2; | 987 | x->len = 2; |
974 | spi_message_add_tail(x, m); | 988 | spi_message_add_tail(x, m); |
975 | 989 | ||
@@ -981,12 +995,12 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
981 | x->delay_usecs = pdata->settle_delay_usecs; | 995 | x->delay_usecs = pdata->settle_delay_usecs; |
982 | 996 | ||
983 | x++; | 997 | x++; |
984 | x->tx_buf = &ts->read_y; | 998 | x->tx_buf = &packet->read_y; |
985 | x->len = 1; | 999 | x->len = 1; |
986 | spi_message_add_tail(x, m); | 1000 | spi_message_add_tail(x, m); |
987 | 1001 | ||
988 | x++; | 1002 | x++; |
989 | x->rx_buf = &ts->tc.y; | 1003 | x->rx_buf = &packet->tc.y; |
990 | x->len = 2; | 1004 | x->len = 2; |
991 | spi_message_add_tail(x, m); | 1005 | spi_message_add_tail(x, m); |
992 | } | 1006 | } |
@@ -999,13 +1013,13 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
999 | 1013 | ||
1000 | /* turn y- off, x+ on, then leave in lowpower */ | 1014 | /* turn y- off, x+ on, then leave in lowpower */ |
1001 | x++; | 1015 | x++; |
1002 | ts->read_x = READ_X(vref); | 1016 | packet->read_x = READ_X(vref); |
1003 | x->tx_buf = &ts->read_x; | 1017 | x->tx_buf = &packet->read_x; |
1004 | x->len = 1; | 1018 | x->len = 1; |
1005 | spi_message_add_tail(x, m); | 1019 | spi_message_add_tail(x, m); |
1006 | 1020 | ||
1007 | x++; | 1021 | x++; |
1008 | x->rx_buf = &ts->tc.x; | 1022 | x->rx_buf = &packet->tc.x; |
1009 | x->len = 2; | 1023 | x->len = 2; |
1010 | spi_message_add_tail(x, m); | 1024 | spi_message_add_tail(x, m); |
1011 | 1025 | ||
@@ -1014,12 +1028,12 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1014 | x->delay_usecs = pdata->settle_delay_usecs; | 1028 | x->delay_usecs = pdata->settle_delay_usecs; |
1015 | 1029 | ||
1016 | x++; | 1030 | x++; |
1017 | x->tx_buf = &ts->read_x; | 1031 | x->tx_buf = &packet->read_x; |
1018 | x->len = 1; | 1032 | x->len = 1; |
1019 | spi_message_add_tail(x, m); | 1033 | spi_message_add_tail(x, m); |
1020 | 1034 | ||
1021 | x++; | 1035 | x++; |
1022 | x->rx_buf = &ts->tc.x; | 1036 | x->rx_buf = &packet->tc.x; |
1023 | x->len = 2; | 1037 | x->len = 2; |
1024 | spi_message_add_tail(x, m); | 1038 | spi_message_add_tail(x, m); |
1025 | } | 1039 | } |
@@ -1033,13 +1047,13 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1033 | spi_message_init(m); | 1047 | spi_message_init(m); |
1034 | 1048 | ||
1035 | x++; | 1049 | x++; |
1036 | ts->read_z1 = READ_Z1(vref); | 1050 | packet->read_z1 = READ_Z1(vref); |
1037 | x->tx_buf = &ts->read_z1; | 1051 | x->tx_buf = &packet->read_z1; |
1038 | x->len = 1; | 1052 | x->len = 1; |
1039 | spi_message_add_tail(x, m); | 1053 | spi_message_add_tail(x, m); |
1040 | 1054 | ||
1041 | x++; | 1055 | x++; |
1042 | x->rx_buf = &ts->tc.z1; | 1056 | x->rx_buf = &packet->tc.z1; |
1043 | x->len = 2; | 1057 | x->len = 2; |
1044 | spi_message_add_tail(x, m); | 1058 | spi_message_add_tail(x, m); |
1045 | 1059 | ||
@@ -1048,12 +1062,12 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1048 | x->delay_usecs = pdata->settle_delay_usecs; | 1062 | x->delay_usecs = pdata->settle_delay_usecs; |
1049 | 1063 | ||
1050 | x++; | 1064 | x++; |
1051 | x->tx_buf = &ts->read_z1; | 1065 | x->tx_buf = &packet->read_z1; |
1052 | x->len = 1; | 1066 | x->len = 1; |
1053 | spi_message_add_tail(x, m); | 1067 | spi_message_add_tail(x, m); |
1054 | 1068 | ||
1055 | x++; | 1069 | x++; |
1056 | x->rx_buf = &ts->tc.z1; | 1070 | x->rx_buf = &packet->tc.z1; |
1057 | x->len = 2; | 1071 | x->len = 2; |
1058 | spi_message_add_tail(x, m); | 1072 | spi_message_add_tail(x, m); |
1059 | } | 1073 | } |
@@ -1065,13 +1079,13 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1065 | spi_message_init(m); | 1079 | spi_message_init(m); |
1066 | 1080 | ||
1067 | x++; | 1081 | x++; |
1068 | ts->read_z2 = READ_Z2(vref); | 1082 | packet->read_z2 = READ_Z2(vref); |
1069 | x->tx_buf = &ts->read_z2; | 1083 | x->tx_buf = &packet->read_z2; |
1070 | x->len = 1; | 1084 | x->len = 1; |
1071 | spi_message_add_tail(x, m); | 1085 | spi_message_add_tail(x, m); |
1072 | 1086 | ||
1073 | x++; | 1087 | x++; |
1074 | x->rx_buf = &ts->tc.z2; | 1088 | x->rx_buf = &packet->tc.z2; |
1075 | x->len = 2; | 1089 | x->len = 2; |
1076 | spi_message_add_tail(x, m); | 1090 | spi_message_add_tail(x, m); |
1077 | 1091 | ||
@@ -1080,12 +1094,12 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1080 | x->delay_usecs = pdata->settle_delay_usecs; | 1094 | x->delay_usecs = pdata->settle_delay_usecs; |
1081 | 1095 | ||
1082 | x++; | 1096 | x++; |
1083 | x->tx_buf = &ts->read_z2; | 1097 | x->tx_buf = &packet->read_z2; |
1084 | x->len = 1; | 1098 | x->len = 1; |
1085 | spi_message_add_tail(x, m); | 1099 | spi_message_add_tail(x, m); |
1086 | 1100 | ||
1087 | x++; | 1101 | x++; |
1088 | x->rx_buf = &ts->tc.z2; | 1102 | x->rx_buf = &packet->tc.z2; |
1089 | x->len = 2; | 1103 | x->len = 2; |
1090 | spi_message_add_tail(x, m); | 1104 | spi_message_add_tail(x, m); |
1091 | } | 1105 | } |
@@ -1099,13 +1113,13 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1099 | spi_message_init(m); | 1113 | spi_message_init(m); |
1100 | 1114 | ||
1101 | x++; | 1115 | x++; |
1102 | ts->pwrdown = PWRDOWN; | 1116 | packet->pwrdown = PWRDOWN; |
1103 | x->tx_buf = &ts->pwrdown; | 1117 | x->tx_buf = &packet->pwrdown; |
1104 | x->len = 1; | 1118 | x->len = 1; |
1105 | spi_message_add_tail(x, m); | 1119 | spi_message_add_tail(x, m); |
1106 | 1120 | ||
1107 | x++; | 1121 | x++; |
1108 | x->rx_buf = &ts->dummy; | 1122 | x->rx_buf = &packet->dummy; |
1109 | x->len = 2; | 1123 | x->len = 2; |
1110 | CS_CHANGE(*x); | 1124 | CS_CHANGE(*x); |
1111 | spi_message_add_tail(x, m); | 1125 | spi_message_add_tail(x, m); |
@@ -1158,6 +1172,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
1158 | ts->filter_cleanup(ts->filter_data); | 1172 | ts->filter_cleanup(ts->filter_data); |
1159 | err_free_mem: | 1173 | err_free_mem: |
1160 | input_free_device(input_dev); | 1174 | input_free_device(input_dev); |
1175 | kfree(packet); | ||
1161 | kfree(ts); | 1176 | kfree(ts); |
1162 | return err; | 1177 | return err; |
1163 | } | 1178 | } |
@@ -1183,6 +1198,7 @@ static int __devexit ads7846_remove(struct spi_device *spi) | |||
1183 | if (ts->filter_cleanup) | 1198 | if (ts->filter_cleanup) |
1184 | ts->filter_cleanup(ts->filter_data); | 1199 | ts->filter_cleanup(ts->filter_data); |
1185 | 1200 | ||
1201 | kfree(ts->packet); | ||
1186 | kfree(ts); | 1202 | kfree(ts); |
1187 | 1203 | ||
1188 | dev_dbg(&spi->dev, "unregistered touchscreen\n"); | 1204 | dev_dbg(&spi->dev, "unregistered touchscreen\n"); |
diff --git a/drivers/input/touchscreen/atmel_tsadcc.c b/drivers/input/touchscreen/atmel_tsadcc.c index eee126b19e8b..a89a6a8f05e6 100644 --- a/drivers/input/touchscreen/atmel_tsadcc.c +++ b/drivers/input/touchscreen/atmel_tsadcc.c | |||
@@ -91,6 +91,9 @@ struct atmel_tsadcc { | |||
91 | char phys[32]; | 91 | char phys[32]; |
92 | struct clk *clk; | 92 | struct clk *clk; |
93 | int irq; | 93 | int irq; |
94 | unsigned int prev_absx; | ||
95 | unsigned int prev_absy; | ||
96 | unsigned char bufferedmeasure; | ||
94 | }; | 97 | }; |
95 | 98 | ||
96 | static void __iomem *tsc_base; | 99 | static void __iomem *tsc_base; |
@@ -100,10 +103,9 @@ static void __iomem *tsc_base; | |||
100 | 103 | ||
101 | static irqreturn_t atmel_tsadcc_interrupt(int irq, void *dev) | 104 | static irqreturn_t atmel_tsadcc_interrupt(int irq, void *dev) |
102 | { | 105 | { |
103 | struct input_dev *input_dev = ((struct atmel_tsadcc *)dev)->input; | 106 | struct atmel_tsadcc *ts_dev = (struct atmel_tsadcc *)dev; |
107 | struct input_dev *input_dev = ts_dev->input; | ||
104 | 108 | ||
105 | unsigned int absx; | ||
106 | unsigned int absy; | ||
107 | unsigned int status; | 109 | unsigned int status; |
108 | unsigned int reg; | 110 | unsigned int reg; |
109 | 111 | ||
@@ -121,6 +123,7 @@ static irqreturn_t atmel_tsadcc_interrupt(int irq, void *dev) | |||
121 | atmel_tsadcc_write(ATMEL_TSADCC_IER, ATMEL_TSADCC_PENCNT); | 123 | atmel_tsadcc_write(ATMEL_TSADCC_IER, ATMEL_TSADCC_PENCNT); |
122 | 124 | ||
123 | input_report_key(input_dev, BTN_TOUCH, 0); | 125 | input_report_key(input_dev, BTN_TOUCH, 0); |
126 | ts_dev->bufferedmeasure = 0; | ||
124 | input_sync(input_dev); | 127 | input_sync(input_dev); |
125 | 128 | ||
126 | } else if (status & ATMEL_TSADCC_PENCNT) { | 129 | } else if (status & ATMEL_TSADCC_PENCNT) { |
@@ -138,16 +141,23 @@ static irqreturn_t atmel_tsadcc_interrupt(int irq, void *dev) | |||
138 | } else if (status & ATMEL_TSADCC_EOC(3)) { | 141 | } else if (status & ATMEL_TSADCC_EOC(3)) { |
139 | /* Conversion finished */ | 142 | /* Conversion finished */ |
140 | 143 | ||
141 | absx = atmel_tsadcc_read(ATMEL_TSADCC_CDR3) << 10; | 144 | if (ts_dev->bufferedmeasure) { |
142 | absx /= atmel_tsadcc_read(ATMEL_TSADCC_CDR2); | 145 | /* Last measurement is always discarded, since it can |
143 | 146 | * be erroneous. | |
144 | absy = atmel_tsadcc_read(ATMEL_TSADCC_CDR1) << 10; | 147 | * Always report previous measurement */ |
145 | absy /= atmel_tsadcc_read(ATMEL_TSADCC_CDR0); | 148 | input_report_abs(input_dev, ABS_X, ts_dev->prev_absx); |
146 | 149 | input_report_abs(input_dev, ABS_Y, ts_dev->prev_absy); | |
147 | input_report_abs(input_dev, ABS_X, absx); | 150 | input_report_key(input_dev, BTN_TOUCH, 1); |
148 | input_report_abs(input_dev, ABS_Y, absy); | 151 | input_sync(input_dev); |
149 | input_report_key(input_dev, BTN_TOUCH, 1); | 152 | } else |
150 | input_sync(input_dev); | 153 | ts_dev->bufferedmeasure = 1; |
154 | |||
155 | /* Now make new measurement */ | ||
156 | ts_dev->prev_absx = atmel_tsadcc_read(ATMEL_TSADCC_CDR3) << 10; | ||
157 | ts_dev->prev_absx /= atmel_tsadcc_read(ATMEL_TSADCC_CDR2); | ||
158 | |||
159 | ts_dev->prev_absy = atmel_tsadcc_read(ATMEL_TSADCC_CDR1) << 10; | ||
160 | ts_dev->prev_absy /= atmel_tsadcc_read(ATMEL_TSADCC_CDR0); | ||
151 | } | 161 | } |
152 | 162 | ||
153 | return IRQ_HANDLED; | 163 | return IRQ_HANDLED; |
@@ -223,6 +233,7 @@ static int __devinit atmel_tsadcc_probe(struct platform_device *pdev) | |||
223 | } | 233 | } |
224 | 234 | ||
225 | ts_dev->input = input_dev; | 235 | ts_dev->input = input_dev; |
236 | ts_dev->bufferedmeasure = 0; | ||
226 | 237 | ||
227 | snprintf(ts_dev->phys, sizeof(ts_dev->phys), | 238 | snprintf(ts_dev->phys, sizeof(ts_dev->phys), |
228 | "%s/input0", pdev->dev.bus_id); | 239 | "%s/input0", pdev->dev.bus_id); |
diff --git a/drivers/input/touchscreen/mainstone-wm97xx.c b/drivers/input/touchscreen/mainstone-wm97xx.c index 37a555f37306..ba648750a8d9 100644 --- a/drivers/input/touchscreen/mainstone-wm97xx.c +++ b/drivers/input/touchscreen/mainstone-wm97xx.c | |||
@@ -3,8 +3,7 @@ | |||
3 | * Wolfson WM97xx AC97 Codecs. | 3 | * Wolfson WM97xx AC97 Codecs. |
4 | * | 4 | * |
5 | * Copyright 2004, 2007 Wolfson Microelectronics PLC. | 5 | * Copyright 2004, 2007 Wolfson Microelectronics PLC. |
6 | * Author: Liam Girdwood | 6 | * Author: Liam Girdwood <lrg@slimlogic.co.uk> |
7 | * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com | ||
8 | * Parts Copyright : Ian Molton <spyro@f2s.com> | 7 | * Parts Copyright : Ian Molton <spyro@f2s.com> |
9 | * Andrew Zabolotny <zap@homelink.ru> | 8 | * Andrew Zabolotny <zap@homelink.ru> |
10 | * | 9 | * |
@@ -296,6 +295,6 @@ module_init(mainstone_wm97xx_init); | |||
296 | module_exit(mainstone_wm97xx_exit); | 295 | module_exit(mainstone_wm97xx_exit); |
297 | 296 | ||
298 | /* Module information */ | 297 | /* Module information */ |
299 | MODULE_AUTHOR("Liam Girdwood <liam.girdwood@wolfsonmicro.com>"); | 298 | MODULE_AUTHOR("Liam Girdwood <lrg@slimlogic.co.uk>"); |
300 | MODULE_DESCRIPTION("wm97xx continuous touch driver for mainstone"); | 299 | MODULE_DESCRIPTION("wm97xx continuous touch driver for mainstone"); |
301 | MODULE_LICENSE("GPL"); | 300 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/input/touchscreen/wm9705.c b/drivers/input/touchscreen/wm9705.c index 372efbc694ff..6b5be742c27d 100644 --- a/drivers/input/touchscreen/wm9705.c +++ b/drivers/input/touchscreen/wm9705.c | |||
@@ -2,8 +2,7 @@ | |||
2 | * wm9705.c -- Codec driver for Wolfson WM9705 AC97 Codec. | 2 | * wm9705.c -- Codec driver for Wolfson WM9705 AC97 Codec. |
3 | * | 3 | * |
4 | * Copyright 2003, 2004, 2005, 2006, 2007 Wolfson Microelectronics PLC. | 4 | * Copyright 2003, 2004, 2005, 2006, 2007 Wolfson Microelectronics PLC. |
5 | * Author: Liam Girdwood | 5 | * Author: Liam Girdwood <lrg@slimlogic.co.uk> |
6 | * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com | ||
7 | * Parts Copyright : Ian Molton <spyro@f2s.com> | 6 | * Parts Copyright : Ian Molton <spyro@f2s.com> |
8 | * Andrew Zabolotny <zap@homelink.ru> | 7 | * Andrew Zabolotny <zap@homelink.ru> |
9 | * Russell King <rmk@arm.linux.org.uk> | 8 | * Russell King <rmk@arm.linux.org.uk> |
@@ -347,6 +346,6 @@ struct wm97xx_codec_drv wm9705_codec = { | |||
347 | EXPORT_SYMBOL_GPL(wm9705_codec); | 346 | EXPORT_SYMBOL_GPL(wm9705_codec); |
348 | 347 | ||
349 | /* Module information */ | 348 | /* Module information */ |
350 | MODULE_AUTHOR("Liam Girdwood <liam.girdwood@wolfsonmicro.com>"); | 349 | MODULE_AUTHOR("Liam Girdwood <lrg@slimlogic.co.uk>"); |
351 | MODULE_DESCRIPTION("WM9705 Touch Screen Driver"); | 350 | MODULE_DESCRIPTION("WM9705 Touch Screen Driver"); |
352 | MODULE_LICENSE("GPL"); | 351 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/input/touchscreen/wm9712.c b/drivers/input/touchscreen/wm9712.c index c8bb1e7335fc..7490b05c3566 100644 --- a/drivers/input/touchscreen/wm9712.c +++ b/drivers/input/touchscreen/wm9712.c | |||
@@ -2,8 +2,7 @@ | |||
2 | * wm9712.c -- Codec driver for Wolfson WM9712 AC97 Codecs. | 2 | * wm9712.c -- Codec driver for Wolfson WM9712 AC97 Codecs. |
3 | * | 3 | * |
4 | * Copyright 2003, 2004, 2005, 2006, 2007 Wolfson Microelectronics PLC. | 4 | * Copyright 2003, 2004, 2005, 2006, 2007 Wolfson Microelectronics PLC. |
5 | * Author: Liam Girdwood | 5 | * Author: Liam Girdwood <lrg@slimlogic.co.uk> |
6 | * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com | ||
7 | * Parts Copyright : Ian Molton <spyro@f2s.com> | 6 | * Parts Copyright : Ian Molton <spyro@f2s.com> |
8 | * Andrew Zabolotny <zap@homelink.ru> | 7 | * Andrew Zabolotny <zap@homelink.ru> |
9 | * Russell King <rmk@arm.linux.org.uk> | 8 | * Russell King <rmk@arm.linux.org.uk> |
@@ -462,6 +461,6 @@ struct wm97xx_codec_drv wm9712_codec = { | |||
462 | EXPORT_SYMBOL_GPL(wm9712_codec); | 461 | EXPORT_SYMBOL_GPL(wm9712_codec); |
463 | 462 | ||
464 | /* Module information */ | 463 | /* Module information */ |
465 | MODULE_AUTHOR("Liam Girdwood <liam.girdwood@wolfsonmicro.com>"); | 464 | MODULE_AUTHOR("Liam Girdwood <lrg@slimlogic.co.uk>"); |
466 | MODULE_DESCRIPTION("WM9712 Touch Screen Driver"); | 465 | MODULE_DESCRIPTION("WM9712 Touch Screen Driver"); |
467 | MODULE_LICENSE("GPL"); | 466 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/input/touchscreen/wm9713.c b/drivers/input/touchscreen/wm9713.c index 781ee83547e6..238b5132712e 100644 --- a/drivers/input/touchscreen/wm9713.c +++ b/drivers/input/touchscreen/wm9713.c | |||
@@ -2,8 +2,7 @@ | |||
2 | * wm9713.c -- Codec touch driver for Wolfson WM9713 AC97 Codec. | 2 | * wm9713.c -- Codec touch driver for Wolfson WM9713 AC97 Codec. |
3 | * | 3 | * |
4 | * Copyright 2003, 2004, 2005, 2006, 2007, 2008 Wolfson Microelectronics PLC. | 4 | * Copyright 2003, 2004, 2005, 2006, 2007, 2008 Wolfson Microelectronics PLC. |
5 | * Author: Liam Girdwood | 5 | * Author: Liam Girdwood <lrg@slimlogic.co.uk> |
6 | * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com | ||
7 | * Parts Copyright : Ian Molton <spyro@f2s.com> | 6 | * Parts Copyright : Ian Molton <spyro@f2s.com> |
8 | * Andrew Zabolotny <zap@homelink.ru> | 7 | * Andrew Zabolotny <zap@homelink.ru> |
9 | * Russell King <rmk@arm.linux.org.uk> | 8 | * Russell King <rmk@arm.linux.org.uk> |
@@ -476,6 +475,6 @@ struct wm97xx_codec_drv wm9713_codec = { | |||
476 | EXPORT_SYMBOL_GPL(wm9713_codec); | 475 | EXPORT_SYMBOL_GPL(wm9713_codec); |
477 | 476 | ||
478 | /* Module information */ | 477 | /* Module information */ |
479 | MODULE_AUTHOR("Liam Girdwood <liam.girdwood@wolfsonmicro.com>"); | 478 | MODULE_AUTHOR("Liam Girdwood <lrg@slimlogic.co.uk>"); |
480 | MODULE_DESCRIPTION("WM9713 Touch Screen Driver"); | 479 | MODULE_DESCRIPTION("WM9713 Touch Screen Driver"); |
481 | MODULE_LICENSE("GPL"); | 480 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c index d589ab0e3adc..d15aa11d7056 100644 --- a/drivers/input/touchscreen/wm97xx-core.c +++ b/drivers/input/touchscreen/wm97xx-core.c | |||
@@ -3,8 +3,7 @@ | |||
3 | * and WM9713 AC97 Codecs. | 3 | * and WM9713 AC97 Codecs. |
4 | * | 4 | * |
5 | * Copyright 2003, 2004, 2005, 2006, 2007, 2008 Wolfson Microelectronics PLC. | 5 | * Copyright 2003, 2004, 2005, 2006, 2007, 2008 Wolfson Microelectronics PLC. |
6 | * Author: Liam Girdwood | 6 | * Author: Liam Girdwood <lrg@slimlogic.co.uk> |
7 | * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com | ||
8 | * Parts Copyright : Ian Molton <spyro@f2s.com> | 7 | * Parts Copyright : Ian Molton <spyro@f2s.com> |
9 | * Andrew Zabolotny <zap@homelink.ru> | 8 | * Andrew Zabolotny <zap@homelink.ru> |
10 | * Russell King <rmk@arm.linux.org.uk> | 9 | * Russell King <rmk@arm.linux.org.uk> |
@@ -824,6 +823,6 @@ module_init(wm97xx_init); | |||
824 | module_exit(wm97xx_exit); | 823 | module_exit(wm97xx_exit); |
825 | 824 | ||
826 | /* Module information */ | 825 | /* Module information */ |
827 | MODULE_AUTHOR("Liam Girdwood <liam.girdwood@wolfsonmicro.com>"); | 826 | MODULE_AUTHOR("Liam Girdwood <lrg@slimlogic.co.uk>"); |
828 | MODULE_DESCRIPTION("WM97xx Core - Touch Screen / AUX ADC / GPIO Driver"); | 827 | MODULE_DESCRIPTION("WM97xx Core - Touch Screen / AUX ADC / GPIO Driver"); |
829 | MODULE_LICENSE("GPL"); | 828 | MODULE_LICENSE("GPL"); |