NFC: trf7970a: Clear possible spurious interrupt before transmitting
authorMark A. Greer <mgreer@animalcreek.com>
Tue, 2 Sep 2014 22:12:26 +0000 (15:12 -0700)
committerSamuel Ortiz <sameo@linux.intel.com>
Sun, 7 Sep 2014 21:13:43 +0000 (23:13 +0200)
The trf7970a occasionally generates spurious interrupts
which can confuse the driver.  To help alleviate this,
clear any interrupts by reading the 'IRQ Status Register'
before starting a new transaction.

Signed-off-by: Mark A. Greer <mgreer@animalcreek.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/nfc/trf7970a.c

index b67946c18b40b7c984fb17a389fc42346a37b6a5..e7f22a44dc5298acdb98995c40638f8398414cb5 100644 (file)
@@ -1120,6 +1120,7 @@ static int trf7970a_in_send_cmd(struct nfc_digital_dev *ddev,
        char *prefix;
        unsigned int len;
        int ret;
+       u8 status;
 
        dev_dbg(trf->dev, "New request - state: %d, timeout: %d ms, len: %d\n",
                        trf->state, timeout, skb->len);
@@ -1195,6 +1196,11 @@ static int trf7970a_in_send_cmd(struct nfc_digital_dev *ddev,
 
        len = min_t(int, skb->len, TRF7970A_FIFO_SIZE);
 
+       /* Clear possible spurious interrupt */
+       ret = trf7970a_read_irqstatus(trf, &status);
+       if (ret)
+               goto out_err;
+
        ret = trf7970a_transmit(trf, skb, len);
        if (ret) {
                kfree_skb(trf->rx_skb);