Root/target/linux/cns21xx/patches-3.3/100-cns21xx-core.patch

1--- a/arch/arm/Kconfig
2+++ b/arch/arm/Kconfig
3@@ -190,6 +190,11 @@ config FIQ
4 config ARCH_MTD_XIP
5     bool
6 
7+config ARM_L1_CACHE_SHIFT_4
8+ bool
9+ help
10+ Setting ARM L1 cache line size to 16 bytes.
11+
12 config VECTORS_BASE
13     hex
14     default 0xffff0000 if MMU || CPU_HIGH_VECTOR
15@@ -355,6 +360,15 @@ config ARCH_HIGHBANK
16     help
17       Support for the Calxeda Highbank SoC based boards.
18 
19+config ARCH_CNS21XX
20+ bool "Cavium Networks CNS21xx family"
21+ select CPU_FA526
22+ select PLAT_FA
23+ select PLAT_FA_TIME
24+ select ARM_L1_CACHE_SHIFT_4
25+ help
26+ Support for Cavium Networks CNS21xx family.
27+
28 config ARCH_CLPS711X
29     bool "Cirrus Logic CLPS711x/EP721x-based"
30     select CPU_ARM720T
31@@ -1003,6 +1017,8 @@ source "arch/arm/mach-davinci/Kconfig"
32 
33 source "arch/arm/mach-dove/Kconfig"
34 
35+source "arch/arm/mach-cns21xx/Kconfig"
36+
37 source "arch/arm/mach-ep93xx/Kconfig"
38 
39 source "arch/arm/mach-footbridge/Kconfig"
40--- /dev/null
41+++ b/arch/arm/mach-cns21xx/Kconfig
42@@ -0,0 +1,6 @@
43+if ARCH_CNS21XX
44+
45+menu "Cavium Networks CNS21xx based machines"
46+endmenu
47+
48+endif
49--- /dev/null
50+++ b/arch/arm/mach-cns21xx/Makefile
51@@ -0,0 +1,10 @@
52+#
53+# Makefile for the linux kernel.
54+#
55+
56+# Object file lists.
57+
58+obj-y := core.o irq.o mm.o time.o
59+
60+# machine specific files
61+
62--- /dev/null
63+++ b/arch/arm/mach-cns21xx/Makefile.boot
64@@ -0,0 +1,3 @@
65+ zreladdr-y += 0x00008000
66+params_phys-y := 0x00000100
67+initrd_phys-y := 0x00C00000
68--- a/arch/arm/Makefile
69+++ b/arch/arm/Makefile
70@@ -136,6 +136,7 @@ textofs-$(CONFIG_ARCH_MSM8960) := 0x0020
71 # by CONFIG_* macro name.
72 machine-$(CONFIG_ARCH_AT91) := at91
73 machine-$(CONFIG_ARCH_BCMRING) := bcmring
74+machine-$(CONFIG_ARCH_CNS21XX) := cns21xx
75 machine-$(CONFIG_ARCH_CLPS711X) := clps711x
76 machine-$(CONFIG_ARCH_CNS3XXX) := cns3xxx
77 machine-$(CONFIG_ARCH_DAVINCI) := davinci
78--- /dev/null
79+++ b/arch/arm/mach-cns21xx/common.h
80@@ -0,0 +1,19 @@
81+/*
82+ * Copyright (c) 2008 Cavium Networks
83+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
84+ *
85+ * This file is free software; you can redistribute it and/or modify
86+ * it under the terms of the GNU General Public License, Version 2, as
87+ * published by the Free Software Foundation.
88+ */
89+
90+#ifndef _MACH_CNS21XX_COMMON_H
91+#define _MACH_CNS21XX_COMMON_H
92+
93+void cns21xx_restart(char mode, const char *cmd);
94+void cns21xx_map_io(void);
95+void cns21xx_init_irq(void);
96+
97+extern struct sys_timer cns21xx_timer;
98+
99+#endif /* _MACH_CNS21XX_COMMON_H */
100--- /dev/null
101+++ b/arch/arm/mach-cns21xx/mm.c
102@@ -0,0 +1,170 @@
103+/*
104+ * Copyright (c) 2008 Cavium Networks
105+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
106+ *
107+ * This file is free software; you can redistribute it and/or modify
108+ * it under the terms of the GNU General Public License, Version 2, as
109+ * published by the Free Software Foundation.
110+ */
111+
112+#include <linux/mm.h>
113+#include <linux/init.h>
114+
115+#include <asm/mach/map.h>
116+
117+#include <mach/hardware.h>
118+#include <mach/cns21xx.h>
119+
120+#include "common.h"
121+
122+/*
123+ * Standard IO mapping
124+ */
125+static struct map_desc cns21xx_io_desc[] __initdata = {
126+ {
127+ .virtual = CNS21XX_FLASH_BANK0_BASE_VIRT,
128+ .pfn = __phys_to_pfn(CNS21XX_FLASH_BANK0_BASE),
129+ .length = SZ_256M,
130+ .type = MT_DEVICE
131+ }, {
132+ .virtual = CNS21XX_IDE_DEVICE_BASE_VIRT,
133+ .pfn = __phys_to_pfn(CNS21XX_IDE_DEVICE_BASE),
134+ .length = SZ_4K,
135+ .type = MT_DEVICE
136+ }, {
137+ .virtual = CNS21XX_GDMAC_BASE_VIRT,
138+ .pfn = __phys_to_pfn(CNS21XX_GDMAC_BASE),
139+ .length = SZ_4K,
140+ .type = MT_DEVICE
141+ }, {
142+ .virtual = CNS21XX_NIC_BASE_VIRT,
143+ .pfn = __phys_to_pfn(CNS21XX_NIC_BASE),
144+ .length = SZ_4K,
145+ .type = MT_DEVICE
146+ }, {
147+ .virtual = CNS21XX_SPI_BASE_VIRT,
148+ .pfn = __phys_to_pfn(CNS21XX_SPI_BASE),
149+ .length = SZ_4K,
150+ .type = MT_DEVICE
151+ }, {
152+ .virtual = CNS21XX_PCM_BASE_VIRT,
153+ .pfn = __phys_to_pfn(CNS21XX_PCM_BASE),
154+ .length = SZ_4K,
155+ .type = MT_DEVICE
156+ }, {
157+ .virtual = CNS21XX_I2C_BASE_VIRT,
158+ .pfn = __phys_to_pfn(CNS21XX_I2C_BASE),
159+ .length = SZ_4K,
160+ .type = MT_DEVICE
161+ }, {
162+ .virtual = CNS21XX_I2S_BASE_VIRT,
163+ .pfn = __phys_to_pfn(CNS21XX_I2S_BASE),
164+ .length = SZ_4K,
165+ .type = MT_DEVICE
166+ }, {
167+ .virtual = CNS21XX_DDRC_BASE_VIRT,
168+ .pfn = __phys_to_pfn(CNS21XX_DDRC_BASE),
169+ .length = SZ_4K,
170+ .type = MT_DEVICE
171+ }, {
172+ .virtual = CNS21XX_SMC_BASE_VIRT,
173+ .pfn = __phys_to_pfn(CNS21XX_SMC_BASE),
174+ .length = SZ_4K,
175+ .type = MT_DEVICE
176+ }, {
177+ .virtual = CNS21XX_IDE_CTRL_BASE_VIRT,
178+ .pfn = __phys_to_pfn(CNS21XX_IDE_CTRL_BASE),
179+ .length = SZ_4K,
180+ .type = MT_DEVICE
181+ }, {
182+ .virtual = CNS21XX_MISC_BASE_VIRT,
183+ .pfn = __phys_to_pfn(CNS21XX_MISC_BASE),
184+ .length = SZ_4K,
185+ .type = MT_DEVICE
186+ }, {
187+ .virtual = CNS21XX_CPM_BASE_VIRT,
188+ .pfn = __phys_to_pfn(CNS21XX_CPM_BASE),
189+ .length = SZ_4K,
190+ .type = MT_DEVICE
191+ }, {
192+ .virtual = CNS21XX_UART0_BASE_VIRT,
193+ .pfn = __phys_to_pfn(CNS21XX_UART0_BASE),
194+ .length = SZ_4K,
195+ .type = MT_DEVICE
196+ }, {
197+ .virtual = CNS21XX_UART1_BASE_VIRT,
198+ .pfn = __phys_to_pfn(CNS21XX_UART1_BASE),
199+ .length = SZ_4K,
200+ .type = MT_DEVICE
201+ }, {
202+ .virtual = CNS21XX_TIMER_BASE_VIRT,
203+ .pfn = __phys_to_pfn(CNS21XX_TIMER_BASE),
204+ .length = SZ_4K,
205+ .type = MT_DEVICE
206+ }, {
207+ .virtual = CNS21XX_WDT_BASE_VIRT,
208+ .pfn = __phys_to_pfn(CNS21XX_WDT_BASE),
209+ .length = SZ_4K,
210+ .type = MT_DEVICE
211+ }, {
212+ .virtual = CNS21XX_RTC_BASE_VIRT,
213+ .pfn = __phys_to_pfn(CNS21XX_RTC_BASE),
214+ .length = SZ_4K,
215+ .type = MT_DEVICE
216+ }, {
217+ .virtual = CNS21XX_GPIOA_BASE_VIRT,
218+ .pfn = __phys_to_pfn(CNS21XX_GPIOA_BASE),
219+ .length = SZ_4K,
220+ .type = MT_DEVICE
221+ }, {
222+ .virtual = CNS21XX_GPIOB_BASE_VIRT,
223+ .pfn = __phys_to_pfn(CNS21XX_GPIOB_BASE),
224+ .length = SZ_4K,
225+ .type = MT_DEVICE
226+ }, {
227+ .virtual = CNS21XX_PCI_CFGDATA_BASE_VIRT,
228+ .pfn = __phys_to_pfn(CNS21XX_PCI_CFGDATA_BASE),
229+ .length = SZ_4K,
230+ .type = MT_DEVICE
231+ }, {
232+ .virtual = CNS21XX_PCI_CFGADDR_BASE_VIRT,
233+ .pfn = __phys_to_pfn(CNS21XX_PCI_CFGADDR_BASE),
234+ .length = SZ_4K,
235+ .type = MT_DEVICE
236+ }, {
237+ .virtual = CNS21XX_OHCI_CONFIG_BASE_VIRT,
238+ .pfn = __phys_to_pfn(CNS21XX_OHCI_CONFIG_BASE),
239+ .length = SZ_4K,
240+ .type = MT_DEVICE
241+ }, {
242+ .virtual = CNS21XX_OHCI_CTRL_BASE_VIRT,
243+ .pfn = __phys_to_pfn(CNS21XX_OHCI_CTRL_BASE),
244+ .length = SZ_4K,
245+ .type = MT_DEVICE
246+ }, {
247+ .virtual = CNS21XX_EHCI_CONFIG_BASE_VIRT,
248+ .pfn = __phys_to_pfn(CNS21XX_EHCI_CONFIG_BASE),
249+ .length = SZ_4K,
250+ .type = MT_DEVICE
251+ }, {
252+ .virtual = CNS21XX_EHCI_CTRL_BASE_VIRT,
253+ .pfn = __phys_to_pfn(CNS21XX_EHCI_CTRL_BASE),
254+ .length = SZ_4K,
255+ .type = MT_DEVICE
256+ }, {
257+ .virtual = CNS21XX_USB_DEVICE_BASE_VIRT,
258+ .pfn = __phys_to_pfn(CNS21XX_USB_DEVICE_BASE),
259+ .length = SZ_4K,
260+ .type = MT_DEVICE
261+ }, {
262+ .virtual = CNS21XX_INTC_BASE_VIRT,
263+ .pfn = __phys_to_pfn(CNS21XX_INTC_BASE),
264+ .length = SZ_4K,
265+ .type = MT_DEVICE
266+ }
267+};
268+
269+void __init cns21xx_map_io(void)
270+{
271+ iotable_init(cns21xx_io_desc, ARRAY_SIZE(cns21xx_io_desc));
272+}
273--- /dev/null
274+++ b/arch/arm/mach-cns21xx/include/mach/hardware.h
275@@ -0,0 +1,20 @@
276+/*
277+ * Copyright (c) 2008 Cavium Networks
278+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
279+ *
280+ * This file is free software; you can redistribute it and/or modify
281+ * it under the terms of the GNU General Public License, Version 2, as
282+ * published by the Free Software Foundation.
283+ */
284+
285+#ifndef _CNS21XX_HARDWARE_H
286+#define _CNS21XX_HARDWARE_H
287+
288+#ifndef __ASSEMBLY__
289+extern unsigned long cns21xx_get_pll_freq(void);
290+extern unsigned long cns21xx_get_cpu_freq(void);
291+extern unsigned long cns21xx_get_ahb_freq(void);
292+extern unsigned long cns21xx_get_apb_freq(void);
293+#endif
294+
295+#endif /* _CNS21XX_HARDWARE_H */
296--- /dev/null
297+++ b/arch/arm/mach-cns21xx/include/mach/debug-macro.S
298@@ -0,0 +1,25 @@
299+/*
300+ * Copyright (c) 2008 Cavium Networks
301+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
302+ *
303+ * This file is free software; you can redistribute it and/or modify
304+ * it under the terms of the GNU General Public License, Version 2, as
305+ * published by the Free Software Foundation.
306+ */
307+
308+#include <mach/cns21xx.h>
309+
310+/* TODO: make it configurable */
311+#define CNS21XX_DEBUG_UART_BASE CNS21XX_UART0_BASE
312+#define CNS21XX_DEBUG_UART_BASE_VIRT CNS21XX_UART0_BASE_VIRT
313+
314+ .macro addruart, rp, rv
315+ mov \rp, #(CNS21XX_DEBUG_UART_BASE) @ physical
316+ mov \rv, #(CNS21XX_DEBUG_UART_BASE_VIRT & 0xff000000) @virtual
317+ orr \rv, \rv, #(CNS21XX_DEBUG_UART_BASE_VIRT & 0x00ff0000)
318+ orr \rv, \rv, #(CNS21XX_DEBUG_UART_BASE_VIRT & 0x0000ff00)
319+ orr \rv, \rv, #(CNS21XX_DEBUG_UART_BASE_VIRT & 0x000000ff)
320+ .endm
321+
322+#define UART_SHIFT 2
323+#include <asm/hardware/debug-8250.S>
324--- /dev/null
325+++ b/arch/arm/mach-cns21xx/include/mach/entry-macro.S
326@@ -0,0 +1,39 @@
327+/*
328+ * Copyright (c) 2008 Cavium Networks
329+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
330+ *
331+ * This file is free software; you can redistribute it and/or modify
332+ * it under the terms of the GNU General Public License, Version 2, as
333+ * published by the Free Software Foundation.
334+ */
335+
336+#include <mach/cns21xx.h>
337+#include <mach/irqs.h>
338+
339+#define INTC_IRQ_STATUS 0x1c
340+
341+ .macro disable_fiq
342+ .endm
343+
344+ .macro get_irqnr_preamble, base, tmp
345+ .endm
346+
347+ .macro arch_ret_to_user, tmp1, tmp2
348+ .endm
349+
350+ .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
351+ ldr \base, =(CNS21XX_INTC_BASE_VIRT + INTC_IRQ_STATUS)
352+ ldr \irqstat, [\base]
353+ mov \irqnr, #0
354+9001:
355+ tst \irqstat, #1
356+ bne 9002f
357+ add \irqnr, \irqnr, #1
358+ mov \irqstat, \irqstat, lsr #1
359+ cmp \irqnr, #CNS21XX_NR_INTC_IRQS
360+ bcc 9001b
361+9002:
362+ .endm
363+
364+ .macro irq_prio_table
365+ .endm
366--- /dev/null
367+++ b/arch/arm/mach-cns21xx/include/mach/io.h
368@@ -0,0 +1,18 @@
369+/*
370+ * Copyright (c) 2008 Cavium Networks
371+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
372+ *
373+ * This file is free software; you can redistribute it and/or modify
374+ * it under the terms of the GNU General Public License, Version 2, as
375+ * published by the Free Software Foundation.
376+ */
377+
378+#ifndef _CNS21XX_IO_H
379+#define _CNS21XX_IO_H
380+
381+#define IO_SPACE_LIMIT 0xffffffff
382+
383+#define __io(p) __typesafe_io(p)
384+#define __mem_pci(a) (a)
385+
386+#endif /* _CNS21XX_IO_H */
387--- /dev/null
388+++ b/arch/arm/mach-cns21xx/include/mach/irqs.h
389@@ -0,0 +1,53 @@
390+/*
391+ * Copyright (c) 2008 Cavium Networks
392+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
393+ *
394+ * This file is free software; you can redistribute it and/or modify
395+ * it under the terms of the GNU General Public License, Version 2, as
396+ * published by the Free Software Foundation.
397+ */
398+
399+#ifndef _CNS21XX_IRQS_H
400+#define _CNS21XX_IRQS_H
401+
402+#define CNS21XX_IRQ_TIMER1 0
403+#define CNS21XX_IRQ_TIMER2 1
404+#define CNS21XX_IRQ_CPM 2
405+#define CNS21XX_IRQ_WDT 3
406+#define CNS21XX_IRQ_GPIO 4
407+#define CNS21XX_IRQ_PCI_INTA 5
408+#define CNS21XX_IRQ_PCI_INTB 6
409+#define CNS21XX_IRQ_PCI_BROKEN 7
410+#define CNS21XX_IRQ_AHB2PCI 8
411+#define CNS21XX_IRQ_UART0 9
412+#define CNS21XX_IRQ_UART1 10
413+#define CNS21XX_IRQ_GDMAC_TC 11
414+#define CNS21XX_IRQ_GDMAC_ERR 12
415+#define CNS21XX_IRQ_PCMCIA 13
416+#define CNS21XX_IRQ_RTC 14
417+#define CNS21XX_IRQ_PCM 15
418+#define CNS21XX_IRQ_USB_DEVICE 16
419+#define CNS21XX_IRQ_IDE 17
420+#define CNS21XX_IRQ_NIC_STATUS 18
421+#define CNS21XX_IRQ_NIC_TXTC 19
422+#define CNS21XX_IRQ_NIC_RXRC 20
423+#define CNS21XX_IRQ_NIC_TXQE 21
424+#define CNS21XX_IRQ_NIC_RXQF 22
425+#define CNS21XX_IRQ_OHCI 23
426+#define CNS21XX_IRQ_EHCI 24
427+#define CNS21XX_IRQ_I2S 25
428+#define CNS21XX_IRQ_SPI 26
429+#define CNS21XX_IRQ_I2C 27
430+#define CNS21XX_IRQ_USB_VBUS 28
431+#define CNS21XX_IRQ_EXT_29 29
432+#define CNS21XX_IRQ_EXT_30 30
433+#define CNS21XX_IRQ_HSDMAC 31
434+
435+#define CNS21XX_GPIO_IRQ_BASE 32
436+
437+#define CNS21XX_NR_INTC_IRQS 32
438+#define CNS21XX_NR_GPIO_IRQS 64
439+
440+#define NR_IRQS 96
441+
442+#endif /* _CNS21XX_IRQS_H */
443--- /dev/null
444+++ b/arch/arm/mach-cns21xx/include/mach/timex.h
445@@ -0,0 +1,15 @@
446+/*
447+ * Copyright (c) 2008 Cavium Networks
448+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
449+ *
450+ * This file is free software; you can redistribute it and/or modify
451+ * it under the terms of the GNU General Public License, Version 2, as
452+ * published by the Free Software Foundation.
453+ */
454+
455+#ifndef _CNS21XX_TIMEX_H
456+#define _CNS21XX_TIMEX_H
457+
458+#define CLOCK_TICK_RATE 43750000
459+
460+#endif /* _CNS21XX_TIMEX_H */
461--- /dev/null
462+++ b/arch/arm/mach-cns21xx/include/mach/uncompress.h
463@@ -0,0 +1,40 @@
464+/*
465+ * Copyright (c) 2008 Cavium Networks
466+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
467+ *
468+ * This file is free software; you can redistribute it and/or modify
469+ * it under the terms of the GNU General Public License, Version 2, as
470+ * published by the Free Software Foundation.
471+ */
472+
473+#ifndef _CNS21XX_UNCOMPRESS_H
474+#define _CNS21XX_UNCOMPRESS_H
475+
476+#define UART_BASE 0x78000000
477+
478+#define UART_REG(offs) (*((volatile unsigned int *)(UART_BASE + offs)))
479+
480+#define UART_THR UART_REG(0x00)
481+#define UART_LSR UART_REG(0x14)
482+#define THR_EMPTY (1 << 5)
483+
484+#define UART_THR_EMPTY() (((UART_LSR) & THR_EMPTY) == (THR_EMPTY))
485+
486+static void putc(int c)
487+{
488+ if (c != 0) {
489+ while (!UART_THR_EMPTY())
490+ barrier();
491+
492+ UART_THR = (int)(c & 0xFF);
493+ }
494+}
495+
496+static inline void flush(void)
497+{
498+}
499+
500+#define arch_decomp_setup()
501+#define arch_decomp_wdog()
502+
503+#endif /* _CNS21XX_UNCOMPRESS_H */
504--- /dev/null
505+++ b/arch/arm/mach-cns21xx/include/mach/system.h
506@@ -0,0 +1,30 @@
507+/*
508+ * Copyright (c) 2008 Cavium Networks
509+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
510+ *
511+ * This file is free software; you can redistribute it and/or modify
512+ * it under the terms of the GNU General Public License, Version 2, as
513+ * published by the Free Software Foundation.
514+ */
515+
516+#ifndef _CNS21XX_SYSTEM_H
517+#define _CNS21XX_SYSTEM_H
518+
519+#include <mach/cns21xx.h>
520+#include <mach/cns21xx_powermgmt.h>
521+
522+static inline void arch_idle(void)
523+{
524+ /*
525+ * Because of broken hardware we have to enable interrupts or the CPU
526+ * will never wakeup... Acctualy it is not very good to enable
527+ * interrupts here since scheduler can miss a tick, but there is
528+ * no other way around this. Platforms that needs it for power saving
529+ * should call enable_hlt() in init code, since by default it is
530+ * disabled.
531+ */
532+ local_irq_enable();
533+ cpu_do_idle();
534+}
535+
536+#endif /* _CNS21XX_SYSTEM_H */
537--- /dev/null
538+++ b/arch/arm/mach-cns21xx/irq.c
539@@ -0,0 +1,174 @@
540+/*
541+ * Copyright (c) 2008 Cavium Networks
542+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
543+ *
544+ * This file is free software; you can redistribute it and/or modify
545+ * it under the terms of the GNU General Public License, Version 2, as
546+ * published by the Free Software Foundation.
547+ */
548+
549+#include <linux/init.h>
550+#include <linux/interrupt.h>
551+#include <linux/irq.h>
552+#include <linux/io.h>
553+#include <linux/ioport.h>
554+
555+#include <mach/cns21xx.h>
556+
557+#define INTC_INTERRUPT_RAW_STATUS_REG 0x000
558+#define INTC_EDGE_INTERRUPT_SOURCE_CLEAR_REG 0x004
559+#define INTC_INTERRUPT_MASK_REG 0x008
560+#define INTC_INTERRUPT_MASK_CLEAR_REG 0x00c
561+#define INTC_INTERRUPT_TRIGGER_MODE_REG 0x010
562+#define INTC_INTERRUPT_TRIGGER_LEVEL_REG 0x014
563+#define INTC_FIQ_SELECT_REG 0x018
564+#define INTC_IRQ_STATUS_REG 0x01c
565+#define INTC_FIQ_STATUS_REG 0x020
566+#define INTC_SOFTWARE_INTERRUPT_REG 0x024
567+#define INTC_SOFTWARE_INTERRUPT_CLEAR_REG 0x028
568+#define INTC_SOFTWARE_PRIORITY_MASK_REG 0x02c
569+#define INTC_POWER_MANAGEMENT_INTERRUPT_REG 0x034
570+
571+#define INTC_VECTOR_ADDRESS_REG(_x) ((_x) + 0x040)
572+#define INTC_PRIORITY_REG(_x) ((_x) + 0x0c0)
573+#define INTC_IRQ_VECTOR_ADDRESS_REG 0x140
574+#define INTC_VECTOR_INTERRUPT_ENABLE_REG 0x144
575+
576+#define INTC_SIZE 0x148
577+
578+static unsigned int cns21xx_irq_types[CNS21XX_NR_INTC_IRQS] = {
579+ [CNS21XX_IRQ_TIMER1] = IRQ_TYPE_EDGE_RISING,
580+ [CNS21XX_IRQ_TIMER2] = IRQ_TYPE_EDGE_RISING,
581+ [CNS21XX_IRQ_CPM] = IRQ_TYPE_EDGE_FALLING,
582+ [CNS21XX_IRQ_WDT] = IRQ_TYPE_EDGE_RISING,
583+ [CNS21XX_IRQ_GPIO] = IRQ_TYPE_NONE,
584+ [CNS21XX_IRQ_PCI_INTA] = IRQ_TYPE_LEVEL_LOW,
585+ [CNS21XX_IRQ_PCI_INTB] = IRQ_TYPE_LEVEL_LOW,
586+ [CNS21XX_IRQ_PCI_BROKEN] = IRQ_TYPE_LEVEL_HIGH,
587+ [CNS21XX_IRQ_AHB2PCI] = IRQ_TYPE_LEVEL_HIGH,
588+ [CNS21XX_IRQ_UART0] = IRQ_TYPE_LEVEL_HIGH,
589+ [CNS21XX_IRQ_UART1] = IRQ_TYPE_LEVEL_HIGH,
590+ [CNS21XX_IRQ_GDMAC_TC] = IRQ_TYPE_LEVEL_HIGH,
591+ [CNS21XX_IRQ_GDMAC_ERR] = IRQ_TYPE_LEVEL_HIGH,
592+ [CNS21XX_IRQ_PCMCIA] = IRQ_TYPE_NONE,
593+ [CNS21XX_IRQ_RTC] = IRQ_TYPE_LEVEL_HIGH,
594+ [CNS21XX_IRQ_PCM] = IRQ_TYPE_LEVEL_LOW,
595+ [CNS21XX_IRQ_USB_DEVICE] = IRQ_TYPE_LEVEL_LOW,
596+ [CNS21XX_IRQ_IDE] = IRQ_TYPE_LEVEL_HIGH,
597+ [CNS21XX_IRQ_NIC_STATUS] = IRQ_TYPE_LEVEL_HIGH,
598+ [CNS21XX_IRQ_NIC_TXTC] = IRQ_TYPE_EDGE_RISING,
599+ [CNS21XX_IRQ_NIC_RXRC] = IRQ_TYPE_EDGE_RISING,
600+ [CNS21XX_IRQ_NIC_TXQE] = IRQ_TYPE_EDGE_RISING,
601+ [CNS21XX_IRQ_NIC_RXQF] = IRQ_TYPE_EDGE_RISING,
602+ [CNS21XX_IRQ_OHCI] = IRQ_TYPE_LEVEL_LOW,
603+ [CNS21XX_IRQ_EHCI] = IRQ_TYPE_LEVEL_LOW,
604+ [CNS21XX_IRQ_I2S] = IRQ_TYPE_LEVEL_LOW,
605+ [CNS21XX_IRQ_SPI] = IRQ_TYPE_LEVEL_LOW,
606+ [CNS21XX_IRQ_I2C] = IRQ_TYPE_LEVEL_LOW,
607+ [CNS21XX_IRQ_USB_VBUS] = IRQ_TYPE_EDGE_RISING,
608+ [CNS21XX_IRQ_EXT_29] = IRQ_TYPE_NONE,
609+ [CNS21XX_IRQ_EXT_30] = IRQ_TYPE_NONE,
610+ [CNS21XX_IRQ_HSDMAC] = IRQ_TYPE_EDGE_RISING,
611+};
612+
613+static void __iomem *cns21xx_intc_base;
614+
615+static inline void cns21xx_intc_writel(u32 val, unsigned int reg)
616+{
617+ __raw_writel(val, cns21xx_intc_base + reg);
618+}
619+
620+static inline u32 cns21xx_intc_readl(unsigned int reg)
621+{
622+ return __raw_readl(cns21xx_intc_base + reg);
623+}
624+
625+static void cns21xx_irq_ack(struct irq_data *d)
626+{
627+ cns21xx_intc_writel(1 << d->irq, INTC_EDGE_INTERRUPT_SOURCE_CLEAR_REG);
628+}
629+
630+static void cns21xx_irq_mask(struct irq_data *d)
631+{
632+ cns21xx_intc_writel(1 << d->irq, INTC_INTERRUPT_MASK_REG);
633+}
634+
635+static void cns21xx_irq_unmask(struct irq_data *d)
636+{
637+ cns21xx_intc_writel(1 << d->irq, INTC_INTERRUPT_MASK_CLEAR_REG);
638+}
639+
640+static struct irq_chip cns21xx_irq_chip = {
641+ .name = "INTC",
642+ .irq_ack = cns21xx_irq_ack,
643+ .irq_mask = cns21xx_irq_mask,
644+ .irq_unmask = cns21xx_irq_unmask,
645+};
646+
647+static struct resource cns21xx_intc_resource = {
648+ .name = "INTC",
649+ .flags = IORESOURCE_MEM,
650+ .start = CNS21XX_INTC_BASE,
651+ .end = CNS21XX_INTC_BASE + INTC_SIZE - 1,
652+};
653+
654+void __init cns21xx_init_irq(void)
655+{
656+ unsigned int mode = 0;
657+ unsigned int level = 0;
658+ int i;
659+
660+ /*
661+ * Disable arch_idle() by default since it is buggy
662+ * For more info see arch/arm/mach-cns21xx/include/mach/system.h
663+ */
664+ disable_hlt();
665+
666+ request_resource(&iomem_resource, &cns21xx_intc_resource);
667+ cns21xx_intc_base = ioremap(cns21xx_intc_resource.start, INTC_SIZE);
668+
669+ cns21xx_intc_writel(0xffffffff, INTC_INTERRUPT_MASK_REG);
670+ cns21xx_intc_writel(0xffffffff, INTC_EDGE_INTERRUPT_SOURCE_CLEAR_REG);
671+ cns21xx_intc_writel(0xffffffff, INTC_SOFTWARE_INTERRUPT_CLEAR_REG);
672+ cns21xx_intc_writel(0, INTC_SOFTWARE_PRIORITY_MASK_REG);
673+ cns21xx_intc_writel(0, INTC_FIQ_SELECT_REG);
674+ cns21xx_intc_writel(0, INTC_VECTOR_INTERRUPT_ENABLE_REG);
675+
676+ for (i = 0; i < ARRAY_SIZE(cns21xx_irq_types); i++) {
677+ irq_flow_handler_t handler;
678+
679+ switch (cns21xx_irq_types[i]) {
680+ case IRQ_TYPE_EDGE_RISING:
681+ handler = handle_edge_irq;
682+ mode |= (1 << i);
683+ break;
684+
685+ case IRQ_TYPE_EDGE_FALLING:
686+ handler = handle_edge_irq;
687+ mode |= (1 << i);
688+ level |= (1 << i);
689+ break;
690+
691+ case IRQ_TYPE_LEVEL_LOW:
692+ handler = handle_level_irq;
693+ level |= (1 << i);
694+ break;
695+
696+ case IRQ_TYPE_LEVEL_HIGH:
697+ case IRQ_TYPE_NONE:
698+ handler = handle_level_irq;
699+ break;
700+
701+ default:
702+ BUG();
703+ break;
704+ }
705+
706+ irq_set_chip(i, &cns21xx_irq_chip);
707+ irq_set_handler(i, handler);
708+ set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
709+ }
710+
711+ cns21xx_intc_writel(mode, INTC_INTERRUPT_TRIGGER_MODE_REG);
712+ cns21xx_intc_writel(level, INTC_INTERRUPT_TRIGGER_LEVEL_REG);
713+}
714--- /dev/null
715+++ b/arch/arm/mach-cns21xx/time.c
716@@ -0,0 +1,28 @@
717+/*
718+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
719+ *
720+ * This file is free software; you can redistribute it and/or modify
721+ * it under the terms of the GNU General Public License, Version 2, as
722+ * published by the Free Software Foundation.
723+ */
724+
725+#include <linux/init.h>
726+#include <linux/irq.h>
727+
728+#include <asm/mach/time.h>
729+
730+#include <plat/time.h>
731+#include <mach/hardware.h>
732+#include <mach/cns21xx.h>
733+
734+#include "common.h"
735+
736+static void __init cns21xx_timer_init(void)
737+{
738+ fa_timer_init(CNS21XX_TIMER_BASE, CNS21XX_IRQ_TIMER1, FA_TIMER1,
739+ cns21xx_get_apb_freq());
740+}
741+
742+struct sys_timer cns21xx_timer = {
743+ .init = cns21xx_timer_init,
744+};
745--- /dev/null
746+++ b/arch/arm/mach-cns21xx/include/mach/cns21xx_powermgmt.h
747@@ -0,0 +1,591 @@
748+/*
749+ * Copyright (c) 2008 Cavium Networks
750+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
751+ *
752+ * This file is free software; you can redistribute it and/or modify
753+ * it under the terms of the GNU General Public License, Version 2, as
754+ * published by the Free Software Foundation.
755+ */
756+
757+#ifndef _CNS21XX_POWERMGMT_H
758+#define _CNS21XX_POWERMGMT_H
759+
760+#define PWRMGT_MEM_MAP_VALUE(reg_offset) \
761+ (*((u32 volatile *)(CNS21XX_CPM_BASE_VIRT + reg_offset)))
762+
763+/*
764+ * define access macros
765+ */
766+#define PWRMGT_CLOCK_GATE_CONTROL0_REG PWRMGT_MEM_MAP_VALUE(0x00)
767+#define PWRMGT_CLOCK_GATE_CONTROL1_REG PWRMGT_MEM_MAP_VALUE(0x04)
768+#define PWRMGT_SOFTWARE_RESET_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x08)
769+#define PWRMGT_SYSTEM_CLOCK_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x0C)
770+#define PWRMGT_PLL_POWER_DOWN_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x10)
771+#define PWRMGT_CPU_INITIALIZATION_REG PWRMGT_MEM_MAP_VALUE(0x14)
772+#define PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x1C)
773+#define PWRMGT_USB_DEVICE_POWERMGT_REG PWRMGT_MEM_MAP_VALUE(0x20)
774+#define PWRMGT_REGULATOR_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x24)
775+#define PWRMGT_RTC_XTAL_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x28)
776+#define PWRMGT_PLL250_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x2C)
777+
778+
779+/*
780+ * define constants macros
781+ */
782+#define PWRMGT_GLOBAL_SOFTWARE_RESET_MASK_BIT_INDEX 0
783+#define PWRMGT_PCMCIA_SOFTWARE_RESET_BIT_INDEX 1
784+#define PWRMGT_IDE_SOFTWARE_RESET_BIT_INDEX 2
785+#define PWRMGT_VIC_SOFTWARE_RESET_BIT_INDEX 3
786+#define PWRMGT_DMA_SOFTWARE_RESET_BIT_INDEX 4
787+#define PWRMGT_NIC_SOFTWARE_RESET_BIT_INDEX 5
788+#define PWRMGT_USB_HOST_SOFTWARE_RESET_BIT_INDEX 6
789+#define PWRMGT_PCI_BRIDGE_SOFTWARE_RESET_BIT_INDEX 7
790+#define PWRMGT_P2S_SOFTWARE_RESET_BIT_INDEX 8
791+#define PWRMGT_UART0_SOFTWARE_RESET_BIT_INDEX 9
792+#define PWRMGT_UART1_SOFTWARE_RESET_BIT_INDEX 10
793+#define PWRMGT_TIMER_SOFTWARE_RESET_BIT_INDEX 11
794+#define PWRMGT_WDTIMER_SOFTWARE_RESET_BIT_INDEX 12
795+#define PWRMGT_GPIO_SOFTWARE_RESET_BIT_INDEX 13
796+#define PWRMGT_USB_DEVICE_SOFTWARE_RESET_BIT_INDEX 14
797+#define PWRMGT_FAST_ETHERNET_PHY_SOFTWARE_RESET_BIT_INDEX 15
798+#define PWRMGT_HSDMA_SOFTWARE_RESET_BIT_INDEX 16
799+
800+#define PWRMGT_PLL_FREQUENCY_175MHZ (0 << 0)
801+#define PWRMGT_PLL_FREQUENCY_200MHZ (1 << 0)
802+#define PWRMGT_PLL_FREQUENCY_225MHZ (2 << 0)
803+#define PWRMGT_PLL_FREQUENCY_250MHZ (3 << 0)
804+
805+#define PWRMGT_CPUCLK_DIVIDER_BY_1 (0 << 2)
806+#define PWRMGT_CPUCLK_DIVIDER_BY_2 (1 << 2)
807+#define PWRMGT_CPUCLK_DIVIDER_BY_3 (2 << 2)
808+#define PWRMGT_CPUCLK_DIVIDER_BY_4 (3 << 2)
809+
810+#define PWRMGT_HCLK_DIVIDER_BY_1 (0 << 4)
811+#define PWRMGT_HCLK_DIVIDER_BY_2 (1 << 4)
812+#define PWRMGT_HCLK_DIVIDER_BY_3 (2 << 4)
813+#define PWRMGT_HCLK_DIVIDER_BY_4 (3 << 4)
814+
815+#define PWRMGT_HCLK_SOURCE_FCLK (0 << 6)
816+#define PWRMGT_HCLK_SOURCE_125MHZ (1 << 6)
817+
818+#define PWRMGT_PCLK_DIVIDER_BY_1 (0 << 8)
819+#define PWRMGT_PCLK_DIVIDER_BY_2 (1 << 8)
820+#define PWRMGT_PCLK_DIVIDER_BY_3 (2 << 8)
821+#define PWRMGT_PCLK_DIVIDER_BY_4 (3 << 8)
822+
823+#define PWRMGT_PCICLK_DIVIDER_BY_1 (0 << 10)
824+#define PWRMGT_PCICLK_DIVIDER_BY_2 (1 << 10)
825+#define PWRMGT_PCICLK_DIVIDER_BY_3 (2 << 10)
826+#define PWRMGT_PCICLK_DIVIDER_BY_4 (3 << 10)
827+
828+
829+#define PWRMGT_PLLCLK_TO_CPUCLK_RATIO_BY_1 1
830+#define PWRMGT_PLLCLK_TO_CPUCLK_RATIO_BY_2 2
831+#define PWRMGT_PLLCLK_TO_CPUCLK_RATIO_BY_3 3
832+#define PWRMGT_PLLCLK_TO_CPUCLK_RATIO_BY_4 4
833+
834+#define PWRMGT_CPUCLK_TO_HCLK_RATIO_BY_1 1
835+#define PWRMGT_CPUCLK_TO_HCLK_RATIO_BY_2 2
836+#define PWRMGT_CPUCLK_TO_HCLK_RATIO_BY_3 3
837+#define PWRMGT_CPUCLK_TO_HCLK_RATIO_BY_4 4
838+
839+#define PWRMGT_HCLK_TO_PCLK_RATIO_BY_1 1
840+#define PWRMGT_HCLK_TO_PCLK_RATIO_BY_2 2
841+#define PWRMGT_HCLK_TO_PCLK_RATIO_BY_3 3
842+#define PWRMGT_HCLK_TO_PCLK_RATIO_BY_4 4
843+
844+/*
845+ * Macro defines for Clock Gate Control
846+ */
847+#define HAL_PWRMGT_DISABLE_DRAMC_CLOCK() \
848+{ \
849+ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~(0x1); \
850+}
851+
852+
853+#define HAL_PWRMGT_ENABLE_NIC_CLOCK() \
854+{ \
855+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 0); \
856+ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x0F << 20); \
857+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 5); \
858+}
859+
860+#define HAL_PWRMGT_DISABLE_NIC_CLOCK() \
861+{ \
862+ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~(0x0F << 20); \
863+}
864+
865+
866+#define HAL_PWRMGT_ENABLE_PCI_BRIDGE_33M_CLOCK() \
867+{ \
868+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 1); \
869+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 10); \
870+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x1 << 10); \
871+ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 28) | (0x1 << 30); \
872+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 7); \
873+}
874+
875+#define HAL_PWRMGT_ENABLE_PCI_BRIDGE_66M_CLOCK() \
876+{ \
877+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 1); \
878+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 10); \
879+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x0 << 10); \
880+ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 28) | (0x1 << 30); \
881+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 7); \
882+}
883+
884+#define HAL_PWRMGT_DISABLE_PCI_CLOCK() \
885+{ \
886+ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~((0x1 << 28) | (0x1 << 30)); \
887+}
888+
889+
890+#define HAL_PWRMGT_ENABLE_USB_CLOCK() \
891+{ \
892+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0xF << 1); \
893+ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 24); \
894+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 28); \
895+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 6) | (0x1 << 14); \
896+}
897+
898+#define HAL_PWRMGT_DISABLE_USB_CLOCK() \
899+{ \
900+ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~(0x1 << 24); \
901+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 28); \
902+}
903+
904+
905+#define HAL_PWRMGT_ENABLE_DMA_CLOCK() \
906+{ \
907+ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 16); \
908+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 4); \
909+}
910+
911+#define HAL_PWRMGT_DISABLE_DMA_CLOCK() \
912+{ \
913+ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~(0x1 << 16); \
914+}
915+
916+
917+#define HAL_PWRMGT_ENABLE_IDE_CLOCK() \
918+{ \
919+ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 8) | (0x1 << 9); \
920+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 2); \
921+}
922+
923+#define HAL_PWRMGT_DISABLE_IDE_CLOCK() \
924+{ \
925+ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~((0x1 << 8) | (0x1 << 9)); \
926+}
927+
928+
929+#define HAL_PWRMGT_ENABLE_UART0_CLOCK() \
930+{ \
931+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~((0x1 << 1) | (0x1 << 2) | (0x1 << 5)); \
932+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 12); \
933+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 9); \
934+}
935+
936+#define HAL_PWRMGT_DISABLE_UART0_CLOCK() \
937+{ \
938+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 12); \
939+}
940+
941+
942+#define HAL_PWRMGT_ENABLE_UART1_CLOCK() \
943+{ \
944+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~((0x1 << 1) | (0x1 << 2) | (0x1 << 5)); \
945+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 13); \
946+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 10); \
947+}
948+
949+#define HAL_PWRMGT_DISABLE_UART1_CLOCK() \
950+{ \
951+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 13); \
952+}
953+
954+
955+#define HAL_PWRMGT_ENABLE_PCMCIA_CLOCK() \
956+{ \
957+ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 4) | (0x1 << 5); \
958+}
959+
960+#define HAL_PWRMGT_DISABLE_PCMCIA_CLOCK() \
961+{ \
962+ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~((0x1 << 4) | (0x1 << 5)); \
963+}
964+
965+
966+#define HAL_PWRMGT_ENABLE_GPIO_CLOCK() \
967+{ \
968+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 25); \
969+}
970+
971+#define HAL_PWRMGT_DISABLE_GPIO_CLOCK() \
972+{ \
973+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 25); \
974+}
975+
976+
977+#define HAL_PWRMGT_ENABLE_WDTIMER_CLOCK() \
978+{ \
979+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 21) | (0x1 << 22); \
980+}
981+
982+#define HAL_PWRMGT_DISABLE_WDTIMER_CLOCK() \
983+{ \
984+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~((0x1 << 21) | (0x1 << 22)); \
985+}
986+
987+
988+#define HAL_PWRMGT_ENABLE_RTC_CLOCK() \
989+{ \
990+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 23); \
991+}
992+
993+#define HAL_PWRMGT_DISABLE_RTC_CLOCK() \
994+{ \
995+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 23); \
996+}
997+
998+
999+#define HAL_PWRMGT_ENABLE_TIMER_CLOCK() \
1000+{ \
1001+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 17) | (0x1 << 18) | (0x1 << 19); \
1002+}
1003+
1004+#define HAL_PWRMGT_DISABLE_TIMER_CLOCK() \
1005+{ \
1006+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~((0x1 << 17) | (0x1 << 18) | (0x1 << 19)); \
1007+}
1008+
1009+
1010+#define HAL_PWRMGT_ENABLE_I2C_CLOCK() \
1011+{ \
1012+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 1); \
1013+}
1014+
1015+#define HAL_PWRMGT_DISABLE_I2C_CLOCK() \
1016+{ \
1017+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 1); \
1018+}
1019+
1020+
1021+#define HAL_PWRMGT_ENABLE_I2S_CLOCK() \
1022+{ \
1023+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~((0x1 << 5) | (0x1 << 6)); \
1024+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 1) | (0x1 << 10); \
1025+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 8); \
1026+}
1027+
1028+#define HAL_PWRMGT_DISABLE_I2S_CLOCK() \
1029+{ \
1030+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~((0x1 << 1) | (0x1 << 10)); \
1031+}
1032+
1033+
1034+#define HAL_PWRMGT_ENABLE_PCM_CLOCK() \
1035+{ \
1036+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 5); \
1037+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 1) | (0x1 << 6); \
1038+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 8); \
1039+}
1040+
1041+#define HAL_PWRMGT_DISABLE_PCM_CLOCK() \
1042+{ \
1043+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~((0x1 << 1) | (0x1 << 6)); \
1044+}
1045+
1046+
1047+#define HAL_PWRMGT_ENABLE_SPI_CLOCK() \
1048+{ \
1049+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 0) | (0x1 << 1); \
1050+}
1051+
1052+#define HAL_PWRMGT_DISABLE_SPI_CLOCK() \
1053+{ \
1054+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~((0x1 << 0) | (0x1 << 1)); \
1055+}
1056+
1057+
1058+#define HAL_PWRMGT_ENABLE_VIC_CLOCK() \
1059+{ \
1060+ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 12); \
1061+}
1062+
1063+#define HAL_PWRMGT_DISABLE_VIC_CLOCK() \
1064+{ \
1065+ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~(0x1 << 12); \
1066+}
1067+
1068+
1069+#define HAL_PWRMGT_ENABLE_SMC_CLOCK() \
1070+{ \
1071+ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 4) | (0x1 << 5); \
1072+}
1073+
1074+#define HAL_PWRMGT_DISABLE_SMC_CLOCK() \
1075+{ \
1076+ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~((0x1 << 4) | (0x1 << 5)); \
1077+}
1078+
1079+
1080+#define HAL_PWRMGT_ENABLE_HSDMA_CLOCK() \
1081+{ \
1082+ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 29); \
1083+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 16); \
1084+}
1085+
1086+#define HAL_PWRMGT_DISABLE_HSDMA_CLOCK() \
1087+{ \
1088+ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 29); \
1089+}
1090+
1091+
1092+
1093+/*
1094+ * Macro defines for Reset Control
1095+ */
1096+#define HAL_PWRMGT_GLOBAL_SOFTWARE_RESET() \
1097+{ \
1098+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1); \
1099+ PWRMGT_SOFTWARE_RESET_CONTROL_REG &= ~(0x1); \
1100+}
1101+
1102+
1103+/*
1104+ * Macro defines for System Clock Control
1105+ */
1106+#define HAL_PWRMGT_SET_PLL_FREQUENCY_175MHZ() \
1107+{ \
1108+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~0x3; \
1109+}
1110+
1111+
1112+#define HAL_PWRMGT_SET_PLL_FREQUENCY_200MHZ() \
1113+{ \
1114+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~0x3; \
1115+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= 0x1; \
1116+}
1117+
1118+
1119+#define HAL_PWRMGT_SET_PLL_FREQUENCY_225MHZ() \
1120+{ \
1121+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~0x3; \
1122+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= 0x2; \
1123+}
1124+
1125+
1126+#define HAL_PWRMGT_SET_PLL_FREQUENCY_250MHZ() \
1127+{ \
1128+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~0x3; \
1129+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= 0x3; \
1130+}
1131+
1132+
1133+#define HAL_PWRMGT_CONFIG_PLLCLK_TO_CPUCLK_RATIO(ratio) \
1134+{ \
1135+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 2); \
1136+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (((ratio - 1) & 0x3) << 2); \
1137+}
1138+
1139+
1140+#define HAL_PWRMGT_CONFIG_CPUCLK_TO_HCLK_RATIO(ratio) \
1141+{ \
1142+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 4); \
1143+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (((ratio - 1) & 0x3) << 4); \
1144+}
1145+
1146+
1147+#define HAL_PWRMGT_HCLK_SOURCE_FCLK() \
1148+{ \
1149+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x1 << 6); \
1150+}
1151+
1152+
1153+#define HAL_PWRMGT_HCLK_SOURCE_125MHZ() \
1154+{ \
1155+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x1 << 6); \
1156+}
1157+
1158+
1159+#define HAL_PWRMGT_GIGA_NIC_CLOCK_SOURCE_HCLK() \
1160+{ \
1161+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x1 << 7); \
1162+}
1163+
1164+
1165+#define HAL_PWRMGT_GIGA_NIC_CLOCK_SOURCE_62_5MHZ() \
1166+{ \
1167+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x1 << 7); \
1168+}
1169+
1170+
1171+#define HAL_PWRMGT_CONFIG_HCLK_TO_PCLK_RATIO(ratio) \
1172+{ \
1173+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 8); \
1174+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (((ratio - 1) & 0x3) << 8); \
1175+}
1176+
1177+
1178+#define HAL_PWRMGT_I2S_CLOCK_SOURCE_8192000HZ() \
1179+{ \
1180+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 12); \
1181+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x0 << 12); \
1182+}
1183+
1184+
1185+#define HAL_PWRMGT_I2S_CLOCK_SOURCE_11289600HZ() \
1186+{ \
1187+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 12); \
1188+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x1 << 12); \
1189+}
1190+
1191+
1192+#define HAL_PWRMGT_I2S_CLOCK_SOURCE_12288000HZ() \
1193+{ \
1194+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 12); \
1195+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x2 << 12); \
1196+}
1197+
1198+
1199+#define HAL_PWRMGT_CONFIGURE_MDC_CLOCK_DIVIDER(divided_value) \
1200+{ \
1201+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 14); \
1202+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= ((divided_value & 0x3) << 14); \
1203+}
1204+
1205+
1206+#define HAL_PWRMGT_CONFIGURE_CLOCK_OUT_PIN(pin_source_select, divided_value) \
1207+{ \
1208+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3F << 16); \
1209+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= ((pin_source_select & 0xF) << 16); \
1210+ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= ((divided_value & 0x3) << 20); \
1211+}
1212+
1213+
1214+/*
1215+ * Macro defines for PLL Power Down Control
1216+ */
1217+#define HAL_PWRMGT_POWER_DOWN_SYSTEM_XTAL_PAD() \
1218+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 7)
1219+
1220+#define HAL_PWRMGT_POWER_ON_SYSTEM_XTAL_PAD() \
1221+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 7)
1222+
1223+
1224+#define HAL_PWRMGT_POWER_DOWN_PLL_X5() \
1225+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 0)
1226+
1227+#define HAL_PWRMGT_POWER_ON_PLL_X5() \
1228+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 0)
1229+
1230+
1231+#define HAL_PWRMGT_POWER_DOWN_PLL_X8() \
1232+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 1)
1233+
1234+#define HAL_PWRMGT_POWER_ON_PLL_X8() \
1235+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 1)
1236+
1237+
1238+#define HAL_PWRMGT_POWER_DOWN_PLL_X3() \
1239+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 2)
1240+
1241+#define HAL_PWRMGT_POWER_ON_PLL_X3() \
1242+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 2)
1243+
1244+
1245+#define HAL_PWRMGT_POWER_DOWN_USBH_PHY_PLL() \
1246+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 3)
1247+
1248+#define HAL_PWRMGT_POWER_ON_USBH_PHY_PLL() \
1249+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 3)
1250+
1251+
1252+#define HAL_PWRMGT_POWER_DOWN_USBD_PHY_PLL() \
1253+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 4)
1254+
1255+#define HAL_PWRMGT_POWER_ON_USBD_PHY_PLL() \
1256+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 4)
1257+
1258+
1259+#define HAL_PWRMGT_POWER_DOWN_PLL_X2250() \
1260+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 5)
1261+
1262+#define HAL_PWRMGT_POWER_ON_PLL_X2250() \
1263+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 5)
1264+
1265+
1266+#define HAL_PWRMGT_POWER_DOWN_PLL_X7() \
1267+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 6)
1268+
1269+#define HAL_PWRMGT_POWER_ON_PLL_X7() \
1270+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 6)
1271+
1272+
1273+#define HAL_PWRMGT_POWER_DOWN_ALL_PLL() \
1274+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG = 0x7F;
1275+
1276+#define HAL_PWRMGT_POWER_ON_ALL_PLL() \
1277+ PWRMGT_PLL_POWER_DOWN_CONTROL_REG = 0;
1278+
1279+
1280+/*
1281+ * Macro defines for Pad Drive Strength Control
1282+ */
1283+#define HAL_PWRMGT_SELECT_PAD_DRIVE_STRENGTH_PCMCIA_CARDBUS_MODE() \
1284+{ \
1285+ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG &= ~(0x3 << 0); \
1286+}
1287+
1288+#define HAL_PWRMGT_SELECT_PAD_DRIVE_STRENGTH_PCI_MODE() \
1289+{ \
1290+ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG &= ~(0x3 << 0); \
1291+ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG |= (0x1 << 0); \
1292+}
1293+
1294+#define HAL_PWRMGT_SELECT_PAD_DRIVE_STRENGTH_MII_MODE() \
1295+{ \
1296+ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG |= (0x1 << 2); \
1297+}
1298+
1299+#define HAL_PWRMGT_SELECT_PAD_DRIVE_STRENGTH_RGMII_MODE() \
1300+{ \
1301+ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG &= ~(0x1 << 2); \
1302+}
1303+
1304+#define HAL_PWRMGT_ENABLE_MII_PAD_SIGNAL_NOT_BOUNDED() \
1305+{ \
1306+ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG |= (0x1 << 3); \
1307+}
1308+
1309+#define HAL_PWRMGT_DISABLE_MII_PAD_SIGNAL_NOT_BOUNDED() \
1310+{ \
1311+ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG &= ~(0x1 << 3); \
1312+}
1313+
1314+
1315+/*
1316+ * Macro defines for USB Device Power Management
1317+ */
1318+#define HAL_PWRMGT_REMOTE_WAKEUP_USB_HOST() \
1319+{ \
1320+ PWRMGT_USB_DEVICE_POWERMGT_REG |= (0x1 << 4); \
1321+}
1322+
1323+#define HAL_PWRMGT_USB_DEVICE_PHY_CLOCK_SOURCE_EXTERNAL_12MHZ() \
1324+{ \
1325+ PWRMGT_USB_DEVICE_POWERMGT_REG &= ~(0x1 << 5); \
1326+}
1327+
1328+#define HAL_PWRMGT_USB_DEVICE_PHY_CLOCK_SOURCE_INTERNAL_12MHZ() \
1329+{ \
1330+ PWRMGT_USB_DEVICE_POWERMGT_REG |= (0x1 << 5); \
1331+}
1332+
1333+
1334+/*
1335+ * Macro defines for Regulator Control
1336+ */
1337+
1338+#endif /* _CNS21XX_POWERMGMT_H */
1339--- /dev/null
1340+++ b/arch/arm/mach-cns21xx/include/mach/cns21xx.h
1341@@ -0,0 +1,88 @@
1342+/*
1343+ * Copyright (c) 2008 Cavium Networks
1344+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
1345+ *
1346+ * This file is free software; you can redistribute it and/or modify
1347+ * it under the terms of the GNU General Public License, Version 2, as
1348+ * published by the Free Software Foundation.
1349+ */
1350+
1351+#ifndef _CNS21XX_H
1352+#define _CNS21XX_H
1353+
1354+#define CNS21XX_FLASH_BANK0_BASE 0x10000000
1355+#define CNS21XX_FLASH_BANK1_BASE 0x11000000
1356+#define CNS21XX_FLASH_BANK2_BASE 0x12000000
1357+#define CNS21XX_FLASH_BANK3_BASE 0x13000000
1358+#define CNS21XX_PCMCIA_ATTR_BASE 0x14000000
1359+#define CNS21XX_PCMCIA_MEM_BASE 0x15000000
1360+#define CNS21XX_PCMCIA_IO_BASE 0x16000000
1361+#define CNS21XX_IDE_DEVICE_BASE 0x18000000
1362+#define CNS21XX_SDRAM_MEMORY_BASE 0x20000000
1363+#define CNS21XX_GDMAC_BASE 0x60000000
1364+#define CNS21XX_NIC_BASE 0x70000000
1365+#define CNS21XX_SPI_BASE 0x71000000
1366+#define CNS21XX_PCM_BASE 0x71000000
1367+#define CNS21XX_I2C_BASE 0x71000000
1368+#define CNS21XX_I2S_BASE 0x71000000
1369+#define CNS21XX_DDRC_BASE 0x72000000
1370+#define CNS21XX_SMC_BASE 0x73000000
1371+#define CNS21XX_PCMCIA_CTRL_BASE 0x73000000
1372+#define CNS21XX_IDE_CTRL_BASE 0x74000000
1373+#define CNS21XX_MISC_BASE 0x76000000
1374+#define CNS21XX_CPM_BASE 0x77000000
1375+#define CNS21XX_UART0_BASE 0x78000000
1376+#define CNS21XX_UART1_BASE 0x78800000
1377+#define CNS21XX_TIMER_BASE 0x79000000
1378+#define CNS21XX_WDT_BASE 0x7a000000
1379+#define CNS21XX_RTC_BASE 0x7b000000
1380+#define CNS21XX_GPIOA_BASE 0x7c000000
1381+#define CNS21XX_GPIOB_BASE 0x7c800000
1382+#define CNS21XX_PCI_CFGDATA_BASE 0xa0000000
1383+#define CNS21XX_PCI_CFGADDR_BASE 0xa4000000
1384+#define CNS21XX_PCI_IO_BASE 0xa8000000
1385+#define CNS21XX_PCI_MEMORY_BASE 0xb0000000
1386+#define CNS21XX_OHCI_CONFIG_BASE 0xc0000000
1387+#define CNS21XX_OHCI_CTRL_BASE 0xc4000000
1388+#define CNS21XX_EHCI_CONFIG_BASE 0xc8000000
1389+#define CNS21XX_EHCI_CTRL_BASE 0xcc000000
1390+#define CNS21XX_USB_DEVICE_BASE 0xd0000000
1391+#define CNS21XX_INTC_BASE 0xfffff000
1392+
1393+#define CNS21XX_FLASH_BANK0_BASE_VIRT 0xe0000000
1394+#define CNS21XX_FLASH_BANK1_BASE_VIRT 0xe2000000
1395+#define CNS21XX_FLASH_BANK2_BASE_VIRT 0xe4000000
1396+#define CNS21XX_FLASH_BANK3_BASE_VIRT 0xe8000000
1397+#define CNS21XX_IDE_DEVICE_BASE_VIRT 0xfef00000
1398+#define CNS21XX_GDMAC_BASE_VIRT 0xfef01000
1399+#define CNS21XX_NIC_BASE_VIRT 0xfef02000
1400+#define CNS21XX_SPI_BASE_VIRT 0xfef03000
1401+#define CNS21XX_PCM_BASE_VIRT 0xfef04000
1402+#define CNS21XX_I2C_BASE_VIRT 0xfef05000
1403+#define CNS21XX_I2S_BASE_VIRT 0xfef06000
1404+#define CNS21XX_DDRC_BASE_VIRT 0xfef07000
1405+#define CNS21XX_SMC_BASE_VIRT 0xfef08000
1406+#define CNS21XX_PCMCIA_CTRL_BASE_VIRT 0xfef09000
1407+#define CNS21XX_IDE_CTRL_BASE_VIRT 0xfef0A000
1408+#define CNS21XX_MISC_BASE_VIRT 0xfef0B000
1409+#define CNS21XX_CPM_BASE_VIRT 0xfef0C000
1410+#define CNS21XX_UART0_BASE_VIRT 0xfef0D000
1411+#define CNS21XX_UART1_BASE_VIRT 0xfef0E000
1412+#define CNS21XX_TIMER_BASE_VIRT 0xfef0F000
1413+#define CNS21XX_WDT_BASE_VIRT 0xfef10000
1414+#define CNS21XX_RTC_BASE_VIRT 0xfef11000
1415+#define CNS21XX_GPIOA_BASE_VIRT 0xfef12000
1416+#define CNS21XX_GPIOB_BASE_VIRT 0xfef13000
1417+#define CNS21XX_PCI_CFGDATA_BASE_VIRT 0xfef14000
1418+#define CNS21XX_PCI_CFGADDR_BASE_VIRT 0xfef15000
1419+#define CNS21XX_OHCI_CONFIG_BASE_VIRT 0xfef16000
1420+#define CNS21XX_OHCI_CTRL_BASE_VIRT 0xfef17000
1421+#define CNS21XX_EHCI_CONFIG_BASE_VIRT 0xfef18000
1422+#define CNS21XX_EHCI_CTRL_BASE_VIRT 0xfef19000
1423+#define CNS21XX_USB_DEVICE_BASE_VIRT 0xfef1a000
1424+#define CNS21XX_INTC_BASE_VIRT 0xfef1b000
1425+
1426+#define CNS21XX_PHYS_IO CNS21XX_UART0_BASE
1427+#define CNS21XX_IO_PAGE_OFFSET ((CNS21XX_UART0_BASE_VIRT) >> 18) & 0xfffc
1428+
1429+#endif /* _CNS21XX_H */
1430--- /dev/null
1431+++ b/arch/arm/mach-cns21xx/core.c
1432@@ -0,0 +1,85 @@
1433+/*
1434+ * Copyright (c) 2008 Cavium Networks
1435+ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
1436+ *
1437+ * This file is free software; you can redistribute it and/or modify
1438+ * it under the terms of the GNU General Public License, Version 2, as
1439+ * published by the Free Software Foundation.
1440+ */
1441+
1442+#include <linux/kernel.h>
1443+
1444+#include <mach/hardware.h>
1445+#include <mach/cns21xx.h>
1446+#include <mach/cns21xx_powermgmt.h>
1447+
1448+static unsigned long cns21xx_pll_freq;
1449+static unsigned long cns21xx_cpu_freq;
1450+static unsigned long cns21xx_ahb_freq;
1451+static unsigned long cns21xx_apb_freq;
1452+
1453+static void cns21xx_init_freq(void)
1454+{
1455+ static int freq_init_done;
1456+ unsigned int t;
1457+
1458+ if (freq_init_done)
1459+ return;
1460+
1461+ t = PWRMGT_SYSTEM_CLOCK_CONTROL_REG;
1462+ switch (t & 0x3) {
1463+ case 0x00:
1464+ cns21xx_pll_freq = 175000000;
1465+ break;
1466+
1467+ case 0x01:
1468+ cns21xx_pll_freq = 200000000;
1469+ break;
1470+
1471+ case 0x02:
1472+ cns21xx_pll_freq = 225000000;
1473+ break;
1474+
1475+ case 0x03:
1476+ cns21xx_pll_freq = 250000000;
1477+ break;
1478+ }
1479+
1480+ cns21xx_cpu_freq = cns21xx_pll_freq / (((t >> 2) & 0x3) + 1);
1481+ cns21xx_ahb_freq = cns21xx_cpu_freq / (((t >> 4) & 0x3) + 1);
1482+ cns21xx_apb_freq = cns21xx_ahb_freq / (((t >> 8) & 0x3) + 1);
1483+
1484+ freq_init_done = 1;
1485+}
1486+
1487+unsigned long cns21xx_get_pll_freq(void)
1488+{
1489+ cns21xx_init_freq();
1490+ return cns21xx_pll_freq;
1491+}
1492+
1493+unsigned long cns21xx_get_cpu_freq(void)
1494+{
1495+ cns21xx_init_freq();
1496+ return cns21xx_cpu_freq;
1497+}
1498+
1499+unsigned long cns21xx_get_ahb_freq(void)
1500+{
1501+ cns21xx_init_freq();
1502+ return cns21xx_ahb_freq;
1503+}
1504+
1505+unsigned long cns21xx_get_apb_freq(void)
1506+{
1507+ cns21xx_init_freq();
1508+ return cns21xx_apb_freq;
1509+}
1510+
1511+void cns21xx_restart(char mode, const char *cmd)
1512+{
1513+ PWRMGT_SOFTWARE_RESET_CONTROL_REG |=
1514+ (1UL << PWRMGT_GLOBAL_SOFTWARE_RESET_MASK_BIT_INDEX);
1515+ PWRMGT_SOFTWARE_RESET_CONTROL_REG &=
1516+ ~(1UL << PWRMGT_GLOBAL_SOFTWARE_RESET_MASK_BIT_INDEX);
1517+}
1518--- a/arch/arm/mm/Kconfig
1519+++ b/arch/arm/mm/Kconfig
1520@@ -890,6 +890,7 @@ config ARM_L1_CACHE_SHIFT_6
1521 config ARM_L1_CACHE_SHIFT
1522     int
1523     default 6 if ARM_L1_CACHE_SHIFT_6
1524+ default 4 if ARM_L1_CACHE_SHIFT_4
1525     default 5
1526 
1527 config ARM_DMA_MEM_BUFFERABLE
1528--- a/arch/arm/mm/cache-fa.S
1529+++ b/arch/arm/mm/cache-fa.S
1530@@ -28,7 +28,7 @@
1531 /*
1532  * The total size of the data cache.
1533  */
1534-#ifdef CONFIG_ARCH_GEMINI
1535+#if (defined(CONFIG_ARCH_GEMINI) || defined(CONFIG_ARCH_CNS21XX))
1536 #define CACHE_DSIZE 8192
1537 #else
1538 #define CACHE_DSIZE 16384
1539--- /dev/null
1540+++ b/arch/arm/mach-cns21xx/include/mach/cns21xx_misc.h
1541@@ -0,0 +1,507 @@
1542+/*******************************************************************************
1543+ *
1544+ * Copyright (c) 2008 Cavium Networks
1545+ *
1546+ * This file is free software; you can redistribute it and/or modify
1547+ * it under the terms of the GNU General Public License, Version 2, as
1548+ * published by the Free Software Foundation.
1549+ *
1550+ * This file is distributed in the hope that it will be useful,
1551+ * but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
1552+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
1553+ * NONINFRINGEMENT. See the GNU General Public License for more details.
1554+ *
1555+ * You should have received a copy of the GNU General Public License
1556+ * along with this file; if not, write to the Free Software
1557+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or
1558+ * visit http://www.gnu.org/licenses/.
1559+ *
1560+ * This file may also be available under a different license from Cavium.
1561+ * Contact Cavium Networks for more information
1562+ *
1563+ ******************************************************************************/
1564+
1565+#ifndef _STAR_MISC_H_
1566+#define _STAR_MISC_H_
1567+
1568+#include <mach/cns21xx.h>
1569+
1570+#define MISC_MEM_MAP_VALUE(reg_offset) \
1571+ (*((u32 volatile *)(CNS21XX_MISC_BASE_VIRT + reg_offset)))
1572+
1573+/*
1574+ * define access macros
1575+ */
1576+#define MISC_MEMORY_REMAP_REG MISC_MEM_MAP_VALUE(0x00)
1577+#define MISC_CHIP_CONFIG_REG MISC_MEM_MAP_VALUE(0x04)
1578+#define MISC_DEBUG_PROBE_DATA_REG MISC_MEM_MAP_VALUE(0x08)
1579+#define MISC_DEBUG_PROBE_SELECTION_REG MISC_MEM_MAP_VALUE(0x0C)
1580+#define MISC_PCI_CONTROL_BROKEN_MASK_REG MISC_MEM_MAP_VALUE(0x10)
1581+#define MISC_PCI_BROKEN_STATUS_REG MISC_MEM_MAP_VALUE(0x14)
1582+#define MISC_PCI_DEVICE_VENDOR_ID_REG MISC_MEM_MAP_VALUE(0x18)
1583+#define MISC_USB_HOST_PHY_CONTROL_TEST_REG MISC_MEM_MAP_VALUE(0x1C)
1584+#define MISC_GPIOA_PIN_ENABLE_REG MISC_MEM_MAP_VALUE(0x20)
1585+#define MISC_GPIOB_PIN_ENABLE_REG MISC_MEM_MAP_VALUE(0x24)
1586+#define MISC_GPIOA_RESISTOR_CONFIG_REG MISC_MEM_MAP_VALUE(0x28)
1587+#define MISC_GPIOA_DRIVE_STRENGTH_CONFIG_REG MISC_MEM_MAP_VALUE(0x2C)
1588+#define MISC_FAST_ETHERNET_PHY_CONFIG_REG MISC_MEM_MAP_VALUE(0x30)
1589+#define MISC_SOFTWARE_TEST_1_REG MISC_MEM_MAP_VALUE(0x38)
1590+#define MISC_SOFTWARE_TEST_2_REG MISC_MEM_MAP_VALUE(0x3C)
1591+
1592+#define MISC_E_FUSE_0_REG MISC_MEM_MAP_VALUE(0x60)
1593+#define MISC_E_FUSE_1_REG MISC_MEM_MAP_VALUE(0x64)
1594+
1595+
1596+/*
1597+ * define constants macros
1598+ */
1599+#define MISC_PARALLEL_FLASH_BOOT 0
1600+#define MISC_SPI_SERIAL_FLASH_BOOT 1
1601+
1602+#define MISC_LITTLE_ENDIAN 0
1603+#define MISC_BIG_ENDIAN 1
1604+
1605+#define MISC_FARADAY_ICE 0
1606+#define MISC_ARM_ICE 1
1607+
1608+#define MISC_EXT_INT29_PINS ((0x1 << 0))
1609+#define MISC_EXT_INT30_PINS ((0x1 << 1))
1610+#define MISC_EXT_INT31_PINS ((0x1 << 2))
1611+#define MISC_I2C_PINS ((0x1 << 13) | (0x1 << 14))
1612+#define MISC_I2S_PINS ((0x1 << 15) | (0x1 << 16) | (0x1 << 17))
1613+#define MISC_I2SSD_PINS (1 << 15)
1614+#define MISC_I2SWS_PINS (1 << 16)
1615+#define MISC_I2SCLK_PINS (1 << 17)
1616+#define MISC_PCM_PINS ((0x1 << 18) | (0x1 << 19) | (0x1 << 20) | (0x1 << 21))
1617+#define MISC_PCMDR_PINS (1 << 18)
1618+#define MISC_PCMDT_PINS (1 << 19)
1619+#define MISC_PCMFS_PINS (1 << 20)
1620+#define MISC_PCMCLK_PINS (1 << 21)
1621+#define MISC_LED0_PINS ((0x1 << 22))
1622+#define MISC_LED1_PINS ((0x1 << 23))
1623+#define MISC_LED2_PINS ((0x1 << 24))
1624+#define MISC_LED012_PINS ((0x1 << 22) | (0x1 << 23) | (0x1 << 24))
1625+#define MISC_WDTIMER_RESET_PINS ((0x1 << 25))
1626+#define MISC_SPIDR_PINS (0x1 << 26)
1627+#define MISC_SPICLK_PINS (0x1 << 27)
1628+#define MISC_SPICSN0_PINS (0x1 << 28)
1629+#define MISC_SPICSN1_PINS (0x1 << 29)
1630+#define MISC_SPICSN2_PINS (0x1 << 30)
1631+#define MISC_SPICSN3_PINS (0x1 << 31)
1632+#define MISC_SPI_PINS ((0x1 << 26) | (0x1 << 27) | (0x1 << 28) | (0x1 << 29) | (0x1 << 30) | (0x1 << 31))
1633+#define MISC_MDC_MDIO_PINS ((0x1 << 0) | (0x1 << 1))
1634+#define MISC_NIC_COL_PINS ((0x1 << 2))
1635+#define MISC_IDE_PINS ((0xFF << 3))
1636+#define MISC_SRAM_BANK1_PINS ((0x1 << 11) | (0x1 << 14))
1637+#define MISC_SRAM_BANK2_PINS ((0x1 << 12) | (0x1 << 15))
1638+#define MISC_SRAM_BANK3_PINS ((0x1 << 13) | (0x1 << 16))
1639+#define MISC_PCMCIA_PINS ((0x1 << 17) | (0x1 << 18) | (0x1 << 19) | (0x1 << 20))
1640+#define MISC_UART1_PINS ((0x1 << 21) | (0x1 << 22))
1641+#define MISC_PCI_PINS (((u32)0x1FF << 23))
1642+
1643+#define MISC_UART0_ACT0_Pin (0x1 << 2)
1644+#define MISC_UART1_ACT1_Pin (0x1 << 3)
1645+
1646+#define MISC_GPIOA_PIN_0 0
1647+#define MISC_GPIOA_PIN_1 1
1648+#define MISC_GPIOA_PIN_2 2
1649+#define MISC_GPIOA_PIN_3 3
1650+#define MISC_GPIOA_PIN_4 4
1651+#define MISC_GPIOA_PIN_5 5
1652+#define MISC_GPIOA_PIN_6 6
1653+#define MISC_GPIOA_PIN_7 7
1654+#define MISC_GPIOA_PIN_8 8
1655+#define MISC_GPIOA_PIN_9 9
1656+#define MISC_GPIOA_PIN_10 10
1657+
1658+#define MISC_GPIOA_75K_RESISTOR_PULL_DOWN 1
1659+#define MISC_GPIOA_75K_RESISTOR_PULL_UP 2
1660+#define MISC_GPIOA_75K_RESISTOR_PULL_KEEPER 3
1661+
1662+#define MISC_GPIOA_DRIVE_STRENGTH_4MA 0
1663+#define MISC_GPIOA_DRIVE_STRENGTH_8MA 1
1664+
1665+
1666+/*
1667+ * macro declarations
1668+ */
1669+#define HAL_MISC_ENABLE_SPI_SERIAL_FLASH_BANK_ACCESS() \
1670+{ \
1671+ (MISC_CHIP_CONFIG_REG) |= (0x1 << 4); \
1672+}
1673+
1674+#define HAL_MISC_DISABLE_SPI_SERIAL_FLASH_BANK_ACCESS() \
1675+{ \
1676+ (MISC_CHIP_CONFIG_REG) &= ~(0x1 << 4); \
1677+}
1678+
1679+
1680+/*
1681+ * Macro defines for GPIOA and GPIOB Pin Enable Register
1682+ */
1683+#define HAL_MISC_ENABLE_EXT_INT29_PINS() \
1684+{ \
1685+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_EXT_INT29_PINS); \
1686+}
1687+
1688+#define HAL_MISC_DISABLE_EXT_INT29_PINS() \
1689+{ \
1690+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_EXT_INT29_PINS); \
1691+}
1692+
1693+#define HAL_MISC_ENABLE_EXT_INT30_PINS() \
1694+{ \
1695+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_EXT_INT30_PINS); \
1696+}
1697+
1698+#define HAL_MISC_DISABLE_EXT_INT30_PINS() \
1699+{ \
1700+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_EXT_INT30_PINS); \
1701+}
1702+
1703+#define HAL_MISC_ENABLE_I2C_PINS() \
1704+{ \
1705+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_I2C_PINS); \
1706+}
1707+
1708+#define HAL_MISC_DISABLE_I2C_PINS() \
1709+{ \
1710+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_I2C_PINS); \
1711+}
1712+
1713+#define HAL_MISC_ENABLE_I2S_PINS() \
1714+{ \
1715+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_I2S_PINS); \
1716+}
1717+
1718+#define HAL_MISC_DISABLE_I2S_PINS() \
1719+{ \
1720+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_I2S_PINS); \
1721+}
1722+
1723+#define HAL_MISC_DISABLE_I2SSD_PINS() \
1724+{ \
1725+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_I2SSD_PINS); \
1726+}
1727+
1728+#define HAL_MISC_DISABLE_I2SWS_PINS() \
1729+{ \
1730+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_I2SWS_PINS); \
1731+}
1732+
1733+#define HAL_MISC_DISABLE_I2SCLK_PINS() \
1734+{ \
1735+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_I2SCLK_PINS); \
1736+}
1737+
1738+#define HAL_MISC_ENABLE_PCM_PINS() \
1739+{ \
1740+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_PCM_PINS); \
1741+}
1742+
1743+#define HAL_MISC_DISABLE_PCM_PINS() \
1744+{ \
1745+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_PCM_PINS); \
1746+}
1747+
1748+#define HAL_MISC_DISABLE_PCMDR_PINS() \
1749+{ \
1750+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_PCMDR_PINS); \
1751+}
1752+
1753+#define HAL_MISC_DISABLE_PCMDT_PINS() \
1754+{ \
1755+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_PCMDT_PINS); \
1756+}
1757+
1758+#define HAL_MISC_DISABLE_PCMFS_PINS() \
1759+{ \
1760+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_PCMFS_PINS); \
1761+}
1762+
1763+#define HAL_MISC_DISABLE_PCMCLK_PINS() \
1764+{ \
1765+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_PCMCLK_PINS); \
1766+}
1767+
1768+#define HAL_MISC_ENABLE_LED0_PINS() \
1769+{ \
1770+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_LED0_PINS); \
1771+}
1772+
1773+#define HAL_MISC_DISABLE_LED0_PINS() \
1774+{ \
1775+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_LED0_PINS); \
1776+}
1777+
1778+#define HAL_MISC_ENABLE_LED1_PINS() \
1779+{ \
1780+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_LED1_PINS); \
1781+}
1782+
1783+#define HAL_MISC_DISABLE_LED1_PINS() \
1784+{ \
1785+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_LED1_PINS); \
1786+}
1787+
1788+#define HAL_MISC_ENABLE_LED2_PINS() \
1789+{ \
1790+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_LED2_PINS); \
1791+}
1792+
1793+#define HAL_MISC_DISABLE_LED2_PINS() \
1794+{ \
1795+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_LED2_PINS); \
1796+}
1797+
1798+#define HAL_MISC_ENABLE_LED012_PINS() \
1799+{ \
1800+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_LED012_PINS); \
1801+}
1802+
1803+#define HAL_MISC_DISABLE_LED012_PINS() \
1804+{ \
1805+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_LED012_PINS); \
1806+}
1807+
1808+#define HAL_MISC_ENABLE_WDTIMER_RESET_PINS() \
1809+{ \
1810+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_WDTIMER_RESET_PINS); \
1811+}
1812+
1813+#define HAL_MISC_DISABLE_WDTIMER_RESET_PINS() \
1814+{ \
1815+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_WDTIMER_RESET_PINS); \
1816+}
1817+
1818+#define HAL_MISC_ENABLE_SPI_PINS() \
1819+{ \
1820+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPI_PINS); \
1821+}
1822+
1823+#define HAL_MISC_ENABLE_SPIDR_PINS() \
1824+{ \
1825+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPIDR_PINS); \
1826+}
1827+
1828+#define HAL_MISC_ENABLE_SPICLK_PINS() \
1829+{ \
1830+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICLK_PINS); \
1831+}
1832+
1833+#define HAL_MISC_ENABLE_SPICSN0_PINS() \
1834+{ \
1835+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICSN0_PINS); \
1836+}
1837+
1838+#define HAL_MISC_ENABLE_SPICSN0_PINS() \
1839+{ \
1840+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICSN0_PINS); \
1841+}
1842+
1843+#define HAL_MISC_ENABLE_SPICSN1_PINS() \
1844+{ \
1845+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICSN1_PINS); \
1846+}
1847+
1848+#define HAL_MISC_ENABLE_SPICSN2_PINS() \
1849+{ \
1850+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICSN2_PINS); \
1851+}
1852+
1853+#define HAL_MISC_ENABLE_SPICSN3_PINS() \
1854+{ \
1855+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICSN3_PINS); \
1856+}
1857+
1858+#define HAL_MISC_DISABLE_SPI_PINS() \
1859+{ \
1860+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPI_PINS); \
1861+}
1862+
1863+#define HAL_MISC_DISABLE_SPIDR_PINS() \
1864+{ \
1865+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPIDR_PINS); \
1866+}
1867+
1868+#define HAL_MISC_DISABLE_SPICLK_PINS() \
1869+{ \
1870+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPICLK_PINS); \
1871+}
1872+
1873+#define HAL_MISC_DISABLE_SPICSN0_PINS() \
1874+{ \
1875+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPICSN0_PINS); \
1876+}
1877+
1878+#define HAL_MISC_DISABLE_SPICSN1_PINS() \
1879+{ \
1880+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPICSN1_PINS); \
1881+}
1882+
1883+#define HAL_MISC_DISABLE_SPICSN2_PINS() \
1884+{ \
1885+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPICSN2_PINS); \
1886+}
1887+
1888+#define HAL_MISC_DISABLE_SPICSN3_PINS() \
1889+{ \
1890+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPICSN3_PINS); \
1891+}
1892+
1893+#define HAL_MISC_ENABLE_UART0_ACT0_PIN() \
1894+{ \
1895+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_UART0_ACT0_Pin); \
1896+}
1897+
1898+#define HAL_MISC_DISABLE_UART0_ACT0_PIN() \
1899+{ \
1900+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_UART0_ACT0_Pin); \
1901+}
1902+
1903+#define HAL_MISC_ENABLE_UART1_ACT1_PIN() \
1904+{ \
1905+ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_UART1_ACT1_Pin); \
1906+}
1907+
1908+#define HAL_MISC_DISABLE_UART1_ACT1_PIN() \
1909+{ \
1910+ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_UART1_ACT1_Pin); \
1911+}
1912+
1913+#define HAL_MISC_ENABLE_MDC_MDIO_PINS() \
1914+{ \
1915+ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_MDC_MDIO_PINS); \
1916+}
1917+
1918+#define HAL_MISC_DISABLE_MDC_MDIO_PINS() \
1919+{ \
1920+ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_MDC_MDIO_PINS); \
1921+}
1922+
1923+#define HAL_MISC_ENABLE_NIC_COL_PINS() \
1924+{ \
1925+ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_NIC_COL_PINS); \
1926+}
1927+
1928+#define HAL_MISC_DISABLE_NIC_COL_PINS() \
1929+{ \
1930+ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_NIC_COL_PINS); \
1931+}
1932+
1933+#define HAL_MISC_ENABLE_IDE_PINS() \
1934+{ \
1935+ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_IDE_PINS); \
1936+}
1937+
1938+#define HAL_MISC_DISABLE_IDE_PINS() \
1939+{ \
1940+ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_IDE_PINS); \
1941+}
1942+
1943+#define HAL_MISC_ENABLE_SRAM_BANK1_PINS() \
1944+{ \
1945+ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_SRAM_BANK1_PINS); \
1946+}
1947+
1948+#define HAL_MISC_DISABLE_SRAM_BANK1_PINS() \
1949+{ \
1950+ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_SRAM_BANK1_PINS); \
1951+}
1952+
1953+#define HAL_MISC_ENABLE_SRAM_BANK2_PINS() \
1954+{ \
1955+ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_SRAM_BANK2_PINS); \
1956+}
1957+
1958+#define HAL_MISC_DISABLE_SRAM_BANK2_PINS() \
1959+{ \
1960+ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_SRAM_BANK2_PINS); \
1961+}
1962+
1963+#define HAL_MISC_ENABLE_SRAM_BANK3_PINS() \
1964+{ \
1965+ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_SRAM_BANK3_PINS); \
1966+}
1967+
1968+#define HAL_MISC_DISABLE_SRAM_BANK3_PINS() \
1969+{ \
1970+ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_SRAM_BANK3_PINS); \
1971+}
1972+
1973+#define HAL_MISC_ENABLE_PCMCIA_PINS() \
1974+{ \
1975+ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_PCMCIA_PINS); \
1976+}
1977+
1978+#define HAL_MISC_DISABLE_PCMCIA_PINS() \
1979+{ \
1980+ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_PCMCIA_PINS); \
1981+}
1982+
1983+#define HAL_MISC_ENABLE_UART1_PINS() \
1984+{ \
1985+ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_UART1_PINS); \
1986+}
1987+
1988+#define HAL_MISC_DISABLE_UART1_PINS() \
1989+{ \
1990+ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_UART1_PINS); \
1991+}
1992+
1993+#define HAL_MISC_ENABLE_PCI_PINS() \
1994+{ \
1995+ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_PCI_PINS); \
1996+}
1997+
1998+#define HAL_MISC_DISABLE_PCI_PINS() \
1999+{ \
2000+ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_PCI_PINS); \
2001+}
2002+
2003+#define HAL_MISC_ENABLE_ALL_SHARED_GPIO_PINS() \
2004+{ \
2005+ (MISC_GPIOA_PIN_ENABLE_REG) = (0x0); \
2006+ (MISC_GPIOB_PIN_ENABLE_REG) = (0x0); \
2007+}
2008+
2009+#define HAL_MISC_DISABLE_ALL_SHARED_GPIO_PINS() \
2010+{ \
2011+ (MISC_GPIOA_PIN_ENABLE_REG) = (0xFFFFFFFF); \
2012+ (MISC_GPIOB_PIN_ENABLE_REG) = (0xFFFFFFFF); \
2013+}
2014+
2015+#define HAL_MISC_CONFIGURE_GPIOA_RESISTOR(pin_index, value) \
2016+{ \
2017+ (MISC_GPIOA_RESISTOR_CONFIG_REG) &= ~(0x3 << (2 * pin_index)); \
2018+ (MISC_GPIOA_RESISTOR_CONFIG_REG) |= ((value & 0x3) << (2 * pin_index)); \
2019+}
2020+
2021+#define HAL_MISC_CONFIGURE_GPIOA_DRIVE_STRENGTH(pin_index, value) \
2022+{ \
2023+ (MISC_GPIOA_DRIVE_STRENGTH_CONFIG_REG) &= ~(0x1 << pin_index); \
2024+ (MISC_GPIOA_DRIVE_STRENGTH_CONFIG_REG) |= (value << pin_index); \
2025+}
2026+
2027+#define HAL_MISC_SELECT_FAST_ETHERNET_PHY_LED_MODE0() \
2028+{ \
2029+ (MISC_FAST_ETHERNET_PHY_CONFIG_REG) = (0x0); \
2030+}
2031+
2032+#define HAL_MISC_SELECT_FAST_ETHERNET_PHY_LED_MODE1() \
2033+{ \
2034+ (MISC_FAST_ETHERNET_PHY_CONFIG_REG) = (0x1); \
2035+}
2036+
2037+#define HAL_MISC_SELECT_FAST_ETHERNET_PHY_LED_MODE2() \
2038+{ \
2039+ (MISC_FAST_ETHERNET_PHY_CONFIG_REG) = (0x2); \
2040+}
2041+
2042+#define HAL_MISC_SELECT_FAST_ETHERNET_PHY_LED_MODE3() \
2043+{ \
2044+ (MISC_FAST_ETHERNET_PHY_CONFIG_REG) = (0x3); \
2045+}
2046+
2047+
2048+#endif // end of #ifndef _STAR_MISC_H_
2049

Archive Download this file



interactive