mtd: nand: diskonchip: Request memory region prior ioremap()

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Tue Jan 28 00:59:03 EST 2014


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=4f0614a020524547d46e85ae5327f531e33cdf47
Commit:     4f0614a020524547d46e85ae5327f531e33cdf47
Parent:     3cb2c1ed4abe19d2881f74aa60c1a5b44524b2d0
Author:     Alexander Shiyan <shc_work at mail.ru>
AuthorDate: Wed Nov 13 15:59:25 2013 +0400
Committer:  Brian Norris <computersforpeace at gmail.com>
CommitDate: Fri Jan 3 11:22:19 2014 -0800

    mtd: nand: diskonchip: Request memory region prior ioremap()
    
    This patch adds request_mem_region() prior ioremap() for diskonchip
    driver. This will allow to check if memory region is occupied by any
    other device, for example in case if we have memory region for several
    optional devices and only one device can be used at once.
    
    Signed-off-by: Alexander Shiyan <shc_work at mail.ru>
    Signed-off-by: Brian Norris <computersforpeace at gmail.com>
---
 drivers/mtd/nand/diskonchip.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
index b68a495..0afafa0 100644
--- a/drivers/mtd/nand/diskonchip.c
+++ b/drivers/mtd/nand/diskonchip.c
@@ -1440,10 +1440,13 @@ static int __init doc_probe(unsigned long physadr)
 	int reg, len, numchips;
 	int ret = 0;
 
+	if (!request_mem_region(physadr, DOC_IOREMAP_LEN, NULL))
+		return -EBUSY;
 	virtadr = ioremap(physadr, DOC_IOREMAP_LEN);
 	if (!virtadr) {
 		printk(KERN_ERR "Diskonchip ioremap failed: 0x%x bytes at 0x%lx\n", DOC_IOREMAP_LEN, physadr);
-		return -EIO;
+		ret = -EIO;
+		goto error_ioremap;
 	}
 
 	/* It's not possible to cleanly detect the DiskOnChip - the
@@ -1629,6 +1632,10 @@ static int __init doc_probe(unsigned long physadr)
 	WriteDOC(save_control, virtadr, DOCControl);
  fail:
 	iounmap(virtadr);
+
+error_ioremap:
+	release_mem_region(physadr, DOC_IOREMAP_LEN);
+
 	return ret;
 }
 
@@ -1645,6 +1652,7 @@ static void release_nanddoc(void)
 		nextmtd = doc->nextdoc;
 		nand_release(mtd);
 		iounmap(doc->virtadr);
+		release_mem_region(doc->physadr, DOC_IOREMAP_LEN);
 		kfree(mtd);
 	}
 }



More information about the linux-mtd-cvs mailing list