bcma: add place for flash memory support
authorRafał Miłecki <zajec5@gmail.com>
Tue, 17 Jul 2012 14:26:41 +0000 (16:26 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 17 Jul 2012 19:11:40 +0000 (15:11 -0400)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/bcma/Kconfig
drivers/bcma/Makefile
drivers/bcma/bcma_private.h
drivers/bcma/driver_chipcommon_nflash.c [new file with mode: 0644]
drivers/bcma/driver_chipcommon_sflash.c [new file with mode: 0644]
drivers/bcma/driver_mips.c

index 9319cde..06b3207 100644 (file)
@@ -46,6 +46,16 @@ config BCMA_DRIVER_MIPS
 
          If unsure, say N
 
+config BCMA_SFLASH
+       bool
+       depends on BCMA_DRIVER_MIPS && BROKEN
+       default y
+
+config BCMA_NFLASH
+       bool
+       depends on BCMA_DRIVER_MIPS && BROKEN
+       default y
+
 config BCMA_DRIVER_GMAC_CMN
        bool "BCMA Broadcom GBIT MAC COMMON core driver"
        depends on BCMA
index d13803f..8ad42d4 100644 (file)
@@ -1,5 +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
index f6589eb..3cf9cc9 100644 (file)
@@ -51,6 +51,28 @@ void bcma_chipco_serial_init(struct bcma_drv_cc *cc);
 u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc);
 u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc);
 
+#ifdef CONFIG_BCMA_SFLASH
+/* driver_chipcommon_sflash.c */
+int bcma_sflash_init(struct bcma_drv_cc *cc);
+#else
+static inline int bcma_sflash_init(struct bcma_drv_cc *cc)
+{
+       bcma_err(cc->core->bus, "Serial flash not supported\n");
+       return 0;
+}
+#endif /* CONFIG_BCMA_SFLASH */
+
+#ifdef CONFIG_BCMA_NFLASH
+/* driver_chipcommon_nflash.c */
+int bcma_nflash_init(struct bcma_drv_cc *cc);
+#else
+static inline int bcma_nflash_init(struct bcma_drv_cc *cc)
+{
+       bcma_err(cc->core->bus, "NAND flash not supported\n");
+       return 0;
+}
+#endif /* CONFIG_BCMA_NFLASH */
+
 #ifdef CONFIG_BCMA_HOST_PCI
 /* host_pci.c */
 extern int __init bcma_host_pci_init(void);
diff --git a/drivers/bcma/driver_chipcommon_nflash.c b/drivers/bcma/driver_chipcommon_nflash.c
new file mode 100644 (file)
index 0000000..574d624
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Broadcom specific AMBA
+ * ChipCommon NAND flash interface
+ *
+ * Licensed under the GNU/GPL. See COPYING for details.
+ */
+
+#include <linux/bcma/bcma.h>
+#include <linux/bcma/bcma_driver_chipcommon.h>
+#include <linux/delay.h>
+
+#include "bcma_private.h"
+
+/* Initialize NAND flash access */
+int bcma_nflash_init(struct bcma_drv_cc *cc)
+{
+       bcma_err(cc->core->bus, "NAND flash support is broken\n");
+       return 0;
+}
diff --git a/drivers/bcma/driver_chipcommon_sflash.c b/drivers/bcma/driver_chipcommon_sflash.c
new file mode 100644 (file)
index 0000000..6e157a5
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Broadcom specific AMBA
+ * ChipCommon serial flash interface
+ *
+ * Licensed under the GNU/GPL. See COPYING for details.
+ */
+
+#include <linux/bcma/bcma.h>
+#include <linux/bcma/bcma_driver_chipcommon.h>
+#include <linux/delay.h>
+
+#include "bcma_private.h"
+
+/* Initialize serial flash access */
+int bcma_sflash_init(struct bcma_drv_cc *cc)
+{
+       bcma_err(cc->core->bus, "Serial flash support is broken\n");
+       return 0;
+}
index ef34ed2..b013b04 100644 (file)
@@ -185,10 +185,11 @@ static void bcma_core_mips_flash_detect(struct bcma_drv_mips *mcore)
        switch (bus->drv_cc.capabilities & BCMA_CC_CAP_FLASHT) {
        case BCMA_CC_FLASHT_STSER:
        case BCMA_CC_FLASHT_ATSER:
-               bcma_err(bus, "Serial flash not supported.\n");
+               bcma_debug(bus, "Found serial flash\n");
+               bcma_sflash_init(&bus->drv_cc);
                break;
        case BCMA_CC_FLASHT_PARA:
-               bcma_info(bus, "found parallel flash.\n");
+               bcma_debug(bus, "Found parallel flash\n");
                bus->drv_cc.pflash.window = 0x1c000000;
                bus->drv_cc.pflash.window_size = 0x02000000;
 
@@ -199,7 +200,15 @@ static void bcma_core_mips_flash_detect(struct bcma_drv_mips *mcore)
                        bus->drv_cc.pflash.buswidth = 2;
                break;
        default:
-               bcma_err(bus, "flash not supported.\n");
+               bcma_err(bus, "Flash type not supported\n");
+       }
+
+       if (bus->drv_cc.core->id.rev == 38 ||
+           bus->chipinfo.id == BCMA_CHIP_ID_BCM4706) {
+               if (bus->drv_cc.capabilities & BCMA_CC_CAP_NFLASH) {
+                       bcma_debug(bus, "Found NAND flash\n");
+                       bcma_nflash_init(&bus->drv_cc);
+               }
        }
 }