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