aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/input/touchscreen/ads7846.c30
-rw-r--r--include/linux/spi/ads7846.h2
2 files changed, 19 insertions, 13 deletions
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
index 03e527c16c23..c34e59b720a6 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -145,15 +145,16 @@ struct ads7846 {
145#define MAX_12BIT ((1<<12)-1) 145#define MAX_12BIT ((1<<12)-1)
146 146
147/* leave ADC powered up (disables penirq) between differential samples */ 147/* leave ADC powered up (disables penirq) between differential samples */
148#define READ_12BIT_DFR(x) (ADS_START | ADS_A2A1A0_d_ ## x \ 148#define READ_12BIT_DFR(x, adc, vref) (ADS_START | ADS_A2A1A0_d_ ## x \
149 | ADS_12_BIT | ADS_DFR) 149 | ADS_12_BIT | ADS_DFR | \
150 (adc ? ADS_PD10_ADC_ON : 0) | (vref ? ADS_PD10_REF_ON : 0))
150 151
151#define READ_Y (READ_12BIT_DFR(y) | ADS_PD10_ADC_ON) 152#define READ_Y(vref) (READ_12BIT_DFR(y, 1, vref))
152#define READ_Z1 (READ_12BIT_DFR(z1) | ADS_PD10_ADC_ON) 153#define READ_Z1(vref) (READ_12BIT_DFR(z1, 1, vref))
153#define READ_Z2 (READ_12BIT_DFR(z2) | ADS_PD10_ADC_ON) 154#define READ_Z2(vref) (READ_12BIT_DFR(z2, 1, vref))
154 155
155#define READ_X (READ_12BIT_DFR(x) | ADS_PD10_ADC_ON) 156#define READ_X(vref) (READ_12BIT_DFR(x, 1, vref))
156#define PWRDOWN (READ_12BIT_DFR(y) | ADS_PD10_PDOWN) /* LAST */ 157#define PWRDOWN (READ_12BIT_DFR(y, 0, 0)) /* LAST */
157 158
158/* single-ended samples need to first power up reference voltage; 159/* single-ended samples need to first power up reference voltage;
159 * we leave both ADC and VREF powered 160 * we leave both ADC and VREF powered
@@ -161,8 +162,8 @@ struct ads7846 {
161#define READ_12BIT_SER(x) (ADS_START | ADS_A2A1A0_ ## x \ 162#define READ_12BIT_SER(x) (ADS_START | ADS_A2A1A0_ ## x \
162 | ADS_12_BIT | ADS_SER) 163 | ADS_12_BIT | ADS_SER)
163 164
164#define REF_ON (READ_12BIT_DFR(x) | ADS_PD10_ALL_ON) 165#define REF_ON (READ_12BIT_DFR(x, 1, 1))
165#define REF_OFF (READ_12BIT_DFR(y) | ADS_PD10_PDOWN) 166#define REF_OFF (READ_12BIT_DFR(y, 0, 0))
166 167
167/*--------------------------------------------------------------------------*/ 168/*--------------------------------------------------------------------------*/
168 169
@@ -670,6 +671,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
670 struct ads7846_platform_data *pdata = spi->dev.platform_data; 671 struct ads7846_platform_data *pdata = spi->dev.platform_data;
671 struct spi_message *m; 672 struct spi_message *m;
672 struct spi_transfer *x; 673 struct spi_transfer *x;
674 int vref;
673 int err; 675 int err;
674 676
675 if (!spi->irq) { 677 if (!spi->irq) {
@@ -767,6 +769,8 @@ static int __devinit ads7846_probe(struct spi_device *spi)
767 input_set_abs_params(input_dev, ABS_PRESSURE, 769 input_set_abs_params(input_dev, ABS_PRESSURE,
768 pdata->pressure_min, pdata->pressure_max, 0, 0); 770 pdata->pressure_min, pdata->pressure_max, 0, 0);
769 771
772 vref = pdata->keep_vref_on;
773
770 /* set up the transfers to read touchscreen state; this assumes we 774 /* set up the transfers to read touchscreen state; this assumes we
771 * use formula #2 for pressure, not #3. 775 * use formula #2 for pressure, not #3.
772 */ 776 */
@@ -776,7 +780,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
776 spi_message_init(m); 780 spi_message_init(m);
777 781
778 /* y- still on; turn on only y+ (and ADC) */ 782 /* y- still on; turn on only y+ (and ADC) */
779 ts->read_y = READ_Y; 783 ts->read_y = READ_Y(vref);
780 x->tx_buf = &ts->read_y; 784 x->tx_buf = &ts->read_y;
781 x->len = 1; 785 x->len = 1;
782 spi_message_add_tail(x, m); 786 spi_message_add_tail(x, m);
@@ -794,7 +798,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
794 798
795 /* turn y- off, x+ on, then leave in lowpower */ 799 /* turn y- off, x+ on, then leave in lowpower */
796 x++; 800 x++;
797 ts->read_x = READ_X; 801 ts->read_x = READ_X(vref);
798 x->tx_buf = &ts->read_x; 802 x->tx_buf = &ts->read_x;
799 x->len = 1; 803 x->len = 1;
800 spi_message_add_tail(x, m); 804 spi_message_add_tail(x, m);
@@ -813,7 +817,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
813 spi_message_init(m); 817 spi_message_init(m);
814 818
815 x++; 819 x++;
816 ts->read_z1 = READ_Z1; 820 ts->read_z1 = READ_Z1(vref);
817 x->tx_buf = &ts->read_z1; 821 x->tx_buf = &ts->read_z1;
818 x->len = 1; 822 x->len = 1;
819 spi_message_add_tail(x, m); 823 spi_message_add_tail(x, m);
@@ -830,7 +834,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
830 spi_message_init(m); 834 spi_message_init(m);
831 835
832 x++; 836 x++;
833 ts->read_z2 = READ_Z2; 837 ts->read_z2 = READ_Z2(vref);
834 x->tx_buf = &ts->read_z2; 838 x->tx_buf = &ts->read_z2;
835 x->len = 1; 839 x->len = 1;
836 spi_message_add_tail(x, m); 840 spi_message_add_tail(x, m);
diff --git a/include/linux/spi/ads7846.h b/include/linux/spi/ads7846.h
index 1663f940ca11..3387e44dfd13 100644
--- a/include/linux/spi/ads7846.h
+++ b/include/linux/spi/ads7846.h
@@ -14,6 +14,8 @@ enum ads7846_filter {
14struct ads7846_platform_data { 14struct ads7846_platform_data {
15 u16 model; /* 7843, 7845, 7846. */ 15 u16 model; /* 7843, 7845, 7846. */
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
18 * measurements as well */
17 u16 x_plate_ohms; 19 u16 x_plate_ohms;
18 u16 y_plate_ohms; 20 u16 y_plate_ohms;
19 21