summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaurav Singhal <gsinghal@codeaurora.org>2016-05-20 13:01:15 +0530
committerKyle Yan <kyan@codeaurora.org>2016-05-31 15:24:53 -0700
commit1b18e29caa3f890a314414a50ee2c8cd5a9bb8ef (patch)
tree1aef5d0dcb3495f4e4b0191bed5ecef1e5e0da10
parent36a70eb4e5ce15ec7ee9dca51c010805934f24bc (diff)
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>
-rw-r--r--drivers/nfc/nq-nci.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/drivers/nfc/nq-nci.c b/drivers/nfc/nq-nci.c
index 9fd1d3e4d42a..9053944ef459 100644
--- a/drivers/nfc/nq-nci.c
+++ b/drivers/nfc/nq-nci.c
@@ -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;