NFC: IRQ gpio usage modification in nfc_read
Modified condition to ensure data is read only after interrupt has occurred. Spurious interrupt handling is done in nfc_read instead of irq handler. Change-Id: Ie2362610fe922e792e6358b4386c828fdd754fa8 Signed-off-by: Gaurav Singhal <gsinghal@codeaurora.org>
This commit is contained in:
parent
3336c17fe4
commit
f2e141460b
1 changed files with 17 additions and 31 deletions
|
@ -107,36 +107,14 @@ static void nqx_disable_irq(struct nqx_dev *nqx_dev)
|
||||||
spin_unlock_irqrestore(&nqx_dev->irq_enabled_lock, flags);
|
spin_unlock_irqrestore(&nqx_dev->irq_enabled_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nqx_enable_irq(struct nqx_dev *nqx_dev)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&nqx_dev->irq_enabled_lock, flags);
|
|
||||||
if (!nqx_dev->irq_enabled) {
|
|
||||||
nqx_dev->irq_enabled = true;
|
|
||||||
enable_irq(nqx_dev->client->irq);
|
|
||||||
}
|
|
||||||
spin_unlock_irqrestore(&nqx_dev->irq_enabled_lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static irqreturn_t nqx_dev_irq_handler(int irq, void *dev_id)
|
static irqreturn_t nqx_dev_irq_handler(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
struct nqx_dev *nqx_dev = dev_id;
|
struct nqx_dev *nqx_dev = dev_id;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (device_may_wakeup(&nqx_dev->client->dev))
|
if (device_may_wakeup(&nqx_dev->client->dev))
|
||||||
pm_wakeup_event(&nqx_dev->client->dev, WAKEUP_SRC_TIMEOUT);
|
pm_wakeup_event(&nqx_dev->client->dev, WAKEUP_SRC_TIMEOUT);
|
||||||
|
|
||||||
ret = gpio_get_value(nqx_dev->irq_gpio);
|
|
||||||
if (!ret) {
|
|
||||||
#ifdef NFC_KERNEL_BU
|
|
||||||
dev_info(&nqx_dev->client->dev,
|
|
||||||
"nqx nfc : nqx_dev_irq_handler error = %d\n", ret);
|
|
||||||
#endif
|
|
||||||
return IRQ_HANDLED;
|
|
||||||
}
|
|
||||||
|
|
||||||
nqx_disable_irq(nqx_dev);
|
nqx_disable_irq(nqx_dev);
|
||||||
spin_lock_irqsave(&nqx_dev->irq_enabled_lock, flags);
|
spin_lock_irqsave(&nqx_dev->irq_enabled_lock, flags);
|
||||||
nqx_dev->count_irq++;
|
nqx_dev->count_irq++;
|
||||||
|
@ -175,15 +153,24 @@ static ssize_t nfc_read(struct file *filp, char __user *buf,
|
||||||
ret = -EAGAIN;
|
ret = -EAGAIN;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (!nqx_dev->irq_enabled) {
|
while (1) {
|
||||||
enable_irq(nqx_dev->client->irq);
|
ret = 0;
|
||||||
nqx_dev->irq_enabled = true;
|
if (!nqx_dev->irq_enabled) {
|
||||||
|
nqx_dev->irq_enabled = true;
|
||||||
|
enable_irq(nqx_dev->client->irq);
|
||||||
|
}
|
||||||
|
if (!gpio_get_value(nqx_dev->irq_gpio)) {
|
||||||
|
ret = wait_event_interruptible(nqx_dev->read_wq,
|
||||||
|
!nqx_dev->irq_enabled);
|
||||||
|
}
|
||||||
|
if (ret)
|
||||||
|
goto err;
|
||||||
|
nqx_disable_irq(nqx_dev);
|
||||||
|
|
||||||
|
if (gpio_get_value(nqx_dev->irq_gpio))
|
||||||
|
break;
|
||||||
|
dev_err_ratelimited(&nqx_dev->client->dev, "gpio is low, no need to read data\n");
|
||||||
}
|
}
|
||||||
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;
|
tmp = nqx_dev->kbuf;
|
||||||
|
@ -393,7 +380,6 @@ int nfc_ioctl_power_states(struct file *filp, unsigned long arg)
|
||||||
/* hardware dependent delay */
|
/* hardware dependent delay */
|
||||||
msleep(100);
|
msleep(100);
|
||||||
} else if (arg == 1) {
|
} else if (arg == 1) {
|
||||||
nqx_enable_irq(nqx_dev);
|
|
||||||
dev_dbg(&nqx_dev->client->dev,
|
dev_dbg(&nqx_dev->client->dev,
|
||||||
"gpio_set_value enable: %s: info: %p\n",
|
"gpio_set_value enable: %s: info: %p\n",
|
||||||
__func__, nqx_dev);
|
__func__, nqx_dev);
|
||||||
|
|
Loading…
Add table
Reference in a new issue