aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm47xx/patches-3.2/030-bcm47xx-bcma-nandflash.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm47xx/patches-3.2/030-bcm47xx-bcma-nandflash.patch')
-rw-r--r--target/linux/brcm47xx/patches-3.2/030-bcm47xx-bcma-nandflash.patch212
1 files changed, 115 insertions, 97 deletions
diff --git a/target/linux/brcm47xx/patches-3.2/030-bcm47xx-bcma-nandflash.patch b/target/linux/brcm47xx/patches-3.2/030-bcm47xx-bcma-nandflash.patch
index 4f4386e937..c9922a8b14 100644
--- a/target/linux/brcm47xx/patches-3.2/030-bcm47xx-bcma-nandflash.patch
+++ b/target/linux/brcm47xx/patches-3.2/030-bcm47xx-bcma-nandflash.patch
@@ -1,3 +1,13 @@
+--- a/arch/mips/bcm47xx/Kconfig
++++ b/arch/mips/bcm47xx/Kconfig
+@@ -24,6 +24,7 @@ config BCM47XX_BCMA
+ select BCMA_DRIVER_MIPS
+ select BCMA_DRIVER_PCI_HOSTMODE if PCI
+ select BCMA_SFLASH
++ select BCMA_NFLASH
+ default y
+ help
+ Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus.
--- a/arch/mips/bcm47xx/bus.c
+++ b/arch/mips/bcm47xx/bus.c
@@ -2,6 +2,7 @@
@@ -8,7 +18,7 @@
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
-@@ -92,3 +93,9 @@ void bcm47xx_sflash_struct_ssb_init(stru
+@@ -80,3 +81,9 @@ void bcm47xx_sflash_struct_ssb_init(stru
sflash->numblocks = scc->sflash.numblocks;
sflash->size = scc->sflash.size;
}
@@ -36,7 +46,7 @@
static char nvram_buf[NVRAM_SPACE];
-@@ -137,6 +139,51 @@ found:
+@@ -134,6 +136,51 @@ found:
return 0;
}
@@ -85,20 +95,20 @@
+ return ret;
+}
+
- static void early_nvram_init(void)
+ #ifdef CONFIG_BCM47XX_SSB
+ static void early_nvram_init_ssb(void)
{
- int err = 0;
-@@ -163,6 +210,10 @@ static void early_nvram_init(void)
- err = early_nvram_init_sflash();
- if (err < 0)
- printk(KERN_WARNING "can not read from flash: %i\n", err);
-+ } else if (bcm47xx_bus.bcma.bus.drv_cc.flash_type == BCMA_NFLASH) {
-+ err = early_nvram_init_nflash();
-+ if (err < 0)
-+ printk(KERN_WARNING "can not read from nflash: %i\n", err);
- } else {
- printk(KERN_WARNING "unknow flash type\n");
- }
+@@ -164,6 +211,10 @@ static void early_nvram_init_bcma(void)
+ err = early_nvram_init_sflash();
+ if (err < 0)
+ printk(KERN_WARNING "can not read from flash: %i\n", err);
++ case BCMA_NFLASH:
++ err = early_nvram_init_nflash();
++ if (err < 0)
++ printk(KERN_WARNING "can not read from nflash: %i\n", err);
+ default:
+ printk(KERN_WARNING "unknow flash type\n");
+ }
--- a/arch/mips/bcm47xx/setup.c
+++ b/arch/mips/bcm47xx/setup.c
@@ -4,6 +4,7 @@
@@ -115,19 +125,9 @@
struct bcm47xx_sflash bcm47xx_sflash;
+struct bcm47xx_nflash bcm47xx_nflash;
- static void bcm47xx_machine_restart(char *command)
- {
-@@ -325,6 +327,9 @@ static void __init bcm47xx_register_bcma
-
- if (bcm47xx_bus.bcma.bus.drv_cc.flash_type == BCMA_SFLASH)
- bcm47xx_sflash_struct_bcma_init(&bcm47xx_sflash, &bcm47xx_bus.bcma.bus.drv_cc);
-+
-+ if (bcm47xx_bus.bcma.bus.drv_cc.flash_type == BCMA_NFLASH)
-+ bcm47xx_nflash_struct_bcma_init(&bcm47xx_nflash, &bcm47xx_bus.bcma.bus.drv_cc);
- }
- #endif
-
-@@ -395,6 +400,19 @@ static struct platform_device bcm47xx_sf
+ static struct resource bcm47xx_pflash_resource = {
+ .name = "bcm47xx_pflash",
+@@ -73,6 +75,19 @@ static struct platform_device bcm47xx_sf
.num_resources = 1,
};
@@ -144,19 +144,29 @@
+ .num_resources = 1,
+};
+
- static int __init bcm47xx_register_flash(void)
+ static void bcm47xx_machine_restart(char *command)
{
- #ifdef CONFIG_BCM47XX_SSB
-@@ -429,6 +447,9 @@ static int __init bcm47xx_register_flash
- } else if (drv_cc->flash_type == BCMA_SFLASH) {
- bcm47xx_sflash_dev.dev.platform_data = &bcm47xx_sflash;
- return platform_device_register(&bcm47xx_sflash_dev);
-+ } else if (drv_cc->flash_type == BCMA_NFLASH) {
-+ bcm47xx_nflash_dev.dev.platform_data = &bcm47xx_nflash;
-+ return platform_device_register(&bcm47xx_nflash_dev);
- } else {
- printk(KERN_ERR "No flash device found\n");
- return -1;
+ printk(KERN_ALERT "Please stand by while rebooting the system...\n");
+@@ -369,6 +384,9 @@ static void __init bcm47xx_register_bcma
+
+ if (bcm47xx_bus.bcma.bus.drv_cc.flash_type == BCMA_SFLASH)
+ bcm47xx_sflash_struct_bcma_init(&bcm47xx_sflash, &bcm47xx_bus.bcma.bus.drv_cc);
++
++ if (bcm47xx_bus.bcma.bus.drv_cc.flash_type == BCMA_NFLASH)
++ bcm47xx_nflash_struct_bcma_init(&bcm47xx_nflash, &bcm47xx_bus.bcma.bus.drv_cc);
+ }
+
+ static int __init bcm47xx_register_flash_bcma(void)
+@@ -383,6 +401,9 @@ static int __init bcm47xx_register_flash
+ case BCMA_SFLASH:
+ bcm47xx_sflash_dev.dev.platform_data = &bcm47xx_sflash;
+ return platform_device_register(&bcm47xx_sflash_dev);
++ case BCMA_NFLASH:
++ bcm47xx_nflash_dev.dev.platform_data = &bcm47xx_nflash;
++ return platform_device_register(&bcm47xx_nflash_dev);
+ default:
+ printk(KERN_ERR "No flash device found\n");
+ return -1;
--- a/arch/mips/include/asm/mach-bcm47xx/bus.h
+++ b/arch/mips/include/asm/mach-bcm47xx/bus.h
@@ -2,6 +2,7 @@
@@ -175,7 +185,15 @@
struct bcm47xx_sflash {
enum bcm47xx_bus_type sflash_type;
-@@ -38,3 +40,18 @@ void bcm47xx_sflash_struct_bcma_init(str
+@@ -29,11 +31,24 @@ struct bcm47xx_sflash {
+ u32 blocksize; /* Block size */
+ u32 numblocks; /* Number of blocks */
+ u32 size; /* Total size in bytes */
+-
+- struct mtd_info *mtd;
+ };
+
+ void bcm47xx_sflash_struct_bcma_init(struct bcm47xx_sflash *sflash, struct bcma_drv_cc *bcc);
void bcm47xx_sflash_struct_ssb_init(struct bcm47xx_sflash *sflash, struct ssb_chipcommon *scc);
extern struct bcm47xx_sflash bcm47xx_sflash;
@@ -194,6 +212,30 @@
+void bcm47xx_nflash_struct_bcma_init(struct bcm47xx_nflash *nflash, struct bcma_drv_cc *bcc);
+
+extern struct bcm47xx_nflash bcm47xx_nflash;
+--- a/drivers/bcma/Kconfig
++++ b/drivers/bcma/Kconfig
+@@ -43,6 +43,11 @@ config BCMA_SFLASH
+ depends on BCMA_DRIVER_MIPS
+ default y
+
++config BCMA_NFLASH
++ bool
++ depends on BCMA_DRIVER_MIPS
++ default y
++
+ config BCMA_DRIVER_MIPS
+ bool "BCMA Broadcom MIPS core driver"
+ depends on BCMA && MIPS
+--- a/drivers/bcma/Makefile
++++ b/drivers/bcma/Makefile
+@@ -1,6 +1,7 @@
+ bcma-y += main.o scan.o core.o sprom.o
+ bcma-y += driver_chipcommon.o driver_chipcommon_pmu.o
+ bcma-$(CONFIG_BCMA_SFLASH) += driver_chipcommon_sflash.o
++bcma-$(CONFIG_BCMA_NFLASH) += driver_chipcommon_nflash.o
+ bcma-y += driver_pci.o
+ bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE) += driver_pci_host.o
+ bcma-$(CONFIG_BCMA_DRIVER_MIPS) += driver_mips.o
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -46,6 +46,11 @@ u32 bcma_pmu_get_clockcpu(struct bcma_dr
@@ -320,7 +362,7 @@
+ mask = cc->nflash.pagesize - 1;
+ if (bcma_nflash_offset_is_valid(cc, offset, len, mask))
+ return 1;
-+
++
+ /* disable partial page enable */
+ reg = bcma_cc_read32(cc, NAND_ACC_CONTROL);
+ reg &= ~NAC_PARTIAL_PAGE_EN;
@@ -349,7 +391,7 @@
+ return (len - res);
+}
+
-+/* Erase a region. Returns success (0) or failure (-1).
++/* Erase a region. Returns success (0) or failure (-1).
+ * Poll for completion.
+ */
+int bcma_nflash_erase(struct bcma_drv_cc *cc, u32 offset)
@@ -393,30 +435,30 @@
switch (bus->drv_cc.capabilities & BCMA_CC_CAP_FLASHT) {
case BCMA_CC_FLASHT_STSER:
case BCMA_CC_FLASHT_ATSER:
---- a/drivers/bcma/Kconfig
-+++ b/drivers/bcma/Kconfig
-@@ -43,6 +43,11 @@ config BCMA_SFLASH
- depends on BCMA_DRIVER_MIPS
- default y
+--- a/drivers/mtd/nand/Kconfig
++++ b/drivers/mtd/nand/Kconfig
+@@ -537,4 +537,12 @@ config MTD_NAND_FSMC
+ Enables support for NAND Flash chips on the ST Microelectronics
+ Flexible Static Memory Controller (FSMC)
-+config BCMA_NFLASH
-+ bool
-+ depends on BCMA_DRIVER_MIPS
++config MTD_NAND_BCM47XX
++ tristate "bcm47xx nand flash support"
+ default y
++ depends on BCM47XX
++ select MTD_PARTITIONS
++ help
++ Support for bcm47xx nand flash
+
- config BCMA_DRIVER_MIPS
- bool "BCMA Broadcom MIPS core driver"
- depends on BCMA && MIPS
---- a/drivers/bcma/Makefile
-+++ b/drivers/bcma/Makefile
-@@ -1,6 +1,7 @@
- bcma-y += main.o scan.o core.o sprom.o
- bcma-y += driver_chipcommon.o driver_chipcommon_pmu.o
- bcma-$(CONFIG_BCMA_SFLASH) += driver_chipcommon_sflash.o
-+bcma-$(CONFIG_BCMA_NFLASH) += driver_chipcommon_nflash.o
- bcma-y += driver_pci.o
- bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE) += driver_pci_host.o
- bcma-$(CONFIG_BCMA_DRIVER_MIPS) += driver_mips.o
+ endif # MTD_NAND
+--- a/drivers/mtd/nand/Makefile
++++ b/drivers/mtd/nand/Makefile
+@@ -49,5 +49,6 @@ obj-$(CONFIG_MTD_NAND_MPC5121_NFC) += mp
+ obj-$(CONFIG_MTD_NAND_RICOH) += r852.o
+ obj-$(CONFIG_MTD_NAND_JZ4740) += jz4740_nand.o
+ obj-$(CONFIG_MTD_NAND_GPMI_NAND) += gpmi-nand/
++obj-$(CONFIG_MTD_NAND_BCM47XX) += bcm47xx_nand.o
+
+ nand-objs := nand_base.o nand_bbt.o
--- /dev/null
+++ b/drivers/mtd/nand/bcm47xx_nand.c
@@ -0,0 +1,506 @@
@@ -590,7 +632,7 @@
+ goto done;
+ }
+ }
-+
++
+ /* Copy input data into holding block */
+ copy_len = min(len, blocksize - (offset & mask));
+ memcpy(block + (offset & mask), ptr, copy_len);
@@ -639,7 +681,7 @@
+ pr_err("ERASE: nflash_mtd_poll error\n");
+ return 1;
+ }
-+
++
+ return 0;
+}
+
@@ -704,14 +746,14 @@
+ nflash->next_opcode = 0;
+ bcm47xx_erase(mtd, page_addr*pagesize, pagesize);
+ break;
-+
++
+ case NAND_CMD_ERASE2:
+ break;
+
+ case NAND_CMD_RNDOUT:
+ if (column > mtd->writesize)
+ read_offset += (column - mtd->writesize);
-+ else
++ else
+ read_offset += column;
+ break;
+
@@ -740,7 +782,7 @@
+ return ret;
+
+ if (nflash->next_opcode == NAND_CMD_STATUS)
-+ return NAND_STATUS_WP;
++ return NAND_STATUS_WP;
+
+ id = bcma_cc_read32(nflash->bcc, nflash->next_opcode);
+
@@ -879,7 +921,7 @@
+ pr_err("mtd_device_register failed\n");
+ return ret;
+ }
-+
++
+ return 0;
+
+done:
@@ -926,30 +968,6 @@
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("BCM47XX NAND flash driver");
---- a/drivers/mtd/nand/Kconfig
-+++ b/drivers/mtd/nand/Kconfig
-@@ -537,4 +537,12 @@ config MTD_NAND_FSMC
- Enables support for NAND Flash chips on the ST Microelectronics
- Flexible Static Memory Controller (FSMC)
-
-+config MTD_NAND_BCM47XX
-+ tristate "bcm47xx nand flash support"
-+ default y
-+ depends on BCM47XX
-+ select MTD_PARTITIONS
-+ help
-+ Support for bcm47xx nand flash
-+
- endif # MTD_NAND
---- a/drivers/mtd/nand/Makefile
-+++ b/drivers/mtd/nand/Makefile
-@@ -49,5 +49,6 @@ obj-$(CONFIG_MTD_NAND_MPC5121_NFC) += mp
- obj-$(CONFIG_MTD_NAND_RICOH) += r852.o
- obj-$(CONFIG_MTD_NAND_JZ4740) += jz4740_nand.o
- obj-$(CONFIG_MTD_NAND_GPMI_NAND) += gpmi-nand/
-+obj-$(CONFIG_MTD_NAND_BCM47XX) += bcm47xx_nand.o
-
- nand-objs := nand_base.o nand_bbt.o
--- a/include/linux/bcma/bcma_driver_chipcommon.h
+++ b/include/linux/bcma/bcma_driver_chipcommon.h
@@ -376,6 +376,7 @@ struct bcma_chipcommon_pmu {
@@ -985,8 +1003,8 @@
};
int nr_serial_ports;
-@@ -483,4 +495,13 @@ int bcma_sflash_commit(struct bcma_drv_c
- const u8 *buf);
+@@ -481,4 +493,13 @@ int bcma_sflash_write(struct bcma_drv_cc
+ int bcma_sflash_erase(struct bcma_drv_cc *cc, u32 offset);
#endif /* CONFIG_BCMA_SFLASH */
+#ifdef CONFIG_BCMA_NFLASH
@@ -1008,7 +1026,7 @@
+ * Copyright (C) 2011-2012 Tathagata Das <tathagata@alumnux.com>
+ * Copyright (C) 2009, Broadcom Corporation
+ * All Rights Reserved.
-+ *
++ *
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS