Path: blob/master/drivers/input/touchscreen/ad7877.c
15111 views
/*1* Copyright (C) 2006-2008 Michael Hennerich, Analog Devices Inc.2*3* Description: AD7877 based touchscreen, sensor (ADCs), DAC and GPIO driver4* Based on: ads7846.c5*6* Bugs: Enter bugs at http://blackfin.uclinux.org/7*8* This program is free software; you can redistribute it and/or modify9* it under the terms of the GNU General Public License as published by10* the Free Software Foundation; either version 2 of the License, or11* (at your option) any later version.12*13* This program is distributed in the hope that it will be useful,14* but WITHOUT ANY WARRANTY; without even the implied warranty of15* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the16* GNU General Public License for more details.17*18* You should have received a copy of the GNU General Public License19* along with this program; if not, see the file COPYING, or write20* to the Free Software Foundation, Inc.,21* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA22*23* History:24* Copyright (c) 2005 David Brownell25* Copyright (c) 2006 Nokia Corporation26* Various changes: Imre Deak <[email protected]>27*28* Using code from:29* - corgi_ts.c30* Copyright (C) 2004-2005 Richard Purdie31* - omap_ts.[hc], ads7846.h, ts_osk.c32* Copyright (C) 2002 MontaVista Software33* Copyright (C) 2004 Texas Instruments34* Copyright (C) 2005 Dirk Behme35*/363738#include <linux/device.h>39#include <linux/init.h>40#include <linux/delay.h>41#include <linux/input.h>42#include <linux/interrupt.h>43#include <linux/pm.h>44#include <linux/slab.h>45#include <linux/spi/spi.h>46#include <linux/spi/ad7877.h>47#include <asm/irq.h>4849#define TS_PEN_UP_TIMEOUT msecs_to_jiffies(100)5051#define MAX_SPI_FREQ_HZ 2000000052#define MAX_12BIT ((1<<12)-1)5354#define AD7877_REG_ZEROS 055#define AD7877_REG_CTRL1 156#define AD7877_REG_CTRL2 257#define AD7877_REG_ALERT 358#define AD7877_REG_AUX1HIGH 459#define AD7877_REG_AUX1LOW 560#define AD7877_REG_BAT1HIGH 661#define AD7877_REG_BAT1LOW 762#define AD7877_REG_BAT2HIGH 863#define AD7877_REG_BAT2LOW 964#define AD7877_REG_TEMP1HIGH 1065#define AD7877_REG_TEMP1LOW 1166#define AD7877_REG_SEQ0 1267#define AD7877_REG_SEQ1 1368#define AD7877_REG_DAC 1469#define AD7877_REG_NONE1 1570#define AD7877_REG_EXTWRITE 1571#define AD7877_REG_XPLUS 1672#define AD7877_REG_YPLUS 1773#define AD7877_REG_Z2 1874#define AD7877_REG_aux1 1975#define AD7877_REG_aux2 2076#define AD7877_REG_aux3 2177#define AD7877_REG_bat1 2278#define AD7877_REG_bat2 2379#define AD7877_REG_temp1 2480#define AD7877_REG_temp2 2581#define AD7877_REG_Z1 2682#define AD7877_REG_GPIOCTRL1 2783#define AD7877_REG_GPIOCTRL2 2884#define AD7877_REG_GPIODATA 2985#define AD7877_REG_NONE2 3086#define AD7877_REG_NONE3 318788#define AD7877_SEQ_YPLUS_BIT (1<<11)89#define AD7877_SEQ_XPLUS_BIT (1<<10)90#define AD7877_SEQ_Z2_BIT (1<<9)91#define AD7877_SEQ_AUX1_BIT (1<<8)92#define AD7877_SEQ_AUX2_BIT (1<<7)93#define AD7877_SEQ_AUX3_BIT (1<<6)94#define AD7877_SEQ_BAT1_BIT (1<<5)95#define AD7877_SEQ_BAT2_BIT (1<<4)96#define AD7877_SEQ_TEMP1_BIT (1<<3)97#define AD7877_SEQ_TEMP2_BIT (1<<2)98#define AD7877_SEQ_Z1_BIT (1<<1)99100enum {101AD7877_SEQ_YPOS = 0,102AD7877_SEQ_XPOS = 1,103AD7877_SEQ_Z2 = 2,104AD7877_SEQ_AUX1 = 3,105AD7877_SEQ_AUX2 = 4,106AD7877_SEQ_AUX3 = 5,107AD7877_SEQ_BAT1 = 6,108AD7877_SEQ_BAT2 = 7,109AD7877_SEQ_TEMP1 = 8,110AD7877_SEQ_TEMP2 = 9,111AD7877_SEQ_Z1 = 10,112AD7877_NR_SENSE = 11,113};114115/* DAC Register Default RANGE 0 to Vcc, Volatge Mode, DAC On */116#define AD7877_DAC_CONF 0x1117118/* If gpio3 is set AUX3/GPIO3 acts as GPIO Output */119#define AD7877_EXTW_GPIO_3_CONF 0x1C4120#define AD7877_EXTW_GPIO_DATA 0x200121122/* Control REG 2 */123#define AD7877_TMR(x) ((x & 0x3) << 0)124#define AD7877_REF(x) ((x & 0x1) << 2)125#define AD7877_POL(x) ((x & 0x1) << 3)126#define AD7877_FCD(x) ((x & 0x3) << 4)127#define AD7877_PM(x) ((x & 0x3) << 6)128#define AD7877_ACQ(x) ((x & 0x3) << 8)129#define AD7877_AVG(x) ((x & 0x3) << 10)130131/* Control REG 1 */132#define AD7877_SER (1 << 11) /* non-differential */133#define AD7877_DFR (0 << 11) /* differential */134135#define AD7877_MODE_NOC (0) /* Do not convert */136#define AD7877_MODE_SCC (1) /* Single channel conversion */137#define AD7877_MODE_SEQ0 (2) /* Sequence 0 in Slave Mode */138#define AD7877_MODE_SEQ1 (3) /* Sequence 1 in Master Mode */139140#define AD7877_CHANADD(x) ((x&0xF)<<7)141#define AD7877_READADD(x) ((x)<<2)142#define AD7877_WRITEADD(x) ((x)<<12)143144#define AD7877_READ_CHAN(x) (AD7877_WRITEADD(AD7877_REG_CTRL1) | AD7877_SER | \145AD7877_MODE_SCC | AD7877_CHANADD(AD7877_REG_ ## x) | \146AD7877_READADD(AD7877_REG_ ## x))147148#define AD7877_MM_SEQUENCE (AD7877_SEQ_YPLUS_BIT | AD7877_SEQ_XPLUS_BIT | \149AD7877_SEQ_Z2_BIT | AD7877_SEQ_Z1_BIT)150151/*152* Non-touchscreen sensors only use single-ended conversions.153*/154155struct ser_req {156u16 reset;157u16 ref_on;158u16 command;159struct spi_message msg;160struct spi_transfer xfer[6];161162/*163* DMA (thus cache coherency maintenance) requires the164* transfer buffers to live in their own cache lines.165*/166u16 sample ____cacheline_aligned;167};168169struct ad7877 {170struct input_dev *input;171char phys[32];172173struct spi_device *spi;174u16 model;175u16 vref_delay_usecs;176u16 x_plate_ohms;177u16 pressure_max;178179u16 cmd_crtl1;180u16 cmd_crtl2;181u16 cmd_dummy;182u16 dac;183184u8 stopacq_polarity;185u8 first_conversion_delay;186u8 acquisition_time;187u8 averaging;188u8 pen_down_acc_interval;189190struct spi_transfer xfer[AD7877_NR_SENSE + 2];191struct spi_message msg;192193struct mutex mutex;194bool disabled; /* P: mutex */195bool gpio3; /* P: mutex */196bool gpio4; /* P: mutex */197198spinlock_t lock;199struct timer_list timer; /* P: lock */200201/*202* DMA (thus cache coherency maintenance) requires the203* transfer buffers to live in their own cache lines.204*/205u16 conversion_data[AD7877_NR_SENSE] ____cacheline_aligned;206};207208static bool gpio3;209module_param(gpio3, bool, 0);210MODULE_PARM_DESC(gpio3, "If gpio3 is set to 1 AUX3 acts as GPIO3");211212/*213* ad7877_read/write are only used for initial setup and for sysfs controls.214* The main traffic is done using spi_async() in the interrupt handler.215*/216217static int ad7877_read(struct spi_device *spi, u16 reg)218{219struct ser_req *req;220int status, ret;221222req = kzalloc(sizeof *req, GFP_KERNEL);223if (!req)224return -ENOMEM;225226spi_message_init(&req->msg);227228req->command = (u16) (AD7877_WRITEADD(AD7877_REG_CTRL1) |229AD7877_READADD(reg));230req->xfer[0].tx_buf = &req->command;231req->xfer[0].len = 2;232req->xfer[0].cs_change = 1;233234req->xfer[1].rx_buf = &req->sample;235req->xfer[1].len = 2;236237spi_message_add_tail(&req->xfer[0], &req->msg);238spi_message_add_tail(&req->xfer[1], &req->msg);239240status = spi_sync(spi, &req->msg);241ret = status ? : req->sample;242243kfree(req);244245return ret;246}247248static int ad7877_write(struct spi_device *spi, u16 reg, u16 val)249{250struct ser_req *req;251int status;252253req = kzalloc(sizeof *req, GFP_KERNEL);254if (!req)255return -ENOMEM;256257spi_message_init(&req->msg);258259req->command = (u16) (AD7877_WRITEADD(reg) | (val & MAX_12BIT));260req->xfer[0].tx_buf = &req->command;261req->xfer[0].len = 2;262263spi_message_add_tail(&req->xfer[0], &req->msg);264265status = spi_sync(spi, &req->msg);266267kfree(req);268269return status;270}271272static int ad7877_read_adc(struct spi_device *spi, unsigned command)273{274struct ad7877 *ts = dev_get_drvdata(&spi->dev);275struct ser_req *req;276int status;277int sample;278int i;279280req = kzalloc(sizeof *req, GFP_KERNEL);281if (!req)282return -ENOMEM;283284spi_message_init(&req->msg);285286/* activate reference, so it has time to settle; */287req->ref_on = AD7877_WRITEADD(AD7877_REG_CTRL2) |288AD7877_POL(ts->stopacq_polarity) |289AD7877_AVG(0) | AD7877_PM(2) | AD7877_TMR(0) |290AD7877_ACQ(ts->acquisition_time) | AD7877_FCD(0);291292req->reset = AD7877_WRITEADD(AD7877_REG_CTRL1) | AD7877_MODE_NOC;293294req->command = (u16) command;295296req->xfer[0].tx_buf = &req->reset;297req->xfer[0].len = 2;298req->xfer[0].cs_change = 1;299300req->xfer[1].tx_buf = &req->ref_on;301req->xfer[1].len = 2;302req->xfer[1].delay_usecs = ts->vref_delay_usecs;303req->xfer[1].cs_change = 1;304305req->xfer[2].tx_buf = &req->command;306req->xfer[2].len = 2;307req->xfer[2].delay_usecs = ts->vref_delay_usecs;308req->xfer[2].cs_change = 1;309310req->xfer[3].rx_buf = &req->sample;311req->xfer[3].len = 2;312req->xfer[3].cs_change = 1;313314req->xfer[4].tx_buf = &ts->cmd_crtl2; /*REF OFF*/315req->xfer[4].len = 2;316req->xfer[4].cs_change = 1;317318req->xfer[5].tx_buf = &ts->cmd_crtl1; /*DEFAULT*/319req->xfer[5].len = 2;320321/* group all the transfers together, so we can't interfere with322* reading touchscreen state; disable penirq while sampling323*/324for (i = 0; i < 6; i++)325spi_message_add_tail(&req->xfer[i], &req->msg);326327status = spi_sync(spi, &req->msg);328sample = req->sample;329330kfree(req);331332return status ? : sample;333}334335static int ad7877_process_data(struct ad7877 *ts)336{337struct input_dev *input_dev = ts->input;338unsigned Rt;339u16 x, y, z1, z2;340341x = ts->conversion_data[AD7877_SEQ_XPOS] & MAX_12BIT;342y = ts->conversion_data[AD7877_SEQ_YPOS] & MAX_12BIT;343z1 = ts->conversion_data[AD7877_SEQ_Z1] & MAX_12BIT;344z2 = ts->conversion_data[AD7877_SEQ_Z2] & MAX_12BIT;345346/*347* The samples processed here are already preprocessed by the AD7877.348* The preprocessing function consists of an averaging filter.349* The combination of 'first conversion delay' and averaging provides a robust solution,350* discarding the spurious noise in the signal and keeping only the data of interest.351* The size of the averaging filter is programmable. (dev.platform_data, see linux/spi/ad7877.h)352* Other user-programmable conversion controls include variable acquisition time,353* and first conversion delay. Up to 16 averages can be taken per conversion.354*/355356if (likely(x && z1)) {357/* compute touch pressure resistance using equation #1 */358Rt = (z2 - z1) * x * ts->x_plate_ohms;359Rt /= z1;360Rt = (Rt + 2047) >> 12;361362/*363* Sample found inconsistent, pressure is beyond364* the maximum. Don't report it to user space.365*/366if (Rt > ts->pressure_max)367return -EINVAL;368369if (!timer_pending(&ts->timer))370input_report_key(input_dev, BTN_TOUCH, 1);371372input_report_abs(input_dev, ABS_X, x);373input_report_abs(input_dev, ABS_Y, y);374input_report_abs(input_dev, ABS_PRESSURE, Rt);375input_sync(input_dev);376377return 0;378}379380return -EINVAL;381}382383static inline void ad7877_ts_event_release(struct ad7877 *ts)384{385struct input_dev *input_dev = ts->input;386387input_report_abs(input_dev, ABS_PRESSURE, 0);388input_report_key(input_dev, BTN_TOUCH, 0);389input_sync(input_dev);390}391392static void ad7877_timer(unsigned long handle)393{394struct ad7877 *ts = (void *)handle;395unsigned long flags;396397spin_lock_irqsave(&ts->lock, flags);398ad7877_ts_event_release(ts);399spin_unlock_irqrestore(&ts->lock, flags);400}401402static irqreturn_t ad7877_irq(int irq, void *handle)403{404struct ad7877 *ts = handle;405unsigned long flags;406int error;407408error = spi_sync(ts->spi, &ts->msg);409if (error) {410dev_err(&ts->spi->dev, "spi_sync --> %d\n", error);411goto out;412}413414spin_lock_irqsave(&ts->lock, flags);415error = ad7877_process_data(ts);416if (!error)417mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT);418spin_unlock_irqrestore(&ts->lock, flags);419420out:421return IRQ_HANDLED;422}423424static void ad7877_disable(struct ad7877 *ts)425{426mutex_lock(&ts->mutex);427428if (!ts->disabled) {429ts->disabled = true;430disable_irq(ts->spi->irq);431432if (del_timer_sync(&ts->timer))433ad7877_ts_event_release(ts);434}435436/*437* We know the chip's in lowpower mode since we always438* leave it that way after every request439*/440441mutex_unlock(&ts->mutex);442}443444static void ad7877_enable(struct ad7877 *ts)445{446mutex_lock(&ts->mutex);447448if (ts->disabled) {449ts->disabled = false;450enable_irq(ts->spi->irq);451}452453mutex_unlock(&ts->mutex);454}455456#define SHOW(name) static ssize_t \457name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \458{ \459struct ad7877 *ts = dev_get_drvdata(dev); \460ssize_t v = ad7877_read_adc(ts->spi, \461AD7877_READ_CHAN(name)); \462if (v < 0) \463return v; \464return sprintf(buf, "%u\n", (unsigned) v); \465} \466static DEVICE_ATTR(name, S_IRUGO, name ## _show, NULL);467468SHOW(aux1)469SHOW(aux2)470SHOW(aux3)471SHOW(bat1)472SHOW(bat2)473SHOW(temp1)474SHOW(temp2)475476static ssize_t ad7877_disable_show(struct device *dev,477struct device_attribute *attr, char *buf)478{479struct ad7877 *ts = dev_get_drvdata(dev);480481return sprintf(buf, "%u\n", ts->disabled);482}483484static ssize_t ad7877_disable_store(struct device *dev,485struct device_attribute *attr,486const char *buf, size_t count)487{488struct ad7877 *ts = dev_get_drvdata(dev);489unsigned long val;490int error;491492error = strict_strtoul(buf, 10, &val);493if (error)494return error;495496if (val)497ad7877_disable(ts);498else499ad7877_enable(ts);500501return count;502}503504static DEVICE_ATTR(disable, 0664, ad7877_disable_show, ad7877_disable_store);505506static ssize_t ad7877_dac_show(struct device *dev,507struct device_attribute *attr, char *buf)508{509struct ad7877 *ts = dev_get_drvdata(dev);510511return sprintf(buf, "%u\n", ts->dac);512}513514static ssize_t ad7877_dac_store(struct device *dev,515struct device_attribute *attr,516const char *buf, size_t count)517{518struct ad7877 *ts = dev_get_drvdata(dev);519unsigned long val;520int error;521522error = strict_strtoul(buf, 10, &val);523if (error)524return error;525526mutex_lock(&ts->mutex);527ts->dac = val & 0xFF;528ad7877_write(ts->spi, AD7877_REG_DAC, (ts->dac << 4) | AD7877_DAC_CONF);529mutex_unlock(&ts->mutex);530531return count;532}533534static DEVICE_ATTR(dac, 0664, ad7877_dac_show, ad7877_dac_store);535536static ssize_t ad7877_gpio3_show(struct device *dev,537struct device_attribute *attr, char *buf)538{539struct ad7877 *ts = dev_get_drvdata(dev);540541return sprintf(buf, "%u\n", ts->gpio3);542}543544static ssize_t ad7877_gpio3_store(struct device *dev,545struct device_attribute *attr,546const char *buf, size_t count)547{548struct ad7877 *ts = dev_get_drvdata(dev);549unsigned long val;550int error;551552error = strict_strtoul(buf, 10, &val);553if (error)554return error;555556mutex_lock(&ts->mutex);557ts->gpio3 = !!val;558ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA |559(ts->gpio4 << 4) | (ts->gpio3 << 5));560mutex_unlock(&ts->mutex);561562return count;563}564565static DEVICE_ATTR(gpio3, 0664, ad7877_gpio3_show, ad7877_gpio3_store);566567static ssize_t ad7877_gpio4_show(struct device *dev,568struct device_attribute *attr, char *buf)569{570struct ad7877 *ts = dev_get_drvdata(dev);571572return sprintf(buf, "%u\n", ts->gpio4);573}574575static ssize_t ad7877_gpio4_store(struct device *dev,576struct device_attribute *attr,577const char *buf, size_t count)578{579struct ad7877 *ts = dev_get_drvdata(dev);580unsigned long val;581int error;582583error = strict_strtoul(buf, 10, &val);584if (error)585return error;586587mutex_lock(&ts->mutex);588ts->gpio4 = !!val;589ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA |590(ts->gpio4 << 4) | (ts->gpio3 << 5));591mutex_unlock(&ts->mutex);592593return count;594}595596static DEVICE_ATTR(gpio4, 0664, ad7877_gpio4_show, ad7877_gpio4_store);597598static struct attribute *ad7877_attributes[] = {599&dev_attr_temp1.attr,600&dev_attr_temp2.attr,601&dev_attr_aux1.attr,602&dev_attr_aux2.attr,603&dev_attr_aux3.attr,604&dev_attr_bat1.attr,605&dev_attr_bat2.attr,606&dev_attr_disable.attr,607&dev_attr_dac.attr,608&dev_attr_gpio3.attr,609&dev_attr_gpio4.attr,610NULL611};612613static mode_t ad7877_attr_is_visible(struct kobject *kobj,614struct attribute *attr, int n)615{616mode_t mode = attr->mode;617618if (attr == &dev_attr_aux3.attr) {619if (gpio3)620mode = 0;621} else if (attr == &dev_attr_gpio3.attr) {622if (!gpio3)623mode = 0;624}625626return mode;627}628629static const struct attribute_group ad7877_attr_group = {630.is_visible = ad7877_attr_is_visible,631.attrs = ad7877_attributes,632};633634static void ad7877_setup_ts_def_msg(struct spi_device *spi, struct ad7877 *ts)635{636struct spi_message *m;637int i;638639ts->cmd_crtl2 = AD7877_WRITEADD(AD7877_REG_CTRL2) |640AD7877_POL(ts->stopacq_polarity) |641AD7877_AVG(ts->averaging) | AD7877_PM(1) |642AD7877_TMR(ts->pen_down_acc_interval) |643AD7877_ACQ(ts->acquisition_time) |644AD7877_FCD(ts->first_conversion_delay);645646ad7877_write(spi, AD7877_REG_CTRL2, ts->cmd_crtl2);647648ts->cmd_crtl1 = AD7877_WRITEADD(AD7877_REG_CTRL1) |649AD7877_READADD(AD7877_REG_XPLUS-1) |650AD7877_MODE_SEQ1 | AD7877_DFR;651652ad7877_write(spi, AD7877_REG_CTRL1, ts->cmd_crtl1);653654ts->cmd_dummy = 0;655656m = &ts->msg;657658spi_message_init(m);659660m->context = ts;661662ts->xfer[0].tx_buf = &ts->cmd_crtl1;663ts->xfer[0].len = 2;664ts->xfer[0].cs_change = 1;665666spi_message_add_tail(&ts->xfer[0], m);667668ts->xfer[1].tx_buf = &ts->cmd_dummy; /* Send ZERO */669ts->xfer[1].len = 2;670ts->xfer[1].cs_change = 1;671672spi_message_add_tail(&ts->xfer[1], m);673674for (i = 0; i < AD7877_NR_SENSE; i++) {675ts->xfer[i + 2].rx_buf = &ts->conversion_data[AD7877_SEQ_YPOS + i];676ts->xfer[i + 2].len = 2;677if (i < (AD7877_NR_SENSE - 1))678ts->xfer[i + 2].cs_change = 1;679spi_message_add_tail(&ts->xfer[i + 2], m);680}681}682683static int __devinit ad7877_probe(struct spi_device *spi)684{685struct ad7877 *ts;686struct input_dev *input_dev;687struct ad7877_platform_data *pdata = spi->dev.platform_data;688int err;689u16 verify;690691if (!spi->irq) {692dev_dbg(&spi->dev, "no IRQ?\n");693return -ENODEV;694}695696if (!pdata) {697dev_dbg(&spi->dev, "no platform data?\n");698return -ENODEV;699}700701/* don't exceed max specified SPI CLK frequency */702if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) {703dev_dbg(&spi->dev, "SPI CLK %d Hz?\n",spi->max_speed_hz);704return -EINVAL;705}706707spi->bits_per_word = 16;708err = spi_setup(spi);709if (err) {710dev_dbg(&spi->dev, "spi master doesn't support 16 bits/word\n");711return err;712}713714ts = kzalloc(sizeof(struct ad7877), GFP_KERNEL);715input_dev = input_allocate_device();716if (!ts || !input_dev) {717err = -ENOMEM;718goto err_free_mem;719}720721dev_set_drvdata(&spi->dev, ts);722ts->spi = spi;723ts->input = input_dev;724725setup_timer(&ts->timer, ad7877_timer, (unsigned long) ts);726mutex_init(&ts->mutex);727spin_lock_init(&ts->lock);728729ts->model = pdata->model ? : 7877;730ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100;731ts->x_plate_ohms = pdata->x_plate_ohms ? : 400;732ts->pressure_max = pdata->pressure_max ? : ~0;733734ts->stopacq_polarity = pdata->stopacq_polarity;735ts->first_conversion_delay = pdata->first_conversion_delay;736ts->acquisition_time = pdata->acquisition_time;737ts->averaging = pdata->averaging;738ts->pen_down_acc_interval = pdata->pen_down_acc_interval;739740snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&spi->dev));741742input_dev->name = "AD7877 Touchscreen";743input_dev->phys = ts->phys;744input_dev->dev.parent = &spi->dev;745746__set_bit(EV_KEY, input_dev->evbit);747__set_bit(BTN_TOUCH, input_dev->keybit);748__set_bit(EV_ABS, input_dev->evbit);749__set_bit(ABS_X, input_dev->absbit);750__set_bit(ABS_Y, input_dev->absbit);751__set_bit(ABS_PRESSURE, input_dev->absbit);752753input_set_abs_params(input_dev, ABS_X,754pdata->x_min ? : 0,755pdata->x_max ? : MAX_12BIT,7560, 0);757input_set_abs_params(input_dev, ABS_Y,758pdata->y_min ? : 0,759pdata->y_max ? : MAX_12BIT,7600, 0);761input_set_abs_params(input_dev, ABS_PRESSURE,762pdata->pressure_min, pdata->pressure_max, 0, 0);763764ad7877_write(spi, AD7877_REG_SEQ1, AD7877_MM_SEQUENCE);765766verify = ad7877_read(spi, AD7877_REG_SEQ1);767768if (verify != AD7877_MM_SEQUENCE){769dev_err(&spi->dev, "%s: Failed to probe %s\n",770dev_name(&spi->dev), input_dev->name);771err = -ENODEV;772goto err_free_mem;773}774775if (gpio3)776ad7877_write(spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_3_CONF);777778ad7877_setup_ts_def_msg(spi, ts);779780/* Request AD7877 /DAV GPIO interrupt */781782err = request_threaded_irq(spi->irq, NULL, ad7877_irq,783IRQF_TRIGGER_FALLING | IRQF_ONESHOT,784spi->dev.driver->name, ts);785if (err) {786dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);787goto err_free_mem;788}789790err = sysfs_create_group(&spi->dev.kobj, &ad7877_attr_group);791if (err)792goto err_free_irq;793794err = input_register_device(input_dev);795if (err)796goto err_remove_attr_group;797798return 0;799800err_remove_attr_group:801sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group);802err_free_irq:803free_irq(spi->irq, ts);804err_free_mem:805input_free_device(input_dev);806kfree(ts);807dev_set_drvdata(&spi->dev, NULL);808return err;809}810811static int __devexit ad7877_remove(struct spi_device *spi)812{813struct ad7877 *ts = dev_get_drvdata(&spi->dev);814815sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group);816817ad7877_disable(ts);818free_irq(ts->spi->irq, ts);819820input_unregister_device(ts->input);821kfree(ts);822823dev_dbg(&spi->dev, "unregistered touchscreen\n");824dev_set_drvdata(&spi->dev, NULL);825826return 0;827}828829#ifdef CONFIG_PM_SLEEP830static int ad7877_suspend(struct device *dev)831{832struct ad7877 *ts = dev_get_drvdata(dev);833834ad7877_disable(ts);835836return 0;837}838839static int ad7877_resume(struct device *dev)840{841struct ad7877 *ts = dev_get_drvdata(dev);842843ad7877_enable(ts);844845return 0;846}847#endif848849static SIMPLE_DEV_PM_OPS(ad7877_pm, ad7877_suspend, ad7877_resume);850851static struct spi_driver ad7877_driver = {852.driver = {853.name = "ad7877",854.bus = &spi_bus_type,855.owner = THIS_MODULE,856.pm = &ad7877_pm,857},858.probe = ad7877_probe,859.remove = __devexit_p(ad7877_remove),860};861862static int __init ad7877_init(void)863{864return spi_register_driver(&ad7877_driver);865}866module_init(ad7877_init);867868static void __exit ad7877_exit(void)869{870spi_unregister_driver(&ad7877_driver);871}872module_exit(ad7877_exit);873874MODULE_AUTHOR("Michael Hennerich <[email protected]>");875MODULE_DESCRIPTION("AD7877 touchscreen Driver");876MODULE_LICENSE("GPL");877MODULE_ALIAS("spi:ad7877");878879880