diff options
Diffstat (limited to 'drivers/input/touchscreen/ad7879.c')
| -rw-r--r-- | drivers/input/touchscreen/ad7879.c | 40 | 
1 files changed, 29 insertions, 11 deletions
diff --git a/drivers/input/touchscreen/ad7879.c b/drivers/input/touchscreen/ad7879.c index bc3b5187f3a..fce590677b7 100644 --- a/drivers/input/touchscreen/ad7879.c +++ b/drivers/input/touchscreen/ad7879.c @@ -22,7 +22,6 @@   */  #include <linux/device.h> -#include <linux/init.h>  #include <linux/delay.h>  #include <linux/input.h>  #include <linux/interrupt.h> @@ -33,6 +32,7 @@  #include <linux/gpio.h>  #include <linux/spi/ad7879.h> +#include <linux/module.h>  #include "ad7879.h"  #define AD7879_REG_ZEROS		0 @@ -117,6 +117,7 @@ struct ad7879 {  	unsigned int		irq;  	bool			disabled;	/* P: input->mutex */  	bool			suspended;	/* P: input->mutex */ +	bool			swap_xy;  	u16			conversion_data[AD7879_NR_SENSE];  	char			phys[32];  	u8			first_conversion_delay; @@ -160,6 +161,9 @@ static int ad7879_report(struct ad7879 *ts)  	z1 = ts->conversion_data[AD7879_SEQ_Z1] & MAX_12BIT;  	z2 = ts->conversion_data[AD7879_SEQ_Z2] & MAX_12BIT; +	if (ts->swap_xy) +		swap(x, y); +  	/*  	 * The samples processed here are already preprocessed by the AD7879.  	 * The preprocessing function consists of a median and an averaging @@ -249,12 +253,14 @@ static void __ad7879_enable(struct ad7879 *ts)  static void __ad7879_disable(struct ad7879 *ts)  { +	u16 reg = (ts->cmd_crtl2 & ~AD7879_PM(-1)) | +		AD7879_PM(AD7879_PM_SHUTDOWN);  	disable_irq(ts->irq);  	if (del_timer_sync(&ts->timer))  		ad7879_ts_event_release(ts); -	ad7879_write(ts, AD7879_REG_CTRL2, AD7879_PM(AD7879_PM_SHUTDOWN)); +	ad7879_write(ts, AD7879_REG_CTRL2, reg);  } @@ -278,8 +284,11 @@ static void ad7879_close(struct input_dev* input)  		__ad7879_disable(ts);  } -void ad7879_suspend(struct ad7879 *ts) +#ifdef CONFIG_PM_SLEEP +static int ad7879_suspend(struct device *dev)  { +	struct ad7879 *ts = dev_get_drvdata(dev); +  	mutex_lock(&ts->input->mutex);  	if (!ts->suspended && !ts->disabled && ts->input->users) @@ -288,11 +297,14 @@ void ad7879_suspend(struct ad7879 *ts)  	ts->suspended = true;  	mutex_unlock(&ts->input->mutex); + +	return 0;  } -EXPORT_SYMBOL(ad7879_suspend); -void ad7879_resume(struct ad7879 *ts) +static int ad7879_resume(struct device *dev)  { +	struct ad7879 *ts = dev_get_drvdata(dev); +  	mutex_lock(&ts->input->mutex);  	if (ts->suspended && !ts->disabled && ts->input->users) @@ -301,8 +313,13 @@ void ad7879_resume(struct ad7879 *ts)  	ts->suspended = false;  	mutex_unlock(&ts->input->mutex); + +	return 0;  } -EXPORT_SYMBOL(ad7879_resume); +#endif + +SIMPLE_DEV_PM_OPS(ad7879_pm_ops, ad7879_suspend, ad7879_resume); +EXPORT_SYMBOL(ad7879_pm_ops);  static void ad7879_toggle(struct ad7879 *ts, bool disable)  { @@ -337,10 +354,10 @@ static ssize_t ad7879_disable_store(struct device *dev,  				     const char *buf, size_t count)  {  	struct ad7879 *ts = dev_get_drvdata(dev); -	unsigned long val; +	unsigned int val;  	int error; -	error = strict_strtoul(buf, 10, &val); +	error = kstrtouint(buf, 10, &val);  	if (error)  		return error; @@ -452,7 +469,7 @@ static int ad7879_gpio_add(struct ad7879 *ts,  static void ad7879_gpio_remove(struct ad7879 *ts)  { -	const struct ad7879_platform_data *pdata = ts->dev->platform_data; +	const struct ad7879_platform_data *pdata = dev_get_platdata(ts->dev);  	int ret;  	if (pdata->gpio_export) { @@ -477,7 +494,7 @@ static inline void ad7879_gpio_remove(struct ad7879 *ts)  struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq,  			    const struct ad7879_bus_ops *bops)  { -	struct ad7879_platform_data *pdata = dev->platform_data; +	struct ad7879_platform_data *pdata = dev_get_platdata(dev);  	struct ad7879 *ts;  	struct input_dev *input_dev;  	int err; @@ -506,6 +523,7 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq,  	ts->dev = dev;  	ts->input = input_dev;  	ts->irq = irq; +	ts->swap_xy = pdata->swap_xy;  	setup_timer(&ts->timer, ad7879_timer, (unsigned long) ts); @@ -583,7 +601,7 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq,  			AD7879_TMR(ts->pen_down_acc_interval);  	err = request_threaded_irq(ts->irq, NULL, ad7879_irq, -				   IRQF_TRIGGER_FALLING, +				   IRQF_TRIGGER_FALLING | IRQF_ONESHOT,  				   dev_name(dev), ts);  	if (err) {  		dev_err(dev, "irq %d busy?\n", ts->irq);  | 
