diff options
Diffstat (limited to 'arch/mips/bcm63xx/dev-flash.c')
-rw-r--r-- | arch/mips/bcm63xx/dev-flash.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/arch/mips/bcm63xx/dev-flash.c b/arch/mips/bcm63xx/dev-flash.c new file mode 100644 index 000000000000..58371c7deac2 --- /dev/null +++ b/arch/mips/bcm63xx/dev-flash.c | |||
@@ -0,0 +1,123 @@ | |||
1 | /* | ||
2 | * Broadcom BCM63xx flash registration | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
9 | * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org> | ||
10 | * Copyright (C) 2012 Jonas Gorski <jonas.gorski@gmail.com> | ||
11 | */ | ||
12 | |||
13 | #include <linux/init.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/mtd/mtd.h> | ||
17 | #include <linux/mtd/partitions.h> | ||
18 | #include <linux/mtd/physmap.h> | ||
19 | |||
20 | #include <bcm63xx_cpu.h> | ||
21 | #include <bcm63xx_dev_flash.h> | ||
22 | #include <bcm63xx_regs.h> | ||
23 | #include <bcm63xx_io.h> | ||
24 | |||
25 | static struct mtd_partition mtd_partitions[] = { | ||
26 | { | ||
27 | .name = "cfe", | ||
28 | .offset = 0x0, | ||
29 | .size = 0x40000, | ||
30 | } | ||
31 | }; | ||
32 | |||
33 | static const char *bcm63xx_part_types[] = { "bcm63xxpart", NULL }; | ||
34 | |||
35 | static struct physmap_flash_data flash_data = { | ||
36 | .width = 2, | ||
37 | .parts = mtd_partitions, | ||
38 | .part_probe_types = bcm63xx_part_types, | ||
39 | }; | ||
40 | |||
41 | static struct resource mtd_resources[] = { | ||
42 | { | ||
43 | .start = 0, /* filled at runtime */ | ||
44 | .end = 0, /* filled at runtime */ | ||
45 | .flags = IORESOURCE_MEM, | ||
46 | } | ||
47 | }; | ||
48 | |||
49 | static struct platform_device mtd_dev = { | ||
50 | .name = "physmap-flash", | ||
51 | .resource = mtd_resources, | ||
52 | .num_resources = ARRAY_SIZE(mtd_resources), | ||
53 | .dev = { | ||
54 | .platform_data = &flash_data, | ||
55 | }, | ||
56 | }; | ||
57 | |||
58 | static int __init bcm63xx_detect_flash_type(void) | ||
59 | { | ||
60 | u32 val; | ||
61 | |||
62 | switch (bcm63xx_get_cpu_id()) { | ||
63 | case BCM6328_CPU_ID: | ||
64 | val = bcm_misc_readl(MISC_STRAPBUS_6328_REG); | ||
65 | if (val & STRAPBUS_6328_BOOT_SEL_SERIAL) | ||
66 | return BCM63XX_FLASH_TYPE_SERIAL; | ||
67 | else | ||
68 | return BCM63XX_FLASH_TYPE_NAND; | ||
69 | case BCM6338_CPU_ID: | ||
70 | case BCM6345_CPU_ID: | ||
71 | case BCM6348_CPU_ID: | ||
72 | /* no way to auto detect so assume parallel */ | ||
73 | return BCM63XX_FLASH_TYPE_PARALLEL; | ||
74 | case BCM6358_CPU_ID: | ||
75 | val = bcm_gpio_readl(GPIO_STRAPBUS_REG); | ||
76 | if (val & STRAPBUS_6358_BOOT_SEL_PARALLEL) | ||
77 | return BCM63XX_FLASH_TYPE_PARALLEL; | ||
78 | else | ||
79 | return BCM63XX_FLASH_TYPE_SERIAL; | ||
80 | case BCM6368_CPU_ID: | ||
81 | val = bcm_gpio_readl(GPIO_STRAPBUS_REG); | ||
82 | switch (val & STRAPBUS_6368_BOOT_SEL_MASK) { | ||
83 | case STRAPBUS_6368_BOOT_SEL_NAND: | ||
84 | return BCM63XX_FLASH_TYPE_NAND; | ||
85 | case STRAPBUS_6368_BOOT_SEL_SERIAL: | ||
86 | return BCM63XX_FLASH_TYPE_SERIAL; | ||
87 | case STRAPBUS_6368_BOOT_SEL_PARALLEL: | ||
88 | return BCM63XX_FLASH_TYPE_PARALLEL; | ||
89 | } | ||
90 | default: | ||
91 | return -EINVAL; | ||
92 | } | ||
93 | } | ||
94 | |||
95 | int __init bcm63xx_flash_register(void) | ||
96 | { | ||
97 | int flash_type; | ||
98 | u32 val; | ||
99 | |||
100 | flash_type = bcm63xx_detect_flash_type(); | ||
101 | |||
102 | switch (flash_type) { | ||
103 | case BCM63XX_FLASH_TYPE_PARALLEL: | ||
104 | /* read base address of boot chip select (0) */ | ||
105 | val = bcm_mpi_readl(MPI_CSBASE_REG(0)); | ||
106 | val &= MPI_CSBASE_BASE_MASK; | ||
107 | |||
108 | mtd_resources[0].start = val; | ||
109 | mtd_resources[0].end = 0x1FFFFFFF; | ||
110 | |||
111 | return platform_device_register(&mtd_dev); | ||
112 | case BCM63XX_FLASH_TYPE_SERIAL: | ||
113 | pr_warn("unsupported serial flash detected\n"); | ||
114 | return -ENODEV; | ||
115 | case BCM63XX_FLASH_TYPE_NAND: | ||
116 | pr_warn("unsupported NAND flash detected\n"); | ||
117 | return -ENODEV; | ||
118 | default: | ||
119 | pr_err("flash detection failed for BCM%x: %d\n", | ||
120 | bcm63xx_get_cpu_id(), flash_type); | ||
121 | return -ENODEV; | ||
122 | } | ||
123 | } | ||