NFC: CE transaction failed during system suspend

IRQ was disabled at suspend so system was not able to
wake up during CE transaction.

Even after irq was enabled we were not able to wake up in irq handler
because wakeup event was not going due to is_suspended condition.

Change-Id: I5a088230786ef780cca0a3b767ad80e7b0c69f9e
Signed-off-by: Gaurav Singhal <gsinghal@codeaurora.org>
This commit is contained in:
Gaurav Singhal 2016-05-20 13:01:15 +05:30 committed by Kyle Yan
parent 36a70eb4e5
commit 1b18e29caa

View file

@ -121,10 +121,9 @@ static irqreturn_t nqx_dev_irq_handler(int irq, void *dev_id)
unsigned long flags;
int ret;
if (device_may_wakeup(&nqx_dev->client->dev) &&
(nqx_dev->client->dev.power.is_suspended == true)) {
if (device_may_wakeup(&nqx_dev->client->dev))
pm_wakeup_event(&nqx_dev->client->dev, WAKEUP_SRC_TIMEOUT);
}
ret = gpio_get_value(nqx_dev->irq_gpio);
if (!ret) {
#ifdef NFC_KERNEL_BU
@ -134,6 +133,7 @@ static irqreturn_t nqx_dev_irq_handler(int irq, void *dev_id)
return IRQ_HANDLED;
}
nqx_disable_irq(nqx_dev);
spin_lock_irqsave(&nqx_dev->irq_enabled_lock, flags);
nqx_dev->count_irq++;
spin_unlock_irqrestore(&nqx_dev->irq_enabled_lock, flags);
@ -158,7 +158,7 @@ static ssize_t nfc_read(struct file *filp, char __user *buf,
mutex_lock(&nqx_dev->read_mutex);
irq_gpio_val = gpio_get_value_cansleep(nqx_dev->irq_gpio);
irq_gpio_val = gpio_get_value(nqx_dev->irq_gpio);
if (irq_gpio_val == 0) {
if (filp->f_flags & O_NONBLOCK) {
dev_err(&nqx_dev->client->dev,
@ -166,17 +166,15 @@ static ssize_t nfc_read(struct file *filp, char __user *buf,
ret = -EAGAIN;
goto err;
}
nqx_dev->irq_enabled = true;
enable_irq(nqx_dev->client->irq);
if (gpio_get_value_cansleep(nqx_dev->irq_gpio)) {
nqx_disable_irq(nqx_dev);
} else {
ret = wait_event_interruptible(nqx_dev->read_wq,
gpio_get_value(nqx_dev->irq_gpio));
nqx_disable_irq(nqx_dev);
if (ret)
goto err;
if (!nqx_dev->irq_enabled) {
enable_irq(nqx_dev->client->irq);
nqx_dev->irq_enabled = true;
}
ret = wait_event_interruptible(nqx_dev->read_wq,
gpio_get_value(nqx_dev->irq_gpio));
if (ret)
goto err;
nqx_disable_irq(nqx_dev);
}
tmp = nqx_dev->kbuf;
@ -257,8 +255,6 @@ static int nfc_open(struct inode *inode, struct file *filp)
filp->private_data = nqx_dev;
nqx_init_stat(nqx_dev);
/* Enable interrupts from NFCC NFC_INT new NCI data available */
nqx_enable_irq(nqx_dev);
dev_dbg(&nqx_dev->client->dev,
"%s: %d,%d\n", __func__, imajor(inode), iminor(inode));
@ -301,6 +297,7 @@ int nfc_ioctl_power_states(struct file *filp, unsigned long arg)
/* hardware dependent delay */
msleep(100);
} else if (arg == 1) {
nqx_enable_irq(nqx_dev);
dev_dbg(&nqx_dev->client->dev,
"gpio_set_value enable: %s: info: %p\n",
__func__, nqx_dev);
@ -707,7 +704,7 @@ static int nqx_probe(struct i2c_client *client,
/* NFC_INT IRQ */
nqx_dev->irq_enabled = true;
r = request_irq(client->irq, nqx_dev_irq_handler,
IRQF_TRIGGER_RISING, client->name, nqx_dev);
IRQF_TRIGGER_HIGH, client->name, nqx_dev);
if (r) {
dev_err(&client->dev, "%s: request_irq failed\n", __func__);
goto err_request_irq_failed;