xref: /linux/drivers/input/touchscreen/ad7879.c (revision ec51b7f538c440bfa5a4d538133c659071c02155)
1b4be468cSMichael Hennerich /*
236fb2527SMichael Hennerich  * Copyright (C) 2008-2009 Michael Hennerich, Analog Devices Inc.
3b4be468cSMichael Hennerich  *
436fb2527SMichael Hennerich  * Description:	AD7879/AD7889 based touchscreen, and GPIO driver
536fb2527SMichael Hennerich  *		(I2C/SPI Interface)
6b4be468cSMichael Hennerich  *
7b4be468cSMichael Hennerich  * Bugs:        Enter bugs at http://blackfin.uclinux.org/
8b4be468cSMichael Hennerich  *
9b4be468cSMichael Hennerich  * This program is free software; you can redistribute it and/or modify
10b4be468cSMichael Hennerich  * it under the terms of the GNU General Public License as published by
11b4be468cSMichael Hennerich  * the Free Software Foundation; either version 2 of the License, or
12b4be468cSMichael Hennerich  * (at your option) any later version.
13b4be468cSMichael Hennerich  *
14b4be468cSMichael Hennerich  * This program is distributed in the hope that it will be useful,
15b4be468cSMichael Hennerich  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16b4be468cSMichael Hennerich  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17b4be468cSMichael Hennerich  * GNU General Public License for more details.
18b4be468cSMichael Hennerich  *
19b4be468cSMichael Hennerich  * You should have received a copy of the GNU General Public License
20b4be468cSMichael Hennerich  * along with this program; if not, see the file COPYING, or write
21b4be468cSMichael Hennerich  * to the Free Software Foundation, Inc.,
22b4be468cSMichael Hennerich  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
23b4be468cSMichael Hennerich  *
24b4be468cSMichael Hennerich  * History:
25b4be468cSMichael Hennerich  * Copyright (c) 2005 David Brownell
26b4be468cSMichael Hennerich  * Copyright (c) 2006 Nokia Corporation
27b4be468cSMichael Hennerich  * Various changes: Imre Deak <imre.deak@nokia.com>
28b4be468cSMichael Hennerich  *
29b4be468cSMichael Hennerich  * Using code from:
30b4be468cSMichael Hennerich  *  - corgi_ts.c
31b4be468cSMichael Hennerich  *	Copyright (C) 2004-2005 Richard Purdie
32b4be468cSMichael Hennerich  *  - omap_ts.[hc], ads7846.h, ts_osk.c
33b4be468cSMichael Hennerich  *	Copyright (C) 2002 MontaVista Software
34b4be468cSMichael Hennerich  *	Copyright (C) 2004 Texas Instruments
35b4be468cSMichael Hennerich  *	Copyright (C) 2005 Dirk Behme
36b4be468cSMichael Hennerich  *  - ad7877.c
37b4be468cSMichael Hennerich  *	Copyright (C) 2006-2008 Analog Devices Inc.
38b4be468cSMichael Hennerich  */
39b4be468cSMichael Hennerich 
40b4be468cSMichael Hennerich #include <linux/device.h>
41b4be468cSMichael Hennerich #include <linux/init.h>
42b4be468cSMichael Hennerich #include <linux/delay.h>
43b4be468cSMichael Hennerich #include <linux/input.h>
44b4be468cSMichael Hennerich #include <linux/interrupt.h>
45b4be468cSMichael Hennerich #include <linux/irq.h>
46b4be468cSMichael Hennerich #include <linux/slab.h>
47b4be468cSMichael Hennerich #include <linux/workqueue.h>
48b4be468cSMichael Hennerich #include <linux/spi/spi.h>
49b4be468cSMichael Hennerich #include <linux/i2c.h>
50*ec51b7f5SMichael Hennerich #include <linux/gpio.h>
51b4be468cSMichael Hennerich 
52b4be468cSMichael Hennerich #include <linux/spi/ad7879.h>
53b4be468cSMichael Hennerich 
54b4be468cSMichael Hennerich #define AD7879_REG_ZEROS		0
55b4be468cSMichael Hennerich #define AD7879_REG_CTRL1		1
56b4be468cSMichael Hennerich #define AD7879_REG_CTRL2		2
57b4be468cSMichael Hennerich #define AD7879_REG_CTRL3		3
58b4be468cSMichael Hennerich #define AD7879_REG_AUX1HIGH		4
59b4be468cSMichael Hennerich #define AD7879_REG_AUX1LOW		5
60b4be468cSMichael Hennerich #define AD7879_REG_TEMP1HIGH		6
61b4be468cSMichael Hennerich #define AD7879_REG_TEMP1LOW		7
62b4be468cSMichael Hennerich #define AD7879_REG_XPLUS		8
63b4be468cSMichael Hennerich #define AD7879_REG_YPLUS		9
64b4be468cSMichael Hennerich #define AD7879_REG_Z1			10
65b4be468cSMichael Hennerich #define AD7879_REG_Z2			11
66b4be468cSMichael Hennerich #define AD7879_REG_AUXVBAT		12
67b4be468cSMichael Hennerich #define AD7879_REG_TEMP			13
68b4be468cSMichael Hennerich #define AD7879_REG_REVID		14
69b4be468cSMichael Hennerich 
70b4be468cSMichael Hennerich /* Control REG 1 */
71b4be468cSMichael Hennerich #define AD7879_TMR(x)			((x & 0xFF) << 0)
72b4be468cSMichael Hennerich #define AD7879_ACQ(x)			((x & 0x3) << 8)
73b4be468cSMichael Hennerich #define AD7879_MODE_NOC			(0 << 10)	/* Do not convert */
74b4be468cSMichael Hennerich #define AD7879_MODE_SCC			(1 << 10)	/* Single channel conversion */
75b4be468cSMichael Hennerich #define AD7879_MODE_SEQ0		(2 << 10)	/* Sequence 0 in Slave Mode */
76b4be468cSMichael Hennerich #define AD7879_MODE_SEQ1		(3 << 10)	/* Sequence 1 in Master Mode */
77b4be468cSMichael Hennerich #define AD7879_MODE_INT			(1 << 15)	/* PENIRQ disabled INT enabled */
78b4be468cSMichael Hennerich 
79b4be468cSMichael Hennerich /* Control REG 2 */
80b4be468cSMichael Hennerich #define AD7879_FCD(x)			((x & 0x3) << 0)
81b4be468cSMichael Hennerich #define AD7879_RESET			(1 << 4)
82b4be468cSMichael Hennerich #define AD7879_MFS(x)			((x & 0x3) << 5)
83b4be468cSMichael Hennerich #define AD7879_AVG(x)			((x & 0x3) << 7)
84b4be468cSMichael Hennerich #define	AD7879_SER			(1 << 9)	/* non-differential */
85b4be468cSMichael Hennerich #define	AD7879_DFR			(0 << 9)	/* differential */
86b4be468cSMichael Hennerich #define AD7879_GPIOPOL			(1 << 10)
87b4be468cSMichael Hennerich #define AD7879_GPIODIR			(1 << 11)
88b4be468cSMichael Hennerich #define AD7879_GPIO_DATA		(1 << 12)
89b4be468cSMichael Hennerich #define AD7879_GPIO_EN			(1 << 13)
90b4be468cSMichael Hennerich #define AD7879_PM(x)			((x & 0x3) << 14)
91b4be468cSMichael Hennerich #define AD7879_PM_SHUTDOWN		(0)
92b4be468cSMichael Hennerich #define AD7879_PM_DYN			(1)
93b4be468cSMichael Hennerich #define AD7879_PM_FULLON		(2)
94b4be468cSMichael Hennerich 
95b4be468cSMichael Hennerich /* Control REG 3 */
96b4be468cSMichael Hennerich #define AD7879_TEMPMASK_BIT		(1<<15)
97b4be468cSMichael Hennerich #define AD7879_AUXVBATMASK_BIT		(1<<14)
98b4be468cSMichael Hennerich #define AD7879_INTMODE_BIT		(1<<13)
99b4be468cSMichael Hennerich #define AD7879_GPIOALERTMASK_BIT	(1<<12)
100b4be468cSMichael Hennerich #define AD7879_AUXLOW_BIT		(1<<11)
101b4be468cSMichael Hennerich #define AD7879_AUXHIGH_BIT		(1<<10)
102b4be468cSMichael Hennerich #define AD7879_TEMPLOW_BIT		(1<<9)
103b4be468cSMichael Hennerich #define AD7879_TEMPHIGH_BIT		(1<<8)
104b4be468cSMichael Hennerich #define AD7879_YPLUS_BIT		(1<<7)
105b4be468cSMichael Hennerich #define AD7879_XPLUS_BIT		(1<<6)
106b4be468cSMichael Hennerich #define AD7879_Z1_BIT			(1<<5)
107b4be468cSMichael Hennerich #define AD7879_Z2_BIT			(1<<4)
108b4be468cSMichael Hennerich #define AD7879_AUX_BIT			(1<<3)
109b4be468cSMichael Hennerich #define AD7879_VBAT_BIT			(1<<2)
110b4be468cSMichael Hennerich #define AD7879_TEMP_BIT			(1<<1)
111b4be468cSMichael Hennerich 
112b4be468cSMichael Hennerich enum {
113b4be468cSMichael Hennerich 	AD7879_SEQ_XPOS  = 0,
114b4be468cSMichael Hennerich 	AD7879_SEQ_YPOS  = 1,
115b4be468cSMichael Hennerich 	AD7879_SEQ_Z1    = 2,
116b4be468cSMichael Hennerich 	AD7879_SEQ_Z2    = 3,
117b4be468cSMichael Hennerich 	AD7879_NR_SENSE  = 4,
118b4be468cSMichael Hennerich };
119b4be468cSMichael Hennerich 
120b4be468cSMichael Hennerich #define	MAX_12BIT			((1<<12)-1)
121b4be468cSMichael Hennerich #define	TS_PEN_UP_TIMEOUT		msecs_to_jiffies(50)
122b4be468cSMichael Hennerich 
123b4be468cSMichael Hennerich #if defined(CONFIG_TOUCHSCREEN_AD7879_SPI) || defined(CONFIG_TOUCHSCREEN_AD7879_SPI_MODULE)
124b4be468cSMichael Hennerich #define AD7879_DEVID		0x7A
125b4be468cSMichael Hennerich typedef struct spi_device	bus_device;
126b4be468cSMichael Hennerich #elif defined(CONFIG_TOUCHSCREEN_AD7879_I2C) || defined(CONFIG_TOUCHSCREEN_AD7879_I2C_MODULE)
127b4be468cSMichael Hennerich #define AD7879_DEVID		0x79
128b4be468cSMichael Hennerich typedef struct i2c_client	bus_device;
129b4be468cSMichael Hennerich #endif
130b4be468cSMichael Hennerich 
131b4be468cSMichael Hennerich struct ad7879 {
132b4be468cSMichael Hennerich 	bus_device		*bus;
133b4be468cSMichael Hennerich 	struct input_dev	*input;
134b4be468cSMichael Hennerich 	struct work_struct	work;
135b4be468cSMichael Hennerich 	struct timer_list	timer;
136*ec51b7f5SMichael Hennerich #ifdef CONFIG_GPIOLIB
137*ec51b7f5SMichael Hennerich 	struct gpio_chip	gc;
138*ec51b7f5SMichael Hennerich #endif
139b4be468cSMichael Hennerich 	struct mutex		mutex;
140b4be468cSMichael Hennerich 	unsigned		disabled:1;	/* P: mutex */
141b4be468cSMichael Hennerich 
142b4be468cSMichael Hennerich #if defined(CONFIG_TOUCHSCREEN_AD7879_SPI) || defined(CONFIG_TOUCHSCREEN_AD7879_SPI_MODULE)
143b4be468cSMichael Hennerich 	struct spi_message	msg;
144b4be468cSMichael Hennerich 	struct spi_transfer	xfer[AD7879_NR_SENSE + 1];
145b4be468cSMichael Hennerich 	u16			cmd;
146b4be468cSMichael Hennerich #endif
147b4be468cSMichael Hennerich 	u16			conversion_data[AD7879_NR_SENSE];
148b4be468cSMichael Hennerich 	char			phys[32];
149b4be468cSMichael Hennerich 	u8			first_conversion_delay;
150b4be468cSMichael Hennerich 	u8			acquisition_time;
151b4be468cSMichael Hennerich 	u8			averaging;
152b4be468cSMichael Hennerich 	u8			pen_down_acc_interval;
153b4be468cSMichael Hennerich 	u8			median;
154b4be468cSMichael Hennerich 	u16			x_plate_ohms;
155b4be468cSMichael Hennerich 	u16			pressure_max;
156b4be468cSMichael Hennerich 	u16			cmd_crtl1;
157b4be468cSMichael Hennerich 	u16			cmd_crtl2;
158b4be468cSMichael Hennerich 	u16			cmd_crtl3;
159b4be468cSMichael Hennerich };
160b4be468cSMichael Hennerich 
161b4be468cSMichael Hennerich static int ad7879_read(bus_device *, u8);
162b4be468cSMichael Hennerich static int ad7879_write(bus_device *, u8, u16);
163b4be468cSMichael Hennerich static void ad7879_collect(struct ad7879 *);
164b4be468cSMichael Hennerich 
165b4be468cSMichael Hennerich static void ad7879_report(struct ad7879 *ts)
166b4be468cSMichael Hennerich {
167b4be468cSMichael Hennerich 	struct input_dev *input_dev = ts->input;
168b4be468cSMichael Hennerich 	unsigned Rt;
169b4be468cSMichael Hennerich 	u16 x, y, z1, z2;
170b4be468cSMichael Hennerich 
171b4be468cSMichael Hennerich 	x = ts->conversion_data[AD7879_SEQ_XPOS] & MAX_12BIT;
172b4be468cSMichael Hennerich 	y = ts->conversion_data[AD7879_SEQ_YPOS] & MAX_12BIT;
173b4be468cSMichael Hennerich 	z1 = ts->conversion_data[AD7879_SEQ_Z1] & MAX_12BIT;
174b4be468cSMichael Hennerich 	z2 = ts->conversion_data[AD7879_SEQ_Z2] & MAX_12BIT;
175b4be468cSMichael Hennerich 
176b4be468cSMichael Hennerich 	/*
177b4be468cSMichael Hennerich 	 * The samples processed here are already preprocessed by the AD7879.
178b4be468cSMichael Hennerich 	 * The preprocessing function consists of a median and an averaging filter.
179b4be468cSMichael Hennerich 	 * The combination of these two techniques provides a robust solution,
180b4be468cSMichael Hennerich 	 * discarding the spurious noise in the signal and keeping only the data of interest.
181b4be468cSMichael Hennerich 	 * The size of both filters is programmable. (dev.platform_data, see linux/spi/ad7879.h)
182b4be468cSMichael Hennerich 	 * Other user-programmable conversion controls include variable acquisition time,
183b4be468cSMichael Hennerich 	 * and first conversion delay. Up to 16 averages can be taken per conversion.
184b4be468cSMichael Hennerich 	 */
185b4be468cSMichael Hennerich 
186b4be468cSMichael Hennerich 	if (likely(x && z1)) {
187b4be468cSMichael Hennerich 		/* compute touch pressure resistance using equation #1 */
188b4be468cSMichael Hennerich 		Rt = (z2 - z1) * x * ts->x_plate_ohms;
189b4be468cSMichael Hennerich 		Rt /= z1;
190b4be468cSMichael Hennerich 		Rt = (Rt + 2047) >> 12;
191b4be468cSMichael Hennerich 
192b4be468cSMichael Hennerich 		input_report_abs(input_dev, ABS_X, x);
193b4be468cSMichael Hennerich 		input_report_abs(input_dev, ABS_Y, y);
194b4be468cSMichael Hennerich 		input_report_abs(input_dev, ABS_PRESSURE, Rt);
195b4be468cSMichael Hennerich 		input_sync(input_dev);
196b4be468cSMichael Hennerich 	}
197b4be468cSMichael Hennerich }
198b4be468cSMichael Hennerich 
199b4be468cSMichael Hennerich static void ad7879_work(struct work_struct *work)
200b4be468cSMichael Hennerich {
201b4be468cSMichael Hennerich 	struct ad7879 *ts = container_of(work, struct ad7879, work);
202b4be468cSMichael Hennerich 
203b4be468cSMichael Hennerich 	/* use keventd context to read the result registers */
204b4be468cSMichael Hennerich 	ad7879_collect(ts);
205b4be468cSMichael Hennerich 	ad7879_report(ts);
206b4be468cSMichael Hennerich 	mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT);
207b4be468cSMichael Hennerich }
208b4be468cSMichael Hennerich 
209b4be468cSMichael Hennerich static void ad7879_ts_event_release(struct ad7879 *ts)
210b4be468cSMichael Hennerich {
211b4be468cSMichael Hennerich 	struct input_dev *input_dev = ts->input;
212b4be468cSMichael Hennerich 
213b4be468cSMichael Hennerich 	input_report_abs(input_dev, ABS_PRESSURE, 0);
214b4be468cSMichael Hennerich 	input_sync(input_dev);
215b4be468cSMichael Hennerich }
216b4be468cSMichael Hennerich 
217b4be468cSMichael Hennerich static void ad7879_timer(unsigned long handle)
218b4be468cSMichael Hennerich {
219b4be468cSMichael Hennerich 	struct ad7879 *ts = (void *)handle;
220b4be468cSMichael Hennerich 
221b4be468cSMichael Hennerich 	ad7879_ts_event_release(ts);
222b4be468cSMichael Hennerich }
223b4be468cSMichael Hennerich 
224b4be468cSMichael Hennerich static irqreturn_t ad7879_irq(int irq, void *handle)
225b4be468cSMichael Hennerich {
226b4be468cSMichael Hennerich 	struct ad7879 *ts = handle;
227b4be468cSMichael Hennerich 
228b4be468cSMichael Hennerich 	/* The repeated conversion sequencer controlled by TMR kicked off too fast.
229b4be468cSMichael Hennerich 	 * We ignore the last and process the sample sequence currently in the queue.
230b4be468cSMichael Hennerich 	 * It can't be older than 9.4ms
231b4be468cSMichael Hennerich 	 */
232b4be468cSMichael Hennerich 
233b4be468cSMichael Hennerich 	if (!work_pending(&ts->work))
234b4be468cSMichael Hennerich 		schedule_work(&ts->work);
235b4be468cSMichael Hennerich 
236b4be468cSMichael Hennerich 	return IRQ_HANDLED;
237b4be468cSMichael Hennerich }
238b4be468cSMichael Hennerich 
239b4be468cSMichael Hennerich static void ad7879_setup(struct ad7879 *ts)
240b4be468cSMichael Hennerich {
241b4be468cSMichael Hennerich 	ad7879_write(ts->bus, AD7879_REG_CTRL2, ts->cmd_crtl2);
242b4be468cSMichael Hennerich 	ad7879_write(ts->bus, AD7879_REG_CTRL3, ts->cmd_crtl3);
243b4be468cSMichael Hennerich 	ad7879_write(ts->bus, AD7879_REG_CTRL1, ts->cmd_crtl1);
244b4be468cSMichael Hennerich }
245b4be468cSMichael Hennerich 
246b4be468cSMichael Hennerich static void ad7879_disable(struct ad7879 *ts)
247b4be468cSMichael Hennerich {
248b4be468cSMichael Hennerich 	mutex_lock(&ts->mutex);
249b4be468cSMichael Hennerich 
250b4be468cSMichael Hennerich 	if (!ts->disabled) {
251b4be468cSMichael Hennerich 
252b4be468cSMichael Hennerich 		ts->disabled = 1;
253b4be468cSMichael Hennerich 		disable_irq(ts->bus->irq);
254b4be468cSMichael Hennerich 
255b4be468cSMichael Hennerich 		cancel_work_sync(&ts->work);
256b4be468cSMichael Hennerich 
257b4be468cSMichael Hennerich 		if (del_timer_sync(&ts->timer))
258b4be468cSMichael Hennerich 			ad7879_ts_event_release(ts);
259b4be468cSMichael Hennerich 
260b4be468cSMichael Hennerich 		ad7879_write(ts->bus, AD7879_REG_CTRL2,
261b4be468cSMichael Hennerich 			     AD7879_PM(AD7879_PM_SHUTDOWN));
262b4be468cSMichael Hennerich 	}
263b4be468cSMichael Hennerich 
264b4be468cSMichael Hennerich 	mutex_unlock(&ts->mutex);
265b4be468cSMichael Hennerich }
266b4be468cSMichael Hennerich 
267b4be468cSMichael Hennerich static void ad7879_enable(struct ad7879 *ts)
268b4be468cSMichael Hennerich {
269b4be468cSMichael Hennerich 	mutex_lock(&ts->mutex);
270b4be468cSMichael Hennerich 
271b4be468cSMichael Hennerich 	if (ts->disabled) {
272b4be468cSMichael Hennerich 		ad7879_setup(ts);
273b4be468cSMichael Hennerich 		ts->disabled = 0;
274b4be468cSMichael Hennerich 		enable_irq(ts->bus->irq);
275b4be468cSMichael Hennerich 	}
276b4be468cSMichael Hennerich 
277b4be468cSMichael Hennerich 	mutex_unlock(&ts->mutex);
278b4be468cSMichael Hennerich }
279b4be468cSMichael Hennerich 
280b4be468cSMichael Hennerich static ssize_t ad7879_disable_show(struct device *dev,
281b4be468cSMichael Hennerich 				     struct device_attribute *attr, char *buf)
282b4be468cSMichael Hennerich {
283b4be468cSMichael Hennerich 	struct ad7879 *ts = dev_get_drvdata(dev);
284b4be468cSMichael Hennerich 
285b4be468cSMichael Hennerich 	return sprintf(buf, "%u\n", ts->disabled);
286b4be468cSMichael Hennerich }
287b4be468cSMichael Hennerich 
288b4be468cSMichael Hennerich static ssize_t ad7879_disable_store(struct device *dev,
289b4be468cSMichael Hennerich 				     struct device_attribute *attr,
290b4be468cSMichael Hennerich 				     const char *buf, size_t count)
291b4be468cSMichael Hennerich {
292b4be468cSMichael Hennerich 	struct ad7879 *ts = dev_get_drvdata(dev);
293b4be468cSMichael Hennerich 	unsigned long val;
294b4be468cSMichael Hennerich 	int error;
295b4be468cSMichael Hennerich 
296b4be468cSMichael Hennerich 	error = strict_strtoul(buf, 10, &val);
297b4be468cSMichael Hennerich 	if (error)
298b4be468cSMichael Hennerich 		return error;
299b4be468cSMichael Hennerich 
300b4be468cSMichael Hennerich 	if (val)
301b4be468cSMichael Hennerich 		ad7879_disable(ts);
302b4be468cSMichael Hennerich 	else
303b4be468cSMichael Hennerich 		ad7879_enable(ts);
304b4be468cSMichael Hennerich 
305b4be468cSMichael Hennerich 	return count;
306b4be468cSMichael Hennerich }
307b4be468cSMichael Hennerich 
308b4be468cSMichael Hennerich static DEVICE_ATTR(disable, 0664, ad7879_disable_show, ad7879_disable_store);
309b4be468cSMichael Hennerich 
310b4be468cSMichael Hennerich static struct attribute *ad7879_attributes[] = {
311b4be468cSMichael Hennerich 	&dev_attr_disable.attr,
312b4be468cSMichael Hennerich 	NULL
313b4be468cSMichael Hennerich };
314b4be468cSMichael Hennerich 
315b4be468cSMichael Hennerich static const struct attribute_group ad7879_attr_group = {
316b4be468cSMichael Hennerich 	.attrs = ad7879_attributes,
317b4be468cSMichael Hennerich };
318b4be468cSMichael Hennerich 
319*ec51b7f5SMichael Hennerich #ifdef CONFIG_GPIOLIB
320*ec51b7f5SMichael Hennerich static int ad7879_gpio_direction_input(struct gpio_chip *chip,
321*ec51b7f5SMichael Hennerich 					unsigned gpio)
322*ec51b7f5SMichael Hennerich {
323*ec51b7f5SMichael Hennerich 	struct ad7879 *ts = container_of(chip, struct ad7879, gc);
324*ec51b7f5SMichael Hennerich 	int err;
325*ec51b7f5SMichael Hennerich 
326*ec51b7f5SMichael Hennerich 	mutex_lock(&ts->mutex);
327*ec51b7f5SMichael Hennerich 	ts->cmd_crtl2 |= AD7879_GPIO_EN | AD7879_GPIODIR | AD7879_GPIOPOL;
328*ec51b7f5SMichael Hennerich 	err = ad7879_write(ts->bus, AD7879_REG_CTRL2, ts->cmd_crtl2);
329*ec51b7f5SMichael Hennerich 	mutex_unlock(&ts->mutex);
330*ec51b7f5SMichael Hennerich 
331*ec51b7f5SMichael Hennerich 	return err;
332*ec51b7f5SMichael Hennerich }
333*ec51b7f5SMichael Hennerich 
334*ec51b7f5SMichael Hennerich static int ad7879_gpio_direction_output(struct gpio_chip *chip,
335*ec51b7f5SMichael Hennerich 					unsigned gpio, int level)
336*ec51b7f5SMichael Hennerich {
337*ec51b7f5SMichael Hennerich 	struct ad7879 *ts = container_of(chip, struct ad7879, gc);
338*ec51b7f5SMichael Hennerich 	int err;
339*ec51b7f5SMichael Hennerich 
340*ec51b7f5SMichael Hennerich 	mutex_lock(&ts->mutex);
341*ec51b7f5SMichael Hennerich 	ts->cmd_crtl2 &= ~AD7879_GPIODIR;
342*ec51b7f5SMichael Hennerich 	ts->cmd_crtl2 |= AD7879_GPIO_EN | AD7879_GPIOPOL;
343*ec51b7f5SMichael Hennerich 	if (level)
344*ec51b7f5SMichael Hennerich 		ts->cmd_crtl2 |= AD7879_GPIO_DATA;
345*ec51b7f5SMichael Hennerich 	else
346*ec51b7f5SMichael Hennerich 		ts->cmd_crtl2 &= ~AD7879_GPIO_DATA;
347*ec51b7f5SMichael Hennerich 
348*ec51b7f5SMichael Hennerich 	err = ad7879_write(ts->bus, AD7879_REG_CTRL2, ts->cmd_crtl2);
349*ec51b7f5SMichael Hennerich 	mutex_unlock(&ts->mutex);
350*ec51b7f5SMichael Hennerich 
351*ec51b7f5SMichael Hennerich 	return err;
352*ec51b7f5SMichael Hennerich }
353*ec51b7f5SMichael Hennerich 
354*ec51b7f5SMichael Hennerich static int ad7879_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
355*ec51b7f5SMichael Hennerich {
356*ec51b7f5SMichael Hennerich 	struct ad7879 *ts = container_of(chip, struct ad7879, gc);
357*ec51b7f5SMichael Hennerich 	u16 val;
358*ec51b7f5SMichael Hennerich 
359*ec51b7f5SMichael Hennerich 	mutex_lock(&ts->mutex);
360*ec51b7f5SMichael Hennerich 	val = ad7879_read(ts->bus, AD7879_REG_CTRL2);
361*ec51b7f5SMichael Hennerich 	mutex_unlock(&ts->mutex);
362*ec51b7f5SMichael Hennerich 
363*ec51b7f5SMichael Hennerich 	return !!(val & AD7879_GPIO_DATA);
364*ec51b7f5SMichael Hennerich }
365*ec51b7f5SMichael Hennerich 
366*ec51b7f5SMichael Hennerich static void ad7879_gpio_set_value(struct gpio_chip *chip,
367*ec51b7f5SMichael Hennerich 				  unsigned gpio, int value)
368*ec51b7f5SMichael Hennerich {
369*ec51b7f5SMichael Hennerich 	struct ad7879 *ts = container_of(chip, struct ad7879, gc);
370*ec51b7f5SMichael Hennerich 
371*ec51b7f5SMichael Hennerich 	mutex_lock(&ts->mutex);
372*ec51b7f5SMichael Hennerich 	if (value)
373*ec51b7f5SMichael Hennerich 		ts->cmd_crtl2 |= AD7879_GPIO_DATA;
374*ec51b7f5SMichael Hennerich 	else
375*ec51b7f5SMichael Hennerich 		ts->cmd_crtl2 &= ~AD7879_GPIO_DATA;
376*ec51b7f5SMichael Hennerich 
377*ec51b7f5SMichael Hennerich 	ad7879_write(ts->bus, AD7879_REG_CTRL2, ts->cmd_crtl2);
378*ec51b7f5SMichael Hennerich 	mutex_unlock(&ts->mutex);
379*ec51b7f5SMichael Hennerich }
380*ec51b7f5SMichael Hennerich 
381*ec51b7f5SMichael Hennerich static int __devinit ad7879_gpio_add(struct device *dev)
382*ec51b7f5SMichael Hennerich {
383*ec51b7f5SMichael Hennerich 	struct ad7879 *ts = dev_get_drvdata(dev);
384*ec51b7f5SMichael Hennerich 	struct ad7879_platform_data *pdata = dev->platform_data;
385*ec51b7f5SMichael Hennerich 	int ret = 0;
386*ec51b7f5SMichael Hennerich 
387*ec51b7f5SMichael Hennerich 	if (pdata->gpio_export) {
388*ec51b7f5SMichael Hennerich 		ts->gc.direction_input = ad7879_gpio_direction_input;
389*ec51b7f5SMichael Hennerich 		ts->gc.direction_output = ad7879_gpio_direction_output;
390*ec51b7f5SMichael Hennerich 		ts->gc.get = ad7879_gpio_get_value;
391*ec51b7f5SMichael Hennerich 		ts->gc.set = ad7879_gpio_set_value;
392*ec51b7f5SMichael Hennerich 		ts->gc.can_sleep = 1;
393*ec51b7f5SMichael Hennerich 		ts->gc.base = pdata->gpio_base;
394*ec51b7f5SMichael Hennerich 		ts->gc.ngpio = 1;
395*ec51b7f5SMichael Hennerich 		ts->gc.label = "AD7879-GPIO";
396*ec51b7f5SMichael Hennerich 		ts->gc.owner = THIS_MODULE;
397*ec51b7f5SMichael Hennerich 		ts->gc.dev = dev;
398*ec51b7f5SMichael Hennerich 
399*ec51b7f5SMichael Hennerich 		ret = gpiochip_add(&ts->gc);
400*ec51b7f5SMichael Hennerich 		if (ret)
401*ec51b7f5SMichael Hennerich 			dev_err(dev, "failed to register gpio %d\n",
402*ec51b7f5SMichael Hennerich 				ts->gc.base);
403*ec51b7f5SMichael Hennerich 	}
404*ec51b7f5SMichael Hennerich 
405*ec51b7f5SMichael Hennerich 	return ret;
406*ec51b7f5SMichael Hennerich }
407*ec51b7f5SMichael Hennerich 
408*ec51b7f5SMichael Hennerich /*
409*ec51b7f5SMichael Hennerich  * We mark ad7879_gpio_remove inline so there is a chance the code
410*ec51b7f5SMichael Hennerich  * gets discarded when not needed. We can't do __devinit/__devexit
411*ec51b7f5SMichael Hennerich  * markup since it is used in both probe and remove methods.
412*ec51b7f5SMichael Hennerich  */
413*ec51b7f5SMichael Hennerich static inline void ad7879_gpio_remove(struct device *dev)
414*ec51b7f5SMichael Hennerich {
415*ec51b7f5SMichael Hennerich 	struct ad7879 *ts = dev_get_drvdata(dev);
416*ec51b7f5SMichael Hennerich 	struct ad7879_platform_data *pdata = dev->platform_data;
417*ec51b7f5SMichael Hennerich 	int ret;
418*ec51b7f5SMichael Hennerich 
419*ec51b7f5SMichael Hennerich 	if (pdata->gpio_export) {
420*ec51b7f5SMichael Hennerich 		ret = gpiochip_remove(&ts->gc);
421*ec51b7f5SMichael Hennerich 		if (ret)
422*ec51b7f5SMichael Hennerich 			dev_err(dev, "failed to remove gpio %d\n",
423*ec51b7f5SMichael Hennerich 				ts->gc.base);
424*ec51b7f5SMichael Hennerich 	}
425*ec51b7f5SMichael Hennerich }
426*ec51b7f5SMichael Hennerich #else
427*ec51b7f5SMichael Hennerich static inline int ad7879_gpio_add(struct device *dev)
428*ec51b7f5SMichael Hennerich {
429*ec51b7f5SMichael Hennerich 	return 0;
430*ec51b7f5SMichael Hennerich }
431*ec51b7f5SMichael Hennerich 
432*ec51b7f5SMichael Hennerich static inline void ad7879_gpio_remove(struct device *dev)
433*ec51b7f5SMichael Hennerich {
434*ec51b7f5SMichael Hennerich }
435*ec51b7f5SMichael Hennerich #endif
436*ec51b7f5SMichael Hennerich 
437b4be468cSMichael Hennerich static int __devinit ad7879_construct(bus_device *bus, struct ad7879 *ts)
438b4be468cSMichael Hennerich {
439b4be468cSMichael Hennerich 	struct input_dev *input_dev;
440b4be468cSMichael Hennerich 	struct ad7879_platform_data *pdata = bus->dev.platform_data;
441b4be468cSMichael Hennerich 	int err;
442b4be468cSMichael Hennerich 	u16 revid;
443b4be468cSMichael Hennerich 
444b4be468cSMichael Hennerich 	if (!bus->irq) {
445b4be468cSMichael Hennerich 		dev_err(&bus->dev, "no IRQ?\n");
446b4be468cSMichael Hennerich 		return -ENODEV;
447b4be468cSMichael Hennerich 	}
448b4be468cSMichael Hennerich 
449b4be468cSMichael Hennerich 	if (!pdata) {
450b4be468cSMichael Hennerich 		dev_err(&bus->dev, "no platform data?\n");
451b4be468cSMichael Hennerich 		return -ENODEV;
452b4be468cSMichael Hennerich 	}
453b4be468cSMichael Hennerich 
454b4be468cSMichael Hennerich 	input_dev = input_allocate_device();
455b4be468cSMichael Hennerich 	if (!input_dev)
456b4be468cSMichael Hennerich 		return -ENOMEM;
457b4be468cSMichael Hennerich 
458b4be468cSMichael Hennerich 	ts->input = input_dev;
459b4be468cSMichael Hennerich 
460b4be468cSMichael Hennerich 	setup_timer(&ts->timer, ad7879_timer, (unsigned long) ts);
461b4be468cSMichael Hennerich 	INIT_WORK(&ts->work, ad7879_work);
462b4be468cSMichael Hennerich 	mutex_init(&ts->mutex);
463b4be468cSMichael Hennerich 
464b4be468cSMichael Hennerich 	ts->x_plate_ohms = pdata->x_plate_ohms ? : 400;
465b4be468cSMichael Hennerich 	ts->pressure_max = pdata->pressure_max ? : ~0;
466b4be468cSMichael Hennerich 
467b4be468cSMichael Hennerich 	ts->first_conversion_delay = pdata->first_conversion_delay;
468b4be468cSMichael Hennerich 	ts->acquisition_time = pdata->acquisition_time;
469b4be468cSMichael Hennerich 	ts->averaging = pdata->averaging;
470b4be468cSMichael Hennerich 	ts->pen_down_acc_interval = pdata->pen_down_acc_interval;
471b4be468cSMichael Hennerich 	ts->median = pdata->median;
472b4be468cSMichael Hennerich 
473b4be468cSMichael Hennerich 	snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&bus->dev));
474b4be468cSMichael Hennerich 
475b4be468cSMichael Hennerich 	input_dev->name = "AD7879 Touchscreen";
476b4be468cSMichael Hennerich 	input_dev->phys = ts->phys;
477b4be468cSMichael Hennerich 	input_dev->dev.parent = &bus->dev;
478b4be468cSMichael Hennerich 
479b4be468cSMichael Hennerich 	__set_bit(EV_ABS, input_dev->evbit);
480b4be468cSMichael Hennerich 	__set_bit(ABS_X, input_dev->absbit);
481b4be468cSMichael Hennerich 	__set_bit(ABS_Y, input_dev->absbit);
482b4be468cSMichael Hennerich 	__set_bit(ABS_PRESSURE, input_dev->absbit);
483b4be468cSMichael Hennerich 
484b4be468cSMichael Hennerich 	input_set_abs_params(input_dev, ABS_X,
485b4be468cSMichael Hennerich 			pdata->x_min ? : 0,
486b4be468cSMichael Hennerich 			pdata->x_max ? : MAX_12BIT,
487b4be468cSMichael Hennerich 			0, 0);
488b4be468cSMichael Hennerich 	input_set_abs_params(input_dev, ABS_Y,
489b4be468cSMichael Hennerich 			pdata->y_min ? : 0,
490b4be468cSMichael Hennerich 			pdata->y_max ? : MAX_12BIT,
491b4be468cSMichael Hennerich 			0, 0);
492b4be468cSMichael Hennerich 	input_set_abs_params(input_dev, ABS_PRESSURE,
493b4be468cSMichael Hennerich 			pdata->pressure_min, pdata->pressure_max, 0, 0);
494b4be468cSMichael Hennerich 
495b4be468cSMichael Hennerich 	err = ad7879_write(bus, AD7879_REG_CTRL2, AD7879_RESET);
496b4be468cSMichael Hennerich 
497b4be468cSMichael Hennerich 	if (err < 0) {
498b4be468cSMichael Hennerich 		dev_err(&bus->dev, "Failed to write %s\n", input_dev->name);
499b4be468cSMichael Hennerich 		goto err_free_mem;
500b4be468cSMichael Hennerich 	}
501b4be468cSMichael Hennerich 
502b4be468cSMichael Hennerich 	revid = ad7879_read(bus, AD7879_REG_REVID);
503b4be468cSMichael Hennerich 
504b4be468cSMichael Hennerich 	if ((revid & 0xFF) != AD7879_DEVID) {
505b4be468cSMichael Hennerich 		dev_err(&bus->dev, "Failed to probe %s\n", input_dev->name);
506b4be468cSMichael Hennerich 		err = -ENODEV;
507b4be468cSMichael Hennerich 		goto err_free_mem;
508b4be468cSMichael Hennerich 	}
509b4be468cSMichael Hennerich 
510*ec51b7f5SMichael Hennerich 	ts->cmd_crtl3 = AD7879_YPLUS_BIT |
511*ec51b7f5SMichael Hennerich 			AD7879_XPLUS_BIT |
512*ec51b7f5SMichael Hennerich 			AD7879_Z2_BIT |
513*ec51b7f5SMichael Hennerich 			AD7879_Z1_BIT |
514*ec51b7f5SMichael Hennerich 			AD7879_TEMPMASK_BIT |
515*ec51b7f5SMichael Hennerich 			AD7879_AUXVBATMASK_BIT |
516*ec51b7f5SMichael Hennerich 			AD7879_GPIOALERTMASK_BIT;
517*ec51b7f5SMichael Hennerich 
518*ec51b7f5SMichael Hennerich 	ts->cmd_crtl2 = AD7879_PM(AD7879_PM_DYN) | AD7879_DFR |
519*ec51b7f5SMichael Hennerich 			AD7879_AVG(ts->averaging) |
520*ec51b7f5SMichael Hennerich 			AD7879_MFS(ts->median) |
521*ec51b7f5SMichael Hennerich 			AD7879_FCD(ts->first_conversion_delay);
522*ec51b7f5SMichael Hennerich 
523*ec51b7f5SMichael Hennerich 	ts->cmd_crtl1 = AD7879_MODE_INT | AD7879_MODE_SEQ1 |
524*ec51b7f5SMichael Hennerich 			AD7879_ACQ(ts->acquisition_time) |
525*ec51b7f5SMichael Hennerich 			AD7879_TMR(ts->pen_down_acc_interval);
526*ec51b7f5SMichael Hennerich 
527b4be468cSMichael Hennerich 	ad7879_setup(ts);
528b4be468cSMichael Hennerich 
529b4be468cSMichael Hennerich 	err = request_irq(bus->irq, ad7879_irq,
5300bc69ce6SMichael Hennerich 			  IRQF_TRIGGER_FALLING, bus->dev.driver->name, ts);
531b4be468cSMichael Hennerich 
532b4be468cSMichael Hennerich 	if (err) {
533b4be468cSMichael Hennerich 		dev_err(&bus->dev, "irq %d busy?\n", bus->irq);
534b4be468cSMichael Hennerich 		goto err_free_mem;
535b4be468cSMichael Hennerich 	}
536b4be468cSMichael Hennerich 
537b4be468cSMichael Hennerich 	err = sysfs_create_group(&bus->dev.kobj, &ad7879_attr_group);
538b4be468cSMichael Hennerich 	if (err)
539b4be468cSMichael Hennerich 		goto err_free_irq;
540b4be468cSMichael Hennerich 
541*ec51b7f5SMichael Hennerich 	err = ad7879_gpio_add(&bus->dev);
542b4be468cSMichael Hennerich 	if (err)
543b4be468cSMichael Hennerich 		goto err_remove_attr;
544b4be468cSMichael Hennerich 
545*ec51b7f5SMichael Hennerich 	err = input_register_device(input_dev);
546*ec51b7f5SMichael Hennerich 	if (err)
547*ec51b7f5SMichael Hennerich 		goto err_remove_gpio;
548*ec51b7f5SMichael Hennerich 
549b4be468cSMichael Hennerich 	dev_info(&bus->dev, "Rev.%d touchscreen, irq %d\n",
550b4be468cSMichael Hennerich 		 revid >> 8, bus->irq);
551b4be468cSMichael Hennerich 
552b4be468cSMichael Hennerich 	return 0;
553b4be468cSMichael Hennerich 
554*ec51b7f5SMichael Hennerich err_remove_gpio:
555*ec51b7f5SMichael Hennerich 	ad7879_gpio_remove(&bus->dev);
556b4be468cSMichael Hennerich err_remove_attr:
557b4be468cSMichael Hennerich 	sysfs_remove_group(&bus->dev.kobj, &ad7879_attr_group);
558b4be468cSMichael Hennerich err_free_irq:
559b4be468cSMichael Hennerich 	free_irq(bus->irq, ts);
560b4be468cSMichael Hennerich err_free_mem:
561b4be468cSMichael Hennerich 	input_free_device(input_dev);
562b4be468cSMichael Hennerich 
563b4be468cSMichael Hennerich 	return err;
564b4be468cSMichael Hennerich }
565b4be468cSMichael Hennerich 
566b4be468cSMichael Hennerich static int __devexit ad7879_destroy(bus_device *bus, struct ad7879 *ts)
567b4be468cSMichael Hennerich {
568*ec51b7f5SMichael Hennerich 	ad7879_gpio_remove(&bus->dev);
569b4be468cSMichael Hennerich 	ad7879_disable(ts);
570b4be468cSMichael Hennerich 	sysfs_remove_group(&ts->bus->dev.kobj, &ad7879_attr_group);
571b4be468cSMichael Hennerich 	free_irq(ts->bus->irq, ts);
572b4be468cSMichael Hennerich 	input_unregister_device(ts->input);
573b4be468cSMichael Hennerich 	dev_dbg(&bus->dev, "unregistered touchscreen\n");
574b4be468cSMichael Hennerich 
575b4be468cSMichael Hennerich 	return 0;
576b4be468cSMichael Hennerich }
577b4be468cSMichael Hennerich 
578b4be468cSMichael Hennerich #ifdef CONFIG_PM
579b4be468cSMichael Hennerich static int ad7879_suspend(bus_device *bus, pm_message_t message)
580b4be468cSMichael Hennerich {
581b4be468cSMichael Hennerich 	struct ad7879 *ts = dev_get_drvdata(&bus->dev);
582b4be468cSMichael Hennerich 
583b4be468cSMichael Hennerich 	ad7879_disable(ts);
584b4be468cSMichael Hennerich 
585b4be468cSMichael Hennerich 	return 0;
586b4be468cSMichael Hennerich }
587b4be468cSMichael Hennerich 
588b4be468cSMichael Hennerich static int ad7879_resume(bus_device *bus)
589b4be468cSMichael Hennerich {
590b4be468cSMichael Hennerich 	struct ad7879 *ts = dev_get_drvdata(&bus->dev);
591b4be468cSMichael Hennerich 
592b4be468cSMichael Hennerich 	ad7879_enable(ts);
593b4be468cSMichael Hennerich 
594b4be468cSMichael Hennerich 	return 0;
595b4be468cSMichael Hennerich }
596b4be468cSMichael Hennerich #else
597b4be468cSMichael Hennerich #define ad7879_suspend NULL
598b4be468cSMichael Hennerich #define ad7879_resume  NULL
599b4be468cSMichael Hennerich #endif
600b4be468cSMichael Hennerich 
601b4be468cSMichael Hennerich #if defined(CONFIG_TOUCHSCREEN_AD7879_SPI) || defined(CONFIG_TOUCHSCREEN_AD7879_SPI_MODULE)
602b4be468cSMichael Hennerich #define MAX_SPI_FREQ_HZ		5000000
603b4be468cSMichael Hennerich #define AD7879_CMD_MAGIC	0xE000
604b4be468cSMichael Hennerich #define AD7879_CMD_READ		(1 << 10)
605b4be468cSMichael Hennerich #define AD7879_WRITECMD(reg)	(AD7879_CMD_MAGIC | (reg & 0xF))
606b4be468cSMichael Hennerich #define AD7879_READCMD(reg)	(AD7879_CMD_MAGIC | AD7879_CMD_READ | (reg & 0xF))
607b4be468cSMichael Hennerich 
608b4be468cSMichael Hennerich struct ser_req {
609b4be468cSMichael Hennerich 	u16			command;
610b4be468cSMichael Hennerich 	u16			data;
611b4be468cSMichael Hennerich 	struct spi_message	msg;
612b4be468cSMichael Hennerich 	struct spi_transfer	xfer[2];
613b4be468cSMichael Hennerich };
614b4be468cSMichael Hennerich 
615b4be468cSMichael Hennerich /*
616b4be468cSMichael Hennerich  * ad7879_read/write are only used for initial setup and for sysfs controls.
617b4be468cSMichael Hennerich  * The main traffic is done in ad7879_collect().
618b4be468cSMichael Hennerich  */
619b4be468cSMichael Hennerich 
620b4be468cSMichael Hennerich static int ad7879_read(struct spi_device *spi, u8 reg)
621b4be468cSMichael Hennerich {
622b4be468cSMichael Hennerich 	struct ser_req *req;
623b4be468cSMichael Hennerich 	int status, ret;
624b4be468cSMichael Hennerich 
625b4be468cSMichael Hennerich 	req = kzalloc(sizeof *req, GFP_KERNEL);
626b4be468cSMichael Hennerich 	if (!req)
627b4be468cSMichael Hennerich 		return -ENOMEM;
628b4be468cSMichael Hennerich 
629b4be468cSMichael Hennerich 	spi_message_init(&req->msg);
630b4be468cSMichael Hennerich 
631b4be468cSMichael Hennerich 	req->command = (u16) AD7879_READCMD(reg);
632b4be468cSMichael Hennerich 	req->xfer[0].tx_buf = &req->command;
633b4be468cSMichael Hennerich 	req->xfer[0].len = 2;
634b4be468cSMichael Hennerich 
635b4be468cSMichael Hennerich 	req->xfer[1].rx_buf = &req->data;
636b4be468cSMichael Hennerich 	req->xfer[1].len = 2;
637b4be468cSMichael Hennerich 
638b4be468cSMichael Hennerich 	spi_message_add_tail(&req->xfer[0], &req->msg);
639b4be468cSMichael Hennerich 	spi_message_add_tail(&req->xfer[1], &req->msg);
640b4be468cSMichael Hennerich 
641b4be468cSMichael Hennerich 	status = spi_sync(spi, &req->msg);
642b4be468cSMichael Hennerich 	ret = status ? : req->data;
643b4be468cSMichael Hennerich 
644b4be468cSMichael Hennerich 	kfree(req);
645b4be468cSMichael Hennerich 
646b4be468cSMichael Hennerich 	return ret;
647b4be468cSMichael Hennerich }
648b4be468cSMichael Hennerich 
649b4be468cSMichael Hennerich static int ad7879_write(struct spi_device *spi, u8 reg, u16 val)
650b4be468cSMichael Hennerich {
651b4be468cSMichael Hennerich 	struct ser_req *req;
652b4be468cSMichael Hennerich 	int status;
653b4be468cSMichael Hennerich 
654b4be468cSMichael Hennerich 	req = kzalloc(sizeof *req, GFP_KERNEL);
655b4be468cSMichael Hennerich 	if (!req)
656b4be468cSMichael Hennerich 		return -ENOMEM;
657b4be468cSMichael Hennerich 
658b4be468cSMichael Hennerich 	spi_message_init(&req->msg);
659b4be468cSMichael Hennerich 
660b4be468cSMichael Hennerich 	req->command = (u16) AD7879_WRITECMD(reg);
661b4be468cSMichael Hennerich 	req->xfer[0].tx_buf = &req->command;
662b4be468cSMichael Hennerich 	req->xfer[0].len = 2;
663b4be468cSMichael Hennerich 
664b4be468cSMichael Hennerich 	req->data = val;
665b4be468cSMichael Hennerich 	req->xfer[1].tx_buf = &req->data;
666b4be468cSMichael Hennerich 	req->xfer[1].len = 2;
667b4be468cSMichael Hennerich 
668b4be468cSMichael Hennerich 	spi_message_add_tail(&req->xfer[0], &req->msg);
669b4be468cSMichael Hennerich 	spi_message_add_tail(&req->xfer[1], &req->msg);
670b4be468cSMichael Hennerich 
671b4be468cSMichael Hennerich 	status = spi_sync(spi, &req->msg);
672b4be468cSMichael Hennerich 
673b4be468cSMichael Hennerich 	kfree(req);
674b4be468cSMichael Hennerich 
675b4be468cSMichael Hennerich 	return status;
676b4be468cSMichael Hennerich }
677b4be468cSMichael Hennerich 
678b4be468cSMichael Hennerich static void ad7879_collect(struct ad7879 *ts)
679b4be468cSMichael Hennerich {
680b4be468cSMichael Hennerich 	int status = spi_sync(ts->bus, &ts->msg);
681b4be468cSMichael Hennerich 
682b4be468cSMichael Hennerich 	if (status)
683b4be468cSMichael Hennerich 		dev_err(&ts->bus->dev, "spi_sync --> %d\n", status);
684b4be468cSMichael Hennerich }
685b4be468cSMichael Hennerich 
686b4be468cSMichael Hennerich static void ad7879_setup_ts_def_msg(struct ad7879 *ts)
687b4be468cSMichael Hennerich {
688b4be468cSMichael Hennerich 	struct spi_message *m;
689b4be468cSMichael Hennerich 	int i;
690b4be468cSMichael Hennerich 
691b4be468cSMichael Hennerich 	ts->cmd = (u16) AD7879_READCMD(AD7879_REG_XPLUS);
692b4be468cSMichael Hennerich 
693b4be468cSMichael Hennerich 	m = &ts->msg;
694b4be468cSMichael Hennerich 	spi_message_init(m);
695b4be468cSMichael Hennerich 	ts->xfer[0].tx_buf = &ts->cmd;
696b4be468cSMichael Hennerich 	ts->xfer[0].len = 2;
697b4be468cSMichael Hennerich 
698b4be468cSMichael Hennerich 	spi_message_add_tail(&ts->xfer[0], m);
699b4be468cSMichael Hennerich 
700b4be468cSMichael Hennerich 	for (i = 0; i < AD7879_NR_SENSE; i++) {
701b4be468cSMichael Hennerich 		ts->xfer[i + 1].rx_buf = &ts->conversion_data[i];
702b4be468cSMichael Hennerich 		ts->xfer[i + 1].len = 2;
703b4be468cSMichael Hennerich 		spi_message_add_tail(&ts->xfer[i + 1], m);
704b4be468cSMichael Hennerich 	}
705b4be468cSMichael Hennerich }
706b4be468cSMichael Hennerich 
707b4be468cSMichael Hennerich static int __devinit ad7879_probe(struct spi_device *spi)
708b4be468cSMichael Hennerich {
709b4be468cSMichael Hennerich 	struct ad7879 *ts;
710b4be468cSMichael Hennerich 	int error;
711b4be468cSMichael Hennerich 
712b4be468cSMichael Hennerich 	/* don't exceed max specified SPI CLK frequency */
713b4be468cSMichael Hennerich 	if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) {
714b4be468cSMichael Hennerich 		dev_err(&spi->dev, "SPI CLK %d Hz?\n", spi->max_speed_hz);
715b4be468cSMichael Hennerich 		return -EINVAL;
716b4be468cSMichael Hennerich 	}
717b4be468cSMichael Hennerich 
718b4be468cSMichael Hennerich 	ts = kzalloc(sizeof(struct ad7879), GFP_KERNEL);
719b4be468cSMichael Hennerich 	if (!ts)
720b4be468cSMichael Hennerich 		return -ENOMEM;
721b4be468cSMichael Hennerich 
722b4be468cSMichael Hennerich 	dev_set_drvdata(&spi->dev, ts);
723b4be468cSMichael Hennerich 	ts->bus = spi;
724b4be468cSMichael Hennerich 
725b4be468cSMichael Hennerich 	ad7879_setup_ts_def_msg(ts);
726b4be468cSMichael Hennerich 
727b4be468cSMichael Hennerich 	error = ad7879_construct(spi, ts);
728b4be468cSMichael Hennerich 	if (error) {
729b4be468cSMichael Hennerich 		dev_set_drvdata(&spi->dev, NULL);
730b4be468cSMichael Hennerich 		kfree(ts);
731b4be468cSMichael Hennerich 	}
732b4be468cSMichael Hennerich 
7334fa5757aSMichael Hennerich 	return error;
734b4be468cSMichael Hennerich }
735b4be468cSMichael Hennerich 
736b4be468cSMichael Hennerich static int __devexit ad7879_remove(struct spi_device *spi)
737b4be468cSMichael Hennerich {
738b4be468cSMichael Hennerich 	struct ad7879 *ts = dev_get_drvdata(&spi->dev);
739b4be468cSMichael Hennerich 
740b4be468cSMichael Hennerich 	ad7879_destroy(spi, ts);
741b4be468cSMichael Hennerich 	dev_set_drvdata(&spi->dev, NULL);
742b4be468cSMichael Hennerich 	kfree(ts);
743b4be468cSMichael Hennerich 
744b4be468cSMichael Hennerich 	return 0;
745b4be468cSMichael Hennerich }
746b4be468cSMichael Hennerich 
747b4be468cSMichael Hennerich static struct spi_driver ad7879_driver = {
748b4be468cSMichael Hennerich 	.driver = {
749b4be468cSMichael Hennerich 		.name	= "ad7879",
750b4be468cSMichael Hennerich 		.bus	= &spi_bus_type,
751b4be468cSMichael Hennerich 		.owner	= THIS_MODULE,
752b4be468cSMichael Hennerich 	},
753b4be468cSMichael Hennerich 	.probe		= ad7879_probe,
754b4be468cSMichael Hennerich 	.remove		= __devexit_p(ad7879_remove),
755b4be468cSMichael Hennerich 	.suspend	= ad7879_suspend,
756b4be468cSMichael Hennerich 	.resume		= ad7879_resume,
757b4be468cSMichael Hennerich };
758b4be468cSMichael Hennerich 
759b4be468cSMichael Hennerich static int __init ad7879_init(void)
760b4be468cSMichael Hennerich {
761b4be468cSMichael Hennerich 	return spi_register_driver(&ad7879_driver);
762b4be468cSMichael Hennerich }
763b4be468cSMichael Hennerich module_init(ad7879_init);
764b4be468cSMichael Hennerich 
765b4be468cSMichael Hennerich static void __exit ad7879_exit(void)
766b4be468cSMichael Hennerich {
767b4be468cSMichael Hennerich 	spi_unregister_driver(&ad7879_driver);
768b4be468cSMichael Hennerich }
769b4be468cSMichael Hennerich module_exit(ad7879_exit);
770b4be468cSMichael Hennerich 
771b4be468cSMichael Hennerich #elif defined(CONFIG_TOUCHSCREEN_AD7879_I2C) || defined(CONFIG_TOUCHSCREEN_AD7879_I2C_MODULE)
772b4be468cSMichael Hennerich 
773b4be468cSMichael Hennerich /* All registers are word-sized.
774b4be468cSMichael Hennerich  * AD7879 uses a high-byte first convention.
775b4be468cSMichael Hennerich  */
776b4be468cSMichael Hennerich static int ad7879_read(struct i2c_client *client, u8 reg)
777b4be468cSMichael Hennerich {
778b4be468cSMichael Hennerich 	return swab16(i2c_smbus_read_word_data(client, reg));
779b4be468cSMichael Hennerich }
780b4be468cSMichael Hennerich 
781b4be468cSMichael Hennerich static int ad7879_write(struct i2c_client *client, u8 reg, u16 val)
782b4be468cSMichael Hennerich {
783b4be468cSMichael Hennerich 	return i2c_smbus_write_word_data(client, reg, swab16(val));
784b4be468cSMichael Hennerich }
785b4be468cSMichael Hennerich 
786b4be468cSMichael Hennerich static void ad7879_collect(struct ad7879 *ts)
787b4be468cSMichael Hennerich {
788b4be468cSMichael Hennerich 	int i;
789b4be468cSMichael Hennerich 
790b4be468cSMichael Hennerich 	for (i = 0; i < AD7879_NR_SENSE; i++)
791b4be468cSMichael Hennerich 		ts->conversion_data[i] = ad7879_read(ts->bus,
792b4be468cSMichael Hennerich 						     AD7879_REG_XPLUS + i);
793b4be468cSMichael Hennerich }
794b4be468cSMichael Hennerich 
795b4be468cSMichael Hennerich static int __devinit ad7879_probe(struct i2c_client *client,
796b4be468cSMichael Hennerich 					const struct i2c_device_id *id)
797b4be468cSMichael Hennerich {
798b4be468cSMichael Hennerich 	struct ad7879 *ts;
799b4be468cSMichael Hennerich 	int error;
800b4be468cSMichael Hennerich 
801b4be468cSMichael Hennerich 	if (!i2c_check_functionality(client->adapter,
802b4be468cSMichael Hennerich 					I2C_FUNC_SMBUS_WORD_DATA)) {
803b4be468cSMichael Hennerich 		dev_err(&client->dev, "SMBUS Word Data not Supported\n");
804b4be468cSMichael Hennerich 		return -EIO;
805b4be468cSMichael Hennerich 	}
806b4be468cSMichael Hennerich 
807b4be468cSMichael Hennerich 	ts = kzalloc(sizeof(struct ad7879), GFP_KERNEL);
808b4be468cSMichael Hennerich 	if (!ts)
809b4be468cSMichael Hennerich 		return -ENOMEM;
810b4be468cSMichael Hennerich 
811b4be468cSMichael Hennerich 	i2c_set_clientdata(client, ts);
812b4be468cSMichael Hennerich 	ts->bus = client;
813b4be468cSMichael Hennerich 
814b4be468cSMichael Hennerich 	error = ad7879_construct(client, ts);
815b4be468cSMichael Hennerich 	if (error) {
816b4be468cSMichael Hennerich 		i2c_set_clientdata(client, NULL);
817b4be468cSMichael Hennerich 		kfree(ts);
818b4be468cSMichael Hennerich 	}
819b4be468cSMichael Hennerich 
8204fa5757aSMichael Hennerich 	return error;
821b4be468cSMichael Hennerich }
822b4be468cSMichael Hennerich 
823b4be468cSMichael Hennerich static int __devexit ad7879_remove(struct i2c_client *client)
824b4be468cSMichael Hennerich {
825b4be468cSMichael Hennerich 	struct ad7879 *ts = dev_get_drvdata(&client->dev);
826b4be468cSMichael Hennerich 
827b4be468cSMichael Hennerich 	ad7879_destroy(client, ts);
828b4be468cSMichael Hennerich 	i2c_set_clientdata(client, NULL);
829b4be468cSMichael Hennerich 	kfree(ts);
830b4be468cSMichael Hennerich 
831b4be468cSMichael Hennerich 	return 0;
832b4be468cSMichael Hennerich }
833b4be468cSMichael Hennerich 
834b4be468cSMichael Hennerich static const struct i2c_device_id ad7879_id[] = {
835b4be468cSMichael Hennerich 	{ "ad7879", 0 },
83636fb2527SMichael Hennerich 	{ "ad7889", 0 },
837b4be468cSMichael Hennerich 	{ }
838b4be468cSMichael Hennerich };
839b4be468cSMichael Hennerich MODULE_DEVICE_TABLE(i2c, ad7879_id);
840b4be468cSMichael Hennerich 
841b4be468cSMichael Hennerich static struct i2c_driver ad7879_driver = {
842b4be468cSMichael Hennerich 	.driver = {
843b4be468cSMichael Hennerich 		.name	= "ad7879",
844b4be468cSMichael Hennerich 		.owner	= THIS_MODULE,
845b4be468cSMichael Hennerich 	},
846b4be468cSMichael Hennerich 	.probe		= ad7879_probe,
847b4be468cSMichael Hennerich 	.remove		= __devexit_p(ad7879_remove),
848b4be468cSMichael Hennerich 	.suspend	= ad7879_suspend,
849b4be468cSMichael Hennerich 	.resume		= ad7879_resume,
850b4be468cSMichael Hennerich 	.id_table	= ad7879_id,
851b4be468cSMichael Hennerich };
852b4be468cSMichael Hennerich 
853b4be468cSMichael Hennerich static int __init ad7879_init(void)
854b4be468cSMichael Hennerich {
855b4be468cSMichael Hennerich 	return i2c_add_driver(&ad7879_driver);
856b4be468cSMichael Hennerich }
857b4be468cSMichael Hennerich module_init(ad7879_init);
858b4be468cSMichael Hennerich 
859b4be468cSMichael Hennerich static void __exit ad7879_exit(void)
860b4be468cSMichael Hennerich {
861b4be468cSMichael Hennerich 	i2c_del_driver(&ad7879_driver);
862b4be468cSMichael Hennerich }
863b4be468cSMichael Hennerich module_exit(ad7879_exit);
864b4be468cSMichael Hennerich #endif
865b4be468cSMichael Hennerich 
866b4be468cSMichael Hennerich MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
867b4be468cSMichael Hennerich MODULE_DESCRIPTION("AD7879(-1) touchscreen Driver");
868b4be468cSMichael Hennerich MODULE_LICENSE("GPL");
869e0626e38SAnton Vorontsov MODULE_ALIAS("spi:ad7879");
870