* [PATCH v4 1/3] mtd: brcmnand: factor out CFG and CFG_EXT bitfields
2015-10-30 6:18 [PATCH v4 0/3] NAND support for Broadcom NS2 SoC Anup Patel
@ 2015-10-30 6:18 ` Anup Patel
2015-10-30 6:18 ` [PATCH v4 2/3] mtd: brcmnand: Force 8bit mode before doing nand_scan_ident() Anup Patel
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Anup Patel @ 2015-10-30 6:18 UTC (permalink / raw)
To: David Woodhouse, Brian Norris, Linux MTD
Cc: Rob Herring, Pawel Moll, Mark Rutland, Catalin Marinas,
Will Deacon, Sudeep Holla, Ian Campbell, Kumar Gala, Ray Jui,
Scott Branden, Florian Fainelli, Pramod KUMAR, Vikram Prakash,
Sandeep Tripathy, Linux ARM Kernel, Device Tree, Linux Kernel,
BCM Kernel Feedback
From: Brian Norris <computersforpeace@gmail.com>
Use enum instead of magic numbers for CFG and CFG_EXT bitfields.
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Tested-by: Anup Patel <anup.patel@broadcom.com>
---
drivers/mtd/nand/brcmnand/brcmnand.c | 38 +++++++++++++++++++++++++++++-------
1 file changed, 31 insertions(+), 7 deletions(-)
diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c
index 4cba03d..dda96fa 100644
--- a/drivers/mtd/nand/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/brcmnand/brcmnand.c
@@ -344,6 +344,28 @@ static const u8 brcmnand_cs_offsets_cs0[] = {
[BRCMNAND_CS_TIMING2] = 0x14,
};
+/*
+ * Bitfields for the CFG and CFG_EXT registers. Pre-v7.1 controllers only had
+ * one config register, but once the bitfields overflowed, newer controllers
+ * (v7.1 and newer) added a CFG_EXT register and shuffled a few fields around.
+ */
+enum {
+ CFG_BLK_ADR_BYTES_SHIFT = 8,
+ CFG_COL_ADR_BYTES_SHIFT = 12,
+ CFG_FUL_ADR_BYTES_SHIFT = 16,
+ CFG_BUS_WIDTH_SHIFT = 23,
+ CFG_BUS_WIDTH = BIT(CFG_BUS_WIDTH_SHIFT),
+ CFG_DEVICE_SIZE_SHIFT = 24,
+
+ /* Only for pre-v7.1 (with no CFG_EXT register) */
+ CFG_PAGE_SIZE_SHIFT = 20,
+ CFG_BLK_SIZE_SHIFT = 28,
+
+ /* Only for v7.1+ (with CFG_EXT register) */
+ CFG_EXT_PAGE_SIZE_SHIFT = 0,
+ CFG_EXT_BLK_SIZE_SHIFT = 4,
+};
+
/* BRCMNAND_INTFC_STATUS */
enum {
INTFC_FLASH_STATUS = GENMASK(7, 0),
@@ -1720,17 +1742,19 @@ static int brcmnand_set_cfg(struct brcmnand_host *host,
}
device_size = fls64(cfg->device_size) - fls64(BRCMNAND_MIN_DEVSIZE);
- tmp = (cfg->blk_adr_bytes << 8) |
- (cfg->col_adr_bytes << 12) |
- (cfg->ful_adr_bytes << 16) |
- (!!(cfg->device_width == 16) << 23) |
- (device_size << 24);
+ tmp = (cfg->blk_adr_bytes << CFG_BLK_ADR_BYTES_SHIFT) |
+ (cfg->col_adr_bytes << CFG_COL_ADR_BYTES_SHIFT) |
+ (cfg->ful_adr_bytes << CFG_FUL_ADR_BYTES_SHIFT) |
+ (!!(cfg->device_width == 16) << CFG_BUS_WIDTH_SHIFT) |
+ (device_size << CFG_DEVICE_SIZE_SHIFT);
if (cfg_offs == cfg_ext_offs) {
- tmp |= (page_size << 20) | (block_size << 28);
+ tmp |= (page_size << CFG_PAGE_SIZE_SHIFT) |
+ (block_size << CFG_BLK_SIZE_SHIFT);
nand_writereg(ctrl, cfg_offs, tmp);
} else {
nand_writereg(ctrl, cfg_offs, tmp);
- tmp = page_size | (block_size << 4);
+ tmp = (page_size << CFG_EXT_PAGE_SIZE_SHIFT) |
+ (block_size << CFG_EXT_BLK_SIZE_SHIFT);
nand_writereg(ctrl, cfg_ext_offs, tmp);
}
--
1.9.1
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v4 2/3] mtd: brcmnand: Force 8bit mode before doing nand_scan_ident()
2015-10-30 6:18 [PATCH v4 0/3] NAND support for Broadcom NS2 SoC Anup Patel
2015-10-30 6:18 ` [PATCH v4 1/3] mtd: brcmnand: factor out CFG and CFG_EXT bitfields Anup Patel
@ 2015-10-30 6:18 ` Anup Patel
2015-10-30 6:58 ` Anup Patel
2015-10-30 6:18 ` [PATCH v4 3/3] arm64: dts: Add BRCM IPROC NAND DT node for NS2 Anup Patel
2015-10-30 6:57 ` [PATCH v4 0/3] NAND support for Broadcom NS2 SoC Anup Patel
3 siblings, 1 reply; 6+ messages in thread
From: Anup Patel @ 2015-10-30 6:18 UTC (permalink / raw)
To: David Woodhouse, Brian Norris, Linux MTD
Cc: Rob Herring, Pawel Moll, Mark Rutland, Catalin Marinas,
Will Deacon, Sudeep Holla, Ian Campbell, Kumar Gala, Ray Jui,
Scott Branden, Florian Fainelli, Pramod KUMAR, Vikram Prakash,
Sandeep Tripathy, Linux ARM Kernel, Device Tree, Linux Kernel,
BCM Kernel Feedback, Anup Patel
Just like other NAND controllers, the NAND READID command only works
in 8bit mode for all versions of BRCMNAND controller.
This patch forces 8bit mode for each NAND CS in brcmnand_init_cs()
before doing nand_scan_ident() to ensure that BRCMNAND controller
is in 8bit mode when NAND READID command is issued.
Signed-off-by: Anup Patel <anup.patel@broadcom.com>
Reviewed-by: Ray Jui <rjui@broadcom.com>
Reviewed-by: Scott Branden <sbranden@broadcom.com>
---
drivers/mtd/nand/brcmnand/brcmnand.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c
index dda96fa..641591d 100644
--- a/drivers/mtd/nand/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/brcmnand/brcmnand.c
@@ -1912,6 +1912,7 @@ static int brcmnand_init_cs(struct brcmnand_host *host)
struct mtd_info *mtd;
struct nand_chip *chip;
int ret;
+ u16 cfg_offs;
struct mtd_part_parser_data ppdata = { .of_node = dn };
ret = of_property_read_u32(dn, "reg", &host->cs);
@@ -1954,6 +1955,15 @@ static int brcmnand_init_cs(struct brcmnand_host *host)
chip->controller = &ctrl->controller;
+ /*
+ * The bootloader might have configured 16bit mode but
+ * NAND READID command only works in 8bit mode. We force
+ * 8bit mode here to ensure that NAND READID commands works.
+ */
+ cfg_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_CFG);
+ nand_writereg(ctrl, cfg_offs,
+ nand_readreg(ctrl, cfg_offs) & CFG_BUS_WIDTH);
+
if (nand_scan_ident(mtd, 1, NULL))
return -ENXIO;
--
1.9.1
^ permalink raw reply [flat|nested] 6+ messages in thread* RE: [PATCH v4 2/3] mtd: brcmnand: Force 8bit mode before doing nand_scan_ident()
2015-10-30 6:18 ` [PATCH v4 2/3] mtd: brcmnand: Force 8bit mode before doing nand_scan_ident() Anup Patel
@ 2015-10-30 6:58 ` Anup Patel
0 siblings, 0 replies; 6+ messages in thread
From: Anup Patel @ 2015-10-30 6:58 UTC (permalink / raw)
To: Anup Patel, David Woodhouse, Brian Norris, Linux MTD
Cc: Rob Herring, Pawel Moll, Mark Rutland, Catalin Marinas,
Will Deacon, Sudeep Holla, Ian Campbell, Kumar Gala, Ray Jui,
Scott Branden, Florian Fainelli, Pramod Kumar, Vikram Prakash,
Sandeep Tripathy, Linux ARM Kernel, Device Tree, Linux Kernel,
bcm-kernel-feedback-list
> -----Original Message-----
> From: Anup Patel [mailto:anup.patel@broadcom.com]
> Sent: 30 October 2015 11:49
> To: David Woodhouse; Brian Norris; Linux MTD
> Cc: Rob Herring; Pawel Moll; Mark Rutland; Catalin Marinas; Will Deacon;
> Sudeep Holla; Ian Campbell; Kumar Gala; Ray Jui; Scott Branden; Florian Fainelli;
> Pramod Kumar; Vikram Prakash; Sandeep Tripathy; Linux ARM Kernel; Device
> Tree; Linux Kernel; bcm-kernel-feedback-list; Anup Patel
> Subject: [PATCH v4 2/3] mtd: brcmnand: Force 8bit mode before doing
> nand_scan_ident()
>
> Just like other NAND controllers, the NAND READID command only works in 8bit
> mode for all versions of BRCMNAND controller.
>
> This patch forces 8bit mode for each NAND CS in brcmnand_init_cs() before
> doing nand_scan_ident() to ensure that BRCMNAND controller is in 8bit mode
> when NAND READID command is issued.
>
> Signed-off-by: Anup Patel <anup.patel@broadcom.com>
> Reviewed-by: Ray Jui <rjui@broadcom.com>
> Reviewed-by: Scott Branden <sbranden@broadcom.com>
> ---
> drivers/mtd/nand/brcmnand/brcmnand.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c
> b/drivers/mtd/nand/brcmnand/brcmnand.c
> index dda96fa..641591d 100644
> --- a/drivers/mtd/nand/brcmnand/brcmnand.c
> +++ b/drivers/mtd/nand/brcmnand/brcmnand.c
> @@ -1912,6 +1912,7 @@ static int brcmnand_init_cs(struct brcmnand_host
> *host)
> struct mtd_info *mtd;
> struct nand_chip *chip;
> int ret;
> + u16 cfg_offs;
> struct mtd_part_parser_data ppdata = { .of_node = dn };
>
> ret = of_property_read_u32(dn, "reg", &host->cs); @@ -1954,6
> +1955,15 @@ static int brcmnand_init_cs(struct brcmnand_host *host)
>
> chip->controller = &ctrl->controller;
>
> + /*
> + * The bootloader might have configured 16bit mode but
> + * NAND READID command only works in 8bit mode. We force
> + * 8bit mode here to ensure that NAND READID commands works.
> + */
> + cfg_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_CFG);
> + nand_writereg(ctrl, cfg_offs,
> + nand_readreg(ctrl, cfg_offs) & CFG_BUS_WIDTH);
This should have been "nand_readreg(ctrl, cfg_offs) & ~CFG_BUS_WIDTH".
My bad ...
--
Anup
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v4 3/3] arm64: dts: Add BRCM IPROC NAND DT node for NS2
2015-10-30 6:18 [PATCH v4 0/3] NAND support for Broadcom NS2 SoC Anup Patel
2015-10-30 6:18 ` [PATCH v4 1/3] mtd: brcmnand: factor out CFG and CFG_EXT bitfields Anup Patel
2015-10-30 6:18 ` [PATCH v4 2/3] mtd: brcmnand: Force 8bit mode before doing nand_scan_ident() Anup Patel
@ 2015-10-30 6:18 ` Anup Patel
2015-10-30 6:57 ` [PATCH v4 0/3] NAND support for Broadcom NS2 SoC Anup Patel
3 siblings, 0 replies; 6+ messages in thread
From: Anup Patel @ 2015-10-30 6:18 UTC (permalink / raw)
To: David Woodhouse, Brian Norris, Linux MTD
Cc: Rob Herring, Pawel Moll, Mark Rutland, Catalin Marinas,
Will Deacon, Sudeep Holla, Ian Campbell, Kumar Gala, Ray Jui,
Scott Branden, Florian Fainelli, Pramod KUMAR, Vikram Prakash,
Sandeep Tripathy, Linux ARM Kernel, Device Tree, Linux Kernel,
BCM Kernel Feedback, Anup Patel
The NAND controller on NS2 SoC is compatible with existing
BRCM IPROC NAND driver so let's enable it in NS2 DT and
NS2 SVK DT.
This patch also fixes use of node labels in ns2-svk.dts.
Signed-off-by: Anup Patel <anup.patel@broadcom.com>
Reviewed-by: Ray Jui <rjui@broadcom.com>
Reviewed-by: Scott Branden <sbranden@broadcom.com>
Reviewed-by: Brian Norris <computersforpeace@gmail.com>
---
arch/arm64/boot/dts/broadcom/ns2-svk.dts | 30 ++++++++++++++++++++----------
arch/arm64/boot/dts/broadcom/ns2.dtsi | 14 ++++++++++++++
2 files changed, 34 insertions(+), 10 deletions(-)
diff --git a/arch/arm64/boot/dts/broadcom/ns2-svk.dts b/arch/arm64/boot/dts/broadcom/ns2-svk.dts
index e5950d5..6bb3d4d 100644
--- a/arch/arm64/boot/dts/broadcom/ns2-svk.dts
+++ b/arch/arm64/boot/dts/broadcom/ns2-svk.dts
@@ -50,18 +50,28 @@
device_type = "memory";
reg = <0x000000000 0x80000000 0x00000000 0x40000000>;
};
+};
- soc: soc {
- i2c0: i2c@66080000 {
- status = "ok";
- };
+&i2c0 {
+ status = "ok";
+};
- i2c1: i2c@660b0000 {
- status = "ok";
- };
+&i2c1 {
+ status = "ok";
+};
+
+&uart3 {
+ status = "ok";
+};
- uart3: serial@66130000 {
- status = "ok";
- };
+&nand {
+ nandcs@0 {
+ compatible = "brcm,nandcs";
+ reg = <0>;
+ nand-ecc-mode = "hw";
+ nand-ecc-strength = <8>;
+ nand-ecc-step-size = <512>;
+ #address-cells = <1>;
+ #size-cells = <1>;
};
};
diff --git a/arch/arm64/boot/dts/broadcom/ns2.dtsi b/arch/arm64/boot/dts/broadcom/ns2.dtsi
index f603277..9610822 100644
--- a/arch/arm64/boot/dts/broadcom/ns2.dtsi
+++ b/arch/arm64/boot/dts/broadcom/ns2.dtsi
@@ -212,5 +212,19 @@
compatible = "brcm,iproc-rng200";
reg = <0x66220000 0x28>;
};
+
+ nand: nand@66460000 {
+ compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
+ reg = <0x66460000 0x600>,
+ <0x67015408 0x600>,
+ <0x66460f00 0x20>;
+ reg-names = "nand", "iproc-idm", "iproc-ext";
+ interrupts = <GIC_SPI 420 IRQ_TYPE_LEVEL_HIGH>;
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ brcm,nand-has-wp;
+ };
};
};
--
1.9.1
^ permalink raw reply [flat|nested] 6+ messages in thread* RE: [PATCH v4 0/3] NAND support for Broadcom NS2 SoC
2015-10-30 6:18 [PATCH v4 0/3] NAND support for Broadcom NS2 SoC Anup Patel
` (2 preceding siblings ...)
2015-10-30 6:18 ` [PATCH v4 3/3] arm64: dts: Add BRCM IPROC NAND DT node for NS2 Anup Patel
@ 2015-10-30 6:57 ` Anup Patel
3 siblings, 0 replies; 6+ messages in thread
From: Anup Patel @ 2015-10-30 6:57 UTC (permalink / raw)
To: Anup Patel, David Woodhouse, Brian Norris, Linux MTD
Cc: Rob Herring, Pawel Moll, Mark Rutland, Catalin Marinas,
Will Deacon, Sudeep Holla, Ian Campbell, Kumar Gala, Ray Jui,
Scott Branden, Florian Fainelli, Pramod Kumar, Vikram Prakash,
Sandeep Tripathy, Linux ARM Kernel, Device Tree, Linux Kernel,
bcm-kernel-feedback-list
Hi All,
Please disregard this patchset.
There is an accidental typo in patch2.
We should use ~CFG_BUS_WIDTH instead of CFG_BUS_WIDTH
in patch2. I will quickly send v5 patchset to fix this.
Sorry, for the noise.
Regards,
Anup
^ permalink raw reply [flat|nested] 6+ messages in thread