1 From 0b2451b1cdab390b0b86c60a4765208bb2724d22 Mon Sep 17 00:00:00 2001
2 From: Jonas Gorski <jonas.gorski@gmail.com>
3 Date: Sat, 2 Jul 2011 14:44:28 +0200
4 Subject: [PATCH 26/79] MIPS: BCM63XX: add flash type detection
6 On BCM6358 and BCM6368 the attached flash type is exposed through a
7 bootstrapping register. Use it for auto detecting the flash type on
8 those and default to parallel flash for earlier SoCs.
10 Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
12 arch/mips/bcm63xx/dev-flash.c | 60 ++++++++++++++++++--
13 .../include/asm/mach-bcm63xx/bcm63xx_dev_flash.h | 6 ++
14 arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h | 9 +++
15 3 files changed, 69 insertions(+), 6 deletions(-)
17 --- a/arch/mips/bcm63xx/dev-flash.c
18 +++ b/arch/mips/bcm63xx/dev-flash.c
22 * Copyright (C) 2009 Florian Fainelli <florian@openwrt.org>
23 + * Copyright (C) 2012 Jonas Gorski <jonas.gorski@gmail.com>
26 #include <linux/init.h>
27 @@ -53,16 +54,63 @@ static struct platform_device mtd_dev =
31 -int __init bcm63xx_flash_register(void)
32 +static int __init bcm63xx_detect_flash_type(void)
36 - /* read base address of boot chip select (0) */
37 - val = bcm_mpi_readl(MPI_CSBASE_REG(0));
38 - val &= MPI_CSBASE_BASE_MASK;
39 + switch (bcm63xx_get_cpu_id()) {
40 + case BCM6338_CPU_ID:
41 + case BCM6345_CPU_ID:
42 + case BCM6348_CPU_ID:
43 + /* no way to auto detect so assume parallel */
44 + return BCM63XX_FLASH_TYPE_PARALLEL;
45 + case BCM6358_CPU_ID:
46 + val = bcm_gpio_readl(GPIO_STRAPBUS_REG);
47 + if (val & STRAPBUS_6358_BOOT_SEL_PARALLEL)
48 + return BCM63XX_FLASH_TYPE_PARALLEL;
50 + return BCM63XX_FLASH_TYPE_SERIAL;
51 + case BCM6368_CPU_ID:
52 + val = bcm_gpio_readl(GPIO_STRAPBUS_REG);
53 + switch (val & STRAPBUS_6368_BOOT_SEL_MASK) {
54 + case STRAPBUS_6368_BOOT_SEL_NAND:
55 + return BCM63XX_FLASH_TYPE_NAND;
56 + case STRAPBUS_6368_BOOT_SEL_SERIAL:
57 + return BCM63XX_FLASH_TYPE_SERIAL;
58 + case STRAPBUS_6368_BOOT_SEL_PARALLEL:
59 + return BCM63XX_FLASH_TYPE_PARALLEL;
66 +int __init bcm63xx_flash_register(void)
71 - mtd_resources[0].start = val;
72 - mtd_resources[0].end = 0x1FFFFFFF;
73 + flash_type = bcm63xx_detect_flash_type();
75 - return platform_device_register(&mtd_dev);
76 + switch (flash_type) {
77 + case BCM63XX_FLASH_TYPE_PARALLEL:
78 + /* read base address of boot chip select (0) */
79 + val = bcm_mpi_readl(MPI_CSBASE_REG(0));
80 + val &= MPI_CSBASE_BASE_MASK;
82 + mtd_resources[0].start = val;
83 + mtd_resources[0].end = 0x1FFFFFFF;
85 + return platform_device_register(&mtd_dev);
86 + case BCM63XX_FLASH_TYPE_SERIAL:
87 + pr_warn("unsupported serial flash detected\n");
89 + case BCM63XX_FLASH_TYPE_NAND:
90 + pr_warn("unsupported NAND flash detected\n");
93 + pr_err("flash detection failed for BCM%x: %d",
94 + bcm63xx_get_cpu_id(), flash_type);
98 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_flash.h
99 +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_flash.h
101 #ifndef __BCM63XX_FLASH_H
102 #define __BCM63XX_FLASH_H
105 + BCM63XX_FLASH_TYPE_PARALLEL,
106 + BCM63XX_FLASH_TYPE_SERIAL,
107 + BCM63XX_FLASH_TYPE_NAND,
110 int __init bcm63xx_flash_register(void);
112 #endif /* __BCM63XX_FLASH_H */
113 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
114 +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
116 #define GPIO_BASEMODE_6368_MASK 0x7
117 /* those bits must be kept as read in gpio basemode register*/
119 +#define GPIO_STRAPBUS_REG 0x40
120 +#define STRAPBUS_6358_BOOT_SEL_PARALLEL (1 << 1)
121 +#define STRAPBUS_6358_BOOT_SEL_SERIAL (0 << 1)
122 +#define STRAPBUS_6368_BOOT_SEL_MASK 0x3
123 +#define STRAPBUS_6368_BOOT_SEL_NAND 0
124 +#define STRAPBUS_6368_BOOT_SEL_SERIAL 1
125 +#define STRAPBUS_6368_BOOT_SEL_PARALLEL 3
128 /*************************************************************************
129 * _REG relative to RSET_ENET
130 *************************************************************************/