diff options
author | Maxime Bizon <mbizon@freebox.fr> | 2009-08-18 08:23:37 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2009-09-17 14:07:52 -0400 |
commit | e7300d04bd0809eb7ea10a2ed8c729459f816e36 (patch) | |
tree | 8af589d3954c09323d3f74e69aa6fabbb32e049e | |
parent | 0de663ef8627f35fda9106a8faaca512f29e493e (diff) |
MIPS: BCM63xx: Add support for the Broadcom BCM63xx family of SOCs.
Signed-off-by: Maxime Bizon <mbizon@freebox.fr>
Signed-off-by: Florian Fainelli <florian@openwrt.org>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
40 files changed, 5896 insertions, 0 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 224e548f0fc8..705a7a9170f3 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -80,6 +80,21 @@ config BCM47XX | |||
80 | help | 80 | help |
81 | Support for BCM47XX based boards | 81 | Support for BCM47XX based boards |
82 | 82 | ||
83 | config BCM63XX | ||
84 | bool "Broadcom BCM63XX based boards" | ||
85 | select CEVT_R4K | ||
86 | select CSRC_R4K | ||
87 | select DMA_NONCOHERENT | ||
88 | select IRQ_CPU | ||
89 | select SYS_HAS_CPU_MIPS32_R1 | ||
90 | select SYS_SUPPORTS_32BIT_KERNEL | ||
91 | select SYS_SUPPORTS_BIG_ENDIAN | ||
92 | select SYS_HAS_EARLY_PRINTK | ||
93 | select SWAP_IO_SPACE | ||
94 | select ARCH_REQUIRE_GPIOLIB | ||
95 | help | ||
96 | Support for BCM63XX based boards | ||
97 | |||
83 | config MIPS_COBALT | 98 | config MIPS_COBALT |
84 | bool "Cobalt Server" | 99 | bool "Cobalt Server" |
85 | select CEVT_R4K | 100 | select CEVT_R4K |
@@ -645,6 +660,7 @@ endchoice | |||
645 | 660 | ||
646 | source "arch/mips/alchemy/Kconfig" | 661 | source "arch/mips/alchemy/Kconfig" |
647 | source "arch/mips/basler/excite/Kconfig" | 662 | source "arch/mips/basler/excite/Kconfig" |
663 | source "arch/mips/bcm63xx/Kconfig" | ||
648 | source "arch/mips/jazz/Kconfig" | 664 | source "arch/mips/jazz/Kconfig" |
649 | source "arch/mips/lasat/Kconfig" | 665 | source "arch/mips/lasat/Kconfig" |
650 | source "arch/mips/pmc-sierra/Kconfig" | 666 | source "arch/mips/pmc-sierra/Kconfig" |
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index 1efa9aa64880..c825b14b4ed0 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
@@ -565,6 +565,13 @@ cflags-$(CONFIG_BCM47XX) += -I$(srctree)/arch/mips/include/asm/mach-bcm47xx | |||
565 | load-$(CONFIG_BCM47XX) := 0xffffffff80001000 | 565 | load-$(CONFIG_BCM47XX) := 0xffffffff80001000 |
566 | 566 | ||
567 | # | 567 | # |
568 | # Broadcom BCM63XX boards | ||
569 | # | ||
570 | core-$(CONFIG_BCM63XX) += arch/mips/bcm63xx/ | ||
571 | cflags-$(CONFIG_BCM63XX) += -I$(srctree)/arch/mips/include/asm/mach-bcm63xx/ | ||
572 | load-$(CONFIG_BCM63XX) := 0xffffffff80010000 | ||
573 | |||
574 | # | ||
568 | # SNI RM | 575 | # SNI RM |
569 | # | 576 | # |
570 | core-$(CONFIG_SNI_RM) += arch/mips/sni/ | 577 | core-$(CONFIG_SNI_RM) += arch/mips/sni/ |
diff --git a/arch/mips/bcm63xx/Kconfig b/arch/mips/bcm63xx/Kconfig new file mode 100644 index 000000000000..fb177d6df066 --- /dev/null +++ b/arch/mips/bcm63xx/Kconfig | |||
@@ -0,0 +1,25 @@ | |||
1 | menu "CPU support" | ||
2 | depends on BCM63XX | ||
3 | |||
4 | config BCM63XX_CPU_6338 | ||
5 | bool "support 6338 CPU" | ||
6 | select HW_HAS_PCI | ||
7 | select USB_ARCH_HAS_OHCI | ||
8 | select USB_OHCI_BIG_ENDIAN_DESC | ||
9 | select USB_OHCI_BIG_ENDIAN_MMIO | ||
10 | |||
11 | config BCM63XX_CPU_6345 | ||
12 | bool "support 6345 CPU" | ||
13 | select USB_OHCI_BIG_ENDIAN_DESC | ||
14 | select USB_OHCI_BIG_ENDIAN_MMIO | ||
15 | |||
16 | config BCM63XX_CPU_6348 | ||
17 | bool "support 6348 CPU" | ||
18 | select HW_HAS_PCI | ||
19 | |||
20 | config BCM63XX_CPU_6358 | ||
21 | bool "support 6358 CPU" | ||
22 | select HW_HAS_PCI | ||
23 | endmenu | ||
24 | |||
25 | source "arch/mips/bcm63xx/boards/Kconfig" | ||
diff --git a/arch/mips/bcm63xx/Makefile b/arch/mips/bcm63xx/Makefile new file mode 100644 index 000000000000..99bbc8753a21 --- /dev/null +++ b/arch/mips/bcm63xx/Makefile | |||
@@ -0,0 +1,7 @@ | |||
1 | obj-y += clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \ | ||
2 | dev-dsp.o | ||
3 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | ||
4 | |||
5 | obj-y += boards/ | ||
6 | |||
7 | EXTRA_CFLAGS += -Werror | ||
diff --git a/arch/mips/bcm63xx/boards/Kconfig b/arch/mips/bcm63xx/boards/Kconfig new file mode 100644 index 000000000000..c6aed33d893e --- /dev/null +++ b/arch/mips/bcm63xx/boards/Kconfig | |||
@@ -0,0 +1,11 @@ | |||
1 | choice | ||
2 | prompt "Board support" | ||
3 | depends on BCM63XX | ||
4 | default BOARD_BCM963XX | ||
5 | |||
6 | config BOARD_BCM963XX | ||
7 | bool "Generic Broadcom 963xx boards" | ||
8 | select SSB | ||
9 | help | ||
10 | |||
11 | endchoice | ||
diff --git a/arch/mips/bcm63xx/boards/Makefile b/arch/mips/bcm63xx/boards/Makefile new file mode 100644 index 000000000000..e5cc86dc1da8 --- /dev/null +++ b/arch/mips/bcm63xx/boards/Makefile | |||
@@ -0,0 +1,3 @@ | |||
1 | obj-$(CONFIG_BOARD_BCM963XX) += board_bcm963xx.o | ||
2 | |||
3 | EXTRA_CFLAGS += -Werror | ||
diff --git a/arch/mips/bcm63xx/boards/board_bcm963xx.c b/arch/mips/bcm63xx/boards/board_bcm963xx.c new file mode 100644 index 000000000000..fd77f548207a --- /dev/null +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c | |||
@@ -0,0 +1,837 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org> | ||
8 | */ | ||
9 | |||
10 | #include <linux/init.h> | ||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/string.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> | ||
18 | #include <asm/addrspace.h> | ||
19 | #include <bcm63xx_board.h> | ||
20 | #include <bcm63xx_cpu.h> | ||
21 | #include <bcm63xx_regs.h> | ||
22 | #include <bcm63xx_io.h> | ||
23 | #include <bcm63xx_board.h> | ||
24 | #include <bcm63xx_dev_pci.h> | ||
25 | #include <bcm63xx_dev_enet.h> | ||
26 | #include <bcm63xx_dev_dsp.h> | ||
27 | #include <board_bcm963xx.h> | ||
28 | |||
29 | #define PFX "board_bcm963xx: " | ||
30 | |||
31 | static struct bcm963xx_nvram nvram; | ||
32 | static unsigned int mac_addr_used; | ||
33 | static struct board_info board; | ||
34 | |||
35 | /* | ||
36 | * known 6338 boards | ||
37 | */ | ||
38 | #ifdef CONFIG_BCM63XX_CPU_6338 | ||
39 | static struct board_info __initdata board_96338gw = { | ||
40 | .name = "96338GW", | ||
41 | .expected_cpu_id = 0x6338, | ||
42 | |||
43 | .has_enet0 = 1, | ||
44 | .enet0 = { | ||
45 | .force_speed_100 = 1, | ||
46 | .force_duplex_full = 1, | ||
47 | }, | ||
48 | |||
49 | .has_ohci0 = 1, | ||
50 | |||
51 | .leds = { | ||
52 | { | ||
53 | .name = "adsl", | ||
54 | .gpio = 3, | ||
55 | .active_low = 1, | ||
56 | }, | ||
57 | { | ||
58 | .name = "ses", | ||
59 | .gpio = 5, | ||
60 | .active_low = 1, | ||
61 | }, | ||
62 | { | ||
63 | .name = "ppp-fail", | ||
64 | .gpio = 4, | ||
65 | .active_low = 1, | ||
66 | }, | ||
67 | { | ||
68 | .name = "power", | ||
69 | .gpio = 0, | ||
70 | .active_low = 1, | ||
71 | .default_trigger = "default-on", | ||
72 | }, | ||
73 | { | ||
74 | .name = "stop", | ||
75 | .gpio = 1, | ||
76 | .active_low = 1, | ||
77 | } | ||
78 | }, | ||
79 | }; | ||
80 | |||
81 | static struct board_info __initdata board_96338w = { | ||
82 | .name = "96338W", | ||
83 | .expected_cpu_id = 0x6338, | ||
84 | |||
85 | .has_enet0 = 1, | ||
86 | .enet0 = { | ||
87 | .force_speed_100 = 1, | ||
88 | .force_duplex_full = 1, | ||
89 | }, | ||
90 | |||
91 | .leds = { | ||
92 | { | ||
93 | .name = "adsl", | ||
94 | .gpio = 3, | ||
95 | .active_low = 1, | ||
96 | }, | ||
97 | { | ||
98 | .name = "ses", | ||
99 | .gpio = 5, | ||
100 | .active_low = 1, | ||
101 | }, | ||
102 | { | ||
103 | .name = "ppp-fail", | ||
104 | .gpio = 4, | ||
105 | .active_low = 1, | ||
106 | }, | ||
107 | { | ||
108 | .name = "power", | ||
109 | .gpio = 0, | ||
110 | .active_low = 1, | ||
111 | .default_trigger = "default-on", | ||
112 | }, | ||
113 | { | ||
114 | .name = "stop", | ||
115 | .gpio = 1, | ||
116 | .active_low = 1, | ||
117 | }, | ||
118 | }, | ||
119 | }; | ||
120 | #endif | ||
121 | |||
122 | /* | ||
123 | * known 6345 boards | ||
124 | */ | ||
125 | #ifdef CONFIG_BCM63XX_CPU_6345 | ||
126 | static struct board_info __initdata board_96345gw2 = { | ||
127 | .name = "96345GW2", | ||
128 | .expected_cpu_id = 0x6345, | ||
129 | }; | ||
130 | #endif | ||
131 | |||
132 | /* | ||
133 | * known 6348 boards | ||
134 | */ | ||
135 | #ifdef CONFIG_BCM63XX_CPU_6348 | ||
136 | static struct board_info __initdata board_96348r = { | ||
137 | .name = "96348R", | ||
138 | .expected_cpu_id = 0x6348, | ||
139 | |||
140 | .has_enet0 = 1, | ||
141 | .has_pci = 1, | ||
142 | |||
143 | .enet0 = { | ||
144 | .has_phy = 1, | ||
145 | .use_internal_phy = 1, | ||
146 | }, | ||
147 | |||
148 | .leds = { | ||
149 | { | ||
150 | .name = "adsl-fail", | ||
151 | .gpio = 2, | ||
152 | .active_low = 1, | ||
153 | }, | ||
154 | { | ||
155 | .name = "ppp", | ||
156 | .gpio = 3, | ||
157 | .active_low = 1, | ||
158 | }, | ||
159 | { | ||
160 | .name = "ppp-fail", | ||
161 | .gpio = 4, | ||
162 | .active_low = 1, | ||
163 | }, | ||
164 | { | ||
165 | .name = "power", | ||
166 | .gpio = 0, | ||
167 | .active_low = 1, | ||
168 | .default_trigger = "default-on", | ||
169 | |||
170 | }, | ||
171 | { | ||
172 | .name = "stop", | ||
173 | .gpio = 1, | ||
174 | .active_low = 1, | ||
175 | }, | ||
176 | }, | ||
177 | }; | ||
178 | |||
179 | static struct board_info __initdata board_96348gw_10 = { | ||
180 | .name = "96348GW-10", | ||
181 | .expected_cpu_id = 0x6348, | ||
182 | |||
183 | .has_enet0 = 1, | ||
184 | .has_enet1 = 1, | ||
185 | .has_pci = 1, | ||
186 | |||
187 | .enet0 = { | ||
188 | .has_phy = 1, | ||
189 | .use_internal_phy = 1, | ||
190 | }, | ||
191 | .enet1 = { | ||
192 | .force_speed_100 = 1, | ||
193 | .force_duplex_full = 1, | ||
194 | }, | ||
195 | |||
196 | .has_ohci0 = 1, | ||
197 | .has_pccard = 1, | ||
198 | .has_ehci0 = 1, | ||
199 | |||
200 | .has_dsp = 1, | ||
201 | .dsp = { | ||
202 | .gpio_rst = 6, | ||
203 | .gpio_int = 34, | ||
204 | .cs = 2, | ||
205 | .ext_irq = 2, | ||
206 | }, | ||
207 | |||
208 | .leds = { | ||
209 | { | ||
210 | .name = "adsl-fail", | ||
211 | .gpio = 2, | ||
212 | .active_low = 1, | ||
213 | }, | ||
214 | { | ||
215 | .name = "ppp", | ||
216 | .gpio = 3, | ||
217 | .active_low = 1, | ||
218 | }, | ||
219 | { | ||
220 | .name = "ppp-fail", | ||
221 | .gpio = 4, | ||
222 | .active_low = 1, | ||
223 | }, | ||
224 | { | ||
225 | .name = "power", | ||
226 | .gpio = 0, | ||
227 | .active_low = 1, | ||
228 | .default_trigger = "default-on", | ||
229 | }, | ||
230 | { | ||
231 | .name = "stop", | ||
232 | .gpio = 1, | ||
233 | .active_low = 1, | ||
234 | }, | ||
235 | }, | ||
236 | }; | ||
237 | |||
238 | static struct board_info __initdata board_96348gw_11 = { | ||
239 | .name = "96348GW-11", | ||
240 | .expected_cpu_id = 0x6348, | ||
241 | |||
242 | .has_enet0 = 1, | ||
243 | .has_enet1 = 1, | ||
244 | .has_pci = 1, | ||
245 | |||
246 | .enet0 = { | ||
247 | .has_phy = 1, | ||
248 | .use_internal_phy = 1, | ||
249 | }, | ||
250 | |||
251 | .enet1 = { | ||
252 | .force_speed_100 = 1, | ||
253 | .force_duplex_full = 1, | ||
254 | }, | ||
255 | |||
256 | |||
257 | .has_ohci0 = 1, | ||
258 | .has_pccard = 1, | ||
259 | .has_ehci0 = 1, | ||
260 | |||
261 | .leds = { | ||
262 | { | ||
263 | .name = "adsl-fail", | ||
264 | .gpio = 2, | ||
265 | .active_low = 1, | ||
266 | }, | ||
267 | { | ||
268 | .name = "ppp", | ||
269 | .gpio = 3, | ||
270 | .active_low = 1, | ||
271 | }, | ||
272 | { | ||
273 | .name = "ppp-fail", | ||
274 | .gpio = 4, | ||
275 | .active_low = 1, | ||
276 | }, | ||
277 | { | ||
278 | .name = "power", | ||
279 | .gpio = 0, | ||
280 | .active_low = 1, | ||
281 | .default_trigger = "default-on", | ||
282 | }, | ||
283 | { | ||
284 | .name = "stop", | ||
285 | .gpio = 1, | ||
286 | .active_low = 1, | ||
287 | }, | ||
288 | }, | ||
289 | }; | ||
290 | |||
291 | static struct board_info __initdata board_96348gw = { | ||
292 | .name = "96348GW", | ||
293 | .expected_cpu_id = 0x6348, | ||
294 | |||
295 | .has_enet0 = 1, | ||
296 | .has_enet1 = 1, | ||
297 | .has_pci = 1, | ||
298 | |||
299 | .enet0 = { | ||
300 | .has_phy = 1, | ||
301 | .use_internal_phy = 1, | ||
302 | }, | ||
303 | .enet1 = { | ||
304 | .force_speed_100 = 1, | ||
305 | .force_duplex_full = 1, | ||
306 | }, | ||
307 | |||
308 | .has_ohci0 = 1, | ||
309 | |||
310 | .has_dsp = 1, | ||
311 | .dsp = { | ||
312 | .gpio_rst = 6, | ||
313 | .gpio_int = 34, | ||
314 | .ext_irq = 2, | ||
315 | .cs = 2, | ||
316 | }, | ||
317 | |||
318 | .leds = { | ||
319 | { | ||
320 | .name = "adsl-fail", | ||
321 | .gpio = 2, | ||
322 | .active_low = 1, | ||
323 | }, | ||
324 | { | ||
325 | .name = "ppp", | ||
326 | .gpio = 3, | ||
327 | .active_low = 1, | ||
328 | }, | ||
329 | { | ||
330 | .name = "ppp-fail", | ||
331 | .gpio = 4, | ||
332 | .active_low = 1, | ||
333 | }, | ||
334 | { | ||
335 | .name = "power", | ||
336 | .gpio = 0, | ||
337 | .active_low = 1, | ||
338 | .default_trigger = "default-on", | ||
339 | }, | ||
340 | { | ||
341 | .name = "stop", | ||
342 | .gpio = 1, | ||
343 | .active_low = 1, | ||
344 | }, | ||
345 | }, | ||
346 | }; | ||
347 | |||
348 | static struct board_info __initdata board_FAST2404 = { | ||
349 | .name = "F@ST2404", | ||
350 | .expected_cpu_id = 0x6348, | ||
351 | |||
352 | .has_enet0 = 1, | ||
353 | .has_enet1 = 1, | ||
354 | .has_pci = 1, | ||
355 | |||
356 | .enet0 = { | ||
357 | .has_phy = 1, | ||
358 | .use_internal_phy = 1, | ||
359 | }, | ||
360 | |||
361 | .enet1 = { | ||
362 | .force_speed_100 = 1, | ||
363 | .force_duplex_full = 1, | ||
364 | }, | ||
365 | |||
366 | |||
367 | .has_ohci0 = 1, | ||
368 | .has_pccard = 1, | ||
369 | .has_ehci0 = 1, | ||
370 | }; | ||
371 | |||
372 | static struct board_info __initdata board_DV201AMR = { | ||
373 | .name = "DV201AMR", | ||
374 | .expected_cpu_id = 0x6348, | ||
375 | |||
376 | .has_pci = 1, | ||
377 | .has_ohci0 = 1, | ||
378 | |||
379 | .has_enet0 = 1, | ||
380 | .has_enet1 = 1, | ||
381 | .enet0 = { | ||
382 | .has_phy = 1, | ||
383 | .use_internal_phy = 1, | ||
384 | }, | ||
385 | .enet1 = { | ||
386 | .force_speed_100 = 1, | ||
387 | .force_duplex_full = 1, | ||
388 | }, | ||
389 | }; | ||
390 | |||
391 | static struct board_info __initdata board_96348gw_a = { | ||
392 | .name = "96348GW-A", | ||
393 | .expected_cpu_id = 0x6348, | ||
394 | |||
395 | .has_enet0 = 1, | ||
396 | .has_enet1 = 1, | ||
397 | .has_pci = 1, | ||
398 | |||
399 | .enet0 = { | ||
400 | .has_phy = 1, | ||
401 | .use_internal_phy = 1, | ||
402 | }, | ||
403 | .enet1 = { | ||
404 | .force_speed_100 = 1, | ||
405 | .force_duplex_full = 1, | ||
406 | }, | ||
407 | |||
408 | .has_ohci0 = 1, | ||
409 | }; | ||
410 | #endif | ||
411 | |||
412 | /* | ||
413 | * known 6358 boards | ||
414 | */ | ||
415 | #ifdef CONFIG_BCM63XX_CPU_6358 | ||
416 | static struct board_info __initdata board_96358vw = { | ||
417 | .name = "96358VW", | ||
418 | .expected_cpu_id = 0x6358, | ||
419 | |||
420 | .has_enet0 = 1, | ||
421 | .has_enet1 = 1, | ||
422 | .has_pci = 1, | ||
423 | |||
424 | .enet0 = { | ||
425 | .has_phy = 1, | ||
426 | .use_internal_phy = 1, | ||
427 | }, | ||
428 | |||
429 | .enet1 = { | ||
430 | .force_speed_100 = 1, | ||
431 | .force_duplex_full = 1, | ||
432 | }, | ||
433 | |||
434 | |||
435 | .has_ohci0 = 1, | ||
436 | .has_pccard = 1, | ||
437 | .has_ehci0 = 1, | ||
438 | |||
439 | .leds = { | ||
440 | { | ||
441 | .name = "adsl-fail", | ||
442 | .gpio = 15, | ||
443 | .active_low = 1, | ||
444 | }, | ||
445 | { | ||
446 | .name = "ppp", | ||
447 | .gpio = 22, | ||
448 | .active_low = 1, | ||
449 | }, | ||
450 | { | ||
451 | .name = "ppp-fail", | ||
452 | .gpio = 23, | ||
453 | .active_low = 1, | ||
454 | }, | ||
455 | { | ||
456 | .name = "power", | ||
457 | .gpio = 4, | ||
458 | .default_trigger = "default-on", | ||
459 | }, | ||
460 | { | ||
461 | .name = "stop", | ||
462 | .gpio = 5, | ||
463 | }, | ||
464 | }, | ||
465 | }; | ||
466 | |||
467 | static struct board_info __initdata board_96358vw2 = { | ||
468 | .name = "96358VW2", | ||
469 | .expected_cpu_id = 0x6358, | ||
470 | |||
471 | .has_enet0 = 1, | ||
472 | .has_enet1 = 1, | ||
473 | .has_pci = 1, | ||
474 | |||
475 | .enet0 = { | ||
476 | .has_phy = 1, | ||
477 | .use_internal_phy = 1, | ||
478 | }, | ||
479 | |||
480 | .enet1 = { | ||
481 | .force_speed_100 = 1, | ||
482 | .force_duplex_full = 1, | ||
483 | }, | ||
484 | |||
485 | |||
486 | .has_ohci0 = 1, | ||
487 | .has_pccard = 1, | ||
488 | .has_ehci0 = 1, | ||
489 | |||
490 | .leds = { | ||
491 | { | ||
492 | .name = "adsl", | ||
493 | .gpio = 22, | ||
494 | .active_low = 1, | ||
495 | }, | ||
496 | { | ||
497 | .name = "ppp-fail", | ||
498 | .gpio = 23, | ||
499 | }, | ||
500 | { | ||
501 | .name = "power", | ||
502 | .gpio = 5, | ||
503 | .active_low = 1, | ||
504 | .default_trigger = "default-on", | ||
505 | }, | ||
506 | { | ||
507 | .name = "stop", | ||
508 | .gpio = 4, | ||
509 | .active_low = 1, | ||
510 | }, | ||
511 | }, | ||
512 | }; | ||
513 | |||
514 | static struct board_info __initdata board_AGPFS0 = { | ||
515 | .name = "AGPF-S0", | ||
516 | .expected_cpu_id = 0x6358, | ||
517 | |||
518 | .has_enet0 = 1, | ||
519 | .has_enet1 = 1, | ||
520 | .has_pci = 1, | ||
521 | |||
522 | .enet0 = { | ||
523 | .has_phy = 1, | ||
524 | .use_internal_phy = 1, | ||
525 | }, | ||
526 | |||
527 | .enet1 = { | ||
528 | .force_speed_100 = 1, | ||
529 | .force_duplex_full = 1, | ||
530 | }, | ||
531 | |||
532 | .has_ohci0 = 1, | ||
533 | .has_ehci0 = 1, | ||
534 | }; | ||
535 | #endif | ||
536 | |||
537 | /* | ||
538 | * all boards | ||
539 | */ | ||
540 | static const struct board_info __initdata *bcm963xx_boards[] = { | ||
541 | #ifdef CONFIG_BCM63XX_CPU_6338 | ||
542 | &board_96338gw, | ||
543 | &board_96338w, | ||
544 | #endif | ||
545 | #ifdef CONFIG_BCM63XX_CPU_6345 | ||
546 | &board_96345gw2, | ||
547 | #endif | ||
548 | #ifdef CONFIG_BCM63XX_CPU_6348 | ||
549 | &board_96348r, | ||
550 | &board_96348gw, | ||
551 | &board_96348gw_10, | ||
552 | &board_96348gw_11, | ||
553 | &board_FAST2404, | ||
554 | &board_DV201AMR, | ||
555 | &board_96348gw_a, | ||
556 | #endif | ||
557 | |||
558 | #ifdef CONFIG_BCM63XX_CPU_6358 | ||
559 | &board_96358vw, | ||
560 | &board_96358vw2, | ||
561 | &board_AGPFS0, | ||
562 | #endif | ||
563 | }; | ||
564 | |||
565 | /* | ||
566 | * early init callback, read nvram data from flash and checksum it | ||
567 | */ | ||
568 | void __init board_prom_init(void) | ||
569 | { | ||
570 | unsigned int check_len, i; | ||
571 | u8 *boot_addr, *cfe, *p; | ||
572 | char cfe_version[32]; | ||
573 | u32 val; | ||
574 | |||
575 | /* read base address of boot chip select (0) | ||
576 | * 6345 does not have MPI but boots from standard | ||
577 | * MIPS Flash address */ | ||
578 | if (BCMCPU_IS_6345()) | ||
579 | val = 0x1fc00000; | ||
580 | else { | ||
581 | val = bcm_mpi_readl(MPI_CSBASE_REG(0)); | ||
582 | val &= MPI_CSBASE_BASE_MASK; | ||
583 | } | ||
584 | boot_addr = (u8 *)KSEG1ADDR(val); | ||
585 | |||
586 | /* dump cfe version */ | ||
587 | cfe = boot_addr + BCM963XX_CFE_VERSION_OFFSET; | ||
588 | if (!memcmp(cfe, "cfe-v", 5)) | ||
589 | snprintf(cfe_version, sizeof(cfe_version), "%u.%u.%u-%u.%u", | ||
590 | cfe[5], cfe[6], cfe[7], cfe[8], cfe[9]); | ||
591 | else | ||
592 | strcpy(cfe_version, "unknown"); | ||
593 | printk(KERN_INFO PFX "CFE version: %s\n", cfe_version); | ||
594 | |||
595 | /* extract nvram data */ | ||
596 | memcpy(&nvram, boot_addr + BCM963XX_NVRAM_OFFSET, sizeof(nvram)); | ||
597 | |||
598 | /* check checksum before using data */ | ||
599 | if (nvram.version <= 4) | ||
600 | check_len = offsetof(struct bcm963xx_nvram, checksum_old); | ||
601 | else | ||
602 | check_len = sizeof(nvram); | ||
603 | val = 0; | ||
604 | p = (u8 *)&nvram; | ||
605 | while (check_len--) | ||
606 | val += *p; | ||
607 | if (val) { | ||
608 | printk(KERN_ERR PFX "invalid nvram checksum\n"); | ||
609 | return; | ||
610 | } | ||
611 | |||
612 | /* find board by name */ | ||
613 | for (i = 0; i < ARRAY_SIZE(bcm963xx_boards); i++) { | ||
614 | if (strncmp(nvram.name, bcm963xx_boards[i]->name, | ||
615 | sizeof(nvram.name))) | ||
616 | continue; | ||
617 | /* copy, board desc array is marked initdata */ | ||
618 | memcpy(&board, bcm963xx_boards[i], sizeof(board)); | ||
619 | break; | ||
620 | } | ||
621 | |||
622 | /* bail out if board is not found, will complain later */ | ||
623 | if (!board.name[0]) { | ||
624 | char name[17]; | ||
625 | memcpy(name, nvram.name, 16); | ||
626 | name[16] = 0; | ||
627 | printk(KERN_ERR PFX "unknown bcm963xx board: %s\n", | ||
628 | name); | ||
629 | return; | ||
630 | } | ||
631 | |||
632 | /* setup pin multiplexing depending on board enabled device, | ||
633 | * this has to be done this early since PCI init is done | ||
634 | * inside arch_initcall */ | ||
635 | val = 0; | ||
636 | |||
637 | #ifdef CONFIG_PCI | ||
638 | if (board.has_pci) { | ||
639 | bcm63xx_pci_enabled = 1; | ||
640 | if (BCMCPU_IS_6348()) | ||
641 | val |= GPIO_MODE_6348_G2_PCI; | ||
642 | } | ||
643 | #endif | ||
644 | |||
645 | if (board.has_pccard) { | ||
646 | if (BCMCPU_IS_6348()) | ||
647 | val |= GPIO_MODE_6348_G1_MII_PCCARD; | ||
648 | } | ||
649 | |||
650 | if (board.has_enet0 && !board.enet0.use_internal_phy) { | ||
651 | if (BCMCPU_IS_6348()) | ||
652 | val |= GPIO_MODE_6348_G3_EXT_MII | | ||
653 | GPIO_MODE_6348_G0_EXT_MII; | ||
654 | } | ||
655 | |||
656 | if (board.has_enet1 && !board.enet1.use_internal_phy) { | ||
657 | if (BCMCPU_IS_6348()) | ||
658 | val |= GPIO_MODE_6348_G3_EXT_MII | | ||
659 | GPIO_MODE_6348_G0_EXT_MII; | ||
660 | } | ||
661 | |||
662 | bcm_gpio_writel(val, GPIO_MODE_REG); | ||
663 | } | ||
664 | |||
665 | /* | ||
666 | * second stage init callback, good time to panic if we couldn't | ||
667 | * identify on which board we're running since early printk is working | ||
668 | */ | ||
669 | void __init board_setup(void) | ||
670 | { | ||
671 | if (!board.name[0]) | ||
672 | panic("unable to detect bcm963xx board"); | ||
673 | printk(KERN_INFO PFX "board name: %s\n", board.name); | ||
674 | |||
675 | /* make sure we're running on expected cpu */ | ||
676 | if (bcm63xx_get_cpu_id() != board.expected_cpu_id) | ||
677 | panic("unexpected CPU for bcm963xx board"); | ||
678 | } | ||
679 | |||
680 | /* | ||
681 | * return board name for /proc/cpuinfo | ||
682 | */ | ||
683 | const char *board_get_name(void) | ||
684 | { | ||
685 | return board.name; | ||
686 | } | ||
687 | |||
688 | /* | ||
689 | * register & return a new board mac address | ||
690 | */ | ||
691 | static int board_get_mac_address(u8 *mac) | ||
692 | { | ||
693 | u8 *p; | ||
694 | int count; | ||
695 | |||
696 | if (mac_addr_used >= nvram.mac_addr_count) { | ||
697 | printk(KERN_ERR PFX "not enough mac address\n"); | ||
698 | return -ENODEV; | ||
699 | } | ||
700 | |||
701 | memcpy(mac, nvram.mac_addr_base, ETH_ALEN); | ||
702 | p = mac + ETH_ALEN - 1; | ||
703 | count = mac_addr_used; | ||
704 | |||
705 | while (count--) { | ||
706 | do { | ||
707 | (*p)++; | ||
708 | if (*p != 0) | ||
709 | break; | ||
710 | p--; | ||
711 | } while (p != mac); | ||
712 | } | ||
713 | |||
714 | if (p == mac) { | ||
715 | printk(KERN_ERR PFX "unable to fetch mac address\n"); | ||
716 | return -ENODEV; | ||
717 | } | ||
718 | |||
719 | mac_addr_used++; | ||
720 | return 0; | ||
721 | } | ||
722 | |||
723 | static struct mtd_partition mtd_partitions[] = { | ||
724 | { | ||
725 | .name = "cfe", | ||
726 | .offset = 0x0, | ||
727 | .size = 0x40000, | ||
728 | } | ||
729 | }; | ||
730 | |||
731 | static struct physmap_flash_data flash_data = { | ||
732 | .width = 2, | ||
733 | .nr_parts = ARRAY_SIZE(mtd_partitions), | ||
734 | .parts = mtd_partitions, | ||
735 | }; | ||
736 | |||
737 | static struct resource mtd_resources[] = { | ||
738 | { | ||
739 | .start = 0, /* filled at runtime */ | ||
740 | .end = 0, /* filled at runtime */ | ||
741 | .flags = IORESOURCE_MEM, | ||
742 | } | ||
743 | }; | ||
744 | |||
745 | static struct platform_device mtd_dev = { | ||
746 | .name = "physmap-flash", | ||
747 | .resource = mtd_resources, | ||
748 | .num_resources = ARRAY_SIZE(mtd_resources), | ||
749 | .dev = { | ||
750 | .platform_data = &flash_data, | ||
751 | }, | ||
752 | }; | ||
753 | |||
754 | /* | ||
755 | * Register a sane SPROMv2 to make the on-board | ||
756 | * bcm4318 WLAN work | ||
757 | */ | ||
758 | #ifdef CONFIG_SSB_PCIHOST | ||
759 | static struct ssb_sprom bcm63xx_sprom = { | ||
760 | .revision = 0x02, | ||
761 | .board_rev = 0x17, | ||
762 | .country_code = 0x0, | ||
763 | .ant_available_bg = 0x3, | ||
764 | .pa0b0 = 0x15ae, | ||
765 | .pa0b1 = 0xfa85, | ||
766 | .pa0b2 = 0xfe8d, | ||
767 | .pa1b0 = 0xffff, | ||
768 | .pa1b1 = 0xffff, | ||
769 | .pa1b2 = 0xffff, | ||
770 | .gpio0 = 0xff, | ||
771 | .gpio1 = 0xff, | ||
772 | .gpio2 = 0xff, | ||
773 | .gpio3 = 0xff, | ||
774 | .maxpwr_bg = 0x004c, | ||
775 | .itssi_bg = 0x00, | ||
776 | .boardflags_lo = 0x2848, | ||
777 | .boardflags_hi = 0x0000, | ||
778 | }; | ||
779 | #endif | ||
780 | |||
781 | static struct gpio_led_platform_data bcm63xx_led_data; | ||
782 | |||
783 | static struct platform_device bcm63xx_gpio_leds = { | ||
784 | .name = "leds-gpio", | ||
785 | .id = 0, | ||
786 | .dev.platform_data = &bcm63xx_led_data, | ||
787 | }; | ||
788 | |||
789 | /* | ||
790 | * third stage init callback, register all board devices. | ||
791 | */ | ||
792 | int __init board_register_devices(void) | ||
793 | { | ||
794 | u32 val; | ||
795 | |||
796 | if (board.has_enet0 && | ||
797 | !board_get_mac_address(board.enet0.mac_addr)) | ||
798 | bcm63xx_enet_register(0, &board.enet0); | ||
799 | |||
800 | if (board.has_enet1 && | ||
801 | !board_get_mac_address(board.enet1.mac_addr)) | ||
802 | bcm63xx_enet_register(1, &board.enet1); | ||
803 | |||
804 | if (board.has_dsp) | ||
805 | bcm63xx_dsp_register(&board.dsp); | ||
806 | |||
807 | /* Generate MAC address for WLAN and | ||
808 | * register our SPROM */ | ||
809 | #ifdef CONFIG_SSB_PCIHOST | ||
810 | if (!board_get_mac_address(bcm63xx_sprom.il0mac)) { | ||
811 | memcpy(bcm63xx_sprom.et0mac, bcm63xx_sprom.il0mac, ETH_ALEN); | ||
812 | memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN); | ||
813 | if (ssb_arch_set_fallback_sprom(&bcm63xx_sprom) < 0) | ||
814 | printk(KERN_ERR "failed to register fallback SPROM\n"); | ||
815 | } | ||
816 | #endif | ||
817 | |||
818 | /* read base address of boot chip select (0) */ | ||
819 | if (BCMCPU_IS_6345()) | ||
820 | val = 0x1fc00000; | ||
821 | else { | ||
822 | val = bcm_mpi_readl(MPI_CSBASE_REG(0)); | ||
823 | val &= MPI_CSBASE_BASE_MASK; | ||
824 | } | ||
825 | mtd_resources[0].start = val; | ||
826 | mtd_resources[0].end = 0x1FFFFFFF; | ||
827 | |||
828 | platform_device_register(&mtd_dev); | ||
829 | |||
830 | bcm63xx_led_data.num_leds = ARRAY_SIZE(board.leds); | ||
831 | bcm63xx_led_data.leds = board.leds; | ||
832 | |||
833 | platform_device_register(&bcm63xx_gpio_leds); | ||
834 | |||
835 | return 0; | ||
836 | } | ||
837 | |||
diff --git a/arch/mips/bcm63xx/clk.c b/arch/mips/bcm63xx/clk.c new file mode 100644 index 000000000000..2c68ee9ccee2 --- /dev/null +++ b/arch/mips/bcm63xx/clk.c | |||
@@ -0,0 +1,226 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | */ | ||
8 | |||
9 | #include <linux/module.h> | ||
10 | #include <linux/mutex.h> | ||
11 | #include <linux/err.h> | ||
12 | #include <linux/clk.h> | ||
13 | #include <bcm63xx_cpu.h> | ||
14 | #include <bcm63xx_io.h> | ||
15 | #include <bcm63xx_regs.h> | ||
16 | #include <bcm63xx_clk.h> | ||
17 | |||
18 | static DEFINE_MUTEX(clocks_mutex); | ||
19 | |||
20 | |||
21 | static void clk_enable_unlocked(struct clk *clk) | ||
22 | { | ||
23 | if (clk->set && (clk->usage++) == 0) | ||
24 | clk->set(clk, 1); | ||
25 | } | ||
26 | |||
27 | static void clk_disable_unlocked(struct clk *clk) | ||
28 | { | ||
29 | if (clk->set && (--clk->usage) == 0) | ||
30 | clk->set(clk, 0); | ||
31 | } | ||
32 | |||
33 | static void bcm_hwclock_set(u32 mask, int enable) | ||
34 | { | ||
35 | u32 reg; | ||
36 | |||
37 | reg = bcm_perf_readl(PERF_CKCTL_REG); | ||
38 | if (enable) | ||
39 | reg |= mask; | ||
40 | else | ||
41 | reg &= ~mask; | ||
42 | bcm_perf_writel(reg, PERF_CKCTL_REG); | ||
43 | } | ||
44 | |||
45 | /* | ||
46 | * Ethernet MAC "misc" clock: dma clocks and main clock on 6348 | ||
47 | */ | ||
48 | static void enet_misc_set(struct clk *clk, int enable) | ||
49 | { | ||
50 | u32 mask; | ||
51 | |||
52 | if (BCMCPU_IS_6338()) | ||
53 | mask = CKCTL_6338_ENET_EN; | ||
54 | else if (BCMCPU_IS_6345()) | ||
55 | mask = CKCTL_6345_ENET_EN; | ||
56 | else if (BCMCPU_IS_6348()) | ||
57 | mask = CKCTL_6348_ENET_EN; | ||
58 | else | ||
59 | /* BCMCPU_IS_6358 */ | ||
60 | mask = CKCTL_6358_EMUSB_EN; | ||
61 | bcm_hwclock_set(mask, enable); | ||
62 | } | ||
63 | |||
64 | static struct clk clk_enet_misc = { | ||
65 | .set = enet_misc_set, | ||
66 | }; | ||
67 | |||
68 | /* | ||
69 | * Ethernet MAC clocks: only revelant on 6358, silently enable misc | ||
70 | * clocks | ||
71 | */ | ||
72 | static void enetx_set(struct clk *clk, int enable) | ||
73 | { | ||
74 | if (enable) | ||
75 | clk_enable_unlocked(&clk_enet_misc); | ||
76 | else | ||
77 | clk_disable_unlocked(&clk_enet_misc); | ||
78 | |||
79 | if (BCMCPU_IS_6358()) { | ||
80 | u32 mask; | ||
81 | |||
82 | if (clk->id == 0) | ||
83 | mask = CKCTL_6358_ENET0_EN; | ||
84 | else | ||
85 | mask = CKCTL_6358_ENET1_EN; | ||
86 | bcm_hwclock_set(mask, enable); | ||
87 | } | ||
88 | } | ||
89 | |||
90 | static struct clk clk_enet0 = { | ||
91 | .id = 0, | ||
92 | .set = enetx_set, | ||
93 | }; | ||
94 | |||
95 | static struct clk clk_enet1 = { | ||
96 | .id = 1, | ||
97 | .set = enetx_set, | ||
98 | }; | ||
99 | |||
100 | /* | ||
101 | * Ethernet PHY clock | ||
102 | */ | ||
103 | static void ephy_set(struct clk *clk, int enable) | ||
104 | { | ||
105 | if (!BCMCPU_IS_6358()) | ||
106 | return; | ||
107 | bcm_hwclock_set(CKCTL_6358_EPHY_EN, enable); | ||
108 | } | ||
109 | |||
110 | |||
111 | static struct clk clk_ephy = { | ||
112 | .set = ephy_set, | ||
113 | }; | ||
114 | |||
115 | /* | ||
116 | * PCM clock | ||
117 | */ | ||
118 | static void pcm_set(struct clk *clk, int enable) | ||
119 | { | ||
120 | if (!BCMCPU_IS_6358()) | ||
121 | return; | ||
122 | bcm_hwclock_set(CKCTL_6358_PCM_EN, enable); | ||
123 | } | ||
124 | |||
125 | static struct clk clk_pcm = { | ||
126 | .set = pcm_set, | ||
127 | }; | ||
128 | |||
129 | /* | ||
130 | * USB host clock | ||
131 | */ | ||
132 | static void usbh_set(struct clk *clk, int enable) | ||
133 | { | ||
134 | if (!BCMCPU_IS_6348()) | ||
135 | return; | ||
136 | bcm_hwclock_set(CKCTL_6348_USBH_EN, enable); | ||
137 | } | ||
138 | |||
139 | static struct clk clk_usbh = { | ||
140 | .set = usbh_set, | ||
141 | }; | ||
142 | |||
143 | /* | ||
144 | * SPI clock | ||
145 | */ | ||
146 | static void spi_set(struct clk *clk, int enable) | ||
147 | { | ||
148 | u32 mask; | ||
149 | |||
150 | if (BCMCPU_IS_6338()) | ||
151 | mask = CKCTL_6338_SPI_EN; | ||
152 | else if (BCMCPU_IS_6348()) | ||
153 | mask = CKCTL_6348_SPI_EN; | ||
154 | else | ||
155 | /* BCMCPU_IS_6358 */ | ||
156 | mask = CKCTL_6358_SPI_EN; | ||
157 | bcm_hwclock_set(mask, enable); | ||
158 | } | ||
159 | |||
160 | static struct clk clk_spi = { | ||
161 | .set = spi_set, | ||
162 | }; | ||
163 | |||
164 | /* | ||
165 | * Internal peripheral clock | ||
166 | */ | ||
167 | static struct clk clk_periph = { | ||
168 | .rate = (50 * 1000 * 1000), | ||
169 | }; | ||
170 | |||
171 | |||
172 | /* | ||
173 | * Linux clock API implementation | ||
174 | */ | ||
175 | int clk_enable(struct clk *clk) | ||
176 | { | ||
177 | mutex_lock(&clocks_mutex); | ||
178 | clk_enable_unlocked(clk); | ||
179 | mutex_unlock(&clocks_mutex); | ||
180 | return 0; | ||
181 | } | ||
182 | |||
183 | EXPORT_SYMBOL(clk_enable); | ||
184 | |||
185 | void clk_disable(struct clk *clk) | ||
186 | { | ||
187 | mutex_lock(&clocks_mutex); | ||
188 | clk_disable_unlocked(clk); | ||
189 | mutex_unlock(&clocks_mutex); | ||
190 | } | ||
191 | |||
192 | EXPORT_SYMBOL(clk_disable); | ||
193 | |||
194 | unsigned long clk_get_rate(struct clk *clk) | ||
195 | { | ||
196 | return clk->rate; | ||
197 | } | ||
198 | |||
199 | EXPORT_SYMBOL(clk_get_rate); | ||
200 | |||
201 | struct clk *clk_get(struct device *dev, const char *id) | ||
202 | { | ||
203 | if (!strcmp(id, "enet0")) | ||
204 | return &clk_enet0; | ||
205 | if (!strcmp(id, "enet1")) | ||
206 | return &clk_enet1; | ||
207 | if (!strcmp(id, "ephy")) | ||
208 | return &clk_ephy; | ||
209 | if (!strcmp(id, "usbh")) | ||
210 | return &clk_usbh; | ||
211 | if (!strcmp(id, "spi")) | ||
212 | return &clk_spi; | ||
213 | if (!strcmp(id, "periph")) | ||
214 | return &clk_periph; | ||
215 | if (BCMCPU_IS_6358() && !strcmp(id, "pcm")) | ||
216 | return &clk_pcm; | ||
217 | return ERR_PTR(-ENOENT); | ||
218 | } | ||
219 | |||
220 | EXPORT_SYMBOL(clk_get); | ||
221 | |||
222 | void clk_put(struct clk *clk) | ||
223 | { | ||
224 | } | ||
225 | |||
226 | EXPORT_SYMBOL(clk_put); | ||
diff --git a/arch/mips/bcm63xx/cpu.c b/arch/mips/bcm63xx/cpu.c new file mode 100644 index 000000000000..6dc43f0483e8 --- /dev/null +++ b/arch/mips/bcm63xx/cpu.c | |||
@@ -0,0 +1,345 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | * Copyright (C) 2009 Florian Fainelli <florian@openwrt.org> | ||
8 | */ | ||
9 | |||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/module.h> | ||
12 | #include <linux/cpu.h> | ||
13 | #include <bcm63xx_cpu.h> | ||
14 | #include <bcm63xx_regs.h> | ||
15 | #include <bcm63xx_io.h> | ||
16 | #include <bcm63xx_irq.h> | ||
17 | |||
18 | const unsigned long *bcm63xx_regs_base; | ||
19 | EXPORT_SYMBOL(bcm63xx_regs_base); | ||
20 | |||
21 | const int *bcm63xx_irqs; | ||
22 | EXPORT_SYMBOL(bcm63xx_irqs); | ||
23 | |||
24 | static u16 bcm63xx_cpu_id; | ||
25 | static u16 bcm63xx_cpu_rev; | ||
26 | static unsigned int bcm63xx_cpu_freq; | ||
27 | static unsigned int bcm63xx_memory_size; | ||
28 | |||
29 | /* | ||
30 | * 6338 register sets and irqs | ||
31 | */ | ||
32 | static const unsigned long bcm96338_regs_base[] = { | ||
33 | [RSET_DSL_LMEM] = BCM_6338_DSL_LMEM_BASE, | ||
34 | [RSET_PERF] = BCM_6338_PERF_BASE, | ||
35 | [RSET_TIMER] = BCM_6338_TIMER_BASE, | ||
36 | [RSET_WDT] = BCM_6338_WDT_BASE, | ||
37 | [RSET_UART0] = BCM_6338_UART0_BASE, | ||
38 | [RSET_GPIO] = BCM_6338_GPIO_BASE, | ||
39 | [RSET_SPI] = BCM_6338_SPI_BASE, | ||
40 | [RSET_OHCI0] = BCM_6338_OHCI0_BASE, | ||
41 | [RSET_OHCI_PRIV] = BCM_6338_OHCI_PRIV_BASE, | ||
42 | [RSET_USBH_PRIV] = BCM_6338_USBH_PRIV_BASE, | ||
43 | [RSET_UDC0] = BCM_6338_UDC0_BASE, | ||
44 | [RSET_MPI] = BCM_6338_MPI_BASE, | ||
45 | [RSET_PCMCIA] = BCM_6338_PCMCIA_BASE, | ||
46 | [RSET_SDRAM] = BCM_6338_SDRAM_BASE, | ||
47 | [RSET_DSL] = BCM_6338_DSL_BASE, | ||
48 | [RSET_ENET0] = BCM_6338_ENET0_BASE, | ||
49 | [RSET_ENET1] = BCM_6338_ENET1_BASE, | ||
50 | [RSET_ENETDMA] = BCM_6338_ENETDMA_BASE, | ||
51 | [RSET_MEMC] = BCM_6338_MEMC_BASE, | ||
52 | [RSET_DDR] = BCM_6338_DDR_BASE, | ||
53 | }; | ||
54 | |||
55 | static const int bcm96338_irqs[] = { | ||
56 | [IRQ_TIMER] = BCM_6338_TIMER_IRQ, | ||
57 | [IRQ_UART0] = BCM_6338_UART0_IRQ, | ||
58 | [IRQ_DSL] = BCM_6338_DSL_IRQ, | ||
59 | [IRQ_ENET0] = BCM_6338_ENET0_IRQ, | ||
60 | [IRQ_ENET_PHY] = BCM_6338_ENET_PHY_IRQ, | ||
61 | [IRQ_ENET0_RXDMA] = BCM_6338_ENET0_RXDMA_IRQ, | ||
62 | [IRQ_ENET0_TXDMA] = BCM_6338_ENET0_TXDMA_IRQ, | ||
63 | }; | ||
64 | |||
65 | /* | ||
66 | * 6345 register sets and irqs | ||
67 | */ | ||
68 | static const unsigned long bcm96345_regs_base[] = { | ||
69 | [RSET_DSL_LMEM] = BCM_6345_DSL_LMEM_BASE, | ||
70 | [RSET_PERF] = BCM_6345_PERF_BASE, | ||
71 | [RSET_TIMER] = BCM_6345_TIMER_BASE, | ||
72 | [RSET_WDT] = BCM_6345_WDT_BASE, | ||
73 | [RSET_UART0] = BCM_6345_UART0_BASE, | ||
74 | [RSET_GPIO] = BCM_6345_GPIO_BASE, | ||
75 | [RSET_SPI] = BCM_6345_SPI_BASE, | ||
76 | [RSET_UDC0] = BCM_6345_UDC0_BASE, | ||
77 | [RSET_OHCI0] = BCM_6345_OHCI0_BASE, | ||
78 | [RSET_OHCI_PRIV] = BCM_6345_OHCI_PRIV_BASE, | ||
79 | [RSET_USBH_PRIV] = BCM_6345_USBH_PRIV_BASE, | ||
80 | [RSET_MPI] = BCM_6345_MPI_BASE, | ||
81 | [RSET_PCMCIA] = BCM_6345_PCMCIA_BASE, | ||
82 | [RSET_DSL] = BCM_6345_DSL_BASE, | ||
83 | [RSET_ENET0] = BCM_6345_ENET0_BASE, | ||
84 | [RSET_ENET1] = BCM_6345_ENET1_BASE, | ||
85 | [RSET_ENETDMA] = BCM_6345_ENETDMA_BASE, | ||
86 | [RSET_EHCI0] = BCM_6345_EHCI0_BASE, | ||
87 | [RSET_SDRAM] = BCM_6345_SDRAM_BASE, | ||
88 | [RSET_MEMC] = BCM_6345_MEMC_BASE, | ||
89 | [RSET_DDR] = BCM_6345_DDR_BASE, | ||
90 | }; | ||
91 | |||
92 | static const int bcm96345_irqs[] = { | ||
93 | [IRQ_TIMER] = BCM_6345_TIMER_IRQ, | ||
94 | [IRQ_UART0] = BCM_6345_UART0_IRQ, | ||
95 | [IRQ_DSL] = BCM_6345_DSL_IRQ, | ||
96 | [IRQ_ENET0] = BCM_6345_ENET0_IRQ, | ||
97 | [IRQ_ENET_PHY] = BCM_6345_ENET_PHY_IRQ, | ||
98 | [IRQ_ENET0_RXDMA] = BCM_6345_ENET0_RXDMA_IRQ, | ||
99 | [IRQ_ENET0_TXDMA] = BCM_6345_ENET0_TXDMA_IRQ, | ||
100 | }; | ||
101 | |||
102 | /* | ||
103 | * 6348 register sets and irqs | ||
104 | */ | ||
105 | static const unsigned long bcm96348_regs_base[] = { | ||
106 | [RSET_DSL_LMEM] = BCM_6348_DSL_LMEM_BASE, | ||
107 | [RSET_PERF] = BCM_6348_PERF_BASE, | ||
108 | [RSET_TIMER] = BCM_6348_TIMER_BASE, | ||
109 | [RSET_WDT] = BCM_6348_WDT_BASE, | ||
110 | [RSET_UART0] = BCM_6348_UART0_BASE, | ||
111 | [RSET_GPIO] = BCM_6348_GPIO_BASE, | ||
112 | [RSET_SPI] = BCM_6348_SPI_BASE, | ||
113 | [RSET_OHCI0] = BCM_6348_OHCI0_BASE, | ||
114 | [RSET_OHCI_PRIV] = BCM_6348_OHCI_PRIV_BASE, | ||
115 | [RSET_USBH_PRIV] = BCM_6348_USBH_PRIV_BASE, | ||
116 | [RSET_MPI] = BCM_6348_MPI_BASE, | ||
117 | [RSET_PCMCIA] = BCM_6348_PCMCIA_BASE, | ||
118 | [RSET_SDRAM] = BCM_6348_SDRAM_BASE, | ||
119 | [RSET_DSL] = BCM_6348_DSL_BASE, | ||
120 | [RSET_ENET0] = BCM_6348_ENET0_BASE, | ||
121 | [RSET_ENET1] = BCM_6348_ENET1_BASE, | ||
122 | [RSET_ENETDMA] = BCM_6348_ENETDMA_BASE, | ||
123 | [RSET_MEMC] = BCM_6348_MEMC_BASE, | ||
124 | [RSET_DDR] = BCM_6348_DDR_BASE, | ||
125 | }; | ||
126 | |||
127 | static const int bcm96348_irqs[] = { | ||
128 | [IRQ_TIMER] = BCM_6348_TIMER_IRQ, | ||
129 | [IRQ_UART0] = BCM_6348_UART0_IRQ, | ||
130 | [IRQ_DSL] = BCM_6348_DSL_IRQ, | ||
131 | [IRQ_ENET0] = BCM_6348_ENET0_IRQ, | ||
132 | [IRQ_ENET1] = BCM_6348_ENET1_IRQ, | ||
133 | [IRQ_ENET_PHY] = BCM_6348_ENET_PHY_IRQ, | ||
134 | [IRQ_OHCI0] = BCM_6348_OHCI0_IRQ, | ||
135 | [IRQ_PCMCIA] = BCM_6348_PCMCIA_IRQ, | ||
136 | [IRQ_ENET0_RXDMA] = BCM_6348_ENET0_RXDMA_IRQ, | ||
137 | [IRQ_ENET0_TXDMA] = BCM_6348_ENET0_TXDMA_IRQ, | ||
138 | [IRQ_ENET1_RXDMA] = BCM_6348_ENET1_RXDMA_IRQ, | ||
139 | [IRQ_ENET1_TXDMA] = BCM_6348_ENET1_TXDMA_IRQ, | ||
140 | [IRQ_PCI] = BCM_6348_PCI_IRQ, | ||
141 | }; | ||
142 | |||
143 | /* | ||
144 | * 6358 register sets and irqs | ||
145 | */ | ||
146 | static const unsigned long bcm96358_regs_base[] = { | ||
147 | [RSET_DSL_LMEM] = BCM_6358_DSL_LMEM_BASE, | ||
148 | [RSET_PERF] = BCM_6358_PERF_BASE, | ||
149 | [RSET_TIMER] = BCM_6358_TIMER_BASE, | ||
150 | [RSET_WDT] = BCM_6358_WDT_BASE, | ||
151 | [RSET_UART0] = BCM_6358_UART0_BASE, | ||
152 | [RSET_GPIO] = BCM_6358_GPIO_BASE, | ||
153 | [RSET_SPI] = BCM_6358_SPI_BASE, | ||
154 | [RSET_OHCI0] = BCM_6358_OHCI0_BASE, | ||
155 | [RSET_EHCI0] = BCM_6358_EHCI0_BASE, | ||
156 | [RSET_OHCI_PRIV] = BCM_6358_OHCI_PRIV_BASE, | ||
157 | [RSET_USBH_PRIV] = BCM_6358_USBH_PRIV_BASE, | ||
158 | [RSET_MPI] = BCM_6358_MPI_BASE, | ||
159 | [RSET_PCMCIA] = BCM_6358_PCMCIA_BASE, | ||
160 | [RSET_SDRAM] = BCM_6358_SDRAM_BASE, | ||
161 | [RSET_DSL] = BCM_6358_DSL_BASE, | ||
162 | [RSET_ENET0] = BCM_6358_ENET0_BASE, | ||
163 | [RSET_ENET1] = BCM_6358_ENET1_BASE, | ||
164 | [RSET_ENETDMA] = BCM_6358_ENETDMA_BASE, | ||
165 | [RSET_MEMC] = BCM_6358_MEMC_BASE, | ||
166 | [RSET_DDR] = BCM_6358_DDR_BASE, | ||
167 | }; | ||
168 | |||
169 | static const int bcm96358_irqs[] = { | ||
170 | [IRQ_TIMER] = BCM_6358_TIMER_IRQ, | ||
171 | [IRQ_UART0] = BCM_6358_UART0_IRQ, | ||
172 | [IRQ_DSL] = BCM_6358_DSL_IRQ, | ||
173 | [IRQ_ENET0] = BCM_6358_ENET0_IRQ, | ||
174 | [IRQ_ENET1] = BCM_6358_ENET1_IRQ, | ||
175 | [IRQ_ENET_PHY] = BCM_6358_ENET_PHY_IRQ, | ||
176 | [IRQ_OHCI0] = BCM_6358_OHCI0_IRQ, | ||
177 | [IRQ_EHCI0] = BCM_6358_EHCI0_IRQ, | ||
178 | [IRQ_PCMCIA] = BCM_6358_PCMCIA_IRQ, | ||
179 | [IRQ_ENET0_RXDMA] = BCM_6358_ENET0_RXDMA_IRQ, | ||
180 | [IRQ_ENET0_TXDMA] = BCM_6358_ENET0_TXDMA_IRQ, | ||
181 | [IRQ_ENET1_RXDMA] = BCM_6358_ENET1_RXDMA_IRQ, | ||
182 | [IRQ_ENET1_TXDMA] = BCM_6358_ENET1_TXDMA_IRQ, | ||
183 | [IRQ_PCI] = BCM_6358_PCI_IRQ, | ||
184 | }; | ||
185 | |||
186 | u16 __bcm63xx_get_cpu_id(void) | ||
187 | { | ||
188 | return bcm63xx_cpu_id; | ||
189 | } | ||
190 | |||
191 | EXPORT_SYMBOL(__bcm63xx_get_cpu_id); | ||
192 | |||
193 | u16 bcm63xx_get_cpu_rev(void) | ||
194 | { | ||
195 | return bcm63xx_cpu_rev; | ||
196 | } | ||
197 | |||
198 | EXPORT_SYMBOL(bcm63xx_get_cpu_rev); | ||
199 | |||
200 | unsigned int bcm63xx_get_cpu_freq(void) | ||
201 | { | ||
202 | return bcm63xx_cpu_freq; | ||
203 | } | ||
204 | |||
205 | unsigned int bcm63xx_get_memory_size(void) | ||
206 | { | ||
207 | return bcm63xx_memory_size; | ||
208 | } | ||
209 | |||
210 | static unsigned int detect_cpu_clock(void) | ||
211 | { | ||
212 | unsigned int tmp, n1 = 0, n2 = 0, m1 = 0; | ||
213 | |||
214 | /* BCM6338 has a fixed 240 Mhz frequency */ | ||
215 | if (BCMCPU_IS_6338()) | ||
216 | return 240000000; | ||
217 | |||
218 | /* BCM6345 has a fixed 140Mhz frequency */ | ||
219 | if (BCMCPU_IS_6345()) | ||
220 | return 140000000; | ||
221 | |||
222 | /* | ||
223 | * frequency depends on PLL configuration: | ||
224 | */ | ||
225 | if (BCMCPU_IS_6348()) { | ||
226 | /* 16MHz * (N1 + 1) * (N2 + 2) / (M1_CPU + 1) */ | ||
227 | tmp = bcm_perf_readl(PERF_MIPSPLLCTL_REG); | ||
228 | n1 = (tmp & MIPSPLLCTL_N1_MASK) >> MIPSPLLCTL_N1_SHIFT; | ||
229 | n2 = (tmp & MIPSPLLCTL_N2_MASK) >> MIPSPLLCTL_N2_SHIFT; | ||
230 | m1 = (tmp & MIPSPLLCTL_M1CPU_MASK) >> MIPSPLLCTL_M1CPU_SHIFT; | ||
231 | n1 += 1; | ||
232 | n2 += 2; | ||
233 | m1 += 1; | ||
234 | } | ||
235 | |||
236 | if (BCMCPU_IS_6358()) { | ||
237 | /* 16MHz * N1 * N2 / M1_CPU */ | ||
238 | tmp = bcm_ddr_readl(DDR_DMIPSPLLCFG_REG); | ||
239 | n1 = (tmp & DMIPSPLLCFG_N1_MASK) >> DMIPSPLLCFG_N1_SHIFT; | ||
240 | n2 = (tmp & DMIPSPLLCFG_N2_MASK) >> DMIPSPLLCFG_N2_SHIFT; | ||
241 | m1 = (tmp & DMIPSPLLCFG_M1_MASK) >> DMIPSPLLCFG_M1_SHIFT; | ||
242 | } | ||
243 | |||
244 | return (16 * 1000000 * n1 * n2) / m1; | ||
245 | } | ||
246 | |||
247 | /* | ||
248 | * attempt to detect the amount of memory installed | ||
249 | */ | ||
250 | static unsigned int detect_memory_size(void) | ||
251 | { | ||
252 | unsigned int cols = 0, rows = 0, is_32bits = 0, banks = 0; | ||
253 | u32 val; | ||
254 | |||
255 | if (BCMCPU_IS_6345()) | ||
256 | return (8 * 1024 * 1024); | ||
257 | |||
258 | if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) { | ||
259 | val = bcm_sdram_readl(SDRAM_CFG_REG); | ||
260 | rows = (val & SDRAM_CFG_ROW_MASK) >> SDRAM_CFG_ROW_SHIFT; | ||
261 | cols = (val & SDRAM_CFG_COL_MASK) >> SDRAM_CFG_COL_SHIFT; | ||
262 | is_32bits = (val & SDRAM_CFG_32B_MASK) ? 1 : 0; | ||
263 | banks = (val & SDRAM_CFG_BANK_MASK) ? 2 : 1; | ||
264 | } | ||
265 | |||
266 | if (BCMCPU_IS_6358()) { | ||
267 | val = bcm_memc_readl(MEMC_CFG_REG); | ||
268 | rows = (val & MEMC_CFG_ROW_MASK) >> MEMC_CFG_ROW_SHIFT; | ||
269 | cols = (val & MEMC_CFG_COL_MASK) >> MEMC_CFG_COL_SHIFT; | ||
270 | is_32bits = (val & MEMC_CFG_32B_MASK) ? 0 : 1; | ||
271 | banks = 2; | ||
272 | } | ||
273 | |||
274 | /* 0 => 11 address bits ... 2 => 13 address bits */ | ||
275 | rows += 11; | ||
276 | |||
277 | /* 0 => 8 address bits ... 2 => 10 address bits */ | ||
278 | cols += 8; | ||
279 | |||
280 | return 1 << (cols + rows + (is_32bits + 1) + banks); | ||
281 | } | ||
282 | |||
283 | void __init bcm63xx_cpu_init(void) | ||
284 | { | ||
285 | unsigned int tmp, expected_cpu_id; | ||
286 | struct cpuinfo_mips *c = ¤t_cpu_data; | ||
287 | |||
288 | /* soc registers location depends on cpu type */ | ||
289 | expected_cpu_id = 0; | ||
290 | |||
291 | switch (c->cputype) { | ||
292 | /* | ||
293 | * BCM6338 as the same PrId as BCM3302 see arch/mips/kernel/cpu-probe.c | ||
294 | */ | ||
295 | case CPU_BCM3302: | ||
296 | expected_cpu_id = BCM6338_CPU_ID; | ||
297 | bcm63xx_regs_base = bcm96338_regs_base; | ||
298 | bcm63xx_irqs = bcm96338_irqs; | ||
299 | break; | ||
300 | case CPU_BCM6345: | ||
301 | expected_cpu_id = BCM6345_CPU_ID; | ||
302 | bcm63xx_regs_base = bcm96345_regs_base; | ||
303 | bcm63xx_irqs = bcm96345_irqs; | ||
304 | break; | ||
305 | case CPU_BCM6348: | ||
306 | expected_cpu_id = BCM6348_CPU_ID; | ||
307 | bcm63xx_regs_base = bcm96348_regs_base; | ||
308 | bcm63xx_irqs = bcm96348_irqs; | ||
309 | break; | ||
310 | case CPU_BCM6358: | ||
311 | expected_cpu_id = BCM6358_CPU_ID; | ||
312 | bcm63xx_regs_base = bcm96358_regs_base; | ||
313 | bcm63xx_irqs = bcm96358_irqs; | ||
314 | break; | ||
315 | } | ||
316 | |||
317 | /* | ||
318 | * really early to panic, but delaying panic would not help since we | ||
319 | * will never get any working console | ||
320 | */ | ||
321 | if (!expected_cpu_id) | ||
322 | panic("unsupported Broadcom CPU"); | ||
323 | |||
324 | /* | ||
325 | * bcm63xx_regs_base is set, we can access soc registers | ||
326 | */ | ||
327 | |||
328 | /* double check CPU type */ | ||
329 | tmp = bcm_perf_readl(PERF_REV_REG); | ||
330 | bcm63xx_cpu_id = (tmp & REV_CHIPID_MASK) >> REV_CHIPID_SHIFT; | ||
331 | bcm63xx_cpu_rev = (tmp & REV_REVID_MASK) >> REV_REVID_SHIFT; | ||
332 | |||
333 | if (bcm63xx_cpu_id != expected_cpu_id) | ||
334 | panic("bcm63xx CPU id mismatch"); | ||
335 | |||
336 | bcm63xx_cpu_freq = detect_cpu_clock(); | ||
337 | bcm63xx_memory_size = detect_memory_size(); | ||
338 | |||
339 | printk(KERN_INFO "Detected Broadcom 0x%04x CPU revision %02x\n", | ||
340 | bcm63xx_cpu_id, bcm63xx_cpu_rev); | ||
341 | printk(KERN_INFO "CPU frequency is %u MHz\n", | ||
342 | bcm63xx_cpu_freq / 1000000); | ||
343 | printk(KERN_INFO "%uMB of RAM installed\n", | ||
344 | bcm63xx_memory_size >> 20); | ||
345 | } | ||
diff --git a/arch/mips/bcm63xx/cs.c b/arch/mips/bcm63xx/cs.c new file mode 100644 index 000000000000..50d8190bbf7b --- /dev/null +++ b/arch/mips/bcm63xx/cs.c | |||
@@ -0,0 +1,144 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | */ | ||
8 | |||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/spinlock.h> | ||
12 | #include <linux/log2.h> | ||
13 | #include <bcm63xx_cpu.h> | ||
14 | #include <bcm63xx_io.h> | ||
15 | #include <bcm63xx_regs.h> | ||
16 | #include <bcm63xx_cs.h> | ||
17 | |||
18 | static DEFINE_SPINLOCK(bcm63xx_cs_lock); | ||
19 | |||
20 | /* | ||
21 | * check if given chip select exists | ||
22 | */ | ||
23 | static int is_valid_cs(unsigned int cs) | ||
24 | { | ||
25 | if (cs > 6) | ||
26 | return 0; | ||
27 | return 1; | ||
28 | } | ||
29 | |||
30 | /* | ||
31 | * Configure chipselect base address and size (bytes). | ||
32 | * Size must be a power of two between 8k and 256M. | ||
33 | */ | ||
34 | int bcm63xx_set_cs_base(unsigned int cs, u32 base, unsigned int size) | ||
35 | { | ||
36 | unsigned long flags; | ||
37 | u32 val; | ||
38 | |||
39 | if (!is_valid_cs(cs)) | ||
40 | return -EINVAL; | ||
41 | |||
42 | /* sanity check on size */ | ||
43 | if (size != roundup_pow_of_two(size)) | ||
44 | return -EINVAL; | ||
45 | |||
46 | if (size < 8 * 1024 || size > 256 * 1024 * 1024) | ||
47 | return -EINVAL; | ||
48 | |||
49 | val = (base & MPI_CSBASE_BASE_MASK); | ||
50 | /* 8k => 0 - 256M => 15 */ | ||
51 | val |= (ilog2(size) - ilog2(8 * 1024)) << MPI_CSBASE_SIZE_SHIFT; | ||
52 | |||
53 | spin_lock_irqsave(&bcm63xx_cs_lock, flags); | ||
54 | bcm_mpi_writel(val, MPI_CSBASE_REG(cs)); | ||
55 | spin_unlock_irqrestore(&bcm63xx_cs_lock, flags); | ||
56 | |||
57 | return 0; | ||
58 | } | ||
59 | |||
60 | EXPORT_SYMBOL(bcm63xx_set_cs_base); | ||
61 | |||
62 | /* | ||
63 | * configure chipselect timing (ns) | ||
64 | */ | ||
65 | int bcm63xx_set_cs_timing(unsigned int cs, unsigned int wait, | ||
66 | unsigned int setup, unsigned int hold) | ||
67 | { | ||
68 | unsigned long flags; | ||
69 | u32 val; | ||
70 | |||
71 | if (!is_valid_cs(cs)) | ||
72 | return -EINVAL; | ||
73 | |||
74 | spin_lock_irqsave(&bcm63xx_cs_lock, flags); | ||
75 | val = bcm_mpi_readl(MPI_CSCTL_REG(cs)); | ||
76 | val &= ~(MPI_CSCTL_WAIT_MASK); | ||
77 | val &= ~(MPI_CSCTL_SETUP_MASK); | ||
78 | val &= ~(MPI_CSCTL_HOLD_MASK); | ||
79 | val |= wait << MPI_CSCTL_WAIT_SHIFT; | ||
80 | val |= setup << MPI_CSCTL_SETUP_SHIFT; | ||
81 | val |= hold << MPI_CSCTL_HOLD_SHIFT; | ||
82 | bcm_mpi_writel(val, MPI_CSCTL_REG(cs)); | ||
83 | spin_unlock_irqrestore(&bcm63xx_cs_lock, flags); | ||
84 | |||
85 | return 0; | ||
86 | } | ||
87 | |||
88 | EXPORT_SYMBOL(bcm63xx_set_cs_timing); | ||
89 | |||
90 | /* | ||
91 | * configure other chipselect parameter (data bus size, ...) | ||
92 | */ | ||
93 | int bcm63xx_set_cs_param(unsigned int cs, u32 params) | ||
94 | { | ||
95 | unsigned long flags; | ||
96 | u32 val; | ||
97 | |||
98 | if (!is_valid_cs(cs)) | ||
99 | return -EINVAL; | ||
100 | |||
101 | /* none of this fields apply to pcmcia */ | ||
102 | if (cs == MPI_CS_PCMCIA_COMMON || | ||
103 | cs == MPI_CS_PCMCIA_ATTR || | ||
104 | cs == MPI_CS_PCMCIA_IO) | ||
105 | return -EINVAL; | ||
106 | |||
107 | spin_lock_irqsave(&bcm63xx_cs_lock, flags); | ||
108 | val = bcm_mpi_readl(MPI_CSCTL_REG(cs)); | ||
109 | val &= ~(MPI_CSCTL_DATA16_MASK); | ||
110 | val &= ~(MPI_CSCTL_SYNCMODE_MASK); | ||
111 | val &= ~(MPI_CSCTL_TSIZE_MASK); | ||
112 | val &= ~(MPI_CSCTL_ENDIANSWAP_MASK); | ||
113 | val |= params; | ||
114 | bcm_mpi_writel(val, MPI_CSCTL_REG(cs)); | ||
115 | spin_unlock_irqrestore(&bcm63xx_cs_lock, flags); | ||
116 | |||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | EXPORT_SYMBOL(bcm63xx_set_cs_param); | ||
121 | |||
122 | /* | ||
123 | * set cs status (enable/disable) | ||
124 | */ | ||
125 | int bcm63xx_set_cs_status(unsigned int cs, int enable) | ||
126 | { | ||
127 | unsigned long flags; | ||
128 | u32 val; | ||
129 | |||
130 | if (!is_valid_cs(cs)) | ||
131 | return -EINVAL; | ||
132 | |||
133 | spin_lock_irqsave(&bcm63xx_cs_lock, flags); | ||
134 | val = bcm_mpi_readl(MPI_CSCTL_REG(cs)); | ||
135 | if (enable) | ||
136 | val |= MPI_CSCTL_ENABLE_MASK; | ||
137 | else | ||
138 | val &= ~MPI_CSCTL_ENABLE_MASK; | ||
139 | bcm_mpi_writel(val, MPI_CSCTL_REG(cs)); | ||
140 | spin_unlock_irqrestore(&bcm63xx_cs_lock, flags); | ||
141 | return 0; | ||
142 | } | ||
143 | |||
144 | EXPORT_SYMBOL(bcm63xx_set_cs_status); | ||
diff --git a/arch/mips/bcm63xx/dev-dsp.c b/arch/mips/bcm63xx/dev-dsp.c new file mode 100644 index 000000000000..da46d1d3c77c --- /dev/null +++ b/arch/mips/bcm63xx/dev-dsp.c | |||
@@ -0,0 +1,56 @@ | |||
1 | /* | ||
2 | * Broadcom BCM63xx VoIP DSP 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) 2009 Florian Fainelli <florian@openwrt.org> | ||
9 | */ | ||
10 | |||
11 | #include <linux/init.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | |||
15 | #include <bcm63xx_cpu.h> | ||
16 | #include <bcm63xx_dev_dsp.h> | ||
17 | #include <bcm63xx_regs.h> | ||
18 | #include <bcm63xx_io.h> | ||
19 | |||
20 | static struct resource voip_dsp_resources[] = { | ||
21 | { | ||
22 | .start = -1, /* filled at runtime */ | ||
23 | .end = -1, /* filled at runtime */ | ||
24 | .flags = IORESOURCE_MEM, | ||
25 | }, | ||
26 | { | ||
27 | .start = -1, /* filled at runtime */ | ||
28 | .flags = IORESOURCE_IRQ, | ||
29 | }, | ||
30 | }; | ||
31 | |||
32 | static struct platform_device bcm63xx_voip_dsp_device = { | ||
33 | .name = "bcm63xx-voip-dsp", | ||
34 | .id = 0, | ||
35 | .num_resources = ARRAY_SIZE(voip_dsp_resources), | ||
36 | .resource = voip_dsp_resources, | ||
37 | }; | ||
38 | |||
39 | int __init bcm63xx_dsp_register(const struct bcm63xx_dsp_platform_data *pd) | ||
40 | { | ||
41 | struct bcm63xx_dsp_platform_data *dpd; | ||
42 | u32 val; | ||
43 | |||
44 | /* Get the memory window */ | ||
45 | val = bcm_mpi_readl(MPI_CSBASE_REG(pd->cs - 1)); | ||
46 | val &= MPI_CSBASE_BASE_MASK; | ||
47 | voip_dsp_resources[0].start = val; | ||
48 | voip_dsp_resources[0].end = val + 0xFFFFFFF; | ||
49 | voip_dsp_resources[1].start = pd->ext_irq; | ||
50 | |||
51 | /* copy given platform data */ | ||
52 | dpd = bcm63xx_voip_dsp_device.dev.platform_data; | ||
53 | memcpy(dpd, pd, sizeof (*pd)); | ||
54 | |||
55 | return platform_device_register(&bcm63xx_voip_dsp_device); | ||
56 | } | ||
diff --git a/arch/mips/bcm63xx/early_printk.c b/arch/mips/bcm63xx/early_printk.c new file mode 100644 index 000000000000..bf353c937df2 --- /dev/null +++ b/arch/mips/bcm63xx/early_printk.c | |||
@@ -0,0 +1,30 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | */ | ||
8 | |||
9 | #include <linux/init.h> | ||
10 | #include <bcm63xx_io.h> | ||
11 | #include <bcm63xx_regs.h> | ||
12 | |||
13 | static void __init wait_xfered(void) | ||
14 | { | ||
15 | unsigned int val; | ||
16 | |||
17 | /* wait for any previous char to be transmitted */ | ||
18 | do { | ||
19 | val = bcm_uart0_readl(UART_IR_REG); | ||
20 | if (val & UART_IR_STAT(UART_IR_TXEMPTY)) | ||
21 | break; | ||
22 | } while (1); | ||
23 | } | ||
24 | |||
25 | void __init prom_putchar(char c) | ||
26 | { | ||
27 | wait_xfered(); | ||
28 | bcm_uart0_writel(c, UART_FIFO_REG); | ||
29 | wait_xfered(); | ||
30 | } | ||
diff --git a/arch/mips/bcm63xx/gpio.c b/arch/mips/bcm63xx/gpio.c new file mode 100644 index 000000000000..87ca39046334 --- /dev/null +++ b/arch/mips/bcm63xx/gpio.c | |||
@@ -0,0 +1,134 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org> | ||
8 | */ | ||
9 | |||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/module.h> | ||
12 | #include <linux/spinlock.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/gpio.h> | ||
15 | |||
16 | #include <bcm63xx_cpu.h> | ||
17 | #include <bcm63xx_gpio.h> | ||
18 | #include <bcm63xx_io.h> | ||
19 | #include <bcm63xx_regs.h> | ||
20 | |||
21 | static DEFINE_SPINLOCK(bcm63xx_gpio_lock); | ||
22 | static u32 gpio_out_low, gpio_out_high; | ||
23 | |||
24 | static void bcm63xx_gpio_set(struct gpio_chip *chip, | ||
25 | unsigned gpio, int val) | ||
26 | { | ||
27 | u32 reg; | ||
28 | u32 mask; | ||
29 | u32 *v; | ||
30 | unsigned long flags; | ||
31 | |||
32 | if (gpio >= chip->ngpio) | ||
33 | BUG(); | ||
34 | |||
35 | if (gpio < 32) { | ||
36 | reg = GPIO_DATA_LO_REG; | ||
37 | mask = 1 << gpio; | ||
38 | v = &gpio_out_low; | ||
39 | } else { | ||
40 | reg = GPIO_DATA_HI_REG; | ||
41 | mask = 1 << (gpio - 32); | ||
42 | v = &gpio_out_high; | ||
43 | } | ||
44 | |||
45 | spin_lock_irqsave(&bcm63xx_gpio_lock, flags); | ||
46 | if (val) | ||
47 | *v |= mask; | ||
48 | else | ||
49 | *v &= ~mask; | ||
50 | bcm_gpio_writel(*v, reg); | ||
51 | spin_unlock_irqrestore(&bcm63xx_gpio_lock, flags); | ||
52 | } | ||
53 | |||
54 | static int bcm63xx_gpio_get(struct gpio_chip *chip, unsigned gpio) | ||
55 | { | ||
56 | u32 reg; | ||
57 | u32 mask; | ||
58 | |||
59 | if (gpio >= chip->ngpio) | ||
60 | BUG(); | ||
61 | |||
62 | if (gpio < 32) { | ||
63 | reg = GPIO_DATA_LO_REG; | ||
64 | mask = 1 << gpio; | ||
65 | } else { | ||
66 | reg = GPIO_DATA_HI_REG; | ||
67 | mask = 1 << (gpio - 32); | ||
68 | } | ||
69 | |||
70 | return !!(bcm_gpio_readl(reg) & mask); | ||
71 | } | ||
72 | |||
73 | static int bcm63xx_gpio_set_direction(struct gpio_chip *chip, | ||
74 | unsigned gpio, int dir) | ||
75 | { | ||
76 | u32 reg; | ||
77 | u32 mask; | ||
78 | u32 tmp; | ||
79 | unsigned long flags; | ||
80 | |||
81 | if (gpio >= chip->ngpio) | ||
82 | BUG(); | ||
83 | |||
84 | if (gpio < 32) { | ||
85 | reg = GPIO_CTL_LO_REG; | ||
86 | mask = 1 << gpio; | ||
87 | } else { | ||
88 | reg = GPIO_CTL_HI_REG; | ||
89 | mask = 1 << (gpio - 32); | ||
90 | } | ||
91 | |||
92 | spin_lock_irqsave(&bcm63xx_gpio_lock, flags); | ||
93 | tmp = bcm_gpio_readl(reg); | ||
94 | if (dir == GPIO_DIR_IN) | ||
95 | tmp &= ~mask; | ||
96 | else | ||
97 | tmp |= mask; | ||
98 | bcm_gpio_writel(tmp, reg); | ||
99 | spin_unlock_irqrestore(&bcm63xx_gpio_lock, flags); | ||
100 | |||
101 | return 0; | ||
102 | } | ||
103 | |||
104 | static int bcm63xx_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) | ||
105 | { | ||
106 | return bcm63xx_gpio_set_direction(chip, gpio, GPIO_DIR_IN); | ||
107 | } | ||
108 | |||
109 | static int bcm63xx_gpio_direction_output(struct gpio_chip *chip, | ||
110 | unsigned gpio, int value) | ||
111 | { | ||
112 | bcm63xx_gpio_set(chip, gpio, value); | ||
113 | return bcm63xx_gpio_set_direction(chip, gpio, GPIO_DIR_OUT); | ||
114 | } | ||
115 | |||
116 | |||
117 | static struct gpio_chip bcm63xx_gpio_chip = { | ||
118 | .label = "bcm63xx-gpio", | ||
119 | .direction_input = bcm63xx_gpio_direction_input, | ||
120 | .direction_output = bcm63xx_gpio_direction_output, | ||
121 | .get = bcm63xx_gpio_get, | ||
122 | .set = bcm63xx_gpio_set, | ||
123 | .base = 0, | ||
124 | }; | ||
125 | |||
126 | int __init bcm63xx_gpio_init(void) | ||
127 | { | ||
128 | bcm63xx_gpio_chip.ngpio = bcm63xx_gpio_count(); | ||
129 | pr_info("registering %d GPIOs\n", bcm63xx_gpio_chip.ngpio); | ||
130 | |||
131 | return gpiochip_add(&bcm63xx_gpio_chip); | ||
132 | } | ||
133 | |||
134 | arch_initcall(bcm63xx_gpio_init); | ||
diff --git a/arch/mips/bcm63xx/irq.c b/arch/mips/bcm63xx/irq.c new file mode 100644 index 000000000000..a0c5cd18c192 --- /dev/null +++ b/arch/mips/bcm63xx/irq.c | |||
@@ -0,0 +1,253 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | * Copyright (C) 2008 Nicolas Schichan <nschichan@freebox.fr> | ||
8 | */ | ||
9 | |||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/interrupt.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <asm/irq_cpu.h> | ||
15 | #include <asm/mipsregs.h> | ||
16 | #include <bcm63xx_cpu.h> | ||
17 | #include <bcm63xx_regs.h> | ||
18 | #include <bcm63xx_io.h> | ||
19 | #include <bcm63xx_irq.h> | ||
20 | |||
21 | /* | ||
22 | * dispatch internal devices IRQ (uart, enet, watchdog, ...). do not | ||
23 | * prioritize any interrupt relatively to another. the static counter | ||
24 | * will resume the loop where it ended the last time we left this | ||
25 | * function. | ||
26 | */ | ||
27 | static void bcm63xx_irq_dispatch_internal(void) | ||
28 | { | ||
29 | u32 pending; | ||
30 | static int i; | ||
31 | |||
32 | pending = bcm_perf_readl(PERF_IRQMASK_REG) & | ||
33 | bcm_perf_readl(PERF_IRQSTAT_REG); | ||
34 | |||
35 | if (!pending) | ||
36 | return ; | ||
37 | |||
38 | while (1) { | ||
39 | int to_call = i; | ||
40 | |||
41 | i = (i + 1) & 0x1f; | ||
42 | if (pending & (1 << to_call)) { | ||
43 | do_IRQ(to_call + IRQ_INTERNAL_BASE); | ||
44 | break; | ||
45 | } | ||
46 | } | ||
47 | } | ||
48 | |||
49 | asmlinkage void plat_irq_dispatch(void) | ||
50 | { | ||
51 | u32 cause; | ||
52 | |||
53 | do { | ||
54 | cause = read_c0_cause() & read_c0_status() & ST0_IM; | ||
55 | |||
56 | if (!cause) | ||
57 | break; | ||
58 | |||
59 | if (cause & CAUSEF_IP7) | ||
60 | do_IRQ(7); | ||
61 | if (cause & CAUSEF_IP2) | ||
62 | bcm63xx_irq_dispatch_internal(); | ||
63 | if (cause & CAUSEF_IP3) | ||
64 | do_IRQ(IRQ_EXT_0); | ||
65 | if (cause & CAUSEF_IP4) | ||
66 | do_IRQ(IRQ_EXT_1); | ||
67 | if (cause & CAUSEF_IP5) | ||
68 | do_IRQ(IRQ_EXT_2); | ||
69 | if (cause & CAUSEF_IP6) | ||
70 | do_IRQ(IRQ_EXT_3); | ||
71 | } while (1); | ||
72 | } | ||
73 | |||
74 | /* | ||
75 | * internal IRQs operations: only mask/unmask on PERF irq mask | ||
76 | * register. | ||
77 | */ | ||
78 | static inline void bcm63xx_internal_irq_mask(unsigned int irq) | ||
79 | { | ||
80 | u32 mask; | ||
81 | |||
82 | irq -= IRQ_INTERNAL_BASE; | ||
83 | mask = bcm_perf_readl(PERF_IRQMASK_REG); | ||
84 | mask &= ~(1 << irq); | ||
85 | bcm_perf_writel(mask, PERF_IRQMASK_REG); | ||
86 | } | ||
87 | |||
88 | static void bcm63xx_internal_irq_unmask(unsigned int irq) | ||
89 | { | ||
90 | u32 mask; | ||
91 | |||
92 | irq -= IRQ_INTERNAL_BASE; | ||
93 | mask = bcm_perf_readl(PERF_IRQMASK_REG); | ||
94 | mask |= (1 << irq); | ||
95 | bcm_perf_writel(mask, PERF_IRQMASK_REG); | ||
96 | } | ||
97 | |||
98 | static unsigned int bcm63xx_internal_irq_startup(unsigned int irq) | ||
99 | { | ||
100 | bcm63xx_internal_irq_unmask(irq); | ||
101 | return 0; | ||
102 | } | ||
103 | |||
104 | /* | ||
105 | * external IRQs operations: mask/unmask and clear on PERF external | ||
106 | * irq control register. | ||
107 | */ | ||
108 | static void bcm63xx_external_irq_mask(unsigned int irq) | ||
109 | { | ||
110 | u32 reg; | ||
111 | |||
112 | irq -= IRQ_EXT_BASE; | ||
113 | reg = bcm_perf_readl(PERF_EXTIRQ_CFG_REG); | ||
114 | reg &= ~EXTIRQ_CFG_MASK(irq); | ||
115 | bcm_perf_writel(reg, PERF_EXTIRQ_CFG_REG); | ||
116 | } | ||
117 | |||
118 | static void bcm63xx_external_irq_unmask(unsigned int irq) | ||
119 | { | ||
120 | u32 reg; | ||
121 | |||
122 | irq -= IRQ_EXT_BASE; | ||
123 | reg = bcm_perf_readl(PERF_EXTIRQ_CFG_REG); | ||
124 | reg |= EXTIRQ_CFG_MASK(irq); | ||
125 | bcm_perf_writel(reg, PERF_EXTIRQ_CFG_REG); | ||
126 | } | ||
127 | |||
128 | static void bcm63xx_external_irq_clear(unsigned int irq) | ||
129 | { | ||
130 | u32 reg; | ||
131 | |||
132 | irq -= IRQ_EXT_BASE; | ||
133 | reg = bcm_perf_readl(PERF_EXTIRQ_CFG_REG); | ||
134 | reg |= EXTIRQ_CFG_CLEAR(irq); | ||
135 | bcm_perf_writel(reg, PERF_EXTIRQ_CFG_REG); | ||
136 | } | ||
137 | |||
138 | static unsigned int bcm63xx_external_irq_startup(unsigned int irq) | ||
139 | { | ||
140 | set_c0_status(0x100 << (irq - IRQ_MIPS_BASE)); | ||
141 | irq_enable_hazard(); | ||
142 | bcm63xx_external_irq_unmask(irq); | ||
143 | return 0; | ||
144 | } | ||
145 | |||
146 | static void bcm63xx_external_irq_shutdown(unsigned int irq) | ||
147 | { | ||
148 | bcm63xx_external_irq_mask(irq); | ||
149 | clear_c0_status(0x100 << (irq - IRQ_MIPS_BASE)); | ||
150 | irq_disable_hazard(); | ||
151 | } | ||
152 | |||
153 | static int bcm63xx_external_irq_set_type(unsigned int irq, | ||
154 | unsigned int flow_type) | ||
155 | { | ||
156 | u32 reg; | ||
157 | struct irq_desc *desc = irq_desc + irq; | ||
158 | |||
159 | irq -= IRQ_EXT_BASE; | ||
160 | |||
161 | flow_type &= IRQ_TYPE_SENSE_MASK; | ||
162 | |||
163 | if (flow_type == IRQ_TYPE_NONE) | ||
164 | flow_type = IRQ_TYPE_LEVEL_LOW; | ||
165 | |||
166 | reg = bcm_perf_readl(PERF_EXTIRQ_CFG_REG); | ||
167 | switch (flow_type) { | ||
168 | case IRQ_TYPE_EDGE_BOTH: | ||
169 | reg &= ~EXTIRQ_CFG_LEVELSENSE(irq); | ||
170 | reg |= EXTIRQ_CFG_BOTHEDGE(irq); | ||
171 | break; | ||
172 | |||
173 | case IRQ_TYPE_EDGE_RISING: | ||
174 | reg &= ~EXTIRQ_CFG_LEVELSENSE(irq); | ||
175 | reg |= EXTIRQ_CFG_SENSE(irq); | ||
176 | reg &= ~EXTIRQ_CFG_BOTHEDGE(irq); | ||
177 | break; | ||
178 | |||
179 | case IRQ_TYPE_EDGE_FALLING: | ||
180 | reg &= ~EXTIRQ_CFG_LEVELSENSE(irq); | ||
181 | reg &= ~EXTIRQ_CFG_SENSE(irq); | ||
182 | reg &= ~EXTIRQ_CFG_BOTHEDGE(irq); | ||
183 | break; | ||
184 | |||
185 | case IRQ_TYPE_LEVEL_HIGH: | ||
186 | reg |= EXTIRQ_CFG_LEVELSENSE(irq); | ||
187 | reg |= EXTIRQ_CFG_SENSE(irq); | ||
188 | break; | ||
189 | |||
190 | case IRQ_TYPE_LEVEL_LOW: | ||
191 | reg |= EXTIRQ_CFG_LEVELSENSE(irq); | ||
192 | reg &= ~EXTIRQ_CFG_SENSE(irq); | ||
193 | break; | ||
194 | |||
195 | default: | ||
196 | printk(KERN_ERR "bogus flow type combination given !\n"); | ||
197 | return -EINVAL; | ||
198 | } | ||
199 | bcm_perf_writel(reg, PERF_EXTIRQ_CFG_REG); | ||
200 | |||
201 | if (flow_type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) { | ||
202 | desc->status |= IRQ_LEVEL; | ||
203 | desc->handle_irq = handle_level_irq; | ||
204 | } else { | ||
205 | desc->handle_irq = handle_edge_irq; | ||
206 | } | ||
207 | |||
208 | return 0; | ||
209 | } | ||
210 | |||
211 | static struct irq_chip bcm63xx_internal_irq_chip = { | ||
212 | .name = "bcm63xx_ipic", | ||
213 | .startup = bcm63xx_internal_irq_startup, | ||
214 | .shutdown = bcm63xx_internal_irq_mask, | ||
215 | |||
216 | .mask = bcm63xx_internal_irq_mask, | ||
217 | .mask_ack = bcm63xx_internal_irq_mask, | ||
218 | .unmask = bcm63xx_internal_irq_unmask, | ||
219 | }; | ||
220 | |||
221 | static struct irq_chip bcm63xx_external_irq_chip = { | ||
222 | .name = "bcm63xx_epic", | ||
223 | .startup = bcm63xx_external_irq_startup, | ||
224 | .shutdown = bcm63xx_external_irq_shutdown, | ||
225 | |||
226 | .ack = bcm63xx_external_irq_clear, | ||
227 | |||
228 | .mask = bcm63xx_external_irq_mask, | ||
229 | .unmask = bcm63xx_external_irq_unmask, | ||
230 | |||
231 | .set_type = bcm63xx_external_irq_set_type, | ||
232 | }; | ||
233 | |||
234 | static struct irqaction cpu_ip2_cascade_action = { | ||
235 | .handler = no_action, | ||
236 | .name = "cascade_ip2", | ||
237 | }; | ||
238 | |||
239 | void __init arch_init_irq(void) | ||
240 | { | ||
241 | int i; | ||
242 | |||
243 | mips_cpu_irq_init(); | ||
244 | for (i = IRQ_INTERNAL_BASE; i < NR_IRQS; ++i) | ||
245 | set_irq_chip_and_handler(i, &bcm63xx_internal_irq_chip, | ||
246 | handle_level_irq); | ||
247 | |||
248 | for (i = IRQ_EXT_BASE; i < IRQ_EXT_BASE + 4; ++i) | ||
249 | set_irq_chip_and_handler(i, &bcm63xx_external_irq_chip, | ||
250 | handle_edge_irq); | ||
251 | |||
252 | setup_irq(IRQ_MIPS_BASE + 2, &cpu_ip2_cascade_action); | ||
253 | } | ||
diff --git a/arch/mips/bcm63xx/prom.c b/arch/mips/bcm63xx/prom.c new file mode 100644 index 000000000000..fb284fbc5853 --- /dev/null +++ b/arch/mips/bcm63xx/prom.c | |||
@@ -0,0 +1,55 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | */ | ||
8 | |||
9 | #include <linux/init.h> | ||
10 | #include <linux/bootmem.h> | ||
11 | #include <asm/bootinfo.h> | ||
12 | #include <bcm63xx_board.h> | ||
13 | #include <bcm63xx_cpu.h> | ||
14 | #include <bcm63xx_io.h> | ||
15 | #include <bcm63xx_regs.h> | ||
16 | #include <bcm63xx_gpio.h> | ||
17 | |||
18 | void __init prom_init(void) | ||
19 | { | ||
20 | u32 reg, mask; | ||
21 | |||
22 | bcm63xx_cpu_init(); | ||
23 | |||
24 | /* stop any running watchdog */ | ||
25 | bcm_wdt_writel(WDT_STOP_1, WDT_CTL_REG); | ||
26 | bcm_wdt_writel(WDT_STOP_2, WDT_CTL_REG); | ||
27 | |||
28 | /* disable all hardware blocks clock for now */ | ||
29 | if (BCMCPU_IS_6338()) | ||
30 | mask = CKCTL_6338_ALL_SAFE_EN; | ||
31 | else if (BCMCPU_IS_6345()) | ||
32 | mask = CKCTL_6345_ALL_SAFE_EN; | ||
33 | else if (BCMCPU_IS_6348()) | ||
34 | mask = CKCTL_6348_ALL_SAFE_EN; | ||
35 | else | ||
36 | /* BCMCPU_IS_6358() */ | ||
37 | mask = CKCTL_6358_ALL_SAFE_EN; | ||
38 | |||
39 | reg = bcm_perf_readl(PERF_CKCTL_REG); | ||
40 | reg &= ~mask; | ||
41 | bcm_perf_writel(reg, PERF_CKCTL_REG); | ||
42 | |||
43 | /* assign command line from kernel config */ | ||
44 | strcpy(arcs_cmdline, CONFIG_CMDLINE); | ||
45 | |||
46 | /* register gpiochip */ | ||
47 | bcm63xx_gpio_init(); | ||
48 | |||
49 | /* do low level board init */ | ||
50 | board_prom_init(); | ||
51 | } | ||
52 | |||
53 | void __init prom_free_prom_memory(void) | ||
54 | { | ||
55 | } | ||
diff --git a/arch/mips/bcm63xx/setup.c b/arch/mips/bcm63xx/setup.c new file mode 100644 index 000000000000..b18a0ca926fa --- /dev/null +++ b/arch/mips/bcm63xx/setup.c | |||
@@ -0,0 +1,125 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | */ | ||
8 | |||
9 | #include <linux/init.h> | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/delay.h> | ||
12 | #include <linux/bootmem.h> | ||
13 | #include <linux/ioport.h> | ||
14 | #include <linux/pm.h> | ||
15 | #include <asm/bootinfo.h> | ||
16 | #include <asm/time.h> | ||
17 | #include <asm/reboot.h> | ||
18 | #include <asm/cacheflush.h> | ||
19 | #include <bcm63xx_board.h> | ||
20 | #include <bcm63xx_cpu.h> | ||
21 | #include <bcm63xx_regs.h> | ||
22 | #include <bcm63xx_io.h> | ||
23 | |||
24 | void bcm63xx_machine_halt(void) | ||
25 | { | ||
26 | printk(KERN_INFO "System halted\n"); | ||
27 | while (1) | ||
28 | ; | ||
29 | } | ||
30 | |||
31 | static void bcm6348_a1_reboot(void) | ||
32 | { | ||
33 | u32 reg; | ||
34 | |||
35 | /* soft reset all blocks */ | ||
36 | printk(KERN_INFO "soft-reseting all blocks ...\n"); | ||
37 | reg = bcm_perf_readl(PERF_SOFTRESET_REG); | ||
38 | reg &= ~SOFTRESET_6348_ALL; | ||
39 | bcm_perf_writel(reg, PERF_SOFTRESET_REG); | ||
40 | mdelay(10); | ||
41 | |||
42 | reg = bcm_perf_readl(PERF_SOFTRESET_REG); | ||
43 | reg |= SOFTRESET_6348_ALL; | ||
44 | bcm_perf_writel(reg, PERF_SOFTRESET_REG); | ||
45 | mdelay(10); | ||
46 | |||
47 | /* Jump to the power on address. */ | ||
48 | printk(KERN_INFO "jumping to reset vector.\n"); | ||
49 | /* set high vectors (base at 0xbfc00000 */ | ||
50 | set_c0_status(ST0_BEV | ST0_ERL); | ||
51 | /* run uncached in kseg0 */ | ||
52 | change_c0_config(CONF_CM_CMASK, CONF_CM_UNCACHED); | ||
53 | __flush_cache_all(); | ||
54 | /* remove all wired TLB entries */ | ||
55 | write_c0_wired(0); | ||
56 | __asm__ __volatile__( | ||
57 | "jr\t%0" | ||
58 | : | ||
59 | : "r" (0xbfc00000)); | ||
60 | while (1) | ||
61 | ; | ||
62 | } | ||
63 | |||
64 | void bcm63xx_machine_reboot(void) | ||
65 | { | ||
66 | u32 reg; | ||
67 | |||
68 | /* mask and clear all external irq */ | ||
69 | reg = bcm_perf_readl(PERF_EXTIRQ_CFG_REG); | ||
70 | reg &= ~EXTIRQ_CFG_MASK_ALL; | ||
71 | reg |= EXTIRQ_CFG_CLEAR_ALL; | ||
72 | bcm_perf_writel(reg, PERF_EXTIRQ_CFG_REG); | ||
73 | |||
74 | if (BCMCPU_IS_6348() && (bcm63xx_get_cpu_rev() == 0xa1)) | ||
75 | bcm6348_a1_reboot(); | ||
76 | |||
77 | printk(KERN_INFO "triggering watchdog soft-reset...\n"); | ||
78 | bcm_perf_writel(SYS_PLL_SOFT_RESET, PERF_SYS_PLL_CTL_REG); | ||
79 | while (1) | ||
80 | ; | ||
81 | } | ||
82 | |||
83 | static void __bcm63xx_machine_reboot(char *p) | ||
84 | { | ||
85 | bcm63xx_machine_reboot(); | ||
86 | } | ||
87 | |||
88 | /* | ||
89 | * return system type in /proc/cpuinfo | ||
90 | */ | ||
91 | const char *get_system_type(void) | ||
92 | { | ||
93 | static char buf[128]; | ||
94 | snprintf(buf, sizeof(buf), "bcm63xx/%s (0x%04x/0x%04X)", | ||
95 | board_get_name(), | ||
96 | bcm63xx_get_cpu_id(), bcm63xx_get_cpu_rev()); | ||
97 | return buf; | ||
98 | } | ||
99 | |||
100 | void __init plat_time_init(void) | ||
101 | { | ||
102 | mips_hpt_frequency = bcm63xx_get_cpu_freq() / 2; | ||
103 | } | ||
104 | |||
105 | void __init plat_mem_setup(void) | ||
106 | { | ||
107 | add_memory_region(0, bcm63xx_get_memory_size(), BOOT_MEM_RAM); | ||
108 | |||
109 | _machine_halt = bcm63xx_machine_halt; | ||
110 | _machine_restart = __bcm63xx_machine_reboot; | ||
111 | pm_power_off = bcm63xx_machine_halt; | ||
112 | |||
113 | set_io_port_base(0); | ||
114 | ioport_resource.start = 0; | ||
115 | ioport_resource.end = ~0; | ||
116 | |||
117 | board_setup(); | ||
118 | } | ||
119 | |||
120 | int __init bcm63xx_register_devices(void) | ||
121 | { | ||
122 | return board_register_devices(); | ||
123 | } | ||
124 | |||
125 | arch_initcall(bcm63xx_register_devices); | ||
diff --git a/arch/mips/bcm63xx/timer.c b/arch/mips/bcm63xx/timer.c new file mode 100644 index 000000000000..ba522bdcde4b --- /dev/null +++ b/arch/mips/bcm63xx/timer.c | |||
@@ -0,0 +1,205 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | */ | ||
8 | |||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/err.h> | ||
11 | #include <linux/module.h> | ||
12 | #include <linux/spinlock.h> | ||
13 | #include <linux/interrupt.h> | ||
14 | #include <linux/clk.h> | ||
15 | #include <bcm63xx_cpu.h> | ||
16 | #include <bcm63xx_io.h> | ||
17 | #include <bcm63xx_timer.h> | ||
18 | #include <bcm63xx_regs.h> | ||
19 | |||
20 | static DEFINE_SPINLOCK(timer_reg_lock); | ||
21 | static DEFINE_SPINLOCK(timer_data_lock); | ||
22 | static struct clk *periph_clk; | ||
23 | |||
24 | static struct timer_data { | ||
25 | void (*cb)(void *); | ||
26 | void *data; | ||
27 | } timer_data[BCM63XX_TIMER_COUNT]; | ||
28 | |||
29 | static irqreturn_t timer_interrupt(int irq, void *dev_id) | ||
30 | { | ||
31 | u32 stat; | ||
32 | int i; | ||
33 | |||
34 | spin_lock(&timer_reg_lock); | ||
35 | stat = bcm_timer_readl(TIMER_IRQSTAT_REG); | ||
36 | bcm_timer_writel(stat, TIMER_IRQSTAT_REG); | ||
37 | spin_unlock(&timer_reg_lock); | ||
38 | |||
39 | for (i = 0; i < BCM63XX_TIMER_COUNT; i++) { | ||
40 | if (!(stat & TIMER_IRQSTAT_TIMER_CAUSE(i))) | ||
41 | continue; | ||
42 | |||
43 | spin_lock(&timer_data_lock); | ||
44 | if (!timer_data[i].cb) { | ||
45 | spin_unlock(&timer_data_lock); | ||
46 | continue; | ||
47 | } | ||
48 | |||
49 | timer_data[i].cb(timer_data[i].data); | ||
50 | spin_unlock(&timer_data_lock); | ||
51 | } | ||
52 | |||
53 | return IRQ_HANDLED; | ||
54 | } | ||
55 | |||
56 | int bcm63xx_timer_enable(int id) | ||
57 | { | ||
58 | u32 reg; | ||
59 | unsigned long flags; | ||
60 | |||
61 | if (id >= BCM63XX_TIMER_COUNT) | ||
62 | return -EINVAL; | ||
63 | |||
64 | spin_lock_irqsave(&timer_reg_lock, flags); | ||
65 | |||
66 | reg = bcm_timer_readl(TIMER_CTLx_REG(id)); | ||
67 | reg |= TIMER_CTL_ENABLE_MASK; | ||
68 | bcm_timer_writel(reg, TIMER_CTLx_REG(id)); | ||
69 | |||
70 | reg = bcm_timer_readl(TIMER_IRQSTAT_REG); | ||
71 | reg |= TIMER_IRQSTAT_TIMER_IR_EN(id); | ||
72 | bcm_timer_writel(reg, TIMER_IRQSTAT_REG); | ||
73 | |||
74 | spin_unlock_irqrestore(&timer_reg_lock, flags); | ||
75 | return 0; | ||
76 | } | ||
77 | |||
78 | EXPORT_SYMBOL(bcm63xx_timer_enable); | ||
79 | |||
80 | int bcm63xx_timer_disable(int id) | ||
81 | { | ||
82 | u32 reg; | ||
83 | unsigned long flags; | ||
84 | |||
85 | if (id >= BCM63XX_TIMER_COUNT) | ||
86 | return -EINVAL; | ||
87 | |||
88 | spin_lock_irqsave(&timer_reg_lock, flags); | ||
89 | |||
90 | reg = bcm_timer_readl(TIMER_CTLx_REG(id)); | ||
91 | reg &= ~TIMER_CTL_ENABLE_MASK; | ||
92 | bcm_timer_writel(reg, TIMER_CTLx_REG(id)); | ||
93 | |||
94 | reg = bcm_timer_readl(TIMER_IRQSTAT_REG); | ||
95 | reg &= ~TIMER_IRQSTAT_TIMER_IR_EN(id); | ||
96 | bcm_timer_writel(reg, TIMER_IRQSTAT_REG); | ||
97 | |||
98 | spin_unlock_irqrestore(&timer_reg_lock, flags); | ||
99 | return 0; | ||
100 | } | ||
101 | |||
102 | EXPORT_SYMBOL(bcm63xx_timer_disable); | ||
103 | |||
104 | int bcm63xx_timer_register(int id, void (*callback)(void *data), void *data) | ||
105 | { | ||
106 | unsigned long flags; | ||
107 | int ret; | ||
108 | |||
109 | if (id >= BCM63XX_TIMER_COUNT || !callback) | ||
110 | return -EINVAL; | ||
111 | |||
112 | ret = 0; | ||
113 | spin_lock_irqsave(&timer_data_lock, flags); | ||
114 | if (timer_data[id].cb) { | ||
115 | ret = -EBUSY; | ||
116 | goto out; | ||
117 | } | ||
118 | |||
119 | timer_data[id].cb = callback; | ||
120 | timer_data[id].data = data; | ||
121 | |||
122 | out: | ||
123 | spin_unlock_irqrestore(&timer_data_lock, flags); | ||
124 | return ret; | ||
125 | } | ||
126 | |||
127 | EXPORT_SYMBOL(bcm63xx_timer_register); | ||
128 | |||
129 | void bcm63xx_timer_unregister(int id) | ||
130 | { | ||
131 | unsigned long flags; | ||
132 | |||
133 | if (id >= BCM63XX_TIMER_COUNT) | ||
134 | return; | ||
135 | |||
136 | spin_lock_irqsave(&timer_data_lock, flags); | ||
137 | timer_data[id].cb = NULL; | ||
138 | spin_unlock_irqrestore(&timer_data_lock, flags); | ||
139 | } | ||
140 | |||
141 | EXPORT_SYMBOL(bcm63xx_timer_unregister); | ||
142 | |||
143 | unsigned int bcm63xx_timer_countdown(unsigned int countdown_us) | ||
144 | { | ||
145 | return (clk_get_rate(periph_clk) / (1000 * 1000)) * countdown_us; | ||
146 | } | ||
147 | |||
148 | EXPORT_SYMBOL(bcm63xx_timer_countdown); | ||
149 | |||
150 | int bcm63xx_timer_set(int id, int monotonic, unsigned int countdown_us) | ||
151 | { | ||
152 | u32 reg, countdown; | ||
153 | unsigned long flags; | ||
154 | |||
155 | if (id >= BCM63XX_TIMER_COUNT) | ||
156 | return -EINVAL; | ||
157 | |||
158 | countdown = bcm63xx_timer_countdown(countdown_us); | ||
159 | if (countdown & ~TIMER_CTL_COUNTDOWN_MASK) | ||
160 | return -EINVAL; | ||
161 | |||
162 | spin_lock_irqsave(&timer_reg_lock, flags); | ||
163 | reg = bcm_timer_readl(TIMER_CTLx_REG(id)); | ||
164 | |||
165 | if (monotonic) | ||
166 | reg &= ~TIMER_CTL_MONOTONIC_MASK; | ||
167 | else | ||
168 | reg |= TIMER_CTL_MONOTONIC_MASK; | ||
169 | |||
170 | reg &= ~TIMER_CTL_COUNTDOWN_MASK; | ||
171 | reg |= countdown; | ||
172 | bcm_timer_writel(reg, TIMER_CTLx_REG(id)); | ||
173 | |||
174 | spin_unlock_irqrestore(&timer_reg_lock, flags); | ||
175 | return 0; | ||
176 | } | ||
177 | |||
178 | EXPORT_SYMBOL(bcm63xx_timer_set); | ||
179 | |||
180 | int bcm63xx_timer_init(void) | ||
181 | { | ||
182 | int ret, irq; | ||
183 | u32 reg; | ||
184 | |||
185 | reg = bcm_timer_readl(TIMER_IRQSTAT_REG); | ||
186 | reg &= ~TIMER_IRQSTAT_TIMER0_IR_EN; | ||
187 | reg &= ~TIMER_IRQSTAT_TIMER1_IR_EN; | ||
188 | reg &= ~TIMER_IRQSTAT_TIMER2_IR_EN; | ||
189 | bcm_timer_writel(reg, TIMER_IRQSTAT_REG); | ||
190 | |||
191 | periph_clk = clk_get(NULL, "periph"); | ||
192 | if (IS_ERR(periph_clk)) | ||
193 | return -ENODEV; | ||
194 | |||
195 | irq = bcm63xx_get_irq_number(IRQ_TIMER); | ||
196 | ret = request_irq(irq, timer_interrupt, 0, "bcm63xx_timer", NULL); | ||
197 | if (ret) { | ||
198 | printk(KERN_ERR "bcm63xx_timer: failed to register irq\n"); | ||
199 | return ret; | ||
200 | } | ||
201 | |||
202 | return 0; | ||
203 | } | ||
204 | |||
205 | arch_initcall(bcm63xx_timer_init); | ||
diff --git a/arch/mips/configs/bcm63xx_defconfig b/arch/mips/configs/bcm63xx_defconfig new file mode 100644 index 000000000000..ea00c18d1f7b --- /dev/null +++ b/arch/mips/configs/bcm63xx_defconfig | |||
@@ -0,0 +1,972 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.30-rc6 | ||
4 | # Sun May 31 20:17:18 2009 | ||
5 | # | ||
6 | CONFIG_MIPS=y | ||
7 | |||
8 | # | ||
9 | # Machine selection | ||
10 | # | ||
11 | # CONFIG_MACH_ALCHEMY is not set | ||
12 | # CONFIG_BASLER_EXCITE is not set | ||
13 | # CONFIG_BCM47XX is not set | ||
14 | CONFIG_BCM63XX=y | ||
15 | # CONFIG_MIPS_COBALT is not set | ||
16 | # CONFIG_MACH_DECSTATION is not set | ||
17 | # CONFIG_MACH_JAZZ is not set | ||
18 | # CONFIG_LASAT is not set | ||
19 | # CONFIG_LEMOTE_FULONG is not set | ||
20 | # CONFIG_MIPS_MALTA is not set | ||
21 | # CONFIG_MIPS_SIM is not set | ||
22 | # CONFIG_NEC_MARKEINS is not set | ||
23 | # CONFIG_MACH_VR41XX is not set | ||
24 | # CONFIG_NXP_STB220 is not set | ||
25 | # CONFIG_NXP_STB225 is not set | ||
26 | # CONFIG_PNX8550_JBS is not set | ||
27 | # CONFIG_PNX8550_STB810 is not set | ||
28 | # CONFIG_PMC_MSP is not set | ||
29 | # CONFIG_PMC_YOSEMITE is not set | ||
30 | # CONFIG_SGI_IP22 is not set | ||
31 | # CONFIG_SGI_IP27 is not set | ||
32 | # CONFIG_SGI_IP28 is not set | ||
33 | # CONFIG_SGI_IP32 is not set | ||
34 | # CONFIG_SIBYTE_CRHINE is not set | ||
35 | # CONFIG_SIBYTE_CARMEL is not set | ||
36 | # CONFIG_SIBYTE_CRHONE is not set | ||
37 | # CONFIG_SIBYTE_RHONE is not set | ||
38 | # CONFIG_SIBYTE_SWARM is not set | ||
39 | # CONFIG_SIBYTE_LITTLESUR is not set | ||
40 | # CONFIG_SIBYTE_SENTOSA is not set | ||
41 | # CONFIG_SIBYTE_BIGSUR is not set | ||
42 | # CONFIG_SNI_RM is not set | ||
43 | # CONFIG_MACH_TX39XX is not set | ||
44 | # CONFIG_MACH_TX49XX is not set | ||
45 | # CONFIG_MIKROTIK_RB532 is not set | ||
46 | # CONFIG_WR_PPMC is not set | ||
47 | # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set | ||
48 | # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set | ||
49 | |||
50 | # | ||
51 | # CPU support | ||
52 | # | ||
53 | CONFIG_BCM63XX_CPU_6348=y | ||
54 | CONFIG_BCM63XX_CPU_6358=y | ||
55 | CONFIG_BOARD_BCM963XX=y | ||
56 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
57 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
58 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
59 | CONFIG_ARCH_SUPPORTS_OPROFILE=y | ||
60 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
61 | CONFIG_GENERIC_HWEIGHT=y | ||
62 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
63 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
64 | CONFIG_GENERIC_TIME=y | ||
65 | CONFIG_GENERIC_CMOS_UPDATE=y | ||
66 | CONFIG_SCHED_OMIT_FRAME_POINTER=y | ||
67 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
68 | CONFIG_CEVT_R4K_LIB=y | ||
69 | CONFIG_CEVT_R4K=y | ||
70 | CONFIG_CSRC_R4K_LIB=y | ||
71 | CONFIG_CSRC_R4K=y | ||
72 | CONFIG_DMA_NONCOHERENT=y | ||
73 | CONFIG_DMA_NEED_PCI_MAP_STATE=y | ||
74 | CONFIG_EARLY_PRINTK=y | ||
75 | CONFIG_SYS_HAS_EARLY_PRINTK=y | ||
76 | # CONFIG_HOTPLUG_CPU is not set | ||
77 | # CONFIG_NO_IOPORT is not set | ||
78 | CONFIG_GENERIC_GPIO=y | ||
79 | CONFIG_CPU_BIG_ENDIAN=y | ||
80 | # CONFIG_CPU_LITTLE_ENDIAN is not set | ||
81 | CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y | ||
82 | CONFIG_IRQ_CPU=y | ||
83 | CONFIG_SWAP_IO_SPACE=y | ||
84 | CONFIG_MIPS_L1_CACHE_SHIFT=5 | ||
85 | |||
86 | # | ||
87 | # CPU selection | ||
88 | # | ||
89 | # CONFIG_CPU_LOONGSON2 is not set | ||
90 | CONFIG_CPU_MIPS32_R1=y | ||
91 | # CONFIG_CPU_MIPS32_R2 is not set | ||
92 | # CONFIG_CPU_MIPS64_R1 is not set | ||
93 | # CONFIG_CPU_MIPS64_R2 is not set | ||
94 | # CONFIG_CPU_R3000 is not set | ||
95 | # CONFIG_CPU_TX39XX is not set | ||
96 | # CONFIG_CPU_VR41XX is not set | ||
97 | # CONFIG_CPU_R4300 is not set | ||
98 | # CONFIG_CPU_R4X00 is not set | ||
99 | # CONFIG_CPU_TX49XX is not set | ||
100 | # CONFIG_CPU_R5000 is not set | ||
101 | # CONFIG_CPU_R5432 is not set | ||
102 | # CONFIG_CPU_R5500 is not set | ||
103 | # CONFIG_CPU_R6000 is not set | ||
104 | # CONFIG_CPU_NEVADA is not set | ||
105 | # CONFIG_CPU_R8000 is not set | ||
106 | # CONFIG_CPU_R10000 is not set | ||
107 | # CONFIG_CPU_RM7000 is not set | ||
108 | # CONFIG_CPU_RM9000 is not set | ||
109 | # CONFIG_CPU_SB1 is not set | ||
110 | # CONFIG_CPU_CAVIUM_OCTEON is not set | ||
111 | CONFIG_SYS_HAS_CPU_MIPS32_R1=y | ||
112 | CONFIG_CPU_MIPS32=y | ||
113 | CONFIG_CPU_MIPSR1=y | ||
114 | CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y | ||
115 | CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y | ||
116 | CONFIG_HARDWARE_WATCHPOINTS=y | ||
117 | |||
118 | # | ||
119 | # Kernel type | ||
120 | # | ||
121 | CONFIG_32BIT=y | ||
122 | # CONFIG_64BIT is not set | ||
123 | CONFIG_PAGE_SIZE_4KB=y | ||
124 | # CONFIG_PAGE_SIZE_8KB is not set | ||
125 | # CONFIG_PAGE_SIZE_16KB is not set | ||
126 | # CONFIG_PAGE_SIZE_32KB is not set | ||
127 | # CONFIG_PAGE_SIZE_64KB is not set | ||
128 | CONFIG_CPU_HAS_PREFETCH=y | ||
129 | CONFIG_MIPS_MT_DISABLED=y | ||
130 | # CONFIG_MIPS_MT_SMP is not set | ||
131 | # CONFIG_MIPS_MT_SMTC is not set | ||
132 | CONFIG_CPU_HAS_LLSC=y | ||
133 | CONFIG_CPU_HAS_SYNC=y | ||
134 | CONFIG_GENERIC_HARDIRQS=y | ||
135 | CONFIG_GENERIC_IRQ_PROBE=y | ||
136 | CONFIG_CPU_SUPPORTS_HIGHMEM=y | ||
137 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
138 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
139 | CONFIG_SELECT_MEMORY_MODEL=y | ||
140 | CONFIG_FLATMEM_MANUAL=y | ||
141 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
142 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
143 | CONFIG_FLATMEM=y | ||
144 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
145 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
146 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
147 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
148 | CONFIG_ZONE_DMA_FLAG=0 | ||
149 | CONFIG_VIRT_TO_BUS=y | ||
150 | CONFIG_UNEVICTABLE_LRU=y | ||
151 | CONFIG_HAVE_MLOCK=y | ||
152 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | ||
153 | CONFIG_TICK_ONESHOT=y | ||
154 | CONFIG_NO_HZ=y | ||
155 | # CONFIG_HIGH_RES_TIMERS is not set | ||
156 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
157 | # CONFIG_HZ_48 is not set | ||
158 | # CONFIG_HZ_100 is not set | ||
159 | # CONFIG_HZ_128 is not set | ||
160 | CONFIG_HZ_250=y | ||
161 | # CONFIG_HZ_256 is not set | ||
162 | # CONFIG_HZ_1000 is not set | ||
163 | # CONFIG_HZ_1024 is not set | ||
164 | CONFIG_SYS_SUPPORTS_ARBIT_HZ=y | ||
165 | CONFIG_HZ=250 | ||
166 | CONFIG_PREEMPT_NONE=y | ||
167 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
168 | # CONFIG_PREEMPT is not set | ||
169 | # CONFIG_KEXEC is not set | ||
170 | # CONFIG_SECCOMP is not set | ||
171 | CONFIG_LOCKDEP_SUPPORT=y | ||
172 | CONFIG_STACKTRACE_SUPPORT=y | ||
173 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
174 | |||
175 | # | ||
176 | # General setup | ||
177 | # | ||
178 | CONFIG_EXPERIMENTAL=y | ||
179 | CONFIG_BROKEN_ON_SMP=y | ||
180 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
181 | CONFIG_LOCALVERSION="" | ||
182 | # CONFIG_LOCALVERSION_AUTO is not set | ||
183 | # CONFIG_SWAP is not set | ||
184 | # CONFIG_SYSVIPC is not set | ||
185 | # CONFIG_POSIX_MQUEUE is not set | ||
186 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
187 | # CONFIG_TASKSTATS is not set | ||
188 | # CONFIG_AUDIT is not set | ||
189 | |||
190 | # | ||
191 | # RCU Subsystem | ||
192 | # | ||
193 | CONFIG_CLASSIC_RCU=y | ||
194 | # CONFIG_TREE_RCU is not set | ||
195 | # CONFIG_PREEMPT_RCU is not set | ||
196 | # CONFIG_TREE_RCU_TRACE is not set | ||
197 | # CONFIG_PREEMPT_RCU_TRACE is not set | ||
198 | # CONFIG_IKCONFIG is not set | ||
199 | CONFIG_LOG_BUF_SHIFT=17 | ||
200 | # CONFIG_GROUP_SCHED is not set | ||
201 | # CONFIG_CGROUPS is not set | ||
202 | CONFIG_SYSFS_DEPRECATED=y | ||
203 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
204 | # CONFIG_RELAY is not set | ||
205 | # CONFIG_NAMESPACES is not set | ||
206 | # CONFIG_BLK_DEV_INITRD is not set | ||
207 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
208 | CONFIG_SYSCTL=y | ||
209 | CONFIG_EMBEDDED=y | ||
210 | CONFIG_SYSCTL_SYSCALL=y | ||
211 | CONFIG_KALLSYMS=y | ||
212 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
213 | # CONFIG_STRIP_ASM_SYMS is not set | ||
214 | CONFIG_HOTPLUG=y | ||
215 | CONFIG_PRINTK=y | ||
216 | CONFIG_BUG=y | ||
217 | CONFIG_ELF_CORE=y | ||
218 | # CONFIG_PCSPKR_PLATFORM is not set | ||
219 | CONFIG_BASE_FULL=y | ||
220 | # CONFIG_FUTEX is not set | ||
221 | # CONFIG_EPOLL is not set | ||
222 | # CONFIG_SIGNALFD is not set | ||
223 | # CONFIG_TIMERFD is not set | ||
224 | # CONFIG_EVENTFD is not set | ||
225 | # CONFIG_SHMEM is not set | ||
226 | # CONFIG_AIO is not set | ||
227 | # CONFIG_VM_EVENT_COUNTERS is not set | ||
228 | CONFIG_PCI_QUIRKS=y | ||
229 | # CONFIG_SLUB_DEBUG is not set | ||
230 | CONFIG_COMPAT_BRK=y | ||
231 | # CONFIG_SLAB is not set | ||
232 | CONFIG_SLUB=y | ||
233 | # CONFIG_SLOB is not set | ||
234 | # CONFIG_PROFILING is not set | ||
235 | # CONFIG_MARKERS is not set | ||
236 | CONFIG_HAVE_OPROFILE=y | ||
237 | # CONFIG_SLOW_WORK is not set | ||
238 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | ||
239 | CONFIG_BASE_SMALL=0 | ||
240 | # CONFIG_MODULES is not set | ||
241 | CONFIG_BLOCK=y | ||
242 | # CONFIG_LBD is not set | ||
243 | # CONFIG_BLK_DEV_BSG is not set | ||
244 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
245 | |||
246 | # | ||
247 | # IO Schedulers | ||
248 | # | ||
249 | CONFIG_IOSCHED_NOOP=y | ||
250 | # CONFIG_IOSCHED_AS is not set | ||
251 | # CONFIG_IOSCHED_DEADLINE is not set | ||
252 | # CONFIG_IOSCHED_CFQ is not set | ||
253 | # CONFIG_DEFAULT_AS is not set | ||
254 | # CONFIG_DEFAULT_DEADLINE is not set | ||
255 | # CONFIG_DEFAULT_CFQ is not set | ||
256 | CONFIG_DEFAULT_NOOP=y | ||
257 | CONFIG_DEFAULT_IOSCHED="noop" | ||
258 | # CONFIG_FREEZER is not set | ||
259 | |||
260 | # | ||
261 | # Bus options (PCI, PCMCIA, EISA, ISA, TC) | ||
262 | # | ||
263 | CONFIG_HW_HAS_PCI=y | ||
264 | CONFIG_PCI=y | ||
265 | CONFIG_PCI_DOMAINS=y | ||
266 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
267 | # CONFIG_PCI_LEGACY is not set | ||
268 | # CONFIG_PCI_STUB is not set | ||
269 | # CONFIG_PCI_IOV is not set | ||
270 | CONFIG_MMU=y | ||
271 | CONFIG_PCCARD=y | ||
272 | # CONFIG_PCMCIA_DEBUG is not set | ||
273 | CONFIG_PCMCIA=y | ||
274 | CONFIG_PCMCIA_LOAD_CIS=y | ||
275 | CONFIG_PCMCIA_IOCTL=y | ||
276 | CONFIG_CARDBUS=y | ||
277 | |||
278 | # | ||
279 | # PC-card bridges | ||
280 | # | ||
281 | # CONFIG_YENTA is not set | ||
282 | # CONFIG_PD6729 is not set | ||
283 | # CONFIG_I82092 is not set | ||
284 | CONFIG_PCMCIA_BCM63XX=y | ||
285 | # CONFIG_HOTPLUG_PCI is not set | ||
286 | |||
287 | # | ||
288 | # Executable file formats | ||
289 | # | ||
290 | CONFIG_BINFMT_ELF=y | ||
291 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
292 | # CONFIG_HAVE_AOUT is not set | ||
293 | # CONFIG_BINFMT_MISC is not set | ||
294 | CONFIG_TRAD_SIGNALS=y | ||
295 | |||
296 | # | ||
297 | # Power management options | ||
298 | # | ||
299 | CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||
300 | # CONFIG_PM is not set | ||
301 | CONFIG_NET=y | ||
302 | |||
303 | # | ||
304 | # Networking options | ||
305 | # | ||
306 | # CONFIG_PACKET is not set | ||
307 | CONFIG_UNIX=y | ||
308 | # CONFIG_NET_KEY is not set | ||
309 | CONFIG_INET=y | ||
310 | # CONFIG_IP_MULTICAST is not set | ||
311 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
312 | CONFIG_IP_FIB_HASH=y | ||
313 | # CONFIG_IP_PNP is not set | ||
314 | # CONFIG_NET_IPIP is not set | ||
315 | # CONFIG_NET_IPGRE is not set | ||
316 | # CONFIG_ARPD is not set | ||
317 | # CONFIG_SYN_COOKIES is not set | ||
318 | # CONFIG_INET_AH is not set | ||
319 | # CONFIG_INET_ESP is not set | ||
320 | # CONFIG_INET_IPCOMP is not set | ||
321 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
322 | # CONFIG_INET_TUNNEL is not set | ||
323 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
324 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
325 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
326 | # CONFIG_INET_LRO is not set | ||
327 | # CONFIG_INET_DIAG is not set | ||
328 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
329 | CONFIG_TCP_CONG_CUBIC=y | ||
330 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
331 | # CONFIG_TCP_MD5SIG is not set | ||
332 | # CONFIG_IPV6 is not set | ||
333 | # CONFIG_NETWORK_SECMARK is not set | ||
334 | # CONFIG_NETFILTER is not set | ||
335 | # CONFIG_IP_DCCP is not set | ||
336 | # CONFIG_IP_SCTP is not set | ||
337 | # CONFIG_TIPC is not set | ||
338 | # CONFIG_ATM is not set | ||
339 | # CONFIG_BRIDGE is not set | ||
340 | # CONFIG_NET_DSA is not set | ||
341 | # CONFIG_VLAN_8021Q is not set | ||
342 | # CONFIG_DECNET is not set | ||
343 | # CONFIG_LLC2 is not set | ||
344 | # CONFIG_IPX is not set | ||
345 | # CONFIG_ATALK is not set | ||
346 | # CONFIG_X25 is not set | ||
347 | # CONFIG_LAPB is not set | ||
348 | # CONFIG_ECONET is not set | ||
349 | # CONFIG_WAN_ROUTER is not set | ||
350 | # CONFIG_PHONET is not set | ||
351 | # CONFIG_NET_SCHED is not set | ||
352 | # CONFIG_DCB is not set | ||
353 | |||
354 | # | ||
355 | # Network testing | ||
356 | # | ||
357 | # CONFIG_NET_PKTGEN is not set | ||
358 | # CONFIG_HAMRADIO is not set | ||
359 | # CONFIG_CAN is not set | ||
360 | # CONFIG_IRDA is not set | ||
361 | # CONFIG_BT is not set | ||
362 | # CONFIG_AF_RXRPC is not set | ||
363 | # CONFIG_WIRELESS is not set | ||
364 | # CONFIG_WIMAX is not set | ||
365 | # CONFIG_RFKILL is not set | ||
366 | # CONFIG_NET_9P is not set | ||
367 | |||
368 | # | ||
369 | # Device Drivers | ||
370 | # | ||
371 | |||
372 | # | ||
373 | # Generic Driver Options | ||
374 | # | ||
375 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
376 | # CONFIG_STANDALONE is not set | ||
377 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | ||
378 | CONFIG_FW_LOADER=y | ||
379 | CONFIG_FIRMWARE_IN_KERNEL=y | ||
380 | CONFIG_EXTRA_FIRMWARE="" | ||
381 | # CONFIG_SYS_HYPERVISOR is not set | ||
382 | # CONFIG_CONNECTOR is not set | ||
383 | CONFIG_MTD=y | ||
384 | # CONFIG_MTD_DEBUG is not set | ||
385 | # CONFIG_MTD_CONCAT is not set | ||
386 | CONFIG_MTD_PARTITIONS=y | ||
387 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
388 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
389 | # CONFIG_MTD_AR7_PARTS is not set | ||
390 | |||
391 | # | ||
392 | # User Modules And Translation Layers | ||
393 | # | ||
394 | # CONFIG_MTD_CHAR is not set | ||
395 | # CONFIG_MTD_BLKDEVS is not set | ||
396 | # CONFIG_MTD_BLOCK is not set | ||
397 | # CONFIG_MTD_BLOCK_RO is not set | ||
398 | # CONFIG_FTL is not set | ||
399 | # CONFIG_NFTL is not set | ||
400 | # CONFIG_INFTL is not set | ||
401 | # CONFIG_RFD_FTL is not set | ||
402 | # CONFIG_SSFDC is not set | ||
403 | # CONFIG_MTD_OOPS is not set | ||
404 | |||
405 | # | ||
406 | # RAM/ROM/Flash chip drivers | ||
407 | # | ||
408 | CONFIG_MTD_CFI=y | ||
409 | # CONFIG_MTD_JEDECPROBE is not set | ||
410 | CONFIG_MTD_GEN_PROBE=y | ||
411 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
412 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
413 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
414 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
415 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
416 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
417 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
418 | CONFIG_MTD_CFI_I1=y | ||
419 | CONFIG_MTD_CFI_I2=y | ||
420 | # CONFIG_MTD_CFI_I4 is not set | ||
421 | # CONFIG_MTD_CFI_I8 is not set | ||
422 | CONFIG_MTD_CFI_INTELEXT=y | ||
423 | CONFIG_MTD_CFI_AMDSTD=y | ||
424 | # CONFIG_MTD_CFI_STAA is not set | ||
425 | CONFIG_MTD_CFI_UTIL=y | ||
426 | # CONFIG_MTD_RAM is not set | ||
427 | # CONFIG_MTD_ROM is not set | ||
428 | # CONFIG_MTD_ABSENT is not set | ||
429 | |||
430 | # | ||
431 | # Mapping drivers for chip access | ||
432 | # | ||
433 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
434 | CONFIG_MTD_PHYSMAP=y | ||
435 | # CONFIG_MTD_PHYSMAP_COMPAT is not set | ||
436 | # CONFIG_MTD_INTEL_VR_NOR is not set | ||
437 | # CONFIG_MTD_PLATRAM is not set | ||
438 | |||
439 | # | ||
440 | # Self-contained MTD device drivers | ||
441 | # | ||
442 | # CONFIG_MTD_PMC551 is not set | ||
443 | # CONFIG_MTD_SLRAM is not set | ||
444 | # CONFIG_MTD_PHRAM is not set | ||
445 | # CONFIG_MTD_MTDRAM is not set | ||
446 | # CONFIG_MTD_BLOCK2MTD is not set | ||
447 | |||
448 | # | ||
449 | # Disk-On-Chip Device Drivers | ||
450 | # | ||
451 | # CONFIG_MTD_DOC2000 is not set | ||
452 | # CONFIG_MTD_DOC2001 is not set | ||
453 | # CONFIG_MTD_DOC2001PLUS is not set | ||
454 | # CONFIG_MTD_NAND is not set | ||
455 | # CONFIG_MTD_ONENAND is not set | ||
456 | |||
457 | # | ||
458 | # LPDDR flash memory drivers | ||
459 | # | ||
460 | # CONFIG_MTD_LPDDR is not set | ||
461 | |||
462 | # | ||
463 | # UBI - Unsorted block images | ||
464 | # | ||
465 | # CONFIG_MTD_UBI is not set | ||
466 | # CONFIG_PARPORT is not set | ||
467 | # CONFIG_BLK_DEV is not set | ||
468 | # CONFIG_MISC_DEVICES is not set | ||
469 | CONFIG_HAVE_IDE=y | ||
470 | # CONFIG_IDE is not set | ||
471 | |||
472 | # | ||
473 | # SCSI device support | ||
474 | # | ||
475 | # CONFIG_RAID_ATTRS is not set | ||
476 | # CONFIG_SCSI is not set | ||
477 | # CONFIG_SCSI_DMA is not set | ||
478 | # CONFIG_SCSI_NETLINK is not set | ||
479 | # CONFIG_ATA is not set | ||
480 | # CONFIG_MD is not set | ||
481 | # CONFIG_FUSION is not set | ||
482 | |||
483 | # | ||
484 | # IEEE 1394 (FireWire) support | ||
485 | # | ||
486 | |||
487 | # | ||
488 | # Enable only one of the two stacks, unless you know what you are doing | ||
489 | # | ||
490 | # CONFIG_FIREWIRE is not set | ||
491 | # CONFIG_IEEE1394 is not set | ||
492 | # CONFIG_I2O is not set | ||
493 | CONFIG_NETDEVICES=y | ||
494 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
495 | # CONFIG_DUMMY is not set | ||
496 | # CONFIG_BONDING is not set | ||
497 | # CONFIG_MACVLAN is not set | ||
498 | # CONFIG_EQUALIZER is not set | ||
499 | # CONFIG_TUN is not set | ||
500 | # CONFIG_VETH is not set | ||
501 | # CONFIG_ARCNET is not set | ||
502 | CONFIG_PHYLIB=y | ||
503 | |||
504 | # | ||
505 | # MII PHY device drivers | ||
506 | # | ||
507 | # CONFIG_MARVELL_PHY is not set | ||
508 | # CONFIG_DAVICOM_PHY is not set | ||
509 | # CONFIG_QSEMI_PHY is not set | ||
510 | # CONFIG_LXT_PHY is not set | ||
511 | # CONFIG_CICADA_PHY is not set | ||
512 | # CONFIG_VITESSE_PHY is not set | ||
513 | # CONFIG_SMSC_PHY is not set | ||
514 | # CONFIG_BROADCOM_PHY is not set | ||
515 | CONFIG_BCM63XX_PHY=y | ||
516 | # CONFIG_ICPLUS_PHY is not set | ||
517 | # CONFIG_REALTEK_PHY is not set | ||
518 | # CONFIG_NATIONAL_PHY is not set | ||
519 | # CONFIG_STE10XP is not set | ||
520 | # CONFIG_LSI_ET1011C_PHY is not set | ||
521 | # CONFIG_FIXED_PHY is not set | ||
522 | # CONFIG_MDIO_BITBANG is not set | ||
523 | CONFIG_NET_ETHERNET=y | ||
524 | CONFIG_MII=y | ||
525 | # CONFIG_AX88796 is not set | ||
526 | # CONFIG_HAPPYMEAL is not set | ||
527 | # CONFIG_SUNGEM is not set | ||
528 | # CONFIG_CASSINI is not set | ||
529 | # CONFIG_NET_VENDOR_3COM is not set | ||
530 | # CONFIG_SMC91X is not set | ||
531 | # CONFIG_DM9000 is not set | ||
532 | # CONFIG_ETHOC is not set | ||
533 | # CONFIG_DNET is not set | ||
534 | # CONFIG_NET_TULIP is not set | ||
535 | # CONFIG_HP100 is not set | ||
536 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
537 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
538 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
539 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
540 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
541 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
542 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
543 | # CONFIG_NET_PCI is not set | ||
544 | # CONFIG_B44 is not set | ||
545 | # CONFIG_ATL2 is not set | ||
546 | CONFIG_BCM63XX_ENET=y | ||
547 | # CONFIG_NETDEV_1000 is not set | ||
548 | # CONFIG_NETDEV_10000 is not set | ||
549 | # CONFIG_TR is not set | ||
550 | |||
551 | # | ||
552 | # Wireless LAN | ||
553 | # | ||
554 | # CONFIG_WLAN_PRE80211 is not set | ||
555 | # CONFIG_WLAN_80211 is not set | ||
556 | |||
557 | # | ||
558 | # Enable WiMAX (Networking options) to see the WiMAX drivers | ||
559 | # | ||
560 | |||
561 | # | ||
562 | # USB Network Adapters | ||
563 | # | ||
564 | # CONFIG_USB_CATC is not set | ||
565 | # CONFIG_USB_KAWETH is not set | ||
566 | # CONFIG_USB_PEGASUS is not set | ||
567 | # CONFIG_USB_RTL8150 is not set | ||
568 | # CONFIG_USB_USBNET is not set | ||
569 | # CONFIG_NET_PCMCIA is not set | ||
570 | # CONFIG_WAN is not set | ||
571 | # CONFIG_FDDI is not set | ||
572 | # CONFIG_HIPPI is not set | ||
573 | # CONFIG_PPP is not set | ||
574 | # CONFIG_SLIP is not set | ||
575 | # CONFIG_NETCONSOLE is not set | ||
576 | # CONFIG_NETPOLL is not set | ||
577 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
578 | # CONFIG_ISDN is not set | ||
579 | # CONFIG_PHONE is not set | ||
580 | |||
581 | # | ||
582 | # Input device support | ||
583 | # | ||
584 | # CONFIG_INPUT is not set | ||
585 | |||
586 | # | ||
587 | # Hardware I/O ports | ||
588 | # | ||
589 | # CONFIG_SERIO is not set | ||
590 | # CONFIG_GAMEPORT is not set | ||
591 | |||
592 | # | ||
593 | # Character devices | ||
594 | # | ||
595 | # CONFIG_VT is not set | ||
596 | # CONFIG_DEVKMEM is not set | ||
597 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
598 | # CONFIG_NOZOMI is not set | ||
599 | |||
600 | # | ||
601 | # Serial drivers | ||
602 | # | ||
603 | # CONFIG_SERIAL_8250 is not set | ||
604 | |||
605 | # | ||
606 | # Non-8250 serial port support | ||
607 | # | ||
608 | CONFIG_SERIAL_CORE=y | ||
609 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
610 | # CONFIG_SERIAL_JSM is not set | ||
611 | CONFIG_SERIAL_BCM63XX=y | ||
612 | CONFIG_SERIAL_BCM63XX_CONSOLE=y | ||
613 | # CONFIG_UNIX98_PTYS is not set | ||
614 | CONFIG_LEGACY_PTYS=y | ||
615 | CONFIG_LEGACY_PTY_COUNT=256 | ||
616 | # CONFIG_IPMI_HANDLER is not set | ||
617 | # CONFIG_HW_RANDOM is not set | ||
618 | # CONFIG_R3964 is not set | ||
619 | # CONFIG_APPLICOM is not set | ||
620 | |||
621 | # | ||
622 | # PCMCIA character devices | ||
623 | # | ||
624 | # CONFIG_SYNCLINK_CS is not set | ||
625 | # CONFIG_CARDMAN_4000 is not set | ||
626 | # CONFIG_CARDMAN_4040 is not set | ||
627 | # CONFIG_IPWIRELESS is not set | ||
628 | # CONFIG_RAW_DRIVER is not set | ||
629 | # CONFIG_TCG_TPM is not set | ||
630 | CONFIG_DEVPORT=y | ||
631 | # CONFIG_I2C is not set | ||
632 | # CONFIG_SPI is not set | ||
633 | CONFIG_ARCH_REQUIRE_GPIOLIB=y | ||
634 | CONFIG_GPIOLIB=y | ||
635 | # CONFIG_GPIO_SYSFS is not set | ||
636 | |||
637 | # | ||
638 | # Memory mapped GPIO expanders: | ||
639 | # | ||
640 | |||
641 | # | ||
642 | # I2C GPIO expanders: | ||
643 | # | ||
644 | |||
645 | # | ||
646 | # PCI GPIO expanders: | ||
647 | # | ||
648 | # CONFIG_GPIO_BT8XX is not set | ||
649 | |||
650 | # | ||
651 | # SPI GPIO expanders: | ||
652 | # | ||
653 | # CONFIG_W1 is not set | ||
654 | # CONFIG_POWER_SUPPLY is not set | ||
655 | # CONFIG_HWMON is not set | ||
656 | # CONFIG_THERMAL is not set | ||
657 | # CONFIG_THERMAL_HWMON is not set | ||
658 | # CONFIG_WATCHDOG is not set | ||
659 | CONFIG_SSB_POSSIBLE=y | ||
660 | |||
661 | # | ||
662 | # Sonics Silicon Backplane | ||
663 | # | ||
664 | CONFIG_SSB=y | ||
665 | CONFIG_SSB_SPROM=y | ||
666 | CONFIG_SSB_PCIHOST_POSSIBLE=y | ||
667 | CONFIG_SSB_PCIHOST=y | ||
668 | # CONFIG_SSB_B43_PCI_BRIDGE is not set | ||
669 | CONFIG_SSB_PCMCIAHOST_POSSIBLE=y | ||
670 | # CONFIG_SSB_PCMCIAHOST is not set | ||
671 | # CONFIG_SSB_SILENT is not set | ||
672 | # CONFIG_SSB_DEBUG is not set | ||
673 | CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y | ||
674 | # CONFIG_SSB_DRIVER_PCICORE is not set | ||
675 | # CONFIG_SSB_DRIVER_MIPS is not set | ||
676 | |||
677 | # | ||
678 | # Multifunction device drivers | ||
679 | # | ||
680 | # CONFIG_MFD_CORE is not set | ||
681 | # CONFIG_MFD_SM501 is not set | ||
682 | # CONFIG_HTC_PASIC3 is not set | ||
683 | # CONFIG_MFD_TMIO is not set | ||
684 | # CONFIG_REGULATOR is not set | ||
685 | |||
686 | # | ||
687 | # Multimedia devices | ||
688 | # | ||
689 | |||
690 | # | ||
691 | # Multimedia core support | ||
692 | # | ||
693 | # CONFIG_VIDEO_DEV is not set | ||
694 | # CONFIG_DVB_CORE is not set | ||
695 | # CONFIG_VIDEO_MEDIA is not set | ||
696 | |||
697 | # | ||
698 | # Multimedia drivers | ||
699 | # | ||
700 | # CONFIG_DAB is not set | ||
701 | |||
702 | # | ||
703 | # Graphics support | ||
704 | # | ||
705 | # CONFIG_DRM is not set | ||
706 | # CONFIG_VGASTATE is not set | ||
707 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
708 | # CONFIG_FB is not set | ||
709 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
710 | |||
711 | # | ||
712 | # Display device support | ||
713 | # | ||
714 | CONFIG_DISPLAY_SUPPORT=y | ||
715 | |||
716 | # | ||
717 | # Display hardware drivers | ||
718 | # | ||
719 | # CONFIG_SOUND is not set | ||
720 | CONFIG_USB_SUPPORT=y | ||
721 | CONFIG_USB_ARCH_HAS_HCD=y | ||
722 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
723 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
724 | CONFIG_USB=y | ||
725 | # CONFIG_USB_DEBUG is not set | ||
726 | # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set | ||
727 | |||
728 | # | ||
729 | # Miscellaneous USB options | ||
730 | # | ||
731 | # CONFIG_USB_DEVICEFS is not set | ||
732 | # CONFIG_USB_DEVICE_CLASS is not set | ||
733 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
734 | # CONFIG_USB_OTG is not set | ||
735 | # CONFIG_USB_OTG_WHITELIST is not set | ||
736 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | ||
737 | # CONFIG_USB_MON is not set | ||
738 | # CONFIG_USB_WUSB is not set | ||
739 | # CONFIG_USB_WUSB_CBAF is not set | ||
740 | |||
741 | # | ||
742 | # USB Host Controller Drivers | ||
743 | # | ||
744 | # CONFIG_USB_C67X00_HCD is not set | ||
745 | CONFIG_USB_EHCI_HCD=y | ||
746 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | ||
747 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | ||
748 | CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y | ||
749 | # CONFIG_USB_OXU210HP_HCD is not set | ||
750 | # CONFIG_USB_ISP116X_HCD is not set | ||
751 | # CONFIG_USB_ISP1760_HCD is not set | ||
752 | CONFIG_USB_OHCI_HCD=y | ||
753 | # CONFIG_USB_OHCI_HCD_SSB is not set | ||
754 | CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y | ||
755 | CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y | ||
756 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
757 | # CONFIG_USB_UHCI_HCD is not set | ||
758 | # CONFIG_USB_SL811_HCD is not set | ||
759 | # CONFIG_USB_R8A66597_HCD is not set | ||
760 | # CONFIG_USB_WHCI_HCD is not set | ||
761 | # CONFIG_USB_HWA_HCD is not set | ||
762 | |||
763 | # | ||
764 | # USB Device Class drivers | ||
765 | # | ||
766 | # CONFIG_USB_ACM is not set | ||
767 | # CONFIG_USB_PRINTER is not set | ||
768 | # CONFIG_USB_WDM is not set | ||
769 | # CONFIG_USB_TMC is not set | ||
770 | |||
771 | # | ||
772 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may | ||
773 | # | ||
774 | |||
775 | # | ||
776 | # also be needed; see USB_STORAGE Help for more info | ||
777 | # | ||
778 | # CONFIG_USB_LIBUSUAL is not set | ||
779 | |||
780 | # | ||
781 | # USB Imaging devices | ||
782 | # | ||
783 | # CONFIG_USB_MDC800 is not set | ||
784 | |||
785 | # | ||
786 | # USB port drivers | ||
787 | # | ||
788 | # CONFIG_USB_SERIAL is not set | ||
789 | |||
790 | # | ||
791 | # USB Miscellaneous drivers | ||
792 | # | ||
793 | # CONFIG_USB_EMI62 is not set | ||
794 | # CONFIG_USB_EMI26 is not set | ||
795 | # CONFIG_USB_ADUTUX is not set | ||
796 | # CONFIG_USB_SEVSEG is not set | ||
797 | # CONFIG_USB_RIO500 is not set | ||
798 | # CONFIG_USB_LEGOTOWER is not set | ||
799 | # CONFIG_USB_LCD is not set | ||
800 | # CONFIG_USB_BERRY_CHARGE is not set | ||
801 | # CONFIG_USB_LED is not set | ||
802 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
803 | # CONFIG_USB_CYTHERM is not set | ||
804 | # CONFIG_USB_IDMOUSE is not set | ||
805 | # CONFIG_USB_FTDI_ELAN is not set | ||
806 | # CONFIG_USB_APPLEDISPLAY is not set | ||
807 | # CONFIG_USB_SISUSBVGA is not set | ||
808 | # CONFIG_USB_LD is not set | ||
809 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
810 | # CONFIG_USB_IOWARRIOR is not set | ||
811 | # CONFIG_USB_ISIGHTFW is not set | ||
812 | # CONFIG_USB_VST is not set | ||
813 | # CONFIG_USB_GADGET is not set | ||
814 | |||
815 | # | ||
816 | # OTG and related infrastructure | ||
817 | # | ||
818 | # CONFIG_USB_GPIO_VBUS is not set | ||
819 | # CONFIG_NOP_USB_XCEIV is not set | ||
820 | # CONFIG_UWB is not set | ||
821 | # CONFIG_MMC is not set | ||
822 | # CONFIG_MEMSTICK is not set | ||
823 | # CONFIG_NEW_LEDS is not set | ||
824 | # CONFIG_ACCESSIBILITY is not set | ||
825 | # CONFIG_INFINIBAND is not set | ||
826 | CONFIG_RTC_LIB=y | ||
827 | # CONFIG_RTC_CLASS is not set | ||
828 | # CONFIG_DMADEVICES is not set | ||
829 | # CONFIG_AUXDISPLAY is not set | ||
830 | # CONFIG_UIO is not set | ||
831 | # CONFIG_STAGING is not set | ||
832 | |||
833 | # | ||
834 | # File systems | ||
835 | # | ||
836 | # CONFIG_EXT2_FS is not set | ||
837 | # CONFIG_EXT3_FS is not set | ||
838 | # CONFIG_EXT4_FS is not set | ||
839 | # CONFIG_REISERFS_FS is not set | ||
840 | # CONFIG_JFS_FS is not set | ||
841 | # CONFIG_FS_POSIX_ACL is not set | ||
842 | # CONFIG_FILE_LOCKING is not set | ||
843 | # CONFIG_XFS_FS is not set | ||
844 | # CONFIG_OCFS2_FS is not set | ||
845 | # CONFIG_BTRFS_FS is not set | ||
846 | # CONFIG_DNOTIFY is not set | ||
847 | # CONFIG_INOTIFY is not set | ||
848 | # CONFIG_QUOTA is not set | ||
849 | # CONFIG_AUTOFS_FS is not set | ||
850 | # CONFIG_AUTOFS4_FS is not set | ||
851 | # CONFIG_FUSE_FS is not set | ||
852 | |||
853 | # | ||
854 | # Caches | ||
855 | # | ||
856 | # CONFIG_FSCACHE is not set | ||
857 | |||
858 | # | ||
859 | # CD-ROM/DVD Filesystems | ||
860 | # | ||
861 | # CONFIG_ISO9660_FS is not set | ||
862 | # CONFIG_UDF_FS is not set | ||
863 | |||
864 | # | ||
865 | # DOS/FAT/NT Filesystems | ||
866 | # | ||
867 | # CONFIG_MSDOS_FS is not set | ||
868 | # CONFIG_VFAT_FS is not set | ||
869 | # CONFIG_NTFS_FS is not set | ||
870 | |||
871 | # | ||
872 | # Pseudo filesystems | ||
873 | # | ||
874 | CONFIG_PROC_FS=y | ||
875 | CONFIG_PROC_KCORE=y | ||
876 | CONFIG_PROC_SYSCTL=y | ||
877 | CONFIG_PROC_PAGE_MONITOR=y | ||
878 | CONFIG_SYSFS=y | ||
879 | CONFIG_TMPFS=y | ||
880 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
881 | # CONFIG_HUGETLB_PAGE is not set | ||
882 | # CONFIG_CONFIGFS_FS is not set | ||
883 | CONFIG_MISC_FILESYSTEMS=y | ||
884 | # CONFIG_ADFS_FS is not set | ||
885 | # CONFIG_AFFS_FS is not set | ||
886 | # CONFIG_HFS_FS is not set | ||
887 | # CONFIG_HFSPLUS_FS is not set | ||
888 | # CONFIG_BEFS_FS is not set | ||
889 | # CONFIG_BFS_FS is not set | ||
890 | # CONFIG_EFS_FS is not set | ||
891 | # CONFIG_JFFS2_FS is not set | ||
892 | # CONFIG_CRAMFS is not set | ||
893 | # CONFIG_SQUASHFS is not set | ||
894 | # CONFIG_VXFS_FS is not set | ||
895 | # CONFIG_MINIX_FS is not set | ||
896 | # CONFIG_OMFS_FS is not set | ||
897 | # CONFIG_HPFS_FS is not set | ||
898 | # CONFIG_QNX4FS_FS is not set | ||
899 | # CONFIG_ROMFS_FS is not set | ||
900 | # CONFIG_SYSV_FS is not set | ||
901 | # CONFIG_UFS_FS is not set | ||
902 | # CONFIG_NILFS2_FS is not set | ||
903 | # CONFIG_NETWORK_FILESYSTEMS is not set | ||
904 | |||
905 | # | ||
906 | # Partition Types | ||
907 | # | ||
908 | # CONFIG_PARTITION_ADVANCED is not set | ||
909 | CONFIG_MSDOS_PARTITION=y | ||
910 | # CONFIG_NLS is not set | ||
911 | # CONFIG_DLM is not set | ||
912 | |||
913 | # | ||
914 | # Kernel hacking | ||
915 | # | ||
916 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
917 | # CONFIG_PRINTK_TIME is not set | ||
918 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
919 | CONFIG_ENABLE_MUST_CHECK=y | ||
920 | CONFIG_FRAME_WARN=1024 | ||
921 | CONFIG_MAGIC_SYSRQ=y | ||
922 | # CONFIG_UNUSED_SYMBOLS is not set | ||
923 | # CONFIG_DEBUG_FS is not set | ||
924 | # CONFIG_HEADERS_CHECK is not set | ||
925 | # CONFIG_DEBUG_KERNEL is not set | ||
926 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
927 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
928 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
929 | CONFIG_TRACING_SUPPORT=y | ||
930 | |||
931 | # | ||
932 | # Tracers | ||
933 | # | ||
934 | # CONFIG_IRQSOFF_TRACER is not set | ||
935 | # CONFIG_SCHED_TRACER is not set | ||
936 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
937 | # CONFIG_EVENT_TRACER is not set | ||
938 | # CONFIG_BOOT_TRACER is not set | ||
939 | # CONFIG_TRACE_BRANCH_PROFILING is not set | ||
940 | # CONFIG_KMEMTRACE is not set | ||
941 | # CONFIG_WORKQUEUE_TRACER is not set | ||
942 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
943 | # CONFIG_SAMPLES is not set | ||
944 | CONFIG_HAVE_ARCH_KGDB=y | ||
945 | CONFIG_CMDLINE="console=ttyS0,115200" | ||
946 | |||
947 | # | ||
948 | # Security options | ||
949 | # | ||
950 | # CONFIG_KEYS is not set | ||
951 | # CONFIG_SECURITY is not set | ||
952 | # CONFIG_SECURITYFS is not set | ||
953 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
954 | # CONFIG_CRYPTO is not set | ||
955 | # CONFIG_BINARY_PRINTF is not set | ||
956 | |||
957 | # | ||
958 | # Library routines | ||
959 | # | ||
960 | CONFIG_BITREVERSE=y | ||
961 | CONFIG_GENERIC_FIND_LAST_BIT=y | ||
962 | # CONFIG_CRC_CCITT is not set | ||
963 | # CONFIG_CRC16 is not set | ||
964 | # CONFIG_CRC_T10DIF is not set | ||
965 | # CONFIG_CRC_ITU_T is not set | ||
966 | CONFIG_CRC32=y | ||
967 | # CONFIG_CRC7 is not set | ||
968 | # CONFIG_LIBCRC32C is not set | ||
969 | CONFIG_HAS_IOMEM=y | ||
970 | CONFIG_HAS_IOPORT=y | ||
971 | CONFIG_HAS_DMA=y | ||
972 | CONFIG_NLATTR=y | ||
diff --git a/arch/mips/include/asm/fixmap.h b/arch/mips/include/asm/fixmap.h index 0f5caa1307f1..efeddc8db8b1 100644 --- a/arch/mips/include/asm/fixmap.h +++ b/arch/mips/include/asm/fixmap.h | |||
@@ -67,11 +67,15 @@ enum fixed_addresses { | |||
67 | * the start of the fixmap, and leave one page empty | 67 | * the start of the fixmap, and leave one page empty |
68 | * at the top of mem.. | 68 | * at the top of mem.. |
69 | */ | 69 | */ |
70 | #ifdef CONFIG_BCM63XX | ||
71 | #define FIXADDR_TOP ((unsigned long)(long)(int)0xff000000) | ||
72 | #else | ||
70 | #if defined(CONFIG_CPU_TX39XX) || defined(CONFIG_CPU_TX49XX) | 73 | #if defined(CONFIG_CPU_TX39XX) || defined(CONFIG_CPU_TX49XX) |
71 | #define FIXADDR_TOP ((unsigned long)(long)(int)(0xff000000 - 0x20000)) | 74 | #define FIXADDR_TOP ((unsigned long)(long)(int)(0xff000000 - 0x20000)) |
72 | #else | 75 | #else |
73 | #define FIXADDR_TOP ((unsigned long)(long)(int)0xfffe0000) | 76 | #define FIXADDR_TOP ((unsigned long)(long)(int)0xfffe0000) |
74 | #endif | 77 | #endif |
78 | #endif | ||
75 | #define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) | 79 | #define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) |
76 | #define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) | 80 | #define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) |
77 | 81 | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_board.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_board.h new file mode 100644 index 000000000000..fa3e7e617b09 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_board.h | |||
@@ -0,0 +1,12 @@ | |||
1 | #ifndef BCM63XX_BOARD_H_ | ||
2 | #define BCM63XX_BOARD_H_ | ||
3 | |||
4 | const char *board_get_name(void); | ||
5 | |||
6 | void board_prom_init(void); | ||
7 | |||
8 | void board_setup(void); | ||
9 | |||
10 | int board_register_devices(void); | ||
11 | |||
12 | #endif /* ! BCM63XX_BOARD_H_ */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_clk.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_clk.h new file mode 100644 index 000000000000..8fcf8df4418a --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_clk.h | |||
@@ -0,0 +1,11 @@ | |||
1 | #ifndef BCM63XX_CLK_H_ | ||
2 | #define BCM63XX_CLK_H_ | ||
3 | |||
4 | struct clk { | ||
5 | void (*set)(struct clk *, int); | ||
6 | unsigned int rate; | ||
7 | unsigned int usage; | ||
8 | int id; | ||
9 | }; | ||
10 | |||
11 | #endif /* ! BCM63XX_CLK_H_ */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h new file mode 100644 index 000000000000..b12c4aca2cc9 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h | |||
@@ -0,0 +1,538 @@ | |||
1 | #ifndef BCM63XX_CPU_H_ | ||
2 | #define BCM63XX_CPU_H_ | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <linux/init.h> | ||
6 | |||
7 | /* | ||
8 | * Macro to fetch bcm63xx cpu id and revision, should be optimized at | ||
9 | * compile time if only one CPU support is enabled (idea stolen from | ||
10 | * arm mach-types) | ||
11 | */ | ||
12 | #define BCM6338_CPU_ID 0x6338 | ||
13 | #define BCM6345_CPU_ID 0x6345 | ||
14 | #define BCM6348_CPU_ID 0x6348 | ||
15 | #define BCM6358_CPU_ID 0x6358 | ||
16 | |||
17 | void __init bcm63xx_cpu_init(void); | ||
18 | u16 __bcm63xx_get_cpu_id(void); | ||
19 | u16 bcm63xx_get_cpu_rev(void); | ||
20 | unsigned int bcm63xx_get_cpu_freq(void); | ||
21 | |||
22 | #ifdef CONFIG_BCM63XX_CPU_6338 | ||
23 | # ifdef bcm63xx_get_cpu_id | ||
24 | # undef bcm63xx_get_cpu_id | ||
25 | # define bcm63xx_get_cpu_id() __bcm63xx_get_cpu_id() | ||
26 | # define BCMCPU_RUNTIME_DETECT | ||
27 | # else | ||
28 | # define bcm63xx_get_cpu_id() BCM6338_CPU_ID | ||
29 | # endif | ||
30 | # define BCMCPU_IS_6338() (bcm63xx_get_cpu_id() == BCM6338_CPU_ID) | ||
31 | #else | ||
32 | # define BCMCPU_IS_6338() (0) | ||
33 | #endif | ||
34 | |||
35 | #ifdef CONFIG_BCM63XX_CPU_6345 | ||
36 | # ifdef bcm63xx_get_cpu_id | ||
37 | # undef bcm63xx_get_cpu_id | ||
38 | # define bcm63xx_get_cpu_id() __bcm63xx_get_cpu_id() | ||
39 | # define BCMCPU_RUNTIME_DETECT | ||
40 | # else | ||
41 | # define bcm63xx_get_cpu_id() BCM6345_CPU_ID | ||
42 | # endif | ||
43 | # define BCMCPU_IS_6345() (bcm63xx_get_cpu_id() == BCM6345_CPU_ID) | ||
44 | #else | ||
45 | # define BCMCPU_IS_6345() (0) | ||
46 | #endif | ||
47 | |||
48 | #ifdef CONFIG_BCM63XX_CPU_6348 | ||
49 | # ifdef bcm63xx_get_cpu_id | ||
50 | # undef bcm63xx_get_cpu_id | ||
51 | # define bcm63xx_get_cpu_id() __bcm63xx_get_cpu_id() | ||
52 | # define BCMCPU_RUNTIME_DETECT | ||
53 | # else | ||
54 | # define bcm63xx_get_cpu_id() BCM6348_CPU_ID | ||
55 | # endif | ||
56 | # define BCMCPU_IS_6348() (bcm63xx_get_cpu_id() == BCM6348_CPU_ID) | ||
57 | #else | ||
58 | # define BCMCPU_IS_6348() (0) | ||
59 | #endif | ||
60 | |||
61 | #ifdef CONFIG_BCM63XX_CPU_6358 | ||
62 | # ifdef bcm63xx_get_cpu_id | ||
63 | # undef bcm63xx_get_cpu_id | ||
64 | # define bcm63xx_get_cpu_id() __bcm63xx_get_cpu_id() | ||
65 | # define BCMCPU_RUNTIME_DETECT | ||
66 | # else | ||
67 | # define bcm63xx_get_cpu_id() BCM6358_CPU_ID | ||
68 | # endif | ||
69 | # define BCMCPU_IS_6358() (bcm63xx_get_cpu_id() == BCM6358_CPU_ID) | ||
70 | #else | ||
71 | # define BCMCPU_IS_6358() (0) | ||
72 | #endif | ||
73 | |||
74 | #ifndef bcm63xx_get_cpu_id | ||
75 | #error "No CPU support configured" | ||
76 | #endif | ||
77 | |||
78 | /* | ||
79 | * While registers sets are (mostly) the same across 63xx CPU, base | ||
80 | * address of these sets do change. | ||
81 | */ | ||
82 | enum bcm63xx_regs_set { | ||
83 | RSET_DSL_LMEM = 0, | ||
84 | RSET_PERF, | ||
85 | RSET_TIMER, | ||
86 | RSET_WDT, | ||
87 | RSET_UART0, | ||
88 | RSET_GPIO, | ||
89 | RSET_SPI, | ||
90 | RSET_UDC0, | ||
91 | RSET_OHCI0, | ||
92 | RSET_OHCI_PRIV, | ||
93 | RSET_USBH_PRIV, | ||
94 | RSET_MPI, | ||
95 | RSET_PCMCIA, | ||
96 | RSET_DSL, | ||
97 | RSET_ENET0, | ||
98 | RSET_ENET1, | ||
99 | RSET_ENETDMA, | ||
100 | RSET_EHCI0, | ||
101 | RSET_SDRAM, | ||
102 | RSET_MEMC, | ||
103 | RSET_DDR, | ||
104 | }; | ||
105 | |||
106 | #define RSET_DSL_LMEM_SIZE (64 * 1024 * 4) | ||
107 | #define RSET_DSL_SIZE 4096 | ||
108 | #define RSET_WDT_SIZE 12 | ||
109 | #define RSET_ENET_SIZE 2048 | ||
110 | #define RSET_ENETDMA_SIZE 2048 | ||
111 | #define RSET_UART_SIZE 24 | ||
112 | #define RSET_UDC_SIZE 256 | ||
113 | #define RSET_OHCI_SIZE 256 | ||
114 | #define RSET_EHCI_SIZE 256 | ||
115 | #define RSET_PCMCIA_SIZE 12 | ||
116 | |||
117 | /* | ||
118 | * 6338 register sets base address | ||
119 | */ | ||
120 | #define BCM_6338_DSL_LMEM_BASE (0xfff00000) | ||
121 | #define BCM_6338_PERF_BASE (0xfffe0000) | ||
122 | #define BCM_6338_BB_BASE (0xfffe0100) | ||
123 | #define BCM_6338_TIMER_BASE (0xfffe0200) | ||
124 | #define BCM_6338_WDT_BASE (0xfffe021c) | ||
125 | #define BCM_6338_UART0_BASE (0xfffe0300) | ||
126 | #define BCM_6338_GPIO_BASE (0xfffe0400) | ||
127 | #define BCM_6338_SPI_BASE (0xfffe0c00) | ||
128 | #define BCM_6338_UDC0_BASE (0xdeadbeef) | ||
129 | #define BCM_6338_USBDMA_BASE (0xfffe2400) | ||
130 | #define BCM_6338_OHCI0_BASE (0xdeadbeef) | ||
131 | #define BCM_6338_OHCI_PRIV_BASE (0xfffe3000) | ||
132 | #define BCM_6338_USBH_PRIV_BASE (0xdeadbeef) | ||
133 | #define BCM_6338_MPI_BASE (0xfffe3160) | ||
134 | #define BCM_6338_PCMCIA_BASE (0xdeadbeef) | ||
135 | #define BCM_6338_SDRAM_REGS_BASE (0xfffe3100) | ||
136 | #define BCM_6338_DSL_BASE (0xfffe1000) | ||
137 | #define BCM_6338_SAR_BASE (0xfffe2000) | ||
138 | #define BCM_6338_UBUS_BASE (0xdeadbeef) | ||
139 | #define BCM_6338_ENET0_BASE (0xfffe2800) | ||
140 | #define BCM_6338_ENET1_BASE (0xdeadbeef) | ||
141 | #define BCM_6338_ENETDMA_BASE (0xfffe2400) | ||
142 | #define BCM_6338_EHCI0_BASE (0xdeadbeef) | ||
143 | #define BCM_6338_SDRAM_BASE (0xfffe3100) | ||
144 | #define BCM_6338_MEMC_BASE (0xdeadbeef) | ||
145 | #define BCM_6338_DDR_BASE (0xdeadbeef) | ||
146 | |||
147 | /* | ||
148 | * 6345 register sets base address | ||
149 | */ | ||
150 | #define BCM_6345_DSL_LMEM_BASE (0xfff00000) | ||
151 | #define BCM_6345_PERF_BASE (0xfffe0000) | ||
152 | #define BCM_6345_BB_BASE (0xfffe0100) | ||
153 | #define BCM_6345_TIMER_BASE (0xfffe0200) | ||
154 | #define BCM_6345_WDT_BASE (0xfffe021c) | ||
155 | #define BCM_6345_UART0_BASE (0xfffe0300) | ||
156 | #define BCM_6345_GPIO_BASE (0xfffe0400) | ||
157 | #define BCM_6345_SPI_BASE (0xdeadbeef) | ||
158 | #define BCM_6345_UDC0_BASE (0xdeadbeef) | ||
159 | #define BCM_6345_USBDMA_BASE (0xfffe2800) | ||
160 | #define BCM_6345_ENET0_BASE (0xfffe1800) | ||
161 | #define BCM_6345_ENETDMA_BASE (0xfffe2800) | ||
162 | #define BCM_6345_PCMCIA_BASE (0xfffe2028) | ||
163 | #define BCM_6345_MPI_BASE (0xdeadbeef) | ||
164 | #define BCM_6345_OHCI0_BASE (0xfffe2100) | ||
165 | #define BCM_6345_OHCI_PRIV_BASE (0xfffe2200) | ||
166 | #define BCM_6345_USBH_PRIV_BASE (0xdeadbeef) | ||
167 | #define BCM_6345_SDRAM_REGS_BASE (0xfffe2300) | ||
168 | #define BCM_6345_DSL_BASE (0xdeadbeef) | ||
169 | #define BCM_6345_SAR_BASE (0xdeadbeef) | ||
170 | #define BCM_6345_UBUS_BASE (0xdeadbeef) | ||
171 | #define BCM_6345_ENET1_BASE (0xdeadbeef) | ||
172 | #define BCM_6345_EHCI0_BASE (0xdeadbeef) | ||
173 | #define BCM_6345_SDRAM_BASE (0xfffe2300) | ||
174 | #define BCM_6345_MEMC_BASE (0xdeadbeef) | ||
175 | #define BCM_6345_DDR_BASE (0xdeadbeef) | ||
176 | |||
177 | /* | ||
178 | * 6348 register sets base address | ||
179 | */ | ||
180 | #define BCM_6348_DSL_LMEM_BASE (0xfff00000) | ||
181 | #define BCM_6348_PERF_BASE (0xfffe0000) | ||
182 | #define BCM_6348_TIMER_BASE (0xfffe0200) | ||
183 | #define BCM_6348_WDT_BASE (0xfffe021c) | ||
184 | #define BCM_6348_UART0_BASE (0xfffe0300) | ||
185 | #define BCM_6348_GPIO_BASE (0xfffe0400) | ||
186 | #define BCM_6348_SPI_BASE (0xfffe0c00) | ||
187 | #define BCM_6348_UDC0_BASE (0xfffe1000) | ||
188 | #define BCM_6348_OHCI0_BASE (0xfffe1b00) | ||
189 | #define BCM_6348_OHCI_PRIV_BASE (0xfffe1c00) | ||
190 | #define BCM_6348_USBH_PRIV_BASE (0xdeadbeef) | ||
191 | #define BCM_6348_MPI_BASE (0xfffe2000) | ||
192 | #define BCM_6348_PCMCIA_BASE (0xfffe2054) | ||
193 | #define BCM_6348_SDRAM_REGS_BASE (0xfffe2300) | ||
194 | #define BCM_6348_DSL_BASE (0xfffe3000) | ||
195 | #define BCM_6348_ENET0_BASE (0xfffe6000) | ||
196 | #define BCM_6348_ENET1_BASE (0xfffe6800) | ||
197 | #define BCM_6348_ENETDMA_BASE (0xfffe7000) | ||
198 | #define BCM_6348_EHCI0_BASE (0xdeadbeef) | ||
199 | #define BCM_6348_SDRAM_BASE (0xfffe2300) | ||
200 | #define BCM_6348_MEMC_BASE (0xdeadbeef) | ||
201 | #define BCM_6348_DDR_BASE (0xdeadbeef) | ||
202 | |||
203 | /* | ||
204 | * 6358 register sets base address | ||
205 | */ | ||
206 | #define BCM_6358_DSL_LMEM_BASE (0xfff00000) | ||
207 | #define BCM_6358_PERF_BASE (0xfffe0000) | ||
208 | #define BCM_6358_TIMER_BASE (0xfffe0040) | ||
209 | #define BCM_6358_WDT_BASE (0xfffe005c) | ||
210 | #define BCM_6358_UART0_BASE (0xfffe0100) | ||
211 | #define BCM_6358_GPIO_BASE (0xfffe0080) | ||
212 | #define BCM_6358_SPI_BASE (0xdeadbeef) | ||
213 | #define BCM_6358_UDC0_BASE (0xfffe0800) | ||
214 | #define BCM_6358_OHCI0_BASE (0xfffe1400) | ||
215 | #define BCM_6358_OHCI_PRIV_BASE (0xdeadbeef) | ||
216 | #define BCM_6358_USBH_PRIV_BASE (0xfffe1500) | ||
217 | #define BCM_6358_MPI_BASE (0xfffe1000) | ||
218 | #define BCM_6358_PCMCIA_BASE (0xfffe1054) | ||
219 | #define BCM_6358_SDRAM_REGS_BASE (0xfffe2300) | ||
220 | #define BCM_6358_DSL_BASE (0xfffe3000) | ||
221 | #define BCM_6358_ENET0_BASE (0xfffe4000) | ||
222 | #define BCM_6358_ENET1_BASE (0xfffe4800) | ||
223 | #define BCM_6358_ENETDMA_BASE (0xfffe5000) | ||
224 | #define BCM_6358_EHCI0_BASE (0xfffe1300) | ||
225 | #define BCM_6358_SDRAM_BASE (0xdeadbeef) | ||
226 | #define BCM_6358_MEMC_BASE (0xfffe1200) | ||
227 | #define BCM_6358_DDR_BASE (0xfffe12a0) | ||
228 | |||
229 | |||
230 | extern const unsigned long *bcm63xx_regs_base; | ||
231 | |||
232 | static inline unsigned long bcm63xx_regset_address(enum bcm63xx_regs_set set) | ||
233 | { | ||
234 | #ifdef BCMCPU_RUNTIME_DETECT | ||
235 | return bcm63xx_regs_base[set]; | ||
236 | #else | ||
237 | #ifdef CONFIG_BCM63XX_CPU_6338 | ||
238 | switch (set) { | ||
239 | case RSET_DSL_LMEM: | ||
240 | return BCM_6338_DSL_LMEM_BASE; | ||
241 | case RSET_PERF: | ||
242 | return BCM_6338_PERF_BASE; | ||
243 | case RSET_TIMER: | ||
244 | return BCM_6338_TIMER_BASE; | ||
245 | case RSET_WDT: | ||
246 | return BCM_6338_WDT_BASE; | ||
247 | case RSET_UART0: | ||
248 | return BCM_6338_UART0_BASE; | ||
249 | case RSET_GPIO: | ||
250 | return BCM_6338_GPIO_BASE; | ||
251 | case RSET_SPI: | ||
252 | return BCM_6338_SPI_BASE; | ||
253 | case RSET_UDC0: | ||
254 | return BCM_6338_UDC0_BASE; | ||
255 | case RSET_OHCI0: | ||
256 | return BCM_6338_OHCI0_BASE; | ||
257 | case RSET_OHCI_PRIV: | ||
258 | return BCM_6338_OHCI_PRIV_BASE; | ||
259 | case RSET_USBH_PRIV: | ||
260 | return BCM_6338_USBH_PRIV_BASE; | ||
261 | case RSET_MPI: | ||
262 | return BCM_6338_MPI_BASE; | ||
263 | case RSET_PCMCIA: | ||
264 | return BCM_6338_PCMCIA_BASE; | ||
265 | case RSET_DSL: | ||
266 | return BCM_6338_DSL_BASE; | ||
267 | case RSET_ENET0: | ||
268 | return BCM_6338_ENET0_BASE; | ||
269 | case RSET_ENET1: | ||
270 | return BCM_6338_ENET1_BASE; | ||
271 | case RSET_ENETDMA: | ||
272 | return BCM_6338_ENETDMA_BASE; | ||
273 | case RSET_EHCI0: | ||
274 | return BCM_6338_EHCI0_BASE; | ||
275 | case RSET_SDRAM: | ||
276 | return BCM_6338_SDRAM_BASE; | ||
277 | case RSET_MEMC: | ||
278 | return BCM_6338_MEMC_BASE; | ||
279 | case RSET_DDR: | ||
280 | return BCM_6338_DDR_BASE; | ||
281 | } | ||
282 | #endif | ||
283 | #ifdef CONFIG_BCM63XX_CPU_6345 | ||
284 | switch (set) { | ||
285 | case RSET_DSL_LMEM: | ||
286 | return BCM_6345_DSL_LMEM_BASE; | ||
287 | case RSET_PERF: | ||
288 | return BCM_6345_PERF_BASE; | ||
289 | case RSET_TIMER: | ||
290 | return BCM_6345_TIMER_BASE; | ||
291 | case RSET_WDT: | ||
292 | return BCM_6345_WDT_BASE; | ||
293 | case RSET_UART0: | ||
294 | return BCM_6345_UART0_BASE; | ||
295 | case RSET_GPIO: | ||
296 | return BCM_6345_GPIO_BASE; | ||
297 | case RSET_SPI: | ||
298 | return BCM_6345_SPI_BASE; | ||
299 | case RSET_UDC0: | ||
300 | return BCM_6345_UDC0_BASE; | ||
301 | case RSET_OHCI0: | ||
302 | return BCM_6345_OHCI0_BASE; | ||
303 | case RSET_OHCI_PRIV: | ||
304 | return BCM_6345_OHCI_PRIV_BASE; | ||
305 | case RSET_USBH_PRIV: | ||
306 | return BCM_6345_USBH_PRIV_BASE; | ||
307 | case RSET_MPI: | ||
308 | return BCM_6345_MPI_BASE; | ||
309 | case RSET_PCMCIA: | ||
310 | return BCM_6345_PCMCIA_BASE; | ||
311 | case RSET_DSL: | ||
312 | return BCM_6345_DSL_BASE; | ||
313 | case RSET_ENET0: | ||
314 | return BCM_6345_ENET0_BASE; | ||
315 | case RSET_ENET1: | ||
316 | return BCM_6345_ENET1_BASE; | ||
317 | case RSET_ENETDMA: | ||
318 | return BCM_6345_ENETDMA_BASE; | ||
319 | case RSET_EHCI0: | ||
320 | return BCM_6345_EHCI0_BASE; | ||
321 | case RSET_SDRAM: | ||
322 | return BCM_6345_SDRAM_BASE; | ||
323 | case RSET_MEMC: | ||
324 | return BCM_6345_MEMC_BASE; | ||
325 | case RSET_DDR: | ||
326 | return BCM_6345_DDR_BASE; | ||
327 | } | ||
328 | #endif | ||
329 | #ifdef CONFIG_BCM63XX_CPU_6348 | ||
330 | switch (set) { | ||
331 | case RSET_DSL_LMEM: | ||
332 | return BCM_6348_DSL_LMEM_BASE; | ||
333 | case RSET_PERF: | ||
334 | return BCM_6348_PERF_BASE; | ||
335 | case RSET_TIMER: | ||
336 | return BCM_6348_TIMER_BASE; | ||
337 | case RSET_WDT: | ||
338 | return BCM_6348_WDT_BASE; | ||
339 | case RSET_UART0: | ||
340 | return BCM_6348_UART0_BASE; | ||
341 | case RSET_GPIO: | ||
342 | return BCM_6348_GPIO_BASE; | ||
343 | case RSET_SPI: | ||
344 | return BCM_6348_SPI_BASE; | ||
345 | case RSET_UDC0: | ||
346 | return BCM_6348_UDC0_BASE; | ||
347 | case RSET_OHCI0: | ||
348 | return BCM_6348_OHCI0_BASE; | ||
349 | case RSET_OHCI_PRIV: | ||
350 | return BCM_6348_OHCI_PRIV_BASE; | ||
351 | case RSET_USBH_PRIV: | ||
352 | return BCM_6348_USBH_PRIV_BASE; | ||
353 | case RSET_MPI: | ||
354 | return BCM_6348_MPI_BASE; | ||
355 | case RSET_PCMCIA: | ||
356 | return BCM_6348_PCMCIA_BASE; | ||
357 | case RSET_DSL: | ||
358 | return BCM_6348_DSL_BASE; | ||
359 | case RSET_ENET0: | ||
360 | return BCM_6348_ENET0_BASE; | ||
361 | case RSET_ENET1: | ||
362 | return BCM_6348_ENET1_BASE; | ||
363 | case RSET_ENETDMA: | ||
364 | return BCM_6348_ENETDMA_BASE; | ||
365 | case RSET_EHCI0: | ||
366 | return BCM_6348_EHCI0_BASE; | ||
367 | case RSET_SDRAM: | ||
368 | return BCM_6348_SDRAM_BASE; | ||
369 | case RSET_MEMC: | ||
370 | return BCM_6348_MEMC_BASE; | ||
371 | case RSET_DDR: | ||
372 | return BCM_6348_DDR_BASE; | ||
373 | } | ||
374 | #endif | ||
375 | #ifdef CONFIG_BCM63XX_CPU_6358 | ||
376 | switch (set) { | ||
377 | case RSET_DSL_LMEM: | ||
378 | return BCM_6358_DSL_LMEM_BASE; | ||
379 | case RSET_PERF: | ||
380 | return BCM_6358_PERF_BASE; | ||
381 | case RSET_TIMER: | ||
382 | return BCM_6358_TIMER_BASE; | ||
383 | case RSET_WDT: | ||
384 | return BCM_6358_WDT_BASE; | ||
385 | case RSET_UART0: | ||
386 | return BCM_6358_UART0_BASE; | ||
387 | case RSET_GPIO: | ||
388 | return BCM_6358_GPIO_BASE; | ||
389 | case RSET_SPI: | ||
390 | return BCM_6358_SPI_BASE; | ||
391 | case RSET_UDC0: | ||
392 | return BCM_6358_UDC0_BASE; | ||
393 | case RSET_OHCI0: | ||
394 | return BCM_6358_OHCI0_BASE; | ||
395 | case RSET_OHCI_PRIV: | ||
396 | return BCM_6358_OHCI_PRIV_BASE; | ||
397 | case RSET_USBH_PRIV: | ||
398 | return BCM_6358_USBH_PRIV_BASE; | ||
399 | case RSET_MPI: | ||
400 | return BCM_6358_MPI_BASE; | ||
401 | case RSET_PCMCIA: | ||
402 | return BCM_6358_PCMCIA_BASE; | ||
403 | case RSET_ENET0: | ||
404 | return BCM_6358_ENET0_BASE; | ||
405 | case RSET_ENET1: | ||
406 | return BCM_6358_ENET1_BASE; | ||
407 | case RSET_ENETDMA: | ||
408 | return BCM_6358_ENETDMA_BASE; | ||
409 | case RSET_DSL: | ||
410 | return BCM_6358_DSL_BASE; | ||
411 | case RSET_EHCI0: | ||
412 | return BCM_6358_EHCI0_BASE; | ||
413 | case RSET_SDRAM: | ||
414 | return BCM_6358_SDRAM_BASE; | ||
415 | case RSET_MEMC: | ||
416 | return BCM_6358_MEMC_BASE; | ||
417 | case RSET_DDR: | ||
418 | return BCM_6358_DDR_BASE; | ||
419 | } | ||
420 | #endif | ||
421 | #endif | ||
422 | /* unreached */ | ||
423 | return 0; | ||
424 | } | ||
425 | |||
426 | /* | ||
427 | * IRQ number changes across CPU too | ||
428 | */ | ||
429 | enum bcm63xx_irq { | ||
430 | IRQ_TIMER = 0, | ||
431 | IRQ_UART0, | ||
432 | IRQ_DSL, | ||
433 | IRQ_ENET0, | ||
434 | IRQ_ENET1, | ||
435 | IRQ_ENET_PHY, | ||
436 | IRQ_OHCI0, | ||
437 | IRQ_EHCI0, | ||
438 | IRQ_PCMCIA0, | ||
439 | IRQ_ENET0_RXDMA, | ||
440 | IRQ_ENET0_TXDMA, | ||
441 | IRQ_ENET1_RXDMA, | ||
442 | IRQ_ENET1_TXDMA, | ||
443 | IRQ_PCI, | ||
444 | IRQ_PCMCIA, | ||
445 | }; | ||
446 | |||
447 | /* | ||
448 | * 6338 irqs | ||
449 | */ | ||
450 | #define BCM_6338_TIMER_IRQ (IRQ_INTERNAL_BASE + 0) | ||
451 | #define BCM_6338_SPI_IRQ (IRQ_INTERNAL_BASE + 1) | ||
452 | #define BCM_6338_UART0_IRQ (IRQ_INTERNAL_BASE + 2) | ||
453 | #define BCM_6338_DG_IRQ (IRQ_INTERNAL_BASE + 4) | ||
454 | #define BCM_6338_DSL_IRQ (IRQ_INTERNAL_BASE + 5) | ||
455 | #define BCM_6338_ATM_IRQ (IRQ_INTERNAL_BASE + 6) | ||
456 | #define BCM_6338_UDC0_IRQ (IRQ_INTERNAL_BASE + 7) | ||
457 | #define BCM_6338_ENET0_IRQ (IRQ_INTERNAL_BASE + 8) | ||
458 | #define BCM_6338_ENET_PHY_IRQ (IRQ_INTERNAL_BASE + 9) | ||
459 | #define BCM_6338_SDRAM_IRQ (IRQ_INTERNAL_BASE + 10) | ||
460 | #define BCM_6338_USB_CNTL_RX_DMA_IRQ (IRQ_INTERNAL_BASE + 11) | ||
461 | #define BCM_6338_USB_CNTL_TX_DMA_IRQ (IRQ_INTERNAL_BASE + 12) | ||
462 | #define BCM_6338_USB_BULK_RX_DMA_IRQ (IRQ_INTERNAL_BASE + 13) | ||
463 | #define BCM_6338_USB_BULK_TX_DMA_IRQ (IRQ_INTERNAL_BASE + 14) | ||
464 | #define BCM_6338_ENET0_RXDMA_IRQ (IRQ_INTERNAL_BASE + 15) | ||
465 | #define BCM_6338_ENET0_TXDMA_IRQ (IRQ_INTERNAL_BASE + 16) | ||
466 | #define BCM_6338_SDIO_IRQ (IRQ_INTERNAL_BASE + 17) | ||
467 | |||
468 | /* | ||
469 | * 6345 irqs | ||
470 | */ | ||
471 | #define BCM_6345_TIMER_IRQ (IRQ_INTERNAL_BASE + 0) | ||
472 | #define BCM_6345_UART0_IRQ (IRQ_INTERNAL_BASE + 2) | ||
473 | #define BCM_6345_DSL_IRQ (IRQ_INTERNAL_BASE + 3) | ||
474 | #define BCM_6345_ATM_IRQ (IRQ_INTERNAL_BASE + 4) | ||
475 | #define BCM_6345_USB_IRQ (IRQ_INTERNAL_BASE + 5) | ||
476 | #define BCM_6345_ENET0_IRQ (IRQ_INTERNAL_BASE + 8) | ||
477 | #define BCM_6345_ENET_PHY_IRQ (IRQ_INTERNAL_BASE + 12) | ||
478 | #define BCM_6345_ENET0_RXDMA_IRQ (IRQ_INTERNAL_BASE + 13 + 1) | ||
479 | #define BCM_6345_ENET0_TXDMA_IRQ (IRQ_INTERNAL_BASE + 13 + 2) | ||
480 | #define BCM_6345_EBI_RX_IRQ (IRQ_INTERNAL_BASE + 13 + 5) | ||
481 | #define BCM_6345_EBI_TX_IRQ (IRQ_INTERNAL_BASE + 13 + 6) | ||
482 | #define BCM_6345_RESERVED_RX_IRQ (IRQ_INTERNAL_BASE + 13 + 9) | ||
483 | #define BCM_6345_RESERVED_TX_IRQ (IRQ_INTERNAL_BASE + 13 + 10) | ||
484 | #define BCM_6345_USB_BULK_RX_DMA_IRQ (IRQ_INTERNAL_BASE + 13 + 13) | ||
485 | #define BCM_6345_USB_BULK_TX_DMA_IRQ (IRQ_INTERNAL_BASE + 13 + 14) | ||
486 | #define BCM_6345_USB_CNTL_RX_DMA_IRQ (IRQ_INTERNAL_BASE + 13 + 15) | ||
487 | #define BCM_6345_USB_CNTL_TX_DMA_IRQ (IRQ_INTERNAL_BASE + 13 + 16) | ||
488 | #define BCM_6345_USB_ISO_RX_DMA_IRQ (IRQ_INTERNAL_BASE + 13 + 17) | ||
489 | #define BCM_6345_USB_ISO_TX_DMA_IRQ (IRQ_INTERNAL_BASE + 13 + 18) | ||
490 | |||
491 | /* | ||
492 | * 6348 irqs | ||
493 | */ | ||
494 | #define BCM_6348_TIMER_IRQ (IRQ_INTERNAL_BASE + 0) | ||
495 | #define BCM_6348_UART0_IRQ (IRQ_INTERNAL_BASE + 2) | ||
496 | #define BCM_6348_DSL_IRQ (IRQ_INTERNAL_BASE + 4) | ||
497 | #define BCM_6348_ENET1_IRQ (IRQ_INTERNAL_BASE + 7) | ||
498 | #define BCM_6348_ENET0_IRQ (IRQ_INTERNAL_BASE + 8) | ||
499 | #define BCM_6348_ENET_PHY_IRQ (IRQ_INTERNAL_BASE + 9) | ||
500 | #define BCM_6348_OHCI0_IRQ (IRQ_INTERNAL_BASE + 12) | ||
501 | #define BCM_6348_ENET0_RXDMA_IRQ (IRQ_INTERNAL_BASE + 20) | ||
502 | #define BCM_6348_ENET0_TXDMA_IRQ (IRQ_INTERNAL_BASE + 21) | ||
503 | #define BCM_6348_ENET1_RXDMA_IRQ (IRQ_INTERNAL_BASE + 22) | ||
504 | #define BCM_6348_ENET1_TXDMA_IRQ (IRQ_INTERNAL_BASE + 23) | ||
505 | #define BCM_6348_PCMCIA_IRQ (IRQ_INTERNAL_BASE + 24) | ||
506 | #define BCM_6348_PCI_IRQ (IRQ_INTERNAL_BASE + 24) | ||
507 | |||
508 | /* | ||
509 | * 6358 irqs | ||
510 | */ | ||
511 | #define BCM_6358_TIMER_IRQ (IRQ_INTERNAL_BASE + 0) | ||
512 | #define BCM_6358_UART0_IRQ (IRQ_INTERNAL_BASE + 2) | ||
513 | #define BCM_6358_OHCI0_IRQ (IRQ_INTERNAL_BASE + 5) | ||
514 | #define BCM_6358_ENET1_IRQ (IRQ_INTERNAL_BASE + 6) | ||
515 | #define BCM_6358_ENET0_IRQ (IRQ_INTERNAL_BASE + 8) | ||
516 | #define BCM_6358_ENET_PHY_IRQ (IRQ_INTERNAL_BASE + 9) | ||
517 | #define BCM_6358_EHCI0_IRQ (IRQ_INTERNAL_BASE + 10) | ||
518 | #define BCM_6358_ENET0_RXDMA_IRQ (IRQ_INTERNAL_BASE + 15) | ||
519 | #define BCM_6358_ENET0_TXDMA_IRQ (IRQ_INTERNAL_BASE + 16) | ||
520 | #define BCM_6358_ENET1_RXDMA_IRQ (IRQ_INTERNAL_BASE + 17) | ||
521 | #define BCM_6358_ENET1_TXDMA_IRQ (IRQ_INTERNAL_BASE + 18) | ||
522 | #define BCM_6358_DSL_IRQ (IRQ_INTERNAL_BASE + 29) | ||
523 | #define BCM_6358_PCI_IRQ (IRQ_INTERNAL_BASE + 31) | ||
524 | #define BCM_6358_PCMCIA_IRQ (IRQ_INTERNAL_BASE + 24) | ||
525 | |||
526 | extern const int *bcm63xx_irqs; | ||
527 | |||
528 | static inline int bcm63xx_get_irq_number(enum bcm63xx_irq irq) | ||
529 | { | ||
530 | return bcm63xx_irqs[irq]; | ||
531 | } | ||
532 | |||
533 | /* | ||
534 | * return installed memory size | ||
535 | */ | ||
536 | unsigned int bcm63xx_get_memory_size(void); | ||
537 | |||
538 | #endif /* !BCM63XX_CPU_H_ */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cs.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cs.h new file mode 100644 index 000000000000..b1821c866e53 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cs.h | |||
@@ -0,0 +1,10 @@ | |||
1 | #ifndef BCM63XX_CS_H | ||
2 | #define BCM63XX_CS_H | ||
3 | |||
4 | int bcm63xx_set_cs_base(unsigned int cs, u32 base, unsigned int size); | ||
5 | int bcm63xx_set_cs_timing(unsigned int cs, unsigned int wait, | ||
6 | unsigned int setup, unsigned int hold); | ||
7 | int bcm63xx_set_cs_param(unsigned int cs, u32 flags); | ||
8 | int bcm63xx_set_cs_status(unsigned int cs, int enable); | ||
9 | |||
10 | #endif /* !BCM63XX_CS_H */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_dsp.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_dsp.h new file mode 100644 index 000000000000..b587d45c3045 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_dsp.h | |||
@@ -0,0 +1,13 @@ | |||
1 | #ifndef __BCM63XX_DSP_H | ||
2 | #define __BCM63XX_DSP_H | ||
3 | |||
4 | struct bcm63xx_dsp_platform_data { | ||
5 | unsigned gpio_rst; | ||
6 | unsigned gpio_int; | ||
7 | unsigned cs; | ||
8 | unsigned ext_irq; | ||
9 | }; | ||
10 | |||
11 | int __init bcm63xx_dsp_register(const struct bcm63xx_dsp_platform_data *pd); | ||
12 | |||
13 | #endif /* __BCM63XX_DSP_H */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_enet.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_enet.h new file mode 100644 index 000000000000..d53f611184b9 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_enet.h | |||
@@ -0,0 +1,45 @@ | |||
1 | #ifndef BCM63XX_DEV_ENET_H_ | ||
2 | #define BCM63XX_DEV_ENET_H_ | ||
3 | |||
4 | #include <linux/if_ether.h> | ||
5 | #include <linux/init.h> | ||
6 | |||
7 | /* | ||
8 | * on board ethernet platform data | ||
9 | */ | ||
10 | struct bcm63xx_enet_platform_data { | ||
11 | char mac_addr[ETH_ALEN]; | ||
12 | |||
13 | int has_phy; | ||
14 | |||
15 | /* if has_phy, then set use_internal_phy */ | ||
16 | int use_internal_phy; | ||
17 | |||
18 | /* or fill phy info to use an external one */ | ||
19 | int phy_id; | ||
20 | int has_phy_interrupt; | ||
21 | int phy_interrupt; | ||
22 | |||
23 | /* if has_phy, use autonegociated pause parameters or force | ||
24 | * them */ | ||
25 | int pause_auto; | ||
26 | int pause_rx; | ||
27 | int pause_tx; | ||
28 | |||
29 | /* if !has_phy, set desired forced speed/duplex */ | ||
30 | int force_speed_100; | ||
31 | int force_duplex_full; | ||
32 | |||
33 | /* if !has_phy, set callback to perform mii device | ||
34 | * init/remove */ | ||
35 | int (*mii_config)(struct net_device *dev, int probe, | ||
36 | int (*mii_read)(struct net_device *dev, | ||
37 | int phy_id, int reg), | ||
38 | void (*mii_write)(struct net_device *dev, | ||
39 | int phy_id, int reg, int val)); | ||
40 | }; | ||
41 | |||
42 | int __init bcm63xx_enet_register(int unit, | ||
43 | const struct bcm63xx_enet_platform_data *pd); | ||
44 | |||
45 | #endif /* ! BCM63XX_DEV_ENET_H_ */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_pci.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_pci.h new file mode 100644 index 000000000000..c549344b70ad --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_pci.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef BCM63XX_DEV_PCI_H_ | ||
2 | #define BCM63XX_DEV_PCI_H_ | ||
3 | |||
4 | extern int bcm63xx_pci_enabled; | ||
5 | |||
6 | #endif /* BCM63XX_DEV_PCI_H_ */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h new file mode 100644 index 000000000000..76a0b7216af5 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h | |||
@@ -0,0 +1,22 @@ | |||
1 | #ifndef BCM63XX_GPIO_H | ||
2 | #define BCM63XX_GPIO_H | ||
3 | |||
4 | #include <linux/init.h> | ||
5 | |||
6 | int __init bcm63xx_gpio_init(void); | ||
7 | |||
8 | static inline unsigned long bcm63xx_gpio_count(void) | ||
9 | { | ||
10 | switch (bcm63xx_get_cpu_id()) { | ||
11 | case BCM6358_CPU_ID: | ||
12 | return 40; | ||
13 | case BCM6348_CPU_ID: | ||
14 | default: | ||
15 | return 37; | ||
16 | } | ||
17 | } | ||
18 | |||
19 | #define GPIO_DIR_OUT 0x0 | ||
20 | #define GPIO_DIR_IN 0x1 | ||
21 | |||
22 | #endif /* !BCM63XX_GPIO_H */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_io.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_io.h new file mode 100644 index 000000000000..91180fac6ed9 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_io.h | |||
@@ -0,0 +1,93 @@ | |||
1 | #ifndef BCM63XX_IO_H_ | ||
2 | #define BCM63XX_IO_H_ | ||
3 | |||
4 | #include "bcm63xx_cpu.h" | ||
5 | |||
6 | /* | ||
7 | * Physical memory map, RAM is mapped at 0x0. | ||
8 | * | ||
9 | * Note that size MUST be a power of two. | ||
10 | */ | ||
11 | #define BCM_PCMCIA_COMMON_BASE_PA (0x20000000) | ||
12 | #define BCM_PCMCIA_COMMON_SIZE (16 * 1024 * 1024) | ||
13 | #define BCM_PCMCIA_COMMON_END_PA (BCM_PCMCIA_COMMON_BASE_PA + \ | ||
14 | BCM_PCMCIA_COMMON_SIZE - 1) | ||
15 | |||
16 | #define BCM_PCMCIA_ATTR_BASE_PA (0x21000000) | ||
17 | #define BCM_PCMCIA_ATTR_SIZE (16 * 1024 * 1024) | ||
18 | #define BCM_PCMCIA_ATTR_END_PA (BCM_PCMCIA_ATTR_BASE_PA + \ | ||
19 | BCM_PCMCIA_ATTR_SIZE - 1) | ||
20 | |||
21 | #define BCM_PCMCIA_IO_BASE_PA (0x22000000) | ||
22 | #define BCM_PCMCIA_IO_SIZE (64 * 1024) | ||
23 | #define BCM_PCMCIA_IO_END_PA (BCM_PCMCIA_IO_BASE_PA + \ | ||
24 | BCM_PCMCIA_IO_SIZE - 1) | ||
25 | |||
26 | #define BCM_PCI_MEM_BASE_PA (0x30000000) | ||
27 | #define BCM_PCI_MEM_SIZE (128 * 1024 * 1024) | ||
28 | #define BCM_PCI_MEM_END_PA (BCM_PCI_MEM_BASE_PA + \ | ||
29 | BCM_PCI_MEM_SIZE - 1) | ||
30 | |||
31 | #define BCM_PCI_IO_BASE_PA (0x08000000) | ||
32 | #define BCM_PCI_IO_SIZE (64 * 1024) | ||
33 | #define BCM_PCI_IO_END_PA (BCM_PCI_IO_BASE_PA + \ | ||
34 | BCM_PCI_IO_SIZE - 1) | ||
35 | #define BCM_PCI_IO_HALF_PA (BCM_PCI_IO_BASE_PA + \ | ||
36 | (BCM_PCI_IO_SIZE / 2) - 1) | ||
37 | |||
38 | #define BCM_CB_MEM_BASE_PA (0x38000000) | ||
39 | #define BCM_CB_MEM_SIZE (128 * 1024 * 1024) | ||
40 | #define BCM_CB_MEM_END_PA (BCM_CB_MEM_BASE_PA + \ | ||
41 | BCM_CB_MEM_SIZE - 1) | ||
42 | |||
43 | |||
44 | /* | ||
45 | * Internal registers are accessed through KSEG3 | ||
46 | */ | ||
47 | #define BCM_REGS_VA(x) ((void __iomem *)(x)) | ||
48 | |||
49 | #define bcm_readb(a) (*(volatile unsigned char *) BCM_REGS_VA(a)) | ||
50 | #define bcm_readw(a) (*(volatile unsigned short *) BCM_REGS_VA(a)) | ||
51 | #define bcm_readl(a) (*(volatile unsigned int *) BCM_REGS_VA(a)) | ||
52 | #define bcm_writeb(v, a) (*(volatile unsigned char *) BCM_REGS_VA((a)) = (v)) | ||
53 | #define bcm_writew(v, a) (*(volatile unsigned short *) BCM_REGS_VA((a)) = (v)) | ||
54 | #define bcm_writel(v, a) (*(volatile unsigned int *) BCM_REGS_VA((a)) = (v)) | ||
55 | |||
56 | /* | ||
57 | * IO helpers to access register set for current CPU | ||
58 | */ | ||
59 | #define bcm_rset_readb(s, o) bcm_readb(bcm63xx_regset_address(s) + (o)) | ||
60 | #define bcm_rset_readw(s, o) bcm_readw(bcm63xx_regset_address(s) + (o)) | ||
61 | #define bcm_rset_readl(s, o) bcm_readl(bcm63xx_regset_address(s) + (o)) | ||
62 | #define bcm_rset_writeb(s, v, o) bcm_writeb((v), \ | ||
63 | bcm63xx_regset_address(s) + (o)) | ||
64 | #define bcm_rset_writew(s, v, o) bcm_writew((v), \ | ||
65 | bcm63xx_regset_address(s) + (o)) | ||
66 | #define bcm_rset_writel(s, v, o) bcm_writel((v), \ | ||
67 | bcm63xx_regset_address(s) + (o)) | ||
68 | |||
69 | /* | ||
70 | * helpers for frequently used register sets | ||
71 | */ | ||
72 | #define bcm_perf_readl(o) bcm_rset_readl(RSET_PERF, (o)) | ||
73 | #define bcm_perf_writel(v, o) bcm_rset_writel(RSET_PERF, (v), (o)) | ||
74 | #define bcm_timer_readl(o) bcm_rset_readl(RSET_TIMER, (o)) | ||
75 | #define bcm_timer_writel(v, o) bcm_rset_writel(RSET_TIMER, (v), (o)) | ||
76 | #define bcm_wdt_readl(o) bcm_rset_readl(RSET_WDT, (o)) | ||
77 | #define bcm_wdt_writel(v, o) bcm_rset_writel(RSET_WDT, (v), (o)) | ||
78 | #define bcm_gpio_readl(o) bcm_rset_readl(RSET_GPIO, (o)) | ||
79 | #define bcm_gpio_writel(v, o) bcm_rset_writel(RSET_GPIO, (v), (o)) | ||
80 | #define bcm_uart0_readl(o) bcm_rset_readl(RSET_UART0, (o)) | ||
81 | #define bcm_uart0_writel(v, o) bcm_rset_writel(RSET_UART0, (v), (o)) | ||
82 | #define bcm_mpi_readl(o) bcm_rset_readl(RSET_MPI, (o)) | ||
83 | #define bcm_mpi_writel(v, o) bcm_rset_writel(RSET_MPI, (v), (o)) | ||
84 | #define bcm_pcmcia_readl(o) bcm_rset_readl(RSET_PCMCIA, (o)) | ||
85 | #define bcm_pcmcia_writel(v, o) bcm_rset_writel(RSET_PCMCIA, (v), (o)) | ||
86 | #define bcm_sdram_readl(o) bcm_rset_readl(RSET_SDRAM, (o)) | ||
87 | #define bcm_sdram_writel(v, o) bcm_rset_writel(RSET_SDRAM, (v), (o)) | ||
88 | #define bcm_memc_readl(o) bcm_rset_readl(RSET_MEMC, (o)) | ||
89 | #define bcm_memc_writel(v, o) bcm_rset_writel(RSET_MEMC, (v), (o)) | ||
90 | #define bcm_ddr_readl(o) bcm_rset_readl(RSET_DDR, (o)) | ||
91 | #define bcm_ddr_writel(v, o) bcm_rset_writel(RSET_DDR, (v), (o)) | ||
92 | |||
93 | #endif /* ! BCM63XX_IO_H_ */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_irq.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_irq.h new file mode 100644 index 000000000000..5f95577c8213 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_irq.h | |||
@@ -0,0 +1,15 @@ | |||
1 | #ifndef BCM63XX_IRQ_H_ | ||
2 | #define BCM63XX_IRQ_H_ | ||
3 | |||
4 | #include <bcm63xx_cpu.h> | ||
5 | |||
6 | #define IRQ_MIPS_BASE 0 | ||
7 | #define IRQ_INTERNAL_BASE 8 | ||
8 | |||
9 | #define IRQ_EXT_BASE (IRQ_MIPS_BASE + 3) | ||
10 | #define IRQ_EXT_0 (IRQ_EXT_BASE + 0) | ||
11 | #define IRQ_EXT_1 (IRQ_EXT_BASE + 1) | ||
12 | #define IRQ_EXT_2 (IRQ_EXT_BASE + 2) | ||
13 | #define IRQ_EXT_3 (IRQ_EXT_BASE + 3) | ||
14 | |||
15 | #endif /* ! BCM63XX_IRQ_H_ */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h new file mode 100644 index 000000000000..ed4ccec87dd4 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h | |||
@@ -0,0 +1,773 @@ | |||
1 | #ifndef BCM63XX_REGS_H_ | ||
2 | #define BCM63XX_REGS_H_ | ||
3 | |||
4 | /************************************************************************* | ||
5 | * _REG relative to RSET_PERF | ||
6 | *************************************************************************/ | ||
7 | |||
8 | /* Chip Identifier / Revision register */ | ||
9 | #define PERF_REV_REG 0x0 | ||
10 | #define REV_CHIPID_SHIFT 16 | ||
11 | #define REV_CHIPID_MASK (0xffff << REV_CHIPID_SHIFT) | ||
12 | #define REV_REVID_SHIFT 0 | ||
13 | #define REV_REVID_MASK (0xffff << REV_REVID_SHIFT) | ||
14 | |||
15 | /* Clock Control register */ | ||
16 | #define PERF_CKCTL_REG 0x4 | ||
17 | |||
18 | #define CKCTL_6338_ADSLPHY_EN (1 << 0) | ||
19 | #define CKCTL_6338_MPI_EN (1 << 1) | ||
20 | #define CKCTL_6338_DRAM_EN (1 << 2) | ||
21 | #define CKCTL_6338_ENET_EN (1 << 4) | ||
22 | #define CKCTL_6338_USBS_EN (1 << 4) | ||
23 | #define CKCTL_6338_SAR_EN (1 << 5) | ||
24 | #define CKCTL_6338_SPI_EN (1 << 9) | ||
25 | |||
26 | #define CKCTL_6338_ALL_SAFE_EN (CKCTL_6338_ADSLPHY_EN | \ | ||
27 | CKCTL_6338_MPI_EN | \ | ||
28 | CKCTL_6338_ENET_EN | \ | ||
29 | CKCTL_6338_SAR_EN | \ | ||
30 | CKCTL_6338_SPI_EN) | ||
31 | |||
32 | #define CKCTL_6345_CPU_EN (1 << 0) | ||
33 | #define CKCTL_6345_BUS_EN (1 << 1) | ||
34 | #define CKCTL_6345_EBI_EN (1 << 2) | ||
35 | #define CKCTL_6345_UART_EN (1 << 3) | ||
36 | #define CKCTL_6345_ADSLPHY_EN (1 << 4) | ||
37 | #define CKCTL_6345_ENET_EN (1 << 7) | ||
38 | #define CKCTL_6345_USBH_EN (1 << 8) | ||
39 | |||
40 | #define CKCTL_6345_ALL_SAFE_EN (CKCTL_6345_ENET_EN | \ | ||
41 | CKCTL_6345_USBH_EN | \ | ||
42 | CKCTL_6345_ADSLPHY_EN) | ||
43 | |||
44 | #define CKCTL_6348_ADSLPHY_EN (1 << 0) | ||
45 | #define CKCTL_6348_MPI_EN (1 << 1) | ||
46 | #define CKCTL_6348_SDRAM_EN (1 << 2) | ||
47 | #define CKCTL_6348_M2M_EN (1 << 3) | ||
48 | #define CKCTL_6348_ENET_EN (1 << 4) | ||
49 | #define CKCTL_6348_SAR_EN (1 << 5) | ||
50 | #define CKCTL_6348_USBS_EN (1 << 6) | ||
51 | #define CKCTL_6348_USBH_EN (1 << 8) | ||
52 | #define CKCTL_6348_SPI_EN (1 << 9) | ||
53 | |||
54 | #define CKCTL_6348_ALL_SAFE_EN (CKCTL_6348_ADSLPHY_EN | \ | ||
55 | CKCTL_6348_M2M_EN | \ | ||
56 | CKCTL_6348_ENET_EN | \ | ||
57 | CKCTL_6348_SAR_EN | \ | ||
58 | CKCTL_6348_USBS_EN | \ | ||
59 | CKCTL_6348_USBH_EN | \ | ||
60 | CKCTL_6348_SPI_EN) | ||
61 | |||
62 | #define CKCTL_6358_ENET_EN (1 << 4) | ||
63 | #define CKCTL_6358_ADSLPHY_EN (1 << 5) | ||
64 | #define CKCTL_6358_PCM_EN (1 << 8) | ||
65 | #define CKCTL_6358_SPI_EN (1 << 9) | ||
66 | #define CKCTL_6358_USBS_EN (1 << 10) | ||
67 | #define CKCTL_6358_SAR_EN (1 << 11) | ||
68 | #define CKCTL_6358_EMUSB_EN (1 << 17) | ||
69 | #define CKCTL_6358_ENET0_EN (1 << 18) | ||
70 | #define CKCTL_6358_ENET1_EN (1 << 19) | ||
71 | #define CKCTL_6358_USBSU_EN (1 << 20) | ||
72 | #define CKCTL_6358_EPHY_EN (1 << 21) | ||
73 | |||
74 | #define CKCTL_6358_ALL_SAFE_EN (CKCTL_6358_ENET_EN | \ | ||
75 | CKCTL_6358_ADSLPHY_EN | \ | ||
76 | CKCTL_6358_PCM_EN | \ | ||
77 | CKCTL_6358_SPI_EN | \ | ||
78 | CKCTL_6358_USBS_EN | \ | ||
79 | CKCTL_6358_SAR_EN | \ | ||
80 | CKCTL_6358_EMUSB_EN | \ | ||
81 | CKCTL_6358_ENET0_EN | \ | ||
82 | CKCTL_6358_ENET1_EN | \ | ||
83 | CKCTL_6358_USBSU_EN | \ | ||
84 | CKCTL_6358_EPHY_EN) | ||
85 | |||
86 | /* System PLL Control register */ | ||
87 | #define PERF_SYS_PLL_CTL_REG 0x8 | ||
88 | #define SYS_PLL_SOFT_RESET 0x1 | ||
89 | |||
90 | /* Interrupt Mask register */ | ||
91 | #define PERF_IRQMASK_REG 0xc | ||
92 | #define PERF_IRQSTAT_REG 0x10 | ||
93 | |||
94 | /* Interrupt Status register */ | ||
95 | #define PERF_IRQSTAT_REG 0x10 | ||
96 | |||
97 | /* External Interrupt Configuration register */ | ||
98 | #define PERF_EXTIRQ_CFG_REG 0x14 | ||
99 | #define EXTIRQ_CFG_SENSE(x) (1 << (x)) | ||
100 | #define EXTIRQ_CFG_STAT(x) (1 << (x + 5)) | ||
101 | #define EXTIRQ_CFG_CLEAR(x) (1 << (x + 10)) | ||
102 | #define EXTIRQ_CFG_MASK(x) (1 << (x + 15)) | ||
103 | #define EXTIRQ_CFG_BOTHEDGE(x) (1 << (x + 20)) | ||
104 | #define EXTIRQ_CFG_LEVELSENSE(x) (1 << (x + 25)) | ||
105 | |||
106 | #define EXTIRQ_CFG_CLEAR_ALL (0xf << 10) | ||
107 | #define EXTIRQ_CFG_MASK_ALL (0xf << 15) | ||
108 | |||
109 | /* Soft Reset register */ | ||
110 | #define PERF_SOFTRESET_REG 0x28 | ||
111 | |||
112 | #define SOFTRESET_6338_SPI_MASK (1 << 0) | ||
113 | #define SOFTRESET_6338_ENET_MASK (1 << 2) | ||
114 | #define SOFTRESET_6338_USBH_MASK (1 << 3) | ||
115 | #define SOFTRESET_6338_USBS_MASK (1 << 4) | ||
116 | #define SOFTRESET_6338_ADSL_MASK (1 << 5) | ||
117 | #define SOFTRESET_6338_DMAMEM_MASK (1 << 6) | ||
118 | #define SOFTRESET_6338_SAR_MASK (1 << 7) | ||
119 | #define SOFTRESET_6338_ACLC_MASK (1 << 8) | ||
120 | #define SOFTRESET_6338_ADSLMIPSPLL_MASK (1 << 10) | ||
121 | #define SOFTRESET_6338_ALL (SOFTRESET_6338_SPI_MASK | \ | ||
122 | SOFTRESET_6338_ENET_MASK | \ | ||
123 | SOFTRESET_6338_USBH_MASK | \ | ||
124 | SOFTRESET_6338_USBS_MASK | \ | ||
125 | SOFTRESET_6338_ADSL_MASK | \ | ||
126 | SOFTRESET_6338_DMAMEM_MASK | \ | ||
127 | SOFTRESET_6338_SAR_MASK | \ | ||
128 | SOFTRESET_6338_ACLC_MASK | \ | ||
129 | SOFTRESET_6338_ADSLMIPSPLL_MASK) | ||
130 | |||
131 | #define SOFTRESET_6348_SPI_MASK (1 << 0) | ||
132 | #define SOFTRESET_6348_ENET_MASK (1 << 2) | ||
133 | #define SOFTRESET_6348_USBH_MASK (1 << 3) | ||
134 | #define SOFTRESET_6348_USBS_MASK (1 << 4) | ||
135 | #define SOFTRESET_6348_ADSL_MASK (1 << 5) | ||
136 | #define SOFTRESET_6348_DMAMEM_MASK (1 << 6) | ||
137 | #define SOFTRESET_6348_SAR_MASK (1 << 7) | ||
138 | #define SOFTRESET_6348_ACLC_MASK (1 << 8) | ||
139 | #define SOFTRESET_6348_ADSLMIPSPLL_MASK (1 << 10) | ||
140 | |||
141 | #define SOFTRESET_6348_ALL (SOFTRESET_6348_SPI_MASK | \ | ||
142 | SOFTRESET_6348_ENET_MASK | \ | ||
143 | SOFTRESET_6348_USBH_MASK | \ | ||
144 | SOFTRESET_6348_USBS_MASK | \ | ||
145 | SOFTRESET_6348_ADSL_MASK | \ | ||
146 | SOFTRESET_6348_DMAMEM_MASK | \ | ||
147 | SOFTRESET_6348_SAR_MASK | \ | ||
148 | SOFTRESET_6348_ACLC_MASK | \ | ||
149 | SOFTRESET_6348_ADSLMIPSPLL_MASK) | ||
150 | |||
151 | /* MIPS PLL control register */ | ||
152 | #define PERF_MIPSPLLCTL_REG 0x34 | ||
153 | #define MIPSPLLCTL_N1_SHIFT 20 | ||
154 | #define MIPSPLLCTL_N1_MASK (0x7 << MIPSPLLCTL_N1_SHIFT) | ||
155 | #define MIPSPLLCTL_N2_SHIFT 15 | ||
156 | #define MIPSPLLCTL_N2_MASK (0x1f << MIPSPLLCTL_N2_SHIFT) | ||
157 | #define MIPSPLLCTL_M1REF_SHIFT 12 | ||
158 | #define MIPSPLLCTL_M1REF_MASK (0x7 << MIPSPLLCTL_M1REF_SHIFT) | ||
159 | #define MIPSPLLCTL_M2REF_SHIFT 9 | ||
160 | #define MIPSPLLCTL_M2REF_MASK (0x7 << MIPSPLLCTL_M2REF_SHIFT) | ||
161 | #define MIPSPLLCTL_M1CPU_SHIFT 6 | ||
162 | #define MIPSPLLCTL_M1CPU_MASK (0x7 << MIPSPLLCTL_M1CPU_SHIFT) | ||
163 | #define MIPSPLLCTL_M1BUS_SHIFT 3 | ||
164 | #define MIPSPLLCTL_M1BUS_MASK (0x7 << MIPSPLLCTL_M1BUS_SHIFT) | ||
165 | #define MIPSPLLCTL_M2BUS_SHIFT 0 | ||
166 | #define MIPSPLLCTL_M2BUS_MASK (0x7 << MIPSPLLCTL_M2BUS_SHIFT) | ||
167 | |||
168 | /* ADSL PHY PLL Control register */ | ||
169 | #define PERF_ADSLPLLCTL_REG 0x38 | ||
170 | #define ADSLPLLCTL_N1_SHIFT 20 | ||
171 | #define ADSLPLLCTL_N1_MASK (0x7 << ADSLPLLCTL_N1_SHIFT) | ||
172 | #define ADSLPLLCTL_N2_SHIFT 15 | ||
173 | #define ADSLPLLCTL_N2_MASK (0x1f << ADSLPLLCTL_N2_SHIFT) | ||
174 | #define ADSLPLLCTL_M1REF_SHIFT 12 | ||
175 | #define ADSLPLLCTL_M1REF_MASK (0x7 << ADSLPLLCTL_M1REF_SHIFT) | ||
176 | #define ADSLPLLCTL_M2REF_SHIFT 9 | ||
177 | #define ADSLPLLCTL_M2REF_MASK (0x7 << ADSLPLLCTL_M2REF_SHIFT) | ||
178 | #define ADSLPLLCTL_M1CPU_SHIFT 6 | ||
179 | #define ADSLPLLCTL_M1CPU_MASK (0x7 << ADSLPLLCTL_M1CPU_SHIFT) | ||
180 | #define ADSLPLLCTL_M1BUS_SHIFT 3 | ||
181 | #define ADSLPLLCTL_M1BUS_MASK (0x7 << ADSLPLLCTL_M1BUS_SHIFT) | ||
182 | #define ADSLPLLCTL_M2BUS_SHIFT 0 | ||
183 | #define ADSLPLLCTL_M2BUS_MASK (0x7 << ADSLPLLCTL_M2BUS_SHIFT) | ||
184 | |||
185 | #define ADSLPLLCTL_VAL(n1, n2, m1ref, m2ref, m1cpu, m1bus, m2bus) \ | ||
186 | (((n1) << ADSLPLLCTL_N1_SHIFT) | \ | ||
187 | ((n2) << ADSLPLLCTL_N2_SHIFT) | \ | ||
188 | ((m1ref) << ADSLPLLCTL_M1REF_SHIFT) | \ | ||
189 | ((m2ref) << ADSLPLLCTL_M2REF_SHIFT) | \ | ||
190 | ((m1cpu) << ADSLPLLCTL_M1CPU_SHIFT) | \ | ||
191 | ((m1bus) << ADSLPLLCTL_M1BUS_SHIFT) | \ | ||
192 | ((m2bus) << ADSLPLLCTL_M2BUS_SHIFT)) | ||
193 | |||
194 | |||
195 | /************************************************************************* | ||
196 | * _REG relative to RSET_TIMER | ||
197 | *************************************************************************/ | ||
198 | |||
199 | #define BCM63XX_TIMER_COUNT 4 | ||
200 | #define TIMER_T0_ID 0 | ||
201 | #define TIMER_T1_ID 1 | ||
202 | #define TIMER_T2_ID 2 | ||
203 | #define TIMER_WDT_ID 3 | ||
204 | |||
205 | /* Timer irqstat register */ | ||
206 | #define TIMER_IRQSTAT_REG 0 | ||
207 | #define TIMER_IRQSTAT_TIMER_CAUSE(x) (1 << (x)) | ||
208 | #define TIMER_IRQSTAT_TIMER0_CAUSE (1 << 0) | ||
209 | #define TIMER_IRQSTAT_TIMER1_CAUSE (1 << 1) | ||
210 | #define TIMER_IRQSTAT_TIMER2_CAUSE (1 << 2) | ||
211 | #define TIMER_IRQSTAT_WDT_CAUSE (1 << 3) | ||
212 | #define TIMER_IRQSTAT_TIMER_IR_EN(x) (1 << ((x) + 8)) | ||
213 | #define TIMER_IRQSTAT_TIMER0_IR_EN (1 << 8) | ||
214 | #define TIMER_IRQSTAT_TIMER1_IR_EN (1 << 9) | ||
215 | #define TIMER_IRQSTAT_TIMER2_IR_EN (1 << 10) | ||
216 | |||
217 | /* Timer control register */ | ||
218 | #define TIMER_CTLx_REG(x) (0x4 + (x * 4)) | ||
219 | #define TIMER_CTL0_REG 0x4 | ||
220 | #define TIMER_CTL1_REG 0x8 | ||
221 | #define TIMER_CTL2_REG 0xC | ||
222 | #define TIMER_CTL_COUNTDOWN_MASK (0x3fffffff) | ||
223 | #define TIMER_CTL_MONOTONIC_MASK (1 << 30) | ||
224 | #define TIMER_CTL_ENABLE_MASK (1 << 31) | ||
225 | |||
226 | |||
227 | /************************************************************************* | ||
228 | * _REG relative to RSET_WDT | ||
229 | *************************************************************************/ | ||
230 | |||
231 | /* Watchdog default count register */ | ||
232 | #define WDT_DEFVAL_REG 0x0 | ||
233 | |||
234 | /* Watchdog control register */ | ||
235 | #define WDT_CTL_REG 0x4 | ||
236 | |||
237 | /* Watchdog control register constants */ | ||
238 | #define WDT_START_1 (0xff00) | ||
239 | #define WDT_START_2 (0x00ff) | ||
240 | #define WDT_STOP_1 (0xee00) | ||
241 | #define WDT_STOP_2 (0x00ee) | ||
242 | |||
243 | /* Watchdog reset length register */ | ||
244 | #define WDT_RSTLEN_REG 0x8 | ||
245 | |||
246 | |||
247 | /************************************************************************* | ||
248 | * _REG relative to RSET_UARTx | ||
249 | *************************************************************************/ | ||
250 | |||
251 | /* UART Control Register */ | ||
252 | #define UART_CTL_REG 0x0 | ||
253 | #define UART_CTL_RXTMOUTCNT_SHIFT 0 | ||
254 | #define UART_CTL_RXTMOUTCNT_MASK (0x1f << UART_CTL_RXTMOUTCNT_SHIFT) | ||
255 | #define UART_CTL_RSTTXDN_SHIFT 5 | ||
256 | #define UART_CTL_RSTTXDN_MASK (1 << UART_CTL_RSTTXDN_SHIFT) | ||
257 | #define UART_CTL_RSTRXFIFO_SHIFT 6 | ||
258 | #define UART_CTL_RSTRXFIFO_MASK (1 << UART_CTL_RSTRXFIFO_SHIFT) | ||
259 | #define UART_CTL_RSTTXFIFO_SHIFT 7 | ||
260 | #define UART_CTL_RSTTXFIFO_MASK (1 << UART_CTL_RSTTXFIFO_SHIFT) | ||
261 | #define UART_CTL_STOPBITS_SHIFT 8 | ||
262 | #define UART_CTL_STOPBITS_MASK (0xf << UART_CTL_STOPBITS_SHIFT) | ||
263 | #define UART_CTL_STOPBITS_1 (0x7 << UART_CTL_STOPBITS_SHIFT) | ||
264 | #define UART_CTL_STOPBITS_2 (0xf << UART_CTL_STOPBITS_SHIFT) | ||
265 | #define UART_CTL_BITSPERSYM_SHIFT 12 | ||
266 | #define UART_CTL_BITSPERSYM_MASK (0x3 << UART_CTL_BITSPERSYM_SHIFT) | ||
267 | #define UART_CTL_XMITBRK_SHIFT 14 | ||
268 | #define UART_CTL_XMITBRK_MASK (1 << UART_CTL_XMITBRK_SHIFT) | ||
269 | #define UART_CTL_RSVD_SHIFT 15 | ||
270 | #define UART_CTL_RSVD_MASK (1 << UART_CTL_RSVD_SHIFT) | ||
271 | #define UART_CTL_RXPAREVEN_SHIFT 16 | ||
272 | #define UART_CTL_RXPAREVEN_MASK (1 << UART_CTL_RXPAREVEN_SHIFT) | ||
273 | #define UART_CTL_RXPAREN_SHIFT 17 | ||
274 | #define UART_CTL_RXPAREN_MASK (1 << UART_CTL_RXPAREN_SHIFT) | ||
275 | #define UART_CTL_TXPAREVEN_SHIFT 18 | ||
276 | #define UART_CTL_TXPAREVEN_MASK (1 << UART_CTL_TXPAREVEN_SHIFT) | ||
277 | #define UART_CTL_TXPAREN_SHIFT 18 | ||
278 | #define UART_CTL_TXPAREN_MASK (1 << UART_CTL_TXPAREN_SHIFT) | ||
279 | #define UART_CTL_LOOPBACK_SHIFT 20 | ||
280 | #define UART_CTL_LOOPBACK_MASK (1 << UART_CTL_LOOPBACK_SHIFT) | ||
281 | #define UART_CTL_RXEN_SHIFT 21 | ||
282 | #define UART_CTL_RXEN_MASK (1 << UART_CTL_RXEN_SHIFT) | ||
283 | #define UART_CTL_TXEN_SHIFT 22 | ||
284 | #define UART_CTL_TXEN_MASK (1 << UART_CTL_TXEN_SHIFT) | ||
285 | #define UART_CTL_BRGEN_SHIFT 23 | ||
286 | #define UART_CTL_BRGEN_MASK (1 << UART_CTL_BRGEN_SHIFT) | ||
287 | |||
288 | /* UART Baudword register */ | ||
289 | #define UART_BAUD_REG 0x4 | ||
290 | |||
291 | /* UART Misc Control register */ | ||
292 | #define UART_MCTL_REG 0x8 | ||
293 | #define UART_MCTL_DTR_SHIFT 0 | ||
294 | #define UART_MCTL_DTR_MASK (1 << UART_MCTL_DTR_SHIFT) | ||
295 | #define UART_MCTL_RTS_SHIFT 1 | ||
296 | #define UART_MCTL_RTS_MASK (1 << UART_MCTL_RTS_SHIFT) | ||
297 | #define UART_MCTL_RXFIFOTHRESH_SHIFT 8 | ||
298 | #define UART_MCTL_RXFIFOTHRESH_MASK (0xf << UART_MCTL_RXFIFOTHRESH_SHIFT) | ||
299 | #define UART_MCTL_TXFIFOTHRESH_SHIFT 12 | ||
300 | #define UART_MCTL_TXFIFOTHRESH_MASK (0xf << UART_MCTL_TXFIFOTHRESH_SHIFT) | ||
301 | #define UART_MCTL_RXFIFOFILL_SHIFT 16 | ||
302 | #define UART_MCTL_RXFIFOFILL_MASK (0x1f << UART_MCTL_RXFIFOFILL_SHIFT) | ||
303 | #define UART_MCTL_TXFIFOFILL_SHIFT 24 | ||
304 | #define UART_MCTL_TXFIFOFILL_MASK (0x1f << UART_MCTL_TXFIFOFILL_SHIFT) | ||
305 | |||
306 | /* UART External Input Configuration register */ | ||
307 | #define UART_EXTINP_REG 0xc | ||
308 | #define UART_EXTINP_RI_SHIFT 0 | ||
309 | #define UART_EXTINP_RI_MASK (1 << UART_EXTINP_RI_SHIFT) | ||
310 | #define UART_EXTINP_CTS_SHIFT 1 | ||
311 | #define UART_EXTINP_CTS_MASK (1 << UART_EXTINP_CTS_SHIFT) | ||
312 | #define UART_EXTINP_DCD_SHIFT 2 | ||
313 | #define UART_EXTINP_DCD_MASK (1 << UART_EXTINP_DCD_SHIFT) | ||
314 | #define UART_EXTINP_DSR_SHIFT 3 | ||
315 | #define UART_EXTINP_DSR_MASK (1 << UART_EXTINP_DSR_SHIFT) | ||
316 | #define UART_EXTINP_IRSTAT(x) (1 << (x + 4)) | ||
317 | #define UART_EXTINP_IRMASK(x) (1 << (x + 8)) | ||
318 | #define UART_EXTINP_IR_RI 0 | ||
319 | #define UART_EXTINP_IR_CTS 1 | ||
320 | #define UART_EXTINP_IR_DCD 2 | ||
321 | #define UART_EXTINP_IR_DSR 3 | ||
322 | #define UART_EXTINP_RI_NOSENSE_SHIFT 16 | ||
323 | #define UART_EXTINP_RI_NOSENSE_MASK (1 << UART_EXTINP_RI_NOSENSE_SHIFT) | ||
324 | #define UART_EXTINP_CTS_NOSENSE_SHIFT 17 | ||
325 | #define UART_EXTINP_CTS_NOSENSE_MASK (1 << UART_EXTINP_CTS_NOSENSE_SHIFT) | ||
326 | #define UART_EXTINP_DCD_NOSENSE_SHIFT 18 | ||
327 | #define UART_EXTINP_DCD_NOSENSE_MASK (1 << UART_EXTINP_DCD_NOSENSE_SHIFT) | ||
328 | #define UART_EXTINP_DSR_NOSENSE_SHIFT 19 | ||
329 | #define UART_EXTINP_DSR_NOSENSE_MASK (1 << UART_EXTINP_DSR_NOSENSE_SHIFT) | ||
330 | |||
331 | /* UART Interrupt register */ | ||
332 | #define UART_IR_REG 0x10 | ||
333 | #define UART_IR_MASK(x) (1 << (x + 16)) | ||
334 | #define UART_IR_STAT(x) (1 << (x)) | ||
335 | #define UART_IR_EXTIP 0 | ||
336 | #define UART_IR_TXUNDER 1 | ||
337 | #define UART_IR_TXOVER 2 | ||
338 | #define UART_IR_TXTRESH 3 | ||
339 | #define UART_IR_TXRDLATCH 4 | ||
340 | #define UART_IR_TXEMPTY 5 | ||
341 | #define UART_IR_RXUNDER 6 | ||
342 | #define UART_IR_RXOVER 7 | ||
343 | #define UART_IR_RXTIMEOUT 8 | ||
344 | #define UART_IR_RXFULL 9 | ||
345 | #define UART_IR_RXTHRESH 10 | ||
346 | #define UART_IR_RXNOTEMPTY 11 | ||
347 | #define UART_IR_RXFRAMEERR 12 | ||
348 | #define UART_IR_RXPARERR 13 | ||
349 | #define UART_IR_RXBRK 14 | ||
350 | #define UART_IR_TXDONE 15 | ||
351 | |||
352 | /* UART Fifo register */ | ||
353 | #define UART_FIFO_REG 0x14 | ||
354 | #define UART_FIFO_VALID_SHIFT 0 | ||
355 | #define UART_FIFO_VALID_MASK 0xff | ||
356 | #define UART_FIFO_FRAMEERR_SHIFT 8 | ||
357 | #define UART_FIFO_FRAMEERR_MASK (1 << UART_FIFO_FRAMEERR_SHIFT) | ||
358 | #define UART_FIFO_PARERR_SHIFT 9 | ||
359 | #define UART_FIFO_PARERR_MASK (1 << UART_FIFO_PARERR_SHIFT) | ||
360 | #define UART_FIFO_BRKDET_SHIFT 10 | ||
361 | #define UART_FIFO_BRKDET_MASK (1 << UART_FIFO_BRKDET_SHIFT) | ||
362 | #define UART_FIFO_ANYERR_MASK (UART_FIFO_FRAMEERR_MASK | \ | ||
363 | UART_FIFO_PARERR_MASK | \ | ||
364 | UART_FIFO_BRKDET_MASK) | ||
365 | |||
366 | |||
367 | /************************************************************************* | ||
368 | * _REG relative to RSET_GPIO | ||
369 | *************************************************************************/ | ||
370 | |||
371 | /* GPIO registers */ | ||
372 | #define GPIO_CTL_HI_REG 0x0 | ||
373 | #define GPIO_CTL_LO_REG 0x4 | ||
374 | #define GPIO_DATA_HI_REG 0x8 | ||
375 | #define GPIO_DATA_LO_REG 0xC | ||
376 | |||
377 | /* GPIO mux registers and constants */ | ||
378 | #define GPIO_MODE_REG 0x18 | ||
379 | |||
380 | #define GPIO_MODE_6348_G4_DIAG 0x00090000 | ||
381 | #define GPIO_MODE_6348_G4_UTOPIA 0x00080000 | ||
382 | #define GPIO_MODE_6348_G4_LEGACY_LED 0x00030000 | ||
383 | #define GPIO_MODE_6348_G4_MII_SNOOP 0x00020000 | ||
384 | #define GPIO_MODE_6348_G4_EXT_EPHY 0x00010000 | ||
385 | #define GPIO_MODE_6348_G3_DIAG 0x00009000 | ||
386 | #define GPIO_MODE_6348_G3_UTOPIA 0x00008000 | ||
387 | #define GPIO_MODE_6348_G3_EXT_MII 0x00007000 | ||
388 | #define GPIO_MODE_6348_G2_DIAG 0x00000900 | ||
389 | #define GPIO_MODE_6348_G2_PCI 0x00000500 | ||
390 | #define GPIO_MODE_6348_G1_DIAG 0x00000090 | ||
391 | #define GPIO_MODE_6348_G1_UTOPIA 0x00000080 | ||
392 | #define GPIO_MODE_6348_G1_SPI_UART 0x00000060 | ||
393 | #define GPIO_MODE_6348_G1_SPI_MASTER 0x00000060 | ||
394 | #define GPIO_MODE_6348_G1_MII_PCCARD 0x00000040 | ||
395 | #define GPIO_MODE_6348_G1_MII_SNOOP 0x00000020 | ||
396 | #define GPIO_MODE_6348_G1_EXT_EPHY 0x00000010 | ||
397 | #define GPIO_MODE_6348_G0_DIAG 0x00000009 | ||
398 | #define GPIO_MODE_6348_G0_EXT_MII 0x00000007 | ||
399 | |||
400 | #define GPIO_MODE_6358_EXTRACS (1 << 5) | ||
401 | #define GPIO_MODE_6358_UART1 (1 << 6) | ||
402 | #define GPIO_MODE_6358_EXTRA_SPI_SS (1 << 7) | ||
403 | #define GPIO_MODE_6358_SERIAL_LED (1 << 10) | ||
404 | #define GPIO_MODE_6358_UTOPIA (1 << 12) | ||
405 | |||
406 | |||
407 | /************************************************************************* | ||
408 | * _REG relative to RSET_ENET | ||
409 | *************************************************************************/ | ||
410 | |||
411 | /* Receiver Configuration register */ | ||
412 | #define ENET_RXCFG_REG 0x0 | ||
413 | #define ENET_RXCFG_ALLMCAST_SHIFT 1 | ||
414 | #define ENET_RXCFG_ALLMCAST_MASK (1 << ENET_RXCFG_ALLMCAST_SHIFT) | ||
415 | #define ENET_RXCFG_PROMISC_SHIFT 3 | ||
416 | #define ENET_RXCFG_PROMISC_MASK (1 << ENET_RXCFG_PROMISC_SHIFT) | ||
417 | #define ENET_RXCFG_LOOPBACK_SHIFT 4 | ||
418 | #define ENET_RXCFG_LOOPBACK_MASK (1 << ENET_RXCFG_LOOPBACK_SHIFT) | ||
419 | #define ENET_RXCFG_ENFLOW_SHIFT 5 | ||
420 | #define ENET_RXCFG_ENFLOW_MASK (1 << ENET_RXCFG_ENFLOW_SHIFT) | ||
421 | |||
422 | /* Receive Maximum Length register */ | ||
423 | #define ENET_RXMAXLEN_REG 0x4 | ||
424 | #define ENET_RXMAXLEN_SHIFT 0 | ||
425 | #define ENET_RXMAXLEN_MASK (0x7ff << ENET_RXMAXLEN_SHIFT) | ||
426 | |||
427 | /* Transmit Maximum Length register */ | ||
428 | #define ENET_TXMAXLEN_REG 0x8 | ||
429 | #define ENET_TXMAXLEN_SHIFT 0 | ||
430 | #define ENET_TXMAXLEN_MASK (0x7ff << ENET_TXMAXLEN_SHIFT) | ||
431 | |||
432 | /* MII Status/Control register */ | ||
433 | #define ENET_MIISC_REG 0x10 | ||
434 | #define ENET_MIISC_MDCFREQDIV_SHIFT 0 | ||
435 | #define ENET_MIISC_MDCFREQDIV_MASK (0x7f << ENET_MIISC_MDCFREQDIV_SHIFT) | ||
436 | #define ENET_MIISC_PREAMBLEEN_SHIFT 7 | ||
437 | #define ENET_MIISC_PREAMBLEEN_MASK (1 << ENET_MIISC_PREAMBLEEN_SHIFT) | ||
438 | |||
439 | /* MII Data register */ | ||
440 | #define ENET_MIIDATA_REG 0x14 | ||
441 | #define ENET_MIIDATA_DATA_SHIFT 0 | ||
442 | #define ENET_MIIDATA_DATA_MASK (0xffff << ENET_MIIDATA_DATA_SHIFT) | ||
443 | #define ENET_MIIDATA_TA_SHIFT 16 | ||
444 | #define ENET_MIIDATA_TA_MASK (0x3 << ENET_MIIDATA_TA_SHIFT) | ||
445 | #define ENET_MIIDATA_REG_SHIFT 18 | ||
446 | #define ENET_MIIDATA_REG_MASK (0x1f << ENET_MIIDATA_REG_SHIFT) | ||
447 | #define ENET_MIIDATA_PHYID_SHIFT 23 | ||
448 | #define ENET_MIIDATA_PHYID_MASK (0x1f << ENET_MIIDATA_PHYID_SHIFT) | ||
449 | #define ENET_MIIDATA_OP_READ_MASK (0x6 << 28) | ||
450 | #define ENET_MIIDATA_OP_WRITE_MASK (0x5 << 28) | ||
451 | |||
452 | /* Ethernet Interrupt Mask register */ | ||
453 | #define ENET_IRMASK_REG 0x18 | ||
454 | |||
455 | /* Ethernet Interrupt register */ | ||
456 | #define ENET_IR_REG 0x1c | ||
457 | #define ENET_IR_MII (1 << 0) | ||
458 | #define ENET_IR_MIB (1 << 1) | ||
459 | #define ENET_IR_FLOWC (1 << 2) | ||
460 | |||
461 | /* Ethernet Control register */ | ||
462 | #define ENET_CTL_REG 0x2c | ||
463 | #define ENET_CTL_ENABLE_SHIFT 0 | ||
464 | #define ENET_CTL_ENABLE_MASK (1 << ENET_CTL_ENABLE_SHIFT) | ||
465 | #define ENET_CTL_DISABLE_SHIFT 1 | ||
466 | #define ENET_CTL_DISABLE_MASK (1 << ENET_CTL_DISABLE_SHIFT) | ||
467 | #define ENET_CTL_SRESET_SHIFT 2 | ||
468 | #define ENET_CTL_SRESET_MASK (1 << ENET_CTL_SRESET_SHIFT) | ||
469 | #define ENET_CTL_EPHYSEL_SHIFT 3 | ||
470 | #define ENET_CTL_EPHYSEL_MASK (1 << ENET_CTL_EPHYSEL_SHIFT) | ||
471 | |||
472 | /* Transmit Control register */ | ||
473 | #define ENET_TXCTL_REG 0x30 | ||
474 | #define ENET_TXCTL_FD_SHIFT 0 | ||
475 | #define ENET_TXCTL_FD_MASK (1 << ENET_TXCTL_FD_SHIFT) | ||
476 | |||
477 | /* Transmit Watermask register */ | ||
478 | #define ENET_TXWMARK_REG 0x34 | ||
479 | #define ENET_TXWMARK_WM_SHIFT 0 | ||
480 | #define ENET_TXWMARK_WM_MASK (0x3f << ENET_TXWMARK_WM_SHIFT) | ||
481 | |||
482 | /* MIB Control register */ | ||
483 | #define ENET_MIBCTL_REG 0x38 | ||
484 | #define ENET_MIBCTL_RDCLEAR_SHIFT 0 | ||
485 | #define ENET_MIBCTL_RDCLEAR_MASK (1 << ENET_MIBCTL_RDCLEAR_SHIFT) | ||
486 | |||
487 | /* Perfect Match Data Low register */ | ||
488 | #define ENET_PML_REG(x) (0x58 + (x) * 8) | ||
489 | #define ENET_PMH_REG(x) (0x5c + (x) * 8) | ||
490 | #define ENET_PMH_DATAVALID_SHIFT 16 | ||
491 | #define ENET_PMH_DATAVALID_MASK (1 << ENET_PMH_DATAVALID_SHIFT) | ||
492 | |||
493 | /* MIB register */ | ||
494 | #define ENET_MIB_REG(x) (0x200 + (x) * 4) | ||
495 | #define ENET_MIB_REG_COUNT 55 | ||
496 | |||
497 | |||
498 | /************************************************************************* | ||
499 | * _REG relative to RSET_ENETDMA | ||
500 | *************************************************************************/ | ||
501 | |||
502 | /* Controller Configuration Register */ | ||
503 | #define ENETDMA_CFG_REG (0x0) | ||
504 | #define ENETDMA_CFG_EN_SHIFT 0 | ||
505 | #define ENETDMA_CFG_EN_MASK (1 << ENETDMA_CFG_EN_SHIFT) | ||
506 | #define ENETDMA_CFG_FLOWCH_MASK(x) (1 << ((x >> 1) + 1)) | ||
507 | |||
508 | /* Flow Control Descriptor Low Threshold register */ | ||
509 | #define ENETDMA_FLOWCL_REG(x) (0x4 + (x) * 6) | ||
510 | |||
511 | /* Flow Control Descriptor High Threshold register */ | ||
512 | #define ENETDMA_FLOWCH_REG(x) (0x8 + (x) * 6) | ||
513 | |||
514 | /* Flow Control Descriptor Buffer Alloca Threshold register */ | ||
515 | #define ENETDMA_BUFALLOC_REG(x) (0xc + (x) * 6) | ||
516 | #define ENETDMA_BUFALLOC_FORCE_SHIFT 31 | ||
517 | #define ENETDMA_BUFALLOC_FORCE_MASK (1 << ENETDMA_BUFALLOC_FORCE_SHIFT) | ||
518 | |||
519 | /* Channel Configuration register */ | ||
520 | #define ENETDMA_CHANCFG_REG(x) (0x100 + (x) * 0x10) | ||
521 | #define ENETDMA_CHANCFG_EN_SHIFT 0 | ||
522 | #define ENETDMA_CHANCFG_EN_MASK (1 << ENETDMA_CHANCFG_EN_SHIFT) | ||
523 | #define ENETDMA_CHANCFG_PKTHALT_SHIFT 1 | ||
524 | #define ENETDMA_CHANCFG_PKTHALT_MASK (1 << ENETDMA_CHANCFG_PKTHALT_SHIFT) | ||
525 | |||
526 | /* Interrupt Control/Status register */ | ||
527 | #define ENETDMA_IR_REG(x) (0x104 + (x) * 0x10) | ||
528 | #define ENETDMA_IR_BUFDONE_MASK (1 << 0) | ||
529 | #define ENETDMA_IR_PKTDONE_MASK (1 << 1) | ||
530 | #define ENETDMA_IR_NOTOWNER_MASK (1 << 2) | ||
531 | |||
532 | /* Interrupt Mask register */ | ||
533 | #define ENETDMA_IRMASK_REG(x) (0x108 + (x) * 0x10) | ||
534 | |||
535 | /* Maximum Burst Length */ | ||
536 | #define ENETDMA_MAXBURST_REG(x) (0x10C + (x) * 0x10) | ||
537 | |||
538 | /* Ring Start Address register */ | ||
539 | #define ENETDMA_RSTART_REG(x) (0x200 + (x) * 0x10) | ||
540 | |||
541 | /* State Ram Word 2 */ | ||
542 | #define ENETDMA_SRAM2_REG(x) (0x204 + (x) * 0x10) | ||
543 | |||
544 | /* State Ram Word 3 */ | ||
545 | #define ENETDMA_SRAM3_REG(x) (0x208 + (x) * 0x10) | ||
546 | |||
547 | /* State Ram Word 4 */ | ||
548 | #define ENETDMA_SRAM4_REG(x) (0x20c + (x) * 0x10) | ||
549 | |||
550 | |||
551 | /************************************************************************* | ||
552 | * _REG relative to RSET_OHCI_PRIV | ||
553 | *************************************************************************/ | ||
554 | |||
555 | #define OHCI_PRIV_REG 0x0 | ||
556 | #define OHCI_PRIV_PORT1_HOST_SHIFT 0 | ||
557 | #define OHCI_PRIV_PORT1_HOST_MASK (1 << OHCI_PRIV_PORT1_HOST_SHIFT) | ||
558 | #define OHCI_PRIV_REG_SWAP_SHIFT 3 | ||
559 | #define OHCI_PRIV_REG_SWAP_MASK (1 << OHCI_PRIV_REG_SWAP_SHIFT) | ||
560 | |||
561 | |||
562 | /************************************************************************* | ||
563 | * _REG relative to RSET_USBH_PRIV | ||
564 | *************************************************************************/ | ||
565 | |||
566 | #define USBH_PRIV_SWAP_REG 0x0 | ||
567 | #define USBH_PRIV_SWAP_EHCI_ENDN_SHIFT 4 | ||
568 | #define USBH_PRIV_SWAP_EHCI_ENDN_MASK (1 << USBH_PRIV_SWAP_EHCI_ENDN_SHIFT) | ||
569 | #define USBH_PRIV_SWAP_EHCI_DATA_SHIFT 3 | ||
570 | #define USBH_PRIV_SWAP_EHCI_DATA_MASK (1 << USBH_PRIV_SWAP_EHCI_DATA_SHIFT) | ||
571 | #define USBH_PRIV_SWAP_OHCI_ENDN_SHIFT 1 | ||
572 | #define USBH_PRIV_SWAP_OHCI_ENDN_MASK (1 << USBH_PRIV_SWAP_OHCI_ENDN_SHIFT) | ||
573 | #define USBH_PRIV_SWAP_OHCI_DATA_SHIFT 0 | ||
574 | #define USBH_PRIV_SWAP_OHCI_DATA_MASK (1 << USBH_PRIV_SWAP_OHCI_DATA_SHIFT) | ||
575 | |||
576 | #define USBH_PRIV_TEST_REG 0x24 | ||
577 | |||
578 | |||
579 | /************************************************************************* | ||
580 | * _REG relative to RSET_MPI | ||
581 | *************************************************************************/ | ||
582 | |||
583 | /* well known (hard wired) chip select */ | ||
584 | #define MPI_CS_PCMCIA_COMMON 4 | ||
585 | #define MPI_CS_PCMCIA_ATTR 5 | ||
586 | #define MPI_CS_PCMCIA_IO 6 | ||
587 | |||
588 | /* Chip select base register */ | ||
589 | #define MPI_CSBASE_REG(x) (0x0 + (x) * 8) | ||
590 | #define MPI_CSBASE_BASE_SHIFT 13 | ||
591 | #define MPI_CSBASE_BASE_MASK (0x1ffff << MPI_CSBASE_BASE_SHIFT) | ||
592 | #define MPI_CSBASE_SIZE_SHIFT 0 | ||
593 | #define MPI_CSBASE_SIZE_MASK (0xf << MPI_CSBASE_SIZE_SHIFT) | ||
594 | |||
595 | #define MPI_CSBASE_SIZE_8K 0 | ||
596 | #define MPI_CSBASE_SIZE_16K 1 | ||
597 | #define MPI_CSBASE_SIZE_32K 2 | ||
598 | #define MPI_CSBASE_SIZE_64K 3 | ||
599 | #define MPI_CSBASE_SIZE_128K 4 | ||
600 | #define MPI_CSBASE_SIZE_256K 5 | ||
601 | #define MPI_CSBASE_SIZE_512K 6 | ||
602 | #define MPI_CSBASE_SIZE_1M 7 | ||
603 | #define MPI_CSBASE_SIZE_2M 8 | ||
604 | #define MPI_CSBASE_SIZE_4M 9 | ||
605 | #define MPI_CSBASE_SIZE_8M 10 | ||
606 | #define MPI_CSBASE_SIZE_16M 11 | ||
607 | #define MPI_CSBASE_SIZE_32M 12 | ||
608 | #define MPI_CSBASE_SIZE_64M 13 | ||
609 | #define MPI_CSBASE_SIZE_128M 14 | ||
610 | #define MPI_CSBASE_SIZE_256M 15 | ||
611 | |||
612 | /* Chip select control register */ | ||
613 | #define MPI_CSCTL_REG(x) (0x4 + (x) * 8) | ||
614 | #define MPI_CSCTL_ENABLE_MASK (1 << 0) | ||
615 | #define MPI_CSCTL_WAIT_SHIFT 1 | ||
616 | #define MPI_CSCTL_WAIT_MASK (0x7 << MPI_CSCTL_WAIT_SHIFT) | ||
617 | #define MPI_CSCTL_DATA16_MASK (1 << 4) | ||
618 | #define MPI_CSCTL_SYNCMODE_MASK (1 << 7) | ||
619 | #define MPI_CSCTL_TSIZE_MASK (1 << 8) | ||
620 | #define MPI_CSCTL_ENDIANSWAP_MASK (1 << 10) | ||
621 | #define MPI_CSCTL_SETUP_SHIFT 16 | ||
622 | #define MPI_CSCTL_SETUP_MASK (0xf << MPI_CSCTL_SETUP_SHIFT) | ||
623 | #define MPI_CSCTL_HOLD_SHIFT 20 | ||
624 | #define MPI_CSCTL_HOLD_MASK (0xf << MPI_CSCTL_HOLD_SHIFT) | ||
625 | |||
626 | /* PCI registers */ | ||
627 | #define MPI_SP0_RANGE_REG 0x100 | ||
628 | #define MPI_SP0_REMAP_REG 0x104 | ||
629 | #define MPI_SP0_REMAP_ENABLE_MASK (1 << 0) | ||
630 | #define MPI_SP1_RANGE_REG 0x10C | ||
631 | #define MPI_SP1_REMAP_REG 0x110 | ||
632 | #define MPI_SP1_REMAP_ENABLE_MASK (1 << 0) | ||
633 | |||
634 | #define MPI_L2PCFG_REG 0x11C | ||
635 | #define MPI_L2PCFG_CFG_TYPE_SHIFT 0 | ||
636 | #define MPI_L2PCFG_CFG_TYPE_MASK (0x3 << MPI_L2PCFG_CFG_TYPE_SHIFT) | ||
637 | #define MPI_L2PCFG_REG_SHIFT 2 | ||
638 | #define MPI_L2PCFG_REG_MASK (0x3f << MPI_L2PCFG_REG_SHIFT) | ||
639 | #define MPI_L2PCFG_FUNC_SHIFT 8 | ||
640 | #define MPI_L2PCFG_FUNC_MASK (0x7 << MPI_L2PCFG_FUNC_SHIFT) | ||
641 | #define MPI_L2PCFG_DEVNUM_SHIFT 11 | ||
642 | #define MPI_L2PCFG_DEVNUM_MASK (0x1f << MPI_L2PCFG_DEVNUM_SHIFT) | ||
643 | #define MPI_L2PCFG_CFG_USEREG_MASK (1 << 30) | ||
644 | #define MPI_L2PCFG_CFG_SEL_MASK (1 << 31) | ||
645 | |||
646 | #define MPI_L2PMEMRANGE1_REG 0x120 | ||
647 | #define MPI_L2PMEMBASE1_REG 0x124 | ||
648 | #define MPI_L2PMEMREMAP1_REG 0x128 | ||
649 | #define MPI_L2PMEMRANGE2_REG 0x12C | ||
650 | #define MPI_L2PMEMBASE2_REG 0x130 | ||
651 | #define MPI_L2PMEMREMAP2_REG 0x134 | ||
652 | #define MPI_L2PIORANGE_REG 0x138 | ||
653 | #define MPI_L2PIOBASE_REG 0x13C | ||
654 | #define MPI_L2PIOREMAP_REG 0x140 | ||
655 | #define MPI_L2P_BASE_MASK (0xffff8000) | ||
656 | #define MPI_L2PREMAP_ENABLED_MASK (1 << 0) | ||
657 | #define MPI_L2PREMAP_IS_CARDBUS_MASK (1 << 2) | ||
658 | |||
659 | #define MPI_PCIMODESEL_REG 0x144 | ||
660 | #define MPI_PCIMODESEL_BAR1_NOSWAP_MASK (1 << 0) | ||
661 | #define MPI_PCIMODESEL_BAR2_NOSWAP_MASK (1 << 1) | ||
662 | #define MPI_PCIMODESEL_EXT_ARB_MASK (1 << 2) | ||
663 | #define MPI_PCIMODESEL_PREFETCH_SHIFT 4 | ||
664 | #define MPI_PCIMODESEL_PREFETCH_MASK (0xf << MPI_PCIMODESEL_PREFETCH_SHIFT) | ||
665 | |||
666 | #define MPI_LOCBUSCTL_REG 0x14C | ||
667 | #define MPI_LOCBUSCTL_EN_PCI_GPIO_MASK (1 << 0) | ||
668 | #define MPI_LOCBUSCTL_U2P_NOSWAP_MASK (1 << 1) | ||
669 | |||
670 | #define MPI_LOCINT_REG 0x150 | ||
671 | #define MPI_LOCINT_MASK(x) (1 << (x + 16)) | ||
672 | #define MPI_LOCINT_STAT(x) (1 << (x)) | ||
673 | #define MPI_LOCINT_DIR_FAILED 6 | ||
674 | #define MPI_LOCINT_EXT_PCI_INT 7 | ||
675 | #define MPI_LOCINT_SERR 8 | ||
676 | #define MPI_LOCINT_CSERR 9 | ||
677 | |||
678 | #define MPI_PCICFGCTL_REG 0x178 | ||
679 | #define MPI_PCICFGCTL_CFGADDR_SHIFT 2 | ||
680 | #define MPI_PCICFGCTL_CFGADDR_MASK (0x1f << MPI_PCICFGCTL_CFGADDR_SHIFT) | ||
681 | #define MPI_PCICFGCTL_WRITEEN_MASK (1 << 7) | ||
682 | |||
683 | #define MPI_PCICFGDATA_REG 0x17C | ||
684 | |||
685 | /* PCI host bridge custom register */ | ||
686 | #define BCMPCI_REG_TIMERS 0x40 | ||
687 | #define REG_TIMER_TRDY_SHIFT 0 | ||
688 | #define REG_TIMER_TRDY_MASK (0xff << REG_TIMER_TRDY_SHIFT) | ||
689 | #define REG_TIMER_RETRY_SHIFT 8 | ||
690 | #define REG_TIMER_RETRY_MASK (0xff << REG_TIMER_RETRY_SHIFT) | ||
691 | |||
692 | |||
693 | /************************************************************************* | ||
694 | * _REG relative to RSET_PCMCIA | ||
695 | *************************************************************************/ | ||
696 | |||
697 | #define PCMCIA_C1_REG 0x0 | ||
698 | #define PCMCIA_C1_CD1_MASK (1 << 0) | ||
699 | #define PCMCIA_C1_CD2_MASK (1 << 1) | ||
700 | #define PCMCIA_C1_VS1_MASK (1 << 2) | ||
701 | #define PCMCIA_C1_VS2_MASK (1 << 3) | ||
702 | #define PCMCIA_C1_VS1OE_MASK (1 << 6) | ||
703 | #define PCMCIA_C1_VS2OE_MASK (1 << 7) | ||
704 | #define PCMCIA_C1_CBIDSEL_SHIFT (8) | ||
705 | #define PCMCIA_C1_CBIDSEL_MASK (0x1f << PCMCIA_C1_CBIDSEL_SHIFT) | ||
706 | #define PCMCIA_C1_EN_PCMCIA_GPIO_MASK (1 << 13) | ||
707 | #define PCMCIA_C1_EN_PCMCIA_MASK (1 << 14) | ||
708 | #define PCMCIA_C1_EN_CARDBUS_MASK (1 << 15) | ||
709 | #define PCMCIA_C1_RESET_MASK (1 << 18) | ||
710 | |||
711 | #define PCMCIA_C2_REG 0x8 | ||
712 | #define PCMCIA_C2_DATA16_MASK (1 << 0) | ||
713 | #define PCMCIA_C2_BYTESWAP_MASK (1 << 1) | ||
714 | #define PCMCIA_C2_RWCOUNT_SHIFT 2 | ||
715 | #define PCMCIA_C2_RWCOUNT_MASK (0x3f << PCMCIA_C2_RWCOUNT_SHIFT) | ||
716 | #define PCMCIA_C2_INACTIVE_SHIFT 8 | ||
717 | #define PCMCIA_C2_INACTIVE_MASK (0x3f << PCMCIA_C2_INACTIVE_SHIFT) | ||
718 | #define PCMCIA_C2_SETUP_SHIFT 16 | ||
719 | #define PCMCIA_C2_SETUP_MASK (0x3f << PCMCIA_C2_SETUP_SHIFT) | ||
720 | #define PCMCIA_C2_HOLD_SHIFT 24 | ||
721 | #define PCMCIA_C2_HOLD_MASK (0x3f << PCMCIA_C2_HOLD_SHIFT) | ||
722 | |||
723 | |||
724 | /************************************************************************* | ||
725 | * _REG relative to RSET_SDRAM | ||
726 | *************************************************************************/ | ||
727 | |||
728 | #define SDRAM_CFG_REG 0x0 | ||
729 | #define SDRAM_CFG_ROW_SHIFT 4 | ||
730 | #define SDRAM_CFG_ROW_MASK (0x3 << SDRAM_CFG_ROW_SHIFT) | ||
731 | #define SDRAM_CFG_COL_SHIFT 6 | ||
732 | #define SDRAM_CFG_COL_MASK (0x3 << SDRAM_CFG_COL_SHIFT) | ||
733 | #define SDRAM_CFG_32B_SHIFT 10 | ||
734 | #define SDRAM_CFG_32B_MASK (1 << SDRAM_CFG_32B_SHIFT) | ||
735 | #define SDRAM_CFG_BANK_SHIFT 13 | ||
736 | #define SDRAM_CFG_BANK_MASK (1 << SDRAM_CFG_BANK_SHIFT) | ||
737 | |||
738 | #define SDRAM_PRIO_REG 0x2C | ||
739 | #define SDRAM_PRIO_MIPS_SHIFT 29 | ||
740 | #define SDRAM_PRIO_MIPS_MASK (1 << SDRAM_PRIO_MIPS_SHIFT) | ||
741 | #define SDRAM_PRIO_ADSL_SHIFT 30 | ||
742 | #define SDRAM_PRIO_ADSL_MASK (1 << SDRAM_PRIO_ADSL_SHIFT) | ||
743 | #define SDRAM_PRIO_EN_SHIFT 31 | ||
744 | #define SDRAM_PRIO_EN_MASK (1 << SDRAM_PRIO_EN_SHIFT) | ||
745 | |||
746 | |||
747 | /************************************************************************* | ||
748 | * _REG relative to RSET_MEMC | ||
749 | *************************************************************************/ | ||
750 | |||
751 | #define MEMC_CFG_REG 0x4 | ||
752 | #define MEMC_CFG_32B_SHIFT 1 | ||
753 | #define MEMC_CFG_32B_MASK (1 << MEMC_CFG_32B_SHIFT) | ||
754 | #define MEMC_CFG_COL_SHIFT 3 | ||
755 | #define MEMC_CFG_COL_MASK (0x3 << MEMC_CFG_COL_SHIFT) | ||
756 | #define MEMC_CFG_ROW_SHIFT 6 | ||
757 | #define MEMC_CFG_ROW_MASK (0x3 << MEMC_CFG_ROW_SHIFT) | ||
758 | |||
759 | |||
760 | /************************************************************************* | ||
761 | * _REG relative to RSET_DDR | ||
762 | *************************************************************************/ | ||
763 | |||
764 | #define DDR_DMIPSPLLCFG_REG 0x18 | ||
765 | #define DMIPSPLLCFG_M1_SHIFT 0 | ||
766 | #define DMIPSPLLCFG_M1_MASK (0xff << DMIPSPLLCFG_M1_SHIFT) | ||
767 | #define DMIPSPLLCFG_N1_SHIFT 23 | ||
768 | #define DMIPSPLLCFG_N1_MASK (0x3f << DMIPSPLLCFG_N1_SHIFT) | ||
769 | #define DMIPSPLLCFG_N2_SHIFT 29 | ||
770 | #define DMIPSPLLCFG_N2_MASK (0x7 << DMIPSPLLCFG_N2_SHIFT) | ||
771 | |||
772 | #endif /* BCM63XX_REGS_H_ */ | ||
773 | |||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_timer.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_timer.h new file mode 100644 index 000000000000..c0fce833c9ed --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_timer.h | |||
@@ -0,0 +1,11 @@ | |||
1 | #ifndef BCM63XX_TIMER_H_ | ||
2 | #define BCM63XX_TIMER_H_ | ||
3 | |||
4 | int bcm63xx_timer_register(int id, void (*callback)(void *data), void *data); | ||
5 | void bcm63xx_timer_unregister(int id); | ||
6 | int bcm63xx_timer_set(int id, int monotonic, unsigned int countdown_us); | ||
7 | int bcm63xx_timer_enable(int id); | ||
8 | int bcm63xx_timer_disable(int id); | ||
9 | unsigned int bcm63xx_timer_countdown(unsigned int countdown_us); | ||
10 | |||
11 | #endif /* !BCM63XX_TIMER_H_ */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h new file mode 100644 index 000000000000..6479090a4106 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h | |||
@@ -0,0 +1,60 @@ | |||
1 | #ifndef BOARD_BCM963XX_H_ | ||
2 | #define BOARD_BCM963XX_H_ | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <linux/gpio.h> | ||
6 | #include <linux/leds.h> | ||
7 | #include <bcm63xx_dev_enet.h> | ||
8 | #include <bcm63xx_dev_dsp.h> | ||
9 | |||
10 | /* | ||
11 | * flash mapping | ||
12 | */ | ||
13 | #define BCM963XX_CFE_VERSION_OFFSET 0x570 | ||
14 | #define BCM963XX_NVRAM_OFFSET 0x580 | ||
15 | |||
16 | /* | ||
17 | * nvram structure | ||
18 | */ | ||
19 | struct bcm963xx_nvram { | ||
20 | u32 version; | ||
21 | u8 reserved1[256]; | ||
22 | u8 name[16]; | ||
23 | u32 main_tp_number; | ||
24 | u32 psi_size; | ||
25 | u32 mac_addr_count; | ||
26 | u8 mac_addr_base[6]; | ||
27 | u8 reserved2[2]; | ||
28 | u32 checksum_old; | ||
29 | u8 reserved3[720]; | ||
30 | u32 checksum_high; | ||
31 | }; | ||
32 | |||
33 | /* | ||
34 | * board definition | ||
35 | */ | ||
36 | struct board_info { | ||
37 | u8 name[16]; | ||
38 | unsigned int expected_cpu_id; | ||
39 | |||
40 | /* enabled feature/device */ | ||
41 | unsigned int has_enet0:1; | ||
42 | unsigned int has_enet1:1; | ||
43 | unsigned int has_pci:1; | ||
44 | unsigned int has_pccard:1; | ||
45 | unsigned int has_ohci0:1; | ||
46 | unsigned int has_ehci0:1; | ||
47 | unsigned int has_dsp:1; | ||
48 | |||
49 | /* ethernet config */ | ||
50 | struct bcm63xx_enet_platform_data enet0; | ||
51 | struct bcm63xx_enet_platform_data enet1; | ||
52 | |||
53 | /* DSP config */ | ||
54 | struct bcm63xx_dsp_platform_data dsp; | ||
55 | |||
56 | /* GPIO LEDs */ | ||
57 | struct gpio_led leds[5]; | ||
58 | }; | ||
59 | |||
60 | #endif /* ! BOARD_BCM963XX_H_ */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/cpu-feature-overrides.h b/arch/mips/include/asm/mach-bcm63xx/cpu-feature-overrides.h new file mode 100644 index 000000000000..71742bac940d --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/cpu-feature-overrides.h | |||
@@ -0,0 +1,51 @@ | |||
1 | #ifndef __ASM_MACH_BCM963XX_CPU_FEATURE_OVERRIDES_H | ||
2 | #define __ASM_MACH_BCM963XX_CPU_FEATURE_OVERRIDES_H | ||
3 | |||
4 | #include <bcm63xx_cpu.h> | ||
5 | |||
6 | #define cpu_has_tlb 1 | ||
7 | #define cpu_has_4kex 1 | ||
8 | #define cpu_has_4k_cache 1 | ||
9 | #define cpu_has_fpu 0 | ||
10 | #define cpu_has_32fpr 0 | ||
11 | #define cpu_has_counter 1 | ||
12 | #define cpu_has_watch 0 | ||
13 | #define cpu_has_divec 1 | ||
14 | #define cpu_has_vce 0 | ||
15 | #define cpu_has_cache_cdex_p 0 | ||
16 | #define cpu_has_cache_cdex_s 0 | ||
17 | #define cpu_has_prefetch 1 | ||
18 | #define cpu_has_mcheck 1 | ||
19 | #define cpu_has_ejtag 1 | ||
20 | #define cpu_has_llsc 1 | ||
21 | #define cpu_has_mips16 0 | ||
22 | #define cpu_has_mdmx 0 | ||
23 | #define cpu_has_mips3d 0 | ||
24 | #define cpu_has_smartmips 0 | ||
25 | #define cpu_has_vtag_icache 0 | ||
26 | |||
27 | #if !defined(BCMCPU_RUNTIME_DETECT) && (defined(CONFIG_BCMCPU_IS_6348) || defined(CONFIG_CPU_IS_6338) || defined(CONFIG_CPU_IS_BCM6345)) | ||
28 | #define cpu_has_dc_aliases 0 | ||
29 | #endif | ||
30 | |||
31 | #define cpu_has_ic_fills_f_dc 0 | ||
32 | #define cpu_has_pindexed_dcache 0 | ||
33 | |||
34 | #define cpu_has_mips32r1 1 | ||
35 | #define cpu_has_mips32r2 0 | ||
36 | #define cpu_has_mips64r1 0 | ||
37 | #define cpu_has_mips64r2 0 | ||
38 | |||
39 | #define cpu_has_dsp 0 | ||
40 | #define cpu_has_mipsmt 0 | ||
41 | #define cpu_has_userlocal 0 | ||
42 | |||
43 | #define cpu_has_nofpuex 0 | ||
44 | #define cpu_has_64bits 0 | ||
45 | #define cpu_has_64bit_zero_reg 0 | ||
46 | |||
47 | #define cpu_dcache_line_size() 16 | ||
48 | #define cpu_icache_line_size() 16 | ||
49 | #define cpu_scache_line_size() 0 | ||
50 | |||
51 | #endif /* __ASM_MACH_BCM963XX_CPU_FEATURE_OVERRIDES_H */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/gpio.h b/arch/mips/include/asm/mach-bcm63xx/gpio.h new file mode 100644 index 000000000000..7cda8c0a3979 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/gpio.h | |||
@@ -0,0 +1,15 @@ | |||
1 | #ifndef __ASM_MIPS_MACH_BCM63XX_GPIO_H | ||
2 | #define __ASM_MIPS_MACH_BCM63XX_GPIO_H | ||
3 | |||
4 | #include <bcm63xx_gpio.h> | ||
5 | |||
6 | #define gpio_to_irq(gpio) NULL | ||
7 | |||
8 | #define gpio_get_value __gpio_get_value | ||
9 | #define gpio_set_value __gpio_set_value | ||
10 | |||
11 | #define gpio_cansleep __gpio_cansleep | ||
12 | |||
13 | #include <asm-generic/gpio.h> | ||
14 | |||
15 | #endif /* __ASM_MIPS_MACH_BCM63XX_GPIO_H */ | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/war.h b/arch/mips/include/asm/mach-bcm63xx/war.h new file mode 100644 index 000000000000..8e3f3fdf3209 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/war.h | |||
@@ -0,0 +1,25 @@ | |||
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) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org> | ||
7 | */ | ||
8 | #ifndef __ASM_MIPS_MACH_BCM63XX_WAR_H | ||
9 | #define __ASM_MIPS_MACH_BCM63XX_WAR_H | ||
10 | |||
11 | #define R4600_V1_INDEX_ICACHEOP_WAR 0 | ||
12 | #define R4600_V1_HIT_CACHEOP_WAR 0 | ||
13 | #define R4600_V2_HIT_CACHEOP_WAR 0 | ||
14 | #define R5432_CP0_INTERRUPT_WAR 0 | ||
15 | #define BCM1250_M3_WAR 0 | ||
16 | #define SIBYTE_1956_WAR 0 | ||
17 | #define MIPS4K_ICACHE_REFILL_WAR 0 | ||
18 | #define MIPS_CACHE_SYNC_WAR 0 | ||
19 | #define TX49XX_ICACHE_INDEX_INV_WAR 0 | ||
20 | #define RM9000_CDEX_SMP_WAR 0 | ||
21 | #define ICACHE_REFILLS_WORKAROUND_WAR 0 | ||
22 | #define R10000_LLSC_WAR 0 | ||
23 | #define MIPS34K_MISSED_ITLB_WAR 0 | ||
24 | |||
25 | #endif /* __ASM_MIPS_MACH_BCM63XX_WAR_H */ | ||
diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile index 0d4d5ea6fac3..91bfe73a7f60 100644 --- a/arch/mips/pci/Makefile +++ b/arch/mips/pci/Makefile | |||
@@ -16,6 +16,8 @@ obj-$(CONFIG_PCI_VR41XX) += ops-vr41xx.o pci-vr41xx.o | |||
16 | obj-$(CONFIG_NEC_MARKEINS) += ops-emma2rh.o pci-emma2rh.o fixup-emma2rh.o | 16 | obj-$(CONFIG_NEC_MARKEINS) += ops-emma2rh.o pci-emma2rh.o fixup-emma2rh.o |
17 | obj-$(CONFIG_PCI_TX4927) += ops-tx4927.o | 17 | obj-$(CONFIG_PCI_TX4927) += ops-tx4927.o |
18 | obj-$(CONFIG_BCM47XX) += pci-bcm47xx.o | 18 | obj-$(CONFIG_BCM47XX) += pci-bcm47xx.o |
19 | obj-$(CONFIG_BCM63XX) += pci-bcm63xx.o fixup-bcm63xx.o \ | ||
20 | ops-bcm63xx.o | ||
19 | 21 | ||
20 | # | 22 | # |
21 | # These are still pretty much in the old state, watch, go blind. | 23 | # These are still pretty much in the old state, watch, go blind. |
diff --git a/arch/mips/pci/fixup-bcm63xx.c b/arch/mips/pci/fixup-bcm63xx.c new file mode 100644 index 000000000000..340863009da9 --- /dev/null +++ b/arch/mips/pci/fixup-bcm63xx.c | |||
@@ -0,0 +1,21 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | */ | ||
8 | |||
9 | #include <linux/types.h> | ||
10 | #include <linux/pci.h> | ||
11 | #include <bcm63xx_cpu.h> | ||
12 | |||
13 | int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | ||
14 | { | ||
15 | return bcm63xx_get_irq_number(IRQ_PCI); | ||
16 | } | ||
17 | |||
18 | int pcibios_plat_dev_init(struct pci_dev *dev) | ||
19 | { | ||
20 | return 0; | ||
21 | } | ||
diff --git a/arch/mips/pci/ops-bcm63xx.c b/arch/mips/pci/ops-bcm63xx.c new file mode 100644 index 000000000000..822ae179bc56 --- /dev/null +++ b/arch/mips/pci/ops-bcm63xx.c | |||
@@ -0,0 +1,467 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | */ | ||
8 | |||
9 | #include <linux/types.h> | ||
10 | #include <linux/pci.h> | ||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/delay.h> | ||
14 | #include <linux/io.h> | ||
15 | |||
16 | #include "pci-bcm63xx.h" | ||
17 | |||
18 | /* | ||
19 | * swizzle 32bits data to return only the needed part | ||
20 | */ | ||
21 | static int postprocess_read(u32 data, int where, unsigned int size) | ||
22 | { | ||
23 | u32 ret; | ||
24 | |||
25 | ret = 0; | ||
26 | switch (size) { | ||
27 | case 1: | ||
28 | ret = (data >> ((where & 3) << 3)) & 0xff; | ||
29 | break; | ||
30 | case 2: | ||
31 | ret = (data >> ((where & 3) << 3)) & 0xffff; | ||
32 | break; | ||
33 | case 4: | ||
34 | ret = data; | ||
35 | break; | ||
36 | } | ||
37 | return ret; | ||
38 | } | ||
39 | |||
40 | static int preprocess_write(u32 orig_data, u32 val, int where, | ||
41 | unsigned int size) | ||
42 | { | ||
43 | u32 ret; | ||
44 | |||
45 | ret = 0; | ||
46 | switch (size) { | ||
47 | case 1: | ||
48 | ret = (orig_data & ~(0xff << ((where & 3) << 3))) | | ||
49 | (val << ((where & 3) << 3)); | ||
50 | break; | ||
51 | case 2: | ||
52 | ret = (orig_data & ~(0xffff << ((where & 3) << 3))) | | ||
53 | (val << ((where & 3) << 3)); | ||
54 | break; | ||
55 | case 4: | ||
56 | ret = val; | ||
57 | break; | ||
58 | } | ||
59 | return ret; | ||
60 | } | ||
61 | |||
62 | /* | ||
63 | * setup hardware for a configuration cycle with given parameters | ||
64 | */ | ||
65 | static int bcm63xx_setup_cfg_access(int type, unsigned int busn, | ||
66 | unsigned int devfn, int where) | ||
67 | { | ||
68 | unsigned int slot, func, reg; | ||
69 | u32 val; | ||
70 | |||
71 | slot = PCI_SLOT(devfn); | ||
72 | func = PCI_FUNC(devfn); | ||
73 | reg = where >> 2; | ||
74 | |||
75 | /* sanity check */ | ||
76 | if (slot > (MPI_L2PCFG_DEVNUM_MASK >> MPI_L2PCFG_DEVNUM_SHIFT)) | ||
77 | return 1; | ||
78 | |||
79 | if (func > (MPI_L2PCFG_FUNC_MASK >> MPI_L2PCFG_FUNC_SHIFT)) | ||
80 | return 1; | ||
81 | |||
82 | if (reg > (MPI_L2PCFG_REG_MASK >> MPI_L2PCFG_REG_SHIFT)) | ||
83 | return 1; | ||
84 | |||
85 | /* ok, setup config access */ | ||
86 | val = (reg << MPI_L2PCFG_REG_SHIFT); | ||
87 | val |= (func << MPI_L2PCFG_FUNC_SHIFT); | ||
88 | val |= (slot << MPI_L2PCFG_DEVNUM_SHIFT); | ||
89 | val |= MPI_L2PCFG_CFG_USEREG_MASK; | ||
90 | val |= MPI_L2PCFG_CFG_SEL_MASK; | ||
91 | /* type 0 cycle for local bus, type 1 cycle for anything else */ | ||
92 | if (type != 0) { | ||
93 | /* FIXME: how to specify bus ??? */ | ||
94 | val |= (1 << MPI_L2PCFG_CFG_TYPE_SHIFT); | ||
95 | } | ||
96 | bcm_mpi_writel(val, MPI_L2PCFG_REG); | ||
97 | |||
98 | return 0; | ||
99 | } | ||
100 | |||
101 | static int bcm63xx_do_cfg_read(int type, unsigned int busn, | ||
102 | unsigned int devfn, int where, int size, | ||
103 | u32 *val) | ||
104 | { | ||
105 | u32 data; | ||
106 | |||
107 | /* two phase cycle, first we write address, then read data at | ||
108 | * another location, caller already has a spinlock so no need | ||
109 | * to add one here */ | ||
110 | if (bcm63xx_setup_cfg_access(type, busn, devfn, where)) | ||
111 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
112 | iob(); | ||
113 | data = le32_to_cpu(__raw_readl(pci_iospace_start)); | ||
114 | /* restore IO space normal behaviour */ | ||
115 | bcm_mpi_writel(0, MPI_L2PCFG_REG); | ||
116 | |||
117 | *val = postprocess_read(data, where, size); | ||
118 | |||
119 | return PCIBIOS_SUCCESSFUL; | ||
120 | } | ||
121 | |||
122 | static int bcm63xx_do_cfg_write(int type, unsigned int busn, | ||
123 | unsigned int devfn, int where, int size, | ||
124 | u32 val) | ||
125 | { | ||
126 | u32 data; | ||
127 | |||
128 | /* two phase cycle, first we write address, then write data to | ||
129 | * another location, caller already has a spinlock so no need | ||
130 | * to add one here */ | ||
131 | if (bcm63xx_setup_cfg_access(type, busn, devfn, where)) | ||
132 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
133 | iob(); | ||
134 | |||
135 | data = le32_to_cpu(__raw_readl(pci_iospace_start)); | ||
136 | data = preprocess_write(data, val, where, size); | ||
137 | |||
138 | __raw_writel(cpu_to_le32(data), pci_iospace_start); | ||
139 | wmb(); | ||
140 | /* no way to know the access is done, we have to wait */ | ||
141 | udelay(500); | ||
142 | /* restore IO space normal behaviour */ | ||
143 | bcm_mpi_writel(0, MPI_L2PCFG_REG); | ||
144 | |||
145 | return PCIBIOS_SUCCESSFUL; | ||
146 | } | ||
147 | |||
148 | static int bcm63xx_pci_read(struct pci_bus *bus, unsigned int devfn, | ||
149 | int where, int size, u32 *val) | ||
150 | { | ||
151 | int type; | ||
152 | |||
153 | type = bus->parent ? 1 : 0; | ||
154 | |||
155 | if (type == 0 && PCI_SLOT(devfn) == CARDBUS_PCI_IDSEL) | ||
156 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
157 | |||
158 | return bcm63xx_do_cfg_read(type, bus->number, devfn, | ||
159 | where, size, val); | ||
160 | } | ||
161 | |||
162 | static int bcm63xx_pci_write(struct pci_bus *bus, unsigned int devfn, | ||
163 | int where, int size, u32 val) | ||
164 | { | ||
165 | int type; | ||
166 | |||
167 | type = bus->parent ? 1 : 0; | ||
168 | |||
169 | if (type == 0 && PCI_SLOT(devfn) == CARDBUS_PCI_IDSEL) | ||
170 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
171 | |||
172 | return bcm63xx_do_cfg_write(type, bus->number, devfn, | ||
173 | where, size, val); | ||
174 | } | ||
175 | |||
176 | struct pci_ops bcm63xx_pci_ops = { | ||
177 | .read = bcm63xx_pci_read, | ||
178 | .write = bcm63xx_pci_write | ||
179 | }; | ||
180 | |||
181 | #ifdef CONFIG_CARDBUS | ||
182 | /* | ||
183 | * emulate configuration read access on a cardbus bridge | ||
184 | */ | ||
185 | #define FAKE_CB_BRIDGE_SLOT 0x1e | ||
186 | |||
187 | static int fake_cb_bridge_bus_number = -1; | ||
188 | |||
189 | static struct { | ||
190 | u16 pci_command; | ||
191 | u8 cb_latency; | ||
192 | u8 subordinate_busn; | ||
193 | u8 cardbus_busn; | ||
194 | u8 pci_busn; | ||
195 | int bus_assigned; | ||
196 | u16 bridge_control; | ||
197 | |||
198 | u32 mem_base0; | ||
199 | u32 mem_limit0; | ||
200 | u32 mem_base1; | ||
201 | u32 mem_limit1; | ||
202 | |||
203 | u32 io_base0; | ||
204 | u32 io_limit0; | ||
205 | u32 io_base1; | ||
206 | u32 io_limit1; | ||
207 | } fake_cb_bridge_regs; | ||
208 | |||
209 | static int fake_cb_bridge_read(int where, int size, u32 *val) | ||
210 | { | ||
211 | unsigned int reg; | ||
212 | u32 data; | ||
213 | |||
214 | data = 0; | ||
215 | reg = where >> 2; | ||
216 | switch (reg) { | ||
217 | case (PCI_VENDOR_ID >> 2): | ||
218 | case (PCI_CB_SUBSYSTEM_VENDOR_ID >> 2): | ||
219 | /* create dummy vendor/device id from our cpu id */ | ||
220 | data = (bcm63xx_get_cpu_id() << 16) | PCI_VENDOR_ID_BROADCOM; | ||
221 | break; | ||
222 | |||
223 | case (PCI_COMMAND >> 2): | ||
224 | data = (PCI_STATUS_DEVSEL_SLOW << 16); | ||
225 | data |= fake_cb_bridge_regs.pci_command; | ||
226 | break; | ||
227 | |||
228 | case (PCI_CLASS_REVISION >> 2): | ||
229 | data = (PCI_CLASS_BRIDGE_CARDBUS << 16); | ||
230 | break; | ||
231 | |||
232 | case (PCI_CACHE_LINE_SIZE >> 2): | ||
233 | data = (PCI_HEADER_TYPE_CARDBUS << 16); | ||
234 | break; | ||
235 | |||
236 | case (PCI_INTERRUPT_LINE >> 2): | ||
237 | /* bridge control */ | ||
238 | data = (fake_cb_bridge_regs.bridge_control << 16); | ||
239 | /* pin:intA line:0xff */ | ||
240 | data |= (0x1 << 8) | 0xff; | ||
241 | break; | ||
242 | |||
243 | case (PCI_CB_PRIMARY_BUS >> 2): | ||
244 | data = (fake_cb_bridge_regs.cb_latency << 24); | ||
245 | data |= (fake_cb_bridge_regs.subordinate_busn << 16); | ||
246 | data |= (fake_cb_bridge_regs.cardbus_busn << 8); | ||
247 | data |= fake_cb_bridge_regs.pci_busn; | ||
248 | break; | ||
249 | |||
250 | case (PCI_CB_MEMORY_BASE_0 >> 2): | ||
251 | data = fake_cb_bridge_regs.mem_base0; | ||
252 | break; | ||
253 | |||
254 | case (PCI_CB_MEMORY_LIMIT_0 >> 2): | ||
255 | data = fake_cb_bridge_regs.mem_limit0; | ||
256 | break; | ||
257 | |||
258 | case (PCI_CB_MEMORY_BASE_1 >> 2): | ||
259 | data = fake_cb_bridge_regs.mem_base1; | ||
260 | break; | ||
261 | |||
262 | case (PCI_CB_MEMORY_LIMIT_1 >> 2): | ||
263 | data = fake_cb_bridge_regs.mem_limit1; | ||
264 | break; | ||
265 | |||
266 | case (PCI_CB_IO_BASE_0 >> 2): | ||
267 | /* | 1 for 32bits io support */ | ||
268 | data = fake_cb_bridge_regs.io_base0 | 0x1; | ||
269 | break; | ||
270 | |||
271 | case (PCI_CB_IO_LIMIT_0 >> 2): | ||
272 | data = fake_cb_bridge_regs.io_limit0; | ||
273 | break; | ||
274 | |||
275 | case (PCI_CB_IO_BASE_1 >> 2): | ||
276 | /* | 1 for 32bits io support */ | ||
277 | data = fake_cb_bridge_regs.io_base1 | 0x1; | ||
278 | break; | ||
279 | |||
280 | case (PCI_CB_IO_LIMIT_1 >> 2): | ||
281 | data = fake_cb_bridge_regs.io_limit1; | ||
282 | break; | ||
283 | } | ||
284 | |||
285 | *val = postprocess_read(data, where, size); | ||
286 | return PCIBIOS_SUCCESSFUL; | ||
287 | } | ||
288 | |||
289 | /* | ||
290 | * emulate configuration write access on a cardbus bridge | ||
291 | */ | ||
292 | static int fake_cb_bridge_write(int where, int size, u32 val) | ||
293 | { | ||
294 | unsigned int reg; | ||
295 | u32 data, tmp; | ||
296 | int ret; | ||
297 | |||
298 | ret = fake_cb_bridge_read((where & ~0x3), 4, &data); | ||
299 | if (ret != PCIBIOS_SUCCESSFUL) | ||
300 | return ret; | ||
301 | |||
302 | data = preprocess_write(data, val, where, size); | ||
303 | |||
304 | reg = where >> 2; | ||
305 | switch (reg) { | ||
306 | case (PCI_COMMAND >> 2): | ||
307 | fake_cb_bridge_regs.pci_command = (data & 0xffff); | ||
308 | break; | ||
309 | |||
310 | case (PCI_CB_PRIMARY_BUS >> 2): | ||
311 | fake_cb_bridge_regs.cb_latency = (data >> 24) & 0xff; | ||
312 | fake_cb_bridge_regs.subordinate_busn = (data >> 16) & 0xff; | ||
313 | fake_cb_bridge_regs.cardbus_busn = (data >> 8) & 0xff; | ||
314 | fake_cb_bridge_regs.pci_busn = data & 0xff; | ||
315 | if (fake_cb_bridge_regs.cardbus_busn) | ||
316 | fake_cb_bridge_regs.bus_assigned = 1; | ||
317 | break; | ||
318 | |||
319 | case (PCI_INTERRUPT_LINE >> 2): | ||
320 | tmp = (data >> 16) & 0xffff; | ||
321 | /* disable memory prefetch support */ | ||
322 | tmp &= ~PCI_CB_BRIDGE_CTL_PREFETCH_MEM0; | ||
323 | tmp &= ~PCI_CB_BRIDGE_CTL_PREFETCH_MEM1; | ||
324 | fake_cb_bridge_regs.bridge_control = tmp; | ||
325 | break; | ||
326 | |||
327 | case (PCI_CB_MEMORY_BASE_0 >> 2): | ||
328 | fake_cb_bridge_regs.mem_base0 = data; | ||
329 | break; | ||
330 | |||
331 | case (PCI_CB_MEMORY_LIMIT_0 >> 2): | ||
332 | fake_cb_bridge_regs.mem_limit0 = data; | ||
333 | break; | ||
334 | |||
335 | case (PCI_CB_MEMORY_BASE_1 >> 2): | ||
336 | fake_cb_bridge_regs.mem_base1 = data; | ||
337 | break; | ||
338 | |||
339 | case (PCI_CB_MEMORY_LIMIT_1 >> 2): | ||
340 | fake_cb_bridge_regs.mem_limit1 = data; | ||
341 | break; | ||
342 | |||
343 | case (PCI_CB_IO_BASE_0 >> 2): | ||
344 | fake_cb_bridge_regs.io_base0 = data; | ||
345 | break; | ||
346 | |||
347 | case (PCI_CB_IO_LIMIT_0 >> 2): | ||
348 | fake_cb_bridge_regs.io_limit0 = data; | ||
349 | break; | ||
350 | |||
351 | case (PCI_CB_IO_BASE_1 >> 2): | ||
352 | fake_cb_bridge_regs.io_base1 = data; | ||
353 | break; | ||
354 | |||
355 | case (PCI_CB_IO_LIMIT_1 >> 2): | ||
356 | fake_cb_bridge_regs.io_limit1 = data; | ||
357 | break; | ||
358 | } | ||
359 | |||
360 | return PCIBIOS_SUCCESSFUL; | ||
361 | } | ||
362 | |||
363 | static int bcm63xx_cb_read(struct pci_bus *bus, unsigned int devfn, | ||
364 | int where, int size, u32 *val) | ||
365 | { | ||
366 | /* snoop access to slot 0x1e on root bus, we fake a cardbus | ||
367 | * bridge at this location */ | ||
368 | if (!bus->parent && PCI_SLOT(devfn) == FAKE_CB_BRIDGE_SLOT) { | ||
369 | fake_cb_bridge_bus_number = bus->number; | ||
370 | return fake_cb_bridge_read(where, size, val); | ||
371 | } | ||
372 | |||
373 | /* a configuration cycle for the device behind the cardbus | ||
374 | * bridge is actually done as a type 0 cycle on the primary | ||
375 | * bus. This means that only one device can be on the cardbus | ||
376 | * bus */ | ||
377 | if (fake_cb_bridge_regs.bus_assigned && | ||
378 | bus->number == fake_cb_bridge_regs.cardbus_busn && | ||
379 | PCI_SLOT(devfn) == 0) | ||
380 | return bcm63xx_do_cfg_read(0, 0, | ||
381 | PCI_DEVFN(CARDBUS_PCI_IDSEL, 0), | ||
382 | where, size, val); | ||
383 | |||
384 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
385 | } | ||
386 | |||
387 | static int bcm63xx_cb_write(struct pci_bus *bus, unsigned int devfn, | ||
388 | int where, int size, u32 val) | ||
389 | { | ||
390 | if (!bus->parent && PCI_SLOT(devfn) == FAKE_CB_BRIDGE_SLOT) { | ||
391 | fake_cb_bridge_bus_number = bus->number; | ||
392 | return fake_cb_bridge_write(where, size, val); | ||
393 | } | ||
394 | |||
395 | if (fake_cb_bridge_regs.bus_assigned && | ||
396 | bus->number == fake_cb_bridge_regs.cardbus_busn && | ||
397 | PCI_SLOT(devfn) == 0) | ||
398 | return bcm63xx_do_cfg_write(0, 0, | ||
399 | PCI_DEVFN(CARDBUS_PCI_IDSEL, 0), | ||
400 | where, size, val); | ||
401 | |||
402 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
403 | } | ||
404 | |||
405 | struct pci_ops bcm63xx_cb_ops = { | ||
406 | .read = bcm63xx_cb_read, | ||
407 | .write = bcm63xx_cb_write, | ||
408 | }; | ||
409 | |||
410 | /* | ||
411 | * only one IO window, so it cannot be shared by PCI and cardbus, use | ||
412 | * fixup to choose and detect unhandled configuration | ||
413 | */ | ||
414 | static void bcm63xx_fixup(struct pci_dev *dev) | ||
415 | { | ||
416 | static int io_window = -1; | ||
417 | int i, found, new_io_window; | ||
418 | u32 val; | ||
419 | |||
420 | /* look for any io resource */ | ||
421 | found = 0; | ||
422 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { | ||
423 | if (pci_resource_flags(dev, i) & IORESOURCE_IO) { | ||
424 | found = 1; | ||
425 | break; | ||
426 | } | ||
427 | } | ||
428 | |||
429 | if (!found) | ||
430 | return; | ||
431 | |||
432 | /* skip our fake bus with only cardbus bridge on it */ | ||
433 | if (dev->bus->number == fake_cb_bridge_bus_number) | ||
434 | return; | ||
435 | |||
436 | /* find on which bus the device is */ | ||
437 | if (fake_cb_bridge_regs.bus_assigned && | ||
438 | dev->bus->number == fake_cb_bridge_regs.cardbus_busn && | ||
439 | PCI_SLOT(dev->devfn) == 0) | ||
440 | new_io_window = 1; | ||
441 | else | ||
442 | new_io_window = 0; | ||
443 | |||
444 | if (new_io_window == io_window) | ||
445 | return; | ||
446 | |||
447 | if (io_window != -1) { | ||
448 | printk(KERN_ERR "bcm63xx: both PCI and cardbus devices " | ||
449 | "need IO, which hardware cannot do\n"); | ||
450 | return; | ||
451 | } | ||
452 | |||
453 | printk(KERN_INFO "bcm63xx: PCI IO window assigned to %s\n", | ||
454 | (new_io_window == 0) ? "PCI" : "cardbus"); | ||
455 | |||
456 | val = bcm_mpi_readl(MPI_L2PIOREMAP_REG); | ||
457 | if (io_window) | ||
458 | val |= MPI_L2PREMAP_IS_CARDBUS_MASK; | ||
459 | else | ||
460 | val &= ~MPI_L2PREMAP_IS_CARDBUS_MASK; | ||
461 | bcm_mpi_writel(val, MPI_L2PIOREMAP_REG); | ||
462 | |||
463 | io_window = new_io_window; | ||
464 | } | ||
465 | |||
466 | DECLARE_PCI_FIXUP_ENABLE(PCI_ANY_ID, PCI_ANY_ID, bcm63xx_fixup); | ||
467 | #endif | ||
diff --git a/arch/mips/pci/pci-bcm63xx.c b/arch/mips/pci/pci-bcm63xx.c new file mode 100644 index 000000000000..82e0fde1dba0 --- /dev/null +++ b/arch/mips/pci/pci-bcm63xx.c | |||
@@ -0,0 +1,224 @@ | |||
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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
7 | */ | ||
8 | |||
9 | #include <linux/types.h> | ||
10 | #include <linux/pci.h> | ||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <asm/bootinfo.h> | ||
14 | |||
15 | #include "pci-bcm63xx.h" | ||
16 | |||
17 | /* | ||
18 | * Allow PCI to be disabled at runtime depending on board nvram | ||
19 | * configuration | ||
20 | */ | ||
21 | int bcm63xx_pci_enabled; | ||
22 | |||
23 | static struct resource bcm_pci_mem_resource = { | ||
24 | .name = "bcm63xx PCI memory space", | ||
25 | .start = BCM_PCI_MEM_BASE_PA, | ||
26 | .end = BCM_PCI_MEM_END_PA, | ||
27 | .flags = IORESOURCE_MEM | ||
28 | }; | ||
29 | |||
30 | static struct resource bcm_pci_io_resource = { | ||
31 | .name = "bcm63xx PCI IO space", | ||
32 | .start = BCM_PCI_IO_BASE_PA, | ||
33 | #ifdef CONFIG_CARDBUS | ||
34 | .end = BCM_PCI_IO_HALF_PA, | ||
35 | #else | ||
36 | .end = BCM_PCI_IO_END_PA, | ||
37 | #endif | ||
38 | .flags = IORESOURCE_IO | ||
39 | }; | ||
40 | |||
41 | struct pci_controller bcm63xx_controller = { | ||
42 | .pci_ops = &bcm63xx_pci_ops, | ||
43 | .io_resource = &bcm_pci_io_resource, | ||
44 | .mem_resource = &bcm_pci_mem_resource, | ||
45 | }; | ||
46 | |||
47 | /* | ||
48 | * We handle cardbus via a fake Cardbus bridge, memory and io spaces | ||
49 | * have to be clearly separated from PCI one since we have different | ||
50 | * memory decoder. | ||
51 | */ | ||
52 | #ifdef CONFIG_CARDBUS | ||
53 | static struct resource bcm_cb_mem_resource = { | ||
54 | .name = "bcm63xx Cardbus memory space", | ||
55 | .start = BCM_CB_MEM_BASE_PA, | ||
56 | .end = BCM_CB_MEM_END_PA, | ||
57 | .flags = IORESOURCE_MEM | ||
58 | }; | ||
59 | |||
60 | static struct resource bcm_cb_io_resource = { | ||
61 | .name = "bcm63xx Cardbus IO space", | ||
62 | .start = BCM_PCI_IO_HALF_PA + 1, | ||
63 | .end = BCM_PCI_IO_END_PA, | ||
64 | .flags = IORESOURCE_IO | ||
65 | }; | ||
66 | |||
67 | struct pci_controller bcm63xx_cb_controller = { | ||
68 | .pci_ops = &bcm63xx_cb_ops, | ||
69 | .io_resource = &bcm_cb_io_resource, | ||
70 | .mem_resource = &bcm_cb_mem_resource, | ||
71 | }; | ||
72 | #endif | ||
73 | |||
74 | static u32 bcm63xx_int_cfg_readl(u32 reg) | ||
75 | { | ||
76 | u32 tmp; | ||
77 | |||
78 | tmp = reg & MPI_PCICFGCTL_CFGADDR_MASK; | ||
79 | tmp |= MPI_PCICFGCTL_WRITEEN_MASK; | ||
80 | bcm_mpi_writel(tmp, MPI_PCICFGCTL_REG); | ||
81 | iob(); | ||
82 | return bcm_mpi_readl(MPI_PCICFGDATA_REG); | ||
83 | } | ||
84 | |||
85 | static void bcm63xx_int_cfg_writel(u32 val, u32 reg) | ||
86 | { | ||
87 | u32 tmp; | ||
88 | |||
89 | tmp = reg & MPI_PCICFGCTL_CFGADDR_MASK; | ||
90 | tmp |= MPI_PCICFGCTL_WRITEEN_MASK; | ||
91 | bcm_mpi_writel(tmp, MPI_PCICFGCTL_REG); | ||
92 | bcm_mpi_writel(val, MPI_PCICFGDATA_REG); | ||
93 | } | ||
94 | |||
95 | void __iomem *pci_iospace_start; | ||
96 | |||
97 | static int __init bcm63xx_pci_init(void) | ||
98 | { | ||
99 | unsigned int mem_size; | ||
100 | u32 val; | ||
101 | |||
102 | if (!BCMCPU_IS_6348() && !BCMCPU_IS_6358()) | ||
103 | return -ENODEV; | ||
104 | |||
105 | if (!bcm63xx_pci_enabled) | ||
106 | return -ENODEV; | ||
107 | |||
108 | /* | ||
109 | * configuration access are done through IO space, remap 4 | ||
110 | * first bytes to access it from CPU. | ||
111 | * | ||
112 | * this means that no io access from CPU should happen while | ||
113 | * we do a configuration cycle, but there's no way we can add | ||
114 | * a spinlock for each io access, so this is currently kind of | ||
115 | * broken on SMP. | ||
116 | */ | ||
117 | pci_iospace_start = ioremap_nocache(BCM_PCI_IO_BASE_PA, 4); | ||
118 | if (!pci_iospace_start) | ||
119 | return -ENOMEM; | ||
120 | |||
121 | /* setup local bus to PCI access (PCI memory) */ | ||
122 | val = BCM_PCI_MEM_BASE_PA & MPI_L2P_BASE_MASK; | ||
123 | bcm_mpi_writel(val, MPI_L2PMEMBASE1_REG); | ||
124 | bcm_mpi_writel(~(BCM_PCI_MEM_SIZE - 1), MPI_L2PMEMRANGE1_REG); | ||
125 | bcm_mpi_writel(val | MPI_L2PREMAP_ENABLED_MASK, MPI_L2PMEMREMAP1_REG); | ||
126 | |||
127 | /* set Cardbus IDSEL (type 0 cfg access on primary bus for | ||
128 | * this IDSEL will be done on Cardbus instead) */ | ||
129 | val = bcm_pcmcia_readl(PCMCIA_C1_REG); | ||
130 | val &= ~PCMCIA_C1_CBIDSEL_MASK; | ||
131 | val |= (CARDBUS_PCI_IDSEL << PCMCIA_C1_CBIDSEL_SHIFT); | ||
132 | bcm_pcmcia_writel(val, PCMCIA_C1_REG); | ||
133 | |||
134 | #ifdef CONFIG_CARDBUS | ||
135 | /* setup local bus to PCI access (Cardbus memory) */ | ||
136 | val = BCM_CB_MEM_BASE_PA & MPI_L2P_BASE_MASK; | ||
137 | bcm_mpi_writel(val, MPI_L2PMEMBASE2_REG); | ||
138 | bcm_mpi_writel(~(BCM_CB_MEM_SIZE - 1), MPI_L2PMEMRANGE2_REG); | ||
139 | val |= MPI_L2PREMAP_ENABLED_MASK | MPI_L2PREMAP_IS_CARDBUS_MASK; | ||
140 | bcm_mpi_writel(val, MPI_L2PMEMREMAP2_REG); | ||
141 | #else | ||
142 | /* disable second access windows */ | ||
143 | bcm_mpi_writel(0, MPI_L2PMEMREMAP2_REG); | ||
144 | #endif | ||
145 | |||
146 | /* setup local bus to PCI access (IO memory), we have only 1 | ||
147 | * IO window for both PCI and cardbus, but it cannot handle | ||
148 | * both at the same time, assume standard PCI for now, if | ||
149 | * cardbus card has IO zone, PCI fixup will change window to | ||
150 | * cardbus */ | ||
151 | val = BCM_PCI_IO_BASE_PA & MPI_L2P_BASE_MASK; | ||
152 | bcm_mpi_writel(val, MPI_L2PIOBASE_REG); | ||
153 | bcm_mpi_writel(~(BCM_PCI_IO_SIZE - 1), MPI_L2PIORANGE_REG); | ||
154 | bcm_mpi_writel(val | MPI_L2PREMAP_ENABLED_MASK, MPI_L2PIOREMAP_REG); | ||
155 | |||
156 | /* enable PCI related GPIO pins */ | ||
157 | bcm_mpi_writel(MPI_LOCBUSCTL_EN_PCI_GPIO_MASK, MPI_LOCBUSCTL_REG); | ||
158 | |||
159 | /* setup PCI to local bus access, used by PCI device to target | ||
160 | * local RAM while bus mastering */ | ||
161 | bcm63xx_int_cfg_writel(0, PCI_BASE_ADDRESS_3); | ||
162 | if (BCMCPU_IS_6358()) | ||
163 | val = MPI_SP0_REMAP_ENABLE_MASK; | ||
164 | else | ||
165 | val = 0; | ||
166 | bcm_mpi_writel(val, MPI_SP0_REMAP_REG); | ||
167 | |||
168 | bcm63xx_int_cfg_writel(0x0, PCI_BASE_ADDRESS_4); | ||
169 | bcm_mpi_writel(0, MPI_SP1_REMAP_REG); | ||
170 | |||
171 | mem_size = bcm63xx_get_memory_size(); | ||
172 | |||
173 | /* 6348 before rev b0 exposes only 16 MB of RAM memory through | ||
174 | * PCI, throw a warning if we have more memory */ | ||
175 | if (BCMCPU_IS_6348() && (bcm63xx_get_cpu_rev() & 0xf0) == 0xa0) { | ||
176 | if (mem_size > (16 * 1024 * 1024)) | ||
177 | printk(KERN_WARNING "bcm63xx: this CPU " | ||
178 | "revision cannot handle more than 16MB " | ||
179 | "of RAM for PCI bus mastering\n"); | ||
180 | } else { | ||
181 | /* setup sp0 range to local RAM size */ | ||
182 | bcm_mpi_writel(~(mem_size - 1), MPI_SP0_RANGE_REG); | ||
183 | bcm_mpi_writel(0, MPI_SP1_RANGE_REG); | ||
184 | } | ||
185 | |||
186 | /* change host bridge retry counter to infinite number of | ||
187 | * retry, needed for some broadcom wifi cards with Silicon | ||
188 | * Backplane bus where access to srom seems very slow */ | ||
189 | val = bcm63xx_int_cfg_readl(BCMPCI_REG_TIMERS); | ||
190 | val &= ~REG_TIMER_RETRY_MASK; | ||
191 | bcm63xx_int_cfg_writel(val, BCMPCI_REG_TIMERS); | ||
192 | |||
193 | /* enable memory decoder and bus mastering */ | ||
194 | val = bcm63xx_int_cfg_readl(PCI_COMMAND); | ||
195 | val |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); | ||
196 | bcm63xx_int_cfg_writel(val, PCI_COMMAND); | ||
197 | |||
198 | /* enable read prefetching & disable byte swapping for bus | ||
199 | * mastering transfers */ | ||
200 | val = bcm_mpi_readl(MPI_PCIMODESEL_REG); | ||
201 | val &= ~MPI_PCIMODESEL_BAR1_NOSWAP_MASK; | ||
202 | val &= ~MPI_PCIMODESEL_BAR2_NOSWAP_MASK; | ||
203 | val &= ~MPI_PCIMODESEL_PREFETCH_MASK; | ||
204 | val |= (8 << MPI_PCIMODESEL_PREFETCH_SHIFT); | ||
205 | bcm_mpi_writel(val, MPI_PCIMODESEL_REG); | ||
206 | |||
207 | /* enable pci interrupt */ | ||
208 | val = bcm_mpi_readl(MPI_LOCINT_REG); | ||
209 | val |= MPI_LOCINT_MASK(MPI_LOCINT_EXT_PCI_INT); | ||
210 | bcm_mpi_writel(val, MPI_LOCINT_REG); | ||
211 | |||
212 | register_pci_controller(&bcm63xx_controller); | ||
213 | |||
214 | #ifdef CONFIG_CARDBUS | ||
215 | register_pci_controller(&bcm63xx_cb_controller); | ||
216 | #endif | ||
217 | |||
218 | /* mark memory space used for IO mapping as reserved */ | ||
219 | request_mem_region(BCM_PCI_IO_BASE_PA, BCM_PCI_IO_SIZE, | ||
220 | "bcm63xx PCI IO space"); | ||
221 | return 0; | ||
222 | } | ||
223 | |||
224 | arch_initcall(bcm63xx_pci_init); | ||
diff --git a/arch/mips/pci/pci-bcm63xx.h b/arch/mips/pci/pci-bcm63xx.h new file mode 100644 index 000000000000..a6e594ef3d6a --- /dev/null +++ b/arch/mips/pci/pci-bcm63xx.h | |||
@@ -0,0 +1,27 @@ | |||
1 | #ifndef PCI_BCM63XX_H_ | ||
2 | #define PCI_BCM63XX_H_ | ||
3 | |||
4 | #include <bcm63xx_cpu.h> | ||
5 | #include <bcm63xx_io.h> | ||
6 | #include <bcm63xx_regs.h> | ||
7 | #include <bcm63xx_dev_pci.h> | ||
8 | |||
9 | /* | ||
10 | * Cardbus shares the PCI bus, but has no IDSEL, so a special id is | ||
11 | * reserved for it. If you have a standard PCI device at this id, you | ||
12 | * need to change the following definition. | ||
13 | */ | ||
14 | #define CARDBUS_PCI_IDSEL 0x8 | ||
15 | |||
16 | /* | ||
17 | * defined in ops-bcm63xx.c | ||
18 | */ | ||
19 | extern struct pci_ops bcm63xx_pci_ops; | ||
20 | extern struct pci_ops bcm63xx_cb_ops; | ||
21 | |||
22 | /* | ||
23 | * defined in pci-bcm63xx.c | ||
24 | */ | ||
25 | extern void __iomem *pci_iospace_start; | ||
26 | |||
27 | #endif /* ! PCI_BCM63XX_H_ */ | ||