diff options
Diffstat (limited to 'target/linux/bcm47xx/patches-5.10/105-v5.18-mtd-rawnand-brcmnand-Add-platform-data-structure-for-BCMA.patch')
-rw-r--r-- | target/linux/bcm47xx/patches-5.10/105-v5.18-mtd-rawnand-brcmnand-Add-platform-data-structure-for-BCMA.patch | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/target/linux/bcm47xx/patches-5.10/105-v5.18-mtd-rawnand-brcmnand-Add-platform-data-structure-for-BCMA.patch b/target/linux/bcm47xx/patches-5.10/105-v5.18-mtd-rawnand-brcmnand-Add-platform-data-structure-for-BCMA.patch new file mode 100644 index 0000000000..973a3e95ee --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/105-v5.18-mtd-rawnand-brcmnand-Add-platform-data-structure-for-BCMA.patch @@ -0,0 +1,115 @@ +From: Florian Fainelli <f.fainelli@gmail.com> +Subject: [PATCH v3 6/9] mtd: rawnand: brcmnand: Add platform data structure for BCMA +Date: Fri, 07 Jan 2022 10:46:11 -0800 +Content-Type: text/plain; charset="utf-8" + +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> +--- + MAINTAINERS | 1 + + drivers/bcma/driver_chipcommon_nflash.c | 20 +++++++++++++++++++- + include/linux/bcma/bcma_driver_chipcommon.h | 5 +++++ + include/linux/platform_data/brcmnand.h | 12 ++++++++++++ + 4 files changed, 37 insertions(+), 1 deletion(-) + create mode 100644 include/linux/platform_data/brcmnand.h + +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -3712,6 +3712,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 SYSTEMPORT ETHERNET DRIVER + M: Florian Fainelli <f.fainelli@gmail.com> +--- a/drivers/bcma/driver_chipcommon_nflash.c ++++ b/drivers/bcma/driver_chipcommon_nflash.c +@@ -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->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. */ +--- a/include/linux/bcma/bcma_driver_chipcommon.h ++++ b/include/linux/bcma/bcma_driver_chipcommon.h +@@ -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 */ + }; +--- /dev/null ++++ b/include/linux/platform_data/brcmnand.h +@@ -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 */ |