Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 50e04e2f authored by Wu, Josh's avatar Wu, Josh Committed by Brian Norris
Browse files

mtd: atmel_nand: add NFC status error check



Add a new function to read the NFC status. Meantime, this function will
check if there is any errors in NFC.

Signed-off-by: default avatarJosh Wu <josh.wu@atmel.com>
Tested-by: default avatarMatthieu Crapet <Matthieu.Crapet@ingenico.com>
Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
parent b3857666
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -1572,6 +1572,25 @@ static int atmel_hw_nand_init_params(struct platform_device *pdev,
	return 0;
}

static inline u32 nfc_read_status(struct atmel_nand_host *host)
{
	u32 err_flags = NFC_SR_DTOE | NFC_SR_UNDEF | NFC_SR_AWB | NFC_SR_ASE;
	u32 nfc_status = nfc_readl(host->nfc->hsmc_regs, SR);

	if (unlikely(nfc_status & err_flags)) {
		if (nfc_status & NFC_SR_DTOE)
			dev_err(host->dev, "NFC: Waiting Nand R/B Timeout Error\n");
		else if (nfc_status & NFC_SR_UNDEF)
			dev_err(host->dev, "NFC: Access Undefined Area Error\n");
		else if (nfc_status & NFC_SR_AWB)
			dev_err(host->dev, "NFC: Access memory While NFC is busy\n");
		else if (nfc_status & NFC_SR_ASE)
			dev_err(host->dev, "NFC: Access memory Size Error\n");
	}

	return nfc_status;
}

/* SMC interrupt service routine */
static irqreturn_t hsmc_interrupt(int irq, void *dev_id)
{
@@ -1579,7 +1598,7 @@ static irqreturn_t hsmc_interrupt(int irq, void *dev_id)
	u32 status, mask, pending;
	irqreturn_t ret = IRQ_HANDLED;

	status = nfc_readl(host->nfc->hsmc_regs, SR);
	status = nfc_read_status(host);
	mask = nfc_readl(host->nfc->hsmc_regs, IMR);
	pending = status & mask;

@@ -2209,6 +2228,9 @@ static int atmel_nand_nfc_probe(struct platform_device *pdev)
		}
	}

	nfc_writel(nfc->hsmc_regs, IDR, 0xffffffff);
	nfc_readl(nfc->hsmc_regs, SR);	/* clear the NFC_SR */

	nfc->is_initialized = true;
	dev_info(&pdev->dev, "NFC is probed.\n");
	return 0;
+4 −0
Original line number Diff line number Diff line
@@ -37,6 +37,10 @@
#define ATMEL_HSMC_NFC_SR	0x08		/* NFC Status Register */
#define		NFC_SR_XFR_DONE		(1 << 16)
#define		NFC_SR_CMD_DONE		(1 << 17)
#define		NFC_SR_DTOE		(1 << 20)
#define		NFC_SR_UNDEF		(1 << 21)
#define		NFC_SR_AWB		(1 << 22)
#define		NFC_SR_ASE		(1 << 23)
#define		NFC_SR_RB_EDGE		(1 << 24)

#define ATMEL_HSMC_NFC_IER	0x0c