xref: /openbmc/linux/drivers/input/touchscreen/ad7877.c (revision 331b78ed300d9b37bd42dbc8b19f6277151a0dfa)
1*331b78edSMichael Hennerich /*
2*331b78edSMichael Hennerich  * Copyright (C) 2006-2008 Michael Hennerich, Analog Devices Inc.
3*331b78edSMichael Hennerich  *
4*331b78edSMichael Hennerich  * Description:	AD7877 based touchscreen, sensor (ADCs), DAC and GPIO driver
5*331b78edSMichael Hennerich  * Based on:	ads7846.c
6*331b78edSMichael Hennerich  *
7*331b78edSMichael Hennerich  * Bugs:        Enter bugs at http://blackfin.uclinux.org/
8*331b78edSMichael Hennerich  *
9*331b78edSMichael Hennerich  * This program is free software; you can redistribute it and/or modify
10*331b78edSMichael Hennerich  * it under the terms of the GNU General Public License as published by
11*331b78edSMichael Hennerich  * the Free Software Foundation; either version 2 of the License, or
12*331b78edSMichael Hennerich  * (at your option) any later version.
13*331b78edSMichael Hennerich  *
14*331b78edSMichael Hennerich  * This program is distributed in the hope that it will be useful,
15*331b78edSMichael Hennerich  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16*331b78edSMichael Hennerich  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*331b78edSMichael Hennerich  * GNU General Public License for more details.
18*331b78edSMichael Hennerich  *
19*331b78edSMichael Hennerich  * You should have received a copy of the GNU General Public License
20*331b78edSMichael Hennerich  * along with this program; if not, see the file COPYING, or write
21*331b78edSMichael Hennerich  * to the Free Software Foundation, Inc.,
22*331b78edSMichael Hennerich  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
23*331b78edSMichael Hennerich  *
24*331b78edSMichael Hennerich  * History:
25*331b78edSMichael Hennerich  * Copyright (c) 2005 David Brownell
26*331b78edSMichael Hennerich  * Copyright (c) 2006 Nokia Corporation
27*331b78edSMichael Hennerich  * Various changes: Imre Deak <imre.deak@nokia.com>
28*331b78edSMichael Hennerich  *
29*331b78edSMichael Hennerich  * Using code from:
30*331b78edSMichael Hennerich  *  - corgi_ts.c
31*331b78edSMichael Hennerich  *	Copyright (C) 2004-2005 Richard Purdie
32*331b78edSMichael Hennerich  *  - omap_ts.[hc], ads7846.h, ts_osk.c
33*331b78edSMichael Hennerich  *	Copyright (C) 2002 MontaVista Software
34*331b78edSMichael Hennerich  *	Copyright (C) 2004 Texas Instruments
35*331b78edSMichael Hennerich  *	Copyright (C) 2005 Dirk Behme
36*331b78edSMichael Hennerich  */
37*331b78edSMichael Hennerich 
38*331b78edSMichael Hennerich 
39*331b78edSMichael Hennerich #include <linux/device.h>
40*331b78edSMichael Hennerich #include <linux/init.h>
41*331b78edSMichael Hennerich #include <linux/delay.h>
42*331b78edSMichael Hennerich #include <linux/input.h>
43*331b78edSMichael Hennerich #include <linux/interrupt.h>
44*331b78edSMichael Hennerich #include <linux/slab.h>
45*331b78edSMichael Hennerich #include <linux/spi/spi.h>
46*331b78edSMichael Hennerich #include <linux/spi/ad7877.h>
47*331b78edSMichael Hennerich #include <asm/irq.h>
48*331b78edSMichael Hennerich 
49*331b78edSMichael Hennerich #define	TS_PEN_UP_TIMEOUT	msecs_to_jiffies(50)
50*331b78edSMichael Hennerich 
51*331b78edSMichael Hennerich #define MAX_SPI_FREQ_HZ			20000000
52*331b78edSMichael Hennerich #define	MAX_12BIT			((1<<12)-1)
53*331b78edSMichael Hennerich 
54*331b78edSMichael Hennerich #define AD7877_REG_ZEROS			0
55*331b78edSMichael Hennerich #define AD7877_REG_CTRL1			1
56*331b78edSMichael Hennerich #define AD7877_REG_CTRL2			2
57*331b78edSMichael Hennerich #define AD7877_REG_ALERT			3
58*331b78edSMichael Hennerich #define AD7877_REG_AUX1HIGH			4
59*331b78edSMichael Hennerich #define AD7877_REG_AUX1LOW			5
60*331b78edSMichael Hennerich #define AD7877_REG_BAT1HIGH			6
61*331b78edSMichael Hennerich #define AD7877_REG_BAT1LOW			7
62*331b78edSMichael Hennerich #define AD7877_REG_BAT2HIGH			8
63*331b78edSMichael Hennerich #define AD7877_REG_BAT2LOW			9
64*331b78edSMichael Hennerich #define AD7877_REG_TEMP1HIGH			10
65*331b78edSMichael Hennerich #define AD7877_REG_TEMP1LOW			11
66*331b78edSMichael Hennerich #define AD7877_REG_SEQ0				12
67*331b78edSMichael Hennerich #define AD7877_REG_SEQ1				13
68*331b78edSMichael Hennerich #define AD7877_REG_DAC				14
69*331b78edSMichael Hennerich #define AD7877_REG_NONE1			15
70*331b78edSMichael Hennerich #define AD7877_REG_EXTWRITE			15
71*331b78edSMichael Hennerich #define AD7877_REG_XPLUS			16
72*331b78edSMichael Hennerich #define AD7877_REG_YPLUS			17
73*331b78edSMichael Hennerich #define AD7877_REG_Z2				18
74*331b78edSMichael Hennerich #define AD7877_REG_aux1				19
75*331b78edSMichael Hennerich #define AD7877_REG_aux2				20
76*331b78edSMichael Hennerich #define AD7877_REG_aux3				21
77*331b78edSMichael Hennerich #define AD7877_REG_bat1				22
78*331b78edSMichael Hennerich #define AD7877_REG_bat2				23
79*331b78edSMichael Hennerich #define AD7877_REG_temp1			24
80*331b78edSMichael Hennerich #define AD7877_REG_temp2			25
81*331b78edSMichael Hennerich #define AD7877_REG_Z1				26
82*331b78edSMichael Hennerich #define AD7877_REG_GPIOCTRL1			27
83*331b78edSMichael Hennerich #define AD7877_REG_GPIOCTRL2			28
84*331b78edSMichael Hennerich #define AD7877_REG_GPIODATA			29
85*331b78edSMichael Hennerich #define AD7877_REG_NONE2			30
86*331b78edSMichael Hennerich #define AD7877_REG_NONE3			31
87*331b78edSMichael Hennerich 
88*331b78edSMichael Hennerich #define AD7877_SEQ_YPLUS_BIT			(1<<11)
89*331b78edSMichael Hennerich #define AD7877_SEQ_XPLUS_BIT			(1<<10)
90*331b78edSMichael Hennerich #define AD7877_SEQ_Z2_BIT			(1<<9)
91*331b78edSMichael Hennerich #define AD7877_SEQ_AUX1_BIT			(1<<8)
92*331b78edSMichael Hennerich #define AD7877_SEQ_AUX2_BIT			(1<<7)
93*331b78edSMichael Hennerich #define AD7877_SEQ_AUX3_BIT			(1<<6)
94*331b78edSMichael Hennerich #define AD7877_SEQ_BAT1_BIT			(1<<5)
95*331b78edSMichael Hennerich #define AD7877_SEQ_BAT2_BIT			(1<<4)
96*331b78edSMichael Hennerich #define AD7877_SEQ_TEMP1_BIT			(1<<3)
97*331b78edSMichael Hennerich #define AD7877_SEQ_TEMP2_BIT			(1<<2)
98*331b78edSMichael Hennerich #define AD7877_SEQ_Z1_BIT			(1<<1)
99*331b78edSMichael Hennerich 
100*331b78edSMichael Hennerich enum {
101*331b78edSMichael Hennerich 	AD7877_SEQ_YPOS  = 0,
102*331b78edSMichael Hennerich 	AD7877_SEQ_XPOS  = 1,
103*331b78edSMichael Hennerich 	AD7877_SEQ_Z2    = 2,
104*331b78edSMichael Hennerich 	AD7877_SEQ_AUX1  = 3,
105*331b78edSMichael Hennerich 	AD7877_SEQ_AUX2  = 4,
106*331b78edSMichael Hennerich 	AD7877_SEQ_AUX3  = 5,
107*331b78edSMichael Hennerich 	AD7877_SEQ_BAT1  = 6,
108*331b78edSMichael Hennerich 	AD7877_SEQ_BAT2  = 7,
109*331b78edSMichael Hennerich 	AD7877_SEQ_TEMP1 = 8,
110*331b78edSMichael Hennerich 	AD7877_SEQ_TEMP2 = 9,
111*331b78edSMichael Hennerich 	AD7877_SEQ_Z1    = 10,
112*331b78edSMichael Hennerich 	AD7877_NR_SENSE  = 11,
113*331b78edSMichael Hennerich };
114*331b78edSMichael Hennerich 
115*331b78edSMichael Hennerich /* DAC Register Default RANGE 0 to Vcc, Volatge Mode, DAC On */
116*331b78edSMichael Hennerich #define AD7877_DAC_CONF			0x1
117*331b78edSMichael Hennerich 
118*331b78edSMichael Hennerich /* If gpio3 is set AUX3/GPIO3 acts as GPIO Output */
119*331b78edSMichael Hennerich #define AD7877_EXTW_GPIO_3_CONF		0x1C4
120*331b78edSMichael Hennerich #define AD7877_EXTW_GPIO_DATA		0x200
121*331b78edSMichael Hennerich 
122*331b78edSMichael Hennerich /* Control REG 2 */
123*331b78edSMichael Hennerich #define AD7877_TMR(x)			((x & 0x3) << 0)
124*331b78edSMichael Hennerich #define AD7877_REF(x)			((x & 0x1) << 2)
125*331b78edSMichael Hennerich #define AD7877_POL(x)			((x & 0x1) << 3)
126*331b78edSMichael Hennerich #define AD7877_FCD(x)			((x & 0x3) << 4)
127*331b78edSMichael Hennerich #define AD7877_PM(x)			((x & 0x3) << 6)
128*331b78edSMichael Hennerich #define AD7877_ACQ(x)			((x & 0x3) << 8)
129*331b78edSMichael Hennerich #define AD7877_AVG(x)			((x & 0x3) << 10)
130*331b78edSMichael Hennerich 
131*331b78edSMichael Hennerich /* Control REG 1 */
132*331b78edSMichael Hennerich #define	AD7877_SER			(1 << 11)	/* non-differential */
133*331b78edSMichael Hennerich #define	AD7877_DFR			(0 << 11)	/* differential */
134*331b78edSMichael Hennerich 
135*331b78edSMichael Hennerich #define AD7877_MODE_NOC  (0)	/* Do not convert */
136*331b78edSMichael Hennerich #define AD7877_MODE_SCC  (1)	/* Single channel conversion */
137*331b78edSMichael Hennerich #define AD7877_MODE_SEQ0 (2)	/* Sequence 0 in Slave Mode */
138*331b78edSMichael Hennerich #define AD7877_MODE_SEQ1 (3)	/* Sequence 1 in Master Mode */
139*331b78edSMichael Hennerich 
140*331b78edSMichael Hennerich #define AD7877_CHANADD(x)		((x&0xF)<<7)
141*331b78edSMichael Hennerich #define AD7877_READADD(x)		((x)<<2)
142*331b78edSMichael Hennerich #define AD7877_WRITEADD(x)		((x)<<12)
143*331b78edSMichael Hennerich 
144*331b78edSMichael Hennerich #define AD7877_READ_CHAN(x) (AD7877_WRITEADD(AD7877_REG_CTRL1) | AD7877_SER | \
145*331b78edSMichael Hennerich 		AD7877_MODE_SCC | AD7877_CHANADD(AD7877_REG_ ## x) | \
146*331b78edSMichael Hennerich 		AD7877_READADD(AD7877_REG_ ## x))
147*331b78edSMichael Hennerich 
148*331b78edSMichael Hennerich #define AD7877_MM_SEQUENCE (AD7877_SEQ_YPLUS_BIT | AD7877_SEQ_XPLUS_BIT | \
149*331b78edSMichael Hennerich 		AD7877_SEQ_Z2_BIT | AD7877_SEQ_Z1_BIT)
150*331b78edSMichael Hennerich 
151*331b78edSMichael Hennerich /*
152*331b78edSMichael Hennerich  * Non-touchscreen sensors only use single-ended conversions.
153*331b78edSMichael Hennerich  */
154*331b78edSMichael Hennerich 
155*331b78edSMichael Hennerich struct ser_req {
156*331b78edSMichael Hennerich 	u16			reset;
157*331b78edSMichael Hennerich 	u16			ref_on;
158*331b78edSMichael Hennerich 	u16			command;
159*331b78edSMichael Hennerich 	u16			sample;
160*331b78edSMichael Hennerich 	struct spi_message	msg;
161*331b78edSMichael Hennerich 	struct spi_transfer	xfer[6];
162*331b78edSMichael Hennerich };
163*331b78edSMichael Hennerich 
164*331b78edSMichael Hennerich struct ad7877 {
165*331b78edSMichael Hennerich 	struct input_dev	*input;
166*331b78edSMichael Hennerich 	char			phys[32];
167*331b78edSMichael Hennerich 
168*331b78edSMichael Hennerich 	struct spi_device	*spi;
169*331b78edSMichael Hennerich 	u16			model;
170*331b78edSMichael Hennerich 	u16			vref_delay_usecs;
171*331b78edSMichael Hennerich 	u16			x_plate_ohms;
172*331b78edSMichael Hennerich 	u16			pressure_max;
173*331b78edSMichael Hennerich 
174*331b78edSMichael Hennerich 	u16			cmd_crtl1;
175*331b78edSMichael Hennerich 	u16			cmd_crtl2;
176*331b78edSMichael Hennerich 	u16			cmd_dummy;
177*331b78edSMichael Hennerich 	u16			dac;
178*331b78edSMichael Hennerich 
179*331b78edSMichael Hennerich 	u8			stopacq_polarity;
180*331b78edSMichael Hennerich 	u8			first_conversion_delay;
181*331b78edSMichael Hennerich 	u8			acquisition_time;
182*331b78edSMichael Hennerich 	u8			averaging;
183*331b78edSMichael Hennerich 	u8			pen_down_acc_interval;
184*331b78edSMichael Hennerich 
185*331b78edSMichael Hennerich 	u16			conversion_data[AD7877_NR_SENSE];
186*331b78edSMichael Hennerich 
187*331b78edSMichael Hennerich 	struct spi_transfer	xfer[AD7877_NR_SENSE + 2];
188*331b78edSMichael Hennerich 	struct spi_message	msg;
189*331b78edSMichael Hennerich 
190*331b78edSMichael Hennerich 	struct mutex		mutex;
191*331b78edSMichael Hennerich 	unsigned		disabled:1;	/* P: mutex */
192*331b78edSMichael Hennerich 	unsigned		gpio3:1;	/* P: mutex */
193*331b78edSMichael Hennerich 	unsigned		gpio4:1;	/* P: mutex */
194*331b78edSMichael Hennerich 
195*331b78edSMichael Hennerich 	spinlock_t		lock;
196*331b78edSMichael Hennerich 	struct timer_list	timer;		/* P: lock */
197*331b78edSMichael Hennerich 	unsigned		pending:1;	/* P: lock */
198*331b78edSMichael Hennerich };
199*331b78edSMichael Hennerich 
200*331b78edSMichael Hennerich static int gpio3;
201*331b78edSMichael Hennerich module_param(gpio3, int, 0);
202*331b78edSMichael Hennerich MODULE_PARM_DESC(gpio3, "If gpio3 is set to 1 AUX3 acts as GPIO3");
203*331b78edSMichael Hennerich 
204*331b78edSMichael Hennerich /*
205*331b78edSMichael Hennerich  * ad7877_read/write are only used for initial setup and for sysfs controls.
206*331b78edSMichael Hennerich  * The main traffic is done using spi_async() in the interrupt handler.
207*331b78edSMichael Hennerich  */
208*331b78edSMichael Hennerich 
209*331b78edSMichael Hennerich static int ad7877_read(struct spi_device *spi, u16 reg)
210*331b78edSMichael Hennerich {
211*331b78edSMichael Hennerich 	struct ser_req *req;
212*331b78edSMichael Hennerich 	int status, ret;
213*331b78edSMichael Hennerich 
214*331b78edSMichael Hennerich 	req = kzalloc(sizeof *req, GFP_KERNEL);
215*331b78edSMichael Hennerich 	if (!req)
216*331b78edSMichael Hennerich 		return -ENOMEM;
217*331b78edSMichael Hennerich 
218*331b78edSMichael Hennerich 	spi_message_init(&req->msg);
219*331b78edSMichael Hennerich 
220*331b78edSMichael Hennerich 	req->command = (u16) (AD7877_WRITEADD(AD7877_REG_CTRL1) |
221*331b78edSMichael Hennerich 			AD7877_READADD(reg));
222*331b78edSMichael Hennerich 	req->xfer[0].tx_buf = &req->command;
223*331b78edSMichael Hennerich 	req->xfer[0].len = 2;
224*331b78edSMichael Hennerich 
225*331b78edSMichael Hennerich 	req->xfer[1].rx_buf = &req->sample;
226*331b78edSMichael Hennerich 	req->xfer[1].len = 2;
227*331b78edSMichael Hennerich 
228*331b78edSMichael Hennerich 	spi_message_add_tail(&req->xfer[0], &req->msg);
229*331b78edSMichael Hennerich 	spi_message_add_tail(&req->xfer[1], &req->msg);
230*331b78edSMichael Hennerich 
231*331b78edSMichael Hennerich 	status = spi_sync(spi, &req->msg);
232*331b78edSMichael Hennerich 	ret = status ? : req->sample;
233*331b78edSMichael Hennerich 
234*331b78edSMichael Hennerich 	kfree(req);
235*331b78edSMichael Hennerich 
236*331b78edSMichael Hennerich 	return ret;
237*331b78edSMichael Hennerich }
238*331b78edSMichael Hennerich 
239*331b78edSMichael Hennerich static int ad7877_write(struct spi_device *spi, u16 reg, u16 val)
240*331b78edSMichael Hennerich {
241*331b78edSMichael Hennerich 	struct ser_req *req;
242*331b78edSMichael Hennerich 	int status;
243*331b78edSMichael Hennerich 
244*331b78edSMichael Hennerich 	req = kzalloc(sizeof *req, GFP_KERNEL);
245*331b78edSMichael Hennerich 	if (!req)
246*331b78edSMichael Hennerich 		return -ENOMEM;
247*331b78edSMichael Hennerich 
248*331b78edSMichael Hennerich 	spi_message_init(&req->msg);
249*331b78edSMichael Hennerich 
250*331b78edSMichael Hennerich 	req->command = (u16) (AD7877_WRITEADD(reg) | (val & MAX_12BIT));
251*331b78edSMichael Hennerich 	req->xfer[0].tx_buf = &req->command;
252*331b78edSMichael Hennerich 	req->xfer[0].len = 2;
253*331b78edSMichael Hennerich 
254*331b78edSMichael Hennerich 	spi_message_add_tail(&req->xfer[0], &req->msg);
255*331b78edSMichael Hennerich 
256*331b78edSMichael Hennerich 	status = spi_sync(spi, &req->msg);
257*331b78edSMichael Hennerich 
258*331b78edSMichael Hennerich 	kfree(req);
259*331b78edSMichael Hennerich 
260*331b78edSMichael Hennerich 	return status;
261*331b78edSMichael Hennerich }
262*331b78edSMichael Hennerich 
263*331b78edSMichael Hennerich static int ad7877_read_adc(struct spi_device *spi, unsigned command)
264*331b78edSMichael Hennerich {
265*331b78edSMichael Hennerich 	struct ad7877 *ts = dev_get_drvdata(&spi->dev);
266*331b78edSMichael Hennerich 	struct ser_req *req;
267*331b78edSMichael Hennerich 	int status;
268*331b78edSMichael Hennerich 	int sample;
269*331b78edSMichael Hennerich 	int i;
270*331b78edSMichael Hennerich 
271*331b78edSMichael Hennerich 	req = kzalloc(sizeof *req, GFP_KERNEL);
272*331b78edSMichael Hennerich 	if (!req)
273*331b78edSMichael Hennerich 		return -ENOMEM;
274*331b78edSMichael Hennerich 
275*331b78edSMichael Hennerich 	spi_message_init(&req->msg);
276*331b78edSMichael Hennerich 
277*331b78edSMichael Hennerich 	/* activate reference, so it has time to settle; */
278*331b78edSMichael Hennerich 	req->ref_on = AD7877_WRITEADD(AD7877_REG_CTRL2) |
279*331b78edSMichael Hennerich 			 AD7877_POL(ts->stopacq_polarity) |
280*331b78edSMichael Hennerich 			 AD7877_AVG(0) | AD7877_PM(2) | AD7877_TMR(0) |
281*331b78edSMichael Hennerich 			 AD7877_ACQ(ts->acquisition_time) | AD7877_FCD(0);
282*331b78edSMichael Hennerich 
283*331b78edSMichael Hennerich 	req->reset = AD7877_WRITEADD(AD7877_REG_CTRL1) | AD7877_MODE_NOC;
284*331b78edSMichael Hennerich 
285*331b78edSMichael Hennerich 	req->command = (u16) command;
286*331b78edSMichael Hennerich 
287*331b78edSMichael Hennerich 	req->xfer[0].tx_buf = &req->reset;
288*331b78edSMichael Hennerich 	req->xfer[0].len = 2;
289*331b78edSMichael Hennerich 
290*331b78edSMichael Hennerich 	req->xfer[1].tx_buf = &req->ref_on;
291*331b78edSMichael Hennerich 	req->xfer[1].len = 2;
292*331b78edSMichael Hennerich 	req->xfer[1].delay_usecs = ts->vref_delay_usecs;
293*331b78edSMichael Hennerich 
294*331b78edSMichael Hennerich 	req->xfer[2].tx_buf = &req->command;
295*331b78edSMichael Hennerich 	req->xfer[2].len = 2;
296*331b78edSMichael Hennerich 	req->xfer[2].delay_usecs = ts->vref_delay_usecs;
297*331b78edSMichael Hennerich 
298*331b78edSMichael Hennerich 	req->xfer[3].rx_buf = &req->sample;
299*331b78edSMichael Hennerich 	req->xfer[3].len = 2;
300*331b78edSMichael Hennerich 
301*331b78edSMichael Hennerich 	req->xfer[4].tx_buf = &ts->cmd_crtl2;	/*REF OFF*/
302*331b78edSMichael Hennerich 	req->xfer[4].len = 2;
303*331b78edSMichael Hennerich 
304*331b78edSMichael Hennerich 	req->xfer[5].tx_buf = &ts->cmd_crtl1;	/*DEFAULT*/
305*331b78edSMichael Hennerich 	req->xfer[5].len = 2;
306*331b78edSMichael Hennerich 
307*331b78edSMichael Hennerich 	/* group all the transfers together, so we can't interfere with
308*331b78edSMichael Hennerich 	 * reading touchscreen state; disable penirq while sampling
309*331b78edSMichael Hennerich 	 */
310*331b78edSMichael Hennerich 	for (i = 0; i < 6; i++)
311*331b78edSMichael Hennerich 		spi_message_add_tail(&req->xfer[i], &req->msg);
312*331b78edSMichael Hennerich 
313*331b78edSMichael Hennerich 	status = spi_sync(spi, &req->msg);
314*331b78edSMichael Hennerich 	sample = req->sample;
315*331b78edSMichael Hennerich 
316*331b78edSMichael Hennerich 	kfree(req);
317*331b78edSMichael Hennerich 
318*331b78edSMichael Hennerich 	return status ? : sample;
319*331b78edSMichael Hennerich }
320*331b78edSMichael Hennerich 
321*331b78edSMichael Hennerich static void ad7877_rx(struct ad7877 *ts)
322*331b78edSMichael Hennerich {
323*331b78edSMichael Hennerich 	struct input_dev *input_dev = ts->input;
324*331b78edSMichael Hennerich 	unsigned Rt;
325*331b78edSMichael Hennerich 	u16 x, y, z1, z2;
326*331b78edSMichael Hennerich 
327*331b78edSMichael Hennerich 	x = ts->conversion_data[AD7877_SEQ_XPOS] & MAX_12BIT;
328*331b78edSMichael Hennerich 	y = ts->conversion_data[AD7877_SEQ_YPOS] & MAX_12BIT;
329*331b78edSMichael Hennerich 	z1 = ts->conversion_data[AD7877_SEQ_Z1] & MAX_12BIT;
330*331b78edSMichael Hennerich 	z2 = ts->conversion_data[AD7877_SEQ_Z2] & MAX_12BIT;
331*331b78edSMichael Hennerich 
332*331b78edSMichael Hennerich 	/*
333*331b78edSMichael Hennerich 	 * The samples processed here are already preprocessed by the AD7877.
334*331b78edSMichael Hennerich 	 * The preprocessing function consists of an averaging filter.
335*331b78edSMichael Hennerich 	 * The combination of 'first conversion delay' and averaging provides a robust solution,
336*331b78edSMichael Hennerich 	 * discarding the spurious noise in the signal and keeping only the data of interest.
337*331b78edSMichael Hennerich 	 * The size of the averaging filter is programmable. (dev.platform_data, see linux/spi/ad7877.h)
338*331b78edSMichael Hennerich 	 * Other user-programmable conversion controls include variable acquisition time,
339*331b78edSMichael Hennerich 	 * and first conversion delay. Up to 16 averages can be taken per conversion.
340*331b78edSMichael Hennerich 	 */
341*331b78edSMichael Hennerich 
342*331b78edSMichael Hennerich 	if (likely(x && z1)) {
343*331b78edSMichael Hennerich 		/* compute touch pressure resistance using equation #1 */
344*331b78edSMichael Hennerich 		Rt = (z2 - z1) * x * ts->x_plate_ohms;
345*331b78edSMichael Hennerich 		Rt /= z1;
346*331b78edSMichael Hennerich 		Rt = (Rt + 2047) >> 12;
347*331b78edSMichael Hennerich 
348*331b78edSMichael Hennerich 		input_report_abs(input_dev, ABS_X, x);
349*331b78edSMichael Hennerich 		input_report_abs(input_dev, ABS_Y, y);
350*331b78edSMichael Hennerich 		input_report_abs(input_dev, ABS_PRESSURE, Rt);
351*331b78edSMichael Hennerich 		input_sync(input_dev);
352*331b78edSMichael Hennerich 	}
353*331b78edSMichael Hennerich }
354*331b78edSMichael Hennerich 
355*331b78edSMichael Hennerich static inline void ad7877_ts_event_release(struct ad7877 *ts)
356*331b78edSMichael Hennerich {
357*331b78edSMichael Hennerich 	struct input_dev *input_dev = ts->input;
358*331b78edSMichael Hennerich 
359*331b78edSMichael Hennerich 	input_report_abs(input_dev, ABS_PRESSURE, 0);
360*331b78edSMichael Hennerich 	input_sync(input_dev);
361*331b78edSMichael Hennerich }
362*331b78edSMichael Hennerich 
363*331b78edSMichael Hennerich static void ad7877_timer(unsigned long handle)
364*331b78edSMichael Hennerich {
365*331b78edSMichael Hennerich 	struct ad7877 *ts = (void *)handle;
366*331b78edSMichael Hennerich 
367*331b78edSMichael Hennerich 	ad7877_ts_event_release(ts);
368*331b78edSMichael Hennerich }
369*331b78edSMichael Hennerich 
370*331b78edSMichael Hennerich static irqreturn_t ad7877_irq(int irq, void *handle)
371*331b78edSMichael Hennerich {
372*331b78edSMichael Hennerich 	struct ad7877 *ts = handle;
373*331b78edSMichael Hennerich 	unsigned long flags;
374*331b78edSMichael Hennerich 	int status;
375*331b78edSMichael Hennerich 
376*331b78edSMichael Hennerich 	/*
377*331b78edSMichael Hennerich 	 * The repeated conversion sequencer controlled by TMR kicked off
378*331b78edSMichael Hennerich 	 * too fast. We ignore the last and process the sample sequence
379*331b78edSMichael Hennerich 	 * currently in the queue. It can't be older than 9.4ms, and we
380*331b78edSMichael Hennerich 	 * need to avoid that ts->msg doesn't get issued twice while in work.
381*331b78edSMichael Hennerich 	 */
382*331b78edSMichael Hennerich 
383*331b78edSMichael Hennerich 	spin_lock_irqsave(&ts->lock, flags);
384*331b78edSMichael Hennerich 	if (!ts->pending) {
385*331b78edSMichael Hennerich 		ts->pending = 1;
386*331b78edSMichael Hennerich 
387*331b78edSMichael Hennerich 		status = spi_async(ts->spi, &ts->msg);
388*331b78edSMichael Hennerich 		if (status)
389*331b78edSMichael Hennerich 			dev_err(&ts->spi->dev, "spi_sync --> %d\n", status);
390*331b78edSMichael Hennerich 	}
391*331b78edSMichael Hennerich 	spin_unlock_irqrestore(&ts->lock, flags);
392*331b78edSMichael Hennerich 
393*331b78edSMichael Hennerich 	return IRQ_HANDLED;
394*331b78edSMichael Hennerich }
395*331b78edSMichael Hennerich 
396*331b78edSMichael Hennerich static void ad7877_callback(void *_ts)
397*331b78edSMichael Hennerich {
398*331b78edSMichael Hennerich 	struct ad7877 *ts = _ts;
399*331b78edSMichael Hennerich 
400*331b78edSMichael Hennerich 	spin_lock_irq(&ts->lock);
401*331b78edSMichael Hennerich 
402*331b78edSMichael Hennerich 	ad7877_rx(ts);
403*331b78edSMichael Hennerich 	ts->pending = 0;
404*331b78edSMichael Hennerich 	mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT);
405*331b78edSMichael Hennerich 
406*331b78edSMichael Hennerich 	spin_unlock_irq(&ts->lock);
407*331b78edSMichael Hennerich }
408*331b78edSMichael Hennerich 
409*331b78edSMichael Hennerich static void ad7877_disable(struct ad7877 *ts)
410*331b78edSMichael Hennerich {
411*331b78edSMichael Hennerich 	mutex_lock(&ts->mutex);
412*331b78edSMichael Hennerich 
413*331b78edSMichael Hennerich 	if (!ts->disabled) {
414*331b78edSMichael Hennerich 		ts->disabled = 1;
415*331b78edSMichael Hennerich 		disable_irq(ts->spi->irq);
416*331b78edSMichael Hennerich 
417*331b78edSMichael Hennerich 		/* Wait for spi_async callback */
418*331b78edSMichael Hennerich 		while (ts->pending)
419*331b78edSMichael Hennerich 			msleep(1);
420*331b78edSMichael Hennerich 
421*331b78edSMichael Hennerich 		if (del_timer_sync(&ts->timer))
422*331b78edSMichael Hennerich 			ad7877_ts_event_release(ts);
423*331b78edSMichael Hennerich 	}
424*331b78edSMichael Hennerich 
425*331b78edSMichael Hennerich 	/* we know the chip's in lowpower mode since we always
426*331b78edSMichael Hennerich 	 * leave it that way after every request
427*331b78edSMichael Hennerich 	 */
428*331b78edSMichael Hennerich 
429*331b78edSMichael Hennerich 	mutex_unlock(&ts->mutex);
430*331b78edSMichael Hennerich }
431*331b78edSMichael Hennerich 
432*331b78edSMichael Hennerich static void ad7877_enable(struct ad7877 *ts)
433*331b78edSMichael Hennerich {
434*331b78edSMichael Hennerich 	mutex_lock(&ts->mutex);
435*331b78edSMichael Hennerich 
436*331b78edSMichael Hennerich 	if (ts->disabled) {
437*331b78edSMichael Hennerich 		ts->disabled = 0;
438*331b78edSMichael Hennerich 		enable_irq(ts->spi->irq);
439*331b78edSMichael Hennerich 	}
440*331b78edSMichael Hennerich 
441*331b78edSMichael Hennerich 	mutex_unlock(&ts->mutex);
442*331b78edSMichael Hennerich }
443*331b78edSMichael Hennerich 
444*331b78edSMichael Hennerich #define SHOW(name) static ssize_t \
445*331b78edSMichael Hennerich name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \
446*331b78edSMichael Hennerich { \
447*331b78edSMichael Hennerich 	struct ad7877	*ts = dev_get_drvdata(dev); \
448*331b78edSMichael Hennerich 	ssize_t v = ad7877_read_adc(ts->spi, \
449*331b78edSMichael Hennerich 			AD7877_READ_CHAN(name)); \
450*331b78edSMichael Hennerich 	if (v < 0) \
451*331b78edSMichael Hennerich 		return v; \
452*331b78edSMichael Hennerich 	return sprintf(buf, "%u\n", (unsigned) v); \
453*331b78edSMichael Hennerich } \
454*331b78edSMichael Hennerich static DEVICE_ATTR(name, S_IRUGO, name ## _show, NULL);
455*331b78edSMichael Hennerich 
456*331b78edSMichael Hennerich SHOW(aux1)
457*331b78edSMichael Hennerich SHOW(aux2)
458*331b78edSMichael Hennerich SHOW(aux3)
459*331b78edSMichael Hennerich SHOW(bat1)
460*331b78edSMichael Hennerich SHOW(bat2)
461*331b78edSMichael Hennerich SHOW(temp1)
462*331b78edSMichael Hennerich SHOW(temp2)
463*331b78edSMichael Hennerich 
464*331b78edSMichael Hennerich static ssize_t ad7877_disable_show(struct device *dev,
465*331b78edSMichael Hennerich 				     struct device_attribute *attr, char *buf)
466*331b78edSMichael Hennerich {
467*331b78edSMichael Hennerich 	struct ad7877	*ts = dev_get_drvdata(dev);
468*331b78edSMichael Hennerich 
469*331b78edSMichael Hennerich 	return sprintf(buf, "%u\n", ts->disabled);
470*331b78edSMichael Hennerich }
471*331b78edSMichael Hennerich 
472*331b78edSMichael Hennerich static ssize_t ad7877_disable_store(struct device *dev,
473*331b78edSMichael Hennerich 				     struct device_attribute *attr,
474*331b78edSMichael Hennerich 				     const char *buf, size_t count)
475*331b78edSMichael Hennerich {
476*331b78edSMichael Hennerich 	struct ad7877 *ts = dev_get_drvdata(dev);
477*331b78edSMichael Hennerich 	unsigned long val;
478*331b78edSMichael Hennerich 	int error;
479*331b78edSMichael Hennerich 
480*331b78edSMichael Hennerich 	error = strict_strtoul(buf, 10, &val);
481*331b78edSMichael Hennerich 	if (error)
482*331b78edSMichael Hennerich 		return error;
483*331b78edSMichael Hennerich 
484*331b78edSMichael Hennerich 	if (val)
485*331b78edSMichael Hennerich 		ad7877_disable(ts);
486*331b78edSMichael Hennerich 	else
487*331b78edSMichael Hennerich 		ad7877_enable(ts);
488*331b78edSMichael Hennerich 
489*331b78edSMichael Hennerich 	return count;
490*331b78edSMichael Hennerich }
491*331b78edSMichael Hennerich 
492*331b78edSMichael Hennerich static DEVICE_ATTR(disable, 0664, ad7877_disable_show, ad7877_disable_store);
493*331b78edSMichael Hennerich 
494*331b78edSMichael Hennerich static ssize_t ad7877_dac_show(struct device *dev,
495*331b78edSMichael Hennerich 				     struct device_attribute *attr, char *buf)
496*331b78edSMichael Hennerich {
497*331b78edSMichael Hennerich 	struct ad7877	*ts = dev_get_drvdata(dev);
498*331b78edSMichael Hennerich 
499*331b78edSMichael Hennerich 	return sprintf(buf, "%u\n", ts->dac);
500*331b78edSMichael Hennerich }
501*331b78edSMichael Hennerich 
502*331b78edSMichael Hennerich static ssize_t ad7877_dac_store(struct device *dev,
503*331b78edSMichael Hennerich 				     struct device_attribute *attr,
504*331b78edSMichael Hennerich 				     const char *buf, size_t count)
505*331b78edSMichael Hennerich {
506*331b78edSMichael Hennerich 	struct ad7877 *ts = dev_get_drvdata(dev);
507*331b78edSMichael Hennerich 	unsigned long val;
508*331b78edSMichael Hennerich 	int error;
509*331b78edSMichael Hennerich 
510*331b78edSMichael Hennerich 	error = strict_strtoul(buf, 10, &val);
511*331b78edSMichael Hennerich 	if (error)
512*331b78edSMichael Hennerich 		return error;
513*331b78edSMichael Hennerich 
514*331b78edSMichael Hennerich 	mutex_lock(&ts->mutex);
515*331b78edSMichael Hennerich 	ts->dac = val & 0xFF;
516*331b78edSMichael Hennerich 	ad7877_write(ts->spi, AD7877_REG_DAC, (ts->dac << 4) | AD7877_DAC_CONF);
517*331b78edSMichael Hennerich 	mutex_unlock(&ts->mutex);
518*331b78edSMichael Hennerich 
519*331b78edSMichael Hennerich 	return count;
520*331b78edSMichael Hennerich }
521*331b78edSMichael Hennerich 
522*331b78edSMichael Hennerich static DEVICE_ATTR(dac, 0664, ad7877_dac_show, ad7877_dac_store);
523*331b78edSMichael Hennerich 
524*331b78edSMichael Hennerich static ssize_t ad7877_gpio3_show(struct device *dev,
525*331b78edSMichael Hennerich 				     struct device_attribute *attr, char *buf)
526*331b78edSMichael Hennerich {
527*331b78edSMichael Hennerich 	struct ad7877	*ts = dev_get_drvdata(dev);
528*331b78edSMichael Hennerich 
529*331b78edSMichael Hennerich 	return sprintf(buf, "%u\n", ts->gpio3);
530*331b78edSMichael Hennerich }
531*331b78edSMichael Hennerich 
532*331b78edSMichael Hennerich static ssize_t ad7877_gpio3_store(struct device *dev,
533*331b78edSMichael Hennerich 				     struct device_attribute *attr,
534*331b78edSMichael Hennerich 				     const char *buf, size_t count)
535*331b78edSMichael Hennerich {
536*331b78edSMichael Hennerich 	struct ad7877 *ts = dev_get_drvdata(dev);
537*331b78edSMichael Hennerich 	unsigned long val;
538*331b78edSMichael Hennerich 	int error;
539*331b78edSMichael Hennerich 
540*331b78edSMichael Hennerich 	error = strict_strtoul(buf, 10, &val);
541*331b78edSMichael Hennerich 	if (error)
542*331b78edSMichael Hennerich 		return error;
543*331b78edSMichael Hennerich 
544*331b78edSMichael Hennerich 	mutex_lock(&ts->mutex);
545*331b78edSMichael Hennerich 	ts->gpio3 = !!val;
546*331b78edSMichael Hennerich 	ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA |
547*331b78edSMichael Hennerich 		 (ts->gpio4 << 4) | (ts->gpio3 << 5));
548*331b78edSMichael Hennerich 	mutex_unlock(&ts->mutex);
549*331b78edSMichael Hennerich 
550*331b78edSMichael Hennerich 	return count;
551*331b78edSMichael Hennerich }
552*331b78edSMichael Hennerich 
553*331b78edSMichael Hennerich static DEVICE_ATTR(gpio3, 0664, ad7877_gpio3_show, ad7877_gpio3_store);
554*331b78edSMichael Hennerich 
555*331b78edSMichael Hennerich static ssize_t ad7877_gpio4_show(struct device *dev,
556*331b78edSMichael Hennerich 				     struct device_attribute *attr, char *buf)
557*331b78edSMichael Hennerich {
558*331b78edSMichael Hennerich 	struct ad7877	*ts = dev_get_drvdata(dev);
559*331b78edSMichael Hennerich 
560*331b78edSMichael Hennerich 	return sprintf(buf, "%u\n", ts->gpio4);
561*331b78edSMichael Hennerich }
562*331b78edSMichael Hennerich 
563*331b78edSMichael Hennerich static ssize_t ad7877_gpio4_store(struct device *dev,
564*331b78edSMichael Hennerich 				     struct device_attribute *attr,
565*331b78edSMichael Hennerich 				     const char *buf, size_t count)
566*331b78edSMichael Hennerich {
567*331b78edSMichael Hennerich 	struct ad7877 *ts = dev_get_drvdata(dev);
568*331b78edSMichael Hennerich 	unsigned long val;
569*331b78edSMichael Hennerich 	int error;
570*331b78edSMichael Hennerich 
571*331b78edSMichael Hennerich 	error = strict_strtoul(buf, 10, &val);
572*331b78edSMichael Hennerich 	if (error)
573*331b78edSMichael Hennerich 		return error;
574*331b78edSMichael Hennerich 
575*331b78edSMichael Hennerich 	mutex_lock(&ts->mutex);
576*331b78edSMichael Hennerich 	ts->gpio4 = !!val;
577*331b78edSMichael Hennerich 	ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA |
578*331b78edSMichael Hennerich 		     (ts->gpio4 << 4) | (ts->gpio3 << 5));
579*331b78edSMichael Hennerich 	mutex_unlock(&ts->mutex);
580*331b78edSMichael Hennerich 
581*331b78edSMichael Hennerich 	return count;
582*331b78edSMichael Hennerich }
583*331b78edSMichael Hennerich 
584*331b78edSMichael Hennerich static DEVICE_ATTR(gpio4, 0664, ad7877_gpio4_show, ad7877_gpio4_store);
585*331b78edSMichael Hennerich 
586*331b78edSMichael Hennerich static struct attribute *ad7877_attributes[] = {
587*331b78edSMichael Hennerich 	&dev_attr_temp1.attr,
588*331b78edSMichael Hennerich 	&dev_attr_temp2.attr,
589*331b78edSMichael Hennerich 	&dev_attr_aux1.attr,
590*331b78edSMichael Hennerich 	&dev_attr_aux2.attr,
591*331b78edSMichael Hennerich 	&dev_attr_bat1.attr,
592*331b78edSMichael Hennerich 	&dev_attr_bat2.attr,
593*331b78edSMichael Hennerich 	&dev_attr_disable.attr,
594*331b78edSMichael Hennerich 	&dev_attr_dac.attr,
595*331b78edSMichael Hennerich 	&dev_attr_gpio4.attr,
596*331b78edSMichael Hennerich 	NULL
597*331b78edSMichael Hennerich };
598*331b78edSMichael Hennerich 
599*331b78edSMichael Hennerich static const struct attribute_group ad7877_attr_group = {
600*331b78edSMichael Hennerich 	.attrs = ad7877_attributes,
601*331b78edSMichael Hennerich };
602*331b78edSMichael Hennerich 
603*331b78edSMichael Hennerich static void ad7877_setup_ts_def_msg(struct spi_device *spi, struct ad7877 *ts)
604*331b78edSMichael Hennerich {
605*331b78edSMichael Hennerich 	struct spi_message *m;
606*331b78edSMichael Hennerich 	int i;
607*331b78edSMichael Hennerich 
608*331b78edSMichael Hennerich 	ts->cmd_crtl2 = AD7877_WRITEADD(AD7877_REG_CTRL2) |
609*331b78edSMichael Hennerich 			AD7877_POL(ts->stopacq_polarity) |
610*331b78edSMichael Hennerich 			AD7877_AVG(ts->averaging) | AD7877_PM(1) |
611*331b78edSMichael Hennerich 			AD7877_TMR(ts->pen_down_acc_interval) |
612*331b78edSMichael Hennerich 			AD7877_ACQ(ts->acquisition_time) |
613*331b78edSMichael Hennerich 			AD7877_FCD(ts->first_conversion_delay);
614*331b78edSMichael Hennerich 
615*331b78edSMichael Hennerich 	ad7877_write(spi, AD7877_REG_CTRL2, ts->cmd_crtl2);
616*331b78edSMichael Hennerich 
617*331b78edSMichael Hennerich 	ts->cmd_crtl1 = AD7877_WRITEADD(AD7877_REG_CTRL1) |
618*331b78edSMichael Hennerich 			AD7877_READADD(AD7877_REG_XPLUS-1) |
619*331b78edSMichael Hennerich 			AD7877_MODE_SEQ1 | AD7877_DFR;
620*331b78edSMichael Hennerich 
621*331b78edSMichael Hennerich 	ad7877_write(spi, AD7877_REG_CTRL1, ts->cmd_crtl1);
622*331b78edSMichael Hennerich 
623*331b78edSMichael Hennerich 	ts->cmd_dummy = 0;
624*331b78edSMichael Hennerich 
625*331b78edSMichael Hennerich 	m = &ts->msg;
626*331b78edSMichael Hennerich 
627*331b78edSMichael Hennerich 	spi_message_init(m);
628*331b78edSMichael Hennerich 
629*331b78edSMichael Hennerich 	m->complete = ad7877_callback;
630*331b78edSMichael Hennerich 	m->context = ts;
631*331b78edSMichael Hennerich 
632*331b78edSMichael Hennerich 	ts->xfer[0].tx_buf = &ts->cmd_crtl1;
633*331b78edSMichael Hennerich 	ts->xfer[0].len = 2;
634*331b78edSMichael Hennerich 
635*331b78edSMichael Hennerich 	spi_message_add_tail(&ts->xfer[0], m);
636*331b78edSMichael Hennerich 
637*331b78edSMichael Hennerich 	ts->xfer[1].tx_buf = &ts->cmd_dummy; /* Send ZERO */
638*331b78edSMichael Hennerich 	ts->xfer[1].len = 2;
639*331b78edSMichael Hennerich 
640*331b78edSMichael Hennerich 	spi_message_add_tail(&ts->xfer[1], m);
641*331b78edSMichael Hennerich 
642*331b78edSMichael Hennerich 	for (i = 0; i < 11; i++) {
643*331b78edSMichael Hennerich 		ts->xfer[i + 2].rx_buf = &ts->conversion_data[AD7877_SEQ_YPOS + i];
644*331b78edSMichael Hennerich 		ts->xfer[i + 2].len = 2;
645*331b78edSMichael Hennerich 		spi_message_add_tail(&ts->xfer[i + 2], m);
646*331b78edSMichael Hennerich 	}
647*331b78edSMichael Hennerich }
648*331b78edSMichael Hennerich 
649*331b78edSMichael Hennerich static int __devinit ad7877_probe(struct spi_device *spi)
650*331b78edSMichael Hennerich {
651*331b78edSMichael Hennerich 	struct ad7877			*ts;
652*331b78edSMichael Hennerich 	struct input_dev		*input_dev;
653*331b78edSMichael Hennerich 	struct ad7877_platform_data	*pdata = spi->dev.platform_data;
654*331b78edSMichael Hennerich 	int				err;
655*331b78edSMichael Hennerich 	u16				verify;
656*331b78edSMichael Hennerich 
657*331b78edSMichael Hennerich 	if (!spi->irq) {
658*331b78edSMichael Hennerich 		dev_dbg(&spi->dev, "no IRQ?\n");
659*331b78edSMichael Hennerich 		return -ENODEV;
660*331b78edSMichael Hennerich 	}
661*331b78edSMichael Hennerich 
662*331b78edSMichael Hennerich 	if (!pdata) {
663*331b78edSMichael Hennerich 		dev_dbg(&spi->dev, "no platform data?\n");
664*331b78edSMichael Hennerich 		return -ENODEV;
665*331b78edSMichael Hennerich 	}
666*331b78edSMichael Hennerich 
667*331b78edSMichael Hennerich 	/* don't exceed max specified SPI CLK frequency */
668*331b78edSMichael Hennerich 	if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) {
669*331b78edSMichael Hennerich 		dev_dbg(&spi->dev, "SPI CLK %d Hz?\n",spi->max_speed_hz);
670*331b78edSMichael Hennerich 		return -EINVAL;
671*331b78edSMichael Hennerich 	}
672*331b78edSMichael Hennerich 
673*331b78edSMichael Hennerich 	ts = kzalloc(sizeof(struct ad7877), GFP_KERNEL);
674*331b78edSMichael Hennerich 	input_dev = input_allocate_device();
675*331b78edSMichael Hennerich 	if (!ts || !input_dev) {
676*331b78edSMichael Hennerich 		err = -ENOMEM;
677*331b78edSMichael Hennerich 		goto err_free_mem;
678*331b78edSMichael Hennerich 	}
679*331b78edSMichael Hennerich 
680*331b78edSMichael Hennerich 	dev_set_drvdata(&spi->dev, ts);
681*331b78edSMichael Hennerich 	ts->spi = spi;
682*331b78edSMichael Hennerich 	ts->input = input_dev;
683*331b78edSMichael Hennerich 
684*331b78edSMichael Hennerich 	setup_timer(&ts->timer, ad7877_timer, (unsigned long) ts);
685*331b78edSMichael Hennerich 	mutex_init(&ts->mutex);
686*331b78edSMichael Hennerich 	spin_lock_init(&ts->lock);
687*331b78edSMichael Hennerich 
688*331b78edSMichael Hennerich 	ts->model = pdata->model ? : 7877;
689*331b78edSMichael Hennerich 	ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100;
690*331b78edSMichael Hennerich 	ts->x_plate_ohms = pdata->x_plate_ohms ? : 400;
691*331b78edSMichael Hennerich 	ts->pressure_max = pdata->pressure_max ? : ~0;
692*331b78edSMichael Hennerich 
693*331b78edSMichael Hennerich 	ts->stopacq_polarity = pdata->stopacq_polarity;
694*331b78edSMichael Hennerich 	ts->first_conversion_delay = pdata->first_conversion_delay;
695*331b78edSMichael Hennerich 	ts->acquisition_time = pdata->acquisition_time;
696*331b78edSMichael Hennerich 	ts->averaging = pdata->averaging;
697*331b78edSMichael Hennerich 	ts->pen_down_acc_interval = pdata->pen_down_acc_interval;
698*331b78edSMichael Hennerich 
699*331b78edSMichael Hennerich 	snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&spi->dev));
700*331b78edSMichael Hennerich 
701*331b78edSMichael Hennerich 	input_dev->name = "AD7877 Touchscreen";
702*331b78edSMichael Hennerich 	input_dev->phys = ts->phys;
703*331b78edSMichael Hennerich 	input_dev->dev.parent = &spi->dev;
704*331b78edSMichael Hennerich 
705*331b78edSMichael Hennerich 	__set_bit(EV_ABS, input_dev->evbit);
706*331b78edSMichael Hennerich 	__set_bit(ABS_X, input_dev->absbit);
707*331b78edSMichael Hennerich 	__set_bit(ABS_Y, input_dev->absbit);
708*331b78edSMichael Hennerich 	__set_bit(ABS_PRESSURE, input_dev->absbit);
709*331b78edSMichael Hennerich 
710*331b78edSMichael Hennerich 	input_set_abs_params(input_dev, ABS_X,
711*331b78edSMichael Hennerich 			pdata->x_min ? : 0,
712*331b78edSMichael Hennerich 			pdata->x_max ? : MAX_12BIT,
713*331b78edSMichael Hennerich 			0, 0);
714*331b78edSMichael Hennerich 	input_set_abs_params(input_dev, ABS_Y,
715*331b78edSMichael Hennerich 			pdata->y_min ? : 0,
716*331b78edSMichael Hennerich 			pdata->y_max ? : MAX_12BIT,
717*331b78edSMichael Hennerich 			0, 0);
718*331b78edSMichael Hennerich 	input_set_abs_params(input_dev, ABS_PRESSURE,
719*331b78edSMichael Hennerich 			pdata->pressure_min, pdata->pressure_max, 0, 0);
720*331b78edSMichael Hennerich 
721*331b78edSMichael Hennerich 	ad7877_write(spi, AD7877_REG_SEQ1, AD7877_MM_SEQUENCE);
722*331b78edSMichael Hennerich 
723*331b78edSMichael Hennerich 	verify = ad7877_read(spi, AD7877_REG_SEQ1);
724*331b78edSMichael Hennerich 
725*331b78edSMichael Hennerich 	if (verify != AD7877_MM_SEQUENCE){
726*331b78edSMichael Hennerich 		dev_err(&spi->dev, "%s: Failed to probe %s\n",
727*331b78edSMichael Hennerich 			dev_name(&spi->dev), input_dev->name);
728*331b78edSMichael Hennerich 		err = -ENODEV;
729*331b78edSMichael Hennerich 		goto err_free_mem;
730*331b78edSMichael Hennerich 	}
731*331b78edSMichael Hennerich 
732*331b78edSMichael Hennerich 	if (gpio3)
733*331b78edSMichael Hennerich 		ad7877_write(spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_3_CONF);
734*331b78edSMichael Hennerich 
735*331b78edSMichael Hennerich 	ad7877_setup_ts_def_msg(spi, ts);
736*331b78edSMichael Hennerich 
737*331b78edSMichael Hennerich 	/* Request AD7877 /DAV GPIO interrupt */
738*331b78edSMichael Hennerich 
739*331b78edSMichael Hennerich 	err = request_irq(spi->irq, ad7877_irq, IRQF_TRIGGER_FALLING |
740*331b78edSMichael Hennerich 			IRQF_SAMPLE_RANDOM, spi->dev.driver->name, ts);
741*331b78edSMichael Hennerich 	if (err) {
742*331b78edSMichael Hennerich 		dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
743*331b78edSMichael Hennerich 		goto err_free_mem;
744*331b78edSMichael Hennerich 	}
745*331b78edSMichael Hennerich 
746*331b78edSMichael Hennerich 	err = sysfs_create_group(&spi->dev.kobj, &ad7877_attr_group);
747*331b78edSMichael Hennerich 	if (err)
748*331b78edSMichael Hennerich 		goto err_free_irq;
749*331b78edSMichael Hennerich 
750*331b78edSMichael Hennerich 	err = device_create_file(&spi->dev,
751*331b78edSMichael Hennerich 				 gpio3 ? &dev_attr_gpio3 : &dev_attr_aux3);
752*331b78edSMichael Hennerich 	if (err)
753*331b78edSMichael Hennerich 		goto err_remove_attr_group;
754*331b78edSMichael Hennerich 
755*331b78edSMichael Hennerich 	err = input_register_device(input_dev);
756*331b78edSMichael Hennerich 	if (err)
757*331b78edSMichael Hennerich 		goto err_remove_attr;
758*331b78edSMichael Hennerich 
759*331b78edSMichael Hennerich 	return 0;
760*331b78edSMichael Hennerich 
761*331b78edSMichael Hennerich err_remove_attr:
762*331b78edSMichael Hennerich 	device_remove_file(&spi->dev,
763*331b78edSMichael Hennerich 			   gpio3 ? &dev_attr_gpio3 : &dev_attr_aux3);
764*331b78edSMichael Hennerich err_remove_attr_group:
765*331b78edSMichael Hennerich 	sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group);
766*331b78edSMichael Hennerich err_free_irq:
767*331b78edSMichael Hennerich 	free_irq(spi->irq, ts);
768*331b78edSMichael Hennerich err_free_mem:
769*331b78edSMichael Hennerich 	input_free_device(input_dev);
770*331b78edSMichael Hennerich 	kfree(ts);
771*331b78edSMichael Hennerich 	dev_set_drvdata(&spi->dev, NULL);
772*331b78edSMichael Hennerich 	return err;
773*331b78edSMichael Hennerich }
774*331b78edSMichael Hennerich 
775*331b78edSMichael Hennerich static int __devexit ad7877_remove(struct spi_device *spi)
776*331b78edSMichael Hennerich {
777*331b78edSMichael Hennerich 	struct ad7877		*ts = dev_get_drvdata(&spi->dev);
778*331b78edSMichael Hennerich 
779*331b78edSMichael Hennerich 	sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group);
780*331b78edSMichael Hennerich 	device_remove_file(&spi->dev,
781*331b78edSMichael Hennerich 			   gpio3 ? &dev_attr_gpio3 : &dev_attr_aux3);
782*331b78edSMichael Hennerich 
783*331b78edSMichael Hennerich 	ad7877_disable(ts);
784*331b78edSMichael Hennerich 	free_irq(ts->spi->irq, ts);
785*331b78edSMichael Hennerich 
786*331b78edSMichael Hennerich 	input_unregister_device(ts->input);
787*331b78edSMichael Hennerich 	kfree(ts);
788*331b78edSMichael Hennerich 
789*331b78edSMichael Hennerich 	dev_dbg(&spi->dev, "unregistered touchscreen\n");
790*331b78edSMichael Hennerich 	dev_set_drvdata(&spi->dev, NULL);
791*331b78edSMichael Hennerich 
792*331b78edSMichael Hennerich 	return 0;
793*331b78edSMichael Hennerich }
794*331b78edSMichael Hennerich 
795*331b78edSMichael Hennerich #ifdef CONFIG_PM
796*331b78edSMichael Hennerich static int ad7877_suspend(struct spi_device *spi, pm_message_t message)
797*331b78edSMichael Hennerich {
798*331b78edSMichael Hennerich 	struct ad7877 *ts = dev_get_drvdata(&spi->dev);
799*331b78edSMichael Hennerich 
800*331b78edSMichael Hennerich 	ad7877_disable(ts);
801*331b78edSMichael Hennerich 
802*331b78edSMichael Hennerich 	return 0;
803*331b78edSMichael Hennerich }
804*331b78edSMichael Hennerich 
805*331b78edSMichael Hennerich static int ad7877_resume(struct spi_device *spi)
806*331b78edSMichael Hennerich {
807*331b78edSMichael Hennerich 	struct ad7877 *ts = dev_get_drvdata(&spi->dev);
808*331b78edSMichael Hennerich 
809*331b78edSMichael Hennerich 	ad7877_enable(ts);
810*331b78edSMichael Hennerich 
811*331b78edSMichael Hennerich 	return 0;
812*331b78edSMichael Hennerich }
813*331b78edSMichael Hennerich #else
814*331b78edSMichael Hennerich #define ad7877_suspend NULL
815*331b78edSMichael Hennerich #define ad7877_resume  NULL
816*331b78edSMichael Hennerich #endif
817*331b78edSMichael Hennerich 
818*331b78edSMichael Hennerich static struct spi_driver ad7877_driver = {
819*331b78edSMichael Hennerich 	.driver = {
820*331b78edSMichael Hennerich 		.name	= "ad7877",
821*331b78edSMichael Hennerich 		.bus	= &spi_bus_type,
822*331b78edSMichael Hennerich 		.owner	= THIS_MODULE,
823*331b78edSMichael Hennerich 	},
824*331b78edSMichael Hennerich 	.probe		= ad7877_probe,
825*331b78edSMichael Hennerich 	.remove		= __devexit_p(ad7877_remove),
826*331b78edSMichael Hennerich 	.suspend	= ad7877_suspend,
827*331b78edSMichael Hennerich 	.resume		= ad7877_resume,
828*331b78edSMichael Hennerich };
829*331b78edSMichael Hennerich 
830*331b78edSMichael Hennerich static int __init ad7877_init(void)
831*331b78edSMichael Hennerich {
832*331b78edSMichael Hennerich 	return spi_register_driver(&ad7877_driver);
833*331b78edSMichael Hennerich }
834*331b78edSMichael Hennerich module_init(ad7877_init);
835*331b78edSMichael Hennerich 
836*331b78edSMichael Hennerich static void __exit ad7877_exit(void)
837*331b78edSMichael Hennerich {
838*331b78edSMichael Hennerich 	spi_unregister_driver(&ad7877_driver);
839*331b78edSMichael Hennerich }
840*331b78edSMichael Hennerich module_exit(ad7877_exit);
841*331b78edSMichael Hennerich 
842*331b78edSMichael Hennerich MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
843*331b78edSMichael Hennerich MODULE_DESCRIPTION("AD7877 touchscreen Driver");
844*331b78edSMichael Hennerich MODULE_LICENSE("GPL");
845