Commit 02d1d0e4 authored by Florian Fainelli's avatar Florian Fainelli Committed by Miquel Raynal

mtd: rawnand: brcmnand: Add platform data structure for BCMA

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: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20220107184614.2670254-7-f.fainelli@gmail.com
parent f5619f37
...@@ -4021,6 +4021,7 @@ L: linux-mtd@lists.infradead.org ...@@ -4021,6 +4021,7 @@ L: linux-mtd@lists.infradead.org
L: bcm-kernel-feedback-list@broadcom.com L: bcm-kernel-feedback-list@broadcom.com
S: Maintained S: Maintained
F: drivers/mtd/nand/raw/brcmnand/ F: drivers/mtd/nand/raw/brcmnand/
F: include/linux/platform_data/brcmnand.h
BROADCOM STB PCIE DRIVER BROADCOM STB PCIE DRIVER
M: Jim Quinlan <jim2101024@gmail.com> M: Jim Quinlan <jim2101024@gmail.com>
......
...@@ -7,18 +7,28 @@ ...@@ -7,18 +7,28 @@
#include "bcma_private.h" #include "bcma_private.h"
#include <linux/bitops.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/platform_data/brcmnand.h>
#include <linux/bcma/bcma.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 = { struct platform_device bcma_nflash_dev = {
.name = "bcma_nflash", .name = "bcma_nflash",
.num_resources = 0, .num_resources = 0,
}; };
static const char *probes[] = { "bcm47xxpart", NULL };
/* Initialize NAND flash access */ /* Initialize NAND flash access */
int bcma_nflash_init(struct bcma_drv_cc *cc) int bcma_nflash_init(struct bcma_drv_cc *cc)
{ {
struct bcma_bus *bus = cc->core->bus; struct bcma_bus *bus = cc->core->bus;
u32 reg;
if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4706 && if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4706 &&
cc->core->id.rev != 38) { cc->core->id.rev != 38) {
...@@ -33,8 +43,16 @@ int bcma_nflash_init(struct bcma_drv_cc *cc) ...@@ -33,8 +43,16 @@ int bcma_nflash_init(struct bcma_drv_cc *cc)
cc->nflash.present = true; cc->nflash.present = true;
if (cc->core->id.rev == 38 && 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; 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, /* Prepare platform device, but don't register it yet. It's too early,
* malloc (required by device_private_init) is not available yet. */ * malloc (required by device_private_init) is not available yet. */
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#define LINUX_BCMA_DRIVER_CC_H_ #define LINUX_BCMA_DRIVER_CC_H_
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/platform_data/brcmnand.h>
#include <linux/gpio.h> #include <linux/gpio.h>
/** ChipCommon core registers. **/ /** ChipCommon core registers. **/
...@@ -599,6 +600,10 @@ struct bcma_sflash { ...@@ -599,6 +600,10 @@ struct bcma_sflash {
#ifdef CONFIG_BCMA_NFLASH #ifdef CONFIG_BCMA_NFLASH
struct 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 present;
bool boot; /* This is the flash the SoC boots from */ bool boot; /* This is the flash the SoC boots from */
}; };
......
/* 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 */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment