@@ -817,6 +817,8 @@ static int ads7846_suspend(struct spi_device *spi, pm_message_t message)
spin_lock_irq(&ts->lock);
ts->is_suspended = 1;
+ if (device_may_wakeup(&ts->spi->dev))
+ enable_irq_wake(ts->spi->irq);
ads7846_disable(ts);
spin_unlock_irq(&ts->lock);
@@ -833,6 +835,8 @@ static int ads7846_resume(struct spi_device *spi)
ts->is_suspended = 0;
ads7846_enable(ts);
+ if (device_may_wakeup(&ts->spi->dev))
+ disable_irq_wake(ts->spi->irq);
spin_unlock_irq(&ts->lock);
@@ -1191,6 +1195,9 @@ static int __devinit ads7846_probe(struct spi_device *spi)
if (err)
goto err_remove_attr_group;
+ if (pdata->wakeup == true)
+ device_init_wakeup(&spi->dev, 1);
+
return 0;
err_remove_attr_group:
@@ -1220,6 +1227,7 @@ static int __devexit ads7846_remove(struct spi_device *spi)
{
struct ads7846 *ts = dev_get_drvdata(&spi->dev);
+ device_init_wakeup(&spi->dev, 0);
ads784x_hwmon_unregister(spi, ts);
input_unregister_device(ts->input);
@@ -53,5 +53,6 @@ struct ads7846_platform_data {
int (*filter) (void *filter_data, int data_idx, int *val);
void (*filter_cleanup)(void *filter_data);
void (*wait_for_sync)(void);
+ bool wakeup;
};