[PATCH 1/2] mtd: atmel_nand: NFC: use different compeletion for different interrupt
Josh Wu
josh.wu at atmel.com
Thu Jun 5 20:47:59 PDT 2014
After this patch, we can know which NFC interrupt is handled. It's a
preparation for handling multiple NFC interrupts.
Signed-off-by: Josh Wu <josh.wu at atmel.com>
---
drivers/mtd/nand/atmel_nand.c | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index 4ce181a..347cee2 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -97,7 +97,9 @@ struct atmel_nfc {
bool write_by_sram;
bool is_initialized;
- struct completion comp_nfc;
+ struct completion comp_ready;
+ struct completion comp_cmd_done;
+ struct completion comp_xfer_done;
/* Point to the sram bank which include readed data via NFC */
void __iomem *data_in_sram;
@@ -1584,13 +1586,13 @@ static irqreturn_t hsmc_interrupt(int irq, void *dev_id)
pending = status & mask;
if (pending & NFC_SR_XFR_DONE) {
- complete(&host->nfc->comp_nfc);
+ complete(&host->nfc->comp_xfer_done);
nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_XFR_DONE);
} else if (pending & NFC_SR_RB_EDGE) {
- complete(&host->nfc->comp_nfc);
+ complete(&host->nfc->comp_ready);
nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_RB_EDGE);
} else if (pending & NFC_SR_CMD_DONE) {
- complete(&host->nfc->comp_nfc);
+ complete(&host->nfc->comp_cmd_done);
nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_CMD_DONE);
} else {
ret = IRQ_NONE;
@@ -1603,12 +1605,25 @@ static irqreturn_t hsmc_interrupt(int irq, void *dev_id)
static int nfc_wait_interrupt(struct atmel_nand_host *host, u32 flag)
{
unsigned long timeout;
- init_completion(&host->nfc->comp_nfc);
+ struct completion *comp;
+
+ if (flag & NFC_SR_XFR_DONE) {
+ comp = &host->nfc->comp_xfer_done;
+ } else if (flag & NFC_SR_RB_EDGE) {
+ comp = &host->nfc->comp_ready;
+ } else if (flag & NFC_SR_CMD_DONE) {
+ comp = &host->nfc->comp_cmd_done;
+ } else {
+ dev_err(host->dev, "Unkown interrupt flag: 0x%08x\n", flag);
+ return -EINVAL;
+ }
+
+ init_completion(comp);
/* Enable interrupt that need to wait for */
nfc_writel(host->nfc->hsmc_regs, IER, flag);
- timeout = wait_for_completion_timeout(&host->nfc->comp_nfc,
+ timeout = wait_for_completion_timeout(comp,
msecs_to_jiffies(NFC_TIME_OUT_MS));
if (timeout)
return 0;
--
1.7.9.5
More information about the linux-arm-kernel
mailing list