forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'nand/for-5.18' into mtd/next
Raw NAND core changes: * Rework of_get_nand_bus_width() * Remove of_get_nand_on_flash_bbt() wrapper * Protect access to rawnand devices while in suspend * bindings: Document the wp-gpios property Rax NAND controller driver changes: * atmel: Fix refcount issue in atmel_nand_controller_init * nandsim: - Add NS_PAGE_BYTE_SHIFT macro to replace the repeat pattern - Merge repeat codes in ns_switch_state - Replace overflow check with kzalloc to single kcalloc * rockchip: Fix platform_get_irq.cocci warning * stm32_fmc2: Add NAND Write Protect support * pl353: Set the nand chip node as the flash node * brcmnand: Fix sparse warnings in bcma_nand * omap_elm: Remove redundant variable 'errors' * gpmi: - Support fast edo timings for mx28 - Validate controller clock rate - Fix controller timings setting * brcmnand: - Add BCMA shim - BCMA controller uses command shift of 0 - Allow platform data instantation - Add platform data structure for BCMA - Allow working without interrupts - Move OF operations out of brcmnand_init_cs() - Avoid pdev in brcmnand_init_cs() - Allow SoC to provide I/O operations - Assign soc as early as possible Onenand changes: * Check for error irq Signed-off-by: Miquel Raynal <[email protected]>
- Loading branch information
Showing
20 changed files
with
467 additions
and
139 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4026,6 +4026,7 @@ L: [email protected] | |
L: [email protected] | ||
S: Maintained | ||
F: drivers/mtd/nand/raw/brcmnand/ | ||
F: include/linux/platform_data/brcmnand.h | ||
|
||
BROADCOM STB PCIE DRIVER | ||
M: Jim Quinlan <[email protected]> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* | ||
* Copyright © 2021 Broadcom | ||
*/ | ||
#include <linux/bcma/bcma.h> | ||
#include <linux/bcma/bcma_driver_chipcommon.h> | ||
#include <linux/device.h> | ||
#include <linux/module.h> | ||
#include <linux/platform_device.h> | ||
|
||
#include "brcmnand.h" | ||
|
||
struct brcmnand_bcma_soc { | ||
struct brcmnand_soc soc; | ||
struct bcma_drv_cc *cc; | ||
}; | ||
|
||
static inline bool brcmnand_bcma_needs_swapping(u32 offset) | ||
{ | ||
switch (offset) { | ||
case BCMA_CC_NAND_SPARE_RD0: | ||
case BCMA_CC_NAND_SPARE_RD4: | ||
case BCMA_CC_NAND_SPARE_RD8: | ||
case BCMA_CC_NAND_SPARE_RD12: | ||
case BCMA_CC_NAND_SPARE_WR0: | ||
case BCMA_CC_NAND_SPARE_WR4: | ||
case BCMA_CC_NAND_SPARE_WR8: | ||
case BCMA_CC_NAND_SPARE_WR12: | ||
case BCMA_CC_NAND_DEVID: | ||
case BCMA_CC_NAND_DEVID_X: | ||
case BCMA_CC_NAND_SPARE_RD16: | ||
case BCMA_CC_NAND_SPARE_RD20: | ||
case BCMA_CC_NAND_SPARE_RD24: | ||
case BCMA_CC_NAND_SPARE_RD28: | ||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
static inline struct brcmnand_bcma_soc *to_bcma_soc(struct brcmnand_soc *soc) | ||
{ | ||
return container_of(soc, struct brcmnand_bcma_soc, soc); | ||
} | ||
|
||
static u32 brcmnand_bcma_read_reg(struct brcmnand_soc *soc, u32 offset) | ||
{ | ||
struct brcmnand_bcma_soc *sc = to_bcma_soc(soc); | ||
u32 val; | ||
|
||
/* Offset into the NAND block and deal with the flash cache separately */ | ||
if (offset == BRCMNAND_NON_MMIO_FC_ADDR) | ||
offset = BCMA_CC_NAND_CACHE_DATA; | ||
else | ||
offset += BCMA_CC_NAND_REVISION; | ||
|
||
val = bcma_cc_read32(sc->cc, offset); | ||
|
||
/* Swap if necessary */ | ||
if (brcmnand_bcma_needs_swapping(offset)) | ||
val = be32_to_cpu((__force __be32)val); | ||
return val; | ||
} | ||
|
||
static void brcmnand_bcma_write_reg(struct brcmnand_soc *soc, u32 val, | ||
u32 offset) | ||
{ | ||
struct brcmnand_bcma_soc *sc = to_bcma_soc(soc); | ||
|
||
/* Offset into the NAND block */ | ||
if (offset == BRCMNAND_NON_MMIO_FC_ADDR) | ||
offset = BCMA_CC_NAND_CACHE_DATA; | ||
else | ||
offset += BCMA_CC_NAND_REVISION; | ||
|
||
/* Swap if necessary */ | ||
if (brcmnand_bcma_needs_swapping(offset)) | ||
val = (__force u32)cpu_to_be32(val); | ||
|
||
bcma_cc_write32(sc->cc, offset, val); | ||
} | ||
|
||
static struct brcmnand_io_ops brcmnand_bcma_io_ops = { | ||
.read_reg = brcmnand_bcma_read_reg, | ||
.write_reg = brcmnand_bcma_write_reg, | ||
}; | ||
|
||
static void brcmnand_bcma_prepare_data_bus(struct brcmnand_soc *soc, bool prepare, | ||
bool is_param) | ||
{ | ||
struct brcmnand_bcma_soc *sc = to_bcma_soc(soc); | ||
|
||
/* Reset the cache address to ensure we are already accessing the | ||
* beginning of a sub-page. | ||
*/ | ||
bcma_cc_write32(sc->cc, BCMA_CC_NAND_CACHE_ADDR, 0); | ||
} | ||
|
||
static int brcmnand_bcma_nand_probe(struct platform_device *pdev) | ||
{ | ||
struct bcma_nflash *nflash = dev_get_platdata(&pdev->dev); | ||
struct brcmnand_bcma_soc *soc; | ||
|
||
soc = devm_kzalloc(&pdev->dev, sizeof(*soc), GFP_KERNEL); | ||
if (!soc) | ||
return -ENOMEM; | ||
|
||
soc->cc = container_of(nflash, struct bcma_drv_cc, nflash); | ||
soc->soc.prepare_data_bus = brcmnand_bcma_prepare_data_bus; | ||
soc->soc.ops = &brcmnand_bcma_io_ops; | ||
|
||
if (soc->cc->core->bus->chipinfo.id == BCMA_CHIP_ID_BCM4706) { | ||
dev_err(&pdev->dev, "Use bcm47xxnflash for 4706!\n"); | ||
return -ENODEV; | ||
} | ||
|
||
return brcmnand_probe(pdev, &soc->soc); | ||
} | ||
|
||
static struct platform_driver brcmnand_bcma_nand_driver = { | ||
.probe = brcmnand_bcma_nand_probe, | ||
.remove = brcmnand_remove, | ||
.driver = { | ||
.name = "bcma_brcmnand", | ||
.pm = &brcmnand_pm_ops, | ||
} | ||
}; | ||
module_platform_driver(brcmnand_bcma_nand_driver); | ||
|
||
MODULE_LICENSE("GPL v2"); | ||
MODULE_AUTHOR("Broadcom"); | ||
MODULE_DESCRIPTION("NAND controller driver glue for BCMA chips"); |
Oops, something went wrong.