mtd: rawnand: brcmnand: Add platform data structure for BCMA
authorFlorian Fainelli <f.fainelli@gmail.com>
Fri, 7 Jan 2022 18:46:11 +0000 (10:46 -0800)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Sun, 23 Jan 2022 15:37:18 +0000 (16:37 +0100)
Update the BCMA's chipcommon nand flash driver to detect which
chip-select is used and pass that information via platform data to the
brcmnand driver. Make sure that the brcmnand platform data structure is
always at the beginning of the platform data of the "nflash" device
created by BCMA to allow brcmnand to safely de-reference it.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20220107184614.2670254-7-f.fainelli@gmail.com
MAINTAINERS
drivers/bcma/driver_chipcommon_nflash.c
include/linux/bcma/bcma_driver_chipcommon.h
include/linux/platform_data/brcmnand.h [new file with mode: 0644]

index ea3e6c91438481482cc36504187486aa64fec025..8a1c1e92937fd23ee4b4a13c028f2a8252b3fea8 100644 (file)
@@ -4021,6 +4021,7 @@ L:        linux-mtd@lists.infradead.org
 L:     bcm-kernel-feedback-list@broadcom.com
 S:     Maintained
 F:     drivers/mtd/nand/raw/brcmnand/
+F:     include/linux/platform_data/brcmnand.h
 
 BROADCOM STB PCIE DRIVER
 M:     Jim Quinlan <jim2101024@gmail.com>
index d4f699aef8c440081d0f5847ab67766b6e128f48..a1a814750b4ac5ab0521a49deb5ad1acafb96132 100644 (file)
@@ -7,18 +7,28 @@
 
 #include "bcma_private.h"
 
+#include <linux/bitops.h>
 #include <linux/platform_device.h>
+#include <linux/platform_data/brcmnand.h>
 #include <linux/bcma/bcma.h>
 
+/* Alternate NAND controller driver name in order to allow both bcm47xxnflash
+ * and bcma_brcmnand to be built into the same kernel image.
+ */
+static const char *bcma_nflash_alt_name = "bcma_brcmnand";
+
 struct platform_device bcma_nflash_dev = {
        .name           = "bcma_nflash",
        .num_resources  = 0,
 };
 
+static const char *probes[] = { "bcm47xxpart", NULL };
+
 /* Initialize NAND flash access */
 int bcma_nflash_init(struct bcma_drv_cc *cc)
 {
        struct bcma_bus *bus = cc->core->bus;
+       u32 reg;
 
        if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4706 &&
            cc->core->id.rev != 38) {
@@ -33,8 +43,16 @@ int bcma_nflash_init(struct bcma_drv_cc *cc)
 
        cc->nflash.present = true;
        if (cc->core->id.rev == 38 &&
-           (cc->status & BCMA_CC_CHIPST_5357_NAND_BOOT))
+           (cc->status & BCMA_CC_CHIPST_5357_NAND_BOOT)) {
                cc->nflash.boot = true;
+               /* Determine the chip select that is being used */
+               reg = bcma_cc_read32(cc, BCMA_CC_NAND_CS_NAND_SELECT) & 0xff;
+               cc->nflash.brcmnand_info.chip_select = ffs(reg) - 1;
+               cc->nflash.brcmnand_info.part_probe_types = probes;
+               cc->nflash.brcmnand_info.ecc_stepsize = 512;
+               cc->nflash.brcmnand_info.ecc_strength = 1;
+               bcma_nflash_dev.name = bcma_nflash_alt_name;
+       }
 
        /* Prepare platform device, but don't register it yet. It's too early,
         * malloc (required by device_private_init) is not available yet. */
index d35b9206096ded9ead41b278aef947d6da5d1824..e3314f746bfa09dd2254e23e31e310f8b1ab68b5 100644 (file)
@@ -3,6 +3,7 @@
 #define LINUX_BCMA_DRIVER_CC_H_
 
 #include <linux/platform_device.h>
+#include <linux/platform_data/brcmnand.h>
 #include <linux/gpio.h>
 
 /** ChipCommon core registers. **/
@@ -599,6 +600,10 @@ struct bcma_sflash {
 
 #ifdef CONFIG_BCMA_NFLASH
 struct bcma_nflash {
+       /* Must be the fist member for the brcmnand driver to
+        * de-reference that structure.
+        */
+       struct brcmnand_platform_data brcmnand_info;
        bool present;
        bool boot;              /* This is the flash the SoC boots from */
 };
diff --git a/include/linux/platform_data/brcmnand.h b/include/linux/platform_data/brcmnand.h
new file mode 100644 (file)
index 0000000..8b87779
--- /dev/null
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef BRCMNAND_PLAT_DATA_H
+#define BRCMNAND_PLAT_DATA_H
+
+struct brcmnand_platform_data {
+       int     chip_select;
+       const char * const *part_probe_types;
+       unsigned int ecc_stepsize;
+       unsigned int ecc_strength;
+};
+
+#endif /* BRCMNAND_PLAT_DATA_H */