diff mbox

[v2] mtd: nand: diskonchip: Request memory region prior ioremap()

Message ID 1384343965-29682-1-git-send-email-shc_work@mail.ru
State Accepted
Commit 4f0614a020524547d46e85ae5327f531e33cdf47
Headers show

Commit Message

Alexander Shiyan Nov. 13, 2013, 11:59 a.m. UTC
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@mail.ru>
---
 drivers/mtd/nand/diskonchip.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

Comments

Brian Norris Nov. 18, 2013, 8:32 p.m. UTC | #1
On Wed, Nov 13, 2013 at 03:59:25PM +0400, Alexander Shiyan wrote:
> 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@mail.ru>

Looks good. Pushed to l2-mtd.git/next. Thanks!

Brian
diff mbox

Patch

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);
 	}
 }