diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-30 14:45:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-30 14:45:52 -0400 |
commit | 287dc4b7642df15fa6b9f286c812e79138acd698 (patch) | |
tree | c3ebe1caea100ff2b8f414619ec0a9dcd8a14547 /arch/mips/bcm63xx | |
parent | 720d85075b7ed3617de8ca8d9097390e303e9f60 (diff) | |
parent | 68d8848567ef03eb2c2303173934428d0bf0a531 (diff) |
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
Pull MIPS updates from Ralf Baechle:
"More hardware support across the field including a bunch of device
drivers. The highlight however really are further steps towards
device tree.
This has been sitting in -next for ages. All MIPS _defconfigs have
been tested to boot or where I don't have hardware available, to at
least build fine."
* 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus: (77 commits)
MIPS: Loongson 1B: Add defconfig
MIPS: Loongson 1B: Add board support
MIPS: Netlogic: early console fix
MIPS: Netlogic: Fix indentation of smpboot.S
MIPS: Netlogic: remove cpu_has_dc_aliases define for XLP
MIPS: Netlogic: Remove unused pcibios_fixups
MIPS: Netlogic: Add XLP SoC devices in FDT
MIPS: Netlogic: Add IRQ mappings for more devices
MIPS: Netlogic: USB support for XLP
MIPS: Netlogic: XLP PCIe controller support.
MIPS: Netlogic: Platform changes for XLR/XLS I2C
MIPS: Netlogic: Platform NAND/NOR flash support
MIPS: Netlogic: Platform changes for XLS USB
MIPS: Netlogic: Remove NETLOGIC_ prefix
MIPS: Netlogic: SMP wakeup code update
MIPS: Netlogic: Update comments in smpboot.S
MIPS: BCM63XX: Add 96328avng reference board
MIPS: Expose PCIe drivers for MIPS
MIPS: BCM63XX: Add PCIe Support for BCM6328
MIPS: BCM63XX: Move the PCI initialization into its own function
...
Diffstat (limited to 'arch/mips/bcm63xx')
-rw-r--r-- | arch/mips/bcm63xx/Kconfig | 4 | ||||
-rw-r--r-- | arch/mips/bcm63xx/Makefile | 3 | ||||
-rw-r--r-- | arch/mips/bcm63xx/boards/board_bcm963xx.c | 107 | ||||
-rw-r--r-- | arch/mips/bcm63xx/clk.c | 26 | ||||
-rw-r--r-- | arch/mips/bcm63xx/cpu.c | 63 | ||||
-rw-r--r-- | arch/mips/bcm63xx/dev-dsp.c | 2 | ||||
-rw-r--r-- | arch/mips/bcm63xx/dev-flash.c | 123 | ||||
-rw-r--r-- | arch/mips/bcm63xx/dev-rng.c | 40 | ||||
-rw-r--r-- | arch/mips/bcm63xx/dev-spi.c | 119 | ||||
-rw-r--r-- | arch/mips/bcm63xx/dev-wdt.c | 2 | ||||
-rw-r--r-- | arch/mips/bcm63xx/irq.c | 21 | ||||
-rw-r--r-- | arch/mips/bcm63xx/prom.c | 4 | ||||
-rw-r--r-- | arch/mips/bcm63xx/setup.c | 13 |
13 files changed, 458 insertions, 69 deletions
diff --git a/arch/mips/bcm63xx/Kconfig b/arch/mips/bcm63xx/Kconfig index 6b1b9ad8d85..d03e8799d1c 100644 --- a/arch/mips/bcm63xx/Kconfig +++ b/arch/mips/bcm63xx/Kconfig | |||
@@ -1,6 +1,10 @@ | |||
1 | menu "CPU support" | 1 | menu "CPU support" |
2 | depends on BCM63XX | 2 | depends on BCM63XX |
3 | 3 | ||
4 | config BCM63XX_CPU_6328 | ||
5 | bool "support 6328 CPU" | ||
6 | select HW_HAS_PCI | ||
7 | |||
4 | config BCM63XX_CPU_6338 | 8 | config BCM63XX_CPU_6338 |
5 | bool "support 6338 CPU" | 9 | bool "support 6338 CPU" |
6 | select HW_HAS_PCI | 10 | select HW_HAS_PCI |
diff --git a/arch/mips/bcm63xx/Makefile b/arch/mips/bcm63xx/Makefile index 6dfdc69928a..833af72c852 100644 --- a/arch/mips/bcm63xx/Makefile +++ b/arch/mips/bcm63xx/Makefile | |||
@@ -1,5 +1,6 @@ | |||
1 | obj-y += clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \ | 1 | obj-y += clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \ |
2 | dev-dsp.o dev-enet.o dev-pcmcia.o dev-uart.o dev-wdt.o | 2 | dev-dsp.o dev-enet.o dev-flash.o dev-pcmcia.o dev-rng.o \ |
3 | dev-spi.o dev-uart.o dev-wdt.o | ||
3 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | 4 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
4 | 5 | ||
5 | obj-y += boards/ | 6 | obj-y += boards/ |
diff --git a/arch/mips/bcm63xx/boards/board_bcm963xx.c b/arch/mips/bcm63xx/boards/board_bcm963xx.c index 2f1773f3fb7..feb05258a4d 100644 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c | |||
@@ -11,9 +11,6 @@ | |||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/string.h> | 12 | #include <linux/string.h> |
13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
14 | #include <linux/mtd/mtd.h> | ||
15 | #include <linux/mtd/partitions.h> | ||
16 | #include <linux/mtd/physmap.h> | ||
17 | #include <linux/ssb/ssb.h> | 14 | #include <linux/ssb/ssb.h> |
18 | #include <asm/addrspace.h> | 15 | #include <asm/addrspace.h> |
19 | #include <bcm63xx_board.h> | 16 | #include <bcm63xx_board.h> |
@@ -24,7 +21,9 @@ | |||
24 | #include <bcm63xx_dev_pci.h> | 21 | #include <bcm63xx_dev_pci.h> |
25 | #include <bcm63xx_dev_enet.h> | 22 | #include <bcm63xx_dev_enet.h> |
26 | #include <bcm63xx_dev_dsp.h> | 23 | #include <bcm63xx_dev_dsp.h> |
24 | #include <bcm63xx_dev_flash.h> | ||
27 | #include <bcm63xx_dev_pcmcia.h> | 25 | #include <bcm63xx_dev_pcmcia.h> |
26 | #include <bcm63xx_dev_spi.h> | ||
28 | #include <board_bcm963xx.h> | 27 | #include <board_bcm963xx.h> |
29 | 28 | ||
30 | #define PFX "board_bcm963xx: " | 29 | #define PFX "board_bcm963xx: " |
@@ -34,6 +33,48 @@ static unsigned int mac_addr_used; | |||
34 | static struct board_info board; | 33 | static struct board_info board; |
35 | 34 | ||
36 | /* | 35 | /* |
36 | * known 6328 boards | ||
37 | */ | ||
38 | #ifdef CONFIG_BCM63XX_CPU_6328 | ||
39 | static struct board_info __initdata board_96328avng = { | ||
40 | .name = "96328avng", | ||
41 | .expected_cpu_id = 0x6328, | ||
42 | |||
43 | .has_uart0 = 1, | ||
44 | .has_pci = 1, | ||
45 | |||
46 | .leds = { | ||
47 | { | ||
48 | .name = "96328avng::ppp-fail", | ||
49 | .gpio = 2, | ||
50 | .active_low = 1, | ||
51 | }, | ||
52 | { | ||
53 | .name = "96328avng::power", | ||
54 | .gpio = 4, | ||
55 | .active_low = 1, | ||
56 | .default_trigger = "default-on", | ||
57 | }, | ||
58 | { | ||
59 | .name = "96328avng::power-fail", | ||
60 | .gpio = 8, | ||
61 | .active_low = 1, | ||
62 | }, | ||
63 | { | ||
64 | .name = "96328avng::wps", | ||
65 | .gpio = 9, | ||
66 | .active_low = 1, | ||
67 | }, | ||
68 | { | ||
69 | .name = "96328avng::ppp", | ||
70 | .gpio = 11, | ||
71 | .active_low = 1, | ||
72 | }, | ||
73 | }, | ||
74 | }; | ||
75 | #endif | ||
76 | |||
77 | /* | ||
37 | * known 6338 boards | 78 | * known 6338 boards |
38 | */ | 79 | */ |
39 | #ifdef CONFIG_BCM63XX_CPU_6338 | 80 | #ifdef CONFIG_BCM63XX_CPU_6338 |
@@ -592,6 +633,9 @@ static struct board_info __initdata board_DWVS0 = { | |||
592 | * all boards | 633 | * all boards |
593 | */ | 634 | */ |
594 | static const struct board_info __initdata *bcm963xx_boards[] = { | 635 | static const struct board_info __initdata *bcm963xx_boards[] = { |
636 | #ifdef CONFIG_BCM63XX_CPU_6328 | ||
637 | &board_96328avng, | ||
638 | #endif | ||
595 | #ifdef CONFIG_BCM63XX_CPU_6338 | 639 | #ifdef CONFIG_BCM63XX_CPU_6338 |
596 | &board_96338gw, | 640 | &board_96338gw, |
597 | &board_96338w, | 641 | &board_96338w, |
@@ -709,9 +753,15 @@ void __init board_prom_init(void) | |||
709 | char cfe_version[32]; | 753 | char cfe_version[32]; |
710 | u32 val; | 754 | u32 val; |
711 | 755 | ||
712 | /* read base address of boot chip select (0) */ | 756 | /* read base address of boot chip select (0) |
713 | val = bcm_mpi_readl(MPI_CSBASE_REG(0)); | 757 | * 6328 does not have MPI but boots from a fixed address |
714 | val &= MPI_CSBASE_BASE_MASK; | 758 | */ |
759 | if (BCMCPU_IS_6328()) | ||
760 | val = 0x18000000; | ||
761 | else { | ||
762 | val = bcm_mpi_readl(MPI_CSBASE_REG(0)); | ||
763 | val &= MPI_CSBASE_BASE_MASK; | ||
764 | } | ||
715 | boot_addr = (u8 *)KSEG1ADDR(val); | 765 | boot_addr = (u8 *)KSEG1ADDR(val); |
716 | 766 | ||
717 | /* dump cfe version */ | 767 | /* dump cfe version */ |
@@ -808,40 +858,6 @@ void __init board_setup(void) | |||
808 | panic("unexpected CPU for bcm963xx board"); | 858 | panic("unexpected CPU for bcm963xx board"); |
809 | } | 859 | } |
810 | 860 | ||
811 | static struct mtd_partition mtd_partitions[] = { | ||
812 | { | ||
813 | .name = "cfe", | ||
814 | .offset = 0x0, | ||
815 | .size = 0x40000, | ||
816 | } | ||
817 | }; | ||
818 | |||
819 | static const char *bcm63xx_part_types[] = { "bcm63xxpart", NULL }; | ||
820 | |||
821 | static struct physmap_flash_data flash_data = { | ||
822 | .width = 2, | ||
823 | .nr_parts = ARRAY_SIZE(mtd_partitions), | ||
824 | .parts = mtd_partitions, | ||
825 | .part_probe_types = bcm63xx_part_types, | ||
826 | }; | ||
827 | |||
828 | static struct resource mtd_resources[] = { | ||
829 | { | ||
830 | .start = 0, /* filled at runtime */ | ||
831 | .end = 0, /* filled at runtime */ | ||
832 | .flags = IORESOURCE_MEM, | ||
833 | } | ||
834 | }; | ||
835 | |||
836 | static struct platform_device mtd_dev = { | ||
837 | .name = "physmap-flash", | ||
838 | .resource = mtd_resources, | ||
839 | .num_resources = ARRAY_SIZE(mtd_resources), | ||
840 | .dev = { | ||
841 | .platform_data = &flash_data, | ||
842 | }, | ||
843 | }; | ||
844 | |||
845 | static struct gpio_led_platform_data bcm63xx_led_data; | 861 | static struct gpio_led_platform_data bcm63xx_led_data; |
846 | 862 | ||
847 | static struct platform_device bcm63xx_gpio_leds = { | 863 | static struct platform_device bcm63xx_gpio_leds = { |
@@ -855,8 +871,6 @@ static struct platform_device bcm63xx_gpio_leds = { | |||
855 | */ | 871 | */ |
856 | int __init board_register_devices(void) | 872 | int __init board_register_devices(void) |
857 | { | 873 | { |
858 | u32 val; | ||
859 | |||
860 | if (board.has_uart0) | 874 | if (board.has_uart0) |
861 | bcm63xx_uart_register(0); | 875 | bcm63xx_uart_register(0); |
862 | 876 | ||
@@ -890,14 +904,9 @@ int __init board_register_devices(void) | |||
890 | } | 904 | } |
891 | #endif | 905 | #endif |
892 | 906 | ||
893 | /* read base address of boot chip select (0) */ | 907 | bcm63xx_spi_register(); |
894 | val = bcm_mpi_readl(MPI_CSBASE_REG(0)); | ||
895 | val &= MPI_CSBASE_BASE_MASK; | ||
896 | |||
897 | mtd_resources[0].start = val; | ||
898 | mtd_resources[0].end = 0x1FFFFFFF; | ||
899 | 908 | ||
900 | platform_device_register(&mtd_dev); | 909 | bcm63xx_flash_register(); |
901 | 910 | ||
902 | bcm63xx_led_data.num_leds = ARRAY_SIZE(board.leds); | 911 | bcm63xx_led_data.num_leds = ARRAY_SIZE(board.leds); |
903 | bcm63xx_led_data.leds = board.leds; | 912 | bcm63xx_led_data.leds = board.leds; |
diff --git a/arch/mips/bcm63xx/clk.c b/arch/mips/bcm63xx/clk.c index 9d57c71b7b5..1db48adb543 100644 --- a/arch/mips/bcm63xx/clk.c +++ b/arch/mips/bcm63xx/clk.c | |||
@@ -120,7 +120,7 @@ static void enetsw_set(struct clk *clk, int enable) | |||
120 | { | 120 | { |
121 | if (!BCMCPU_IS_6368()) | 121 | if (!BCMCPU_IS_6368()) |
122 | return; | 122 | return; |
123 | bcm_hwclock_set(CKCTL_6368_ROBOSW_CLK_EN | | 123 | bcm_hwclock_set(CKCTL_6368_ROBOSW_EN | |
124 | CKCTL_6368_SWPKT_USB_EN | | 124 | CKCTL_6368_SWPKT_USB_EN | |
125 | CKCTL_6368_SWPKT_SAR_EN, enable); | 125 | CKCTL_6368_SWPKT_SAR_EN, enable); |
126 | if (enable) { | 126 | if (enable) { |
@@ -163,7 +163,7 @@ static void usbh_set(struct clk *clk, int enable) | |||
163 | if (BCMCPU_IS_6348()) | 163 | if (BCMCPU_IS_6348()) |
164 | bcm_hwclock_set(CKCTL_6348_USBH_EN, enable); | 164 | bcm_hwclock_set(CKCTL_6348_USBH_EN, enable); |
165 | else if (BCMCPU_IS_6368()) | 165 | else if (BCMCPU_IS_6368()) |
166 | bcm_hwclock_set(CKCTL_6368_USBH_CLK_EN, enable); | 166 | bcm_hwclock_set(CKCTL_6368_USBH_EN, enable); |
167 | } | 167 | } |
168 | 168 | ||
169 | static struct clk clk_usbh = { | 169 | static struct clk clk_usbh = { |
@@ -181,9 +181,11 @@ static void spi_set(struct clk *clk, int enable) | |||
181 | mask = CKCTL_6338_SPI_EN; | 181 | mask = CKCTL_6338_SPI_EN; |
182 | else if (BCMCPU_IS_6348()) | 182 | else if (BCMCPU_IS_6348()) |
183 | mask = CKCTL_6348_SPI_EN; | 183 | mask = CKCTL_6348_SPI_EN; |
184 | else | 184 | else if (BCMCPU_IS_6358()) |
185 | /* BCMCPU_IS_6358 */ | ||
186 | mask = CKCTL_6358_SPI_EN; | 185 | mask = CKCTL_6358_SPI_EN; |
186 | else | ||
187 | /* BCMCPU_IS_6368 */ | ||
188 | mask = CKCTL_6368_SPI_EN; | ||
187 | bcm_hwclock_set(mask, enable); | 189 | bcm_hwclock_set(mask, enable); |
188 | } | 190 | } |
189 | 191 | ||
@@ -199,7 +201,7 @@ static void xtm_set(struct clk *clk, int enable) | |||
199 | if (!BCMCPU_IS_6368()) | 201 | if (!BCMCPU_IS_6368()) |
200 | return; | 202 | return; |
201 | 203 | ||
202 | bcm_hwclock_set(CKCTL_6368_SAR_CLK_EN | | 204 | bcm_hwclock_set(CKCTL_6368_SAR_EN | |
203 | CKCTL_6368_SWPKT_SAR_EN, enable); | 205 | CKCTL_6368_SWPKT_SAR_EN, enable); |
204 | 206 | ||
205 | if (enable) { | 207 | if (enable) { |
@@ -222,6 +224,18 @@ static struct clk clk_xtm = { | |||
222 | }; | 224 | }; |
223 | 225 | ||
224 | /* | 226 | /* |
227 | * IPsec clock | ||
228 | */ | ||
229 | static void ipsec_set(struct clk *clk, int enable) | ||
230 | { | ||
231 | bcm_hwclock_set(CKCTL_6368_IPSEC_EN, enable); | ||
232 | } | ||
233 | |||
234 | static struct clk clk_ipsec = { | ||
235 | .set = ipsec_set, | ||
236 | }; | ||
237 | |||
238 | /* | ||
225 | * Internal peripheral clock | 239 | * Internal peripheral clock |
226 | */ | 240 | */ |
227 | static struct clk clk_periph = { | 241 | static struct clk clk_periph = { |
@@ -278,6 +292,8 @@ struct clk *clk_get(struct device *dev, const char *id) | |||
278 | return &clk_periph; | 292 | return &clk_periph; |
279 | if (BCMCPU_IS_6358() && !strcmp(id, "pcm")) | 293 | if (BCMCPU_IS_6358() && !strcmp(id, "pcm")) |
280 | return &clk_pcm; | 294 | return &clk_pcm; |
295 | if (BCMCPU_IS_6368() && !strcmp(id, "ipsec")) | ||
296 | return &clk_ipsec; | ||
281 | return ERR_PTR(-ENOENT); | 297 | return ERR_PTR(-ENOENT); |
282 | } | 298 | } |
283 | 299 | ||
diff --git a/arch/mips/bcm63xx/cpu.c b/arch/mips/bcm63xx/cpu.c index 8f0d6c7725e..a7afb289b15 100644 --- a/arch/mips/bcm63xx/cpu.c +++ b/arch/mips/bcm63xx/cpu.c | |||
@@ -29,6 +29,14 @@ static u16 bcm63xx_cpu_rev; | |||
29 | static unsigned int bcm63xx_cpu_freq; | 29 | static unsigned int bcm63xx_cpu_freq; |
30 | static unsigned int bcm63xx_memory_size; | 30 | static unsigned int bcm63xx_memory_size; |
31 | 31 | ||
32 | static const unsigned long bcm6328_regs_base[] = { | ||
33 | __GEN_CPU_REGS_TABLE(6328) | ||
34 | }; | ||
35 | |||
36 | static const int bcm6328_irqs[] = { | ||
37 | __GEN_CPU_IRQ_TABLE(6328) | ||
38 | }; | ||
39 | |||
32 | static const unsigned long bcm6338_regs_base[] = { | 40 | static const unsigned long bcm6338_regs_base[] = { |
33 | __GEN_CPU_REGS_TABLE(6338) | 41 | __GEN_CPU_REGS_TABLE(6338) |
34 | }; | 42 | }; |
@@ -99,6 +107,33 @@ unsigned int bcm63xx_get_memory_size(void) | |||
99 | static unsigned int detect_cpu_clock(void) | 107 | static unsigned int detect_cpu_clock(void) |
100 | { | 108 | { |
101 | switch (bcm63xx_get_cpu_id()) { | 109 | switch (bcm63xx_get_cpu_id()) { |
110 | case BCM6328_CPU_ID: | ||
111 | { | ||
112 | unsigned int tmp, mips_pll_fcvo; | ||
113 | |||
114 | tmp = bcm_misc_readl(MISC_STRAPBUS_6328_REG); | ||
115 | mips_pll_fcvo = (tmp & STRAPBUS_6328_FCVO_MASK) | ||
116 | >> STRAPBUS_6328_FCVO_SHIFT; | ||
117 | |||
118 | switch (mips_pll_fcvo) { | ||
119 | case 0x12: | ||
120 | case 0x14: | ||
121 | case 0x19: | ||
122 | return 160000000; | ||
123 | case 0x1c: | ||
124 | return 192000000; | ||
125 | case 0x13: | ||
126 | case 0x15: | ||
127 | return 200000000; | ||
128 | case 0x1a: | ||
129 | return 384000000; | ||
130 | case 0x16: | ||
131 | return 400000000; | ||
132 | default: | ||
133 | return 320000000; | ||
134 | } | ||
135 | |||
136 | } | ||
102 | case BCM6338_CPU_ID: | 137 | case BCM6338_CPU_ID: |
103 | /* BCM6338 has a fixed 240 Mhz frequency */ | 138 | /* BCM6338 has a fixed 240 Mhz frequency */ |
104 | return 240000000; | 139 | return 240000000; |
@@ -170,6 +205,9 @@ static unsigned int detect_memory_size(void) | |||
170 | unsigned int cols = 0, rows = 0, is_32bits = 0, banks = 0; | 205 | unsigned int cols = 0, rows = 0, is_32bits = 0, banks = 0; |
171 | u32 val; | 206 | u32 val; |
172 | 207 | ||
208 | if (BCMCPU_IS_6328()) | ||
209 | return bcm_ddr_readl(DDR_CSEND_REG) << 24; | ||
210 | |||
173 | if (BCMCPU_IS_6345()) { | 211 | if (BCMCPU_IS_6345()) { |
174 | val = bcm_sdram_readl(SDRAM_MBASE_REG); | 212 | val = bcm_sdram_readl(SDRAM_MBASE_REG); |
175 | return (val * 8 * 1024 * 1024); | 213 | return (val * 8 * 1024 * 1024); |
@@ -228,17 +266,26 @@ void __init bcm63xx_cpu_init(void) | |||
228 | bcm63xx_irqs = bcm6345_irqs; | 266 | bcm63xx_irqs = bcm6345_irqs; |
229 | break; | 267 | break; |
230 | case CPU_BMIPS4350: | 268 | case CPU_BMIPS4350: |
231 | switch (read_c0_prid() & 0xf0) { | 269 | if ((read_c0_prid() & 0xf0) == 0x10) { |
232 | case 0x10: | ||
233 | expected_cpu_id = BCM6358_CPU_ID; | 270 | expected_cpu_id = BCM6358_CPU_ID; |
234 | bcm63xx_regs_base = bcm6358_regs_base; | 271 | bcm63xx_regs_base = bcm6358_regs_base; |
235 | bcm63xx_irqs = bcm6358_irqs; | 272 | bcm63xx_irqs = bcm6358_irqs; |
236 | break; | 273 | } else { |
237 | case 0x30: | 274 | /* all newer chips have the same chip id location */ |
238 | expected_cpu_id = BCM6368_CPU_ID; | 275 | u16 chip_id = bcm_readw(BCM_6368_PERF_BASE); |
239 | bcm63xx_regs_base = bcm6368_regs_base; | 276 | |
240 | bcm63xx_irqs = bcm6368_irqs; | 277 | switch (chip_id) { |
241 | break; | 278 | case BCM6328_CPU_ID: |
279 | expected_cpu_id = BCM6328_CPU_ID; | ||
280 | bcm63xx_regs_base = bcm6328_regs_base; | ||
281 | bcm63xx_irqs = bcm6328_irqs; | ||
282 | break; | ||
283 | case BCM6368_CPU_ID: | ||
284 | expected_cpu_id = BCM6368_CPU_ID; | ||
285 | bcm63xx_regs_base = bcm6368_regs_base; | ||
286 | bcm63xx_irqs = bcm6368_irqs; | ||
287 | break; | ||
288 | } | ||
242 | } | 289 | } |
243 | break; | 290 | break; |
244 | } | 291 | } |
diff --git a/arch/mips/bcm63xx/dev-dsp.c b/arch/mips/bcm63xx/dev-dsp.c index da46d1d3c77..5bb5b154c9b 100644 --- a/arch/mips/bcm63xx/dev-dsp.c +++ b/arch/mips/bcm63xx/dev-dsp.c | |||
@@ -31,7 +31,7 @@ static struct resource voip_dsp_resources[] = { | |||
31 | 31 | ||
32 | static struct platform_device bcm63xx_voip_dsp_device = { | 32 | static struct platform_device bcm63xx_voip_dsp_device = { |
33 | .name = "bcm63xx-voip-dsp", | 33 | .name = "bcm63xx-voip-dsp", |
34 | .id = 0, | 34 | .id = -1, |
35 | .num_resources = ARRAY_SIZE(voip_dsp_resources), | 35 | .num_resources = ARRAY_SIZE(voip_dsp_resources), |
36 | .resource = voip_dsp_resources, | 36 | .resource = voip_dsp_resources, |
37 | }; | 37 | }; |
diff --git a/arch/mips/bcm63xx/dev-flash.c b/arch/mips/bcm63xx/dev-flash.c new file mode 100644 index 00000000000..58371c7deac --- /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 | } | ||
diff --git a/arch/mips/bcm63xx/dev-rng.c b/arch/mips/bcm63xx/dev-rng.c new file mode 100644 index 00000000000..d277b4dc6c6 --- /dev/null +++ b/arch/mips/bcm63xx/dev-rng.c | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (C) 2011 Florian Fainelli <florian@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/init.h> | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/platform_device.h> | ||
12 | #include <bcm63xx_cpu.h> | ||
13 | |||
14 | static struct resource rng_resources[] = { | ||
15 | { | ||
16 | .start = -1, /* filled at runtime */ | ||
17 | .end = -1, /* filled at runtime */ | ||
18 | .flags = IORESOURCE_MEM, | ||
19 | }, | ||
20 | }; | ||
21 | |||
22 | static struct platform_device bcm63xx_rng_device = { | ||
23 | .name = "bcm63xx-rng", | ||
24 | .id = -1, | ||
25 | .num_resources = ARRAY_SIZE(rng_resources), | ||
26 | .resource = rng_resources, | ||
27 | }; | ||
28 | |||
29 | int __init bcm63xx_rng_register(void) | ||
30 | { | ||
31 | if (!BCMCPU_IS_6368()) | ||
32 | return -ENODEV; | ||
33 | |||
34 | rng_resources[0].start = bcm63xx_regset_address(RSET_RNG); | ||
35 | rng_resources[0].end = rng_resources[0].start; | ||
36 | rng_resources[0].end += RSET_RNG_SIZE - 1; | ||
37 | |||
38 | return platform_device_register(&bcm63xx_rng_device); | ||
39 | } | ||
40 | arch_initcall(bcm63xx_rng_register); | ||
diff --git a/arch/mips/bcm63xx/dev-spi.c b/arch/mips/bcm63xx/dev-spi.c new file mode 100644 index 00000000000..e39f73048d4 --- /dev/null +++ b/arch/mips/bcm63xx/dev-spi.c | |||
@@ -0,0 +1,119 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (C) 2009-2011 Florian Fainelli <florian@openwrt.org> | ||
7 | * Copyright (C) 2010 Tanguy Bouzeloc <tanguy.bouzeloc@efixo.com> | ||
8 | */ | ||
9 | |||
10 | #include <linux/init.h> | ||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/export.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/err.h> | ||
15 | #include <linux/clk.h> | ||
16 | |||
17 | #include <bcm63xx_cpu.h> | ||
18 | #include <bcm63xx_dev_spi.h> | ||
19 | #include <bcm63xx_regs.h> | ||
20 | |||
21 | #ifdef BCMCPU_RUNTIME_DETECT | ||
22 | /* | ||
23 | * register offsets | ||
24 | */ | ||
25 | static const unsigned long bcm6338_regs_spi[] = { | ||
26 | __GEN_SPI_REGS_TABLE(6338) | ||
27 | }; | ||
28 | |||
29 | static const unsigned long bcm6348_regs_spi[] = { | ||
30 | __GEN_SPI_REGS_TABLE(6348) | ||
31 | }; | ||
32 | |||
33 | static const unsigned long bcm6358_regs_spi[] = { | ||
34 | __GEN_SPI_REGS_TABLE(6358) | ||
35 | }; | ||
36 | |||
37 | static const unsigned long bcm6368_regs_spi[] = { | ||
38 | __GEN_SPI_REGS_TABLE(6368) | ||
39 | }; | ||
40 | |||
41 | const unsigned long *bcm63xx_regs_spi; | ||
42 | EXPORT_SYMBOL(bcm63xx_regs_spi); | ||
43 | |||
44 | static __init void bcm63xx_spi_regs_init(void) | ||
45 | { | ||
46 | if (BCMCPU_IS_6338()) | ||
47 | bcm63xx_regs_spi = bcm6338_regs_spi; | ||
48 | if (BCMCPU_IS_6348()) | ||
49 | bcm63xx_regs_spi = bcm6348_regs_spi; | ||
50 | if (BCMCPU_IS_6358()) | ||
51 | bcm63xx_regs_spi = bcm6358_regs_spi; | ||
52 | if (BCMCPU_IS_6368()) | ||
53 | bcm63xx_regs_spi = bcm6368_regs_spi; | ||
54 | } | ||
55 | #else | ||
56 | static __init void bcm63xx_spi_regs_init(void) { } | ||
57 | #endif | ||
58 | |||
59 | static struct resource spi_resources[] = { | ||
60 | { | ||
61 | .start = -1, /* filled at runtime */ | ||
62 | .end = -1, /* filled at runtime */ | ||
63 | .flags = IORESOURCE_MEM, | ||
64 | }, | ||
65 | { | ||
66 | .start = -1, /* filled at runtime */ | ||
67 | .flags = IORESOURCE_IRQ, | ||
68 | }, | ||
69 | }; | ||
70 | |||
71 | static struct bcm63xx_spi_pdata spi_pdata = { | ||
72 | .bus_num = 0, | ||
73 | .num_chipselect = 8, | ||
74 | }; | ||
75 | |||
76 | static struct platform_device bcm63xx_spi_device = { | ||
77 | .name = "bcm63xx-spi", | ||
78 | .id = -1, | ||
79 | .num_resources = ARRAY_SIZE(spi_resources), | ||
80 | .resource = spi_resources, | ||
81 | .dev = { | ||
82 | .platform_data = &spi_pdata, | ||
83 | }, | ||
84 | }; | ||
85 | |||
86 | int __init bcm63xx_spi_register(void) | ||
87 | { | ||
88 | struct clk *periph_clk; | ||
89 | |||
90 | if (BCMCPU_IS_6328() || BCMCPU_IS_6345()) | ||
91 | return -ENODEV; | ||
92 | |||
93 | periph_clk = clk_get(NULL, "periph"); | ||
94 | if (IS_ERR(periph_clk)) { | ||
95 | pr_err("unable to get periph clock\n"); | ||
96 | return -ENODEV; | ||
97 | } | ||
98 | |||
99 | /* Set bus frequency */ | ||
100 | spi_pdata.speed_hz = clk_get_rate(periph_clk); | ||
101 | |||
102 | spi_resources[0].start = bcm63xx_regset_address(RSET_SPI); | ||
103 | spi_resources[0].end = spi_resources[0].start; | ||
104 | spi_resources[1].start = bcm63xx_get_irq_number(IRQ_SPI); | ||
105 | |||
106 | if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) { | ||
107 | spi_resources[0].end += BCM_6338_RSET_SPI_SIZE - 1; | ||
108 | spi_pdata.fifo_size = SPI_6338_MSG_DATA_SIZE; | ||
109 | } | ||
110 | |||
111 | if (BCMCPU_IS_6358() || BCMCPU_IS_6368()) { | ||
112 | spi_resources[0].end += BCM_6358_RSET_SPI_SIZE - 1; | ||
113 | spi_pdata.fifo_size = SPI_6358_MSG_DATA_SIZE; | ||
114 | } | ||
115 | |||
116 | bcm63xx_spi_regs_init(); | ||
117 | |||
118 | return platform_device_register(&bcm63xx_spi_device); | ||
119 | } | ||
diff --git a/arch/mips/bcm63xx/dev-wdt.c b/arch/mips/bcm63xx/dev-wdt.c index 3e6c716a4c1..2a2346a99bc 100644 --- a/arch/mips/bcm63xx/dev-wdt.c +++ b/arch/mips/bcm63xx/dev-wdt.c | |||
@@ -21,7 +21,7 @@ static struct resource wdt_resources[] = { | |||
21 | 21 | ||
22 | static struct platform_device bcm63xx_wdt_device = { | 22 | static struct platform_device bcm63xx_wdt_device = { |
23 | .name = "bcm63xx-wdt", | 23 | .name = "bcm63xx-wdt", |
24 | .id = 0, | 24 | .id = -1, |
25 | .num_resources = ARRAY_SIZE(wdt_resources), | 25 | .num_resources = ARRAY_SIZE(wdt_resources), |
26 | .resource = wdt_resources, | 26 | .resource = wdt_resources, |
27 | }; | 27 | }; |
diff --git a/arch/mips/bcm63xx/irq.c b/arch/mips/bcm63xx/irq.c index 9a216a451d9..18e051ad18a 100644 --- a/arch/mips/bcm63xx/irq.c +++ b/arch/mips/bcm63xx/irq.c | |||
@@ -27,6 +27,17 @@ static void __internal_irq_unmask_32(unsigned int irq) __maybe_unused; | |||
27 | static void __internal_irq_unmask_64(unsigned int irq) __maybe_unused; | 27 | static void __internal_irq_unmask_64(unsigned int irq) __maybe_unused; |
28 | 28 | ||
29 | #ifndef BCMCPU_RUNTIME_DETECT | 29 | #ifndef BCMCPU_RUNTIME_DETECT |
30 | #ifdef CONFIG_BCM63XX_CPU_6328 | ||
31 | #define irq_stat_reg PERF_IRQSTAT_6328_REG | ||
32 | #define irq_mask_reg PERF_IRQMASK_6328_REG | ||
33 | #define irq_bits 64 | ||
34 | #define is_ext_irq_cascaded 1 | ||
35 | #define ext_irq_start (BCM_6328_EXT_IRQ0 - IRQ_INTERNAL_BASE) | ||
36 | #define ext_irq_end (BCM_6328_EXT_IRQ3 - IRQ_INTERNAL_BASE) | ||
37 | #define ext_irq_count 4 | ||
38 | #define ext_irq_cfg_reg1 PERF_EXTIRQ_CFG_REG_6328 | ||
39 | #define ext_irq_cfg_reg2 0 | ||
40 | #endif | ||
30 | #ifdef CONFIG_BCM63XX_CPU_6338 | 41 | #ifdef CONFIG_BCM63XX_CPU_6338 |
31 | #define irq_stat_reg PERF_IRQSTAT_6338_REG | 42 | #define irq_stat_reg PERF_IRQSTAT_6338_REG |
32 | #define irq_mask_reg PERF_IRQMASK_6338_REG | 43 | #define irq_mask_reg PERF_IRQMASK_6338_REG |
@@ -118,6 +129,16 @@ static void bcm63xx_init_irq(void) | |||
118 | irq_mask_addr = bcm63xx_regset_address(RSET_PERF); | 129 | irq_mask_addr = bcm63xx_regset_address(RSET_PERF); |
119 | 130 | ||
120 | switch (bcm63xx_get_cpu_id()) { | 131 | switch (bcm63xx_get_cpu_id()) { |
132 | case BCM6328_CPU_ID: | ||
133 | irq_stat_addr += PERF_IRQSTAT_6328_REG; | ||
134 | irq_mask_addr += PERF_IRQMASK_6328_REG; | ||
135 | irq_bits = 64; | ||
136 | ext_irq_count = 4; | ||
137 | is_ext_irq_cascaded = 1; | ||
138 | ext_irq_start = BCM_6328_EXT_IRQ0 - IRQ_INTERNAL_BASE; | ||
139 | ext_irq_end = BCM_6328_EXT_IRQ3 - IRQ_INTERNAL_BASE; | ||
140 | ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_6328; | ||
141 | break; | ||
121 | case BCM6338_CPU_ID: | 142 | case BCM6338_CPU_ID: |
122 | irq_stat_addr += PERF_IRQSTAT_6338_REG; | 143 | irq_stat_addr += PERF_IRQSTAT_6338_REG; |
123 | irq_mask_addr += PERF_IRQMASK_6338_REG; | 144 | irq_mask_addr += PERF_IRQMASK_6338_REG; |
diff --git a/arch/mips/bcm63xx/prom.c b/arch/mips/bcm63xx/prom.c index 99d7f405cbe..10eaff45807 100644 --- a/arch/mips/bcm63xx/prom.c +++ b/arch/mips/bcm63xx/prom.c | |||
@@ -26,7 +26,9 @@ void __init prom_init(void) | |||
26 | bcm_wdt_writel(WDT_STOP_2, WDT_CTL_REG); | 26 | bcm_wdt_writel(WDT_STOP_2, WDT_CTL_REG); |
27 | 27 | ||
28 | /* disable all hardware blocks clock for now */ | 28 | /* disable all hardware blocks clock for now */ |
29 | if (BCMCPU_IS_6338()) | 29 | if (BCMCPU_IS_6328()) |
30 | mask = CKCTL_6328_ALL_SAFE_EN; | ||
31 | else if (BCMCPU_IS_6338()) | ||
30 | mask = CKCTL_6338_ALL_SAFE_EN; | 32 | mask = CKCTL_6338_ALL_SAFE_EN; |
31 | else if (BCMCPU_IS_6345()) | 33 | else if (BCMCPU_IS_6345()) |
32 | mask = CKCTL_6345_ALL_SAFE_EN; | 34 | mask = CKCTL_6345_ALL_SAFE_EN; |
diff --git a/arch/mips/bcm63xx/setup.c b/arch/mips/bcm63xx/setup.c index 356b05583e1..0e74a13639c 100644 --- a/arch/mips/bcm63xx/setup.c +++ b/arch/mips/bcm63xx/setup.c | |||
@@ -68,6 +68,9 @@ void bcm63xx_machine_reboot(void) | |||
68 | 68 | ||
69 | /* mask and clear all external irq */ | 69 | /* mask and clear all external irq */ |
70 | switch (bcm63xx_get_cpu_id()) { | 70 | switch (bcm63xx_get_cpu_id()) { |
71 | case BCM6328_CPU_ID: | ||
72 | perf_regs[0] = PERF_EXTIRQ_CFG_REG_6328; | ||
73 | break; | ||
71 | case BCM6338_CPU_ID: | 74 | case BCM6338_CPU_ID: |
72 | perf_regs[0] = PERF_EXTIRQ_CFG_REG_6338; | 75 | perf_regs[0] = PERF_EXTIRQ_CFG_REG_6338; |
73 | break; | 76 | break; |
@@ -95,9 +98,13 @@ void bcm63xx_machine_reboot(void) | |||
95 | bcm6348_a1_reboot(); | 98 | bcm6348_a1_reboot(); |
96 | 99 | ||
97 | printk(KERN_INFO "triggering watchdog soft-reset...\n"); | 100 | printk(KERN_INFO "triggering watchdog soft-reset...\n"); |
98 | reg = bcm_perf_readl(PERF_SYS_PLL_CTL_REG); | 101 | if (BCMCPU_IS_6328()) { |
99 | reg |= SYS_PLL_SOFT_RESET; | 102 | bcm_wdt_writel(1, WDT_SOFTRESET_REG); |
100 | bcm_perf_writel(reg, PERF_SYS_PLL_CTL_REG); | 103 | } else { |
104 | reg = bcm_perf_readl(PERF_SYS_PLL_CTL_REG); | ||
105 | reg |= SYS_PLL_SOFT_RESET; | ||
106 | bcm_perf_writel(reg, PERF_SYS_PLL_CTL_REG); | ||
107 | } | ||
101 | while (1) | 108 | while (1) |
102 | ; | 109 | ; |
103 | } | 110 | } |