[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1458822277-31428-1-git-send-email-yamada.masahiro@socionext.com>
Date: Thu, 24 Mar 2016 21:24:37 +0900
From: Masahiro Yamada <yamada.masahiro@...ionext.com>
To: linux-mtd@...ts.infradead.org
Cc: Graham Moore <grmoore@...nsource.altera.com>,
Dinh Nguyen <dinguyen@...nsource.altera.com>,
Masahiro Yamada <yamada.masahiro@...ionext.com>,
devicetree@...r.kernel.org, linux-kernel@...r.kernel.org,
Richard Weinberger <richard@....at>,
Kumar Gala <galak@...eaurora.org>,
Boris Brezillon <boris.brezillon@...e-electrons.com>,
Ian Campbell <ijc+devicetree@...lion.org.uk>,
Brian Norris <computersforpeace@...il.com>,
Rob Herring <robh+dt@...nel.org>,
David Woodhouse <dwmw2@...radead.org>,
Pawel Moll <pawel.moll@....com>,
Mark Rutland <mark.rutland@....com>
Subject: [PATCH] mtd: nand: denali: allow to override max_banks from DT property
Commit 271707b1d817 ("mtd: nand: denali: max_banks calculation
changed in revision 5.1") supported the new encoding of the "n_banks"
bits of the "features" register, but there is an unfortunate case
that is not covered by that commit.
Panasonic (its System LSI division is now Socionext) bought several
versions of this IP. The IP released for Panasonic around Feb. 2012
is revision 5 and uses the old encoding for n_banks (2 << n_banks).
While the one released around Nov. 2012 is also revision 5, but it
uses the new encoding (1 << n_banks).
The revision register cannot distinguish these two incompatible
hardware. I guess this IP series is not well-organized. I could not
find any alternative but giving max_banks from DT property.
This commit works around the problem by allowing DT to set the
max_banks forcibly. Of course, this DT property can be optional if
the auto detection based on the hardware registers works well.
Signed-off-by: Masahiro Yamada <yamada.masahiro@...ionext.com>
---
Documentation/devicetree/bindings/mtd/denali-nand.txt | 4 ++++
drivers/mtd/nand/denali.c | 3 ++-
drivers/mtd/nand/denali_dt.c | 3 +++
3 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/mtd/denali-nand.txt b/Documentation/devicetree/bindings/mtd/denali-nand.txt
index 785b825..78c250d 100644
--- a/Documentation/devicetree/bindings/mtd/denali-nand.txt
+++ b/Documentation/devicetree/bindings/mtd/denali-nand.txt
@@ -7,6 +7,10 @@ Required properties:
- interrupts : The interrupt number.
- dma-mask : DMA bit mask
+Optional properties:
+ - max-banks : Maximum number of banks supported by hardware. If not
+ specified, it is determined based on the "features" register of hardware.
+
The device tree may optionally contain sub-nodes describing partitions of the
address space. See partition.txt for more detail.
diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c
index 30bf5f6..e18b569 100644
--- a/drivers/mtd/nand/denali.c
+++ b/drivers/mtd/nand/denali.c
@@ -1353,7 +1353,8 @@ static void denali_hw_init(struct denali_nand_info *denali)
*/
denali->bbtskipbytes = ioread32(denali->flash_reg +
SPARE_AREA_SKIP_BYTES);
- detect_max_banks(denali);
+ if (!denali->max_banks)
+ detect_max_banks(denali);
denali_nand_reset(denali);
iowrite32(0x0F, denali->flash_reg + RB_PIN_ENABLED);
iowrite32(CHIP_EN_DONT_CARE__FLAG,
diff --git a/drivers/mtd/nand/denali_dt.c b/drivers/mtd/nand/denali_dt.c
index 0cb1e8d..be55db8 100644
--- a/drivers/mtd/nand/denali_dt.c
+++ b/drivers/mtd/nand/denali_dt.c
@@ -85,6 +85,9 @@ static int denali_dt_probe(struct platform_device *ofdev)
denali->dev->dma_mask = NULL;
}
+ of_property_read_u32(ofdev->dev.of_node, "max-banks",
+ &denali->max_banks);
+
dt->clk = devm_clk_get(&ofdev->dev, NULL);
if (IS_ERR(dt->clk)) {
dev_err(&ofdev->dev, "no clk available\n");
--
1.9.1
Powered by blists - more mailing lists