add support for the Gateworks Laguna family (Cavium Networks Econa CNS3xxx)
[openwrt.git] / target / linux / cns3xxx / patches-2.6.31 / 100-cns3xxx_support.patch
1 --- a/arch/arm/common/gic.c
2 +++ b/arch/arm/common/gic.c
3 @@ -32,6 +32,8 @@
4  #include <asm/irq.h>
5  #include <asm/mach/irq.h>
6  #include <asm/hardware/gic.h>
7 +#include <linux/module.h>
8 +
9  
10  static DEFINE_SPINLOCK(irq_controller_lock);
11  
12 @@ -90,7 +92,7 @@ static void gic_ack_irq(unsigned int irq
13         spin_unlock(&irq_controller_lock);
14  }
15  
16 -static void gic_mask_irq(unsigned int irq)
17 +void gic_mask_irq(unsigned int irq)
18  {
19         u32 mask = 1 << (irq % 32);
20  
21 @@ -175,6 +177,109 @@ void __init gic_cascade_irq(unsigned int
22         set_irq_chained_handler(irq, gic_handle_cascade_irq);
23  }
24  
25 +
26 +// type: level or edge 
27 +// 0 - level high active, 1 - rising edge sensitive
28 +void set_interrupt_type_by_base(void __iomem *base, int id, u32 type)
29 +{
30 +        unsigned char int_type_bit=0;
31 +        u32 gic_v=0;
32 +
33 +        // judge gic offset
34 +        //printk("gic addr: %#x\n", id/16*4 + 0xc00);
35 +        //printk("gic addr bits: %#x\n", id%16*2);
36 +        int_type_bit=(id%16*2+1);
37 +        
38 +        gic_v = readl(base + GIC_DIST_CONFIG + id/16*4);
39 +
40 +        gic_v &= (~(1 << int_type_bit));
41 +        gic_v |= ( type << int_type_bit);
42 +
43 +        writel(gic_v, base + GIC_DIST_CONFIG + id/16*4);
44 +}
45 +
46 +// type: level or edge 
47 +// 0 - level high active, 1 - rising edge sensitive
48 +void set_interrupt_type(int id, u32 type)
49 +{
50 +       set_interrupt_type_by_base((void __iomem *) CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT, id, type);
51 +}
52 +
53 +void get_interrupt_type_by_base(void __iomem *base, u32 id, u32 *type)
54 +{
55 +        unsigned char int_type_bit=0;
56 +        u32 gic_v=0;
57 +
58 +        // judge gic offset
59 +        int_type_bit=(id%16*2+1);
60 +        
61 +        //gic_v = readl(base + GIC_DIST_CONFIG + 4);
62 +        gic_v = readl(base + GIC_DIST_CONFIG + id/16*4);
63 +
64 +        *type = ((gic_v >> int_type_bit) & 0x1);
65 +
66 +        //writel(0, base + GIC_DIST_CONFIG + id/16*4);
67 +}
68 +
69 +void get_interrupt_type(u32 id, u32 *type)
70 +{
71 +       get_interrupt_type_by_base((void __iomem *) CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT, id, type);
72 +}
73 +
74 +
75 +
76 +// set interrupt priority
77 +void set_interrupt_pri_by_base(void __iomem *base, u32 id, u32 pri)
78 +{
79 +        unsigned char int_type_bit=0;
80 +        u32 gic_v=0;
81 +
82 +
83 +        // judge gic offset
84 +        int_type_bit=(id%4*8+4);
85 +
86 +        gic_v = readl(base + GIC_DIST_PRI + id/4*4);
87 +
88 +        gic_v &= (~(0xf << int_type_bit));
89 +        gic_v |= (pri << int_type_bit);
90 +
91 +        writel(gic_v, base + GIC_DIST_PRI + id/4*4);
92 +
93 +        gic_v = 0;
94 +        gic_v = readl(base + GIC_DIST_PRI + id/4*4);
95 +       //printk("read gic_v: %x\n", gic_v);
96 +}
97 +
98 +void set_interrupt_pri(u32 id, u32 pri)
99 +{
100 +       set_interrupt_pri_by_base((void __iomem *) CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT, id, pri);
101 +}
102 +
103 +void get_interrupt_pri_by_base(void __iomem *base, int id, u32 *type)
104 +{
105 +        unsigned char int_type_bit=0;
106 +        u32 gic_v=0;
107 +
108 +        // judge gic offset
109 +        int_type_bit=(id%4*8+4);
110 +        
111 +        gic_v = readl(base + GIC_DIST_PRI + id/4*4);
112 +
113 +       //printk("int_type_bit: %d\n", int_type_bit);
114 +       //printk("gic_v: %#x\n", gic_v);
115 +        *type = ((gic_v >> int_type_bit) & 0xf);
116 +        //gic_v &= (~(1 << int_type_bit));
117 +        //gic_v |= ( type << int_type_bit);
118 +
119 +        //writel(0, base + GIC_DIST_CONFIG + id/16*4);
120 +}
121 +
122 +void get_interrupt_pri(int id, u32 *pri)
123 +{
124 +       get_interrupt_pri_by_base((void __iomem *) CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT, id, pri);
125 +}
126 +
127 +
128  void __init gic_dist_init(unsigned int gic_nr, void __iomem *base,
129                           unsigned int irq_start)
130  {
131 @@ -254,6 +359,12 @@ void __cpuinit gic_cpu_init(unsigned int
132         writel(1, base + GIC_CPU_CTRL);
133  }
134  
135 +void cns3xxx_write_pri_mask(u8 pri_mask)
136 +{
137 +        writel(pri_mask, (void __iomem *) CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT + GIC_CPU_PRIMASK);
138 +}
139 +
140 +
141  #ifdef CONFIG_SMP
142  void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
143  {
144 --- a/arch/arm/include/asm/cacheflush.h
145 +++ b/arch/arm/include/asm/cacheflush.h
146 @@ -280,6 +280,35 @@ extern void dmac_flush_range(const void 
147  
148  #endif
149  
150 +#ifdef CONFIG_CPU_NO_CACHE_BCAST
151 +enum smp_dma_cache_type {
152 +       SMP_DMA_CACHE_INV,
153 +       SMP_DMA_CACHE_CLEAN,
154 +       SMP_DMA_CACHE_FLUSH,
155 +};
156 +
157 +extern void smp_dma_cache_op(int type, const void *start, const void *end);
158 +
159 +static inline void smp_dma_inv_range(const void *start, const void *end)
160 +{
161 +       smp_dma_cache_op(SMP_DMA_CACHE_INV, start, end);
162 +}
163 +
164 +static inline void smp_dma_clean_range(const void *start, const void *end)
165 +{
166 +       smp_dma_cache_op(SMP_DMA_CACHE_CLEAN, start, end);
167 +}
168 +
169 +static inline void smp_dma_flush_range(const void *start, const void *end)
170 +{
171 +       smp_dma_cache_op(SMP_DMA_CACHE_FLUSH, start, end);
172 +}
173 +#else
174 +#define smp_dma_inv_range              dmac_inv_range
175 +#define smp_dma_clean_range            dmac_clean_range
176 +#define smp_dma_flush_range            dmac_flush_range
177 +#endif
178 +
179  #ifdef CONFIG_OUTER_CACHE
180  
181  extern struct outer_cache_fns outer_cache;
182 --- /dev/null
183 +++ b/arch/arm/include/asm/hardware/arm_twd.h
184 @@ -0,0 +1,21 @@
185 +#ifndef __ASM_HARDWARE_TWD_H
186 +#define __ASM_HARDWARE_TWD_H
187 +
188 +#define TWD_TIMER_LOAD                         0x00
189 +#define TWD_TIMER_COUNTER              0x04
190 +#define TWD_TIMER_CONTROL              0x08
191 +#define TWD_TIMER_INTSTAT              0x0C
192 +
193 +#define TWD_WDOG_LOAD                  0x20
194 +#define TWD_WDOG_COUNTER               0x24
195 +#define TWD_WDOG_CONTROL               0x28
196 +#define TWD_WDOG_INTSTAT               0x2C
197 +#define TWD_WDOG_RESETSTAT             0x30
198 +#define TWD_WDOG_DISABLE               0x34
199 +
200 +#define TWD_TIMER_CONTROL_ENABLE       (1 << 0)
201 +#define TWD_TIMER_CONTROL_ONESHOT      (0 << 1)
202 +#define TWD_TIMER_CONTROL_PERIODIC     (1 << 1)
203 +#define TWD_TIMER_CONTROL_IT_ENABLE    (1 << 2)
204 +
205 +#endif
206 --- /dev/null
207 +++ b/arch/arm/include/asm/hardware/cache-l2cc.h
208 @@ -0,0 +1,79 @@
209 +/*******************************************************************************
210 + *
211 + *  arch/arm/include/asm/hardware/cache-l2cc.h
212 + *
213 + *  Copyright (c) 2008 Cavium Networks 
214 + * 
215 + *  This file is free software; you can redistribute it and/or modify 
216 + *  it under the terms of the GNU General Public License, Version 2, as 
217 + *  published by the Free Software Foundation. 
218 + *
219 + *  This file is distributed in the hope that it will be useful, 
220 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
221 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
222 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
223 + *
224 + *  You should have received a copy of the GNU General Public License 
225 + *  along with this file; if not, write to the Free Software 
226 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
227 + *  visit http://www.gnu.org/licenses/. 
228 + *
229 + *  This file may also be available under a different license from Cavium. 
230 + *  Contact Cavium Networks for more information
231 + *
232 + ******************************************************************************/
233 +
234 +#ifndef __ASM_ARM_HARDWARE_L2_H
235 +#define __ASM_ARM_HARDWARE_L2_H
236 +
237 +#define L2CC_CACHE_ID                  0x000
238 +#define L2CC_CACHE_TYPE                        0x004
239 +#define L2CC_CTRL                      0x100
240 +#define L2CC_AUX_CTRL                  0x104
241 +#define L2CC_TAG_RAM_LATENCY_CTRL      0x108
242 +#define L2CC_DATA_RAM_LATENCY_CTRL     0x10C
243 +#define L2CC_EVENT_CNT_CTRL            0x200
244 +#define L2CC_EVENT_CNT1_CFG            0x204
245 +#define L2CC_EVENT_CNT0_CFG            0x208
246 +#define L2CC_EVENT_CNT1_VAL            0x20C
247 +#define L2CC_EVENT_CNT0_VAL            0x210
248 +#define L2CC_INTR_MASK                 0x214
249 +#define L2CC_MASKED_INTR_STAT          0x218
250 +#define L2CC_RAW_INTR_STAT             0x21C
251 +#define L2CC_INTR_CLEAR                        0x220
252 +#define L2CC_CACHE_SYNC                        0x730
253 +#define L2CC_INV_LINE_PA               0x770
254 +#define L2CC_INV_WAY                   0x77C
255 +#define L2CC_CLEAN_LINE_PA             0x7B0
256 +#define L2CC_CLEAN_LINE_IDX            0x7B8
257 +#define L2CC_CLEAN_WAY                 0x7BC
258 +#define L2CC_CLEAN_INV_LINE_PA         0x7F0
259 +#define L2CC_CLEAN_INV_LINE_IDX                0x7F8
260 +#define L2CC_CLEAN_INV_WAY             0x7FC
261 +#define L2CC_LOCKDOWN_0_WAY_D          0x900
262 +#define L2CC_LOCKDOWN_0_WAY_I          0x904
263 +#define L2CC_LOCKDOWN_1_WAY_D          0x908
264 +#define L2CC_LOCKDOWN_1_WAY_I          0x90C
265 +#define L2CC_LOCKDOWN_2_WAY_D          0x910
266 +#define L2CC_LOCKDOWN_2_WAY_I          0x914
267 +#define L2CC_LOCKDOWN_3_WAY_D          0x918
268 +#define L2CC_LOCKDOWN_3_WAY_I          0x91C
269 +#define L2CC_LOCKDOWN_4_WAY_D          0x920
270 +#define L2CC_LOCKDOWN_4_WAY_I          0x924
271 +#define L2CC_LOCKDOWN_5_WAY_D          0x928
272 +#define L2CC_LOCKDOWN_5_WAY_I          0x92C
273 +#define L2CC_LOCKDOWN_6_WAY_D          0x930
274 +#define L2CC_LOCKDOWN_6_WAY_I          0x934
275 +#define L2CC_LOCKDOWN_7_WAY_D          0x938
276 +#define L2CC_LOCKDOWN_7_WAY_I          0x93C
277 +#define L2CC_LOCKDOWN_LINE_EN          0x950
278 +#define L2CC_UNLOCK_ALL_LINE_WAY       0x954
279 +#define L2CC_ADDR_FILTER_START         0xC00
280 +#define L2CC_ADDR_FILTER_END           0xC04
281 +#define L2CC_DEBUG_CTRL                        0xF40
282 +
283 +#ifndef __ASSEMBLY__
284 +extern void __init l2cc_init(void __iomem *base);
285 +#endif
286 +
287 +#endif
288 --- a/arch/arm/include/asm/hardware/gic.h
289 +++ b/arch/arm/include/asm/hardware/gic.h
290 @@ -37,6 +37,13 @@ void gic_dist_init(unsigned int gic_nr, 
291  void gic_cpu_init(unsigned int gic_nr, void __iomem *base);
292  void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
293  void gic_raise_softirq(const struct cpumask *mask, unsigned int irq);
294 +
295 +void cns3xxx_write_pri_mask(u8 pri_mask);
296 +void set_interrupt_type(int id, u32 type);
297 +void get_interrupt_type(u32 id, u32 *type);
298 +void set_interrupt_pri(u32 id, u32 pri);
299 +void get_interrupt_pri(int id, u32 *pri);
300 +
301  #endif
302  
303  #endif
304 --- a/arch/arm/include/asm/mach/pci.h
305 +++ b/arch/arm/include/asm/mach/pci.h
306 @@ -20,6 +20,9 @@ struct hw_pci {
307         void            (*postinit)(void);
308         u8              (*swizzle)(struct pci_dev *dev, u8 *pin);
309         int             (*map_irq)(struct pci_dev *dev, u8 slot, u8 pin);
310 +#ifdef CONFIG_PCI_DOMAINS
311 +       int             nr_domains;
312 +#endif
313  };
314  
315  /*
316 @@ -37,8 +40,12 @@ struct pci_sys_data {
317                                         /* IRQ mapping                          */
318         int             (*map_irq)(struct pci_dev *, u8, u8);
319         struct hw_pci   *hw;
320 +#ifdef CONFIG_PCI_DOMAINS
321 +       int             domain;
322 +#endif
323  };
324  
325 +
326  /*
327   * This is the standard PCI-PCI bridge swizzling algorithm.
328   */
329 --- a/arch/arm/include/asm/pci.h
330 +++ b/arch/arm/include/asm/pci.h
331 @@ -25,6 +25,11 @@ static inline void pcibios_penalize_isa_
332         /* We don't do dynamic PCI IRQ allocation */
333  }
334  
335 +#ifdef CONFIG_PCI_DOMAINS 
336 +int pci_domain_nr(struct pci_bus *bus);
337 +int pci_proc_domain(struct pci_bus *bus);
338 +#endif
339 +
340  /*
341   * The PCI address space does equal the physical memory address space.
342   * The networking and block device layers use this boolean for bounce
343 --- a/arch/arm/include/asm/xor.h
344 +++ b/arch/arm/include/asm/xor.h
345 @@ -132,10 +132,43 @@ static struct xor_block_template xor_blo
346         .do_5   = xor_arm4regs_5,
347  };
348  
349 +#ifdef CONFIG_CNS3XXX_RAID
350 +extern void do_cns_rdma_xorgen(unsigned int src_no, unsigned int bytes,
351 +                              void **bh_ptr, void *dst_ptr);
352 +/*
353 + * We create these funcs/template just for benchmark reference.
354 + */
355 +static void xor_cns_raid_2(unsigned long bytes, unsigned long *p1,
356 +                          unsigned long *p2)
357 +{
358 +       void *src[2];
359 +
360 +       src[0] = p2;
361 +       src[1] = p1;
362 +       do_cns_rdma_xorgen(2, bytes, src, (void *)p2);
363 +}
364 +
365 +static struct xor_block_template xor_block_cnsraid = {
366 +       .name = "CNS-RAID",
367 +       .do_2 = xor_cns_raid_2,
368 +};
369 +#endif /* CONFIG_CNS3XXX_RAID */
370 +
371  #undef XOR_TRY_TEMPLATES
372 +
373 +#ifdef CONFIG_CNS3XXX_RAID
374 +#define XOR_TRY_TEMPLATES                      \
375 +       do {                                    \
376 +               xor_speed(&xor_block_arm4regs); \
377 +               xor_speed(&xor_block_8regs);    \
378 +               xor_speed(&xor_block_32regs);   \
379 +               xor_speed(&xor_block_cnsraid);  \
380 +       } while (0)
381 +#else
382  #define XOR_TRY_TEMPLATES                      \
383         do {                                    \
384                 xor_speed(&xor_block_arm4regs); \
385                 xor_speed(&xor_block_8regs);    \
386                 xor_speed(&xor_block_32regs);   \
387         } while (0)
388 +#endif /* CONFIG_CNS3XXX_RAID */
389 --- a/arch/arm/Kconfig
390 +++ b/arch/arm/Kconfig
391 @@ -193,7 +193,7 @@ menu "System Type"
392  
393  choice
394         prompt "ARM system type"
395 -       default ARCH_VERSATILE
396 +       default ARCH_CNS3XXX
397  
398  config ARCH_AAEC2000
399         bool "Agilent AAEC-2000 based"
400 @@ -235,6 +235,17 @@ config ARCH_VERSATILE
401         help
402           This enables support for ARM Ltd Versatile board.
403  
404 +config ARCH_CNS3XXX
405 +       bool "Cavium Networks CNS3XXX family"
406 +       select ARM_AMBA
407 +       select HAVE_CLK
408 +       select COMMON_CLKDEV
409 +       select GENERIC_TIME
410 +       select GENERIC_CLOCKEVENTS
411 +       select ARCH_REQUIRE_GPIOLIB
412 +       help
413 +         This enables support for Cavium Networks CNS3XXX boards.
414 +
415  config ARCH_AT91
416         bool "Atmel AT91"
417         select GENERIC_GPIO
418 @@ -715,6 +726,8 @@ source "arch/arm/mach-aaec2000/Kconfig"
419  
420  source "arch/arm/mach-realview/Kconfig"
421  
422 +source "arch/arm/mach-cns3xxx/Kconfig"
423 +
424  source "arch/arm/mach-at91/Kconfig"
425  
426  source "arch/arm/plat-mxc/Kconfig"
427 @@ -768,7 +781,7 @@ endif
428  
429  config ARM_ERRATA_411920
430         bool "ARM errata: Invalidation of the Instruction Cache operation can fail"
431 -       depends on CPU_V6 && !SMP
432 +       depends on CPU_V6 && !SMP && !ARCH_CNS3XXX
433         help
434           Invalidation of the Instruction Cache operation can
435           fail. This erratum is present in 1136 (before r1p4), 1156 and 1176.
436 @@ -849,13 +862,17 @@ config ISA_DMA_API
437         bool
438  
439  config PCI
440 -       bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_IXP4XX || ARCH_KS8695 || MACH_ARMCORE
441 +       bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_CNS3XXX || ARCH_IXP4XX || ARCH_KS8695 || MACH_ARMCORE
442         help
443           Find out whether you have a PCI motherboard. PCI is the name of a
444           bus system, i.e. the way the CPU talks to the other stuff inside
445           your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
446           VESA. If you have PCI, say Y, otherwise N.
447  
448 +config PCI_DOMAINS
449 +        def_bool y
450 +        depends on PCI && ARCH_CNS3XXX
451 +
452  config PCI_SYSCALL
453         def_bool PCI
454  
455 @@ -873,6 +890,8 @@ config PCI_HOST_ITE8152
456  
457  source "drivers/pci/Kconfig"
458  
459 +source "drivers/pci/pcie/Kconfig"
460 +
461  source "drivers/pcmcia/Kconfig"
462  
463  endmenu
464 @@ -884,10 +903,10 @@ source "kernel/time/Kconfig"
465  config SMP
466         bool "Symmetric Multi-Processing (EXPERIMENTAL)"
467         depends on EXPERIMENTAL && (REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP ||\
468 -                MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4)
469 +                MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_CNS3XXX || ARCH_OMAP4)
470         depends on GENERIC_CLOCKEVENTS
471         select USE_GENERIC_SMP_HELPERS
472 -       select HAVE_ARM_SCU if (ARCH_REALVIEW || ARCH_OMAP4)
473 +       select HAVE_ARM_SCU if (ARCH_REALVIEW || ARCH_CNS3XXX || ARCH_OMAP4)
474         help
475           This enables support for systems with more than one CPU. If you have
476           a system with only one CPU, like most personal computers, say N. If
477 @@ -944,7 +963,7 @@ config NR_CPUS
478         int "Maximum number of CPUs (2-32)"
479         range 2 32
480         depends on SMP
481 -       default "4"
482 +       default "2"
483  
484  config HOTPLUG_CPU
485         bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
486 @@ -955,10 +974,10 @@ config HOTPLUG_CPU
487  
488  config LOCAL_TIMERS
489         bool "Use local timer interrupts"
490 -       depends on SMP && (REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || \
491 +       depends on SMP && (REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || ARCH_CNS3XXX || \
492                 REALVIEW_EB_A9MP || MACH_REALVIEW_PBX || ARCH_OMAP4)
493         default y
494 -       select HAVE_ARM_TWD if (ARCH_REALVIEW || ARCH_OMAP4)
495 +       select HAVE_ARM_TWD if (ARCH_REALVIEW || ARCH_CNS3XXX || ARCH_OMAP4)
496         help
497           Enable support for local timers on SMP platforms, rather then the
498           legacy IPI broadcast method.  Local timers allows the system
499 --- a/arch/arm/kernel/bios32.c
500 +++ b/arch/arm/kernel/bios32.c
501 @@ -531,6 +531,7 @@ static void __init pcibios_init_hw(struc
502                 sys->busnr   = busnr;
503                 sys->swizzle = hw->swizzle;
504                 sys->map_irq = hw->map_irq;
505 +               sys->domain  = hw->nr_domains;
506                 sys->resource[0] = &ioport_resource;
507                 sys->resource[1] = &iomem_resource;
508  
509 @@ -694,3 +695,20 @@ int pci_mmap_page_range(struct pci_dev *
510  
511         return 0;
512  }
513 +#ifdef CONFIG_PCI_DOMAINS
514 +int pci_domain_nr(struct pci_bus *bus)
515 +{
516 +
517 +        //struct pci_sysdata *sd = bus->sysdata;
518 +        struct pci_sys_data *sd = bus->sysdata;
519 +        return sd->domain;
520 +
521 +}
522 +EXPORT_SYMBOL(pci_domain_nr);
523 +
524 +int pci_proc_domain(struct pci_bus *bus)
525 +{
526 +        return pci_domain_nr(bus);
527 +}
528 +EXPORT_SYMBOL(pci_proc_domain);
529 +#endif
530 --- a/arch/arm/kernel/entry-armv.S
531 +++ b/arch/arm/kernel/entry-armv.S
532 @@ -38,6 +38,12 @@
533         bne     asm_do_IRQ
534  
535  #ifdef CONFIG_SMP
536 +
537 +       test_for_cache_ipi r0, r6, r5, lr
538 +       movne r0, sp
539 +       adrne lr, 1b
540 +       bne do_cache_IPI
541 +
542         /*
543          * XXX
544          *
545 --- a/arch/arm/kernel/smp.c
546 +++ b/arch/arm/kernel/smp.c
547 @@ -58,12 +58,20 @@ static DEFINE_PER_CPU(struct ipi_data, i
548         .lock   = SPIN_LOCK_UNLOCKED,
549  };
550  
551 +#ifdef CONFIG_CPU_NO_CACHE_BCAST_DEBUG
552 +static DEFINE_PER_CPU(unsigned long,dma_cache_counter) = 0;
553 +unsigned long bcache_bitmap = 0;
554 +#endif
555 +
556  enum ipi_msg_type {
557         IPI_TIMER,
558         IPI_RESCHEDULE,
559         IPI_CALL_FUNC,
560         IPI_CALL_FUNC_SINGLE,
561         IPI_CPU_STOP,
562 +#ifdef CONFIG_CPU_NO_CACHE_BCAST
563 +       IPI_DMA_CACHE,
564 +#endif
565  };
566  
567  int __cpuinit __cpu_up(unsigned int cpu)
568 @@ -349,10 +357,17 @@ static void send_ipi_message(const struc
569          * Call the platform specific cross-CPU call function.
570          */
571         smp_cross_call(mask);
572 -
573         local_irq_restore(flags);
574  }
575  
576 +static void send_ipi_message_cache(const struct cpumask *mask)
577 +{
578 +       unsigned long flags;
579 +
580 +       local_irq_save(flags);
581 +       smp_cross_call_cache(mask);
582 +       local_irq_restore(flags);
583 +}
584  void arch_send_call_function_ipi_mask(const struct cpumask *mask)
585  {
586         send_ipi_message(mask, IPI_CALL_FUNC);
587 @@ -373,6 +388,13 @@ void show_ipi_list(struct seq_file *p)
588                 seq_printf(p, " %10lu", per_cpu(ipi_data, cpu).ipi_count);
589  
590         seq_putc(p, '\n');
591 +
592 +#ifdef CONFIG_CPU_NO_CACHE_BCAST_DEBUG
593 +       seq_puts(p, " dc: ");
594 +       for_each_present_cpu(cpu)
595 +               seq_printf(p, " %10lu", per_cpu(dma_cache_counter, cpu));
596 +       seq_putc(p, '\n');
597 +#endif
598  }
599  
600  void show_local_irqs(struct seq_file *p)
601 @@ -472,6 +494,10 @@ static void ipi_cpu_stop(unsigned int cp
602                 cpu_relax();
603  }
604  
605 +#ifdef CONFIG_CPU_NO_CACHE_BCAST
606 +static void ipi_dma_cache_op(unsigned int cpu);
607 +#endif
608 +
609  /*
610   * Main handler for inter-processor interrupts
611   *
612 @@ -531,6 +557,16 @@ asmlinkage void __exception do_IPI(struc
613                                 ipi_cpu_stop(cpu);
614                                 break;
615  
616 +#ifdef CONFIG_CPU_NO_CACHE_BCAST
617 +                       case IPI_DMA_CACHE:
618 +#ifdef CONFIG_CPU_NO_CACHE_BCAST_DEBUG
619 +                               //get_cpu_var(dma_cache_counter)++;
620 +                               //put_cpu_var(dma_cache_counter);
621 +#endif
622 +                               ipi_dma_cache_op(cpu);
623 +                               break;
624 +#endif
625 +
626                         default:
627                                 printk(KERN_CRIT "CPU%u: Unknown IPI message 0x%x\n",
628                                        cpu, nextmsg);
629 @@ -542,6 +578,19 @@ asmlinkage void __exception do_IPI(struc
630         set_irq_regs(old_regs);
631  }
632  
633 +asmlinkage void __exception do_cache_IPI(struct pt_regs *regs)
634 +{
635 +       unsigned int cpu = smp_processor_id();
636 +       struct ipi_data *ipi = &per_cpu(ipi_data, cpu);
637 +       struct pt_regs *old_regs = set_irq_regs(regs);
638 +
639 +       ipi->ipi_count++;
640 +
641 +       ipi_dma_cache_op(cpu);
642 +
643 +       set_irq_regs(old_regs);
644 +}
645 +
646  void smp_send_reschedule(int cpu)
647  {
648         send_ipi_message(cpumask_of(cpu), IPI_RESCHEDULE);
649 @@ -692,3 +741,115 @@ void flush_tlb_kernel_range(unsigned lon
650         } else
651                 local_flush_tlb_kernel_range(start, end);
652  }
653 +
654 +#ifdef CONFIG_CPU_NO_CACHE_BCAST
655 +/*
656 + * DMA cache maintenance operations on SMP if the automatic hardware
657 + * broadcasting is not available
658 + */
659 +struct smp_dma_cache_struct {
660 +       int type;
661 +       const void *start;
662 +       const void *end;
663 +       char unfinished;
664 +};
665 +
666 +static struct smp_dma_cache_struct smp_dma_cache_data[3];
667 +static DEFINE_SPINLOCK(smp_dma_cache_lock);
668 +
669 +static void local_dma_cache_op(int type, const void *start, const void *end)
670 +{
671 +       switch (type) {
672 +       case SMP_DMA_CACHE_INV:
673 +               dmac_inv_range(start, end);
674 +               break;
675 +       case SMP_DMA_CACHE_CLEAN:
676 +               dmac_clean_range(start, end);
677 +               break;
678 +       case SMP_DMA_CACHE_FLUSH:
679 +               dmac_flush_range(start, end);
680 +               break;
681 +       default:
682 +               printk(KERN_CRIT "CPU%u: Unknown SMP DMA cache type %d\n",
683 +                      smp_processor_id(), type);
684 +       }
685 +}
686 +
687 +/*
688 + * This function must be executed with interrupts disabled.
689 + */
690 +static void ipi_dma_cache_op(unsigned int cpu)
691 +{
692 +       unsigned long flags;
693 +       int type;
694 +       const void *start;
695 +       const void *end;
696 +
697 +       /* check for spurious IPI */
698 +       spin_lock_irqsave(&smp_dma_cache_lock, flags);
699 +       if (!test_bit(cpu, &bcache_bitmap))
700 +               goto out;
701 +
702 +       type = smp_dma_cache_data[cpu].type;
703 +       start = smp_dma_cache_data[cpu].start;
704 +       end = smp_dma_cache_data[cpu].end;
705 +       spin_unlock_irqrestore(&smp_dma_cache_lock, flags);
706 +
707 +
708 +       local_dma_cache_op(type, start, end);
709 +
710 +       spin_lock_irqsave(&smp_dma_cache_lock, flags);
711 +       clear_bit(cpu, &bcache_bitmap);
712 +       smp_dma_cache_data[cpu].type = 0;
713 +       smp_dma_cache_data[cpu].start = 0;
714 +       smp_dma_cache_data[cpu].end = 0;
715 +       smp_dma_cache_data[cpu].unfinished = 0;
716 +out:
717 +       spin_unlock_irqrestore(&smp_dma_cache_lock, flags);
718 +}
719 +
720 +/*
721 + * Execute the DMA cache operations on all online CPUs. This function
722 + * can be called with interrupts disabled or from interrupt context.
723 + */
724 +static void __smp_dma_cache_op(int type, const void *start, const void *end)
725 +{
726 +       cpumask_t callmap = cpu_online_map;
727 +       unsigned int cpu = get_cpu();
728 +       unsigned long flags;
729 +       unsigned long cpu_check;
730 +       cpu_clear(cpu, callmap);
731 +       cpu_check = *cpus_addr(callmap) >> 1;
732 +
733 +       while (test_bit(cpu, &bcache_bitmap))
734 +               ipi_dma_cache_op(cpu);
735 +
736 +       while (test_bit(cpu_check, &bcache_bitmap))
737 +               barrier();
738 +
739 +       spin_lock_irqsave(&smp_dma_cache_lock, flags);
740 +       smp_dma_cache_data[cpu_check].type = type;
741 +       smp_dma_cache_data[cpu_check].start = start;
742 +       smp_dma_cache_data[cpu_check].end = end;
743 +       smp_dma_cache_data[cpu_check].unfinished = 1;
744 +       set_bit(cpu_check, &bcache_bitmap);
745 +       send_ipi_message_cache(&callmap);
746 +       spin_unlock_irqrestore(&smp_dma_cache_lock, flags);
747 +
748 +       /* run the local operation in parallel with the other CPUs */
749 +       local_dma_cache_op(type, start, end);
750 +       put_cpu();
751 +}
752 +
753 +#define DMA_MAX_RANGE          SZ_4K
754 +
755 +/*
756 + * Split the cache range in smaller pieces if interrupts are enabled
757 + * to reduce the latency caused by disabling the interrupts during the
758 + * broadcast.
759 + */
760 +void smp_dma_cache_op(int type, const void *start, const void *end)
761 +{
762 +       __smp_dma_cache_op(type, start, end);
763 +}
764 +#endif
765 --- a/arch/arm/kernel/smp_twd.c
766 +++ b/arch/arm/kernel/smp_twd.c
767 @@ -41,7 +41,8 @@
768  /* set up by the platform code */
769  void __iomem *twd_base;
770  
771 -static unsigned long twd_timer_rate;
772 +unsigned long twd_timer_rate;
773 +EXPORT_SYMBOL(twd_timer_rate);
774  
775  static void twd_set_mode(enum clock_event_mode mode,
776                         struct clock_event_device *clk)
777 --- /dev/null
778 +++ b/arch/arm/mach-cns3xxx/core.c
779 @@ -0,0 +1,629 @@
780 +/*
781 + *  linux/arch/arm/mach-cns3xxx/cns3xxx.c
782 + *
783 + *  Copyright (c) 2008 Cavium Networks 
784 + *  Copyright (C) 1999 - 2003 ARM Limited
785 + *  Copyright (C) 2000 Deep Blue Solutions Ltd
786 + * 
787 + *  This file is free software; you can redistribute it and/or modify 
788 + *  it under the terms of the GNU General Public License, Version 2, as 
789 + *  published by the Free Software Foundation. 
790 + *
791 + *  This file is distributed in the hope that it will be useful, 
792 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
793 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
794 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
795 + *
796 + *  You should have received a copy of the GNU General Public License 
797 + *  along with this file; if not, write to the Free Software 
798 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
799 + *  visit http://www.gnu.org/licenses/. 
800 + *
801 + *  This file may also be available under a different license from Cavium. 
802 + *  Contact Cavium Networks for more information
803 + */
804 +
805 +#include <linux/init.h>
806 +#include <linux/platform_device.h>
807 +#include <linux/dma-mapping.h>
808 +#include <linux/sysdev.h>
809 +#include <linux/interrupt.h>
810 +#include <linux/amba/bus.h>
811 +#include <linux/delay.h>
812 +#include <linux/clocksource.h>
813 +#include <linux/clockchips.h>
814 +#include <linux/io.h>
815 +#include <linux/ata_platform.h>
816 +#include <linux/serial.h>
817 +#include <linux/tty.h>
818 +#include <linux/serial_8250.h>
819 +
820 +#include <asm/clkdev.h>
821 +#include <asm/system.h>
822 +#include <mach/hardware.h>
823 +#include <asm/irq.h>
824 +#include <asm/leds.h>
825 +#include <asm/mach-types.h>
826 +#include <asm/hardware/arm_timer.h>
827 +#include <asm/hardware/cache-l2cc.h>
828 +#include <asm/smp_twd.h>
829 +#include <asm/gpio.h>
830 +
831 +#include <asm/mach/arch.h>
832 +#include <asm/mach/flash.h>
833 +#include <asm/mach/irq.h>
834 +#include <asm/mach/map.h>
835 +#include <asm/mach/time.h>
836 +
837 +#include <asm/hardware/gic.h>
838 +
839 +#include <mach/platform.h>
840 +#include <mach/irqs.h>
841 +#include <mach/pm.h>
842 +#include <asm/dma.h>
843 +#include <mach/dmac.h>
844 +
845 +#include "core.h"
846 +#include "rdma.h"
847 +
848 +static struct map_desc cns3xxx_io_desc[] __initdata = {
849 +       {
850 +               .virtual        = CNS3XXX_TC11MP_TWD_BASE_VIRT,
851 +               .pfn            = __phys_to_pfn(CNS3XXX_TC11MP_TWD_BASE),
852 +               .length         = SZ_4K,
853 +               .type           = MT_DEVICE,
854 +       }, {
855 +               .virtual        = CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT,
856 +               .pfn            = __phys_to_pfn(CNS3XXX_TC11MP_GIC_CPU_BASE),
857 +               .length         = SZ_4K,
858 +               .type           = MT_DEVICE,
859 +       }, {
860 +               .virtual        = CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT,
861 +               .pfn            = __phys_to_pfn(CNS3XXX_TC11MP_GIC_DIST_BASE),
862 +               .length         = SZ_4K,
863 +               .type           = MT_DEVICE,
864 +       }, {
865 +               .virtual        = CNS3XXX_I2S_BASE_VIRT,
866 +               .pfn            = __phys_to_pfn(CNS3XXX_I2S_BASE),
867 +               .length         = SZ_4K,
868 +               .type           = MT_DEVICE,
869 +       }, {
870 +               .virtual        = CNS3XXX_TIMER1_2_3_BASE_VIRT,
871 +               .pfn            = __phys_to_pfn(CNS3XXX_TIMER1_2_3_BASE),
872 +               .length         = SZ_4K,
873 +               .type           = MT_DEVICE,
874 +       }, {
875 +               .virtual        = CNS3XXX_TC11MP_L220_BASE_VIRT,
876 +               .pfn            = __phys_to_pfn(CNS3XXX_TC11MP_L220_BASE),
877 +               .length         = SZ_8K,
878 +               .type           = MT_DEVICE,
879 +       }, {
880 +               .virtual        = CNS3XXX_SWITCH_BASE_VIRT,
881 +               .pfn            = __phys_to_pfn(CNS3XXX_SWITCH_BASE),
882 +               .length         = SZ_4K,
883 +               .type           = MT_DEVICE,
884 +       }, {
885 +               .virtual        = CNS3XXX_SSP_BASE_VIRT,
886 +               .pfn            = __phys_to_pfn(CNS3XXX_SSP_BASE),
887 +               .length         = SZ_4K,
888 +               .type           = MT_DEVICE,
889 +       }, {
890 +               .virtual        = CNS3XXX_DMC_BASE_VIRT,
891 +               .pfn            = __phys_to_pfn(CNS3XXX_DMC_BASE),
892 +               .length         = SZ_4K,
893 +               .type           = MT_DEVICE,
894 +       }, {
895 +               .virtual        = CNS3XXX_SMC_BASE_VIRT,
896 +               .pfn            = __phys_to_pfn(CNS3XXX_SMC_BASE),
897 +               .length         = SZ_4K,
898 +               .type           = MT_DEVICE,
899 +       }, {
900 +               .virtual        = CNS3XXX_GPIOA_BASE_VIRT,
901 +               .pfn            = __phys_to_pfn(CNS3XXX_GPIOA_BASE),
902 +               .length         = SZ_4K,
903 +               .type           = MT_DEVICE,
904 +       }, {
905 +               .virtual        = CNS3XXX_GPIOB_BASE_VIRT,
906 +               .pfn            = __phys_to_pfn(CNS3XXX_GPIOB_BASE),
907 +               .length         = SZ_4K,
908 +               .type           = MT_DEVICE,
909 +       }, {
910 +               .virtual        = CNS3XXX_RTC_BASE_VIRT,
911 +               .pfn            = __phys_to_pfn(CNS3XXX_RTC_BASE),
912 +               .length         = SZ_4K,
913 +               .type           = MT_DEVICE,
914 +       }, {
915 +               .virtual        = CNS3XXX_MISC_BASE_VIRT,
916 +               .pfn            = __phys_to_pfn(CNS3XXX_MISC_BASE),
917 +               .length         = SZ_4K,
918 +               .type           = MT_DEVICE,
919 +       }, {
920 +               .virtual        = CNS3XXX_PM_BASE_VIRT,
921 +               .pfn            = __phys_to_pfn(CNS3XXX_PM_BASE),
922 +               .length         = SZ_4K,
923 +               .type           = MT_DEVICE,
924 +       }, {
925 +               .virtual        = CNS3XXX_UART0_BASE_VIRT,
926 +               .pfn            = __phys_to_pfn(CNS3XXX_UART0_BASE),
927 +               .length         = SZ_4K,
928 +               .type           = MT_DEVICE,
929 +       }, {
930 +               .virtual        = CNS3XXX_UART1_BASE_VIRT,
931 +               .pfn            = __phys_to_pfn(CNS3XXX_UART1_BASE),
932 +               .length         = SZ_4K,
933 +               .type           = MT_DEVICE,
934 +       }, {
935 +               .virtual        = CNS3XXX_UART2_BASE_VIRT,
936 +               .pfn            = __phys_to_pfn(CNS3XXX_UART2_BASE),
937 +               .length         = SZ_4K,
938 +               .type           = MT_DEVICE,
939 +       }, {
940 +               .virtual        = CNS3XXX_UART3_BASE_VIRT,
941 +               .pfn            = __phys_to_pfn(CNS3XXX_UART3_BASE),
942 +               .length         = SZ_4K,
943 +               .type           = MT_DEVICE,
944 +       }, {
945 +               .virtual        = CNS3XXX_DMAC_BASE_VIRT,
946 +               .pfn            = __phys_to_pfn(CNS3XXX_DMAC_BASE),
947 +               .length         = SZ_4K,
948 +               .type           = MT_DEVICE,
949 +       }, {
950 +               .virtual        = CNS3XXX_CRYPTO_BASE_VIRT,
951 +               .pfn            = __phys_to_pfn(CNS3XXX_CRYPTO_BASE),
952 +               .length         = SZ_4K,
953 +               .type           = MT_DEVICE,
954 +       }, {
955 +               .virtual        = CNS3XXX_HCIE_BASE_VIRT,
956 +               .pfn            = __phys_to_pfn(CNS3XXX_HCIE_BASE),
957 +               .length         = SZ_32K,
958 +               .type           = MT_DEVICE,
959 +       }, {
960 +               .virtual        = CNS3XXX_RAID_BASE_VIRT,
961 +               .pfn            = __phys_to_pfn(CNS3XXX_RAID_BASE),
962 +               .length         = SZ_4K,
963 +               .type           = MT_DEVICE,
964 +       }, {
965 +               .virtual        = CNS3XXX_AXI_IXC_BASE_VIRT,
966 +               .pfn            = __phys_to_pfn(CNS3XXX_AXI_IXC_BASE),
967 +               .length         = SZ_4K,
968 +               .type           = MT_DEVICE,
969 +       }, {
970 +               .virtual        = CNS3XXX_CLCD_BASE_VIRT,
971 +               .pfn            = __phys_to_pfn( CNS3XXX_CLCD_BASE),
972 +               .length         = SZ_4K,
973 +               .type           = MT_DEVICE,
974 +       }, {
975 +               .virtual        = CNS3XXX_USBOTG_BASE_VIRT,
976 +               .pfn            = __phys_to_pfn(CNS3XXX_USBOTG_BASE),
977 +               .length         = SZ_4K,
978 +               .type           = MT_DEVICE,
979 +       }, {
980 +               .virtual        = CNS3XXX_USB_BASE_VIRT,
981 +               .pfn            = __phys_to_pfn(CNS3XXX_USB_BASE),
982 +               .length         = SZ_4K,
983 +               .type           = MT_DEVICE,
984 +       }, {
985 +               .virtual        = CNS3XXX_SATA2_BASE_VIRT,
986 +               .pfn            = __phys_to_pfn(CNS3XXX_SATA2_BASE),
987 +               .length         = SZ_4K,
988 +               .type           = MT_DEVICE,
989 +       }, {
990 +               .virtual        = CNS3XXX_CAMERA_BASE_VIRT,
991 +               .pfn            = __phys_to_pfn(CNS3XXX_CAMERA_BASE),
992 +               .length         = SZ_4K,
993 +               .type           = MT_DEVICE,
994 +       }, {
995 +               .virtual        = CNS3XXX_I2S_TDM_BASE_VIRT,
996 +               .pfn            = __phys_to_pfn(CNS3XXX_I2S_TDM_BASE),
997 +               .length         = SZ_4K,
998 +               .type           = MT_DEVICE,
999 +       }, {
1000 +               .virtual        = CNS3XXX_2DG_BASE_VIRT,
1001 +               .pfn            = __phys_to_pfn(CNS3XXX_2DG_BASE),
1002 +               .length         = SZ_4K,
1003 +               .type           = MT_DEVICE,
1004 +       }, {
1005 +               .virtual        = CNS3XXX_USB_OHCI_BASE_VIRT,
1006 +               .pfn            = __phys_to_pfn(CNS3XXX_USB_OHCI_BASE),
1007 +               .length         = SZ_4K,
1008 +               .type           = MT_DEVICE,
1009 +       }, {
1010 +               .virtual        = CNS3XXX_PCIE0_MEM_BASE_VIRT,
1011 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE0_MEM_BASE),
1012 +               .length         = SZ_16M,               // 176MB
1013 +               .type           = MT_DEVICE,
1014 +       }, {
1015 +               .virtual        = CNS3XXX_PCIE0_HOST_BASE_VIRT,
1016 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE0_HOST_BASE),
1017 +               .length         = SZ_16M,
1018 +               .type           = MT_DEVICE,
1019 +       }, {
1020 +               .virtual        = CNS3XXX_PCIE0_CFG0_BASE_VIRT,
1021 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE0_CFG0_BASE),
1022 +               .length         = SZ_16M,
1023 +               .type           = MT_DEVICE,
1024 +       }, {
1025 +               .virtual        = CNS3XXX_PCIE0_CFG1_BASE_VIRT,
1026 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE0_CFG1_BASE),
1027 +               .length         = SZ_16M,
1028 +               .type           = MT_DEVICE,
1029 +       }, {
1030 +               .virtual        = CNS3XXX_PCIE0_MSG_BASE_VIRT,
1031 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE0_MSG_BASE),
1032 +               .length         = SZ_16M,
1033 +               .type           = MT_DEVICE,
1034 +       }, {
1035 +               .virtual        = CNS3XXX_PCIE0_IO_BASE_VIRT,
1036 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE0_IO_BASE),
1037 +               .length         = SZ_16M,
1038 +               .type           = MT_DEVICE,
1039 +       }, { 
1040 +               .virtual        = CNS3XXX_PCIE1_MEM_BASE_VIRT,
1041 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE1_MEM_BASE),
1042 +               .length         = SZ_16M,
1043 +               .type           = MT_DEVICE,
1044 +       }, {
1045 +               .virtual        = CNS3XXX_PCIE1_HOST_BASE_VIRT,
1046 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE1_HOST_BASE),
1047 +               .length         = SZ_16M,
1048 +               .type           = MT_DEVICE,
1049 +       }, {
1050 +               .virtual        = CNS3XXX_PCIE1_CFG0_BASE_VIRT,
1051 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE1_CFG0_BASE),
1052 +               .length         = SZ_16M,
1053 +               .type           = MT_DEVICE,
1054 +       }, {
1055 +               .virtual        = CNS3XXX_PCIE1_CFG1_BASE_VIRT,
1056 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE1_CFG1_BASE),
1057 +               .length         = SZ_16M,
1058 +               .type           = MT_DEVICE,
1059 +       }, {
1060 +               .virtual        = CNS3XXX_PCIE1_MSG_BASE_VIRT,
1061 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE1_MSG_BASE),
1062 +               .length         = SZ_4K,
1063 +               .type           = MT_DEVICE,
1064 +       }, {
1065 +               .virtual        = CNS3XXX_PCIE1_IO_BASE_VIRT,
1066 +               .pfn            = __phys_to_pfn(CNS3XXX_PCIE1_IO_BASE),
1067 +               .length         = SZ_16M,
1068 +               .type           = MT_DEVICE,
1069 +       }, {
1070 +               .virtual        = CNS3XXX_L2C_BASE_VIRT,
1071 +               .pfn            = __phys_to_pfn(CNS3XXX_L2C_BASE),
1072 +               .length         = SZ_4K,
1073 +               .type           = MT_DEVICE,
1074 +       }, {
1075 +               .virtual        = CNS3XXX_PPE_BASE_VIRT,
1076 +               .pfn            = __phys_to_pfn(CNS3XXX_PPE_BASE),
1077 +               .length         = SZ_4K,
1078 +               .type           = MT_DEVICE,
1079 +       }, {
1080 +               .virtual        = CNS3XXX_EMBEDDED_SRAM_BASE_VIRT,
1081 +               .pfn            = __phys_to_pfn(CNS3XXX_EMBEDDED_SRAM_BASE),
1082 +               .length         = SZ_8K,
1083 +               .type           = MT_DEVICE,
1084 +       },
1085 +};
1086 +
1087 +void __init cns3xxx_map_io(void)
1088 +{
1089 +       iotable_init(cns3xxx_io_desc, ARRAY_SIZE(cns3xxx_io_desc));
1090 +}
1091 +
1092 +/* used by entry-macro.S */
1093 +void __iomem *gic_cpu_base_addr;
1094 +
1095 +void __init cns3xxx_init_irq(void)
1096 +{
1097 +       /* ARM11 MPCore test chip GIC */
1098 +       gic_cpu_base_addr = (void __iomem *) CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT;
1099 +       gic_dist_init(0, (void __iomem *) CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT, 29);
1100 +       gic_cpu_init(0, gic_cpu_base_addr);
1101 +       set_interrupt_pri(1, 0);                // Set cache broadcast priority to the highest priority
1102 +}
1103 +
1104 +int gpio_to_irq(int gpio)
1105 +{
1106 +       if (gpio > 63)
1107 +               return -EINVAL;
1108 +               
1109 +       if (gpio < 32)
1110 +               return IRQ_CNS3XXX_GPIOA;
1111 +       else
1112 +               return IRQ_CNS3XXX_GPIOB;
1113 +}
1114 +
1115 +int irq2gpio(int irq)
1116 +{
1117 +       if (irq == IRQ_CNS3XXX_GPIOA)
1118 +               return 0;
1119 +       else if (irq == IRQ_CNS3XXX_GPIOB)
1120 +               return 32;
1121 +       else
1122 +               return -EINVAL;
1123 +}
1124 +
1125 +static inline void gpio_line_config(u8 line, u32 direction)
1126 +{
1127 +       u32 reg;
1128 +       if (direction) {
1129 +               if (line < 32) {
1130 +                       reg = __raw_readl(CNS3XXX_GPIOA_BASE_VIRT + CNS3XXX_GPIO_DIR);
1131 +                       reg |= (1 << line);
1132 +                       __raw_writel(reg, CNS3XXX_GPIOA_BASE_VIRT + CNS3XXX_GPIO_DIR);
1133 +               } else {
1134 +                       reg = __raw_readl(CNS3XXX_GPIOB_BASE_VIRT + CNS3XXX_GPIO_DIR);
1135 +                       reg |= (1 << (line - 32));
1136 +                       __raw_writel(reg, CNS3XXX_GPIOB_BASE_VIRT + CNS3XXX_GPIO_DIR);          
1137 +               }
1138 +       } else {
1139 +               if (line < 32) {
1140 +                       reg = __raw_readl(CNS3XXX_GPIOA_BASE_VIRT + CNS3XXX_GPIO_DIR);
1141 +                       reg &= ~(1 << line);
1142 +                       __raw_writel(reg, CNS3XXX_GPIOA_BASE_VIRT + CNS3XXX_GPIO_DIR);
1143 +               } else {
1144 +                       reg = __raw_readl(CNS3XXX_GPIOB_BASE_VIRT + CNS3XXX_GPIO_DIR);
1145 +                       reg &= ~(1 << (line - 32));
1146 +                       __raw_writel(reg, CNS3XXX_GPIOB_BASE_VIRT + CNS3XXX_GPIO_DIR);          
1147 +               }
1148 +       }
1149 +}
1150 +
1151 +static int cns3xxx_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
1152 +{
1153 +       gpio_line_config(gpio, CNS3XXX_GPIO_IN);
1154 +       return 0;
1155 +}
1156 +
1157 +static int cns3xxx_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, int level)
1158 +{
1159 +       gpio_line_set(gpio, level);
1160 +       gpio_line_config(gpio, CNS3XXX_GPIO_OUT);
1161 +       return 0;       
1162 +}
1163 +
1164 +static int cns3xxx_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
1165 +{
1166 +       return gpio_get_value(gpio);
1167 +}
1168 +
1169 +static void cns3xxx_gpio_set_value(struct gpio_chip *chip, unsigned gpio, int value)
1170 +{
1171 +       gpio_set_value(gpio, value);
1172 +}
1173 +
1174 +static struct gpio_chip cns3xxx_gpio_chip = {
1175 +       .label      = "CNS3XXX_GPIO_CHIP",
1176 +       .direction_input  = cns3xxx_gpio_direction_input,
1177 +       .direction_output = cns3xxx_gpio_direction_output,
1178 +       .get      = cns3xxx_gpio_get_value,
1179 +       .set      = cns3xxx_gpio_set_value,
1180 +       .base     = 0,
1181 +       .ngpio      = 64,
1182 +};
1183 +
1184 +/* Watchdog */
1185 +static struct resource cns3xxx_watchdog_resources[] = {
1186 +       {
1187 +               .start = CNS3XXX_TC11MP_TWD_BASE,
1188 +               .end   = CNS3XXX_TC11MP_TWD_BASE + SZ_4K - 1,
1189 +               .flags = IORESOURCE_MEM,
1190 +       },{
1191 +               .start = IRQ_LOCALWDOG,
1192 +               .end   = IRQ_LOCALWDOG,
1193 +               .flags = IORESOURCE_IRQ,
1194 +       }
1195 +};
1196 +
1197 +static struct platform_device cns3xxx_watchdog_device = {
1198 +       .name   = "cns3xxx-wdt",
1199 +       .id   = -1,
1200 +       .num_resources  = ARRAY_SIZE(cns3xxx_watchdog_resources),
1201 +       .resource = cns3xxx_watchdog_resources,
1202 +};
1203 +
1204 +static struct resource cns3xxx_gpio_resources[] = {
1205 +       {
1206 +               .name = "gpio",
1207 +               .start = 0xFFFFFFFF,
1208 +               .end = 0xFFFFFFFF,
1209 +               .flags = 0,
1210 +       },
1211 +};
1212 +
1213 +static struct platform_device cns3xxx_gpio = {
1214 +       .name = "GPIODEV",
1215 +       .id = -1,
1216 +       .num_resources = ARRAY_SIZE(cns3xxx_gpio_resources),
1217 +       .resource = cns3xxx_gpio_resources,
1218 +};
1219 +
1220 +void __init cns3xxx_sys_init(void)
1221 +{
1222 +       l2cc_init((void __iomem *) CNS3XXX_L2C_BASE_VIRT);
1223 +
1224 +       dmac_init();
1225 +       cns_rdma_init();
1226 +
1227 +       platform_device_register(&cns3xxx_gpio);
1228 +       platform_device_register(&cns3xxx_watchdog_device);
1229 +       gpiochip_add(&cns3xxx_gpio_chip);
1230 +}
1231 +
1232 +void __iomem *timer1_va_base;
1233 +
1234 +static void timer_set_mode(enum clock_event_mode mode,
1235 +                          struct clock_event_device *clk)
1236 +{
1237 +       unsigned long ctrl = readl(timer1_va_base + TIMER1_2_CONTROL_OFFSET); 
1238 +       int reload;
1239 +       int pclk = (cns3xxx_cpu_clock() >> 3);
1240 +
1241 +       switch(mode) {
1242 +       case CLOCK_EVT_MODE_PERIODIC:
1243 +               /* pclk is cpu clock/8 */
1244 +               reload=pclk*1000000/HZ;
1245 +               writel(reload, timer1_va_base + TIMER1_AUTO_RELOAD_OFFSET);
1246 +               ctrl |= (1 << 0) | (1 << 2) | (1 << 9);
1247 +               break;
1248 +       case CLOCK_EVT_MODE_ONESHOT:
1249 +               /* period set, and timer enabled in 'next_event' hook */
1250 +               writel(0, timer1_va_base + TIMER1_AUTO_RELOAD_OFFSET);
1251 +               ctrl |= (1 << 2) | (1 << 9);
1252 +               break;
1253 +       case CLOCK_EVT_MODE_UNUSED:
1254 +       case CLOCK_EVT_MODE_SHUTDOWN:
1255 +       default:
1256 +               ctrl = 0;
1257 +       }
1258 +
1259 +       writel(ctrl, timer1_va_base + TIMER1_2_CONTROL_OFFSET);
1260 +}
1261 +
1262 +static int timer_set_next_event(unsigned long evt,
1263 +                               struct clock_event_device *unused)
1264 +{
1265 +       unsigned long ctrl = readl(timer1_va_base + TIMER1_2_CONTROL_OFFSET); 
1266 +
1267 +       writel(evt, timer1_va_base + TIMER1_COUNTER_OFFSET);
1268 +       writel(ctrl | (1 << 0), timer1_va_base + TIMER1_2_CONTROL_OFFSET);
1269 +
1270 +       return 0;
1271 +}
1272 +
1273 +static struct clock_event_device timer1_clockevent =    {
1274 +       .name           = "timer1",
1275 +       .shift          = 32,
1276 +       .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
1277 +       .set_mode       = timer_set_mode,
1278 +       .set_next_event = timer_set_next_event,
1279 +       .rating         = 300,
1280 +       .cpumask        = cpu_all_mask,
1281 +};
1282 +
1283 +static void __init cns3xxx_clockevents_init(unsigned int timer_irq)
1284 +{
1285 +       timer1_clockevent.irq = timer_irq;
1286 +       timer1_clockevent.mult =
1287 +               div_sc( (cns3xxx_cpu_clock() >> 3)*1000000, NSEC_PER_SEC, timer1_clockevent.shift);
1288 +       timer1_clockevent.max_delta_ns =
1289 +               clockevent_delta2ns(0xffffffff, &timer1_clockevent);
1290 +       timer1_clockevent.min_delta_ns =
1291 +               clockevent_delta2ns(0xf, &timer1_clockevent);
1292 +
1293 +       clockevents_register_device(&timer1_clockevent);
1294 +}
1295 +
1296 +/*
1297 + * IRQ handler for the timer
1298 + */
1299 +static irqreturn_t cns3xxx_timer_interrupt(int irq, void *dev_id)
1300 +{
1301 +       u32 val;
1302 +       struct clock_event_device *evt = &timer1_clockevent;
1303 +       
1304 +       /* Clear the interrupt */
1305 +       val = readl(timer1_va_base + TIMER1_2_INTERRUPT_STATUS_OFFSET);
1306 +       writel(val & ~(1 << 2), timer1_va_base + TIMER1_2_INTERRUPT_STATUS_OFFSET);
1307 +       
1308 +       evt->event_handler(evt);
1309 +
1310 +       return IRQ_HANDLED;
1311 +}
1312 +
1313 +static struct irqaction cns3xxx_timer_irq = {
1314 +       .name           = "timer",
1315 +       .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
1316 +       .handler        = cns3xxx_timer_interrupt,
1317 +};
1318 +
1319 +static cycle_t cns3xxx_get_cycles(struct clocksource *cs)
1320 +{
1321 +       u64 val;
1322 +
1323 +       val = readl(timer1_va_base + TIMER_FREERUN_CONTROL_OFFSET);
1324 +       val &= 0xffff;
1325 +
1326 +       return ((val << 32) | readl(timer1_va_base + TIMER_FREERUN_OFFSET));
1327 +}
1328 +
1329 +static struct clocksource clocksource_cns3xxx = {
1330 +       .name = "freerun",
1331 +       .rating = 200,
1332 +       .read = cns3xxx_get_cycles,
1333 +       .mask = CLOCKSOURCE_MASK(48),
1334 +       .shift  = 16,
1335 +       .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
1336 +};
1337 +            
1338 +
1339 +static void __init cns3xxx_clocksource_init(void)
1340 +{
1341 +       /* Reset the FreeRunning counter */
1342 +       writel((1 << 16), timer1_va_base + TIMER_FREERUN_CONTROL_OFFSET);
1343 +       
1344 +       clocksource_cns3xxx.mult =
1345 +               clocksource_khz2mult(100, clocksource_cns3xxx.shift);
1346 +       clocksource_register(&clocksource_cns3xxx);
1347 +}
1348 +
1349 +/*
1350 + * Set up the clock source and clock events devices
1351 + */
1352 +void __init __cns3xxx_timer_init(unsigned int timer_irq)
1353 +{
1354 +       unsigned long val, irq_mask; 
1355 +
1356 +       /*
1357 +        * Initialise to a known state (all timers off)
1358 +        */
1359 +       writel(0, timer1_va_base + TIMER1_2_CONTROL_OFFSET);            /* disable timer1 and timer2 */
1360 +       writel(0, timer1_va_base + TIMER_FREERUN_CONTROL_OFFSET);       /* stop free running timer3 */
1361 +       writel(0, timer1_va_base + TIMER1_MATCH_V1_OFFSET);
1362 +       writel(0, timer1_va_base + TIMER1_MATCH_V2_OFFSET);
1363 +
1364 +       val = (cns3xxx_cpu_clock() >> 3) * 1000000 / HZ;
1365 +       writel(val, timer1_va_base + TIMER1_COUNTER_OFFSET);
1366 +       
1367 +       /* mask irq, non-mask timer1 overflow */
1368 +       irq_mask = readl(timer1_va_base + TIMER1_2_INTERRUPT_MASK_OFFSET);
1369 +       irq_mask &= ~(1 << 2);
1370 +       irq_mask |= 0x03;
1371 +       writel(irq_mask, timer1_va_base + TIMER1_2_INTERRUPT_MASK_OFFSET);
1372 +       /* down counter */
1373 +       val = readl(timer1_va_base + TIMER1_2_CONTROL_OFFSET);
1374 +       val |= (1 << 9);
1375 +       writel(val, timer1_va_base + TIMER1_2_CONTROL_OFFSET);
1376 +
1377 +       /* 
1378 +        * Make irqs happen for the system timer
1379 +        */
1380 +       setup_irq(timer_irq, &cns3xxx_timer_irq);
1381 +
1382 +       cns3xxx_clocksource_init();
1383 +       cns3xxx_clockevents_init(timer_irq);
1384 +}
1385 +
1386 +void __init cns3xxx_timer_init(void)
1387 +{
1388 +       timer1_va_base = (void __iomem *) CNS3XXX_TIMER1_2_3_BASE_VIRT;
1389 +       twd_base = (void __iomem *) CNS3XXX_TC11MP_TWD_BASE_VIRT;
1390 +       __cns3xxx_timer_init(IRQ_CNS3XXX_TIMER0);
1391 +}
1392 +
1393 +struct sys_timer cns3xxx_timer = {
1394 +       .init           = cns3xxx_timer_init,
1395 +};
1396 +
1397 +
1398 +void cns3xxx_power_off(void)
1399 +{
1400 +       __u32 clkctrl;
1401 +
1402 +       printk(KERN_INFO "powering system down...\n");
1403 +
1404 +       clkctrl = readl(CNS3XXX_PM_BASE_VIRT + PM_SYS_CLK_CTRL_OFFSET);
1405 +       clkctrl &= 0xfffff1ff;
1406 +       clkctrl |= (0x5 << 9);          /* Hibernate */
1407 +       writel(clkctrl, CNS3XXX_PM_BASE_VIRT + PM_SYS_CLK_CTRL_OFFSET);
1408 +}
1409 --- /dev/null
1410 +++ b/arch/arm/mach-cns3xxx/core.h
1411 @@ -0,0 +1,34 @@
1412 +/*
1413 + *  linux/arch/arm/mach-cns3xxx/core.h
1414 + *
1415 + *  Copyright (c) 2008 Cavium Networks 
1416 + *  Copyright (C) 2004 ARM Limited
1417 + *  Copyright (C) 2000 Deep Blue Solutions Ltd
1418 + * 
1419 + *  This file is free software; you can redistribute it and/or modify 
1420 + *  it under the terms of the GNU General Public License, Version 2, as 
1421 + *  published by the Free Software Foundation. 
1422 + *
1423 + *  This file is distributed in the hope that it will be useful, 
1424 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
1425 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
1426 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
1427 + *
1428 + *  You should have received a copy of the GNU General Public License 
1429 + *  along with this file; if not, write to the Free Software 
1430 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
1431 + *  visit http://www.gnu.org/licenses/. 
1432 + *
1433 + *  This file may also be available under a different license from Cavium. 
1434 + *  Contact Cavium Networks for more information
1435 + */
1436 +
1437 +#ifndef __ASM_ARCH_CNS3XXX_H
1438 +#define __ASM_ARCH_CNS3XXX_H
1439 +
1440 +void __init cns3xxx_map_io(void);
1441 +void cns3xxx_power_off(void);
1442 +void __init cns3xxx_init_irq(void);
1443 +
1444 +extern struct sys_timer cns3xxx_timer;
1445 +#endif
1446 --- /dev/null
1447 +++ b/arch/arm/mach-cns3xxx/dmac.c
1448 @@ -0,0 +1,1464 @@
1449 +/*******************************************************************************
1450 + *
1451 + *  Copyright (c) 2008 Cavium Networks 
1452 + * 
1453 + *  This file is free software; you can redistribute it and/or modify 
1454 + *  it under the terms of the GNU General Public License, Version 2, as 
1455 + *  published by the Free Software Foundation. 
1456 + *
1457 + *  This file is distributed in the hope that it will be useful, 
1458 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
1459 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
1460 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
1461 + *
1462 + *  You should have received a copy of the GNU General Public License 
1463 + *  along with this file; if not, write to the Free Software 
1464 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
1465 + *  visit http://www.gnu.org/licenses/. 
1466 + *
1467 + *  This file may also be available under a different license from Cavium. 
1468 + *  Contact Cavium Networks for more information
1469 + *
1470 + ******************************************************************************/
1471 +
1472 +#include <linux/module.h>
1473 +#include <linux/kernel.h>
1474 +#include <linux/types.h>
1475 +#include <linux/string.h>
1476 +#include <linux/mm.h>
1477 +#include <linux/spinlock.h>
1478 +#include <linux/interrupt.h>
1479 +#include <linux/irq.h>
1480 +#include <linux/dma-mapping.h>
1481 +#include <asm/memory.h>
1482 +#include <asm/dma.h>
1483 +#include <mach/hardware.h>
1484 +#include <mach/pm.h>
1485 +
1486 +
1487 +#include <mach/dmac.h>
1488 +
1489 +//#define DEBUG_GDMA
1490 +
1491 +#define DMAC_MEM_MAP_VALUE(reg_offset) (*((uint32_t volatile *)(CNS3XXX_DMAC_BASE_VIRT + reg_offset)))
1492 +
1493 +#define DMAC_INTEN             DMAC_MEM_MAP_VALUE(0x020)
1494 +#define DMAC_INTSTATUS         DMAC_MEM_MAP_VALUE(0x028)
1495 +#define DMAC_INTCLR            DMAC_MEM_MAP_VALUE(0x02C)
1496 +
1497 +/* DMAC Debug registers */
1498 +#define DMAC_DBGSTATUS         DMAC_MEM_MAP_VALUE(0xD00)       /* Debug Status Register */
1499 +#define DMAC_DBGCMD            DMAC_MEM_MAP_VALUE(0xD04)       /* Debug Command Register */
1500 +#define DMAC_DBGINST0          DMAC_MEM_MAP_VALUE(0xD08)       /* Debug Instrucion-0 Register */
1501 +#define DMAC_DBGINST1          DMAC_MEM_MAP_VALUE(0xD0C)       /* Debug Instrucion-1 Register */
1502 +
1503 +#define CHANNEL_AND_MANAGER    0x1ff
1504 +#define CHANNEL_ONLY           0xff
1505 +#define MANAGER_ONLY           0x100
1506 +
1507 +#define MAX_MICROCODE_SIZE     2048
1508 +
1509 +#if 0
1510 +#define ERROR_INTR             45
1511 +#define DMAC_IRQNO_BASE                46
1512 +#else
1513 +#define ERROR_INTR             68
1514 +#define DMAC_IRQNO_BASE                69
1515 +#endif
1516 +
1517 +#define MAX_INTR_EVENTS                32
1518 +
1519 +#define MIN_EVENT_NUM          8 //2
1520 +
1521 +/* Debug Status Register */
1522 +#define DMAC_DBG_BUSY_BIT              (1<<0)
1523 +#define DMAC_DBG_INSTR_0_SHIFT         16
1524 +#define DMAC_DBG_INSTR_2_SHIFT         0
1525 +#define DMAC_DBG_THREAD_BIT            (1<<0)
1526 +#define DMAC_DBG_CH_NUM_SHIFT          8
1527 +#define DMAC_DBG_CH_NUM_BIT_MASK       0x7
1528 +#define DMAC_CHMGR                     8
1529 +
1530 +spinlock_t dma_mgr_lock;
1531 +
1532 +typedef enum {
1533 +//      DMAC_INSTR_DMAADDH = 0, /* Add Halfword */ /*** No implement ***/
1534 +       DMAC_INSTR_DMAEND = 0,  /* End */
1535 +       DMAC_INSTR_DMAFLUSHP,   /* Flash and notify Peripheral */
1536 +       DMAC_INSTR_DMAGO,       /* Go */
1537 +       DMAC_INSTR_DMALD,       /* Load */
1538 +       DMAC_INSTR_DMALDP,      /* Load aPeripheral */
1539 +       DMAC_INSTR_DMALP,       /* Loop */
1540 +       DMAC_INSTR_DMALPEND,    /* Loop End */
1541 +//      DMAC_INSTR_DMALPFE,     /* Loop Forever */
1542 +       DMAC_INSTR_DMAKILL,     /* kill */
1543 +       DMAC_INSTR_DMAMOV,      /* Move */
1544 +       DMAC_INSTR_DMANOP,      /* No operation */
1545 +//      DMAC_INSTR_DMARMB,      /* Read Memory Barrier */
1546 +       DMAC_INSTR_DMASEV,      /* Send Event */
1547 +       DMAC_INSTR_DMAST,       /* Store */
1548 +       DMAC_INSTR_DMASTP,      /* Store and notify Peripheral */
1549 +       DMAC_INSTR_DMASTZ,      /* Store Zero */
1550 +       DMAC_INSTR_DMAWFE,      /* Wait For Event */
1551 +       DMAC_INSTR_DMAWFP,      /* Wait For Peripheral */
1552 +       DMAC_INSTR_DMAWMB       /* Wait For Barrier */
1553 +} dmac_instr_t;
1554 +
1555 +typedef struct {
1556 +       const char *enc_buf;
1557 +       int enc_buf_len;
1558 +       int chan_or_mgr;        /* 0xff for DMA manager and DMA channel, 
1559 +                                  0x7f for DMA channel, 
1560 +                                  0x80 for DMA manager */
1561 +} dmac_instr_encode_t;
1562 +
1563 +typedef struct {
1564 +       uint32_t sa:1;          /* source address  increment: 0 - FIXED / 1 - INCR */
1565 +       uint32_t ss:3;          /* source burst size in bytes: mapping value TBD with designer */
1566 +       uint32_t sb:4;          /* source burst length */
1567 +       uint32_t sp:3;          /* source protection */
1568 +       uint32_t sc:3;          /* source cache */
1569 +       uint32_t da:1;          /* destination address  increment: 0 - FIXED / 1 - INCR */
1570 +       uint32_t ds:3;          /* destination burst size in bytes: mapping value TBD with designer */
1571 +       uint32_t db:4;          /* destination burst length */
1572 +       uint32_t dp:3;          /* destination protection */
1573 +       uint32_t dc:3;          /* destination cache */
1574 +       uint32_t es:3;          /* endian swap size, in bits */
1575 +       uint32_t padding:1;
1576 +} dmac_ch_ctrl_t;
1577 +
1578 +typedef struct {
1579 +       union {
1580 +               dmac_ch_ctrl_t ccr;
1581 +               uint32_t val;
1582 +       } i;
1583 +} dmac_cmd_imm32_t;
1584 +
1585 +typedef struct {
1586 +       uint16_t bs:1;          /* burst/single bit */
1587 +       uint16_t x:1;           /* x bit */
1588 +       uint16_t ns:1;          /* not secure bit */
1589 +       uint16_t lc:1;          /* loop counter bit */
1590 +       uint16_t p:1;           /* p bit */
1591 +       uint16_t nf:1;          /* no-finite bit */
1592 +       uint16_t i:1;           /* invalid bit */
1593 +       uint16_t padding:9;
1594 +} dmac_cmd_bits_t;
1595 +
1596 +typedef struct {
1597 +       uint8_t periph;         /* peripheral ID */
1598 +       uint8_t cn;             /* Channel Number */
1599 +       uint8_t iter;           /* iteration count */
1600 +       uint8_t backwards_jump; /* backwards jump length */
1601 +       uint8_t rd;             /* destination register, <SAR=b000, CCR=b001, DAR=b010> */
1602 +       uint8_t event_num;      /* event number */
1603 +
1604 +       union {
1605 +               dmac_cmd_bits_t b;
1606 +               uint16_t val;
1607 +       } bits;
1608 +
1609 +       dmac_cmd_imm32_t imm32; /* immediate 32bit value */
1610 +} dmac_instr_param_t;
1611 +
1612 +typedef struct {
1613 +       int in_use;             /* Channel in use or not */
1614 +       int channel;            /* Channel number */
1615 +       int microcode_size;     /* Microcode size */
1616 +       uint8_t *microcode;     /* TODO */
1617 +       dma_addr_t microcode_dma;
1618 +       int (*intr_handler) (void *);
1619 +       void *handler_args;
1620 +       int notifications_used; /* 32 bits for every interrupt/event */
1621 +} dmac_channel_t;
1622 +
1623 +/* TODO: Not protected as of now */
1624 +dmac_channel_t *dmac_channels[MAX_DMA_CHANNELS];
1625 +
1626 +int dmac_events[MAX_INTR_EVENTS];
1627 +
1628 +static int dmac_create_instr(int chan, dmac_instr_t instr,
1629 +                            dmac_instr_param_t * param);
1630 +static int dmac_exec_ucode(int ucode_channel, int ch);
1631 +void pl330_dump_regs(void);
1632 +
1633 +/******************************************************************************
1634 + *
1635 + * Instruction:  DMAEND
1636 + * Description:
1637 + *   | 7 6 5 4 | 3 2 1 0 |
1638 + *     0 0 0 0   0 0 0 0
1639 + * Example:
1640 + *    DMAEND
1641 + *   00
1642 + ******************************************************************************/
1643 +const char dmac_code_DMAEND[] = { 0x00 };
1644 +
1645 +int DMAC_DMAEND(int ch_num)
1646 +{
1647 +       dmac_instr_param_t param;
1648 +       int instr_len;
1649 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1650 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMAEND, &param);
1651 +       if (instr_len < 0) {
1652 +               printk("dmac_create_instr failed \n");
1653 +               return -1;
1654 +       }
1655 +
1656 +       return 0;
1657 +}
1658 +
1659 +EXPORT_SYMBOL(DMAC_DMAEND);
1660 +
1661 +/******************************************************************************
1662 + *
1663 + * Instruction:  DMAFLUSHP
1664 + * Description:
1665 + *   | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
1666 + *     <periph[4:0]   >  0  0  0    0  0  1  1    0  1  0  1
1667 + * Example:
1668 + *    DMAFLUSHP P0
1669 + *   35 00
1670 + ******************************************************************************/
1671 +const char dmac_code_DMAFLUSHP[] = { 0x35, 0x00 };
1672 +
1673 +int DMAC_DMAFLUSHP(int ch_num, int periph)
1674 +{
1675 +       dmac_instr_param_t param;
1676 +       int instr_len;
1677 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1678 +       param.periph = periph;
1679 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMAFLUSHP, &param);
1680 +       if (instr_len < 0) {
1681 +               printk("dmac_create_instr failed \n");
1682 +               return -1;
1683 +       }
1684 +
1685 +       return 0;
1686 +}
1687 +
1688 +EXPORT_SYMBOL(DMAC_DMAFLUSHP);
1689 +
1690 +/******************************************************************************
1691 + *
1692 + * Instruction:  DMAGO
1693 + * Description:
1694 + *   | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
1695 + *      0  0  0  0    0 <cn[2:0]>   1  0  1  0    0  0 ns  0
1696 + *
1697 + *   | 47                                                 16 |
1698 + *        <                     imm[31:0]                     >
1699 + * Example:
1700 + *    DMAGO  C0, 0x40000000
1701 + *   A0 00 00 00 00 40
1702 + ******************************************************************************/
1703 +const char dmac_code_DMAGO[] = { 0xA0, 0x00, 0x00, 0x00, 0x00, 0x40 };
1704 +
1705 +int DMAC_DMAGO(int ch_num)
1706 +{
1707 +       dmac_instr_param_t param;
1708 +       int instr_len;
1709 +       dmac_channel_t *dma_ch = dmac_channels[ch_num];
1710 +       
1711 +       if(!dma_ch->in_use) {
1712 +               printk("DMAC_DMAGO an unused channel\n");
1713 +               return -1;
1714 +       }
1715 +       
1716 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1717 +       param.bits.b.ns = 1;
1718 +       param.cn = ch_num;
1719 +       param.imm32.i.val = dma_ch->microcode_dma;
1720 +#ifdef DEBUG_GDMA
1721 +       printk("%s:%d: microcode Physical Address *(%x)==[%x]\n", __FUNCTION__,
1722 +              __LINE__, param.imm32.i.val,
1723 +              *((uint32_t *) phys_to_virt(dma_ch->microcode_dma)));
1724 +#endif
1725 +       instr_len = dmac_create_instr(DMAC_CHMGR, DMAC_INSTR_DMAGO, &param);
1726 +       if (instr_len < 0) {
1727 +               printk("dmac_create_instr failed \n");
1728 +               return -1;
1729 +       }
1730 +
1731 +       dmac_exec_ucode(DMAC_CHMGR, DMAC_CHMGR);        // DMAC_CHMGR);
1732 +       if (dmac_channels[DMAC_CHMGR])
1733 +               dmac_channels[DMAC_CHMGR]->microcode_size = 0;
1734 +       else
1735 +               printk("BUG HERE !! DEBUG .. \n");
1736 +
1737 +       return 0;
1738 +}
1739 +
1740 +EXPORT_SYMBOL(DMAC_DMAGO);
1741 +
1742 +/******************************************************************************
1743 + *
1744 + * Instruction:  DMALD
1745 + * Description:
1746 + *   | 7 6 5 4 |  3  2  1 0 |
1747 + *     0 0 0 0    0  1 bs x
1748 + * Example:
1749 + *    DMALD
1750 + *   04
1751 + ******************************************************************************/
1752 +const char dmac_code_DMALD[] = { 0x04 };
1753 +
1754 +int DMAC_DMALD(int ch_num)
1755 +{
1756 +       dmac_instr_param_t param;
1757 +       int instr_len;
1758 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1759 +       /* param.bits.b.x = param.bits.b.bs = 0; */
1760 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMALD, &param);
1761 +       if (instr_len < 0) {
1762 +               printk("dmac_create_instr failed \n");
1763 +               return -1;
1764 +       }
1765 +
1766 +       return 0;
1767 +}
1768 +
1769 +EXPORT_SYMBOL(DMAC_DMALD);
1770 +
1771 +int DMAC_DMALDB(int ch_num)
1772 +{
1773 +       dmac_instr_param_t param;
1774 +       int instr_len;
1775 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1776 +       /* param.bits.b.x = param.bits.b.bs = 0; */
1777 +       param.bits.b.x = 1;
1778 +       param.bits.b.bs = 1;
1779 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMALD, &param);
1780 +       if (instr_len < 0) {
1781 +               printk("dmac_create_instr failed \n");
1782 +               return -1;
1783 +       }
1784 +
1785 +       return 0;
1786 +}
1787 +
1788 +EXPORT_SYMBOL(DMAC_DMALDB);
1789 +
1790 +int DMAC_DMALDS(int ch_num)
1791 +{
1792 +       dmac_instr_param_t param;
1793 +       int instr_len;
1794 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1795 +       /* param.bits.b.x = param.bits.b.bs = 0; */
1796 +       param.bits.b.x = 1;
1797 +       param.bits.b.bs = 0;
1798 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMALD, &param);
1799 +       if (instr_len < 0) {
1800 +               printk("dmac_create_instr failed \n");
1801 +               return -1;
1802 +       }
1803 +
1804 +       return 0;
1805 +}
1806 +
1807 +EXPORT_SYMBOL(DMAC_DMALDS);
1808 +
1809 +/******************************************************************************
1810 + *
1811 + * Instruction:  DMALP
1812 + * Description:
1813 + *   | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
1814 + *     <       iter[7:0]       >    0  0  1  0    0  0 lc  0
1815 + * Example:
1816 + *    DMALP 8
1817 + *   20 07
1818 + ******************************************************************************/
1819 +const char dmac_code_DMALP[] = { 0x20, 0x07 };
1820 +
1821 +int DMAC_DMALP(int ch_num, int loop_reg_idx, int iter)
1822 +{
1823 +       dmac_instr_param_t param;
1824 +       int instr_len;
1825 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1826 +       param.bits.b.lc = loop_reg_idx;
1827 +       param.iter = (uint8_t) (iter - 1);
1828 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMALP, &param);
1829 +       if (instr_len < 0) {
1830 +               printk("dmac_create_instr failed \n");
1831 +               return -1;
1832 +       }
1833 +       return 0;
1834 +}
1835 +
1836 +EXPORT_SYMBOL(DMAC_DMALP);
1837 +
1838 +/******************************************************************************
1839 + *
1840 + * Instruction:  DMALPEND
1841 + * Description:
1842 + *   | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
1843 + *     <  backwards_jump[7:0]  >    0  0  1 nf    1 lc bs  x
1844 + * Example:
1845 + *    DMALPEND
1846 + *   38 04
1847 + ******************************************************************************/
1848 +const char dmac_code_DMALPEND[] = { 0x38, 0x04 };
1849 +
1850 +int DMAC_DMALPEND(int ch_num, int loop_reg_idx, int jump, int lpfe)
1851 +{
1852 +       dmac_instr_param_t param;
1853 +       int instr_len;
1854 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1855 +       /* param.bits.b.x = param.bits.b.bs = 0; */
1856 +       param.bits.b.lc = loop_reg_idx;
1857 +       param.bits.b.nf = lpfe;
1858 +       param.backwards_jump = jump;
1859 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMALPEND, &param);
1860 +       if (instr_len < 0) {
1861 +               printk("dmac_create_instr failed \n");
1862 +               return -1;
1863 +       }
1864 +       return 0;
1865 +}
1866 +
1867 +EXPORT_SYMBOL(DMAC_DMALPEND);
1868 +
1869 +/******************************************************************************
1870 + *
1871 + * Instruction:  DMAMOV
1872 + * Description:
1873 + *   | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
1874 + *      0  0  0  0    0 <rd[2:0]>   1  0  1  1    1  1  0  0
1875 + *
1876 + *   | 47                                                 16 |
1877 + *        <                     imm[31:0]                     >
1878 + *
1879 + *      # CCR Description
1880 + *      # [30:28]  Endian swap size
1881 + *      # [27:25]  AWCACHE[3,1:0] value
1882 + *      # [24:22]  AWPROT value
1883 + *      # [21:18]  AWLEN value
1884 + *      # [17:15]  AWSIZE value
1885 + *      # [14]     AWBURST[0] value
1886 + *                 0 - FIXED / 1 - INCR
1887 + *      # [13:11]  ARCACHE[2:0] value
1888 + *      # [10:8]   ARPROT value
1889 + *      # [7:4]    ARLEN value
1890 + *      # [3:1]    ARSIZE value
1891 + *      # [0]      ARBURST[0] value
1892 + *                 0 - FIXED / 1 - INCR
1893 + * Example:
1894 + *    DMAMOV   CCR, SB1 SS32 DB1 DS32
1895 + *   BC 01 05 40 01 00
1896 + ******************************************************************************/
1897 +const char dmac_code_DMAMOV[] = { 0xBC, 0x01, 0x05, 0x40, 0x01, 0x00 };
1898 +
1899 +/* ccr_sar_dar: 0 for SAR, 1, for CCR, 2 for DAR */
1900 +//typedef enum { SAR = 0, CCR = 1, DAR = 2} dmamov_arg_t;
1901 +int DMAC_DMAMOV(int ch_num, dmamov_arg_t ccr_sar_dar, uint32_t value)
1902 +{
1903 +       dmac_instr_param_t param;
1904 +       int instr_len;
1905 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1906 +       param.rd = ccr_sar_dar;
1907 +       param.imm32.i.val = value;
1908 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMAMOV, &param);
1909 +       if (instr_len < 0) {
1910 +               printk("dmac_create_instr failed \n");
1911 +               return -1;
1912 +       }
1913 +       return 0;
1914 +}
1915 +
1916 +EXPORT_SYMBOL(DMAC_DMAMOV);
1917 +
1918 +/******************************************************************************
1919 + *
1920 + * Instruction:  DMAST
1921 + * Description:
1922 + *   | 7 6 5 4 |  3  2  1 0 |
1923 + *     0 0 0 0    1  0 bs x
1924 + * Example:
1925 + *    DMAST
1926 + *   08
1927 + ******************************************************************************/
1928 +const char dmac_code_DMAST[] = { 0x08 };
1929 +
1930 +int DMAC_DMAST(int ch_num)
1931 +{
1932 +       dmac_instr_param_t param;
1933 +       int instr_len;
1934 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1935 +       /* param.bits.b.x = param.bits.b.bs = 0; */
1936 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMAST, &param);
1937 +       if (instr_len < 0) {
1938 +               printk("dmac_create_instr failed \n");
1939 +               return -1;
1940 +       }
1941 +
1942 +       return 0;
1943 +}
1944 +
1945 +EXPORT_SYMBOL(DMAC_DMAST);
1946 +
1947 +const char dmac_code_DMAWMB[] = { 0x13 };
1948 +
1949 +int DMAC_DMAWMB(int ch_num)
1950 +{
1951 +       dmac_instr_param_t param;
1952 +       int instr_len;
1953 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1954 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMAWMB, &param);
1955 +       if (instr_len < 0) {
1956 +               printk("dmac_create_instr failed\n");
1957 +               return -1;
1958 +       }
1959 +       return 0;
1960 +}
1961 +
1962 +EXPORT_SYMBOL(DMAC_DMAWMB);
1963 +
1964 +const char dmac_code_DMANOP[] = { 0x18 };
1965 +
1966 +int DMAC_DMANOP(int ch_num)
1967 +{
1968 +       dmac_instr_param_t param;
1969 +       int instr_len;
1970 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1971 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMANOP, &param);
1972 +       if (instr_len < 0) {
1973 +               printk("dmac_create_instr failed\n");
1974 +               return -1;
1975 +       }
1976 +       return 0;
1977 +}
1978 +
1979 +EXPORT_SYMBOL(DMAC_DMANOP);
1980 +
1981 +int DMAC_DMASTB(int ch_num)
1982 +{
1983 +       dmac_instr_param_t param;
1984 +       int instr_len;
1985 +       memset(&param, 0, sizeof(dmac_instr_param_t));
1986 +       param.bits.b.x = 1;
1987 +       param.bits.b.bs = 1;
1988 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMAST, &param);
1989 +       if (instr_len < 0) {
1990 +               printk("dmac_create_instr failed \n");
1991 +               return -1;
1992 +       }
1993 +
1994 +       return 0;
1995 +}
1996 +
1997 +EXPORT_SYMBOL(DMAC_DMASTB);
1998 +
1999 +int DMAC_DMASTS(int ch_num)
2000 +{
2001 +       dmac_instr_param_t param;
2002 +       int instr_len;
2003 +       memset(&param, 0, sizeof(dmac_instr_param_t));
2004 +       param.bits.b.x = 1;
2005 +       param.bits.b.bs = 0;
2006 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMAST, &param);
2007 +       if (instr_len < 0) {
2008 +               printk("dmac_create_instr failed \n");
2009 +               return -1;
2010 +       }
2011 +
2012 +       return 0;
2013 +}
2014 +
2015 +EXPORT_SYMBOL(DMAC_DMASTS);
2016 +
2017 +/******************************************************************************
2018 + *
2019 + * Instruction:  DMASTZ
2020 + * Description:
2021 + *   | 7 6 5 4 |  3  2  1 0 |
2022 + *     0 0 0 0    1  1  0 0
2023 + * Example:
2024 + *    DMASTZ
2025 + *   08
2026 + ******************************************************************************/
2027 +const char dmac_code_DMASTZ[] = { 0x0C };
2028 +
2029 +/******************************************************************************
2030 + *
2031 + * Instruction:  DMAWFE
2032 + * Description:
2033 + *   | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
2034 + *     <event_num[4:0]>  0  i  0    0  0  1  1    0  1  1  0
2035 + * Example:
2036 + *    DMAWFE E0
2037 + *   36 00
2038 + ******************************************************************************/
2039 +const char dmac_code_DMAWFE[] = { 0x36, 0x00 };
2040 +
2041 +int DMAC_WFE(int chan, int event_num)
2042 +{
2043 +       dmac_instr_param_t param;
2044 +       int instr_len;
2045 +       memset(&param, 0, sizeof(dmac_instr_param_t));
2046 +       /* param.bits.b.x = param.bits.b.bs = 0; */
2047 +//#warning "to set bits"
2048 +       param.event_num = event_num;
2049 +       instr_len = dmac_create_instr(chan, DMAC_INSTR_DMAWFE, &param);
2050 +       if (instr_len < 0) {
2051 +               printk("dmac_create_instr failed \n");
2052 +               return -1;
2053 +       }
2054 +
2055 +       return 0;
2056 +}
2057 +
2058 +EXPORT_SYMBOL(DMAC_WFE);
2059 +
2060 +/******************************************************************************
2061 + *
2062 + * Instruction:  DMAWFP
2063 + * Description:
2064 + *   | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
2065 + *     <  periph[4:0] >  0  0  0    0  0  1  1    0  0 bs  p
2066 + * Example:
2067 + *    DMAWFP P0, periph
2068 + *   31 00
2069 + ******************************************************************************/
2070 +const char dmac_code_DMAWFP[] = { 0x31, 0x00 };
2071 +
2072 +int DMAC_DMAWFP(int ch_num, int periph_id, dmawfp_burst_type s)
2073 +{
2074 +       dmac_instr_param_t param;
2075 +       int instr_len;
2076 +       memset(&param, 0, sizeof(dmac_instr_param_t));
2077 +       if (s == SINGLE) {
2078 +               param.bits.b.bs = 0;
2079 +               param.bits.b.p = 0;
2080 +       }
2081 +       if (s == BURST) {
2082 +               param.bits.b.bs = 1;
2083 +               param.bits.b.p = 0;
2084 +       }
2085 +       if (s == PERIPHERAL) {
2086 +               param.bits.b.bs = 0;
2087 +               param.bits.b.p = 1;
2088 +       }
2089 +       param.periph = periph_id;
2090 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMAWFP, &param);
2091 +       if (instr_len < 0) {
2092 +               printk("dmac_create_instr failed \n");
2093 +               return -1;
2094 +       }
2095 +
2096 +       return 0;
2097 +}
2098 +
2099 +EXPORT_SYMBOL(DMAC_DMAWFP);
2100 +
2101 +/******************************************************************************
2102 + *
2103 + * Instruction:  DMAKILL
2104 + * Description:
2105 + *   | 7 6 5 4 | 3 2 1 0 |
2106 + *     0 0 0 0   0 0 0 1
2107 + * Example:
2108 + *    DMAKILL
2109 + *   01
2110 + ******************************************************************************/
2111 +const char dmac_code_DMAKILL[] = { 0x01 };
2112 +
2113 +/******************************************************************************
2114 + *
2115 + * Instruction:  DMASEV
2116 + * Description:
2117 + *   | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
2118 + *     <event_num[4:0]>  0  i  0    0  0  1  1    0  1  0  0
2119 + * Example:
2120 + *    DMASEV E0
2121 + *   34 00
2122 + ******************************************************************************/
2123 +const char dmac_code_DMASEV[] = { 0x34, 0x00 };
2124 +
2125 +int DMAC_DMASEV(int ch_num, int event_num)
2126 +{
2127 +       dmac_instr_param_t param;
2128 +       int instr_len;
2129 +       dmac_channel_t *dma_ch = dmac_channels[ch_num];
2130 +       if ((event_num >= MIN_EVENT_NUM)
2131 +           && !(dma_ch->notifications_used & (1 << event_num))) {
2132 +               printk("DMAC_DMASEV failed event number request not done\n");
2133 +               return -1;
2134 +       } else if ((event_num < MIN_EVENT_NUM) && (event_num != ch_num)) {
2135 +               printk
2136 +                   ("%s:%d - Presently, we have this hard restriction that each channel can signal irq event == channel_no\n",
2137 +                    __FUNCTION__, __LINE__);
2138 +               return -1;
2139 +       }
2140 +       memset(&param, 0, sizeof(dmac_instr_param_t));
2141 +       param.event_num = event_num;
2142 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMASEV, &param);
2143 +       if (instr_len < 0) {
2144 +               printk("dmac_create_instr failed \n");
2145 +               return -1;
2146 +       }
2147 +
2148 +       return 0;
2149 +}
2150 +
2151 +EXPORT_SYMBOL(DMAC_DMASEV);
2152 +
2153 +/******************************************************************************
2154 + *
2155 + * Instruction:  DMALDP<S|B>
2156 + * Description:
2157 + *   | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
2158 + *     <  periph[4:0] >  0  0  0    0  0  1  0    0  1 bs  1
2159 + * Example:
2160 + *    DMALDPS P0
2161 + *   25 00
2162 + ******************************************************************************/
2163 +const char dmac_code_DMALDP[] = { 0x25, 0x00 };
2164 +
2165 +int DMAC_DMALDP(int ch_num, int periph_id, int burst)
2166 +{
2167 +       dmac_instr_param_t param;
2168 +       int instr_len;
2169 +       memset(&param, 0, sizeof(dmac_instr_param_t));
2170 +       /* param.bits.b.x = param.bits.b.bs = 0; */
2171 +       param.periph = periph_id;
2172 +       param.bits.b.bs = burst;
2173 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMALDP, &param);
2174 +       if (instr_len < 0) {
2175 +               printk("dmac_create_instr failed \n");
2176 +               return -1;
2177 +       }
2178 +
2179 +       return 0;
2180 +}
2181 +
2182 +EXPORT_SYMBOL(DMAC_DMALDP);
2183 +
2184 +/******************************************************************************
2185 + *
2186 + * Instruction:  DMASTP<S|B>
2187 + * Description:
2188 + *   | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
2189 + *     <  periph[4:0] >  0  0  0    0  0  1  0    1  0 bs  1
2190 + * Example:
2191 + *    DMASTPS P0
2192 + *   29 00
2193 + ******************************************************************************/
2194 +const char dmac_code_DMASTP[] = { 0x29, 0x00 };
2195 +
2196 +int DMAC_DMASTP(int ch_num, int periph_id, int burst)
2197 +{
2198 +       dmac_instr_param_t param;
2199 +       int instr_len;
2200 +       memset(&param, 0, sizeof(dmac_instr_param_t));
2201 +       /* param.bits.b.x = param.bits.b.bs = 0; */
2202 +       param.periph = periph_id;
2203 +       param.bits.b.bs = burst;
2204 +       instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMASTP, &param);
2205 +       if (instr_len < 0) {
2206 +               printk("dmac_create_instr failed \n");
2207 +               return -1;
2208 +       }
2209 +
2210 +       return 0;
2211 +}
2212 +
2213 +EXPORT_SYMBOL(DMAC_DMASTP);
2214 +
2215 +dmac_instr_encode_t dmac_codes[] = {
2216 +       {dmac_code_DMAEND, sizeof(dmac_code_DMAEND), CHANNEL_AND_MANAGER}
2217 +       ,
2218 +       {dmac_code_DMAFLUSHP, sizeof(dmac_code_DMAFLUSHP), CHANNEL_ONLY}
2219 +       ,
2220 +       {dmac_code_DMAGO, sizeof(dmac_code_DMAGO), MANAGER_ONLY}
2221 +       ,
2222 +       {dmac_code_DMALD, sizeof(dmac_code_DMALD), CHANNEL_ONLY}
2223 +       ,
2224 +       {dmac_code_DMALDP, sizeof(dmac_code_DMALDP), CHANNEL_ONLY}
2225 +       ,
2226 +       {dmac_code_DMALP, sizeof(dmac_code_DMALP), CHANNEL_ONLY}
2227 +       ,
2228 +       {dmac_code_DMALPEND, sizeof(dmac_code_DMALPEND), CHANNEL_ONLY}
2229 +       ,
2230 +       {dmac_code_DMAKILL, sizeof(dmac_code_DMAKILL), CHANNEL_AND_MANAGER}
2231 +       ,
2232 +       {dmac_code_DMAMOV, sizeof(dmac_code_DMAMOV), CHANNEL_ONLY}
2233 +       ,
2234 +       {dmac_code_DMANOP, sizeof(dmac_code_DMANOP), CHANNEL_AND_MANAGER}
2235 +       ,
2236 +       {dmac_code_DMASEV, sizeof(dmac_code_DMASEV), CHANNEL_AND_MANAGER}
2237 +       ,
2238 +       {dmac_code_DMAST, sizeof(dmac_code_DMAST), CHANNEL_ONLY}
2239 +       ,
2240 +       {dmac_code_DMASTP, sizeof(dmac_code_DMASTP), CHANNEL_ONLY}
2241 +       ,
2242 +       {dmac_code_DMASTZ, sizeof(dmac_code_DMASTZ), CHANNEL_ONLY}
2243 +       ,
2244 +       {dmac_code_DMAWFE, sizeof(dmac_code_DMAWFE), CHANNEL_AND_MANAGER}
2245 +       ,
2246 +       {dmac_code_DMAWFP, sizeof(dmac_code_DMAWFP), CHANNEL_ONLY}
2247 +       ,
2248 +       {dmac_code_DMAWMB, sizeof(dmac_code_DMAWMB), CHANNEL_ONLY}
2249 +       ,
2250 +};
2251 +
2252 +static void Dmac_Cmd_Write32(uint8_t * buf, uint32_t val)
2253 +{
2254 +       buf[0] = (uint8_t) (val);
2255 +       buf[1] = (uint8_t) (val >> 8);
2256 +       buf[2] = (uint8_t) (val >> 16);
2257 +       buf[3] = (uint8_t) (val >> 24);
2258 +
2259 +       return;
2260 +}
2261 +
2262 +static int
2263 +dmac_create_instr(int chan, dmac_instr_t instr, dmac_instr_param_t * param)
2264 +{
2265 +       int len = 0;
2266 +       dmac_channel_t *dma_ch = dmac_channels[chan];
2267 +       uint8_t *buf = NULL;
2268 +#ifdef DEBUG_GDMA
2269 +       printk("%s:%d: In with channel no %d\n", __FUNCTION__, __LINE__, chan);
2270 +#endif
2271 +
2272 +       if (!((0x1 << chan) & dmac_codes[instr].chan_or_mgr)) {
2273 +               printk("Channel %d does not support this instruction %d\n",
2274 +                      chan, instr);
2275 +               return -1;
2276 +       }
2277 +#ifdef DEBUG_GDMA
2278 +       if (!dma_ch)
2279 +               printk("%s:%d: Bug here !!\n", __FUNCTION__, __LINE__);
2280 +#endif
2281 +
2282 +       if (dma_ch->microcode == NULL) {
2283 +               buf = dma_ch->microcode =
2284 +                   dma_alloc_coherent(NULL, MAX_MICROCODE_SIZE,
2285 +                                      &dma_ch->microcode_dma, GFP_KERNEL);
2286 +               printk
2287 +                   ("First time microcode alloc for channel %d done @phy:%x\n",
2288 +                    chan, dma_ch->microcode_dma);
2289 +               dma_ch->microcode_size = 0;
2290 +       } else {
2291 +               if ((dmac_codes[instr].enc_buf_len + dma_ch->microcode_size) >
2292 +                   MAX_MICROCODE_SIZE) {
2293 +                       printk
2294 +                           ("We have a buffer overflow [%d]issue here ... BUG !!\n",
2295 +                            dma_ch->microcode_size);
2296 +                       return -1;
2297 +               }
2298 +               buf = dma_ch->microcode + dma_ch->microcode_size;
2299 +       }
2300 +#ifdef DEBUG_GDMA
2301 +       printk("%s:%d: Microcode alloc for channel %d\n", __FUNCTION__,
2302 +              __LINE__, chan);
2303 +#endif
2304 +
2305 +       if (buf == NULL) {
2306 +               printk("%s: Unable to allocate memory for microocode space\n",
2307 +                      __FUNCTION__);
2308 +               return -1;
2309 +       }
2310 +#ifdef DEBUG_GDMA
2311 +       printk("%s:%d: allocated microcode buffer%p [@phy: %x]\n", __FUNCTION__,
2312 +              __LINE__, buf, dma_ch->microcode_dma + dma_ch->microcode_size);
2313 +#endif
2314 +       /* TODO: buf_space checking */
2315 +       memcpy(buf, dmac_codes[instr].enc_buf, dmac_codes[instr].enc_buf_len);
2316 +       len += dmac_codes[instr].enc_buf_len;
2317 +
2318 +       /* TODO: Parameter checking */
2319 +       switch (instr) {
2320 +       case DMAC_INSTR_DMAEND:
2321 +       case DMAC_INSTR_DMASTZ:
2322 +       case DMAC_INSTR_DMAKILL:
2323 +       case DMAC_INSTR_DMAWMB:
2324 +       case DMAC_INSTR_DMANOP:
2325 +               /* no parameter needed */
2326 +               break;
2327 +
2328 +       case DMAC_INSTR_DMAFLUSHP:
2329 +               /* Fill additional parameters */
2330 +               buf[1] |= (param->periph) << 3; // shift to bit 11
2331 +               break;
2332 +
2333 +       case DMAC_INSTR_DMAGO:
2334 +               // Fill additional parameters
2335 +               if (param->bits.b.ns)
2336 +                       buf[0] |= 0x2;
2337 +               else
2338 +                       buf[0] &= ~0x2;
2339 +               buf[1] = param->cn & 0x7;
2340 +//#warning "rewrite this"
2341 +               Dmac_Cmd_Write32(&buf[2], param->imm32.i.val);
2342 +               //memcpy (&buf[2],&(param->imm32.i.val),4);
2343 +               break;
2344 +
2345 +       case DMAC_INSTR_DMALD:
2346 +       case DMAC_INSTR_DMAST:
2347 +               // Fill additional parameters
2348 +               buf[0] &= 0xFC;
2349 +               if (param->bits.b.x)
2350 +                       buf[0] |= 0x1;
2351 +               else
2352 +                       buf[0] &= ~0x1;
2353 +               if (param->bits.b.bs)
2354 +                       buf[0] |= 0x2;
2355 +               else
2356 +                       buf[0] &= ~0x2;
2357 +               break;
2358 +
2359 +       case DMAC_INSTR_DMALP:
2360 +               buf[0] &= (~0x2);
2361 +               if (param->bits.b.lc)
2362 +                       buf[0] |= 0x2;
2363 +               buf[1] = param->iter;
2364 +               break;
2365 +
2366 +       case DMAC_INSTR_DMALPEND:
2367 +               // Fill additional parameters
2368 +               buf[0] = 0x28;
2369 +               if (param->bits.b.x)
2370 +                       buf[0] |= 0x1;
2371 +               if (param->bits.b.bs)
2372 +                       buf[0] |= 0x2;
2373 +               if (param->bits.b.lc)
2374 +                       buf[0] |= 0x4;
2375 +               if (param->bits.b.nf)
2376 +                       buf[0] |= 0x10;
2377 +               buf[1] = param->backwards_jump;
2378 +               break;
2379 +
2380 +       case DMAC_INSTR_DMAMOV:
2381 +               // Fill additional parameters
2382 +               buf[1] = (param->rd) & 0x7;
2383 +//#warning "rewrite this"
2384 +               Dmac_Cmd_Write32(&buf[2], param->imm32.i.val);
2385 +               //memcpy (&buf[2],&(param->imm32.i.val),4);
2386 +               break;
2387 +
2388 +       case DMAC_INSTR_DMAWFE:
2389 +               buf[1] = 0x0;
2390 +               if (param->bits.b.i)
2391 +                       buf[1] |= 0x2;
2392 +               buf[1] |= (param->event_num) << 3;      // shift to bit 11
2393 +               break;
2394 +
2395 +       case DMAC_INSTR_DMASEV:
2396 +               buf[1] |= (param->event_num) << 3;      // shift to bit 11
2397 +               break;
2398 +
2399 +       case DMAC_INSTR_DMAWFP:
2400 +               if (param->bits.b.p)
2401 +                       buf[0] |= 0x1;
2402 +               else
2403 +                       buf[0] &= ~0x1;
2404 +               if (param->bits.b.bs)
2405 +                       buf[0] |= 0x2;
2406 +               else
2407 +                       buf[0] &= ~0x2;
2408 +               buf[1] |= (param->periph) << 3; // shift to bit 11
2409 +               break;
2410 +
2411 +       case DMAC_INSTR_DMALDP:
2412 +       case DMAC_INSTR_DMASTP:
2413 +               // Fill additional parameters
2414 +               if (param->bits.b.bs)
2415 +                       buf[0] |= 0x2;
2416 +               else
2417 +                       buf[0] &= ~0x2;
2418 +               buf[1] |= (param->periph) << 3; // shift to bit 11
2419 +               break;
2420 +
2421 +       default:
2422 +               printk("%s: unknown instr (%d)\r\n", __FUNCTION__, instr);
2423 +               break;
2424 +       }
2425 +       dma_ch->microcode_size += len;
2426 +#ifdef DEBUG_GDMA
2427 +       printk("%s:%d: out with length %d\n", __FUNCTION__, __LINE__,
2428 +              dma_ch->microcode_size);
2429 +       {
2430 +               int foo = 0;
2431 +               uint8_t *foop = dma_ch->microcode;
2432 +               printk("Dumping the buffer -- ");
2433 +               for (foo = 0; foo < dma_ch->microcode_size; foo++)
2434 +                       printk("%x ", *(foop + foo));
2435 +               printk(" -- done.\n");
2436 +       }
2437 +#endif
2438 +       return len;
2439 +}
2440 +
2441 +static int dmac_exec_ucode(int ucode_channel, int ch)
2442 +{
2443 +       uint8_t i, dbg_instr_0_shift_base, dbg_instr_2_shift_base, dbg_cmd_len,
2444 +           *dbg_cmd_buf;
2445 +       uint32_t dbg1_val, dbg2_val;
2446 +       dmac_channel_t *dma_ch = dmac_channels[ucode_channel];
2447 +
2448 +       if (!dma_ch->microcode_size) {
2449 +               printk("%s: No instructions have been created\n", __FUNCTION__);
2450 +               return -1;
2451 +       }
2452 +
2453 +       dbg_cmd_buf = dma_ch->microcode;
2454 +       dbg_cmd_len = dma_ch->microcode_size;
2455 +#ifdef DEBUG_GDMA
2456 +       {
2457 +               int tmp;
2458 +               uint8_t *tmpp = dbg_cmd_buf;
2459 +               printk
2460 +                   ("Executing the code for channel %d, with instrn len %d\n",
2461 +                    ch, dma_ch->microcode_size);
2462 +               printk("Dumping microcode : ");
2463 +               for (tmp = 0; tmp < dbg_cmd_len; tmp++)
2464 +                       printk("%x ", *tmpp++);
2465 +               printk("\n");
2466 +       }
2467 +#endif
2468 +
2469 +       spin_lock(&dma_mgr_lock);
2470 +
2471 +       /* 3. Poll the Debug Status Register */
2472 +       while (DMAC_DBGSTATUS & DMAC_DBG_BUSY_BIT) ;
2473 +
2474 +       /* 4. Write to the Debug Instrution-X Register */
2475 +       dbg1_val = 0;
2476 +       dbg2_val = 0;
2477 +
2478 +       dbg_instr_0_shift_base = DMAC_DBG_INSTR_0_SHIFT;
2479 +       dbg_instr_2_shift_base = DMAC_DBG_INSTR_2_SHIFT;
2480 +       for (i = 0; i < dbg_cmd_len; i++) {
2481 +               uint8_t tmp_val = dbg_cmd_buf[i];
2482 +               switch (i) {
2483 +               case 0:
2484 +               case 1:
2485 +                       dbg1_val |= (tmp_val << dbg_instr_0_shift_base);
2486 +                       dbg_instr_0_shift_base += 8;
2487 +                       break;
2488 +               case 2:
2489 +               case 3:
2490 +               case 4:
2491 +               case 5:
2492 +                       tmp_val = dbg_cmd_buf[i];
2493 +                       dbg2_val |= (tmp_val << dbg_instr_2_shift_base);
2494 +                       dbg_instr_2_shift_base += 8;
2495 +                       break;
2496 +               default:
2497 +                       printk("BUG here ... DEBUG\n");
2498 +                       break;
2499 +               }
2500 +       }
2501 +
2502 +       // Fill channel field
2503 +       if (ch == DMAC_CHMGR) {
2504 +               dbg1_val &= (~DMAC_DBG_THREAD_BIT);
2505 +       } else {
2506 +               dbg1_val |= DMAC_DBG_THREAD_BIT;
2507 +               dbg1_val |=
2508 +                   ((ch & DMAC_DBG_CH_NUM_BIT_MASK) << DMAC_DBG_CH_NUM_SHIFT);
2509 +       }
2510 +
2511 +#ifdef DEBUG_GDMA
2512 +       {
2513 +               printk("dbg1_val: %x, dbg2_val: %x\n", dbg1_val, dbg2_val);
2514 +       }
2515 +#endif
2516 +
2517 +       DMAC_DBGINST0 = dbg1_val;
2518 +       DMAC_DBGINST1 = dbg2_val;
2519 +
2520 +       /* 5. Writing zero to the Debug Command Register */
2521 +       DMAC_DBGCMD = 0x0;
2522 +
2523 +       spin_unlock(&dma_mgr_lock);
2524 +       return 0;
2525 +}
2526 +
2527 +#define MAX_SINGLE_INSTR_LEN          8        /* TODO */
2528 +
2529 +static int dmac_channel_state_init(int ch_num)
2530 +{
2531 +       int instr_len = dmac_create_instr(ch_num, DMAC_INSTR_DMAKILL, NULL);
2532 +
2533 +       if (instr_len < 0) {
2534 +               printk("dmac_create_instr failed \n");
2535 +               return -1;
2536 +       }
2537 +
2538 +       dmac_exec_ucode(ch_num, ch_num);
2539 +
2540 +       if (dmac_channels[ch_num])
2541 +               dmac_channels[ch_num]->microcode_size = 0;
2542 +       else
2543 +               printk("BUG HERE !! DEBUG .. \n");
2544 +
2545 +       return 0;
2546 +}
2547 +
2548 +static irqreturn_t dmac_irq_handler(int irq, void *dev_id)
2549 +{
2550 +       uint32_t irq_status = 0;
2551 +       uint8_t event_status = 0, channel_no = 0;
2552 +       dmac_channel_t *chan = NULL;
2553 +
2554 +       irq_status = DMAC_INTSTATUS;    /* TODO: Get Interrupt status */
2555 +#ifdef DEBUG_GDMA
2556 +       printk("Dumping the interrupt status register %x\n", irq_status);
2557 +#endif
2558 +
2559 +       if (!irq_status) {
2560 +#ifdef DEBUG_GDMA
2561 +               printk("%s: Probably a DMAC Fault !!%x\n", __FUNCTION__,
2562 +                      irq_status);
2563 +               pl330_dump_regs();
2564 +#endif
2565 +               return IRQ_NONE;
2566 +       }
2567 +
2568 +//     if (irq_status >= MIN_EVENT_NUM) {
2569 +//             printk(KERN_CRIT
2570 +//                    "Event interrupt handler..(%d) Not implemented\n",
2571 +//                    irq_status);
2572 +//             return IRQ_NONE;
2573 +//     }
2574 +
2575 +       event_status = irq_status & 0xff;
2576 +       /* Clear Interrupt */
2577 +       DMAC_INTCLR |= (irq_status & 0xff);
2578 +
2579 +       while (event_status) {
2580 +               if (event_status & 0x1) {
2581 +                       chan = dmac_channels[channel_no];
2582 +                       if (chan->intr_handler && chan->in_use)
2583 +                               chan->intr_handler(chan->handler_args);
2584 +               }
2585 +               event_status >>= 1;
2586 +               channel_no++;
2587 +       }
2588 +       return IRQ_HANDLED;
2589 +}
2590 +
2591 +static void cns3xxx_dmac_hw_init(void)
2592 +{
2593 +#ifdef CONFIG_CNS3XXX_PM_API
2594 +       /* enable GDMA clock*/
2595 +       cns3xxx_pwr_clk_en(CNS3XXX_PWR_CLK_EN(GDMA));
2596 +       /* check clok status and power status */
2597 +       #if 0
2598 +       PM_PWR_STA_REG & (0x1 << PM_PWR_STA_REG_REG_OFFSET_GDMA)
2599 +       PM_CACTIVE_STA_REG & (0x1 << PM_CACTIVE_STA_REG_OFFSET_GDMA)
2600 +       #endif
2601 +       /* do software reset*/
2602 +       cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(GDMA));
2603 +#else
2604 +#error "CNS3XXX PM API support should be enabled in Linux kernel"
2605 +#endif
2606 +}
2607 +
2608 +/*
2609 + * dmac_init
2610 + */
2611 +int __init dmac_init(void)
2612 +{
2613 +       int i, irqno = DMAC_IRQNO_BASE;
2614 +
2615 +       printk(KERN_INFO "Initializing CNS3XXX DMA controller \n");
2616 +
2617 +       cns3xxx_dmac_hw_init();
2618 +
2619 +       memset(dmac_channels, 0, sizeof(dmac_channel_t *) * MAX_DMA_CHANNELS);
2620 +
2621 +       spin_lock_init(&dma_mgr_lock);
2622 +
2623 +       for (i = 0; i < MAX_DMA_CHANNELS; i++) {
2624 +               dmac_channels[i] = kmalloc(sizeof(dmac_channel_t), GFP_KERNEL);
2625 +
2626 +               if (dmac_channels[i] == NULL) {
2627 +                       printk("Unable to allocate memory for channel %d \n",
2628 +                              i);
2629 +                       return -ENOMEM;
2630 +               }
2631 +
2632 +               memset(dmac_channels[i], 0, sizeof(dmac_channel_t));
2633 +       }
2634 +
2635 +       /* Moves all the DMA channels to the Stopped state */
2636 +       for (i = 0; i < MAX_DMA_CHANNELS; i++)
2637 +               dmac_channel_state_init(i);
2638 +
2639 +       for (i = 0; i < MAX_INTR_EVENTS; i++)
2640 +               dmac_events[i] = -1;
2641 +
2642 +       /* Clear spurious interrupts */
2643 +       DMAC_INTCLR = 0xffffffff;
2644 +       DMAC_INTEN = 0xff; //Enable 8 interrupt 0x03;   /* Enabling interrupts IRQ[0], IRQ[1] */
2645 +
2646 +       /* TODO: error interrupt Right now using the same irq handler,
2647 +        * and reporting error inside the handler
2648 +        */
2649 +       if (request_irq(ERROR_INTR, dmac_irq_handler, 0, "DMAC-ERR", NULL)) {
2650 +               printk(KERN_CRIT "failed to request DMAC-ERR interrupt.\n");
2651 +               return -ENOENT;
2652 +       }
2653 +
2654 +       do {
2655 +               if (request_irq(irqno, dmac_irq_handler, 0, "DMAC", NULL)) {
2656 +                       printk(KERN_CRIT "failed to request DMAC interrupt.\n");
2657 +                       return -ENOENT;
2658 +               }
2659 +       } while (++irqno < (DMAC_IRQNO_BASE + MIN_EVENT_NUM));
2660 +
2661 +       return 0;
2662 +}
2663 +
2664 +/*
2665 + * dmac_get_channel
2666 + */
2667 +int dmac_get_channel(int (*handler) (void *), void *handler_args)
2668 +{
2669 +       int i;
2670 +
2671 +       for (i = 0; i < MAX_DMA_CHANNELS; i++)
2672 +               if (dmac_channels[i]->in_use == 0) {
2673 +                       dmac_channel_t *dmac_ch = dmac_channels[i];
2674 +
2675 +                       dmac_ch->microcode_size = 0;
2676 +                       dmac_ch->in_use = 1;
2677 +                       dmac_ch->intr_handler = handler;
2678 +                       dmac_ch->handler_args = handler_args;
2679 +
2680 +                       /* TODO enable interrupts for that channel */
2681 +//                     dmac_channel_state_init(i);
2682 +                       return i;
2683 +               }
2684 +
2685 +       return -1;
2686 +}
2687 +
2688 +int dmac_get_channel_ex(int channel, int (*handler) (void *), void *handler_args)
2689 +{
2690 +       if((channel >= 0) && (channel < MAX_DMA_CHANNELS) && (dmac_channels[channel]->in_use == 0)) {
2691 +                       dmac_channel_t *dmac_ch = dmac_channels[channel];
2692 +
2693 +                       dmac_ch->microcode_size = 0;
2694 +                       dmac_ch->in_use = 1;
2695 +                       dmac_ch->intr_handler = handler;
2696 +                       dmac_ch->handler_args = handler_args;
2697 +
2698 +                       /* TODO enable interrupts for that channel */
2699 +//                     dmac_channel_state_init(channel);
2700 +                       return channel;
2701 +       }
2702 +
2703 +       return -1;
2704 +}
2705 +
2706 +EXPORT_SYMBOL(dmac_get_channel);
2707 +EXPORT_SYMBOL(dmac_get_channel_ex);
2708 +
2709 +/*
2710 + * dmac_release_channel
2711 + */
2712 +int dmac_release_channel(int chan)
2713 +{
2714 +       dmac_channel_t *dma_ch;
2715 +
2716 +       if (chan < 0 || chan > 7)
2717 +               return -1;
2718 +
2719 +       dma_ch = dmac_channels[chan];
2720 +       if (!dma_ch->in_use)
2721 +               return -1;
2722 +
2723 +       dma_ch->in_use = 0;
2724 +       dma_ch->microcode_size = 0;
2725 +       dma_ch->intr_handler = 0;
2726 +       dma_ch->handler_args = 0;
2727 +
2728 +       /* TODO enable interrupts for that channel */
2729 +       dmac_channel_state_init(chan);
2730 +
2731 +       return 0;
2732 +}
2733 +
2734 +EXPORT_SYMBOL(dmac_release_channel);
2735 +
2736 +/*
2737 + *
2738 + */
2739 +int dmac_get_event(int chan, int event_num)
2740 +{
2741 +       if ((event_num < MIN_EVENT_NUM) || (event_num > MAX_INTR_EVENTS)) {
2742 +               return -1;
2743 +       }
2744 +
2745 +       if (dmac_events[event_num] == -1) {
2746 +               dmac_channel_t *dmac_ch = dmac_channels[chan];
2747 +               dmac_events[event_num] = chan;
2748 +               dmac_ch->notifications_used |= (1 << event_num);
2749 +               return 0;
2750 +       }
2751 +       return -1;
2752 +}
2753 +
2754 +EXPORT_SYMBOL(dmac_get_event);
2755 +
2756 +/*
2757 + *
2758 + */
2759 +int dmac_release_event(int chan, int event_num)
2760 +{
2761 +       if (dmac_events[event_num] != chan)
2762 +               return -1;
2763 +
2764 +       dmac_events[event_num] = -1;
2765 +       dmac_channels[chan]->notifications_used ^= (1 << event_num);
2766 +       return 0;
2767 +}
2768 +
2769 +EXPORT_SYMBOL(dmac_release_event);
2770 +
2771 +static int get_bpb_val(int bpb)
2772 +{
2773 +       int i = bpb;
2774 +       int retval = -1;
2775 +       while (i) {
2776 +               retval += 0x1;
2777 +               i /= 2;
2778 +       }
2779 +       return retval;
2780 +}
2781 +
2782 +/* @src_inc - src address auto increment
2783 + * @s_bpb - src bytes per burst
2784 + * @s_dt  - src num of data transfers
2785 + * @dst_inc - dst address auto increment
2786 + * @d_bpb - dst bytes per burst
2787 + * @d_dt - dst data transfers
2788 + * @swap - swapping bytes
2789 + */
2790 +uint32_t dmac_create_ctrlval(int src_inc, int s_bpb, int s_dt, int dst_inc,
2791 +                            int d_bpb, int d_dt, int swap)
2792 +{
2793 +       if (!
2794 +           ((s_bpb == 1) || (s_bpb == 2) || (s_bpb == 4) || (s_bpb == 8)
2795 +            || (s_bpb == 16)
2796 +            || (s_bpb == 32) || (s_bpb == 64) || (s_bpb == 128))) {
2797 +               printk
2798 +                   ("INVALID s_bpb parameter ... setting default and proceeding\n");
2799 +               s_bpb = 4;
2800 +       }
2801 +       if (!
2802 +           ((d_bpb == 1) || (d_bpb == 2) || (d_bpb == 4) || (d_bpb == 8)
2803 +            || (d_bpb == 16)
2804 +            || (d_bpb == 32) || (d_bpb == 64) || (d_bpb == 128))) {
2805 +               printk
2806 +                   ("INVALID d_bpb parameter ... setting default and proceeding\n");
2807 +               d_bpb = 4;
2808 +       }
2809 +
2810 +       if ((s_dt < 1) || (s_dt > 16)) {
2811 +               printk
2812 +                   ("INVALID s_dt parameter ... setting default and proceeding\n");
2813 +               s_dt = 1;
2814 +       }
2815 +       if ((d_dt < 1) || (d_dt > 16)) {
2816 +               printk
2817 +                   ("INVALID d_dt parameter ... setting default and proceeding\n");
2818 +               d_dt = 1;
2819 +       }
2820 +       return (((src_inc & 0x1) << 0) |
2821 +               ((get_bpb_val(s_bpb) & 0x7) << 1) |
2822 +               ((s_dt - 1) << 4) |
2823 +               (0x2 << 8) |
2824 +               (0x0 << 11) |
2825 +               ((dst_inc & 0x1) << 14) |
2826 +               ((get_bpb_val(d_bpb) & 0x7) << 15) |
2827 +               ((d_dt - 1) << 18) | (0x2 << 22) | (0x0 << 25) | (swap << 28)
2828 +           );
2829 +}
2830 +
2831 +EXPORT_SYMBOL(dmac_create_ctrlval);
2832 +
2833 +void pl330_dump_regs(void)
2834 +{
2835 +       printk("Read Periph Id 0 for GDMAC is %x\n", DMAC_MEM_MAP_VALUE(0xFE0));
2836 +       printk("DS Register: %x\n", DMAC_MEM_MAP_VALUE(0x0));
2837 +       printk("Conf Reg 0 : %x\n", DMAC_MEM_MAP_VALUE(0xE00));
2838 +       printk("Conf Reg 1 : %x\n", DMAC_MEM_MAP_VALUE(0xE04));
2839 +       printk("Conf Reg 2 : %x\n", DMAC_MEM_MAP_VALUE(0xE08));
2840 +       printk("Conf Reg 3 : %x\n", DMAC_MEM_MAP_VALUE(0xE0C));
2841 +       printk("Conf Reg 4 : %x\n", DMAC_MEM_MAP_VALUE(0xE10));
2842 +       printk("Conf Reg d : %x\n", DMAC_MEM_MAP_VALUE(0xE14));
2843 +
2844 +       printk("Dumping the status registers \n");
2845 +       printk("INTEN Register: %x\n", DMAC_MEM_MAP_VALUE(0x20));
2846 +       printk("ES Register: %x\n", DMAC_MEM_MAP_VALUE(0x24));
2847 +       printk("INTSTAT Register: %x\n", DMAC_MEM_MAP_VALUE(0x28));
2848 +       printk("FSDM Register: %x\n", DMAC_MEM_MAP_VALUE(0x30));
2849 +       printk("FSC Register: %x\n", DMAC_MEM_MAP_VALUE(0x34));
2850 +       printk("FTM Register: %x\n", DMAC_MEM_MAP_VALUE(0x38));
2851 +       printk("FTC0 Register: %x\n", DMAC_MEM_MAP_VALUE(0x40));
2852 +       printk("FTC1 Register: %x\n", DMAC_MEM_MAP_VALUE(0x44));
2853 +       printk("CS0 Register: %x\n", DMAC_MEM_MAP_VALUE(0x100));
2854 +       printk("CPC0 Register: %x\n", DMAC_MEM_MAP_VALUE(0x104));
2855 +       printk("CS1 Register: %x\n", DMAC_MEM_MAP_VALUE(0x108));
2856 +       printk("CPC1 Register: %x\n", DMAC_MEM_MAP_VALUE(0x10C));
2857 +       printk("SA0 Register: %x\n", DMAC_MEM_MAP_VALUE(0x400));
2858 +       printk("SA1 Register: %x\n", DMAC_MEM_MAP_VALUE(0x420));
2859 +       printk("DA0 Register: %x\n", DMAC_MEM_MAP_VALUE(0x404));
2860 +       printk("DA1 Register: %x\n", DMAC_MEM_MAP_VALUE(0x424));
2861 +       return;
2862 +}
2863 +
2864 +EXPORT_SYMBOL(pl330_dump_regs);
2865 +
2866 +/*
2867 + *
2868 + */
2869 +uint32_t DMAC_READ_CHREGS(int chan, chregs_t reg)
2870 +{
2871 +       int step = 0, base = 0;
2872 +
2873 +       switch (reg) {
2874 +       case PL330_FTC:
2875 +               base = 0x40;
2876 +               step = chan * 0x4;
2877 +               break;
2878 +       case PL330_CS:
2879 +               base = 0x100;
2880 +               step = chan * 0x8;
2881 +               break;
2882 +       case PL330_CPC:
2883 +               base = 0x104;
2884 +               step = chan * 0x8;
2885 +               break;
2886 +       case PL330_SA:
2887 +               base = 0x400;
2888 +               step = chan * 0x20;
2889 +               break;
2890 +       case PL330_DA:
2891 +               base = 0x404;
2892 +               step = chan * 0x20;
2893 +               break;
2894 +       case PL330_CC:
2895 +               base = 0x408;
2896 +               step = chan * 0x20;
2897 +               break;
2898 +       case PL330_LC0:
2899 +               base = 0x40C;
2900 +               step = chan * 0x20;
2901 +               break;
2902 +       case PL330_LC1:
2903 +               base = 0x410;
2904 +               step = chan * 0x20;
2905 +               break;
2906 +       default:
2907 +               printk("Wrong argument to function %s\n", __FUNCTION__);
2908 +       }
2909 +       return DMAC_MEM_MAP_VALUE(base + step);
2910 +}
2911 +
2912 +EXPORT_SYMBOL(DMAC_READ_CHREGS);
2913 --- /dev/null
2914 +++ b/arch/arm/mach-cns3xxx/headsmp.S
2915 @@ -0,0 +1,54 @@
2916 +/*
2917 + *  linux/arch/arm/mach-cns3xxx/headsmp.S
2918 + *
2919 + *  Copyright (c) 2008 Cavium Networks 
2920 + *  Copyright (c) 2003 ARM Limited
2921 + *  All Rights Reserved
2922 + * 
2923 + *  This file is free software; you can redistribute it and/or modify 
2924 + *  it under the terms of the GNU General Public License, Version 2, as 
2925 + *  published by the Free Software Foundation. 
2926 + *
2927 + *  This file is distributed in the hope that it will be useful, 
2928 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
2929 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
2930 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
2931 + *
2932 + *  You should have received a copy of the GNU General Public License 
2933 + *  along with this file; if not, write to the Free Software 
2934 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
2935 + *  visit http://www.gnu.org/licenses/. 
2936 + *
2937 + *  This file may also be available under a different license from Cavium. 
2938 + *  Contact Cavium Networks for more information
2939 + */
2940 +
2941 +#include <linux/linkage.h>
2942 +#include <linux/init.h>
2943 +
2944 +       __INIT
2945 +
2946 +/*
2947 + * CNS3XXX specific entry point for secondary CPUs.  This provides
2948 + * a "holding pen" into which all secondary cores are held until we're
2949 + * ready for them to initialise.
2950 + */
2951 +ENTRY(cns3xxx_secondary_startup)
2952 +       mrc     p15, 0, r0, c0, c0, 5
2953 +       and     r0, r0, #15
2954 +       adr     r4, 1f
2955 +       ldmia   r4, {r5, r6}
2956 +       sub     r4, r4, r5
2957 +       add     r6, r6, r4
2958 +pen:   ldr     r7, [r6]
2959 +       cmp     r7, r0
2960 +       bne     pen
2961 +
2962 +       /*
2963 +        * we've been released from the holding pen: secondary_stack
2964 +        * should now contain the SVC stack for this core
2965 +        */
2966 +       b       secondary_startup
2967 +
2968 +1:     .long   .
2969 +       .long   pen_release
2970 --- /dev/null
2971 +++ b/arch/arm/mach-cns3xxx/hotplug.c
2972 @@ -0,0 +1,155 @@
2973 +/*
2974 + *  linux/arch/arm/mach-cns3xxx/hotplug.c
2975 + *
2976 + *  Copyright (c) 2008 Cavium Networks 
2977 + *  Copyright (C) 2002 ARM Ltd.
2978 + *  All Rights Reserved
2979 + * 
2980 + *  This file is free software; you can redistribute it and/or modify 
2981 + *  it under the terms of the GNU General Public License, Version 2, as 
2982 + *  published by the Free Software Foundation. 
2983 + *
2984 + *  This file is distributed in the hope that it will be useful, 
2985 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
2986 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
2987 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
2988 + *
2989 + *  You should have received a copy of the GNU General Public License 
2990 + *  along with this file; if not, write to the Free Software 
2991 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
2992 + *  visit http://www.gnu.org/licenses/. 
2993 + *
2994 + *  This file may also be available under a different license from Cavium. 
2995 + *  Contact Cavium Networks for more information
2996 + */
2997 +#include <linux/kernel.h>
2998 +#include <linux/errno.h>
2999 +#include <linux/smp.h>
3000 +#include <linux/completion.h>
3001 +
3002 +#include <asm/cacheflush.h>
3003 +
3004 +extern volatile int pen_release;
3005 +
3006 +static DECLARE_COMPLETION(cpu_killed);
3007 +
3008 +static inline void cpu_enter_lowpower(void)
3009 +{
3010 +       unsigned int v;
3011 +
3012 +       flush_cache_all();
3013 +       asm volatile(
3014 +       "       mcr     p15, 0, %1, c7, c5, 0\n"
3015 +       "       mcr     p15, 0, %1, c7, c10, 4\n"
3016 +       /*
3017 +        * Turn off coherency
3018 +        */
3019 +       "       mrc     p15, 0, %0, c1, c0, 1\n"
3020 +       "       bic     %0, %0, #0x20\n"
3021 +       "       mcr     p15, 0, %0, c1, c0, 1\n"
3022 +       "       mrc     p15, 0, %0, c1, c0, 0\n"
3023 +       "       bic     %0, %0, #0x04\n"
3024 +       "       mcr     p15, 0, %0, c1, c0, 0\n"
3025 +         : "=&r" (v)
3026 +         : "r" (0)
3027 +         : "cc");
3028 +}
3029 +
3030 +static inline void cpu_leave_lowpower(void)
3031 +{
3032 +       unsigned int v;
3033 +
3034 +       asm volatile(   "mrc    p15, 0, %0, c1, c0, 0\n"
3035 +       "       orr     %0, %0, #0x04\n"
3036 +       "       mcr     p15, 0, %0, c1, c0, 0\n"
3037 +       "       mrc     p15, 0, %0, c1, c0, 1\n"
3038 +       "       orr     %0, %0, #0x20\n"
3039 +       "       mcr     p15, 0, %0, c1, c0, 1\n"
3040 +         : "=&r" (v)
3041 +         :
3042 +         : "cc");
3043 +}
3044 +
3045 +static inline void platform_do_lowpower(unsigned int cpu)
3046 +{
3047 +       /*
3048 +        * there is no power-control hardware on this platform, so all
3049 +        * we can do is put the core into WFI; this is safe as the calling
3050 +        * code will have already disabled interrupts
3051 +        */
3052 +       for (;;) {
3053 +               /*
3054 +                * here's the WFI
3055 +                */
3056 +               asm(".word      0xe320f003\n"
3057 +                   :
3058 +                   :
3059 +                   : "memory", "cc");
3060 +
3061 +               if (pen_release == cpu) {
3062 +                       /*
3063 +                        * OK, proper wakeup, we're done
3064 +                        */
3065 +                       break;
3066 +               }
3067 +
3068 +               /*
3069 +                * getting here, means that we have come out of WFI without
3070 +                * having been woken up - this shouldn't happen
3071 +                *
3072 +                * The trouble is, letting people know about this is not really
3073 +                * possible, since we are currently running incoherently, and
3074 +                * therefore cannot safely call printk() or anything else
3075 +                */
3076 +#ifdef DEBUG
3077 +               printk("CPU%u: spurious wakeup call\n", cpu);
3078 +#endif
3079 +       }
3080 +}
3081 +
3082 +int platform_cpu_kill(unsigned int cpu)
3083 +{
3084 +       return wait_for_completion_timeout(&cpu_killed, 5000);
3085 +}
3086 +
3087 +/*
3088 + * platform-specific code to shutdown a CPU
3089 + *
3090 + * Called with IRQs disabled
3091 + */
3092 +void platform_cpu_die(unsigned int cpu)
3093 +{
3094 +#ifdef DEBUG
3095 +       unsigned int this_cpu = hard_smp_processor_id();
3096 +
3097 +       if (cpu != this_cpu) {
3098 +               printk(KERN_CRIT "Eek! platform_cpu_die running on %u, should be %u\n",
3099 +                          this_cpu, cpu);
3100 +               BUG();
3101 +       }
3102 +#endif
3103 +
3104 +       printk(KERN_NOTICE "CPU%u: shutdown\n", cpu);
3105 +       complete(&cpu_killed);
3106 +
3107 +       /*
3108 +        * we're ready for shutdown now, so do it
3109 +        */
3110 +       cpu_enter_lowpower();
3111 +       platform_do_lowpower(cpu);
3112 +
3113 +       /*
3114 +        * bring this CPU back into the world of cache
3115 +        * coherency, and then restore interrupts
3116 +        */
3117 +       cpu_leave_lowpower();
3118 +}
3119 +
3120 +int mach_cpu_disable(unsigned int cpu)
3121 +{
3122 +       /*
3123 +        * we don't allow CPU 0 to be shutdown (it is still too special
3124 +        * e.g. clock tick interrupts)
3125 +        */
3126 +       return cpu == 0 ? -EPERM : 0;
3127 +}
3128 --- /dev/null
3129 +++ b/arch/arm/mach-cns3xxx/include/mach/board.h
3130 @@ -0,0 +1,386 @@
3131 +/*
3132 + *  arch/arm/mach-cns3xxx/include/mach/board.h
3133 + *
3134 + *  Copyright (c) 2008 Cavium Networks 
3135 + * 
3136 + *  This file is free software; you can redistribute it and/or modify 
3137 + *  it under the terms of the GNU General Public License, Version 2, as 
3138 + *  published by the Free Software Foundation. 
3139 + *
3140 + *  This file is distributed in the hope that it will be useful, 
3141 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
3142 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
3143 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
3144 + *
3145 + *  You should have received a copy of the GNU General Public License 
3146 + *  along with this file; if not, write to the Free Software 
3147 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
3148 + *  visit http://www.gnu.org/licenses/. 
3149 + *
3150 + *  This file may also be available under a different license from Cavium. 
3151 + *  Contact Cavium Networks for more information
3152 + */
3153 +
3154 +#ifndef __ASM_ARCH_BOARD_CNS3XXXH
3155 +#define __ASM_ARCH_BOARD_CNS3XXXH
3156 +
3157 +/*
3158 + * Cavium Networks CNS3XXX Linux Memory Map:
3159 + *
3160 + * Phy         Size            Virt            Description
3161 + * =========================================================================
3162 + *
3163 + * 0x00000000  0x10000000(max) PAGE_OFFSET     Alien RAM (??)
3164 + *
3165 + * 0x78000000  0x00400000      0xFFF09000      UART0
3166 + *
3167 + */
3168 +
3169 +/*
3170 + * Peripheral addresses
3171 + */
3172 +#define CNS3XXX_FLASH0_BASE                    0x10000000      /* Flash/SRAM Memory Bank 0 */
3173 +#define CNS3XXX_FLASH0_SIZE                    SZ_128M
3174 +
3175 +#define CNS3XXX_FLASH1_BASE                    0x11000000      /* Flash/SRAM Memory Bank 1 */
3176 +#define CNS3XXX_FLASH1_SIZE                    SZ_16M
3177 +#define CNS3XXX_FLASH2_BASE                    0x12000000      /* Flash/SRAM Memory Bank 2 */
3178 +#define CNS3XXX_FLASH2_SIZE                    SZ_16M
3179 +#define CNS3XXX_FLASH3_BASE                    0x13000000      /* Flash/SRAM Memory Bank 3 */
3180 +#define CNS3XXX_FLASH3_SIZE                    SZ_16M
3181 +
3182 +#define CNS3XXX_DDR2SDRAM_BASE                 0x20000000      /* DDR2 SDRAM Memory */
3183 +
3184 +#define CNS3XXX_SPI_FLASH_BASE                 0x60000000      /* SPI Serial Flash Memory */
3185 +
3186 +#define CNS3XXX_SWITCH_BASE                    0x70000000      /* Switch and HNAT Control */
3187 +#define CNS3XXX_SWITCH_BASE_VIRT               0xFFF00000
3188 +
3189 +#define CNS3XXX_PPE_BASE                       0x70001000      /* HANT  */
3190 +#define CNS3XXX_PPE_BASE_VIRT                  0xFFF50000
3191 +
3192 +#define CNS3XXX_EMBEDDED_SRAM_BASE             0x70002000      /* HANT Embedded SRAM */
3193 +#define CNS3XXX_EMBEDDED_SRAM_BASE_VIRT                0xFFF60000       
3194 +
3195 +#define CNS3XXX_SSP_BASE                       0x71000000      /* Synchronous Serial Port - SPI/PCM/I2C */
3196 +#define CNS3XXX_SSP_BASE_VIRT                  0xFFF01000
3197 +
3198 +#define CNS3XXX_DMC_BASE                       0x72000000      /* DMC Control (DDR2 SDRAM) */
3199 +#define CNS3XXX_DMC_BASE_VIRT                  0xFFF02000
3200 +
3201 +#define CNS3XXX_SMC_BASE                       0x73000000      /* SMC Control */
3202 +#define CNS3XXX_SMC_BASE_VIRT                  0xFFF03000
3203 +
3204 +#define SMC_MEMC_STATUS_OFFSET                 0x000
3205 +#define SMC_MEMIF_CFG_OFFSET                   0x004
3206 +#define SMC_MEMC_CFG_SET_OFFSET                        0x008
3207 +#define SMC_MEMC_CFG_CLR_OFFSET                        0x00C
3208 +#define SMC_DIRECT_CMD_OFFSET                  0x010
3209 +#define SMC_SET_CYCLES_OFFSET                  0x014
3210 +#define SMC_SET_OPMODE_OFFSET                  0x018
3211 +#define SMC_REFRESH_PERIOD_0_OFFSET            0x020
3212 +#define SMC_REFRESH_PERIOD_1_OFFSET            0x024
3213 +#define SMC_SRAM_CYCLES0_0_OFFSET              0x100
3214 +#define SMC_NAND_CYCLES0_0_OFFSET              0x100
3215 +#define SMC_OPMODE0_0_OFFSET                   0x104
3216 +#define SMC_SRAM_CYCLES0_1_OFFSET              0x120
3217 +#define SMC_NAND_CYCLES0_1_OFFSET              0x120
3218 +#define SMC_OPMODE0_1_OFFSET                   0x124
3219 +#define SMC_USER_STATUS_OFFSET                 0x200
3220 +#define SMC_USER_CONFIG_OFFSET                 0x204
3221 +#define SMC_ECC_STATUS_OFFSET                  0x300
3222 +#define SMC_ECC_MEMCFG_OFFSET                  0x304
3223 +#define SMC_ECC_MEMCOMMAND1_OFFSET             0x308
3224 +#define SMC_ECC_MEMCOMMAND2_OFFSET             0x30C
3225 +#define SMC_ECC_ADDR0_OFFSET                   0x310
3226 +#define SMC_ECC_ADDR1_OFFSET                   0x314
3227 +#define SMC_ECC_VALUE0_OFFSET                  0x318
3228 +#define SMC_ECC_VALUE1_OFFSET                  0x31C
3229 +#define SMC_ECC_VALUE2_OFFSET                  0x320
3230 +#define SMC_ECC_VALUE3_OFFSET                  0x324
3231 +#define SMC_PERIPH_ID_0_OFFSET                 0xFE0
3232 +#define SMC_PERIPH_ID_1_OFFSET                 0xFE4
3233 +#define SMC_PERIPH_ID_2_OFFSET                 0xFE8
3234 +#define SMC_PERIPH_ID_3_OFFSET                 0xFEC
3235 +#define SMC_PCELL_ID_0_OFFSET                  0xFF0
3236 +#define SMC_PCELL_ID_1_OFFSET                  0xFF4
3237 +#define SMC_PCELL_ID_2_OFFSET                  0xFF8
3238 +#define SMC_PCELL_ID_3_OFFSET                  0xFFC
3239 +
3240 +#define CNS3XXX_GPIOA_BASE                     0x74000000      /* GPIO port A */
3241 +#define CNS3XXX_GPIOA_BASE_VIRT                        0xFFF04000
3242 +
3243 +#define CNS3XXX_GPIOB_BASE                     0x74800000      /* GPIO port B */
3244 +#define CNS3XXX_GPIOB_BASE_VIRT                        0xFFF05000
3245 +
3246 +#define CNS3XXX_RTC_BASE                       0x75000000      /* Real Time Clock */
3247 +#define CNS3XXX_RTC_BASE_VIRT                  0xFFF06000
3248 +
3249 +#define RTC_SEC_OFFSET                         0x00
3250 +#define RTC_MIN_OFFSET                         0x04
3251 +#define RTC_HOUR_OFFSET                                0x08
3252 +#define RTC_DAY_OFFSET                         0x0C
3253 +#define RTC_SEC_ALM_OFFSET                     0x10
3254 +#define RTC_MIN_ALM_OFFSET                     0x14
3255 +#define RTC_HOUR_ALM_OFFSET                    0x18
3256 +#define RTC_REC_OFFSET                         0x1C
3257 +#define RTC_CTRL_OFFSET                                0x20
3258 +#define RTC_INTR_STS_OFFSET                    0x34
3259 +
3260 +#define CNS3XXX_MISC_BASE                      0x76000000      /* Misc Control */
3261 +#define CNS3XXX_MISC_BASE_VIRT                 0xFFF07000      /* Misc Control */
3262 +
3263 +#define CNS3XXX_PM_BASE                                0x77000000      /* Power Management Control */
3264 +#define CNS3XXX_PM_BASE_VIRT                   0xFFF08000
3265 +
3266 +#define PM_CLK_GATE_OFFSET                     0x00
3267 +#define PM_SOFT_RST_OFFSET                     0x04
3268 +#define PM_HS_CFG_OFFSET                       0x08
3269 +#define PM_CACTIVE_STA_OFFSET                  0x0C
3270 +#define PM_PWR_STA_OFFSET                      0x10
3271 +#define PM_SYS_CLK_CTRL_OFFSET                 0x14
3272 +#define PM_PLL_LCD_I2S_CTRL_OFFSET             0x18
3273 +#define PM_PLL_HM_PD_OFFSET                    0x1C
3274 +
3275 +#define CNS3XXX_UART0_BASE                     0x78000000      /* UART 0 */
3276 +#define CNS3XXX_UART0_BASE_VIRT                        0xFFF09000
3277 +
3278 +#define CNS3XXX_UART1_BASE                     0x78400000      /* UART 1 */
3279 +#define CNS3XXX_UART1_BASE_VIRT                        0xFFF0A000
3280 +
3281 +#define CNS3XXX_UART2_BASE                     0x78800000      /* UART 2 */
3282 +#define CNS3XXX_UART2_BASE_VIRT                        0xFFF0B000
3283 +
3284 +#define CNS3XXX_UART3_BASE                     0x78C00000      /* UART 3 */
3285 +#define CNS3XXX_UART3_BASE_VIRT                        0xFFF0C000
3286 +
3287 +#define CNS3XXX_DMAC_BASE                      0x79000000      /* Generic DMA Control */
3288 +#define CNS3XXX_DMAC_BASE_VIRT                 0xFFF0D000
3289 +
3290 +#define CNS3XXX_CORESIGHT_BASE                 0x7A000000      /* CoreSight */
3291 +#define CNS3XXX_CORESIGHT_BASE_VIRT            0xFFF0E000
3292 +
3293 +#define CNS3XXX_CRYPTO_BASE                    0x7B000000      /* Crypto */
3294 +#define CNS3XXX_CRYPTO_BASE_VIRT               0xFFF0F000
3295 +
3296 +#define CNS3XXX_I2S_BASE                       0x7C000000      /* I2S */
3297 +#define CNS3XXX_I2S_BASE_VIRT                  0xFFF10000
3298 +
3299 +#define CNS3XXX_TIMER1_2_3_BASE                        0x7C800000      /* Timer */
3300 +#define CNS3XXX_TIMER1_2_3_BASE_VIRT           0xFFF10800
3301 +
3302 +#define TIMER1_COUNTER_OFFSET                  0x00
3303 +#define TIMER1_AUTO_RELOAD_OFFSET              0x04
3304 +#define TIMER1_MATCH_V1_OFFSET                 0x08
3305 +#define TIMER1_MATCH_V2_OFFSET                 0x0C
3306 +
3307 +#define TIMER2_COUNTER_OFFSET                  0x10
3308 +#define TIMER2_AUTO_RELOAD_OFFSET              0x14
3309 +#define TIMER2_MATCH_V1_OFFSET                 0x18
3310 +#define TIMER2_MATCH_V2_OFFSET                 0x1C
3311 +
3312 +#define TIMER1_2_CONTROL_OFFSET                        0x30
3313 +#define TIMER1_2_INTERRUPT_STATUS_OFFSET       0x34
3314 +#define TIMER1_2_INTERRUPT_MASK_OFFSET         0x38
3315 +
3316 +#define TIMER_FREERUN_OFFSET                   0x40
3317 +#define TIMER_FREERUN_CONTROL_OFFSET           0x44
3318 +
3319 +#define CNS3XXX_HCIE_BASE                      0x7D000000      /* HCIE Control */
3320 +#if 0
3321 +#define CNS3XXX_HCIE_BASE_VIRT                 0xFFF11000
3322 +#else
3323 +#define CNS3XXX_HCIE_BASE_VIRT                 0xFFF30000
3324 +#endif
3325 +
3326 +#define CNS3XXX_RAID_BASE                      0x7E000000      /* RAID Control */
3327 +#define CNS3XXX_RAID_BASE_VIRT                 0xFFF12000
3328 +
3329 +#define CNS3XXX_AXI_IXC_BASE                   0x7F000000      /* AXI IXC */
3330 +#define CNS3XXX_AXI_IXC_BASE_VIRT              0xFFF13000
3331 +
3332 +#define CNS3XXX_CLCD_BASE                      0x80000000      /* LCD Control */
3333 +#define CNS3XXX_CLCD_BASE_VIRT                 0xFFF14000
3334 +
3335 +#define CNS3XXX_USBOTG_BASE                    0x81000000      /* USB OTG Control */
3336 +#define CNS3XXX_USBOTG_BASE_VIRT               0xFFF15000
3337 +
3338 +#define CNS3XXX_USB_BASE                       0x82000000      /* USB Host Control */
3339 +#define CNS3XXX_USB_BASE_VIRT                  0xFFF16000
3340 +
3341 +#define CNS3XXX_SATA2_BASE                     0x83000000      /* SATA */
3342 +#define CNS3XXX_SATA2_SIZE                     SZ_16M
3343 +#define CNS3XXX_SATA2_BASE_VIRT                        0xFFF17000
3344 +
3345 +#define CNS3XXX_CAMERA_BASE                    0x84000000      /* Camera Interface */
3346 +#define CNS3XXX_CAMERA_BASE_VIRT               0xFFF18000
3347 +
3348 +#define CNS3XXX_SDIO_BASE                      0x85000000      /* SDIO */
3349 +#define CNS3XXX_SDIO_BASE_VIRT                 0xFFF19000
3350 +
3351 +#define CNS3XXX_I2S_TDM_BASE                   0x86000000      /* I2S TDM */
3352 +#define CNS3XXX_I2S_TDM_BASE_VIRT              0xFFF1A000
3353 +
3354 +#define CNS3XXX_2DG_BASE                       0x87000000      /* 2D Graphic Control */
3355 +#define CNS3XXX_2DG_BASE_VIRT                  0xFFF1B000
3356 +
3357 +#define CNS3XXX_USB_OHCI_BASE                  0x88000000      /* USB OHCI */
3358 +#define CNS3XXX_USB_OHCI_BASE_VIRT             0xFFF1C000
3359 +
3360 +#define CNS3XXX_L2C_BASE                       0x92000000      /* L2 Cache Control */
3361 +#define CNS3XXX_L2C_BASE_VIRT                  0xFFF27000
3362 +
3363 +#define CNS3XXX_PCIE0_MEM_BASE                 0xA0000000      /* PCIe Port 0 IO/Memory Space */
3364 +#define CNS3XXX_PCIE0_MEM_BASE_VIRT            0xE0000000
3365 +
3366 +#define CNS3XXX_PCIE0_HOST_BASE                        0xAB000000      /* PCIe Port 0 RC Base */
3367 +#define CNS3XXX_PCIE0_HOST_BASE_VIRT           0xE1000000
3368 +
3369 +#define CNS3XXX_PCIE0_IO_BASE                  0xAC000000      /* PCIe Port 0 */
3370 +#define CNS3XXX_PCIE0_IO_BASE_VIRT             0xE2000000
3371 +
3372 +#define CNS3XXX_PCIE0_CFG0_BASE                        0xAD000000      /* PCIe Port 0 CFG Type 0 */
3373 +#define CNS3XXX_PCIE0_CFG0_BASE_VIRT           0xE3000000
3374 +
3375 +#define CNS3XXX_PCIE0_CFG1_BASE                        0xAE000000      /* PCIe Port 0 CFG Type 1 */
3376 +#define CNS3XXX_PCIE0_CFG1_BASE_VIRT           0xE4000000
3377 +
3378 +#define CNS3XXX_PCIE0_MSG_BASE                 0xAF000000      /* PCIe Port 0 Message Space */
3379 +#define CNS3XXX_PCIE0_MSG_BASE_VIRT            0xE5000000
3380 +
3381 +#define CNS3XXX_PCIE1_MEM_BASE                 0xB0000000      /* PCIe Port 1 IO/Memory Space */
3382 +#define CNS3XXX_PCIE1_MEM_BASE_VIRT            0xE8000000
3383 +
3384 +#define CNS3XXX_PCIE1_HOST_BASE                        0xBB000000      /* PCIe Port 1 RC Base */
3385 +#define CNS3XXX_PCIE1_HOST_BASE_VIRT           0xE9000000
3386 +
3387 +#define CNS3XXX_PCIE1_IO_BASE                  0xBC000000      /* PCIe Port 1 */
3388 +#define CNS3XXX_PCIE1_IO_BASE_VIRT             0xEA000000
3389 +
3390 +#define CNS3XXX_PCIE1_CFG0_BASE                        0xBD000000      /* PCIe Port 1 CFG Type 0 */
3391 +#define CNS3XXX_PCIE1_CFG0_BASE_VIRT           0xEB000000
3392 +
3393 +#define CNS3XXX_PCIE1_CFG1_BASE                        0xBE000000      /* PCIe Port 1 CFG Type 1 */
3394 +#define CNS3XXX_PCIE1_CFG1_BASE_VIRT           0xEC000000
3395 +
3396 +#define CNS3XXX_PCIE1_MSG_BASE                 0xBF000000      /* PCIe Port 1 Message Space */
3397 +#define CNS3XXX_PCIE1_MSG_BASE_VIRT            0xED000000
3398 +
3399 +/*
3400 + * Testchip peripheral and fpga gic regions
3401 + */
3402 +//#define CNS3XXX_TC11MP_SCU_BASE                      0x1F000000      /* IRQ, Test chip */
3403 +#define CNS3XXX_TC11MP_SCU_BASE                        0x90000000      /* IRQ, Test chip */
3404 +#define CNS3XXX_TC11MP_SCU_BASE_VIRT           0xFF000000
3405 +
3406 +//#define CNS3XXX_TC11MP_GIC_CPU_BASE          0x1F000100      /* Test chip interrupt controller CPU interface */
3407 +#define CNS3XXX_TC11MP_GIC_CPU_BASE            0x90000100      /* Test chip interrupt controller CPU interface */
3408 +#define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT       0xFF000100
3409 +
3410 +//#define CNS3XXX_TC11MP_TWD_BASE                      0x1F000600
3411 +#define CNS3XXX_TC11MP_TWD_BASE                        0x90000600
3412 +#define CNS3XXX_TC11MP_TWD_BASE_VIRT           0xFF000600
3413 +
3414 +//#define CNS3XXX_TC11MP_GIC_DIST_BASE         0x1F001000      /* Test chip interrupt controller distributor */
3415 +#define CNS3XXX_TC11MP_GIC_DIST_BASE           0x90001000      /* Test chip interrupt controller distributor */
3416 +#define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT      0xFF001000
3417 +
3418 +//#define CNS3XXX_TC11MP_L220_BASE             0x1F002000      /* L220 registers */
3419 +#define CNS3XXX_TC11MP_L220_BASE               0x92002000      /* L220 registers */
3420 +#define CNS3XXX_TC11MP_L220_BASE_VIRT          0xFF002000
3421 +
3422 +/*
3423 + * Irqs
3424 + */
3425 +#define IRQ_TC11MP_GIC_START                   32
3426 +
3427 +/*
3428 + * ARM11 MPCore test chip interrupt sources (primary GIC on the test chip)
3429 + */
3430 +#define IRQ_CNS3XXX_PMU                (IRQ_TC11MP_GIC_START + 0)
3431 +#define IRQ_CNS3XXX_SDIO       (IRQ_TC11MP_GIC_START + 1)
3432 +#define IRQ_CNS3XXX_L2CC       (IRQ_TC11MP_GIC_START + 2)
3433 +#define IRQ_CNS3XXX_RTC                (IRQ_TC11MP_GIC_START + 3)
3434 +#define IRQ_CNS3XXX_I2S                (IRQ_TC11MP_GIC_START + 4)
3435 +#define IRQ_CNS3XXX_PCM                (IRQ_TC11MP_GIC_START + 5)
3436 +#define IRQ_CNS3XXX_SPI                (IRQ_TC11MP_GIC_START + 6)
3437 +#define IRQ_CNS3XXX_I2C                (IRQ_TC11MP_GIC_START + 7)
3438 +#define IRQ_CNS3XXX_CIM                (IRQ_TC11MP_GIC_START + 8)
3439 +#define IRQ_CNS3XXX_GPU                (IRQ_TC11MP_GIC_START + 9)
3440 +#define IRQ_CNS3XXX_LCD                (IRQ_TC11MP_GIC_START + 10)
3441 +#define IRQ_CNS3XXX_GPIOA      (IRQ_TC11MP_GIC_START + 11)
3442 +#define IRQ_CNS3XXX_GPIOB      (IRQ_TC11MP_GIC_START + 12)
3443 +#define IRQ_CNS3XXX_UART0      (IRQ_TC11MP_GIC_START + 13)
3444 +#define IRQ_CNS3XXX_UART1      (IRQ_TC11MP_GIC_START + 14)
3445 +#define IRQ_CNS3XXX_UART2      (IRQ_TC11MP_GIC_START + 15)
3446 +#define IRQ_CNS3XXX_ARM11      (IRQ_TC11MP_GIC_START + 16)
3447 +
3448 +#define IRQ_CNS3XXX_SW_STATUS  (IRQ_TC11MP_GIC_START + 17)
3449 +#define IRQ_CNS3XXX_SW_R0TXC   (IRQ_TC11MP_GIC_START + 18)
3450 +#define IRQ_CNS3XXX_SW_R0RXC   (IRQ_TC11MP_GIC_START + 19)
3451 +#define IRQ_CNS3XXX_SW_R0QE            (IRQ_TC11MP_GIC_START + 20)
3452 +#define IRQ_CNS3XXX_SW_R0QF            (IRQ_TC11MP_GIC_START + 21)
3453 +#define IRQ_CNS3XXX_SW_R1TXC   (IRQ_TC11MP_GIC_START + 22)
3454 +#define IRQ_CNS3XXX_SW_R1RXC   (IRQ_TC11MP_GIC_START + 23)
3455 +#define IRQ_CNS3XXX_SW_R1QE            (IRQ_TC11MP_GIC_START + 24)
3456 +#define IRQ_CNS3XXX_SW_R1QF            (IRQ_TC11MP_GIC_START + 25)
3457 +#define IRQ_CNS3XXX_SW_PPE             (IRQ_TC11MP_GIC_START + 26)
3458 +
3459 +#define IRQ_CNS3XXX_CRYPTO             (IRQ_TC11MP_GIC_START + 27)
3460 +#define IRQ_CNS3XXX_HCIE                       (IRQ_TC11MP_GIC_START + 28)
3461 +#define IRQ_CNS3XXX_PCIE0_DEVICE       (IRQ_TC11MP_GIC_START + 29)
3462 +#define IRQ_CNS3XXX_PCIE1_DEVICE       (IRQ_TC11MP_GIC_START + 30)
3463 +#define IRQ_CNS3XXX_USB_OTG            (IRQ_TC11MP_GIC_START + 31)
3464 +#define IRQ_CNS3XXX_USB_EHCI   (IRQ_TC11MP_GIC_START + 32)
3465 +#define IRQ_CNS3XXX_SATA                       (IRQ_TC11MP_GIC_START + 33)
3466 +#define IRQ_CNS3XXX_RAID                       (IRQ_TC11MP_GIC_START + 34)
3467 +#define IRQ_CNS3XXX_SMC                                (IRQ_TC11MP_GIC_START + 35)
3468 +
3469 +#define IRQ_CNS3XXX_DMAC_ABORT (IRQ_TC11MP_GIC_START + 36)
3470 +#define IRQ_CNS3XXX_DMAC0              (IRQ_TC11MP_GIC_START + 37)
3471 +#define IRQ_CNS3XXX_DMAC1              (IRQ_TC11MP_GIC_START + 38)
3472 +#define IRQ_CNS3XXX_DMAC2              (IRQ_TC11MP_GIC_START + 39)
3473 +#define IRQ_CNS3XXX_DMAC3              (IRQ_TC11MP_GIC_START + 40)
3474 +#define IRQ_CNS3XXX_DMAC4              (IRQ_TC11MP_GIC_START + 41)
3475 +#define IRQ_CNS3XXX_DMAC5              (IRQ_TC11MP_GIC_START + 42)
3476 +#define IRQ_CNS3XXX_DMAC6              (IRQ_TC11MP_GIC_START + 43)
3477 +#define IRQ_CNS3XXX_DMAC7              (IRQ_TC11MP_GIC_START + 44)
3478 +#define IRQ_CNS3XXX_DMAC8              (IRQ_TC11MP_GIC_START + 45)
3479 +#define IRQ_CNS3XXX_DMAC9              (IRQ_TC11MP_GIC_START + 46)
3480 +#define IRQ_CNS3XXX_DMAC10     (IRQ_TC11MP_GIC_START + 47)
3481 +#define IRQ_CNS3XXX_DMAC11     (IRQ_TC11MP_GIC_START + 48)
3482 +#define IRQ_CNS3XXX_DMAC12     (IRQ_TC11MP_GIC_START + 49)
3483 +#define IRQ_CNS3XXX_DMAC13     (IRQ_TC11MP_GIC_START + 50)
3484 +#define IRQ_CNS3XXX_DMAC14     (IRQ_TC11MP_GIC_START + 51)
3485 +#define IRQ_CNS3XXX_DMAC15     (IRQ_TC11MP_GIC_START + 52)
3486 +#define IRQ_CNS3XXX_DMAC16     (IRQ_TC11MP_GIC_START + 53)
3487 +#define IRQ_CNS3XXX_DMAC17     (IRQ_TC11MP_GIC_START + 54)
3488 +
3489 +#define IRQ_CNS3XXX_PCIE0_RC   (IRQ_TC11MP_GIC_START + 55)
3490 +#define IRQ_CNS3XXX_PCIE1_RC   (IRQ_TC11MP_GIC_START + 56)
3491 +#define IRQ_CNS3XXX_TIMER0             (IRQ_TC11MP_GIC_START + 57)
3492 +#define IRQ_CNS3XXX_TIMER1             (IRQ_TC11MP_GIC_START + 58)
3493 +#define IRQ_CNS3XXX_USB_OHCI   (IRQ_TC11MP_GIC_START + 59)
3494 +#define IRQ_CNS3XXX_TIMER2             (IRQ_TC11MP_GIC_START + 60)
3495 +#define IRQ_CNS3XXX_EXTERNAL_PIN0      (IRQ_TC11MP_GIC_START + 61)
3496 +#define IRQ_CNS3XXX_EXTERNAL_PIN1      (IRQ_TC11MP_GIC_START + 62)
3497 +#define IRQ_CNS3XXX_EXTERNAL_PIN2      (IRQ_TC11MP_GIC_START + 63)
3498 +
3499 +#define NR_GIC_CNS3XXX         1
3500 +
3501 +/*
3502 + * Only define NR_IRQS if less than NR_IRQS_CNS3XXX
3503 + */
3504 +#define NR_IRQS_CNS3XXX                (IRQ_TC11MP_GIC_START + 64)
3505 +
3506 +#if !defined(NR_IRQS) || (NR_IRQS < NR_IRQS_CNS3XXX)
3507 +#undef NR_IRQS
3508 +#define NR_IRQS                        NR_IRQS_CNS3XXX
3509 +#endif
3510 +
3511 +#if !defined(MAX_GIC_NR) || (MAX_GIC_NR < NR_GIC_CNS3XXX)
3512 +#undef MAX_GIC_NR
3513 +#define MAX_GIC_NR             NR_GIC_CNS3XXX
3514 +#endif
3515 +
3516 +#endif /* __ASM_ARCH_BOARD_CNS3XXX_H */
3517 --- /dev/null
3518 +++ b/arch/arm/mach-cns3xxx/include/mach/camera.h
3519 @@ -0,0 +1,97 @@
3520 +/*
3521 +    camera.h - CNS3XXX camera driver header file
3522 +
3523 +    Copyright (C) 2003, Intel Corporation
3524 +    Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
3525 +
3526 +    This program is free software; you can redistribute it and/or modify
3527 +    it under the terms of the GNU General Public License as published by
3528 +    the Free Software Foundation; either version 2 of the License, or
3529 +    (at your option) any later version.
3530 +
3531 +    This program is distributed in the hope that it will be useful,
3532 +    but WITHOUT ANY WARRANTY; without even the implied warranty of
3533 +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
3534 +    GNU General Public License for more details.
3535 +
3536 +    You should have received a copy of the GNU General Public License
3537 +    along with this program; if not, write to the Free Software
3538 +    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
3539 +*/
3540 +
3541 +#ifndef __ASM_ARCH_CAMERA_H_
3542 +#define __ASM_ARCH_CAMERA_H_
3543 +
3544 +#define CNS3XXX_CAMERA_MASTER          0x01
3545 +#define CNS3XXX_CAMERA_DATAWIDTH_4     0x02
3546 +#define CNS3XXX_CAMERA_DATAWIDTH_5     0x04
3547 +#define CNS3XXX_CAMERA_DATAWIDTH_8     0x08
3548 +#define CNS3XXX_CAMERA_DATAWIDTH_9     0x10
3549 +#define CNS3XXX_CAMERA_DATAWIDTH_10    0x20
3550 +#define CNS3XXX_CAMERA_PCLK_EN         0x40
3551 +#define CNS3XXX_CAMERA_MCLK_EN         0x80
3552 +#define CNS3XXX_CAMERA_PCP             0x100
3553 +#define CNS3XXX_CAMERA_HSP             0x200
3554 +#define CNS3XXX_CAMERA_VSP             0x400
3555 +
3556 +/* Camera Interface */
3557 +#define CIM_GLOBAL_REG          0x00    /* CIM control*/
3558 +#define CIM_TIMING_V_REG        0x04    /* Vertical capture range setting */
3559 +#define CIM_TIMING_H_REG        0x08    /* Horizontal capture range setting */
3560 +#define CIM_CCIR656_0_REG       0x0C    /* CCIR656 detect and control setting*/
3561 +#define CIM_CCIR656_1_REG       0x10    /* CCIR656 self test setting */
3562 +#define CIM_SERIAL_SRC_REG      0x14    /* Serial pix capture module control settings */
3563 +#define CIM_INT_MASK_REG        0x28    /* CIM interrupt mask register. */
3564 +#define CIM_INT_STATUS_REG      0x2C    /* CIM interrupt status register. */
3565 +#define CIM_INT_CLEAR_REG       0x30    /* CIM interrupt clear register. */
3566 +#define CIM_DATAPATH_CTL_REG    0x34    /* CIM data path options and control settings */
3567 +#define CIM_VIDEO_PORT_REG      0x100   /* CIM¡¦s video port */
3568 +#define CIM_CORRECTION_R_REG    0x200   /* Internal programmable table for R component. */
3569 +#define CIM_CORRECTION_G_REG    0x600   /* Internal programmable table for G component. */
3570 +#define CIM_CORRECTION_B_REG    0xA00   /* Internal programmable table for B component. */
3571 +
3572 +#define SRC_DATA_FMT_CCIR656    0x00
3573 +#define SRC_DATA_FMT_YCBCR_A    0x01
3574 +#define SRC_DATA_FMT_YCBCR_B    0x02
3575 +#define SRC_DATA_FMT_RGB565     0x03
3576 +#define SRC_DATA_FMT_RGB555     0x04
3577 +#define SRC_DATA_FMT_BAYER_82   0x05
3578 +#define SRC_DATA_FMT_BAYER_10   0x06
3579 +
3580 +#define DST_DATA_FMT_RGB888     0x00
3581 +#define DST_DATA_FMT_RGB565     0x01
3582 +#define DST_DATA_FMT_RGB1555    0x02
3583 +#define DST_DATA_FMT_RGB444     0x03
3584 +
3585 +#define CISR_LAST_LINE         (1 << 0)        /* Last line */
3586 +#define CISR_FIRST_LINE                (1 << 1)        /* First line */
3587 +#define CISR_LINE_END          (1 << 2)        /* Line end */
3588 +#define CISR_LINE_START                (1 << 3)        /* Line start */
3589 +#define CISR_FIELD_CHG         (1 << 4)        /* Field Change */
3590 +#define CISR_FIFO_OVERRUN      (1 << 5)        /* FIFO overrun */
3591 +
3592 +
3593 +#define CIMR_LAST_LINE_M       (1 << 0)        /* Last line mask*/
3594 +#define CIMR_FIRST_LINE_M      (1 << 1)        /* First line mask*/
3595 +#define CIMR_LINE_END_M                (1 << 2)        /* Line end mask*/
3596 +#define CIMR_LINE_START_M      (1 << 3)        /* Line start mask*/
3597 +#define CIMR_FIELD_CHG_M       (1 << 4)        /* Field Change mask*/
3598 +#define CIMR_FIFO_OVERRUN_M    (1 << 5)        /* FIFO overrun mask*/
3599 +
3600 +
3601 +struct cns3xxx_camera_platform_data {
3602 +#if 0
3603 +       int (*init)(struct device *);
3604 +       int (*power)(struct device *, int);
3605 +       int (*reset)(struct device *, int);
3606 +#endif
3607 +
3608 +       unsigned long flags;
3609 +       unsigned long mclk_10khz;
3610 +       unsigned long lcd_base;
3611 +       unsigned long misc_base;
3612 +};
3613 +
3614 +//extern void cns3xxx_set_camera_info(struct pxacamera_platform_data *);
3615 +
3616 +#endif /* __ASM_ARCH_CAMERA_H_ */
3617 --- /dev/null
3618 +++ b/arch/arm/mach-cns3xxx/include/mach/clkdev.h
3619 @@ -0,0 +1,7 @@
3620 +#ifndef __ASM_MACH_CLKDEV_H
3621 +#define __ASM_MACH_CLKDEV_H
3622 +
3623 +#define __clk_get(clk) ({ 1; })
3624 +#define __clk_put(clk) do { } while (0)
3625 +
3626 +#endif
3627 --- /dev/null
3628 +++ b/arch/arm/mach-cns3xxx/include/mach/debug-macro.S
3629 @@ -0,0 +1,35 @@
3630 +/*  arch/arm/mach-cns3xxx/include/mach/debug-macro.S
3631 + *
3632 + *  Debugging macro include header
3633 + *
3634 + *  Copyright (c) 2008 Cavium Networks 
3635 + *  Copyright (C) 1994-1999 Russell King
3636 + *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
3637 + * 
3638 + *  This file is free software; you can redistribute it and/or modify 
3639 + *  it under the terms of the GNU General Public License, Version 2, as 
3640 + *  published by the Free Software Foundation. 
3641 + *
3642 + *  This file is distributed in the hope that it will be useful, 
3643 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
3644 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
3645 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
3646 + *
3647 + *  You should have received a copy of the GNU General Public License 
3648 + *  along with this file; if not, write to the Free Software 
3649 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
3650 + *  visit http://www.gnu.org/licenses/. 
3651 + *
3652 + *  This file may also be available under a different license from Cavium. 
3653 + *  Contact Cavium Networks for more information
3654 + */
3655 +
3656 +               .macro  addruart,rx
3657 +               mrc     p15, 0, \rx, c1, c0
3658 +               tst     \rx, #1                 @ MMU enabled?
3659 +               moveq   \rx,      #0x10000000
3660 +               movne   \rx,      #0xf0000000   @ virtual base
3661 +               orr     \rx, \rx, #0x00009000
3662 +               .endm
3663 +
3664 +#include <asm/hardware/debug-pl01x.S>
3665 --- /dev/null
3666 +++ b/arch/arm/mach-cns3xxx/include/mach/dmac.h
3667 @@ -0,0 +1,295 @@
3668 +/*******************************************************************************
3669 + *
3670 + *  arch/arm/mach-cns3xxx/dmac.h
3671 + *
3672 + *  Copyright (c) 2008 Cavium Networks 
3673 + * 
3674 + *  This file is free software; you can redistribute it and/or modify 
3675 + *  it under the terms of the GNU General Public License, Version 2, as 
3676 + *  published by the Free Software Foundation. 
3677 + *
3678 + *  This file is distributed in the hope that it will be useful, 
3679 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
3680 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
3681 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
3682 + *
3683 + *  You should have received a copy of the GNU General Public License 
3684 + *  along with this file; if not, write to the Free Software 
3685 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
3686 + *  visit http://www.gnu.org/licenses/. 
3687 + *
3688 + *  This file may also be available under a different license from Cavium. 
3689 + *  Contact Cavium Networks for more information
3690 + *
3691 + ******************************************************************************/
3692 +
3693 +#ifndef _CNS3XXX_DMAC_H_
3694 +#define _CNS3XXX_DMAC_H_
3695 +
3696 +#define MAX_DMA_CHANNELS       9
3697 +#define DMAC_PCM1_PERIPH_ID_0  4
3698 +#define DMAC_SPI_PERIPH_ID     8
3699 +#define DMAC_PCM_PERIPH_ID_0   9
3700 +#define CNS3XXX_DMAC_I2STX_PID 12
3701 +#define CNS3XXX_DMAC_I2SRX_PID 13
3702 +
3703 +/* APIs */
3704 +int __init dmac_init(void);
3705 +extern int dmac_get_channel (int (*handler)(void*), void *handler_args);
3706 +extern int dmac_get_channel_ex(int channel, int (*handler) (void *), void *handler_args);
3707 +extern int dmac_release_channel(int chan);
3708 +
3709 +extern int dmac_get_event (int chan, int ev);
3710 +extern int dmac_release_event (int chan, int ev);
3711 +
3712 +extern uint32_t dmac_create_ctrlval (int src_inc, int s_bpb, int s_dt, int dst_inc, int d_bpb, int d_dt, int swap);
3713 +/* enum - reg ? 0 => PL330_FTC, 1 => PL330_CS, 2 => PL330_CPC, 3 => PL330_SA, 
3714 + * 4 => PL330_DA, 5=>PL330_CC, 6 => PL330_LC0, 7 => PL330_LC1
3715 + */
3716 +typedef enum {  PL330_FTC =0,
3717 +                PL330_CS,
3718 +                PL330_CPC,
3719 +                PL330_SA,
3720 +                PL330_DA,
3721 +                PL330_CC,
3722 +                PL330_LC0,
3723 +                PL330_LC1 
3724 +} chregs_t;
3725 +
3726 +extern uint32_t DMAC_READ_CHREGS (int chan, chregs_t reg);
3727 +
3728 +/* Instruction Set */
3729 +
3730 +/******************************************************************************
3731 + *
3732 + * Instruction:  DMAEND
3733 + * Description:
3734 + *     | 7 6 5 4 | 3 2 1 0 |
3735 + *       0 0 0 0   0 0 0 0
3736 + * Example:
3737 + *     DMAEND
3738 + *     00
3739 + ******************************************************************************/
3740 +int DMAC_DMAEND(int ch_num);
3741 +
3742 +/******************************************************************************
3743 + *
3744 + * Instruction:  DMAFLUSHP
3745 + * Description:
3746 + *     | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
3747 + *       <periph[4:0]   >  0  0  0    0  0  1  1    0  1  0  1
3748 + * Example:
3749 + *     DMAFLUSHP P0
3750 + *     35 00
3751 + ******************************************************************************/
3752 +#define DMAFLUSHP_INSTR_SIZE    2
3753 +int DMAC_DMAFLUSHP(int ch_num, int periph);
3754 +
3755 +/******************************************************************************
3756 + *
3757 + * Instruction:  DMAGO
3758 + * Description:
3759 + *     | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
3760 + *        0  0  0  0    0 <cn[2:0]>   1  0  1  0    0  0 ns  0
3761 + *
3762 + *     | 47                                                 16 |
3763 + *        <                     imm[31:0]                     >
3764 + * Example:
3765 + *     DMAGO  C0, 0x40000000
3766 + *     A0 00 00 00 00 40
3767 + ******************************************************************************/
3768 +int DMAC_DMAGO(int ch_num);
3769 +
3770 +/******************************************************************************
3771 + *
3772 + * Instruction:  DMALD
3773 + * Description:
3774 + *     | 7 6 5 4 |  3  2  1 0 |
3775 + *       0 0 0 0    0  1 bs x
3776 + * Example:
3777 + *     DMALD
3778 + *     04
3779 + ******************************************************************************/
3780 +#define DMALD_INSTR_SIZE    1
3781 +#define DMALDB_INSTR_SIZE   1
3782 +#define DMALDS_INSTR_SIZE   1
3783 +int DMAC_DMALD(int ch_num);
3784 +
3785 +int DMAC_DMALDB(int ch_num);
3786 +
3787 +int DMAC_DMALDS(int ch_num);
3788 +
3789 +/******************************************************************************
3790 + *
3791 + * Instruction:  DMALP
3792 + * Description:
3793 + *     | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
3794 + *       <       iter[7:0]       >    0  0  1  0    0  0 lc  0
3795 + * Example:
3796 + *     DMALP 8
3797 + *     20 07
3798 + ******************************************************************************/
3799 +#define DMALP_INSTR_SIZE    2
3800 +int DMAC_DMALP(int ch_num, int loop_reg_idx, int iter);
3801 +
3802 +/******************************************************************************
3803 + *
3804 + * Instruction:  DMALPEND
3805 + * Description:
3806 + *     | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
3807 + *       <  backwards_jump[7:0]  >    0  0  1 nf    1 lc bs  x
3808 + * Example:
3809 + *     DMALPEND
3810 + *     38 04
3811 + ******************************************************************************/
3812 +#define DMALPEND_INSTR_SIZE     2
3813 +int DMAC_DMALPEND(int ch_num, int loop_reg_idx, int jump, int lpfe);
3814 +
3815 +/******************************************************************************
3816 + *
3817 + * Instruction:  DMAMOV
3818 + * Description:
3819 + *     | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
3820 + *        0  0  0  0    0 <rd[2:0]>   1  0  1  1    1  1  0  0
3821 + *
3822 + *     | 47                                                 16 |
3823 + *        <                     imm[31:0]                     >
3824 + *
3825 + *      # CCR Description
3826 + *      # [30:28]  Endian swap size
3827 + *      # [27:25]  AWCACHE[3,1:0] value
3828 + *      # [24:22]  AWPROT value
3829 + *      # [21:18]  AWLEN value
3830 + *      # [17:15]  AWSIZE value
3831 + *      # [14]     AWBURST[0] value
3832 + *                 0 - FIXED / 1 - INCR
3833 + *      # [13:11]  ARCACHE[2:0] value
3834 + *      # [10:8]   ARPROT value
3835 + *      # [7:4]    ARLEN value
3836 + *      # [3:1]    ARSIZE value
3837 + *      # [0]      ARBURST[0] value
3838 + *                 0 - FIXED / 1 - INCR
3839 + * Example:
3840 + *     DMAMOV   CCR, SB1 SS32 DB1 DS32
3841 + *     BC 01 05 40 01 00
3842 + ******************************************************************************/
3843 +
3844 +#define DMAMOV_INSTR_SIZE   6
3845 +/* ccr_sar_dar: 0 for SAR, 1, for CCR, 2 for DAR */
3846 +typedef enum { SAR = 0, CCR = 1, DAR = 2 } dmamov_arg_t;
3847 +int DMAC_DMAMOV(int ch_num, dmamov_arg_t ccr_sar_dar, uint32_t value);
3848 +
3849 +#define DMAWMB_INSTR_SIZE  1
3850 +int DMAC_DMAWMB (int ch_num);
3851 +
3852 +#define DMANOP_INSTR_SIZE 1
3853 +int DMAC_DMANOP (int ch_num);
3854 +/******************************************************************************
3855 + *
3856 + * Instruction:  DMAST
3857 + * Description:
3858 + *     | 7 6 5 4 |  3  2  1 0 |
3859 + *       0 0 0 0    1  0 bs x
3860 + * Example:
3861 + *     DMAST
3862 + *     08
3863 + ******************************************************************************/
3864 +#define DMAST_INSTR_SIZE    1 /* 1 Byte */
3865 +int DMAC_DMAST(int ch_num);
3866 +
3867 +#define DMASTB_INSTR_SIZE   1 /* 1 Byte */
3868 +int DMAC_DMASTB(int ch_num);
3869 +
3870 +#define DMASTS_INSTR_SIZE   1 /* 1 Byte */
3871 +int DMAC_DMASTS(int ch_num);
3872 +
3873 +/******************************************************************************
3874 + *
3875 + * Instruction:  DMASTZ
3876 + * Description:
3877 + *     | 7 6 5 4 |  3  2  1 0 |
3878 + *       0 0 0 0    1  1  0 0
3879 + * Example:
3880 + *     DMASTZ
3881 + *     08
3882 + ******************************************************************************/
3883 +/* Not done */
3884 +
3885 +/******************************************************************************
3886 + *
3887 + * Instruction:  DMAWFE
3888 + * Description:
3889 + *     | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
3890 + *       <event_num[4:0]>  0  i  0    0  0  1  1    0  1  1  0
3891 + * Example:
3892 + *     DMAWFE E0
3893 + *     36 00
3894 + ******************************************************************************/
3895 +int DMAC_WFE(int ch_num, int event);
3896 +#define DMAWFE_INSTR_SIZE  2
3897 +
3898 +/******************************************************************************
3899 + *
3900 + * Instruction:  DMAWFP
3901 + * Description:
3902 + *     | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
3903 + *       <  periph[4:0] >  0  0  0    0  0  1  1    0  0 bs  p
3904 + * Example:
3905 + *     DMAWFP P0, periph
3906 + *     31 00
3907 + ******************************************************************************/
3908 +typedef enum { SINGLE = 0, BURST = 1, PERIPHERAL = 2} dmawfp_burst_type;
3909 +int DMAC_DMAWFP(int ch_num, int periph_id,dmawfp_burst_type b);
3910 +#define DMAWFP_INSTR_SIZE  2
3911 +
3912 +/******************************************************************************
3913 + *
3914 + * Instruction:  DMAKILL
3915 + * Description:
3916 + *     | 7 6 5 4 | 3 2 1 0 |
3917 + *       0 0 0 0   0 0 0 1
3918 + * Example:
3919 + *     DMAKILL
3920 + *     01
3921 + ******************************************************************************/
3922 +
3923 +/******************************************************************************
3924 + *
3925 + * Instruction:  DMASEV
3926 + * Description:
3927 + *     | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
3928 + *       <event_num[4:0]>  0  i  0    0  0  1  1    0  1  0  0
3929 + * Example:
3930 + *     DMASEV E0
3931 + *     34 00
3932 + ******************************************************************************/
3933 +int DMAC_DMASEV(int ch_num, int event_num);
3934 +#define DMASEV_INSTR_SIZE   2
3935 +
3936 +/******************************************************************************
3937 + *
3938 + * Instruction:  DMALDP<S|B>
3939 + * Description:
3940 + *     | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
3941 + *       <  periph[4:0] >  0  0  0    0  0  1  0    0  1 bs  1
3942 + * Example:
3943 + *     DMALDPS P0
3944 + *     25 00
3945 + ******************************************************************************/
3946 +int DMAC_DMALDP(int ch_num, int periph_id, int burst);
3947 +#define DMALDP_INSTR_SIZE 2
3948 +
3949 +/******************************************************************************
3950 + *
3951 + * Instruction:  DMASTP<S|B>
3952 + * Description:
3953 + *     | 15 14 13 12 | 11 10  9  8 |  7  6  5  4 |  3  2  1  0 |
3954 + *       <  periph[4:0] >  0  0  0    0  0  1  0    1  0 bs  1
3955 + * Example:
3956 + *     DMASTPS P0
3957 + *     29 00
3958 + ******************************************************************************/
3959 +int DMAC_DMASTP(int ch_num, int periph_id, int burst);
3960 +#define DMASTP_INSTR_SIZE 2
3961 +
3962 +#endif
3963 --- /dev/null
3964 +++ b/arch/arm/mach-cns3xxx/include/mach/entry-macro.S
3965 @@ -0,0 +1,105 @@
3966 +/*
3967 + *  arch/arm/mach-cns3xxx/include/mach/entry-macro.S
3968 + *
3969 + *  Low-level IRQ helper macros for Cavium Networks platforms
3970 + *
3971 + *  Copyright (c) 2008 Cavium Networks 
3972 + * 
3973 + *  This file is free software; you can redistribute it and/or modify 
3974 + *  it under the terms of the GNU General Public License, Version 2, as 
3975 + *  published by the Free Software Foundation. 
3976 + *
3977 + *  This file is distributed in the hope that it will be useful, 
3978 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
3979 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
3980 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
3981 + *
3982 + *  You should have received a copy of the GNU General Public License 
3983 + *  along with this file; if not, write to the Free Software 
3984 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
3985 + *  visit http://www.gnu.org/licenses/. 
3986 + *
3987 + *  This file may also be available under a different license from Cavium. 
3988 + *  Contact Cavium Networks for more information
3989 + */
3990 +#include <mach/hardware.h>
3991 +#include <asm/hardware/gic.h>
3992 +
3993 +               .macro  disable_fiq
3994 +               .endm
3995 +
3996 +               .macro  get_irqnr_preamble, base, tmp
3997 +               ldr     \base, =gic_cpu_base_addr
3998 +               ldr     \base, [\base]
3999 +               .endm
4000 +
4001 +               .macro  arch_ret_to_user, tmp1, tmp2
4002 +               .endm
4003 +
4004 +               /*
4005 +                * The interrupt numbering scheme is defined in the
4006 +                * interrupt controller spec.  To wit:
4007 +                *
4008 +                * Interrupts 0-15 are IPI
4009 +                * 16-28 are reserved
4010 +                * 29-31 are local.  We allow 30 to be used for the watchdog.
4011 +                * 32-1020 are global
4012 +                * 1021-1022 are reserved
4013 +                * 1023 is "spurious" (no interrupt)
4014 +                *
4015 +                * For now, we ignore all local interrupts so only return an interrupt if it's
4016 +                * between 30 and 1020.  The test_for_ipi routine below will pick up on IPIs.
4017 +                *
4018 +                * A simple read from the controller will tell us the number of the highest
4019 +                 * priority enabled interrupt.  We then just need to check whether it is in the
4020 +                * valid range for an IRQ (30-1020 inclusive).
4021 +                */
4022 +
4023 +               .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
4024 +
4025 +               ldr     \irqstat, [\base, #GIC_CPU_INTACK] /* bits 12-10 = src CPU, 9-0 = int # */
4026 +
4027 +               ldr     \tmp, =1021
4028 +
4029 +               bic     \irqnr, \irqstat, #0x1c00
4030 +
4031 +               cmp     \irqnr, #29
4032 +               cmpcc   \irqnr, \irqnr
4033 +               cmpne   \irqnr, \tmp
4034 +               cmpcs   \irqnr, \irqnr
4035 +
4036 +               .endm
4037 +
4038 +               /* We assume that irqstat (the raw value of the IRQ acknowledge
4039 +                * register) is preserved from the macro above.
4040 +                * If there is an IPI, we immediately signal end of interrupt on the
4041 +                * controller, since this requires the original irqstat value which
4042 +                * we won't easily be able to recreate later.
4043 +                */
4044 +
4045 +               .macro test_for_ipi, irqnr, irqstat, base, tmp
4046 +               bic     \irqnr, \irqstat, #0x1c00
4047 +               cmp     \irqnr, #16
4048 +               strcc   \irqstat, [\base, #GIC_CPU_EOI]
4049 +               cmpcs   \irqnr, \irqnr
4050 +               .endm
4051 +
4052 +               /* As above, this assumes that irqstat and base are preserved.. */
4053 +
4054 +               .macro test_for_ltirq, irqnr, irqstat, base, tmp
4055 +               bic     \irqnr, \irqstat, #0x1c00
4056 +               mov     \tmp, #0
4057 +               cmp     \irqnr, #29
4058 +               moveq   \tmp, #1
4059 +               streq   \irqstat, [\base, #GIC_CPU_EOI]
4060 +               cmp     \tmp, #0
4061 +               .endm
4062 +
4063 +               .macro test_for_cache_ipi, irqnr, irqstat, base, tmp
4064 +               bic     \irqnr, \irqstat, #0x1c00
4065 +               mov     \tmp, #0
4066 +               cmp     \irqnr, #1
4067 +               moveq   \tmp, #1
4068 +               streq   \irqstat, [\base, #GIC_CPU_EOI]
4069 +               cmp     \tmp, #0
4070 +               .endm
4071 --- /dev/null
4072 +++ b/arch/arm/mach-cns3xxx/include/mach/gpio.h
4073 @@ -0,0 +1,94 @@
4074 +/*
4075 + * arch/arm/mach-ixp4xx/include/mach/gpio.h
4076 + *
4077 + * IXP4XX GPIO wrappers for arch-neutral GPIO calls
4078 + *
4079 + * Written by Milan Svoboda <msvoboda@ra.rockwell.com>
4080 + * Based on PXA implementation by Philipp Zabel <philipp.zabel@gmail.com>
4081 + *
4082 + * This program is free software; you can redistribute it and/or modify
4083 + * it under the terms of the GNU General Public License as published by
4084 + * the Free Software Foundation; either version 2 of the License, or
4085 + * (at your option) any later version.
4086 + *
4087 + * This program is distributed in the hope that it will be useful,
4088 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
4089 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4090 + * GNU General Public License for more details.
4091 + *
4092 + * You should have received a copy of the GNU General Public License
4093 + * along with this program; if not, write to the Free Software
4094 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4095 + *
4096 + */
4097 +
4098 +#ifndef __ASM_ARCH_IXP4XX_GPIO_H
4099 +#define __ASM_ARCH_IXP4XX_GPIO_H
4100 +
4101 +#include <linux/kernel.h>
4102 +#include <mach/hardware.h>
4103 +#include <asm-generic/gpio.h>                  /* cansleep wrappers */
4104 +
4105 +#define NR_BUILTIN_GPIO 64
4106 +
4107 +#define CNS3XXX_GPIO_IN    0x0
4108 +#define CNS3XXX_GPIO_OUT   0x1
4109 +
4110 +#define CNS3XXX_GPIO_LO   0
4111 +#define CNS3XXX_GPIO_HI   1
4112 +
4113 +#define CNS3XXX_GPIO_OUTPUT         0x00
4114 +#define CNS3XXX_GPIO_INPUT          0x04
4115 +#define CNS3XXX_GPIO_DIR            0x08
4116 +#define CNS3XXX_GPIO_SET            0x10
4117 +#define CNS3XXX_GPIO_CLEAR          0x14
4118 +
4119 +static inline void gpio_line_get(u8 line, int *value)
4120 +{
4121 +       if (line < 32)
4122 +               *value = ((__raw_readl(CNS3XXX_GPIOA_BASE_VIRT + CNS3XXX_GPIO_INPUT) >> line) & 0x1);
4123 +       else
4124 +               *value = ((__raw_readl(CNS3XXX_GPIOB_BASE_VIRT + CNS3XXX_GPIO_INPUT) >> (line - 32)) & 0x1);
4125 +}
4126 +
4127 +static inline void gpio_line_set(u8 line, int value)
4128 +{
4129 +       if (line < 32) {
4130 +               if (value)
4131 +                       __raw_writel((1 << line), CNS3XXX_GPIOA_BASE_VIRT + CNS3XXX_GPIO_SET);
4132 +               else
4133 +                       __raw_writel((1 << line), CNS3XXX_GPIOA_BASE_VIRT + CNS3XXX_GPIO_CLEAR);
4134 +       } else {
4135 +               if (value)
4136 +                       __raw_writel((1 << line), CNS3XXX_GPIOB_BASE_VIRT + CNS3XXX_GPIO_SET);
4137 +               else
4138 +                       __raw_writel((1 << line), CNS3XXX_GPIOB_BASE_VIRT + CNS3XXX_GPIO_CLEAR);
4139 +       }
4140 +}
4141 +
4142 +static inline int gpio_get_value(unsigned gpio)
4143 +{
4144 +       if (gpio < NR_BUILTIN_GPIO)
4145 +       {
4146 +               int value;
4147 +               gpio_line_get(gpio, &value);
4148 +               return value;
4149 +       }
4150 +       else
4151 +               return __gpio_get_value(gpio);
4152 +}
4153 +
4154 +static inline void gpio_set_value(unsigned gpio, int value)
4155 +{
4156 +       if (gpio < NR_BUILTIN_GPIO)
4157 +               gpio_line_set(gpio, value);
4158 +       else
4159 +               __gpio_set_value(gpio, value);
4160 +}
4161 +
4162 +#define gpio_cansleep __gpio_cansleep
4163 +
4164 +extern int gpio_to_irq(int gpio);
4165 +extern int irq_to_gpio(int gpio);
4166 +
4167 +#endif
4168 --- /dev/null
4169 +++ b/arch/arm/mach-cns3xxx/include/mach/hardware.h
4170 @@ -0,0 +1,40 @@
4171 +/*
4172 + *  arch/arm/mach-cns3xxx/include/mach/hardware.h
4173 + *
4174 + *  This file contains the hardware definitions of the Cavium Networks boards.
4175 + *
4176 + *  Copyright (c) 2008 Cavium Networks 
4177 + *  Copyright (C) 2003 ARM Limited.
4178 + * 
4179 + *  This file is free software; you can redistribute it and/or modify 
4180 + *  it under the terms of the GNU General Public License, Version 2, as 
4181 + *  published by the Free Software Foundation. 
4182 + *
4183 + *  This file is distributed in the hope that it will be useful, 
4184 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
4185 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
4186 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
4187 + *
4188 + *  You should have received a copy of the GNU General Public License 
4189 + *  along with this file; if not, write to the Free Software 
4190 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
4191 + *  visit http://www.gnu.org/licenses/. 
4192 + *
4193 + *  This file may also be available under a different license from Cavium. 
4194 + *  Contact Cavium Networks for more information
4195 + */
4196 +
4197 +#ifndef __ASM_ARCH_HARDWARE_H
4198 +#define __ASM_ARCH_HARDWARE_H
4199 +
4200 +/* macro to get at IO space when running virtually */
4201 +#define PCIBIOS_MIN_IO         0x00000000
4202 +#define PCIBIOS_MIN_MEM                0x00000000
4203 +
4204 +#define pcibios_assign_all_busses()    0
4205 +
4206 +#include "board.h"
4207 +
4208 +#include "platform.h"
4209 +
4210 +#endif
4211 --- /dev/null
4212 +++ b/arch/arm/mach-cns3xxx/include/mach/io.h
4213 @@ -0,0 +1,41 @@
4214 +/*
4215 + *  arch/arm/mach-cns3xxx/include/mach/io.h
4216 + *
4217 + *  Copyright (c) 2008 Cavium Networks 
4218 + *  Copyright (C) 2003 ARM Limited
4219 + * 
4220 + *  This file is free software; you can redistribute it and/or modify 
4221 + *  it under the terms of the GNU General Public License, Version 2, as 
4222 + *  published by the Free Software Foundation. 
4223 + *
4224 + *  This file is distributed in the hope that it will be useful, 
4225 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
4226 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
4227 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
4228 + *
4229 + *  You should have received a copy of the GNU General Public License 
4230 + *  along with this file; if not, write to the Free Software 
4231 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
4232 + *  visit http://www.gnu.org/licenses/. 
4233 + *
4234 + *  This file may also be available under a different license from Cavium. 
4235 + *  Contact Cavium Networks for more information
4236 + */
4237 +#ifndef __ASM_ARM_ARCH_IO_H
4238 +#define __ASM_ARM_ARCH_IO_H
4239 +
4240 +#include "board.h"
4241 +
4242 +#define IO_SPACE_LIMIT 0xffffffff
4243 +
4244 +#if 1
4245 +static inline void __iomem *__io(unsigned long addr)
4246 +{
4247 +  return (void __iomem *)((addr - CNS3XXX_PCIE0_IO_BASE)
4248 +          + CNS3XXX_PCIE0_IO_BASE_VIRT);
4249 +}
4250 +#endif
4251 +#define __io(a)     __io(a)
4252 +#define __mem_pci(a)           (a)
4253 +
4254 +#endif
4255 --- /dev/null
4256 +++ b/arch/arm/mach-cns3xxx/include/mach/irqs.h
4257 @@ -0,0 +1,45 @@
4258 +/*
4259 + *  arch/arm/mach-cns3xxx/include/mach/irqs.h
4260 + *
4261 + *  Copyright (c) 2008 Cavium Networks 
4262 + *  Copyright (C) 2003 ARM Limited
4263 + *  Copyright (C) 2000 Deep Blue Solutions Ltd.
4264 + * 
4265 + *  This file is free software; you can redistribute it and/or modify 
4266 + *  it under the terms of the GNU General Public License, Version 2, as 
4267 + *  published by the Free Software Foundation. 
4268 + *
4269 + *  This file is distributed in the hope that it will be useful, 
4270 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
4271 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
4272 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
4273 + *
4274 + *  You should have received a copy of the GNU General Public License 
4275 + *  along with this file; if not, write to the Free Software 
4276 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
4277 + *  visit http://www.gnu.org/licenses/. 
4278 + *
4279 + *  This file may also be available under a different license from Cavium. 
4280 + *  Contact Cavium Networks for more information
4281 + */
4282 +
4283 +#ifndef __ASM_ARCH_IRQS_H
4284 +#define __ASM_ARCH_IRQS_H
4285 +
4286 +#include <mach/board.h>
4287 +
4288 +#define IRQ_LOCALTIMER         29
4289 +#define IRQ_LOCALWDOG          30
4290 +
4291 +#define IRQ_GIC_START          32
4292 +#define IRQ_CLCD                       44
4293 +
4294 +#ifdef CONFIG_CNS_RAID
4295 +#define        IRQ_CNS_RAID            (43)
4296 +#endif /* CONFIG_CNS_RAID */
4297 +
4298 +#ifndef NR_IRQS
4299 +#error "NR_IRQS not defined by the board-specific files"
4300 +#endif
4301 +
4302 +#endif
4303 --- /dev/null
4304 +++ b/arch/arm/mach-cns3xxx/include/mach/lm.h
4305 @@ -0,0 +1,32 @@
4306 +#include <linux/version.h>
4307 +
4308 +struct lm_device {
4309 +       struct device           dev;
4310 +       struct resource         resource;
4311 +       unsigned int            irq;
4312 +       unsigned int            id;
4313 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
4314 +       void                    *lm_drvdata;
4315 +#endif
4316 +};
4317 +
4318 +struct lm_driver {
4319 +       struct device_driver    drv;
4320 +       int                     (*probe)(struct lm_device *);
4321 +       void                    (*remove)(struct lm_device *);
4322 +       int                     (*suspend)(struct lm_device *, pm_message_t);
4323 +       int                     (*resume)(struct lm_device *);
4324 +};
4325 +
4326 +int lm_driver_register(struct lm_driver *drv);
4327 +void lm_driver_unregister(struct lm_driver *drv);
4328 +
4329 +int lm_device_register(struct lm_device *dev);
4330 +
4331 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
4332 +# define lm_get_drvdata(lm)    ((lm)->lm_drvdata)
4333 +# define lm_set_drvdata(lm,d)  do { (lm)->lm_drvdata = (d); } while (0)
4334 +#else
4335 +# define lm_get_drvdata(lm)    dev_get_drvdata(&(lm)->dev)
4336 +# define lm_set_drvdata(lm,d)  dev_set_drvdata(&(lm)->dev, d)
4337 +#endif
4338 --- /dev/null
4339 +++ b/arch/arm/mach-cns3xxx/include/mach/memory.h
4340 @@ -0,0 +1,43 @@
4341 +/*
4342 + *  arch/arm/mach-cns3xxx/include/mach/memory.h
4343 + *
4344 + *  Copyright (c) 2008 Cavium Networks 
4345 + *  Copyright (C) 2003 ARM Limited
4346 + * 
4347 + *  This file is free software; you can redistribute it and/or modify 
4348 + *  it under the terms of the GNU General Public License, Version 2, as 
4349 + *  published by the Free Software Foundation. 
4350 + *
4351 + *  This file is distributed in the hope that it will be useful, 
4352 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
4353 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
4354 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
4355 + *
4356 + *  You should have received a copy of the GNU General Public License 
4357 + *  along with this file; if not, write to the Free Software 
4358 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
4359 + *  visit http://www.gnu.org/licenses/. 
4360 + *
4361 + *  This file may also be available under a different license from Cavium. 
4362 + *  Contact Cavium Networks for more information
4363 + */
4364 +
4365 +#ifndef __ASM_ARCH_MEMORY_H
4366 +#define __ASM_ARCH_MEMORY_H
4367 +
4368 +/*
4369 + * Physical DRAM offset.
4370 + */
4371 +#define PHYS_OFFSET            UL(0x00000000)
4372 +
4373 +/*
4374 + * Virtual view <-> DMA view memory address translations
4375 + * virt_to_bus: Used to translate the virtual address to an
4376 + *              address suitable to be passed to set_dma_addr
4377 + * bus_to_virt: Used to convert an address for DMA operations
4378 + *              to an address that the kernel can use.
4379 + */
4380 +#define __virt_to_bus(x)       ((x) - PAGE_OFFSET)
4381 +#define __bus_to_virt(x)       ((x) + PAGE_OFFSET)
4382 +
4383 +#endif
4384 --- /dev/null
4385 +++ b/arch/arm/mach-cns3xxx/include/mach/misc.h
4386 @@ -0,0 +1,670 @@
4387 +/******************************************************************************
4388 + * MODULE NAME:    star_misc.h
4389 + * PROJECT CODE:   Vega
4390 + * DESCRIPTION:    
4391 + * MAINTAINER:     Jacky Hou
4392 + * DATE:           9 February 2009
4393 + *
4394 + * SOURCE CONTROL: 
4395 + *
4396 + * LICENSE:
4397 + *     This source code is copyright (c) 2008-2009 Cavium Networks Inc.
4398 + *     All rights reserved.
4399 + *
4400 + * REVISION HISTORY:
4401 + *
4402 + *
4403 + * SOURCE:
4404 + * ISSUES:
4405 + * NOTES TO USERS:
4406 + ******************************************************************************/
4407 +
4408 +#ifndef _CNS3XXX_MISC_H_
4409 +#define _CNS3XXX_MISC_H_
4410 +#include <mach/board.h>
4411 +#define MISC_MEM_MAP_VALUE(offset) (*((volatile unsigned int *)(CNS3XXX_MISC_BASE_VIRT + offset)))
4412 +
4413 +
4414 +/*
4415 + * define access macros
4416 + */
4417 +#define MISC_MEMORY_REMAP_REG                      MISC_MEM_MAP_VALUE(0x00)
4418 +#define MISC_CHIP_CONFIG_REG                       MISC_MEM_MAP_VALUE(0x04)
4419 +#define MISC_DEBUG_PROBE_DATA_REG                  MISC_MEM_MAP_VALUE(0x08)
4420 +#define MISC_DEBUG_PROBE_SELECTION_REG             MISC_MEM_MAP_VALUE(0x0C)
4421 +#define MISC_IO_PIN_FUNC_SELECTION_REG             MISC_MEM_MAP_VALUE(0x10)
4422 +#define MISC_GPIOA_PIN_ENABLE_REG                  MISC_MEM_MAP_VALUE(0x14)
4423 +#define MISC_GPIOB_PIN_ENABLE_REG                  MISC_MEM_MAP_VALUE(0x18)
4424 +#define MISC_IO_PAD_DRIVE_STRENGTH_CTRL_A          MISC_MEM_MAP_VALUE(0x1C)
4425 +#define MISC_IO_PAD_DRIVE_STRENGTH_CTRL_B          MISC_MEM_MAP_VALUE(0x20)
4426 +#define MISC_GPIOA_15_0_PULL_CTRL_REG                     MISC_MEM_MAP_VALUE(0x24)
4427 +#define MISC_GPIOA_16_31_PULL_CTRL_REG                    MISC_MEM_MAP_VALUE(0x28)
4428 +#define MISC_GPIOB_15_0_PULL_CTRL_REG              MISC_MEM_MAP_VALUE(0x2C)
4429 +#define MISC_GPIOB_16_31_PULL_CTRL_REG             MISC_MEM_MAP_VALUE(0x30)
4430 +#define MISC_IO_PULL_CTRL_REG                             MISC_MEM_MAP_VALUE(0x34)
4431 +#define MISC_E_FUSE_31_0_REG                       MISC_MEM_MAP_VALUE(0x40)
4432 +#define MISC_E_FUSE_63_32_REG                      MISC_MEM_MAP_VALUE(0x44)
4433 +#define MISC_E_FUSE_95_64_REG                      MISC_MEM_MAP_VALUE(0x48)
4434 +#define MISC_E_FUSE_127_96_REG                     MISC_MEM_MAP_VALUE(0x4C)
4435 +#define MISC_SOFTWARE_TEST_1_REG                   MISC_MEM_MAP_VALUE(0x50)
4436 +#define MISC_SOFTWARE_TEST_2_REG                   MISC_MEM_MAP_VALUE(0x54)
4437 +
4438 +
4439 +
4440 +// USB MISC
4441 +#define  MISC_USB_CFG_REG                        MISC_MEM_MAP_VALUE(0x800)
4442 +#define  MISC_USB_STS_REG                        MISC_MEM_MAP_VALUE(0x804)
4443 +#define  MISC_USBPHY00_CFG_REG                   MISC_MEM_MAP_VALUE(0x808)
4444 +#define  MISC_USBPHY01_CFG_REG                   MISC_MEM_MAP_VALUE(0x80c)
4445 +#define  MISC_USBPHY10_CFG_REG                   MISC_MEM_MAP_VALUE(0x810)
4446 +#define  MISC_USBPHY11_CFG_REG                   MISC_MEM_MAP_VALUE(0x814)
4447 +
4448 +#define MISC_PCIEPHY_CMCTL0_REG                                MISC_MEM_MAP_VALUE(0x900)
4449 +#define MISC_PCIEPHY_CMCTL1_REG                                MISC_MEM_MAP_VALUE(0x904)
4450 +
4451 +#define MISC_PCIEPHY0_CTL_REG                          MISC_MEM_MAP_VALUE(0x940)
4452 +#define MISC_PCIE0_AXIS_AWMISC_REG                     MISC_MEM_MAP_VALUE(0x944)
4453 +#define MISC_PCIE0_AXIS_ARMISC_REG                     MISC_MEM_MAP_VALUE(0x948)
4454 +#define MISC_PCIE0_AXIS_RMISC_REG                      MISC_MEM_MAP_VALUE(0x94C)
4455 +#define MISC_PCIE0_AXIS_BMISC_REG                      MISC_MEM_MAP_VALUE(0x950)
4456 +#define MISC_PCIE0_AXIM_RMISC_REG                      MISC_MEM_MAP_VALUE(0x954)
4457 +#define MISC_PCIE0_AXIM_BMISC_REG                      MISC_MEM_MAP_VALUE(0x958)
4458 +#define MISC_PCIE0_CTRL_REG                            MISC_MEM_MAP_VALUE(0x95C)
4459 +#define MISC_PCIE0_PM_DEBUG_REG                                MISC_MEM_MAP_VALUE(0x960)
4460 +#define MISC_PCIE0_RFC_DEBUG_REG                       MISC_MEM_MAP_VALUE(0x964)
4461 +#define MISC_PCIE0_CXPL_DEBUGL_REG                     MISC_MEM_MAP_VALUE(0x968)
4462 +#define MISC_PCIE0_CXPL_DEBUGH_REG                     MISC_MEM_MAP_VALUE(0x96C)
4463 +#define MISC_PCIE0_DIAG_DEBUGH_REG                     MISC_MEM_MAP_VALUE(0x970)
4464 +#define MISC_PCIE0_W1CLR_REG                           MISC_MEM_MAP_VALUE(0x974)
4465 +#define MISC_PCIE0_INT_MASK_REG                                MISC_MEM_MAP_VALUE(0x978)
4466 +#define MISC_PCIE0_INT_STATUS_REG                      MISC_MEM_MAP_VALUE(0x97C)
4467 +
4468 +#define MISC_PCIEPHY1_CTL_REG                           MISC_MEM_MAP_VALUE(0xa40)
4469 +#define MISC_PCIE1_AXIS_AWMISC_REG                      MISC_MEM_MAP_VALUE(0xa44)
4470 +#define MISC_PCIE1_AXIS_ARMISC_REG                      MISC_MEM_MAP_VALUE(0xa48)
4471 +#define MISC_PCIE1_AXIS_RMISC_REG                       MISC_MEM_MAP_VALUE(0xa4C)
4472 +#define MISC_PCIE1_AXIS_BMISC_REG                       MISC_MEM_MAP_VALUE(0xa50)
4473 +#define MISC_PCIE1_AXIM_RMISC_REG                       MISC_MEM_MAP_VALUE(0xa54)
4474 +#define MISC_PCIE1_AXIM_BMISC_REG                       MISC_MEM_MAP_VALUE(0xa58)
4475 +#define MISC_PCIE1_CTRL_REG                             MISC_MEM_MAP_VALUE(0xa5C)
4476 +#define MISC_PCIE1_PM_DEBUG_REG                         MISC_MEM_MAP_VALUE(0xa60)
4477 +#define MISC_PCIE1_RFC_DEBUG_REG                        MISC_MEM_MAP_VALUE(0xa64)
4478 +#define MISC_PCIE1_CXPL_DEBUGL_REG                      MISC_MEM_MAP_VALUE(0xa68)
4479 +#define MISC_PCIE1_CXPL_DEBUGH_REG                      MISC_MEM_MAP_VALUE(0xa6C)
4480 +#define MISC_PCIE1_DIAG_DEBUGH_REG                      MISC_MEM_MAP_VALUE(0xa70)
4481 +#define MISC_PCIE1_W1CLR_REG                            MISC_MEM_MAP_VALUE(0xa74)
4482 +#define MISC_PCIE1_INT_MASK_REG                         MISC_MEM_MAP_VALUE(0xa78)
4483 +#define MISC_PCIE1_INT_STATUS_REG                       MISC_MEM_MAP_VALUE(0xa7C)
4484 +
4485 +
4486 +
4487 +
4488 +
4489 +
4490 +/*
4491 + * define constants macros
4492 + */
4493 +#define MISC_PARALLEL_FLASH_BOOT             (0x0)
4494 +#define MISC_SPI_SERIAL_FLASH_BOOT           (0x1)
4495 +#define MISC_NAND_FLASH_BOOT                 (0x2)
4496 +
4497 +#define MISC_ALIGN_LITTLE_ENDIAN                   (0x0)
4498 +#define MISC_UNALIGN_LITTLE_ENDIAN                 (0x2)
4499 +#define MISC_UNALIGN_BIG_ENDIAN                    (0x3)
4500 +
4501 +#define MISC_CPU_CLOCK_333_MHZ               (0)
4502 +#define MISC_CPU_CLOCK_366_MHZ               (1)
4503 +#define MISC_CPU_CLOCK_400_MHZ               (2)
4504 +#define MISC_CPU_CLOCK_433_MHZ               (3)
4505 +#define MISC_CPU_CLOCK_466_MHZ               (4)
4506 +#define MISC_CPU_CLOCK_500_MHZ               (5)
4507 +#define MISC_CPU_CLOCK_533_MHZ               (6)
4508 +#define MISC_CPU_CLOCK_566_MHZ               (7)
4509 +#define MISC_CPU_CLOCK_600_MHZ               (8)
4510 +#define MISC_CPU_CLOCK_633_MHZ               (9)
4511 +#define MISC_CPU_CLOCK_666_MHZ               (10)
4512 +#define MISC_CPU_CLOCK_700_MHZ               (11)
4513 +
4514 +/*
4515 + * Macro-defines for shared pins with GPIO_A
4516 + */
4517 +#if 0
4518 +#define MISC_LCD_PWR_PIN                     ((0x1 << 0))
4519 +#define MISC_CIM_OE_PIN                      ((0x1 << 1))
4520 +
4521 +#define MISC_SMC_PINS                        ((0x1 << 2) | (0x1 << 3) | (0x1 << 4) | (0x1 << 5)| (0x1 << 6))
4522 +#define MISC_SMC_CS3_PIN                     ((0x1 << 2))
4523 +#define MISC_SMC_CS2_PIN                     ((0x1 << 3))
4524 +#define MISC_SMC_CLK_PIN                     ((0x1 << 4))
4525 +#define MISC_SMC_ADV_PIN                     ((0x1 << 5))
4526 +#define MISC_SMC_CRE_PIN                     ((0x1 << 6))
4527 +
4528 +
4529 +#define MISC_NFI_PINS                        ((0x1 << 7) | (0x1 << 8) | (0x1 << 9) | (0x1 << 10)| (0x1 << 11))
4530 +#define MISC_NFI_BUSY_PIN                    ((0x1 << 7))
4531 +#define MISC_NFI_CS3_PIN                     ((0x1 << 8))
4532 +#define MISC_NFI_CS2_PIN                     ((0x1 << 9))
4533 +#define MISC_NFI_CE1_PIN                     ((0x1 << 10))
4534 +#define MISC_NFI_CE0_PIN                     ((0x1 << 11))
4535 +
4536 +#define MISC_EXT_INT2_PIN                    ((0x1 << 12))
4537 +#define MISC_EXT_INT1_PIN                    ((0x1 << 13))
4538 +#define MISC_EXT_INT0_PIN                    ((0x1 << 14))
4539 +
4540 +
4541 +#define MISC_UART0_PINS                      ((0x1 << 15) | (0x1 << 16) | (0x1 << 17) | (0x1 << 18))
4542 +#define MISC_UART0_RTS_PIN                   ((0x1 << 15))
4543 +#define MISC_UART0_CTS_PIN                   ((0x1 << 16))
4544 +#define MISC_UART0_TXD_PIN                   ((0x1 << 17))
4545 +#define MISC_UART0_RXD_PIN                   ((0x1 << 18))
4546 +
4547 +#define MISC_UART1_PINS                      ((0x1 << 19) | (0x1 << 20) | (0x1 << 21) | (0x1 << 22))
4548 +#define MISC_UART1_RTS_PIN                   ((0x1 << 19))
4549 +#define MISC_UART1_CTS_PIN                   ((0x1 << 20))
4550 +#define MISC_UART1_RXD_PIN                   ((0x1 << 21))
4551 +#define MISC_UART1_TXD_PIN                   ((0x1 << 22))
4552 +
4553 +#define MISC_UART2_PINS                      ((0x1 << 23) | (0x1 << 24))
4554 +#define MISC_UART2_RXD_PIN                   ((0x1 << 23))
4555 +#define MISC_UART2_TXD_PIN                   ((0x1 << 24))
4556 +
4557 +#define MISC_PCM_PINS                        ((0x1 << 25) | (0x1 << 26) | (0x1 << 27) | (0x1 << 28))
4558 +#define MISC_PCM_CLK_PIN                     ((0x1 << 25))
4559 +#define MISC_PCM_FS_PIN                      ((0x1 << 26))
4560 +#define MISC_PCM_DT_PIN                      ((0x1 << 27))
4561 +#define MISC_PCM_DR_PIN                      ((0x1 << 28))
4562 +
4563 +#define MISC_SPI_CS1_PIN                     ((0x1 << 29))
4564 +#define MISC_SPI_CS0_PIN                     ((0x1 << 30))
4565 +#define MISC_SPI_CLK_PIN                     ((0x1 << 31))
4566 +#else
4567 +#define MISC_SD_PWR_ON_PIN                   ((0x1 << 2))
4568 +#define MISC_OTG_DRVVBUS_PIN                 ((0x1 << 3))
4569 +#define MISC_CIM_OE_PIN                      ((0x1 << 8))
4570 +#define MISC_LCD_PWR_PIN                     ((0x1 << 9))
4571 +#define MISC_SMC_CS3_PIN                     ((0x1 << 10))
4572 +#define MISC_SMC_CS2_PIN                     ((0x1 << 11))
4573 +#define MISC_SMC_CLK_PIN                     ((0x1 << 12))
4574 +#define MISC_SMC_ADV_PIN                     ((0x1 << 13))
4575 +#define MISC_SMC_CRE_PIN                     ((0x1 << 14))
4576 +#define MISC_SMC_ADDR_26_PIN                 ((0x1 << 15))
4577 +
4578 +#define MISC_SD_nCD_PIN                     ((0x1 << 16))
4579 +#define MISC_SD_nWP_PIN                     ((0x1 << 17))
4580 +#define MISC_SD_CLK_PIN                     ((0x1 << 18))
4581 +#define MISC_SD_CMD_PIN                     ((0x1 << 19))
4582 +#define MISC_SD_DT7_PIN                     ((0x1 << 20))
4583 +#define MISC_SD_DT6_PIN                     ((0x1 << 21))
4584 +#define MISC_SD_DT5_PIN                     ((0x1 << 22))
4585 +#define MISC_SD_DT4_PIN                     ((0x1 << 23))
4586 +#define MISC_SD_DT3_PIN                     ((0x1 << 24))
4587 +#define MISC_SD_DT2_PIN                     ((0x1 << 25))
4588 +#define MISC_SD_DT1_PIN                     ((0x1 << 26))
4589 +#define MISC_SD_DT0_PIN                     ((0x1 << 27))
4590 +#define MISC_SD_LED_PIN                     ((0x1 << 28))
4591 +
4592 +#define MISC_UR_RXD1_PIN                    ((0x1 << 29))
4593 +#define MISC_UR_TXD1_PIN                    ((0x1 << 30))
4594 +#define MISC_UR_RTS2_PIN                    ((0x1 << 31))
4595 +
4596 +#endif
4597 +
4598 +
4599 +/*
4600 + * Macro-defines for shared pins with GPIO_B
4601 + */
4602 +#if 0
4603 +#define MISC_SPI_DT_PIN                     ((0x1 << 0))
4604 +#define MISC_SPI_DR_PIN                     ((0x1 << 1))
4605 +
4606 +#define MISC_SD_CD_PIN                      ((0x1 << 2))
4607 +#define MISC_SD_WP_PIN                      ((0x1 << 3))
4608 +#define MISC_SD_CLK_PIN                     ((0x1 << 4))
4609 +#define MISC_SD_CMD_PIN                     ((0x1 << 5))
4610 +#define MISC_SD_DT7_PIN                     ((0x1 << 6))
4611 +#define MISC_SD_DT6_PIN                     ((0x1 << 7))
4612 +#define MISC_SD_DT5_PIN                     ((0x1 << 8))
4613 +#define MISC_SD_DT4_PIN                     ((0x1 << 9))
4614 +#define MISC_SD_DT3_PIN                     ((0x1 << 10))
4615 +#define MISC_SD_DT2_PIN                     ((0x1 << 11))
4616 +#define MISC_SD_DT1_PIN                     ((0x1 << 12))
4617 +#define MISC_SD_DT0_PIN                     ((0x1 << 13))
4618 +#define MISC_SD_LED_PIN                     ((0x1 << 14))
4619 +
4620 +
4621 +#define MISC_I2S_CLK_PIN                     ((0x1 << 15))
4622 +#define MISC_I2S_FS_PIN                      ((0x1 << 16))
4623 +#define MISC_I2S_DT_PIN                      ((0x1 << 17))
4624 +#define MISC_I2S_DR_PIN                      ((0x1 << 18))
4625 +
4626 +//Tim.Liao modify
4627 +#define MISC_I2C_SCL_PIN                     ((0x1 << 19))
4628 +#define MISC_I2C_SDA_PIN                     ((0x1 << 20))
4629 +
4630 +#define MISC_GSW_P2_CRS_PIN                  ((0x1 << 21))
4631 +#define MISC_GSW_P2_COL_PIN                  ((0x1 << 22))
4632 +#define MISC_GSW_P1_CRS_PIN                  ((0x1 << 23))
4633 +#define MISC_GSW_P1_COL_PIN                  ((0x1 << 24))
4634 +#define MISC_GSW_P0_CRS_PIN                  ((0x1 << 25))
4635 +#define MISC_GSW_P0_COL_PIN                  ((0x1 << 26))
4636 +
4637 +#define MISC_GSW_MDC_PIN                     ((0x1 << 27))
4638 +#define MISC_GSW_MDIO_PIN                    ((0x1 << 28))
4639 +
4640 +#define MISC_CLOCK_OUTPUT_PIN                ((0x1 << 29))
4641 +
4642 +#define MISC_SATA_LED1_PIN                   ((0x1 << 30))
4643 +#define MISC_SATA_LED0_PIN                   ((0x1 << 31))
4644 +#else
4645 +#define MISC_UR_CTS2_PIN                    ((0x1 << 0))
4646 +#define MISC_UR_RXD2_PIN                    ((0x1 << 1))
4647 +#define MISC_UR_TXD2_PIN                    ((0x1 << 2))
4648 +#define MISC_PCMCLK_PIN                     ((0x1 << 3))
4649 +#define MISC_PCMFS_PIN                     ((0x1 << 4))
4650 +#define MISC_PCMDT_PIN                     ((0x1 << 5))
4651 +#define MISC_PCMDR_PIN                     ((0x1 << 6))
4652 +#define MISC_PCM_PINS                                          (MISC_PCMCLK_PIN|MISC_PCMFS_PIN|MISC_PCMDT_PIN|MISC_PCMDR_PIN)
4653 +
4654 +#define MISC_SPInCS1_PIN                     ((0x1 << 7))
4655 +#define MISC_SPInCS0_PIN                     ((0x1 << 8))
4656 +#define MISC_SPICLK_PIN                      ((0x1 << 9))
4657 +#define MISC_SPIDT_PIN                      ((0x1 << 10))
4658 +#define MISC_SPIDR_PIN                      ((0x1 << 11))
4659 +
4660 +#define MISC_I2C_SCL_PIN                     ((0x1 << 12))
4661 +#define MISC_I2C_SDA_PIN                     ((0x1 << 13))
4662 +
4663 +#define MISC_GSW_P2_CRS_PIN                  ((0x1 << 14))
4664 +#define MISC_GSW_P2_COL_PIN                  ((0x1 << 15))
4665 +#define MISC_GSW_P1_CRS_PIN                  ((0x1 << 16))
4666 +#define MISC_GSW_P1_COL_PIN                  ((0x1 << 17))
4667 +#define MISC_GSW_P0_CRS_PIN                  ((0x1 << 18))
4668 +#define MISC_GSW_P0_COL_PIN                  ((0x1 << 19))
4669 +
4670 +#define MISC_GSW_MDC_PIN                     ((0x1 << 20))
4671 +#define MISC_GSW_MDIO_PIN                    ((0x1 << 21))
4672 +
4673 +#define MISC_I2S_CLK_PIN                     (0x1 << 22)
4674 +#define MISC_I2S_FS_PIN                      (0x1 << 23)
4675 +#define MISC_I2S_DT_PIN                      (0x1 << 24)
4676 +#define MISC_I2S_DR_PIN                      (0x1 << 25)
4677 +
4678 +#define MISC_CLOCK_OUTPUT_PIN                ((0x1 << 26))
4679 +
4680 +#define MISC_EXT_INT2_PIN                    ((0x1 << 27))
4681 +#define MISC_EXT_INT1_PIN                    ((0x1 << 28))
4682 +#define MISC_EXT_INT0_PIN                    ((0x1 << 29))
4683 +
4684 +#define MISC_SATA_LED1_PIN                   ((0x1 << 30))
4685 +#define MISC_SATA_LED0_PIN                   ((0x1 << 31))
4686 +
4687 +#define MISC_CLOCK_OUTPUT_PIN                ((0x1 << 26))
4688 +
4689 +#define MISC_EXT_INT2_PIN                    ((0x1 << 27))
4690 +#define MISC_EXT_INT1_PIN                    ((0x1 << 28))
4691 +#define MISC_EXT_INT0_PIN                    ((0x1 << 29))
4692 +
4693 +#define MISC_SATA_LED1_PIN                   ((0x1 << 30))
4694 +#define MISC_SATA_LED0_PIN                   ((0x1 << 31))
4695 +
4696 +#define MISC_CLOCK_OUTPUT_PIN                ((0x1 << 26))
4697 +
4698 +#define MISC_EXT_INT2_PIN                    ((0x1 << 27))
4699 +#define MISC_EXT_INT1_PIN                    ((0x1 << 28))
4700 +#define MISC_EXT_INT0_PIN                    ((0x1 << 29))
4701 +
4702 +#define MISC_SATA_LED1_PIN                   ((0x1 << 30))
4703 +#define MISC_SATA_LED0_PIN                   ((0x1 << 31))
4704 +
4705 +#define MISC_CLOCK_OUTPUT_PIN                ((0x1 << 26))
4706 +
4707 +#define MISC_EXT_INT2_PIN                    ((0x1 << 27))
4708 +#define MISC_EXT_INT1_PIN                    ((0x1 << 28))
4709 +#define MISC_EXT_INT0_PIN                    ((0x1 << 29))
4710 +
4711 +#define MISC_SATA_LED1_PIN                   ((0x1 << 30))
4712 +#define MISC_SATA_LED0_PIN                   ((0x1 << 31))
4713 +
4714 +#define MISC_CLOCK_OUTPUT_PIN                ((0x1 << 26))
4715 +
4716 +#define MISC_EXT_INT2_PIN                    ((0x1 << 27))
4717 +#define MISC_EXT_INT1_PIN                    ((0x1 << 28))
4718 +#define MISC_EXT_INT0_PIN                    ((0x1 << 29))
4719 +
4720 +#define MISC_SATA_LED1_PIN                   ((0x1 << 30))
4721 +#define MISC_SATA_LED0_PIN                   ((0x1 << 31))
4722 +
4723 +#define MISC_CLOCK_OUTPUT_PIN                ((0x1 << 26))
4724 +
4725 +#define MISC_EXT_INT2_PIN                    ((0x1 << 27))
4726 +#define MISC_EXT_INT1_PIN                    ((0x1 << 28))
4727 +#define MISC_EXT_INT0_PIN                    ((0x1 << 29))
4728 +
4729 +#define MISC_SATA_LED1_PIN                   ((0x1 << 30))
4730 +#define MISC_SATA_LED0_PIN                   ((0x1 << 31))
4731 +
4732 +#define MISC_CLOCK_OUTPUT_PIN                ((0x1 << 26))
4733 +
4734 +#define MISC_EXT_INT2_PIN                    ((0x1 << 27))
4735 +#define MISC_EXT_INT1_PIN                    ((0x1 << 28))
4736 +#define MISC_EXT_INT0_PIN                    ((0x1 << 29))
4737 +
4738 +#define MISC_SATA_LED1_PIN                   ((0x1 << 30))
4739 +#define MISC_SATA_LED0_PIN                   ((0x1 << 31))
4740 +
4741 +#endif
4742 +/*
4743 + * Other defines
4744 + */
4745 +#define MISC_GPIOA_PIN_0                     (0)
4746 +#define MISC_GPIOA_PIN_1                     (1)
4747 +#define MISC_GPIOA_PIN_2                     (2)
4748 +#define MISC_GPIOA_PIN_3                     (3)
4749 +#define MISC_GPIOA_PIN_4                     (4)
4750 +#define MISC_GPIOA_PIN_5                     (5)
4751 +#define MISC_GPIOA_PIN_6                     (6)
4752 +#define MISC_GPIOA_PIN_7                     (7)
4753 +#define MISC_GPIOA_PIN_8                     (8)
4754 +#define MISC_GPIOA_PIN_9                     (9)
4755 +#define MISC_GPIOA_PIN_10                    (10)
4756 +#define MISC_GPIOA_PIN_11                    (11)
4757 +#define MISC_GPIOA_PIN_12                    (12)
4758 +#define MISC_GPIOA_PIN_13                    (13)
4759 +#define MISC_GPIOA_PIN_14                    (14)
4760 +#define MISC_GPIOA_PIN_15                    (15)
4761 +
4762 +
4763 +#define MISC_GPIOA_RESISTOR_PULL_DOWN        (1)
4764 +#define MISC_GPIOA_RESISTOR_PULL_UP          (1)
4765 +
4766 +
4767 +
4768 +/*
4769 + * function declarations
4770 + */
4771 +
4772 +
4773 +/*
4774 + * macro declarations
4775 + */
4776 +#define HAL_MISC_GET_SYSTEM_ALIGN_ENDIAN_MODE(mode) \
4777 +{ \
4778 +    (mode) = (MISC_CHIP_CONFIG_REG) & 0x3; \
4779 +}
4780 +
4781 +
4782 +#define HAL_MISC_GET_SYSTEM_CPU_CLOCK(cpu_clock) \
4783 +{ \
4784 +    (cpu_clock) = (MISC_CHIP_CONFIG_REG >> 5) & 0xF; \
4785 +}
4786 +
4787 +
4788 +#define HAL_MISC_ENABLE_SPI_SERIAL_FLASH_BANK_ACCESS() \
4789 +{ \
4790 +    (MISC_CHIP_CONFIG_REG) |= (0x1 << 16); \
4791 +}
4792 +
4793 +#define HAL_MISC_DISABLE_SPI_SERIAL_FLASH_BANK_ACCESS() \
4794 +{ \
4795 +    (MISC_CHIP_CONFIG_REG) &= ~(0x1 << 16); \
4796 +}
4797 +
4798 +
4799 +/*
4800 + * Macro defines for GPIOA and GPIOB Pin Enable Register
4801 + */
4802 +#define HAL_MISC_ENABLE_EXT_INT0_PIN() \
4803 +{ \
4804 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_EXT_INT0_PIN); \
4805 +}
4806 +
4807 +#define HAL_MISC_DISABLE_EXT_INT1_PIN() \
4808 +{ \
4809 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_EXT_INT1_PIN); \
4810 +}
4811 +
4812 +#define HAL_MISC_ENABLE_EXT_INT2_PIN() \
4813 +{ \
4814 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_EXT_INT2_PIN); \
4815 +}
4816 +
4817 +#define HAL_MISC_DISABLE_EXT_INT2_PIN() \
4818 +{ \
4819 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_EXT_INT2_PIN); \
4820 +}
4821 +
4822 +#define HAL_MISC_ENABLE_EXT_INT1_PIN() \
4823 +{ \
4824 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_EXT_INT1_PIN); \
4825 +}
4826 +
4827 +#define HAL_MISC_DISABLE_EXT_INT0_PIN() \
4828 +{ \
4829 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_EXT_INT0_PIN); \
4830 +}
4831 +
4832 +
4833 +#define HAL_MISC_ENABLE_PCM_PINS() \
4834 +{ \
4835 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_PCM_PINS); \
4836 +}
4837 +
4838 +#define HAL_MISC_DISABLE_PCM_PINS() \
4839 +{ \
4840 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_PCM_PINS); \
4841 +}
4842 +
4843 +
4844 +#define HAL_MISC_ENABLE_CIM_OE_PIN() \
4845 +{ \
4846 +    (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_CIM_OE_PIN); \
4847 +}
4848 +
4849 +#define HAL_MISC_DISABLE_CIM_OE_PIN() \
4850 +{ \
4851 +    (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_CIM_OE_PIN); \
4852 +}
4853 +
4854 +
4855 +#define HAL_MISC_ENABLE_LCD_PWR_PIN() \
4856 +{ \
4857 +    (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_LCD_PWR_PIN); \
4858 +}
4859 +
4860 +#define HAL_MISC_DISABLE_LCD_PWR_PIN() \
4861 +{ \
4862 +    (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_LCD_PWR_PIN); \
4863 +}
4864 +
4865 +
4866 +#define HAL_MISC_ENABLE_NFI_PINS() \
4867 +{ \
4868 +    (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_NFI_PINS); \
4869 +}
4870 +
4871 +#define HAL_MISC_DISABLE_NFI_PINS() \
4872 +{ \
4873 +    (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_NFI_PINS); \
4874 +}
4875 +
4876 +
4877 +
4878 +#define HAL_MISC_ENABLE_SMC_PINS() \
4879 +{ \
4880 +    (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SMC_PINS); \
4881 +}
4882 +
4883 +#define HAL_MISC_DISABLE_SMC_PINS() \
4884 +{ \
4885 +    (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SMC_PINS); \
4886 +}
4887 +
4888 +#define HAL_MISC_ENABLE_UART0_PINS() \
4889 +{ \
4890 +    (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_UART0_PINS); \
4891 +}
4892 +
4893 +#define HAL_MISC_DISABLE_UART0_PINS() \
4894 +{ \
4895 +    (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_UART0_PINS); \
4896 +}
4897 +
4898 +#define HAL_MISC_ENABLE_UART1_PINS() \
4899 +{ \
4900 +    (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_UART1_PINS); \
4901 +}
4902 +
4903 +#define HAL_MISC_DISABLE_UART1_PINS() \
4904 +{ \
4905 +    (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_UART1_PINS); \
4906 +}
4907 +
4908 +#define HAL_MISC_ENABLE_UART2_PINS() \
4909 +{ \
4910 +    (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_UART2_PINS); \
4911 +}
4912 +
4913 +#define HAL_MISC_DISABLE_UART2_PINS() \
4914 +{ \
4915 +    (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_UART2_PINS); \
4916 +}
4917 +
4918 +
4919 +
4920 +
4921 +
4922 +/*
4923 + * Macro-defines for GPIO_B
4924 + */
4925 +#define HAL_MISC_ENABLE_SPI_PINS() \
4926 +{ \
4927 +       (MISC_GPIOB_PIN_ENABLE_REG) |= \
4928 +                                                       (MISC_SPInCS1_PIN | MISC_SPInCS0_PIN | \
4929 +                                                       MISC_SPICLK_PIN | MISC_SPIDT_PIN | MISC_SPIDR_PIN); \
4930 +}
4931 +
4932 +#define HAL_MISC_DISABLE_SPI_PINS() \
4933 +{ \
4934 +       (MISC_GPIOB_PIN_ENABLE_REG) &= \
4935 +                                                       ~(MISC_SPInCS1_PIN | MISC_SPInCS0_PIN | \
4936 +                                                       MISC_SPICLK_PIN | MISC_SPIDT_PIN | MISC_SPIDR_PIN); \
4937 +}
4938 +
4939 +#define HAL_MISC_ENABLE_SD_PINS() \
4940 +{ \
4941 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_SD_CD_PIN | MISC_SD_WP_PIN | MISC_SD_CLK_PIN |MISC_SD_CMD_PIN |MISC_SD_DT7_PIN|MISC_SD_DT6_PIN | \
4942 +                                    MISC_SD_DT5_PIN | MISC_SD_DT4_PIN |MISC_SD_DT3_PIN | MISC_SD_DT2_PIN| MISC_SD_DT1_PIN | MISC_SD_DT0_PIN | MISC_SD_LED_PIN); \
4943 +}
4944 +
4945 +#define HAL_MISC_DISABLE_SD_PINS() \
4946 +{ \
4947 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_SD_CD_PIN | MISC_SD_WP_PIN | MISC_SD_CLK_PIN |MISC_SD_CMD_PIN |MISC_SD_DT7_PIN|MISC_SD_DT6_PIN |\
4948 +                                    MISC_SD_DT5_PIN | MISC_SD_DT4_PIN |MISC_SD_DT3_PIN | MISC_SD_DT2_PIN| MISC_SD_DT1_PIN | MISC_SD_DT0_PIN | MISC_SD_LED_PIN); \
4949 +}
4950 +
4951 +
4952 +#define HAL_MISC_ENABLE_I2S_PINS() \
4953 +{ \
4954 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_I2S_CLK_PIN | MISC_I2S_FS_PIN | MISC_I2S_DT_PIN |MISC_I2S_DR_PIN |MISC_I2S_DR_PIN); \
4955 +}
4956 +
4957 +#define HAL_MISC_DISABLE_I2S_PINS() \
4958 +{ \
4959 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_I2S_CLK_PIN | MISC_I2S_FS_PIN | MISC_I2S_DT_PIN |MISC_I2S_DR_PIN |MISC_I2S_DR_PIN); \
4960 +}
4961 +
4962 +//Tim.Liao modify I2C pin
4963 +#define HAL_MISC_ENABLE_I2C_PINS() \
4964 +{ \
4965 +    (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_I2C_SCL_PIN | MISC_I2C_SDA_PIN); \
4966 +}
4967 +
4968 +#define HAL_MISC_DISABLE_I2C_PINS() \
4969 +{ \
4970 +    (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_I2C_SCL_PIN | MISC_I2C_SDA_PIN); \
4971 +}
4972 +
4973 +#define HAL_MISC_ENABLE_GSW_P2_CRS_COL_PINS() \
4974 +{ \
4975 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_GSW_P2_CRS_PIN | MISC_GSW_P2_COL_PIN); \
4976 +}
4977 +
4978 +#define HAL_MISC_DISABLE_GSW_P2_CRS_COL_PINS() \
4979 +{ \
4980 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_GSW_P2_CRS_PIN | MISC_GSW_P2_COL_PIN); \
4981 +}
4982 +
4983 +
4984 +#define HAL_MISC_ENABLE_GSW_P1_CRS_COL_PINS() \
4985 +{ \
4986 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_GSW_P1_CRS_PIN | MISC_GSW_P1_COL_PIN); \
4987 +}
4988 +
4989 +#define HAL_MISC_DISABLE_GSW_P1_CRS_COL_PINS() \
4990 +{ \
4991 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_GSW_P1_CRS_PIN | MISC_GSW_P1_COL_PIN); \
4992 +}
4993 +
4994 +
4995 +
4996 +#define HAL_MISC_ENABLE_GSW_P0_CRS_COL_PINS() \
4997 +{ \
4998 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_GSW_P0_CRS_PIN | MISC_GSW_P0_COL_PIN); \
4999 +}
5000 +
5001 +#define HAL_MISC_DISABLE_GSW_P0_CRS_COL_PINS() \
5002 +{ \
5003 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_GSW_P0_CRS_PIN | MISC_GSW_P0_COL_PIN); \
5004 +}
5005 +
5006 +
5007 +#define HAL_MISC_ENABLE_MDC_MDIO_PINS() \
5008 +{ \
5009 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_GSW_MDC_PIN | MISC_GSW_MDIO_PIN); \
5010 +}
5011 +
5012 +#define HAL_MISC_DISABLE_MDC_MDIO_PINS() \
5013 +{ \
5014 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_GSW_MDC_PIN | MISC_GSW_MDIO_PIN); \
5015 +}
5016 +
5017 +
5018 +
5019 +#define HAL_MISC_ENABLE_SATA_LED_PINS() \
5020 +{ \
5021 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_SATA_LED1_PIN | MISC_SATA_LED0_PIN); \
5022 +}
5023 +
5024 +#define HAL_MISC_DISABLE_SATA_LED_PINS() \
5025 +{ \
5026 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_SATA_LED1_PIN | MISC_SATA_LED0_PIN); \
5027 +}
5028 +
5029 +
5030 +
5031 +#define HAL_MISC_ENABLE_CLOCK_OUTPUT_PIN() \
5032 +{ \
5033 +    (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_CLOCK_OUTPUT_PIN); \
5034 +}
5035 +
5036 +#define HAL_MISC_DISABLE_CLOCK_OUTPUT_PIN() \
5037 +{ \
5038 +    (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_CLOCK_OUTPUT_PIN); \
5039 +}
5040 +
5041 +
5042 +#define HAL_MISC_ENABLE_ALL_SHARED_GPIO_PINS() \
5043 +{ \
5044 +    (MISC_GPIOA_PIN_ENABLE_REG) = (0x0); \
5045 +    (MISC_GPIOB_PIN_ENABLE_REG) = (0x0); \
5046 +}
5047 +
5048 +#define HAL_MISC_DISABLE_ALL_SHARED_GPIO_PINS() \
5049 +{ \
5050 +    (MISC_GPIOA_PIN_ENABLE_REG) = (0xFFFFFFFF); \
5051 +    (MISC_GPIOB_PIN_ENABLE_REG) = (0xFFFFFFFF); \
5052 +}
5053 +
5054 +
5055 +
5056 +#endif  // end of #ifndef _STAR_MISC_H_
5057 --- /dev/null
5058 +++ b/arch/arm/mach-cns3xxx/include/mach/pcie.h
5059 @@ -0,0 +1,149 @@
5060 +/*******************************************************************************
5061 + *
5062 + *  Copyright (c) 2008 Cavium Networks 
5063 + * 
5064 + *  This file is free software; you can redistribute it and/or modify 
5065 + *  it under the terms of the GNU General Public License, Version 2, as 
5066 + *  published by the Free Software Foundation. 
5067 + *
5068 + *  This file is distributed in the hope that it will be useful, 
5069 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
5070 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
5071 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
5072 + *
5073 + *  You should have received a copy of the GNU General Public License 
5074 + *  along with this file; if not, write to the Free Software 
5075 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
5076 + *  visit http://www.gnu.org/licenses/. 
5077 + *
5078 + *  This file may also be available under a different license from Cavium. 
5079 + *  Contact Cavium Networks for more information
5080 + *
5081 + ******************************************************************************/
5082 +
5083 +#ifndef        _CNS3XXX_PCIE_H_
5084 +#define        _CNS3XXX_PCIE_H_
5085 +
5086 +#include "mach/board.h"
5087 +
5088 +#define PCIE0_IO_SPACE_START                   (CNS3XXX_PCIE0_IO_BASE)
5089 +#define PCIE0_IO_SPACE_SIZE                    0x01000000      /* 16MB */
5090 +#define PCIE0_IO_SPACE_END                     (CNS3XXX_PCIE0_IO_BASE + PCIE0_IO_SPACE_SIZE - 1)
5091 +
5092 +#define PCIE0_MEM_SPACE_START                  (CNS3XXX_PCIE0_MEM_BASE)
5093 +#define PCIE0_MEM_SPACE_SIZE                   0x01000000 /* 176MB */
5094 +#define PCIE0_MEM_SPACE_END                    (CNS3XXX_PCIE0_MEM_BASE + PCIE0_MEM_SPACE_SIZE - 1)
5095 +
5096 +#define PCIE1_IO_SPACE_START                   (CNS3XXX_PCIE1_IO_BASE)
5097 +#define PCIE1_IO_SPACE_SIZE                    0x01000000      /* 16MB */
5098 +#define PCIE1_IO_SPACE_END                     (CNS3XXX_PCIE1_IO_BASE + PCIE1_IO_SPACE_SIZE - 1)
5099 +
5100 +#define PCIE1_MEM_SPACE_START                  (CNS3XXX_PCIE1_MEM_BASE)
5101 +#define PCIE1_MEM_SPACE_SIZE                   0x01000000 /* 16MB */
5102 +#define PCIE1_MEM_SPACE_END                    (CNS3XXX_PCIE1_MEM_BASE + PCIE1_MEM_SPACE_SIZE - 1)
5103 +
5104 +#define        PCIB_MEM_MAP_VALUE(base, reg_offset)    (*((u32 volatile *)(SYSVA_PCI_BRIDGE_##base##_ADDR + reg_offset)))
5105 +
5106 +/*
5107 + * define access macros
5108 + */
5109 +#define        PCI_BRIDGE_CONFIG_DATA                  PCIB_MEM_MAP_VALUE(CONFIG_DATA_BASE, 0x2C)
5110 +#define        PCI_BRIDGE_CONFIG_ADDR                  PCIB_MEM_MAP_VALUE(CONFIG_ADDR_BASE, 0x28)
5111 +
5112 +#define PCI_BRIDGE_CONFIG_DATA_REG_OFFSET      0x2C
5113 +#define PCI_BRIDGE_CONFIG_ADDR_REG_OFFSET      0x28
5114 +
5115 +
5116 +/* PCIe MISC 0 Register */
5117 +#define CNS3XXX_PCIEPHY0_CMCTL0                        (CNS3XXX_MISC_BASE_VIRT + 0x900)
5118 +#define CNS3XXX_PCIEPHY0_CMCTL1                        (CNS3XXX_MISC_BASE_VIRT + 0x904)
5119 +#define CNS3XXX_PCIEPHY0_CTL1                  (CNS3XXX_MISC_BASE_VIRT + 0x940)
5120 +#define CNS3XXX_PCIE0_AXIS_AWMISC              (CNS3XXX_MISC_BASE_VIRT + 0x944)
5121 +#define CNS3XXX_PCIE0_AXIS_ARMISC              (CNS3XXX_MISC_BASE_VIRT + 0x948)
5122 +#define CNS3XXX_PCIE0_AXIS_RMISC               (CNS3XXX_MISC_BASE_VIRT + 0x94C)
5123 +#define CNS3XXX_PCIE0_AXIS_BMISC               (CNS3XXX_MISC_BASE_VIRT + 0x950)
5124 +#define CNS3XXX_PCIE0_AXIM_RMISC               (CNS3XXX_MISC_BASE_VIRT + 0x954)
5125 +#define CNS3XXX_PCIE0_AXIM_BMISC               (CNS3XXX_MISC_BASE_VIRT + 0x958)
5126 +#define CNS3XXX_PCIE0_CTRL                     (CNS3XXX_MISC_BASE_VIRT + 0x95C)
5127 +#define CNS3XXX_PCIE0_PM_DEBUG                 (CNS3XXX_MISC_BASE_VIRT + 0x960)
5128 +#define CNS3XXX_PCIE0_RFC_DEBUG                        (CNS3XXX_MISC_BASE_VIRT + 0x964)
5129 +#define CNS3XXX_PCIE0_CXPL_DEBUGL              (CNS3XXX_MISC_BASE_VIRT + 0x968)
5130 +#define CNS3XXX_PCIE0_CXPL_DEBUGH              (CNS3XXX_MISC_BASE_VIRT + 0x96C)
5131 +#define CNS3XXX_PCIE0_DIAG                     (CNS3XXX_MISC_BASE_VIRT + 0x970)
5132 +#define CNS3XXX_PCIE0_INT_STATUS               (CNS3XXX_MISC_BASE_VIRT + 0x974)
5133 +#define CNS3XXX_PCIE0_INT_MASK                 (CNS3XXX_MISC_BASE_VIRT + 0x978)
5134 +
5135 +
5136 +/* PCIe MISC 1 Register */
5137 +#define CNS3XXX_PCIEPHY1_CMCTL0                        (CNS3XXX_MISC_BASE_VIRT + 0xA00)
5138 +#define CNS3XXX_PCIEPHY1_CMCTL1                        (CNS3XXX_MISC_BASE_VIRT + 0xA04)
5139 +#define CNS3XXX_PCIEPHY1_CTL1                  (CNS3XXX_MISC_BASE_VIRT + 0xA40)
5140 +#define CNS3XXX_PCIE1_AXIS_AWMISC              (CNS3XXX_MISC_BASE_VIRT + 0xA44)
5141 +#define CNS3XXX_PCIE1_AXIS_ARMISC              (CNS3XXX_MISC_BASE_VIRT + 0xA48)
5142 +#define CNS3XXX_PCIE1_AXIS_RMISC               (CNS3XXX_MISC_BASE_VIRT + 0xA4C)
5143 +#define CNS3XXX_PCIE1_AXIS_BMISC               (CNS3XXX_MISC_BASE_VIRT + 0xA50)
5144 +#define CNS3XXX_PCIE1_AXIM_RMISC               (CNS3XXX_MISC_BASE_VIRT + 0xA54)
5145 +#define CNS3XXX_PCIE1_AXIM_BMISC               (CNS3XXX_MISC_BASE_VIRT + 0x958)
5146 +#define CNS3XXX_PCIE1_CTRL                     (CNS3XXX_MISC_BASE_VIRT + 0xA5C)
5147 +#define CNS3XXX_PCIE1_PM_DEBUG                 (CNS3XXX_MISC_BASE_VIRT + 0xA60)
5148 +#define CNS3XXX_PCIE1_RFC_DEBUG                        (CNS3XXX_MISC_BASE_VIRT + 0xA64)
5149 +#define CNS3XXX_PCIE1_CXPL_DEBUGL              (CNS3XXX_MISC_BASE_VIRT + 0xA68)
5150 +#define CNS3XXX_PCIE1_CXPL_DEBUGH              (CNS3XXX_MISC_BASE_VIRT + 0xA6C)
5151 +#define CNS3XXX_PCIE1_DIAG                     (CNS3XXX_MISC_BASE_VIRT + 0xA70)
5152 +#define CNS3XXX_PCIE1_INT_STATUS               (CNS3XXX_MISC_BASE_VIRT + 0xA74)
5153 +#define CNS3XXX_PCIE1_INT_MASK                 (CNS3XXX_MISC_BASE_VIRT + 0xA78)
5154 +
5155 +
5156 +/*
5157 + * define constants macros
5158 + */
5159 +
5160 +#define        PCIB_DEVICE_ID                       0x3400
5161 +#define        PCIB_VENDOR_ID                       0x177D
5162 +#define        PCIB_CLASS_CODE                      0xFF0000
5163 +#define        PCIB_REVISION_ID                     0x00
5164 +#define        PCIB_BAR0_MEMORY_SPACE_BASE          0x20000000
5165 +#define        PCIB_BAR1_IO_SPACE_BASE              0x20000000
5166 +#define        PCI_MEMORY_SPACE_BASE                0xB0000000
5167 +#define        PCI_IO_SPACE_BASE                    0xA8000000
5168 +#define        PCI_MAX_BUS_NUM                      0x01
5169 +#define        PCI_MAX_DEVICE_NUM                   0x14
5170 +#define        PCI_MAX_FUNCTION_NUM                 0x01
5171 +#define        PCI_MAX_REG_NUM                      0x3C
5172 +
5173 +#define        PCI_MAX_DEVICE_TYPE_NUM              0x13
5174 +#define        PCI_MAX_BAR_NUM                      0x06
5175 +
5176 +#define        PCI_CSH_VENDOR_ID_REG_ADDR           0x00
5177 +#define        PCI_CSH_DEVICE_ID_REG_ADDR           0x02
5178 +#define        PCI_CSH_COMMAND_REG_ADDR             0x04
5179 +#define        PCI_CSH_STATUS_REG_ADDR              0x06
5180 +#define        PCI_CSH_REVISION_CLASS_REG_ADDR      0x08
5181 +#define        PCI_CSH_CACHE_LINE_SIZE_REG_ADDR     0x0C
5182 +#define        PCI_CSH_LATENCY_TIMER_REG_ADDR       0x0D
5183 +#define        PCI_CSH_HEADER_TYPE_REG_ADDR         0x0E
5184 +#define        PCI_CSH_BIST_REG_ADDR                0x0F
5185 +#define        PCI_CSH_BAR_REG_ADDR                 0x10
5186 +
5187 +
5188 +#define        PCI_IO_SPACE_SIZE_1M                 0x00
5189 +#define        PCI_IO_SPACE_SIZE_2M                 0x01
5190 +#define        PCI_IO_SPACE_SIZE_4M                 0x02
5191 +#define        PCI_IO_SPACE_SIZE_8M                 0x03
5192 +#define        PCI_IO_SPACE_SIZE_16M                0x04
5193 +#define        PCI_IO_SPACE_SIZE_32M                0x05
5194 +#define        PCI_IO_SPACE_SIZE_64M                0x06
5195 +#define        PCI_IO_SPACE_SIZE_128M               0x07
5196 +#define        PCI_IO_SPACE_SIZE_256M               0x08
5197 +#define        PCI_IO_SPACE_SIZE_512M               0x09
5198 +#define        PCI_IO_SPACE_SIZE_1G                 0x0A
5199 +#define        PCI_IO_SPACE_SIZE_2G                 0x0B
5200 +
5201 +
5202 +struct pcie_dbgfs_reg{
5203 +       char *name;
5204 +       u32 *addr;
5205 +};
5206 +
5207 +#endif /* end of #ifndef _STAR_PCIE_H_ */
5208 +
5209 --- /dev/null
5210 +++ b/arch/arm/mach-cns3xxx/include/mach/pcm.h
5211 @@ -0,0 +1,277 @@
5212 +/******************************************************************************
5213 + *
5214 + *  Copyright (c) 2008 Cavium Networks 
5215 + * 
5216 + *  This file is free software; you can redistribute it and/or modify 
5217 + *  it under the terms of the GNU General Public License, Version 2, as 
5218 + *  published by the Free Software Foundation. 
5219 + *
5220 + *  This file is distributed in the hope that it will be useful, 
5221 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
5222 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
5223 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
5224 + *
5225 + *  You should have received a copy of the GNU General Public License 
5226 + *  along with this file; if not, write to the Free Software 
5227 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
5228 + *  visit http://www.gnu.org/licenses/. 
5229 + *
5230 + *  This file may also be available under a different license from Cavium. 
5231 + *  Contact Cavium Networks for more information
5232 + *
5233 + ******************************************************************************/
5234 +
5235 +#ifndef _STAR_PCM_H_
5236 +#define _STAR_PCM_H_
5237 +
5238 +/******************************************************************************
5239 + * MODULE NAME:    star_pcm.h
5240 + * PROJECT CODE:   Orion
5241 + * DESCRIPTION:    
5242 + * MAINTAINER:     MJLIU
5243 + * DATE:           15 September 2005
5244 + *
5245 + * SOURCE CONTROL: 
5246 + *
5247 + * LICENSE:
5248 + *     This source code is copyright (c) 2005 Star Semi Inc.
5249 + *     All rights reserved.
5250 + *
5251 + * REVISION HISTORY:
5252 + *     15 September 2005  -  MJLIU     - Initial Version v1.0
5253 + *
5254 + *
5255 + * SOURCE:
5256 + * ISSUES:
5257 + * NOTES TO USERS:
5258 + ******************************************************************************/
5259 +
5260 +//#include <asm/arch/star_sys_memory_map.h>
5261 +
5262 +#define PCM_BASE_ADDR                         (CNS3XXX_SSP_BASE_VIRT)
5263 +#define PCM_MEM_MAP_ADDR(reg_offset)          (PCM_BASE_ADDR + reg_offset)
5264 +#define PCM_MEM_MAP_VALUE(reg_offset)         (*((u32 volatile *)PCM_MEM_MAP_ADDR(reg_offset)))
5265 +
5266 +
5267 +/*
5268 + * define access macros
5269 + */
5270 +#define PCM_CONFIGURATION_0_REG               PCM_MEM_MAP_VALUE(0x80)
5271 +#define PCM_CONFIGURATION_1_REG               PCM_MEM_MAP_VALUE(0x84)
5272 +
5273 +#define PCM_CHANNEL_0_CONFIG_REG              PCM_MEM_MAP_VALUE(0x88)
5274 +#define PCM_CHANNEL_1_CONFIG_REG              PCM_MEM_MAP_VALUE(0x8C)
5275 +#define PCM_CHANNEL_2_CONFIG_REG              PCM_MEM_MAP_VALUE(0x90)
5276 +#define PCM_CHANNEL_3_CONFIG_REG              PCM_MEM_MAP_VALUE(0x94)
5277 +
5278 +#define PCM_TX_DATA_31_0_REG                  PCM_MEM_MAP_VALUE(0x98)
5279 +#define PCM_TX_DATA_63_32_REG                 PCM_MEM_MAP_VALUE(0x9C)
5280 +
5281 +#define PCM_RX_DATA_31_0_REG                  PCM_MEM_MAP_VALUE(0xA0)
5282 +#define PCM_RX_DATA_63_32_REG                 PCM_MEM_MAP_VALUE(0xA4)
5283 +
5284 +#define PCM_INTERRUPT_STATUS_REG              PCM_MEM_MAP_VALUE(0xA8)
5285 +#define PCM_INTERRUPT_ENABLE_REG              PCM_MEM_MAP_VALUE(0xAC)
5286 +
5287 +
5288 +
5289 +/*
5290 + * define constants macros
5291 + */
5292 +#define CH0_BIT_INDEX                         (0x1)
5293 +#define CH1_BIT_INDEX                         (0x2)
5294 +#define CH2_BIT_INDEX                         (0x4)
5295 +#define CH3_BIT_INDEX                         (0x8)
5296 +
5297 +#define PCM_RXBUF_FULL_FG                     (0x1)
5298 +#define PCM_TXBUF_EMPTY_FG                    (0x2)
5299 +#define PCM_RXBUF_OVERRUN_FG                  (0x4)
5300 +#define PCM_TXBUF_UNDERRUN_FG                 (0x8)
5301 +
5302 +#define PCM_ENABLE_FG                         (0x1 << 23)
5303 +
5304 +#define PCM_IDL_MODE                          (0)
5305 +#define PCM_GCI_MODE                          (1)
5306 +
5307 +#define PCM_DATA_BIT_8                        (0)
5308 +#define PCM_DATA_BIT_16                       (1)
5309 +
5310 +
5311 +/*
5312 + * Set Commands Variables
5313 + */
5314 +#define        Software_Reset                               (0x02)
5315 +#define        Hardware_Reset                               (0x04)
5316 +#define        Write_Transmit_Time_Slot                     (0x40)
5317 +#define        Read_Transmit_Time_Slot                      (0x41)
5318 +#define        Write_Receive_Time_Slot                      (0x42)
5319 +#define        Read_Receive_Time_Slot                       (0x43)
5320 +#define        Write_Tx_Rx_CLK_Slot_Tx_CLK_Edge             (0x44)
5321 +#define        Read_Tx_Rx_CLK_Slot_Tx_CLK_Edge              (0x45)
5322 +#define        Write_Device_Configure_Reg                   (0x46)
5323 +#define        Read_Device_Configure_Reg                    (0x47)
5324 +#define        Write_Channel_Enable_Operating_Mode_Reg      (0x4A)
5325 +#define        Read_Channel_Enable_Operating_Mode_Reg       (0x4B)
5326 +#define        Read_Signal_Reg                              (0x4D)
5327 +#define        Input_Data_Reg                               (0x52)
5328 +#define        Output_Data_Reg                              (0x53)
5329 +#define        Input_Direction_Reg                          (0x54)
5330 +#define        Output_Direction_Reg                         (0x55)
5331 +#define        Write_System_State                           (0x56)
5332 +#define        Read_System_State                            (0x57)
5333 +#define        Write_Operating_Functon                      (0x60)
5334 +#define        Read_Operating_Functon                       (0x61)
5335 +#define        Write_System_State_Config                    (0x68)
5336 +#define        Read_System_State_Config                     (0x69)
5337 +#define        Write_Interrupt_Mask_Reg                     (0x6C)
5338 +#define        Read_Interrupt_Mask_Reg                      (0x6D)
5339 +#define        Write_Operating_Condition                    (0x70)
5340 +#define        Write_Loop_Supervision_Parameter             (0xC2)
5341 +#define        Write_DC_Feed_Parameter                      (0xC6)
5342 +#define        Write_Signal_A_B_Parameter                   (0xD2)
5343 +#define        Write_Switching_Reg_Parameter                (0xE4)
5344 +#define        Write_Switching_Reg_Control                  (0xE6)
5345 +
5346 +
5347 +/*
5348 + * define data structure
5349 + */
5350 +typedef struct _PCM_CHANNEL_OBJECT_    PCM_CHANNEL_OBJECT_T;
5351 +
5352 +struct _PCM_CHANNEL_OBJECT_
5353 +{
5354 +    u16          channel_0_tx_data;
5355 +    u16          channel_0_rx_data;
5356 +    u32          channel_0_data_width;     /* 0 : 8-bit, 1 : 16-bit */
5357 +
5358 +    u16          channel_1_tx_data;
5359 +    u16          channel_1_rx_data;
5360 +    u32          channel_1_data_width;
5361 +
5362 +    u16          channel_2_tx_data;
5363 +    u16          channel_2_rx_data;
5364 +    u32          channel_2_data_width;
5365 +
5366 +    u16          channel_3_tx_data;
5367 +    u16          channel_3_rx_data;
5368 +    u32          channel_3_data_width;
5369 +    
5370 +    u32          channel_enable_config;    /* bit[0] = 0 : channel 0 disabled
5371 +                                                     [0] = 1 : channel 0 enabled
5372 +                                                  bit[1] = 0 : channel 1 disabled
5373 +                                                     [1] = 1 : channel 1 enabled
5374 +                                                  bit[2] = 0 : channel 2 disabled
5375 +                                                     [2] = 1 : channel 2 enabled
5376 +                                                  bit[3] = 0 : channel 3 disabled
5377 +                                                     [3] = 1 : channel 3 enabled */
5378 +};
5379 +
5380 +
5381 +typedef struct _PCM_OBJECT_    PCM_OBJECT_T;
5382 +
5383 +struct _PCM_OBJECT_
5384 +{
5385 +    u32          config_0;
5386 +    u32          config_1; 
5387 +    
5388 +    u32          channel_0_config;
5389 +    u32          channel_1_config;
5390 +    u32          channel_2_config;
5391 +    u32          channel_3_config;
5392 +    
5393 +    u32          interrupt_config;
5394 +    
5395 +    /* 
5396 +     * For interrupt setting
5397 +     */
5398 +//    INTC_OBJECT_T    intc_obj;
5399 +};
5400 +
5401 +
5402 +
5403 +/*
5404 + * function declarations
5405 + */
5406 +void       Hal_Pcm_Initialize(PCM_OBJECT_T *);
5407 +
5408 +                                                                           
5409 +/*
5410 + * macro declarations
5411 + */
5412 +#define HAL_PCM_ENABLE_PCM() \
5413 +{ \
5414 +    (PCM_CONFIGURATION_0_REG) |= ((u32)0x1 << 31); \
5415 +}
5416 +
5417 +#define HAL_PCM_DISABLE_PCM() \
5418 +{ \
5419 +    (PCM_CONFIGURATION_0_REG) &= ~((u32)0x1 << 31); \
5420 +}
5421 +
5422 +#define HAL_PCM_ENABLE_DATA_SWAP() \
5423 +{ \
5424 +    (PCM_CONFIGURATION_0_REG) |= (0x1 << 24); \
5425 +}
5426 +
5427 +#define HAL_PCM_DISABLE_DATA_SWAP() \
5428 +{ \
5429 +    (PCM_CONFIGURATION_0_REG) &= ~(0x1 << 24); \
5430 +}
5431 +
5432 +#define HAL_PCM_WRITE_TX_DATA_0(tx_data_0) \
5433 +{ \
5434 +    (PCM_TX_DATA_31_0_REG) = tx_data_0; \
5435 +}
5436 +
5437 +#define HAL_PCM_WRITE_TX_DATA_1(tx_data_1) \
5438 +{ \
5439 +    (PCM_TX_DATA_63_32_REG) = tx_data_1; \
5440 +}
5441 +
5442 +#define HAL_PCM_READ_RX_DATA_0(rx_data_0) \
5443 +{ \
5444 +    (rx_data_0) = PCM_RX_DATA_31_0_REG; \
5445 +}
5446 +
5447 +#define HAL_PCM_READ_RX_DATA_1(rx_data_1) \
5448 +{ \
5449 +    (rx_data_1) = PCM_RX_DATA_63_32_REG; \
5450 +}
5451 +
5452 +#define HAL_PCM_READ_INTERRUPT_STATUS(status) \
5453 +{ \
5454 +    (status) = PCM_INTERRUPT_STATUS_REG; \
5455 +}
5456 +
5457 +#define HAL_PCM_CLEAR_INTERRUPT_STATUS(status) \
5458 +{ \
5459 +    (PCM_INTERRUPT_STATUS_REG) = (status & 0xC); \
5460 +}
5461 +
5462 +#define HAL_PCM_DISABLE_RECEIVE_BUFFER_FULL_INTERRUPT() \
5463 +{ \
5464 +    (PCM_INTERRUPT_ENABLE_REG) &= ~(0x1 << 0); \
5465 +}
5466 +
5467 +#define HAL_PCM_DISABLE_TRANSMIT_BUFFER_EMPTY_INTERRUPT() \
5468 +{ \
5469 +    (PCM_INTERRUPT_ENABLE_REG) &= ~(0x1 << 1); \
5470 +}
5471 +
5472 +#define HAL_PCM_DISABLE_RECEIVE_BUFFER_OVERRUN_INTERRUPT() \
5473 +{ \
5474 +    (PCM_INTERRUPT_ENABLE_REG) &= ~(0x1 << 2); \
5475 +}
5476 +
5477 +#define HAL_PCM_DISABLE_TRANSMIT_BUFFER_UNDERRUN_INTERRUPT() \
5478 +{ \
5479 +    (PCM_INTERRUPT_ENABLE_REG) &= ~(0x1 << 3); \
5480 +}
5481 +
5482 +#define HAL_PCM_DISABLE_ALL_INTERRUPT_SOURCES() \
5483 +{ \
5484 +    (PCM_INTERRUPT_ENABLE_REG) = 0; \
5485 +}
5486 +
5487 +#endif  // end of #ifndef _STAR_PCM_H_
5488 +
5489 --- /dev/null
5490 +++ b/arch/arm/mach-cns3xxx/include/mach/platform.h
5491 @@ -0,0 +1,297 @@
5492 +/*
5493 + *  arch/arm/mach-cns3xxx/include/mach/platform.h
5494 + *
5495 + *  Copyright (c) 2008 Cavium Networks 
5496 + *  Copyright (c) ARM Limited 2003.  All rights reserved.
5497 + * 
5498 + *  This file is free software; you can redistribute it and/or modify 
5499 + *  it under the terms of the GNU General Public License, Version 2, as 
5500 + *  published by the Free Software Foundation. 
5501 + *
5502 + *  This file is distributed in the hope that it will be useful, 
5503 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
5504 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
5505 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
5506 + *
5507 + *  You should have received a copy of the GNU General Public License 
5508 + *  along with this file; if not, write to the Free Software 
5509 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
5510 + *  visit http://www.gnu.org/licenses/. 
5511 + *
5512 + *  This file may also be available under a different license from Cavium. 
5513 + *  Contact Cavium Networks for more information
5514 + */
5515 +
5516 +#ifndef __ASM_ARCH_PLATFORM_H
5517 +#define __ASM_ARCH_PLATFORM_H
5518 +
5519 +#ifndef __ASSEMBLY__
5520 +
5521 +#include <linux/io.h>
5522 +
5523 +/* 
5524 + *  SDRAM
5525 + */
5526 +#define CNS3XXX_SDRAM_BASE           0x00000000
5527 +
5528 +/* ------------------------------------------------------------------------
5529 + *  Cavium Networks Registers
5530 + * ------------------------------------------------------------------------
5531 + * 
5532 + */
5533 +#define CNS3XXX_SYS_ID_OFFSET               0x00
5534 +#define CNS3XXX_SYS_SW_OFFSET               0x04
5535 +#define CNS3XXX_SYS_LED_OFFSET              0x08
5536 +#define CNS3XXX_SYS_OSC0_OFFSET             0x0C
5537 +
5538 +#define CNS3XXX_SYS_OSC1_OFFSET             0x10
5539 +#define CNS3XXX_SYS_OSC2_OFFSET             0x14
5540 +#define CNS3XXX_SYS_OSC3_OFFSET             0x18
5541 +#define CNS3XXX_SYS_OSC4_OFFSET             0x1C       /* OSC1 for Cavium Networks/AB */
5542 +
5543 +#define CNS3XXX_SYS_LOCK_OFFSET             0x20
5544 +#define CNS3XXX_SYS_100HZ_OFFSET            0x24
5545 +#define CNS3XXX_SYS_CFGDATA1_OFFSET         0x28
5546 +#define CNS3XXX_SYS_CFGDATA2_OFFSET         0x2C
5547 +#define CNS3XXX_SYS_FLAGS_OFFSET            0x30
5548 +#define CNS3XXX_SYS_FLAGSSET_OFFSET         0x30
5549 +#define CNS3XXX_SYS_FLAGSCLR_OFFSET         0x34
5550 +#define CNS3XXX_SYS_NVFLAGS_OFFSET          0x38
5551 +#define CNS3XXX_SYS_NVFLAGSSET_OFFSET       0x38
5552 +#define CNS3XXX_SYS_NVFLAGSCLR_OFFSET       0x3C
5553 +#define CNS3XXX_SYS_RESETCTL_OFFSET         0x40
5554 +#define CNS3XXX_SYS_PCICTL_OFFSET           0x44
5555 +#define CNS3XXX_SYS_MCI_OFFSET              0x48
5556 +#define CNS3XXX_SYS_FLASH_OFFSET            0x4C
5557 +#define CNS3XXX_SYS_CLCD_OFFSET             0x50
5558 +#define CNS3XXX_SYS_CLCDSER_OFFSET          0x54
5559 +#define CNS3XXX_SYS_BOOTCS_OFFSET           0x58
5560 +#define CNS3XXX_SYS_24MHz_OFFSET            0x5C
5561 +#define CNS3XXX_SYS_MISC_OFFSET             0x60
5562 +#define CNS3XXX_SYS_IOSEL_OFFSET            0x70
5563 +#define CNS3XXX_SYS_PROCID_OFFSET           0x84
5564 +#define CNS3XXX_SYS_TEST_OSC0_OFFSET        0xC0
5565 +#define CNS3XXX_SYS_TEST_OSC1_OFFSET        0xC4
5566 +#define CNS3XXX_SYS_TEST_OSC2_OFFSET        0xC8
5567 +#define CNS3XXX_SYS_TEST_OSC3_OFFSET        0xCC
5568 +#define CNS3XXX_SYS_TEST_OSC4_OFFSET        0xD0
5569 +
5570 +#define CNS3XXX_SYS_BASE                    0x10000000
5571 +#define CNS3XXX_SYS_ID                      (CNS3XXX_SYS_BASE + CNS3XXX_SYS_ID_OFFSET)
5572 +#define CNS3XXX_SYS_SW                      (CNS3XXX_SYS_BASE + CNS3XXX_SYS_SW_OFFSET)
5573 +#define CNS3XXX_SYS_LED                     (CNS3XXX_SYS_BASE + CNS3XXX_SYS_LED_OFFSET)
5574 +#define CNS3XXX_SYS_OSC0                    (CNS3XXX_SYS_BASE + CNS3XXX_SYS_OSC0_OFFSET)
5575 +#define CNS3XXX_SYS_OSC1                    (CNS3XXX_SYS_BASE + CNS3XXX_SYS_OSC1_OFFSET)
5576 +
5577 +#define CNS3XXX_SYS_LOCK                    (CNS3XXX_SYS_BASE + CNS3XXX_SYS_LOCK_OFFSET)
5578 +#define CNS3XXX_SYS_100HZ                   (CNS3XXX_SYS_BASE + CNS3XXX_SYS_100HZ_OFFSET)
5579 +#define CNS3XXX_SYS_CFGDATA1                (CNS3XXX_SYS_BASE + CNS3XXX_SYS_CFGDATA1_OFFSET)
5580 +#define CNS3XXX_SYS_CFGDATA2                (CNS3XXX_SYS_BASE + CNS3XXX_SYS_CFGDATA2_OFFSET)
5581 +#define CNS3XXX_SYS_FLAGS                   (CNS3XXX_SYS_BASE + CNS3XXX_SYS_FLAGS_OFFSET)
5582 +#define CNS3XXX_SYS_FLAGSSET                (CNS3XXX_SYS_BASE + CNS3XXX_SYS_FLAGSSET_OFFSET)
5583 +#define CNS3XXX_SYS_FLAGSCLR                (CNS3XXX_SYS_BASE + CNS3XXX_SYS_FLAGSCLR_OFFSET)
5584 +#define CNS3XXX_SYS_NVFLAGS                 (CNS3XXX_SYS_BASE + CNS3XXX_SYS_NVFLAGS_OFFSET)
5585 +#define CNS3XXX_SYS_NVFLAGSSET              (CNS3XXX_SYS_BASE + CNS3XXX_SYS_NVFLAGSSET_OFFSET)
5586 +#define CNS3XXX_SYS_NVFLAGSCLR              (CNS3XXX_SYS_BASE + CNS3XXX_SYS_NVFLAGSCLR_OFFSET)
5587 +#define CNS3XXX_SYS_RESETCTL                (CNS3XXX_SYS_BASE + CNS3XXX_SYS_RESETCTL_OFFSET)
5588 +#define CNS3XXX_SYS_PCICTL                  (CNS3XXX_SYS_BASE + CNS3XXX_SYS_PCICTL_OFFSET)
5589 +#define CNS3XXX_SYS_MCI                     (CNS3XXX_SYS_BASE + CNS3XXX_SYS_MCI_OFFSET)
5590 +#define CNS3XXX_SYS_FLASH                   (CNS3XXX_SYS_BASE + CNS3XXX_SYS_FLASH_OFFSET)
5591 +#define CNS3XXX_SYS_CLCD                    (CNS3XXX_SYS_BASE + CNS3XXX_SYS_CLCD_OFFSET)
5592 +#define CNS3XXX_SYS_CLCDSER                 (CNS3XXX_SYS_BASE + CNS3XXX_SYS_CLCDSER_OFFSET)
5593 +#define CNS3XXX_SYS_BOOTCS                  (CNS3XXX_SYS_BASE + CNS3XXX_SYS_BOOTCS_OFFSET)
5594 +#define CNS3XXX_SYS_24MHz                   (CNS3XXX_SYS_BASE + CNS3XXX_SYS_24MHz_OFFSET)
5595 +#define CNS3XXX_SYS_MISC                    (CNS3XXX_SYS_BASE + CNS3XXX_SYS_MISC_OFFSET)
5596 +#define CNS3XXX_SYS_IOSEL                   (CNS3XXX_SYS_BASE + CNS3XXX_SYS_IOSEL_OFFSET)
5597 +#define CNS3XXX_SYS_PROCID                  (CNS3XXX_SYS_BASE + CNS3XXX_SYS_PROCID_OFFSET)
5598 +#define CNS3XXX_SYS_TEST_OSC0               (CNS3XXX_SYS_BASE + CNS3XXX_SYS_TEST_OSC0_OFFSET)
5599 +#define CNS3XXX_SYS_TEST_OSC1               (CNS3XXX_SYS_BASE + CNS3XXX_SYS_TEST_OSC1_OFFSET)
5600 +#define CNS3XXX_SYS_TEST_OSC2               (CNS3XXX_SYS_BASE + CNS3XXX_SYS_TEST_OSC2_OFFSET)
5601 +#define CNS3XXX_SYS_TEST_OSC3               (CNS3XXX_SYS_BASE + CNS3XXX_SYS_TEST_OSC3_OFFSET)
5602 +#define CNS3XXX_SYS_TEST_OSC4               (CNS3XXX_SYS_BASE + CNS3XXX_SYS_TEST_OSC4_OFFSET)
5603 +
5604 +/* 
5605 + * Values for CNS3XXX_SYS_RESET_CTRL
5606 + */
5607 +#define CNS3XXX_SYS_CTRL_RESET_CONFIGCLR    0x01
5608 +#define CNS3XXX_SYS_CTRL_RESET_CONFIGINIT   0x02
5609 +#define CNS3XXX_SYS_CTRL_RESET_DLLRESET     0x03
5610 +#define CNS3XXX_SYS_CTRL_RESET_PLLRESET     0x04
5611 +#define CNS3XXX_SYS_CTRL_RESET_POR          0x05
5612 +#define CNS3XXX_SYS_CTRL_RESET_DoC          0x06
5613 +
5614 +#define CNS3XXX_SYS_CTRL_LED         (1 << 0)
5615 +
5616 +
5617 +/* ------------------------------------------------------------------------
5618 + *  Cavium Networks control registers
5619 + * ------------------------------------------------------------------------
5620 + */
5621 +
5622 +/* 
5623 + * CNS3XXX_IDFIELD
5624 + *
5625 + * 31:24 = manufacturer (0x41 = ARM)
5626 + * 23:16 = architecture (0x08 = AHB system bus, ASB processor bus)
5627 + * 15:12 = FPGA (0x3 = XVC600 or XVC600E)
5628 + * 11:4  = build value
5629 + * 3:0   = revision number (0x1 = rev B (AHB))
5630 + */
5631 +
5632 +/*
5633 + * CNS3XXX_SYS_LOCK
5634 + *     control access to SYS_OSCx, SYS_CFGDATAx, SYS_RESETCTL, 
5635 + *     SYS_CLD, SYS_BOOTCS
5636 + */
5637 +#define CNS3XXX_SYS_LOCK_LOCKED    (1 << 16)
5638 +#define CNS3XXX_SYS_LOCKVAL_MASK       0xFFFF          /* write 0xA05F to enable write access */
5639 +
5640 +/*
5641 + * CNS3XXX_SYS_FLASH
5642 + */
5643 +#define CNS3XXX_FLASHPROG_FLVPPEN      (1 << 0)        /* Enable writing to flash */
5644 +
5645 +/*
5646 + * CNS3XXX_INTREG
5647 + *     - used to acknowledge and control MMCI and UART interrupts 
5648 + */
5649 +#define CNS3XXX_INTREG_WPROT        0x00    /* MMC protection status (no interrupt generated) */
5650 +#define CNS3XXX_INTREG_RI0          0x01    /* Ring indicator UART0 is asserted,              */
5651 +#define CNS3XXX_INTREG_CARDIN       0x08    /* MMCI card in detect                            */
5652 +                                                /* write 1 to acknowledge and clear               */
5653 +#define CNS3XXX_INTREG_RI1          0x02    /* Ring indicator UART1 is asserted,              */
5654 +#define CNS3XXX_INTREG_CARDINSERT   0x03    /* Signal insertion of MMC card                   */
5655 +
5656 +/*
5657 + * Cavium Networks common peripheral addresses
5658 + */
5659 +#define CNS3XXX_SCTL_BASE            0x10001000        /* System controller */
5660 +
5661 +/* PCI space */
5662 +#define CNS3XXX_PCI_BASE             0x41000000        /* PCI Interface */
5663 +#define CNS3XXX_PCI_CFG_BASE         0x42000000
5664 +#define CNS3XXX_PCI_MEM_BASE0        0x44000000
5665 +#define CNS3XXX_PCI_MEM_BASE1        0x50000000
5666 +#define CNS3XXX_PCI_MEM_BASE2        0x60000000
5667 +/* Sizes of above maps */
5668 +#define CNS3XXX_PCI_BASE_SIZE       0x01000000
5669 +#define CNS3XXX_PCI_CFG_BASE_SIZE    0x02000000
5670 +#define CNS3XXX_PCI_MEM_BASE0_SIZE   0x0c000000        /* 32Mb */
5671 +#define CNS3XXX_PCI_MEM_BASE1_SIZE   0x10000000        /* 256Mb */
5672 +#define CNS3XXX_PCI_MEM_BASE2_SIZE   0x10000000        /* 256Mb */
5673 +
5674 +#define CNS3XXX_SDRAM67_BASE         0x70000000        /* SDRAM banks 6 and 7 */
5675 +#define CNS3XXX_LT_BASE              0x80000000        /* Logic Tile expansion */
5676 +
5677 +/* 
5678 + *  LED settings, bits [7:0]
5679 + */
5680 +#define CNS3XXX_SYS_LED0             (1 << 0)
5681 +#define CNS3XXX_SYS_LED1             (1 << 1)
5682 +#define CNS3XXX_SYS_LED2             (1 << 2)
5683 +#define CNS3XXX_SYS_LED3             (1 << 3)
5684 +#define CNS3XXX_SYS_LED4             (1 << 4)
5685 +#define CNS3XXX_SYS_LED5             (1 << 5)
5686 +#define CNS3XXX_SYS_LED6             (1 << 6)
5687 +#define CNS3XXX_SYS_LED7             (1 << 7)
5688 +
5689 +#define ALL_LEDS                  0xFF
5690 +
5691 +#define LED_BANK                  CNS3XXX_SYS_LED
5692 +
5693 +/* 
5694 + * Control registers
5695 + */
5696 +#define CNS3XXX_IDFIELD_OFFSET         0x0     /* Cavium Networks build information */
5697 +#define CNS3XXX_FLASHPROG_OFFSET       0x4     /* Flash devices */
5698 +#define CNS3XXX_INTREG_OFFSET          0x8     /* Interrupt control */
5699 +#define CNS3XXX_DECODE_OFFSET          0xC     /* Fitted logic modules */
5700 +
5701 +/*
5702 + * System controller bit assignment
5703 + */
5704 +#define CNS3XXX_REFCLK 0
5705 +#define CNS3XXX_TIMCLK 1
5706 +
5707 +#define CNS3XXX_TIMER1_EnSel   15
5708 +#define CNS3XXX_TIMER2_EnSel   17
5709 +#define CNS3XXX_TIMER3_EnSel   19
5710 +#define CNS3XXX_TIMER4_EnSel   21
5711 +
5712 +
5713 +#define MAX_TIMER                       2
5714 +#define MAX_PERIOD                      699050
5715 +#define TICKS_PER_uSEC                  1
5716 +
5717 +/* 
5718 + *  These are useconds NOT ticks.  
5719 + * 
5720 + */
5721 +#define mSEC_1                          1000
5722 +#define mSEC_5                          (mSEC_1 * 5)
5723 +#define mSEC_10                         (mSEC_1 * 10)
5724 +#define mSEC_25                         (mSEC_1 * 25)
5725 +#define SEC_1                           (mSEC_1 * 1000)
5726 +
5727 +#define CNS3XXX_CSR_BASE             0x10000000
5728 +#define CNS3XXX_CSR_SIZE             0x10000000
5729 +
5730 +/* Platform Level Setup Functions */
5731 +
5732 +extern void cns3xxx_sys_init(void);
5733 +extern int cns3xxx_pcie_init(u8 ports);
5734 +
5735 +/* Information about built-in Ethernet MAC interfaces */
5736 +struct eth_plat_info {
5737 +       u8 ports;       /* Bitmap of enabled Ports */
5738 +       u8 eth0_hwaddr[6];
5739 +       u8 eth1_hwaddr[6];
5740 +       u8 eth2_hwaddr[6];
5741 +       u8 cpu_hwaddr[6];
5742 +};
5743 +
5744 +// Config 1 Bitmap
5745 +#define ETH0_LOAD                                              BIT(0)
5746 +#define ETH1_LOAD                                              BIT(1)
5747 +#define ETH2_LOAD                                              BIT(2)
5748 +#define SATA0_LOAD                                     BIT(3)
5749 +#define SATA1_LOAD                                     BIT(4)
5750 +#define PCM_LOAD                                               BIT(5)
5751 +#define I2S_LOAD                                               BIT(6)
5752 +#define SPI0_LOAD                                              BIT(7)
5753 +#define SPI1_LOAD                                              BIT(8)
5754 +#define PCIe0_LOAD                                     BIT(9)
5755 +#define PCIe1_LOAD                                     BIT(10)
5756 +#define USB0_LOAD                                              BIT(11)
5757 +#define USB1_LOAD                                              BIT(12)
5758 +#define USB1_ROUTE                                     BIT(13)
5759 +#define SD_LOAD                                                        BIT(14)
5760 +#define UART0_LOAD                                     BIT(15)
5761 +#define UART1_LOAD                                     BIT(16)
5762 +#define UART2_LOAD                                     BIT(17)
5763 +#define mPCI0_LOAD                                     BIT(18)
5764 +#define mPCI1_LOAD                                     BIT(19)
5765 +#define mPCI2_LOAD                                     BIT(20)
5766 +#define mPCI3_LOAD                                     BIT(21)
5767 +#define FP_BUT_LOAD                                    BIT(22)
5768 +#define FP_BUT_HEADER_LOAD     BIT(23)
5769 +#define FP_LED_LOAD                                    BIT(24)
5770 +#define FP_LED_HEADER_LOAD     BIT(25)
5771 +#define FP_TAMPER_LOAD                 BIT(26)
5772 +#define HEADER_33v_LOAD                        BIT(27)
5773 +#define SATA_POWER_LOAD                        BIT(28)
5774 +#define FP_POWER_LOAD                          BIT(29)
5775 +#define GPIO_HEADER_LOAD               BIT(30)
5776 +#define GSP_BAT_LOAD                           BIT(31)
5777 +
5778 +// Config 2 Bitmap
5779 +#define FAN_LOAD                                               BIT(0)
5780 +#define SPI_FLASH_LOAD                 BIT(1)
5781 +#define NOR_FLASH_LOAD                 BIT(2)
5782 +#define GPS_LOAD                                               BIT(3)
5783 +#define SUPPLY_5v_LOAD                 BIT(6)
5784 +#define SUPPLY_33v_LOAD                        BIT(7)
5785 +
5786 +
5787 +#endif /* __ASM_ARCH_PLATFORM_H */
5788 +#endif
5789 --- /dev/null
5790 +++ b/arch/arm/mach-cns3xxx/include/mach/pm.h
5791 @@ -0,0 +1,333 @@
5792 +/******************************************************************************
5793 + *
5794 + *  Copyright (c) 2008 Cavium Networks
5795 + *
5796 + *  This file is free software; you can redistribute it and/or modify
5797 + *  it under the terms of the GNU General Public License, Version 2, as
5798 + *  published by the Free Software Foundation.
5799 + *
5800 + *  This file is distributed in the hope that it will be useful,
5801 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
5802 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
5803 + *  NONINFRINGEMENT.  See the GNU General Public License for more details.
5804 + *
5805 + *  You should have received a copy of the GNU General Public License
5806 + *  along with this file; if not, write to the Free Software
5807 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or
5808 + *  visit http://www.gnu.org/licenses/.
5809 + *
5810 + *  This file may also be available under a different license from Cavium.
5811 + *  Contact Cavium Networks for more information
5812 + *
5813 + ******************************************************************************/
5814 +
5815 +#ifndef _CNS3XXX_PM_H_
5816 +#define  _CNS3XXX_PM_H_
5817 +#include <mach/board.h>
5818 +#define PMU_REG_VALUE(offset) (*((volatile unsigned int *)(CNS3XXX_PM_BASE_VIRT+offset)))
5819 +
5820 +#define PM_CLK_GATE_REG                                PMU_REG_VALUE(0x000)
5821 +#define PM_SOFT_RST_REG                                PMU_REG_VALUE(0x004)
5822 +#define PM_HS_CFG_REG                          PMU_REG_VALUE(0x008)
5823 +#define PM_CACTIVE_STA_REG                     PMU_REG_VALUE(0x00C)
5824 +#define PM_PWR_STA_REG                         PMU_REG_VALUE(0x010)
5825 +#define PM_CLK_CTRL_REG                                PMU_REG_VALUE(0x014)
5826 +#define PM_PLL_LCD_I2S_CTRL_REG                PMU_REG_VALUE(0x018)
5827 +#define PM_PLL_HM_PD_CTRL_REG          PMU_REG_VALUE(0x01C)
5828 +#define PM_REGULAT_CTRL_REG                    PMU_REG_VALUE(0x020)
5829 +#define PM_WDT_CTRL_REG                                PMU_REG_VALUE(0x024)
5830 +#define PM_WU_CTRL0_REG                                PMU_REG_VALUE(0x028)
5831 +#define PM_WU_CTRL1_REG                                PMU_REG_VALUE(0x02C)
5832 +#define PM_CSR_REG                                     PMU_REG_VALUE(0x030)
5833 +
5834 +/* PM_CLK_GATE_REG */
5835 +#define PM_CLK_GATE_REG_OFFSET_SDIO                            (25)
5836 +#define PM_CLK_GATE_REG_OFFSET_GPU                             (24)
5837 +#define PM_CLK_GATE_REG_OFFSET_CIM                             (23)
5838 +#define PM_CLK_GATE_REG_OFFSET_LCDC                            (22)
5839 +#define PM_CLK_GATE_REG_OFFSET_I2S                             (21)
5840 +#define PM_CLK_GATE_REG_OFFSET_RAID                            (20)
5841 +#define PM_CLK_GATE_REG_OFFSET_SATA                            (19)
5842 +#define PM_CLK_GATE_REG_OFFSET_PCIE0                   (17)
5843 +#define PM_CLK_GATE_REG_OFFSET_PCIE1                   (18)
5844 +#define PM_CLK_GATE_REG_OFFSET_USB_HOST                        (16)
5845 +#define PM_CLK_GATE_REG_OFFSET_USB_OTG                 (15)
5846 +#define PM_CLK_GATE_REG_OFFSET_TIMER                   (14)
5847 +#define PM_CLK_GATE_REG_OFFSET_CRYPTO                  (13)
5848 +#define PM_CLK_GATE_REG_OFFSET_HCIE                            (12)
5849 +#define PM_CLK_GATE_REG_OFFSET_SWITCH                  (11)
5850 +#define PM_CLK_GATE_REG_OFFSET_GPIO                            (10)
5851 +#define PM_CLK_GATE_REG_OFFSET_UART3                   (9)
5852 +#define PM_CLK_GATE_REG_OFFSET_UART2                   (8)
5853 +#define PM_CLK_GATE_REG_OFFSET_UART1                   (7)
5854 +#define PM_CLK_GATE_REG_OFFSET_RTC                             (5)
5855 +#define PM_CLK_GATE_REG_OFFSET_GDMA                            (4)
5856 +#define PM_CLK_GATE_REG_OFFSET_SPI_PCM_I2C             (3)
5857 +#define PM_CLK_GATE_REG_OFFSET_SMC_NFI                 (1)
5858 +#define PM_CLK_GATE_REG_MASK                           (0x03FFFFBA)
5859 +
5860 +/* PM_SOFT_RST_REG */
5861 +#define PM_SOFT_RST_REG_OFFST_WARM_RST_FLAG            (31) 
5862 +#define PM_SOFT_RST_REG_OFFST_CPU1                             (29) 
5863 +#define PM_SOFT_RST_REG_OFFST_CPU0                             (28)
5864 +#define PM_SOFT_RST_REG_OFFST_SDIO                             (25)
5865 +#define PM_SOFT_RST_REG_OFFST_GPU                              (24)
5866 +#define PM_SOFT_RST_REG_OFFST_CIM                              (23)
5867 +#define PM_SOFT_RST_REG_OFFST_LCDC                             (22)
5868 +#define PM_SOFT_RST_REG_OFFST_I2S                              (21)
5869 +#define PM_SOFT_RST_REG_OFFST_RAID                             (20)
5870 +#define PM_SOFT_RST_REG_OFFST_SATA                             (19)
5871 +#define PM_SOFT_RST_REG_OFFST_PCIE1                            (18)
5872 +#define PM_SOFT_RST_REG_OFFST_PCIE0                            (17)
5873 +#define PM_SOFT_RST_REG_OFFST_USB_HOST                 (16)
5874 +#define PM_SOFT_RST_REG_OFFST_USB_OTG                  (15)
5875 +#define PM_SOFT_RST_REG_OFFST_TIMER                            (14)
5876 +#define PM_SOFT_RST_REG_OFFST_CRYPTO                   (13)
5877 +#define PM_SOFT_RST_REG_OFFST_HCIE                             (12)
5878 +#define PM_SOFT_RST_REG_OFFST_SWITCH                   (11)
5879 +#define PM_SOFT_RST_REG_OFFST_GPIO                             (10)
5880 +#define PM_SOFT_RST_REG_OFFST_UART3                            (9)
5881 +#define PM_SOFT_RST_REG_OFFST_UART2                            (8)
5882 +#define PM_SOFT_RST_REG_OFFST_UART1                            (7)
5883 +#define PM_SOFT_RST_REG_OFFST_RTC                              (5)
5884 +#define PM_SOFT_RST_REG_OFFST_GDMA                             (4)
5885 +#define PM_SOFT_RST_REG_OFFST_SPI_PCM_I2C              (3)
5886 +#define PM_SOFT_RST_REG_OFFST_DMC                              (2)
5887 +#define PM_SOFT_RST_REG_OFFST_SMC_NFI                  (1)
5888 +#define PM_SOFT_RST_REG_OFFST_GLOBAL                   (0)
5889 +#define PM_SOFT_RST_REG_MASK                           (0xF3FFFFBF)
5890 +
5891 +/* PMHS_CFG_REG */
5892 +#define PM_HS_CFG_REG_OFFSET_SDIO                              (25)
5893 +#define PM_HS_CFG_REG_OFFSET_GPU                               (24)
5894 +#define PM_HS_CFG_REG_OFFSET_CIM                               (23)
5895 +#define PM_HS_CFG_REG_OFFSET_LCDC                              (22)
5896 +#define PM_HS_CFG_REG_OFFSET_I2S                               (21)
5897 +#define PM_HS_CFG_REG_OFFSET_RAID                              (20)
5898 +#define PM_HS_CFG_REG_OFFSET_SATA                              (19)
5899 +#define PM_HS_CFG_REG_OFFSET_PCIE1                             (18)
5900 +#define PM_HS_CFG_REG_OFFSET_PCIE0                             (17)
5901 +#define PM_HS_CFG_REG_OFFSET_USB_HOST                  (16)
5902 +#define PM_HS_CFG_REG_OFFSET_USB_OTG                   (15)
5903 +#define PM_HS_CFG_REG_OFFSET_TIMER                             (14)
5904 +#define PM_HS_CFG_REG_OFFSET_CRYPTO                            (13)
5905 +#define PM_HS_CFG_REG_OFFSET_HCIE                              (12)
5906 +#define PM_HS_CFG_REG_OFFSET_SWITCH                            (11)
5907 +#define PM_HS_CFG_REG_OFFSET_GPIO                              (10)
5908 +#define PM_HS_CFG_REG_OFFSET_UART3                             (9)
5909 +#define PM_HS_CFG_REG_OFFSET_UART2                             (8)
5910 +#define PM_HS_CFG_REG_OFFSET_UART1                             (7)
5911 +#define PM_HS_CFG_REG_OFFSET_RTC                               (5)
5912 +#define PM_HS_CFG_REG_OFFSET_GDMA                              (4)
5913 +#define PM_HS_CFG_REG_OFFSET_SPI_PCM_I2S               (3)
5914 +#define PM_HS_CFG_REG_OFFSET_DMC                               (2)
5915 +#define PM_HS_CFG_REG_OFFSET_SMC_NFI                   (1)
5916 +#define PM_HS_CFG_REG_MASK                                     (0x03FFFFBE)
5917 +#define PM_HS_CFG_REG_MASK_SUPPORT                     (0x01100806)
5918 +
5919 +/* PM_CACTIVE_STA_REG */
5920 +#define PM_CACTIVE_STA_REG_OFFSET_SDIO                         (25)
5921 +#define PM_CACTIVE_STA_REG_OFFSET_GPU                          (24)
5922 +#define PM_CACTIVE_STA_REG_OFFSET_CIM                          (23)
5923 +#define PM_CACTIVE_STA_REG_OFFSET_LCDC                         (22)
5924 +#define PM_CACTIVE_STA_REG_OFFSET_I2S                          (21)
5925 +#define PM_CACTIVE_STA_REG_OFFSET_RAID                         (20)
5926 +#define PM_CACTIVE_STA_REG_OFFSET_SATA                         (19)
5927 +#define PM_CACTIVE_STA_REG_OFFSET_PCIE1                                (18)
5928 +#define PM_CACTIVE_STA_REG_OFFSET_PCIE0                                (17)
5929 +#define PM_CACTIVE_STA_REG_OFFSET_USB_HOST                     (16)
5930 +#define PM_CACTIVE_STA_REG_OFFSET_USB_OTG                      (15)
5931 +#define PM_CACTIVE_STA_REG_OFFSET_TIMER                                (14)
5932 +#define PM_CACTIVE_STA_REG_OFFSET_CRYPTO                       (13)
5933 +#define PM_CACTIVE_STA_REG_OFFSET_HCIE                         (12)
5934 +#define PM_CACTIVE_STA_REG_OFFSET_SWITCH                       (11)
5935 +#define PM_CACTIVE_STA_REG_OFFSET_GPIO                         (10)
5936 +#define PM_CACTIVE_STA_REG_OFFSET_UART3                                (9)
5937 +#define PM_CACTIVE_STA_REG_OFFSET_UART2                                (8)
5938 +#define PM_CACTIVE_STA_REG_OFFSET_UART1                                (7)
5939 +#define PM_CACTIVE_STA_REG_OFFSET_RTC                          (5)
5940 +#define PM_CACTIVE_STA_REG_OFFSET_GDMA                         (4)
5941 +#define PM_CACTIVE_STA_REG_OFFSET_SPI_PCM_I2S          (3)
5942 +#define PM_CACTIVE_STA_REG_OFFSET_DMC                          (2)
5943 +#define PM_CACTIVE_STA_REG_OFFSET_SMC_NFI                      (1)
5944 +#define PM_CACTIVE_STA_REG_MASK                                        (0x03FFFFBE)
5945 +
5946 +/* PM_PWR_STA_REG */
5947 +#define PM_PWR_STA_REG_REG_OFFSET_SDIO                         (25)
5948 +#define PM_PWR_STA_REG_REG_OFFSET_GPU                          (24)
5949 +#define PM_PWR_STA_REG_REG_OFFSET_CIM                          (23)
5950 +#define PM_PWR_STA_REG_REG_OFFSET_LCDC                         (22)
5951 +#define PM_PWR_STA_REG_REG_OFFSET_I2S                          (21)
5952 +#define PM_PWR_STA_REG_REG_OFFSET_RAID                         (20)
5953 +#define PM_PWR_STA_REG_REG_OFFSET_SATA                         (19)
5954 +#define PM_PWR_STA_REG_REG_OFFSET_PCIE1                                (18)
5955 +#define PM_PWR_STA_REG_REG_OFFSET_PCIE0                                (17)
5956 +#define PM_PWR_STA_REG_REG_OFFSET_USB_HOST                     (16)
5957 +#define PM_PWR_STA_REG_REG_OFFSET_USB_OTG                      (15)
5958 +#define PM_PWR_STA_REG_REG_OFFSET_TIMER                                (14)
5959 +#define PM_PWR_STA_REG_REG_OFFSET_CRYPTO                       (13)
5960 +#define PM_PWR_STA_REG_REG_OFFSET_HCIE                         (12)
5961 +#define PM_PWR_STA_REG_REG_OFFSET_SWITCH                       (11)
5962 +#define PM_PWR_STA_REG_REG_OFFSET_GPIO                         (10)
5963 +#define PM_PWR_STA_REG_REG_OFFSET_UART3                                (9)
5964 +#define PM_PWR_STA_REG_REG_OFFSET_UART2                                (8)
5965 +#define PM_PWR_STA_REG_REG_OFFSET_UART1                                (7)
5966 +#define PM_PWR_STA_REG_REG_OFFSET_RTC                          (5)
5967 +#define PM_PWR_STA_REG_REG_OFFSET_GDMA                         (4)
5968 +#define PM_PWR_STA_REG_REG_OFFSET_SPI_PCM_I2S          (3)
5969 +#define PM_PWR_STA_REG_REG_OFFSET_DMC                          (2)
5970 +#define PM_PWR_STA_REG_REG_OFFSET_SMC_NFI                      (1)
5971 +#define PM_PWR_STA_REG_REG_MASK                                        (0x03FFFFBE)
5972 +
5973 +/* PM_CLK_CTRL_REG */
5974 +#define PM_CLK_CTRL_REG_OFFSET_I2S_MCLK                        (31)
5975 +#define PM_CLK_CTRL_REG_OFFSET_DDR2_CHG_EN             (30)
5976 +#define PM_CLK_CTRL_REG_OFFSET_PCIE_REF1_EN            (29)
5977 +#define PM_CLK_CTRL_REG_OFFSET_PCIE_REF0_EN            (28)
5978 +#define PM_CLK_CTRL_REG_OFFSET_TIMER_SIM_MODE  (27)
5979 +#define PM_CLK_CTRL_REG_OFFSET_I2SCLK_DIV              (24)
5980 +#define PM_CLK_CTRL_REG_OFFSET_I2SCLK_SEL              (22)
5981 +#define PM_CLK_CTRL_REG_OFFSET_CLKOUT_DIV              (20)
5982 +#define PM_CLK_CTRL_REG_OFFSET_CLKOUT_SEL              (16)
5983 +#define PM_CLK_CTRL_REG_OFFSET_MDC_DIV                 (14)
5984 +#define PM_CLK_CTRL_REG_OFFSET_CRYPTO_CLK_SEL  (12)
5985 +#define PM_CLK_CTRL_REG_OFFSET_CPU_PWR_MODE            (9)
5986 +#define PM_CLK_CTRL_REG_OFFSET_PLL_DDR2_SEL            (7)
5987 +#define PM_CLK_CTRL_REG_OFFSET_DIV_IMMEDIATE   (6)
5988 +#define PM_CLK_CTRL_REG_OFFSET_CPU_CLK_DIV             (4)
5989 +#define PM_CLK_CTRL_REG_OFFSET_PLL_CPU_SEL             (0)
5990 +
5991 +#define PM_CPU_CLK_DIV(DIV) { \
5992 +       PM_CLK_CTRL_REG &= ~((0x3) << PM_CLK_CTRL_REG_OFFSET_CPU_CLK_DIV); \
5993 +       PM_CLK_CTRL_REG |= (((DIV)&0x3) << PM_CLK_CTRL_REG_OFFSET_CPU_CLK_DIV); \
5994 +}
5995 +
5996 +#define PM_PLL_CPU_SEL(CPU) { \
5997 +       PM_CLK_CTRL_REG &= ~((0xF) << PM_CLK_CTRL_REG_OFFSET_PLL_CPU_SEL); \
5998 +       PM_CLK_CTRL_REG |= (((CPU)&0xF) << PM_CLK_CTRL_REG_OFFSET_PLL_CPU_SEL); \
5999 +}
6000 +       
6001 +/* PM_PLL_LCD_I2S_CTRL_REG */
6002 +#define PM_PLL_LCD_I2S_CTRL_REG_OFFSET_MCLK_SMC_DIV    (22)
6003 +#define PM_PLL_LCD_I2S_CTRL_REG_OFFSET_R_SEL           (17)
6004 +#define PM_PLL_LCD_I2S_CTRL_REG_OFFSET_PLL_LCD_P       (11)
6005 +#define PM_PLL_LCD_I2S_CTRL_REG_OFFSET_PLL_LCD_M       (3)
6006 +#define PM_PLL_LCD_I2S_CTRL_REG_OFFSET_PLL_LCD_S       (0)
6007 +
6008 +/* PM_PLL_HM_PD_CTRL_REG */
6009 +/*
6010 +#define PM_PLL_HM_PD_CTRL_REG_OFFSET_PCIE_PHY1         (13)
6011 +#define PM_PLL_HM_PD_CTRL_REG_OFFSET_PCIE_PHY0         (12)
6012 +*/
6013 +#define PM_PLL_HM_PD_CTRL_REG_OFFSET_SATA_PHY1         (11)
6014 +#define PM_PLL_HM_PD_CTRL_REG_OFFSET_SATA_PHY0         (10)
6015 +/*
6016 +#define PM_PLL_HM_PD_CTRL_REG_OFFSET_USB_PHY1          (9)
6017 +#define PM_PLL_HM_PD_CTRL_REG_OFFSET_USB_PHY0          (8)
6018 +*/
6019 +#define PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_I2SCD         (6)
6020 +#define PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_I2S           (5)
6021 +#define PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_LCD           (4)
6022 +#define PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_USB           (3)
6023 +#define PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_RGMII         (2)
6024 +#define PM_PLL_HM_PD_CTRL_REG_MASK                             (0x00000C7C)
6025 +
6026 +/* PM_REGULAT_CTRL_REG */
6027 +
6028 +/* PM_WDT_CTRL_REG */
6029 +#define PM_WDT_CTRL_REG_OFFSET_RESET_CPU_ONLY          (0)
6030 +
6031 +/* PM_WU_CTRL0_REG */
6032 +
6033 +/* PM_WU_CTRL1_REG */
6034 +
6035 +/* PM_CSR_REG - Clock Scaling Register*/
6036 +#define PM_CSR_REG_OFFSET_CSR_EN               (30)
6037 +#define PM_CSR_REG_OFFSET_CSR_NUM              (0)
6038 +
6039 +
6040 +#define CNS3XXX_PWR_CLK_EN(BLOCK) (0x1<<PM_CLK_GATE_REG_OFFSET_##BLOCK)
6041 +
6042 +/* Software reset*/
6043 +#define CNS3XXX_PWR_SOFTWARE_RST(BLOCK) (0x1<<PM_SOFT_RST_REG_OFFST_##BLOCK)
6044 +
6045 +
6046 +
6047 +/* CNS3XXX support several power saving mode as following,
6048 + * DFS, IDLE, HALT, DOZE, SLEEP, Hibernate
6049 + */
6050 +#define CNS3XXX_PWR_CPU_MODE_DFS               (0)
6051 +#define CNS3XXX_PWR_CPU_MODE_IDLE              (1)
6052 +#define CNS3XXX_PWR_CPU_MODE_HALT              (2)
6053 +#define CNS3XXX_PWR_CPU_MODE_DOZE              (3)
6054 +#define CNS3XXX_PWR_CPU_MODE_SLEEP             (4)
6055 +#define CNS3XXX_PWR_CPU_MODE_HIBERNATE (5)
6056 +
6057 +
6058 +/* Enable functional block */
6059 +#if 0
6060 +#define CNS3XXX_PWR_PLL_PCIE_PHY1      (0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PCIE_PHY1)
6061 +#define CNS3XXX_PWR_PLL_PCIE_PHY0      (0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PCIE_PHY0)
6062 +#define CNS3XXX_PWR_PLL_SATA_PHY1      (0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_SATA_PHY1)
6063 +#define CNS3XXX_PWR_PLL_SATA_PHY0      (0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_USB_PHY0)
6064 +#define CNS3XXX_PWR_PLL_USB_PHY1       (0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_USB_PHY1)
6065 +#define CNS3XXX_PWR_PLL_USB_PHY0       (0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_USB_PHY0)
6066 +#define CNS3XXX_PWR_PLL_I2SCD          (0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_I2SCD)
6067 +#define CNS3XXX_PWR_PLL_I2S                    (0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_I2S)
6068 +#define CNS3XXX_PWR_PLL_LCD                    (0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_LCD)
6069 +#define CNS3XXX_PWR_PLL_USB                    (0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_USB)
6070 +#define CNS3XXX_PWR_PLL_RGMII          (0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_RGMII)
6071 +#else
6072 +#define CNS3XXX_PWR_PLL(BLOCK) (0x1<<PM_PLL_HM_PD_CTRL_REG_OFFSET_##BLOCK)
6073 +#endif
6074 +#define CNS3XXX_PWR_PLL_ALL                    PM_PLL_HM_PD_CTRL_REG_MASK
6075 +
6076 +void cns3xxx_pwr_power_up(unsigned int dev_num);
6077 +void cns3xxx_pwr_power_down(unsigned int dev_num);
6078 +
6079 +
6080 +/* Change CPU frequency and divider */
6081 +#define CNS3XXX_PWR_PLL_CPU_300MHZ             (0)
6082 +#define CNS3XXX_PWR_PLL_CPU_333MHZ             (1)
6083 +#define CNS3XXX_PWR_PLL_CPU_366MHZ             (2)
6084 +#define CNS3XXX_PWR_PLL_CPU_400MHZ             (3)
6085 +#define CNS3XXX_PWR_PLL_CPU_433MHZ             (4)
6086 +#define CNS3XXX_PWR_PLL_CPU_466MHZ             (5)
6087 +#define CNS3XXX_PWR_PLL_CPU_500MHZ             (6)
6088 +#define CNS3XXX_PWR_PLL_CPU_533MHZ             (7)
6089 +#define CNS3XXX_PWR_PLL_CPU_566MHZ             (8)
6090 +#define CNS3XXX_PWR_PLL_CPU_600MHZ             (9)
6091 +#define CNS3XXX_PWR_PLL_CPU_633MHZ             (10)
6092 +#define CNS3XXX_PWR_PLL_CPU_666MHZ             (11)
6093 +#define CNS3XXX_PWR_PLL_CPU_700MHZ             (12)
6094 +
6095 +#define CNS3XXX_PWR_CPU_CLK_DIV_BY1            (0) 
6096 +#define CNS3XXX_PWR_CPU_CLK_DIV_BY2            (1)
6097 +#define CNS3XXX_PWR_CPU_CLK_DIV_BY4            (2)
6098 +
6099 +
6100 +void cns3xxx_pwr_change_pll_cpu(unsigned int cpu_sel);
6101 +
6102 +
6103 +
6104 +/* Change DDR2 frequency */
6105 +#define CNS3XXX_PWR_PLL_DDR2_200MHZ            (0)
6106 +#define CNS3XXX_PWR_PLL_DDR2_266MHZ            (1)
6107 +#define CNS3XXX_PWR_PLL_DDR2_333MHZ            (2)
6108 +#define CNS3XXX_PWR_PLL_DDR2_400MHZ            (3)
6109 +
6110 +/* Clock enable*/
6111 +void cns3xxx_pwr_clk_en(unsigned int block);
6112 +/* Software reset*/
6113 +void cns3xxx_pwr_soft_rst(unsigned int block);
6114 +void cns3xxx_pwr_soft_rst_force(unsigned int block);
6115 +/* PLL/Hard macro */
6116 +void cns3xxx_pwr_power_up(unsigned int dev_num);
6117 +void cns3xxx_pwr_power_down(unsigned int dev_num);
6118 +/* Change CPU clock */
6119 +void cns3xxx_pwr_change_cpu_clock(unsigned int cpu_sel, unsigned int div_sel);
6120 +/* System enter into sleep mode */
6121 +void cns3xxx_pwr_sleep(void);
6122 +
6123 +int cns3xxx_cpu_clock(void);
6124 +#endif
6125 --- /dev/null
6126 +++ b/arch/arm/mach-cns3xxx/include/mach/scu.h
6127 @@ -0,0 +1,34 @@
6128 +/*
6129 + *  Copyright (c) 2008 Cavium Networks 
6130 + * 
6131 + *  This file is free software; you can redistribute it and/or modify 
6132 + *  it under the terms of the GNU General Public License, Version 2, as 
6133 + *  published by the Free Software Foundation. 
6134 + *
6135 + *  This file is distributed in the hope that it will be useful, 
6136 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
6137 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
6138 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
6139 + *
6140 + *  You should have received a copy of the GNU General Public License 
6141 + *  along with this file; if not, write to the Free Software 
6142 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
6143 + *  visit http://www.gnu.org/licenses/. 
6144 + *
6145 + *  This file may also be available under a different license from Cavium. 
6146 + *  Contact Cavium Networks for more information
6147 + */
6148 +
6149 +#ifndef __ASMARM_ARCH_SCU_H
6150 +#define __ASMARM_ARCH_SCU_H
6151 +
6152 +/*
6153 + * SCU registers
6154 + */
6155 +#define SCU_CTRL               0x00
6156 +#define SCU_CONFIG             0x04
6157 +#define SCU_CPU_STATUS         0x08
6158 +#define SCU_INVALIDATE         0x0c
6159 +#define SCU_FPGA_REVISION      0x10
6160 +
6161 +#endif
6162 --- /dev/null
6163 +++ b/arch/arm/mach-cns3xxx/include/mach/sdhci.h
6164 @@ -0,0 +1,42 @@
6165 +/*******************************************************************************
6166 + *
6167 + *  arch/arm/mach-cns3xxx/include/mach/sdhci.h
6168 + *
6169 + *  Scott Shu
6170 + *
6171 + *  Copyright (c) 2009 Cavium Networks 
6172 + * 
6173 + *  SDHCI platform data definitions
6174 + *
6175 + *  This file is free software; you can redistribute it and/or modify 
6176 + *  it under the terms of the GNU General Public License, Version 2, as 
6177 + *  published by the Free Software Foundation. 
6178 + *
6179 + *  This file is distributed in the hope that it will be useful, 
6180 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
6181 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
6182 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
6183 + *
6184 + *  You should have received a copy of the GNU General Public License 
6185 + *  along with this file; if not, write to the Free Software 
6186 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
6187 + *  visit http://www.gnu.org/licenses/. 
6188 + *
6189 + *  This file may also be available under a different license from Cavium. 
6190 + *  Contact Cavium Networks for more information
6191 + *
6192 + ******************************************************************************/
6193 +
6194 +#ifndef        _CNS3XXX_SDHCI_H_
6195 +#define        _CNS3XXX_SDHCI_H_
6196 +
6197 +struct platform_device;
6198 +
6199 +struct cns3xxx_sdhci_platdata {
6200 +       unsigned int    max_width;
6201 +       unsigned int    host_caps;
6202 +       char            **clocks;               
6203 +
6204 +       struct sdhci_host * sdhci_host;
6205 +};
6206 +#endif
6207 --- /dev/null
6208 +++ b/arch/arm/mach-cns3xxx/include/mach/smp.h
6209 @@ -0,0 +1,49 @@
6210 +/*
6211 + *  Copyright (c) 2008 Cavium Networks 
6212 + * 
6213 + *  This file is free software; you can redistribute it and/or modify 
6214 + *  it under the terms of the GNU General Public License, Version 2, as 
6215 + *  published by the Free Software Foundation. 
6216 + *
6217 + *  This file is distributed in the hope that it will be useful, 
6218 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
6219 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
6220 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
6221 + *
6222 + *  You should have received a copy of the GNU General Public License 
6223 + *  along with this file; if not, write to the Free Software 
6224 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
6225 + *  visit http://www.gnu.org/licenses/. 
6226 + *
6227 + *  This file may also be available under a different license from Cavium. 
6228 + *  Contact Cavium Networks for more information
6229 + */
6230 +
6231 +#ifndef ASMARM_ARCH_SMP_H
6232 +#define ASMARM_ARCH_SMP_H
6233 +
6234 +
6235 +#include <asm/hardware/gic.h>
6236 +
6237 +#define hard_smp_processor_id()                        \
6238 +       ({                                              \
6239 +               unsigned int cpunum;                    \
6240 +               __asm__("mrc p15, 0, %0, c0, c0, 5"     \
6241 +                       : "=r" (cpunum));               \
6242 +               cpunum &= 0x0F;                         \
6243 +       })
6244 +
6245 +/*
6246 + * We use IRQ1 as the IPI
6247 + */
6248 +static inline void smp_cross_call(const struct cpumask *mask)
6249 +{
6250 +       gic_raise_softirq(mask, 2);
6251 +}
6252 +
6253 +static inline void smp_cross_call_cache(const struct cpumask *mask)
6254 +{
6255 +       gic_raise_softirq(mask, 1);
6256 +}
6257 +
6258 +#endif
6259 --- /dev/null
6260 +++ b/arch/arm/mach-cns3xxx/include/mach/system.h
6261 @@ -0,0 +1,51 @@
6262 +/*
6263 + *  arch/arm/mach-cns3xxx/include/mach/system.h
6264 + *
6265 + *  Copyright (c) 2008 Cavium Networks 
6266 + *  Copyright (C) 2003 ARM Limited
6267 + *  Copyright (C) 2000 Deep Blue Solutions Ltd
6268 + * 
6269 + *  This file is free software; you can redistribute it and/or modify 
6270 + *  it under the terms of the GNU General Public License, Version 2, as 
6271 + *  published by the Free Software Foundation. 
6272 + *
6273 + *  This file is distributed in the hope that it will be useful, 
6274 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
6275 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
6276 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
6277 + *
6278 + *  You should have received a copy of the GNU General Public License 
6279 + *  along with this file; if not, write to the Free Software 
6280 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
6281 + *  visit http://www.gnu.org/licenses/. 
6282 + *
6283 + *  This file may also be available under a different license from Cavium. 
6284 + *  Contact Cavium Networks for more information
6285 + */
6286 +#ifndef __ASM_ARCH_SYSTEM_H
6287 +#define __ASM_ARCH_SYSTEM_H
6288 +
6289 +#include <linux/io.h>
6290 +#include <mach/hardware.h>
6291 +#include <mach/platform.h>
6292 +#include <mach/pm.h>
6293 +
6294 +static inline void arch_idle(void)
6295 +{
6296 +       /*
6297 +        * This should do all the clock switching
6298 +        * and wait for interrupt tricks
6299 +        */
6300 +       cpu_do_idle();
6301 +}
6302 +
6303 +static inline void arch_reset(char mode, const char *cmd)
6304 +{
6305 +       /*
6306 +        * To reset, we hit the on-board reset register
6307 +        * in the system FPGA
6308 +        */
6309 +       cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(GLOBAL));
6310 +}
6311 +
6312 +#endif
6313 --- /dev/null
6314 +++ b/arch/arm/mach-cns3xxx/include/mach/timex.h
6315 @@ -0,0 +1,27 @@
6316 +/*
6317 + *  arch/arm/mach-cns3xxx/include/mach/timex.h
6318 + *
6319 + *  Cavium Networks architecture timex specifications
6320 + *
6321 + *  Copyright (c) 2008 Cavium Networks 
6322 + *  Copyright (C) 2003 ARM Limited
6323 + *
6324 + *  This file is free software; you can redistribute it and/or modify 
6325 + *  it under the terms of the GNU General Public License, Version 2, as 
6326 + *  published by the Free Software Foundation. 
6327 + *
6328 + *  This file is distributed in the hope that it will be useful, 
6329 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
6330 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
6331 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
6332 + *
6333 + *  You should have received a copy of the GNU General Public License 
6334 + *  along with this file; if not, write to the Free Software 
6335 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
6336 + *  visit http://www.gnu.org/licenses/. 
6337 + *
6338 + *  This file may also be available under a different license from Cavium. 
6339 + *  Contact Cavium Networks for more information
6340 + */
6341 +
6342 +#define CLOCK_TICK_RATE                (50000000 / 16)
6343 --- /dev/null
6344 +++ b/arch/arm/mach-cns3xxx/include/mach/uncompress.h
6345 @@ -0,0 +1,68 @@
6346 +/*
6347 + *  arch/arm/mach-cns3xxx/include/mach/uncompress.h
6348 + *
6349 + *  Copyright (c) 2008 Cavium Networks 
6350 + *  Copyright (C) 2003 ARM Limited
6351 + * 
6352 + *  This file is free software; you can redistribute it and/or modify 
6353 + *  it under the terms of the GNU General Public License, Version 2, as 
6354 + *  published by the Free Software Foundation. 
6355 + *
6356 + *  This file is distributed in the hope that it will be useful, 
6357 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
6358 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
6359 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
6360 + *
6361 + *  You should have received a copy of the GNU General Public License 
6362 + *  along with this file; if not, write to the Free Software 
6363 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
6364 + *  visit http://www.gnu.org/licenses/. 
6365 + *
6366 + *  This file may also be available under a different license from Cavium. 
6367 + *  Contact Cavium Networks for more information
6368 + */
6369 +
6370 +#include <mach/hardware.h>
6371 +#include <asm/mach-types.h>
6372 +
6373 +#include <mach/board.h>
6374 +
6375 +#define AMBA_UART_DR(base)     (*(volatile unsigned char *)((base) + 0x00))
6376 +#define AMBA_UART_LCRH(base)   (*(volatile unsigned char *)((base) + 0x2c))
6377 +#define AMBA_UART_CR(base)     (*(volatile unsigned char *)((base) + 0x30))
6378 +#define AMBA_UART_FR(base)     (*(volatile unsigned char *)((base) + 0x18))
6379 +
6380 +/*
6381 + * Return the UART base address
6382 + */
6383 +static inline unsigned long get_uart_base(void)
6384 +{
6385 +       return CNS3XXX_UART0_BASE;
6386 +}
6387 +
6388 +/*
6389 + * This does not append a newline
6390 + */
6391 +static inline void putc(int c)
6392 +{
6393 +       unsigned long base = get_uart_base();
6394 +
6395 +       while (AMBA_UART_FR(base) & (1 << 5))
6396 +               barrier();
6397 +
6398 +       AMBA_UART_DR(base) = c;
6399 +}
6400 +
6401 +static inline void flush(void)
6402 +{
6403 +       unsigned long base = get_uart_base();
6404 +
6405 +       while (AMBA_UART_FR(base) & (1 << 3))
6406 +               barrier();
6407 +}
6408 +
6409 +/*
6410 + * nothing to do
6411 + */
6412 +#define arch_decomp_setup()
6413 +#define arch_decomp_wdog()
6414 --- /dev/null
6415 +++ b/arch/arm/mach-cns3xxx/include/mach/vmalloc.h
6416 @@ -0,0 +1,26 @@
6417 +/*
6418 + *  arch/arm/mach-cns3xxx/include/mach/vmalloc.h
6419 + *
6420 + *  Copyright (c) 2008 Cavium Networks 
6421 + *  Copyright (C) 2003 ARM Limited
6422 + *  Copyright (C) 2000 Russell King.
6423 + *
6424 + *  This file is free software; you can redistribute it and/or modify 
6425 + *  it under the terms of the GNU General Public License, Version 2, as 
6426 + *  published by the Free Software Foundation. 
6427 + *
6428 + *  This file is distributed in the hope that it will be useful, 
6429 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
6430 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
6431 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
6432 + *
6433 + *  You should have received a copy of the GNU General Public License 
6434 + *  along with this file; if not, write to the Free Software 
6435 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
6436 + *  visit http://www.gnu.org/licenses/. 
6437 + *
6438 + *  This file may also be available under a different license from Cavium. 
6439 + *  Contact Cavium Networks for more information
6440 + */
6441 +
6442 +#define VMALLOC_END            (PAGE_OFFSET + 0x18000000)
6443 --- /dev/null
6444 +++ b/arch/arm/mach-cns3xxx/Kconfig
6445 @@ -0,0 +1,101 @@
6446 +menu "CNS3XXX platform type"
6447 +       depends on ARCH_CNS3XXX
6448 +
6449 +config MACH_GW2388
6450 +       bool "Support Gateworks Laguna Platform"
6451 +       select ARM_GIC
6452 +       help
6453 +         Include support for the Cavium Networks CNS3XXX MPCore Platform Baseboard.
6454 +         This is a platform with an on-board ARM11 MPCore and has support for USB, 
6455 +         USB-OTG, MMC/SD/SDIO and PCI-E, etc.
6456 +
6457 +config CNS3XXX_PM_API
6458 +       bool "Support for CNS3XXX Power Managemnet API"
6459 +       depends on ARCH_CNS3XXX
6460 +       default y
6461 +       help
6462 +         Enable support for the CNS3XXX Power Managemnet API.
6463 +
6464 +config CNS3XXX_RAID
6465 +       bool "Support for CNS3XXX RAID"
6466 +       depends on ARCH_CNS3XXX
6467 +       help
6468 +         Enable RAID 4/5/6 Hardware accelartion in CNS3XXX.
6469 +         If unsure, say N.
6470 +
6471 +config CNS3XXX_DMAC
6472 +       bool "Support for CNS3XXX DMAC"
6473 +       depends on ARCH_CNS3XXX
6474 +       help
6475 +         Enable support for the CNS3XXX DMA controllers.
6476 +
6477 +choice
6478 +       prompt "PROM VERSTION"
6479 +       default SILICON
6480 +       help
6481 +         Select the PROM interrupt ID mapping.
6482 +config SILICON
6483 +       bool "CNS3XXX_SILICON"
6484 +        help
6485 +          Temporary option. 
6486 +         Interrupt 
6487 +         ID            Source          Function        Trigger Type
6488 +         ---           -------------   -------------   ----------------
6489 +         32            clkscale_intr   PMU             rising edge
6490 +         33            sdio_intr       SDIO            high level
6491 +         34            l2cc_intr       L2CC            high level
6492 +         35            rtc_intr        RTC             high level
6493 +         36            i2s_intr        I2S             high level
6494 +         37            pcm_intr_n      PCM             high level
6495 +         38            spi_intr_n      SPI             high level
6496 +         39            i2c_intr_n      I2C             high level
6497 +         40            cim_intr        CIM             high level
6498 +         41            gpu_intr        GPU             high level
6499 +         42            lcd_intr        LCD             high level
6500 +         43            gpioa_intr      GPIOA           programmable
6501 +         44            gpiob_intr      GPIOB           programmable
6502 +         45            irda0_intr      UART0           high level
6503 +         46            irda1_intr      UART1           high level
6504 +         47            irda2_intr      UART2           high level
6505 +         48            arm11_intr      ARM11           high level
6506 +         49            swsta_intr      PSE Status      high level
6507 +         50            tstc_r0_intr    PSE R0TxComplete rising edge
6508 +         51            fstc_r0_intr    PSE R0RxComplete rising edge
6509 +         52            tsqe_r0_intr    PSE R0QEmpty    rising edge
6510 +         53            tsqe_r0_intr    PSE R0QFull     rising edge
6511 +         54            tstc_r1_intr    PSE R1TxComplete rising edge
6512 +         55            fstc_r1_intr    PSE R1RxComplete rising edge
6513 +         56            tsqe_r1_intr    PSE R1QEmpty    rising edge
6514 +         57            tsqe_r1_intr    PSE R1QFull     rising edge
6515 +         58            hnat_intr       PPE             high level
6516 +         59            crypto_intr     CRYPTO          high level
6517 +         60            hcie_intr       HCIE            rising edge
6518 +         61            pcie0_intr      PCIE0 Device    high level
6519 +         62            pcie1_intr      PCIE1 Device    high level
6520 +         63            usbotg_intr     USB OTG         high level
6521 +         64            ehci_intr       USB EHCI        high level
6522 +         65            sata_intr       SATA            high level
6523 +         66            raid_intr_n     RAID            high level
6524 +         67            smc_intr_n      SMC             high level
6525 +         68            dmac_abort_intr DMAC            high level
6526 +         86:69         dmac_intr[17:0] DMAC            high level
6527 +         87            pcie0_rc_intr   PCIE0 RC        high level
6528 +         88            pcie1_rc_intr   PCIE1 RC        high level
6529 +         89            timer1_intr     TIMER 1         high level
6530 +         90            timer2_intr     TIMER 2         high level
6531 +         91            ochi_intr_n     USB OCHI        high level
6532 +         92            timer3_intr     TIMER 3         high level
6533 +         93            ext_intr0       Extrenal Pin    programmable
6534 +         94            ext_intr1       Extrenal Pin    programmable
6535 +         95            ext_intr2       Extrenal Pin    programmable
6536 +
6537 +endchoice
6538 +
6539 +config CNS3XXX_GPU_ENVIRONMENT
6540 +       bool "CNS3XXX GPU(GC300 2D Acceleration) Support"
6541 +       default n
6542 +       help
6543 +               Say Y if you want to support 2D acceleration.
6544 +
6545 +endmenu
6546 +
6547 --- /dev/null
6548 +++ b/arch/arm/mach-cns3xxx/laguna-setup.c
6549 @@ -0,0 +1,593 @@
6550 +/*
6551 + *  linux/arch/arm/mach-cns3xxx/laguna.c
6552 + *
6553 + *  Copyright (c) 2008 Cavium Networks 
6554 + *  Copyright (C) 2008 ARM Limited
6555 + *  Copyright (C) 2000 Deep Blue Solutions Ltd
6556 + * 
6557 + *  This file is free software; you can redistribute it and/or modify 
6558 + *  it under the terms of the GNU General Public License, Version 2, as 
6559 + *  published by the Free Software Foundation. 
6560 + *
6561 + *  This file is distributed in the hope that it will be useful, 
6562 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
6563 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
6564 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
6565 + *
6566 + *  You should have received a copy of the GNU General Public License 
6567 + *  along with this file; if not, write to the Free Software 
6568 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
6569 + *  visit http://www.gnu.org/licenses/. 
6570 + *
6571 + *  This file may also be available under a different license from Cavium. 
6572 + *  Contact Cavium Networks for more information
6573 + */
6574 +
6575 +#include <linux/init.h>
6576 +#include <linux/kernel.h>
6577 +#include <linux/device.h>
6578 +#include <linux/if_ether.h>
6579 +#include <linux/socket.h>
6580 +#include <linux/netdevice.h>
6581 +
6582 +#include <linux/serial.h>
6583 +#include <linux/tty.h>
6584 +#include <linux/serial_8250.h>
6585 +#include <linux/slab.h>
6586 +#include <linux/spi/spi.h>
6587 +#include <linux/spi/flash.h>
6588 +#include <linux/i2c.h>
6589 +#include <linux/i2c/at24.h>
6590 +#include <linux/leds.h>
6591 +#include <linux/i2c/pca953x.h>
6592 +#include <linux/mtd/mtd.h>
6593 +#include <linux/mtd/partitions.h>
6594 +#include <linux/mtd/physmap.h>
6595 +#include <linux/mmc/host.h>
6596 +#include <mach/lm.h>
6597 +#include <mach/sdhci.h>
6598 +
6599 +#include <asm/types.h>
6600 +#include <asm/setup.h>
6601 +#include <asm/memory.h>
6602 +#include <mach/hardware.h>
6603 +#include <asm/mach-types.h>
6604 +#include <asm/irq.h>
6605 +#include <asm/mach/arch.h>
6606 +#include <linux/irq.h>
6607 +
6608 +#include "core.h"
6609 +
6610 +struct laguna_board_info {
6611 +       char model[6];
6612 +       u32 config_bitmap;
6613 +       u32 config2_bitmap;
6614 +       u8 nor_flash_size;
6615 +       u8 spi_flash_size;
6616 +};
6617 +
6618 +static struct laguna_board_info laguna_info __initdata;
6619 +
6620 +/*
6621 + * Cavium Networks ARM11 MPCore platform devices
6622 + */
6623 +
6624 +static struct mtd_partition laguna_norflash_partitions[] = {
6625 +       /* Bootloader */
6626 +       {
6627 +               .name = "bootloader",
6628 +               .offset = 0,
6629 +               .size = SZ_256K,
6630 +               .mask_flags = MTD_WRITEABLE, /* force read-only */
6631 +       },
6632 +       /* Bootloader params */
6633 +       {
6634 +               .name = "params",
6635 +               .offset = SZ_256K,
6636 +               .size = SZ_128K,
6637 +               .mask_flags = 0,
6638 +       },
6639 +       /* linux */
6640 +       {
6641 +               .name = "linux",
6642 +               .offset = SZ_256K + SZ_128K,
6643 +               .size = SZ_2M,
6644 +               .mask_flags = 0,
6645 +       },
6646 +       /* Root FS */
6647 +       {
6648 +               .name = "rootfs",
6649 +               .offset = SZ_256K + SZ_128K + SZ_2M,
6650 +               .size = SZ_16M - SZ_256K - SZ_128K - SZ_2M,
6651 +               .mask_flags = 0,
6652 +       }
6653 +};
6654 +
6655 +static struct physmap_flash_data laguna_norflash_data = {
6656 +       .width = 2,
6657 +       .parts = laguna_norflash_partitions,
6658 +       .nr_parts = ARRAY_SIZE(laguna_norflash_partitions),
6659 +};
6660 +
6661 +static struct resource laguna_norflash_resource = {
6662 +       .start          = CNS3XXX_FLASH0_BASE,
6663 +       .end            = CNS3XXX_FLASH0_BASE + SZ_16M - 1,
6664 +       .flags          = IORESOURCE_MEM,
6665 +};
6666 +
6667 +static struct platform_device laguna_norflash_device = {
6668 +       .name = "physmap-flash",
6669 +       .id = 0,
6670 +       .dev = {
6671 +               .platform_data = &laguna_norflash_data,
6672 +       },
6673 +       .num_resources = 1,
6674 +       .resource = &laguna_norflash_resource,
6675 +};
6676 +
6677 +/* UART0 */
6678 +static struct resource laguna_uart_resources[] = {
6679 +  {
6680 +               .start = CNS3XXX_UART0_BASE,
6681 +               .end   = CNS3XXX_UART0_BASE + SZ_4K - 1,
6682 +    .flags    = IORESOURCE_MEM
6683 +  },{
6684 +               .start = CNS3XXX_UART1_BASE,
6685 +               .end   = CNS3XXX_UART1_BASE + SZ_4K - 1,
6686 +    .flags    = IORESOURCE_MEM
6687 +  },{
6688 +               .start = CNS3XXX_UART2_BASE,
6689 +               .end   = CNS3XXX_UART2_BASE + SZ_4K - 1,
6690 +    .flags    = IORESOURCE_MEM
6691 +  },
6692 +};
6693 +
6694 +static struct plat_serial8250_port laguna_uart_data[] = {
6695 +       {
6696 +               .membase        = (char*) (CNS3XXX_UART0_BASE_VIRT),
6697 +               .mapbase        = (CNS3XXX_UART0_BASE),
6698 +               .irq            = IRQ_CNS3XXX_UART0,
6699 +               .iotype         = UPIO_MEM,
6700 +               .flags          = UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE | UPF_NO_TXEN_TEST,
6701 +               .regshift       = 2,
6702 +               .uartclk        = 24000000,
6703 +               .type                                           = PORT_16550A,
6704 +       },{
6705 +               .membase        = (char*) (CNS3XXX_UART1_BASE_VIRT),
6706 +               .mapbase        = (CNS3XXX_UART1_BASE),
6707 +               .irq            = IRQ_CNS3XXX_UART1,
6708 +               .iotype         = UPIO_MEM,
6709 +               .flags          = UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE | UPF_NO_TXEN_TEST,
6710 +               .regshift       = 2,
6711 +               .uartclk        = 24000000,
6712 +               .type                                           = PORT_16550A,
6713 +       },{
6714 +               .membase        = (char*) (CNS3XXX_UART2_BASE_VIRT),
6715 +               .mapbase        = (CNS3XXX_UART2_BASE),
6716 +               .irq            = IRQ_CNS3XXX_UART2,
6717 +               .iotype         = UPIO_MEM,
6718 +               .flags          = UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE | UPF_NO_TXEN_TEST,
6719 +               .regshift       = 2,
6720 +               .uartclk        = 24000000,
6721 +               .type                                           = PORT_16550A,
6722 +       },
6723 +       { },
6724 +};
6725 +
6726 +static struct platform_device laguna_uart = {
6727 +  .name     = "serial8250",
6728 +  .id     = PLAT8250_DEV_PLATFORM,
6729 +  .dev.platform_data  = laguna_uart_data,
6730 +  .num_resources    = 3,
6731 +  .resource   = laguna_uart_resources
6732 +};
6733 +
6734 +/* SDIO, MMC/SD */
6735 +static struct resource laguna_sdio_resource[] = {
6736 +       {
6737 +               .start = CNS3XXX_SDIO_BASE,
6738 +               .end   = CNS3XXX_SDIO_BASE + SZ_4K - 1,
6739 +               .flags = IORESOURCE_MEM,
6740 +       },{
6741 +               .start = IRQ_CNS3XXX_SDIO,
6742 +               .end   = IRQ_CNS3XXX_SDIO,
6743 +               .flags = IORESOURCE_IRQ,
6744 +       },
6745 +};
6746 +
6747 +struct cns3xxx_sdhci_platdata laguna_sdio_platform_data = {
6748 +       .max_width      = 4,
6749 +       .host_caps      = (MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
6750 +};
6751 +
6752 +static u64 laguna_device_sdhci_dmamask = 0xffffffffUL;
6753 +
6754 +static struct platform_device laguna_sdio_device = {
6755 +       .name           = "cns3xxx-sdhci",
6756 +       .id             = 0,
6757 +       .num_resources  = ARRAY_SIZE(laguna_sdio_resource),
6758 +       .resource       = laguna_sdio_resource,
6759 +       .dev            = {
6760 +               .dma_mask               = &laguna_device_sdhci_dmamask,
6761 +               .coherent_dma_mask      = 0xffffffffUL,
6762 +               .platform_data          = &laguna_sdio_platform_data,
6763 +       }
6764 +};
6765 +
6766 +static struct pca953x_platform_data laguna_pca_data = {
6767 +       .gpio_base = 100,
6768 +};
6769 +
6770 +static struct resource laguna_i2c_resource[] = {
6771 +       {
6772 +               .start          = CNS3XXX_SSP_BASE + 0x20,
6773 +               .end                    = 0x7100003f,
6774 +               .flags          = IORESOURCE_MEM,
6775 +       },{
6776 +               .start          = IRQ_CNS3XXX_I2C,
6777 +               .flags          = IORESOURCE_IRQ,
6778 +       },
6779 +};
6780 +
6781 +static struct platform_device laguna_i2c_controller_device = {
6782 +       .name           = "cns3xxx-i2c",
6783 +       .num_resources  = 2,
6784 +       .resource       = laguna_i2c_resource,
6785 +};
6786 +
6787 +static struct resource laguna_usb_ehci_resource[] = {
6788 +       {
6789 +               .start = CNS3XXX_USB_BASE,
6790 +               .end   = CNS3XXX_USB_BASE + SZ_16M - 1,
6791 +               .flags = IORESOURCE_MEM,
6792 +       },{
6793 +               .start = IRQ_CNS3XXX_USB_EHCI,
6794 +               .flags = IORESOURCE_IRQ,
6795 +       },
6796 +};
6797 +
6798 +static u64 laguna_usb_dma_mask = 0xffffffffULL;
6799 +
6800 +static struct platform_device laguna_usb_ehci_device = {
6801 +       .name           = "cns3xxx-ehci",
6802 +       .num_resources  = ARRAY_SIZE(laguna_usb_ehci_resource),
6803 +       .resource       = laguna_usb_ehci_resource,
6804 +       .dev            = {
6805 +               .dma_mask               = &laguna_usb_dma_mask,
6806 +               .coherent_dma_mask      = 0xffffffffULL,
6807 +       },
6808 +};
6809 +
6810 +static struct resource laguna_usb_ohci_resource[] = {
6811 +       {
6812 +               .start          = CNS3XXX_USB_OHCI_BASE,
6813 +               .end            = CNS3XXX_USB_OHCI_BASE + SZ_16M - 1,
6814 +               .flags          = IORESOURCE_MEM,
6815 +       },{
6816 +               .start          = IRQ_CNS3XXX_USB_OHCI,
6817 +               .flags          = IORESOURCE_IRQ,
6818 +       },
6819 +};
6820 +
6821 +static u64 laguna_usb_ohci_dma_mask = 0xffffffffULL;
6822 +static struct platform_device laguna_usb_ohci_device = {
6823 +    .name = "cns3xxx-ohci",
6824 +    .dev                = {
6825 +        .dma_mask       = &laguna_usb_ohci_dma_mask,
6826 +        .coherent_dma_mask = 0xffffffffULL,
6827 +     },
6828 +    .num_resources = 2,
6829 +    .resource = laguna_usb_ohci_resource,
6830 +};
6831 +
6832 +static u64 laguna_usbotg_dma_mask = 0xffffffffULL;
6833 +static struct lm_device laguna_usb_otg_device = {
6834 +    .dev                = {
6835 +        .dma_mask       = &laguna_usbotg_dma_mask,
6836 +        .coherent_dma_mask = 0xffffffffULL,
6837 +     },
6838 +    .resource           = {
6839 +        .start          = CNS3XXX_USBOTG_BASE,
6840 +        .end            = CNS3XXX_USBOTG_BASE + SZ_16M - 1,
6841 +        .flags          = IORESOURCE_MEM,
6842 +     },
6843 +    .irq      = IRQ_CNS3XXX_USB_OTG,
6844 +};
6845 +
6846 +static struct resource laguna_ahci_resource[] = {
6847 +       {
6848 +               .start          = CNS3XXX_SATA2_BASE,
6849 +               .end            = CNS3XXX_SATA2_BASE + CNS3XXX_SATA2_SIZE - 1,
6850 +               .flags          = IORESOURCE_MEM,
6851 +       },
6852 +       {
6853 +               .start          = IRQ_CNS3XXX_SATA,
6854 +               .end            = IRQ_CNS3XXX_SATA,
6855 +               .flags          = IORESOURCE_IRQ,
6856 +       },
6857 +};
6858 +
6859 +static u64 laguna_device_ahci_dmamask = 0xffffffffUL;
6860 +
6861 +static struct platform_device laguna_ahci = {
6862 +       .name           = "cns3xxx_ahci",
6863 +       .id             = -1,
6864 +       .dev            = {
6865 +               .dma_mask               = &laguna_device_ahci_dmamask,
6866 +               .coherent_dma_mask      = 0xffffffffUL,
6867 +       },
6868 +       .resource       = laguna_ahci_resource,
6869 +       .num_resources  = ARRAY_SIZE(laguna_ahci_resource),
6870 +};
6871 +
6872 +/* SPI Flash */
6873 +static struct mtd_partition laguna_spiflash_partitions[] = {
6874 +       /* Bootloader */
6875 +       {
6876 +               .name           = "bootloader",
6877 +               .offset         = 0,
6878 +               .size           = SZ_128K,
6879 +       },
6880 +       /* Bootloader params */
6881 +       {
6882 +               .name           = "params",
6883 +               .offset         = SZ_128K,
6884 +               .size           = SZ_128K,
6885 +       },
6886 +       /* linux */
6887 +       {
6888 +               .name = "linux",
6889 +               .offset = SZ_256K,
6890 +               .size = 0x180000,
6891 +               .mask_flags = 0,
6892 +       },
6893 +       /* FileSystem */
6894 +       {
6895 +               .name           = "rootfs",
6896 +               .offset         = SZ_256K + 0x180000,
6897 +               .size           = SZ_4M - SZ_256K - 0x180000,
6898 +       }
6899 +};
6900 +
6901 +static struct flash_platform_data laguna_spiflash_data = {
6902 +       .parts          = laguna_spiflash_partitions,
6903 +       .nr_parts       = ARRAY_SIZE(laguna_spiflash_partitions),
6904 +};
6905 +
6906 +static struct spi_board_info __initdata laguna_spi_devices[] = {
6907 +       {
6908 +               .modalias               = "m25p80",
6909 +               .platform_data          =  &laguna_spiflash_data,
6910 +               .max_speed_hz           = 50000000,
6911 +               .bus_num                = 1,
6912 +               .chip_select            = 0,
6913 +       },
6914 +};
6915 +
6916 +static struct platform_device laguna_spi_controller_device = {
6917 +       .name           = "cns3xxx_spi",
6918 +};
6919 +
6920 +static struct gpio_led laguna_gpio_leds[] = {
6921 +       {
6922 +               .name = "user1", /* Green Led */
6923 +               .gpio = 115,
6924 +               .active_low = 1,
6925 +       },
6926 +       {
6927 +               .name = "user2", /* Red Led */
6928 +               .gpio = 114,
6929 +               .active_low = 1,
6930 +       },
6931 +};
6932 +
6933 +static struct gpio_led_platform_data laguna_gpio_leds_data = {
6934 +       .num_leds = 2,
6935 +       .leds = laguna_gpio_leds,
6936 +};
6937 +
6938 +static struct platform_device laguna_gpio_leds_device = {
6939 +       .name = "leds-gpio",
6940 +       .id = -1,
6941 +       .dev.platform_data = &laguna_gpio_leds_data,
6942 +};
6943 +
6944 +static struct eth_plat_info laguna_net_data = {
6945 +       .ports = 3,     // Bring Up both Eth port by Default 
6946 +};
6947 +
6948 +static struct platform_device laguna_net_device = {
6949 +       .name = "cns3xxx-net",
6950 +       .id = -1,
6951 +       .dev.platform_data = &laguna_net_data,
6952 +};
6953 +
6954 +static struct memory_accessor *at24_mem_acc;
6955 +
6956 +static void at24_setup(struct memory_accessor *mem_acc, void *context)
6957 +{
6958 +       char buf[8];
6959 +
6960 +       at24_mem_acc = mem_acc;
6961 +
6962 +  /* Read MAC addresses */
6963 +       if (at24_mem_acc->read(at24_mem_acc, buf, 0x100, 6) == 6)
6964 +               memcpy(&laguna_net_data.eth0_hwaddr, buf, ETH_ALEN);
6965 +       if (at24_mem_acc->read(at24_mem_acc, buf, 0x106, 6) == 6)
6966 +               memcpy(&laguna_net_data.eth1_hwaddr, buf, ETH_ALEN);
6967 +       if (at24_mem_acc->read(at24_mem_acc, buf, 0x10C, 6) == 6)
6968 +               memcpy(&laguna_net_data.eth2_hwaddr, buf, ETH_ALEN);
6969 +       if (at24_mem_acc->read(at24_mem_acc, buf, 0x112, 6) == 6)
6970 +               memcpy(&laguna_net_data.cpu_hwaddr, buf, ETH_ALEN);
6971 +
6972 +       /* Read out Model Information */
6973 +       if (at24_mem_acc->read(at24_mem_acc, buf, 0x130, 16) == 16)
6974 +               memcpy(&laguna_info.model, buf, 16);
6975 +       if (at24_mem_acc->read(at24_mem_acc, buf, 0x140, 1) == 1)
6976 +               memcpy(&laguna_info.nor_flash_size, buf, 1);
6977 +       if (at24_mem_acc->read(at24_mem_acc, buf, 0x141, 1) == 1)
6978 +               memcpy(&laguna_info.spi_flash_size, buf, 1);
6979 +       if (at24_mem_acc->read(at24_mem_acc, buf, 0x142, 4) == 4)
6980 +               memcpy(&laguna_info.config_bitmap, buf, 8);
6981 +       if (at24_mem_acc->read(at24_mem_acc, buf, 0x146, 4) == 4)
6982 +               memcpy(&laguna_info.config2_bitmap, buf, 8);
6983 +};
6984 +
6985 +static struct at24_platform_data laguna_eeprom_info = {
6986 +       .byte_len = 1024,
6987 +       .page_size = 16,
6988 +       .flags = AT24_FLAG_READONLY,
6989 +       .setup = at24_setup,
6990 +};
6991 +
6992 +static struct i2c_board_info __initdata laguna_i2c_devices[] = {
6993 +       {
6994 +               I2C_BOARD_INFO("pca9555", 0x23),
6995 +               .platform_data = &laguna_pca_data,
6996 +       },
6997 +       {
6998 +               I2C_BOARD_INFO("gsp", 0x29),
6999 +       },
7000 +       {
7001 +               I2C_BOARD_INFO ("24c08",0x50),
7002 +               .platform_data = &laguna_eeprom_info,
7003 +       },
7004 +       {
7005 +               I2C_BOARD_INFO("ds1672", 0x68),
7006 +       },
7007 +};
7008 +
7009 +static void __init laguna_init(void)
7010 +{
7011 +       cns3xxx_sys_init();
7012 +
7013 +       platform_device_register(&laguna_i2c_controller_device);
7014 +
7015 +       i2c_register_board_info(0, laguna_i2c_devices, ARRAY_SIZE(laguna_i2c_devices));
7016 +
7017 +       pm_power_off = cns3xxx_power_off;
7018 +}
7019 +
7020 +static int __init laguna_model_setup(void)
7021 +{
7022 +       if (!machine_is_gw2388())
7023 +               return 0;
7024 +
7025 +       printk("Running on Gateworks Laguna %s\n", laguna_info.model);
7026 +
7027 +       if (strncmp(laguna_info.model, "GW", 2) == 0) {
7028 +               if (laguna_info.config_bitmap & ETH0_LOAD)
7029 +                       laguna_net_data.ports |= BIT(0);
7030 +               if (laguna_info.config_bitmap & ETH1_LOAD)
7031 +                       laguna_net_data.ports |= BIT(1);
7032 +               if (laguna_info.config_bitmap & ETH2_LOAD)
7033 +                       laguna_net_data.ports |= BIT(2);
7034 +               if (laguna_net_data.ports)
7035 +                       platform_device_register(&laguna_net_device);
7036 +               
7037 +               if (laguna_info.config_bitmap & (SATA0_LOAD | SATA1_LOAD))
7038 +                       platform_device_register(&laguna_ahci);
7039 +
7040 +               if (laguna_info.config_bitmap & (PCIe0_LOAD))
7041 +                       cns3xxx_pcie_init(1);
7042 +
7043 +               if (laguna_info.config_bitmap & (PCIe1_LOAD))
7044 +                       cns3xxx_pcie_init(2);
7045 +
7046 +               if (laguna_info.config_bitmap & (USB0_LOAD))
7047 +                       lm_device_register(&laguna_usb_otg_device);
7048 +
7049 +               if (laguna_info.config_bitmap & (USB1_LOAD)) {
7050 +                       platform_device_register(&laguna_usb_ehci_device);
7051 +                       platform_device_register(&laguna_usb_ohci_device);
7052 +               }
7053 +
7054 +               if (laguna_info.config_bitmap & (SD_LOAD))
7055 +                       platform_device_register(&laguna_sdio_device);
7056 +
7057 +               if (laguna_info.config_bitmap & (UART0_LOAD))
7058 +                       laguna_uart.num_resources = 1;
7059 +               if (laguna_info.config_bitmap & (UART1_LOAD))
7060 +                       laguna_uart.num_resources = 2;
7061 +               if (laguna_info.config_bitmap & (UART2_LOAD))
7062 +                       laguna_uart.num_resources = 3;
7063 +               platform_device_register(&laguna_uart);
7064 +
7065 +               if (laguna_info.config2_bitmap & (NOR_FLASH_LOAD)) {
7066 +                       switch (laguna_info.nor_flash_size) {
7067 +                               case 1:
7068 +                                       laguna_norflash_partitions[3].size = SZ_8M - SZ_256K - SZ_128K - SZ_2M;
7069 +                                       laguna_norflash_resource.end = CNS3XXX_FLASH0_BASE + SZ_8M - 1;
7070 +                               break;
7071 +                               case 2:
7072 +                                       laguna_norflash_partitions[3].size = SZ_16M - SZ_256K - SZ_128K - SZ_2M;
7073 +                                       laguna_norflash_resource.end = CNS3XXX_FLASH0_BASE + SZ_16M - 1;
7074 +                               break;
7075 +                               case 3:
7076 +                                       laguna_norflash_partitions[3].size = SZ_32M - SZ_256K - SZ_128K - SZ_2M;
7077 +                                       laguna_norflash_resource.end = CNS3XXX_FLASH0_BASE + SZ_32M - 1;
7078 +                               break;
7079 +                               case 4:
7080 +                                       laguna_norflash_partitions[3].size = SZ_64M - SZ_256K - SZ_128K - SZ_2M;
7081 +                                       laguna_norflash_resource.end = CNS3XXX_FLASH0_BASE + SZ_64M - 1;
7082 +                               break;
7083 +                               case 5:
7084 +                                       laguna_norflash_partitions[3].size = SZ_128M - SZ_256K - SZ_128K - SZ_2M;
7085 +                                       laguna_norflash_resource.end = CNS3XXX_FLASH0_BASE + SZ_128M - 1;
7086 +                               break;
7087 +                       }
7088 +                       platform_device_register(&laguna_norflash_device);
7089 +               }
7090 +
7091 +               if (laguna_info.config2_bitmap & (SPI_FLASH_LOAD)) {
7092 +                       switch (laguna_info.spi_flash_size) {
7093 +                               case 1:
7094 +                                       laguna_spiflash_partitions[3].size              = SZ_4M - SZ_256K - 0x180000;
7095 +                               break;
7096 +                               case 2:
7097 +                                       laguna_spiflash_partitions[3].size              = SZ_8M - SZ_256K - 0x180000;
7098 +                               break;
7099 +                               case 3:
7100 +                                       laguna_spiflash_partitions[3].size              = SZ_16M - SZ_256K - 0x180000;
7101 +                               break;
7102 +                               case 4:
7103 +                                       laguna_spiflash_partitions[3].size              = SZ_32M - SZ_256K - 0x180000;
7104 +                               break;
7105 +                               case 5:
7106 +                                       laguna_spiflash_partitions[3].size              = SZ_64M - SZ_256K - 0x180000;
7107 +                               break;
7108 +                       }
7109 +                       spi_register_board_info(laguna_spi_devices, ARRAY_SIZE(laguna_spi_devices));
7110 +               }
7111 +
7112 +               if (laguna_info.config_bitmap & (SPI0_LOAD | SPI1_LOAD))
7113 +               {
7114 +                       platform_device_register(&laguna_spi_controller_device);
7115 +               }
7116 +
7117 +               /*
7118 +                *      Do any model specific setup not known by the bitmap by matching
7119 +                *  the first 6 characters of the model name
7120 +                */
7121 +
7122 +               if (strncmp(laguna_info.model, "GW2388", 6) == 0)
7123 +               {
7124 +                       platform_device_register(&laguna_gpio_leds_device);
7125 +               }
7126 +       } else {
7127 +               // Do some defaults here, not sure what yet
7128 +       }
7129 +
7130 +       return 0;
7131 +}
7132 +late_initcall(laguna_model_setup);
7133 +
7134 +MACHINE_START(GW2388, "Gateworks Laguna Platform")
7135 +       .phys_io        = CNS3XXX_UART0_BASE,
7136 +       .io_pg_offst    = (CNS3XXX_UART0_BASE_VIRT >> 18) & 0xfffc,
7137 +       .boot_params    = 0x00000100,
7138 +       .map_io         = cns3xxx_map_io,
7139 +       .init_irq       = cns3xxx_init_irq,
7140 +       .timer          = &cns3xxx_timer,
7141 +       .init_machine   = laguna_init,
7142 +MACHINE_END
7143 --- /dev/null
7144 +++ b/arch/arm/mach-cns3xxx/lm.c
7145 @@ -0,0 +1,98 @@
7146 +/*
7147 + *  linux/arch/arm/mach-integrator/lm.c
7148 + *
7149 + *  Copyright (C) 2003 Deep Blue Solutions Ltd, All Rights Reserved.
7150 + *
7151 + * This program is free software; you can redistribute it and/or modify
7152 + * it under the terms of the GNU General Public License version 2 as
7153 + * published by the Free Software Foundation.
7154 + */
7155 +#include <linux/module.h>
7156 +#include <linux/init.h>
7157 +#include <linux/device.h>
7158 +#include <linux/version.h>
7159 +#include <linux/slab.h>
7160 +
7161 +#include <mach/lm.h>
7162 +
7163 +#define to_lm_device(d)        container_of(d, struct lm_device, dev)
7164 +#define to_lm_driver(d)        container_of(d, struct lm_driver, drv)
7165 +
7166 +static int lm_match(struct device *dev, struct device_driver *drv)
7167 +{
7168 +       return 1;
7169 +}
7170 +
7171 +static int lm_bus_probe(struct device *dev)
7172 +{
7173 +       struct lm_device *lmdev = to_lm_device(dev);
7174 +       struct lm_driver *lmdrv = to_lm_driver(dev->driver);
7175 +
7176 +       return lmdrv->probe(lmdev);
7177 +}
7178 +
7179 +static int lm_bus_remove(struct device *dev)
7180 +{
7181 +       struct lm_device *lmdev = to_lm_device(dev);
7182 +       struct lm_driver *lmdrv = to_lm_driver(dev->driver);
7183 +
7184 +       if (lmdrv->remove)
7185 +               lmdrv->remove(lmdev);
7186 +       return 0;
7187 +}
7188 +
7189 +static struct bus_type lm_bustype = {
7190 +       .name           = "logicmodule",
7191 +       .match          = lm_match,
7192 +       .probe          = lm_bus_probe,
7193 +       .remove         = lm_bus_remove,
7194 +};
7195 +
7196 +static int __init lm_init(void)
7197 +{
7198 +       return bus_register(&lm_bustype);
7199 +}
7200 +
7201 +postcore_initcall(lm_init);
7202 +
7203 +int lm_driver_register(struct lm_driver *drv)
7204 +{
7205 +       drv->drv.bus = &lm_bustype;
7206 +       return driver_register(&drv->drv);
7207 +}
7208 +
7209 +void lm_driver_unregister(struct lm_driver *drv)
7210 +{
7211 +       driver_unregister(&drv->drv);
7212 +}
7213 +
7214 +static void lm_device_release(struct device *dev)
7215 +{
7216 +       struct lm_device *d = to_lm_device(dev);
7217 +
7218 +       kfree(d);
7219 +}
7220 +
7221 +int lm_device_register(struct lm_device *dev)
7222 +{
7223 +       int ret;
7224 +
7225 +       dev->dev.release = lm_device_release;
7226 +       dev->dev.bus = &lm_bustype;
7227 +
7228 +       ret = dev_set_name(&dev->dev, "lm%d", dev->id);
7229 +       if (ret)
7230 +               return ret;
7231 +       dev->resource.name = dev_name(&dev->dev);
7232 +
7233 +       ret = request_resource(&iomem_resource, &dev->resource);
7234 +       if (ret == 0) {
7235 +               ret = device_register(&dev->dev);
7236 +               if (ret)
7237 +                       release_resource(&dev->resource);
7238 +       }
7239 +       return ret;
7240 +}
7241 +
7242 +EXPORT_SYMBOL(lm_driver_register);
7243 +EXPORT_SYMBOL(lm_driver_unregister);
7244 --- /dev/null
7245 +++ b/arch/arm/mach-cns3xxx/localtimer.c
7246 @@ -0,0 +1,26 @@
7247 +/*
7248 + *  linux/arch/arm/mach-cns3xxx/localtimer.c
7249 + *
7250 + *  Copyright (C) 2002 ARM Ltd.
7251 + *  All Rights Reserved
7252 + *
7253 + * This program is free software; you can redistribute it and/or modify
7254 + * it under the terms of the GNU General Public License version 2 as
7255 + * published by the Free Software Foundation.
7256 + */
7257 +#include <linux/init.h>
7258 +#include <linux/smp.h>
7259 +#include <linux/clockchips.h>
7260 +
7261 +#include <asm/irq.h>
7262 +#include <asm/smp_twd.h>
7263 +#include <asm/localtimer.h>
7264 +
7265 +/*
7266 + * Setup the local clock events for a CPU.
7267 + */
7268 +void __cpuinit local_timer_setup(struct clock_event_device *evt)
7269 +{
7270 +       evt->irq = IRQ_LOCALTIMER;
7271 +       twd_timer_setup(evt);
7272 +}
7273 --- /dev/null
7274 +++ b/arch/arm/mach-cns3xxx/Makefile
7275 @@ -0,0 +1,14 @@
7276 +#
7277 +# Makefile for the linux kernel.
7278 +#
7279 +
7280 +obj-y                                  := core.o lm.o
7281 +obj-$(CONFIG_MACH_GW2388)              += laguna-setup.o
7282 +obj-$(CONFIG_SMP)                      += platsmp.o headsmp.o
7283 +obj-$(CONFIG_HOTPLUG_CPU)              += hotplug.o
7284 +obj-$(CONFIG_LOCAL_TIMERS)             += localtimer.o
7285 +obj-$(CONFIG_PCIEPORTBUS)              += pcie.o
7286 +obj-$(CONFIG_CNS3XXX_RAID)                     += rdma.o
7287 +obj-$(CONFIG_CNS3XXX_DMAC)             += dmac.o
7288 +obj-$(CONFIG_CNS3XXX_PM_API)   += pm.o
7289 +
7290 --- /dev/null
7291 +++ b/arch/arm/mach-cns3xxx/Makefile.boot
7292 @@ -0,0 +1,4 @@
7293 +   zreladdr-y  := 0x00008000
7294 +params_phys-y  := 0x00000100
7295 +initrd_phys-y  := 0x00C00000
7296 +kernel_phys-y  := 0x00600000
7297 --- /dev/null
7298 +++ b/arch/arm/mach-cns3xxx/platsmp.c
7299 @@ -0,0 +1,220 @@
7300 +/*
7301 + *  linux/arch/arm/mach-cns3xxx/platsmp.c
7302 + *
7303 + *  Copyright (c) 2008 Cavium Networks 
7304 + *  Copyright (C) 2002 ARM Ltd.
7305 + *  All Rights Reserved
7306 + * 
7307 + *  This file is free software; you can redistribute it and/or modify 
7308 + *  it under the terms of the GNU General Public License, Version 2, as 
7309 + *  published by the Free Software Foundation. 
7310 + *
7311 + *  This file is distributed in the hope that it will be useful, 
7312 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
7313 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
7314 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
7315 + *
7316 + *  You should have received a copy of the GNU General Public License 
7317 + *  along with this file; if not, write to the Free Software 
7318 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
7319 + *  visit http://www.gnu.org/licenses/. 
7320 + *
7321 + *  This file may also be available under a different license from Cavium. 
7322 + *  Contact Cavium Networks for more information
7323 + */
7324 +
7325 +#include <linux/init.h>
7326 +#include <linux/errno.h>
7327 +#include <linux/delay.h>
7328 +#include <linux/device.h>
7329 +#include <linux/jiffies.h>
7330 +#include <linux/smp.h>
7331 +#include <linux/io.h>
7332 +
7333 +#include <asm/cacheflush.h>
7334 +#include <mach/hardware.h>
7335 +#include <asm/mach-types.h>
7336 +#include <asm/localtimer.h>
7337 +
7338 +#include <asm/smp_scu.h>
7339 +
7340 +#include "core.h"
7341 +
7342 +extern void cns3xxx_secondary_startup(void);
7343 +
7344 +/*
7345 + * control for which core is the next to come out of the secondary
7346 + * boot "holding pen"
7347 + */
7348 +volatile int __cpuinitdata pen_release = -1;
7349 +
7350 +static void __iomem *scu_base_addr(void)
7351 +{
7352 +       return (void __iomem *)(CNS3XXX_TC11MP_SCU_BASE_VIRT);
7353 +}
7354 +
7355 +static inline unsigned int get_core_count(void)
7356 +{
7357 +       void __iomem *scu_base = scu_base_addr();
7358 +       if (scu_base)
7359 +               return scu_get_core_count(scu_base);
7360 +       return 1;
7361 +}
7362 +
7363 +static DEFINE_SPINLOCK(boot_lock);
7364 +
7365 +void __cpuinit platform_secondary_init(unsigned int cpu)
7366 +{
7367 +       trace_hardirqs_off();
7368 +
7369 +       /*
7370 +        * if any interrupts are already enabled for the primary
7371 +        * core (e.g. timer irq), then they will not have been enabled
7372 +        * for us: do so
7373 +        */
7374 +       gic_cpu_init(0, (void __iomem *)(CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT));
7375 +       set_interrupt_pri(1, 0); // set cache broadcast ipi to highest priority
7376 +
7377 +       /*
7378 +        * let the primary processor know we're out of the
7379 +        * pen, then head off into the C entry point
7380 +        */
7381 +       pen_release = -1;
7382 +       smp_wmb();
7383 +
7384 +       /*
7385 +        * Synchronise with the boot thread.
7386 +        */
7387 +       spin_lock(&boot_lock);
7388 +       spin_unlock(&boot_lock);
7389 +}
7390 +
7391 +int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
7392 +{
7393 +       unsigned long timeout;
7394 +
7395 +       /*
7396 +        * set synchronisation state between this boot processor
7397 +        * and the secondary one
7398 +        */
7399 +       spin_lock(&boot_lock);
7400 +
7401 +       /*
7402 +        * The secondary processor is waiting to be released from
7403 +        * the holding pen - release it, then wait for it to flag
7404 +        * that it has been released by resetting pen_release.
7405 +        *
7406 +        * Note that "pen_release" is the hardware CPU ID, whereas
7407 +        * "cpu" is Linux's internal ID.
7408 +        */
7409 +       pen_release = cpu;
7410 +       flush_cache_all();
7411 +
7412 +       /*
7413 +        * XXX
7414 +        *
7415 +        * This is a later addition to the booting protocol: the
7416 +        * bootMonitor now puts secondary cores into WFI, so
7417 +        * poke_milo() no longer gets the cores moving; we need
7418 +        * to send a soft interrupt to wake the secondary core.
7419 +        * Use smp_cross_call() for this, since there's little
7420 +        * point duplicating the code here
7421 +        */
7422 +       smp_cross_call(cpumask_of(cpu));
7423 +
7424 +       timeout = jiffies + (1 * HZ);
7425 +       while (time_before(jiffies, timeout)) {
7426 +               smp_rmb();
7427 +               if (pen_release == -1)
7428 +                       break;
7429 +
7430 +               udelay(10);
7431 +       }
7432 +
7433 +       /*
7434 +        * now the secondary core is starting up let it run its
7435 +        * calibrations, then wait for it to finish
7436 +        */
7437 +       spin_unlock(&boot_lock);
7438 +
7439 +       return pen_release != -1 ? -ENOSYS : 0;
7440 +}
7441 +
7442 +static void __init poke_milo(void)
7443 +{
7444 +       /* nobody is to be released from the pen yet */
7445 +       pen_release = -1;
7446 +
7447 +       /* write the address of secondary startup into the general purpose register */
7448 +       __raw_writel(virt_to_phys(cns3xxx_secondary_startup), (void __iomem *)(0xFFF07000 + 0x0600));
7449 +
7450 +       mb();
7451 +}
7452 +
7453 +/*
7454 + * Initialise the CPU possible map early - this describes the CPUs
7455 + * which may be present or become present in the system.
7456 + */
7457 +void __init smp_init_cpus(void)
7458 +{
7459 +       unsigned int i, ncores = get_core_count();
7460 +
7461 +       for (i = 0; i < ncores; i++)
7462 +               set_cpu_possible(i, true);
7463 +}
7464 +
7465 +void __init smp_prepare_cpus(unsigned int max_cpus)
7466 +{
7467 +       unsigned int ncores = get_core_count();
7468 +       unsigned int cpu = smp_processor_id();
7469 +       int i;
7470 +
7471 +       /* sanity check */
7472 +       if (ncores == 0) {
7473 +               printk(KERN_ERR
7474 +                      "CNS3XXX: strange CM count of 0? Default to 1\n");
7475 +
7476 +               ncores = 1;
7477 +       }
7478 +
7479 +       if (ncores > NR_CPUS) {
7480 +               printk(KERN_WARNING
7481 +                      "CNS3XXX: no. of cores (%d) greater than configured "
7482 +                      "maximum of %d - clipping\n",
7483 +                      ncores, NR_CPUS);
7484 +               ncores = NR_CPUS;
7485 +       }
7486 +
7487 +       smp_store_cpu_info(cpu);
7488 +
7489 +       /*
7490 +        * are we trying to boot more cores than exist?
7491 +        */
7492 +       if (max_cpus > ncores)
7493 +               max_cpus = ncores;
7494 +
7495 +       /*
7496 +        * Initialise the present map, which describes the set of CPUs
7497 +        * actually populated at the present time.
7498 +        */
7499 +       for (i = 0; i < max_cpus; i++)
7500 +               set_cpu_present(i, true);
7501 +
7502 +       /*
7503 +        * Initialise the SCU if there are more than one CPU and let
7504 +        * them know where to start. Note that, on modern versions of
7505 +        * MILO, the "poke" doesn't actually do anything until each
7506 +        * individual core is sent a soft interrupt to get it out of
7507 +        * WFI
7508 +        */
7509 +       if (max_cpus > 1) {
7510 +               /*
7511 +                * Enable the local timer or broadcast device for the
7512 +                * boot CPU, but only if we have more than one CPU.
7513 +                */
7514 +               percpu_timer_setup();
7515 +
7516 +               scu_enable(scu_base_addr());
7517 +               poke_milo();
7518 +       }
7519 +}
7520 --- /dev/null
7521 +++ b/arch/arm/mach-cns3xxx/pm.c
7522 @@ -0,0 +1,476 @@
7523 +/******************************************************************************
7524 + *
7525 + *  Copyright (c) 2008 Cavium Networks
7526 + *
7527 + *  This file is free software; you can redistribute it and/or modify
7528 + *  it under the terms of the GNU General Public License, Version 2, as
7529 + *  published by the Free Software Foundation.
7530 + *
7531 + *  This file is distributed in the hope that it will be useful,
7532 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
7533 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
7534 + *  NONINFRINGEMENT.  See the GNU General Public License for more details.
7535 + *
7536 + *  You should have received a copy of the GNU General Public License
7537 + *  along with this file; if not, write to the Free Software
7538 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or
7539 + *  visit http://www.gnu.org/licenses/.
7540 + *
7541 + *  This file may also be available under a different license from Cavium.
7542 + *  Contact Cavium Networks for more information
7543 + *
7544 + ******************************************************************************/
7545 +#include <linux/pm.h>
7546 +#include <linux/interrupt.h>
7547 +#include <mach/pm.h>
7548 +#include <linux/init.h> 
7549 +#include <linux/module.h> 
7550 +#include <linux/proc_fs.h> 
7551 +#include <linux/delay.h>
7552 +#include <mach/misc.h>
7553 +
7554 +/*
7555 + * cns3xxx_pwr_clk_en - clock enable 
7556 + * @block: bitmap for peripheral
7557 + */
7558 +void cns3xxx_pwr_clk_en(unsigned int block)
7559 +{
7560 +       PM_CLK_GATE_REG |= (block&PM_CLK_GATE_REG_MASK);
7561 +}
7562 +
7563 +/*
7564 + * cns3xxx_pwr_soft_rst - software reset
7565 + * @block: bitmap for peripheral
7566 + */
7567 +void cns3xxx_pwr_soft_rst_force(unsigned int block)
7568 +{
7569 +       /* bit 0, 28, 29 => program low to reset, 
7570 +        * the other else program low and then high
7571 +        */
7572 +       if (block & 0x30000001) {
7573 +               PM_SOFT_RST_REG &= ~(block&PM_SOFT_RST_REG_MASK);
7574 +       } else {
7575 +               PM_SOFT_RST_REG &= ~(block&PM_SOFT_RST_REG_MASK);
7576 +               PM_SOFT_RST_REG |= (block&PM_SOFT_RST_REG_MASK);
7577 +       }
7578 +}
7579 +
7580 +void cns3xxx_pwr_soft_rst(unsigned int block)
7581 +{
7582 +       static unsigned int soft_reset = 0;
7583 +
7584 +       if(soft_reset & block) {
7585 +               //Because SPI/I2C/GPIO use the same block, just only reset once...
7586 +               return;
7587 +       }
7588 +       else {
7589 +               soft_reset |= block;
7590 +       }
7591 +       cns3xxx_pwr_soft_rst_force(block);
7592 +}      
7593 +       
7594 +/*
7595 + * void cns3xxx_pwr_lp_hs - lower power handshake
7596 + * @dev: bitmap for device 
7597 + *     
7598 + */
7599 +void cns3xxx_lp_hs(unsigned int dev)
7600 +{
7601 +       
7602 +       if (PM_HS_CFG_REG_MASK_SUPPORT & dev) {
7603 +               PM_HS_CFG_REG |= dev;
7604 +
7605 +               /* TODO: disable clock */
7606 +       }
7607 +}
7608 +
7609 +/*
7610 + * cns3xxx_pwr_mode - change CPU power mode
7611 + * @pwr_mode: CPU power mode
7612 + * CNS3XXX_PWR_CPU_MODE_DFS, CNS3XXX_PWR_CPU_MODE_IDLE
7613 + * CNS3XXX_PWR_CPU_MODE_HALT, CNS3XXX_PWR_CPU_MODE_DOZE
7614 + * CNS3XXX_PWR_CPU_MODE_SLEEP, CNS3XXX_PWR_CPU_MODE_HIBERNATE
7615 + */
7616 +static void cns3xxx_pwr_mode(unsigned int pwr_mode)
7617 +{
7618 +       if (CNS3XXX_PWR_CPU_MODE_HIBERNATE < pwr_mode) {
7619 +               return;
7620 +       }
7621 +
7622 +       PM_CLK_CTRL_REG &= 
7623 +                       ~(0x7<<PM_CLK_CTRL_REG_OFFSET_CPU_PWR_MODE);
7624 +       PM_CLK_CTRL_REG |= 
7625 +                       ((pwr_mode&0x7)<<PM_CLK_CTRL_REG_OFFSET_CPU_PWR_MODE);
7626 +};
7627 +
7628 +/* cns3xxx_pwr_power_up - 
7629 + * cns3xxx_pwr_power_down - 
7630 + * @dev_num: bitmap for functional block
7631 + *     CNS3XXX_PWR_PLL_PCIE_PHY1, CNS3XXX_PWR_PLL_PCIE_PHY0
7632 + *     CNS3XXX_PWR_PLL_SATA_PHY1, CNS3XXX_PWR_PLL_SATA_PHY0
7633 + *     CNS3XXX_PWR_PLL_USB_PHY1, CNS3XXX_PWR_PLL_USB_PHY0
7634 + *     CNS3XXX_PWR_PLL_I2SCD, CNS3XXX_PWR_PLL_I2S
7635 + *     CNS3XXX_PWR_PLL_LCD, CNS3XXX_PWR_PLL_USB
7636 + *     CNS3XXX_PWR_PLL_RGMII, CNS3XXX_PWR_PLL_ALL
7637 + */
7638 +void cns3xxx_pwr_power_up(unsigned int dev_num) 
7639 +{
7640 +       PM_PLL_HM_PD_CTRL_REG &= ~(dev_num & CNS3XXX_PWR_PLL_ALL);
7641 +
7642 +       /* TODO: wait for 300us for the PLL output clock locked */
7643 +};
7644 +
7645 +void cns3xxx_pwr_power_down(unsigned int dev_num)
7646 +{
7647 +       /* write '1' to power down */
7648 +       PM_PLL_HM_PD_CTRL_REG |= (dev_num & CNS3XXX_PWR_PLL_ALL);
7649 +};
7650 +
7651 +#if 0
7652 +/* cns3xxx_pwr_change_pll_ddr - change DDR2 frequency
7653 + * @ddr_sel: DDR2 clock select
7654 + *     CNS3XXX_PWR_PLL_DDR2_200MHZ
7655 + *     CNS3XXX_PWR_PLL_DDR2_266MHZ
7656 + *     CNS3XXX_PWR_PLL_DDR2_333MHZ
7657 + *     CNS3XXX_PWR_PLL_DDR2_400MHZ
7658 + */
7659 +void cns3xxx_pwr_change_pll_ddr(unsigned int ddr_sel)
7660 +{
7661 +       if (CNS3XXX_PWR_PLL_DDR2_400MHZ < ddr_sel) {
7662 +               return;
7663 +       }
7664 +       
7665 +       PM_CLK_CTRL_REG &= ~(0x3 << PM_CLK_CTRL_REG_OFFSET_PLL_DDR2_SEL);
7666 +       PM_CLK_CTRL_REG |= (ddr_sel << PM_CLK_CTRL_REG_OFFSET_PLL_DDR2_SEL);
7667 +}
7668 +#endif
7669 +
7670 +#define GIC_REG_VALUE(offset) (*((volatile unsigned int *)(CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT+offset)))
7671 +
7672 +
7673 +/* Change CPU frequency and divider */
7674 +/*
7675 + * cns3xxx_pwr_change_pll_cpu - change PLL CPU frequency
7676 + * @cpu_sel: PLL CPU frequency
7677 + * @div_sel: divider
7678 + *
7679 + * This feature requires that 2nd core is in WFI mode and L2 cache is disabled
7680 + * Before calling this function, please make sure that L2 cache is not in use
7681 + *  
7682 + */
7683 +void cns3xxx_pwr_change_cpu_clock(unsigned int cpu_sel, unsigned int div_sel)
7684 +{
7685 +       /* 1. Set PLL_CPU_SEL
7686 +        * 2. Set in DFS mode
7687 +        * 3. disable all interrupt except interrupt ID-32 (clkscale_intr)
7688 +        * 4. Let CPU enter into WFI state
7689 +        * 5. Wait PMU to change PLL_CPU and divider and wake up CPU 
7690 +        */     
7691 +       int old_cpu, old_div;
7692 +
7693 +
7694 +       /* sanity check */
7695 +       if ((CNS3XXX_PWR_PLL_CPU_700MHZ < cpu_sel) 
7696 +                       || (CNS3XXX_PWR_CPU_CLK_DIV_BY4 < div_sel)) {
7697 +               return;
7698 +       }
7699 +
7700 +       old_cpu = (PM_CLK_CTRL_REG >> PM_CLK_CTRL_REG_OFFSET_PLL_CPU_SEL) &0xf;
7701 +       old_div = (PM_CLK_CTRL_REG >> PM_CLK_CTRL_REG_OFFSET_CPU_CLK_DIV) & 0x3;
7702 +
7703 +       if ((cpu_sel == old_cpu) 
7704 +                       && (div_sel == old_div)) {
7705 +               return;
7706 +       }
7707 +               
7708 +       /* 1. Set PLL_CPU_SEL */
7709 +       PM_PLL_CPU_SEL(cpu_sel);
7710 +       PM_CPU_CLK_DIV(div_sel);
7711 +
7712 +       /* 2. Set in DFS mode */
7713 +       cns3xxx_pwr_mode(CNS3XXX_PWR_CPU_MODE_DFS);
7714 +
7715 +       /* 3. disable all interrupt except interrupt ID-32 (clkscale_intr) */ 
7716 +       /* disable all interrupt */
7717 +       GIC_REG_VALUE(0x184) = 0xffffffff;
7718 +       GIC_REG_VALUE(0x188) = 0xffffffff;
7719 +       /* enable interrupt id 32*/
7720 +       GIC_REG_VALUE(0x104) = 0x00000001;
7721 +       GIC_REG_VALUE(0x108) = 0x80000000;
7722 +
7723 +       /* 4. Let CPU enter into WFI state */   
7724 +       asm volatile(
7725 +                       "mov r0, #0\n"
7726 +                       "mcr p15, 0, r0, c7, c0, 4\n"
7727 +                       );
7728 +       
7729 +
7730 +#if 0 
7731 +       {
7732 +               int i;
7733 +               for (i=IRQ_CNS3XXX_PMU+1; i<IRQ_CNS3XXX_EXTERNAL_PIN0; i++) {
7734 +                       enable_irq(i);  
7735 +               }
7736 +       }
7737 +#else
7738 +       GIC_REG_VALUE(0x104) = 0xffffffff;
7739 +       GIC_REG_VALUE(0x108) = 0xffffffff;
7740 +#endif
7741 +
7742 +       {
7743 +       /* for timer, because CPU clock is changed */
7744 +               int pclk = (cns3xxx_cpu_clock() >> 3);
7745 +               *(volatile unsigned int *) (CNS3XXX_TIMER1_2_3_BASE_VIRT + TIMER1_AUTO_RELOAD_OFFSET)
7746 +                               = pclk/15*0x25000;
7747 +       }
7748 +
7749 +}
7750 +
7751 +
7752 +/*
7753 + * clock_out_sel - select clock source to ClkOut pin
7754 + * This function just select pll_cpu to ClkOut pin,
7755 + * we can measure the ClkOut frequency to make sure whether pll_cpu is change
7756 + *
7757 + */
7758 +void clock_out_sel(void) 
7759 +{
7760 +
7761 +       int temp = PM_CLK_CTRL_REG;
7762 +       //MISC_GPIOB_PIN_ENABLE_REG |= (0x1 << 26); /* Set GPIOB26 to ClkOut*/
7763 +       /* debug purpose, use ext intr 1 and 2 to generate interrupt */
7764 +       //MISC_GPIOB_PIN_ENABLE_REG |= (0x1 << 27); /* Set GPIOB27 to external interrupt 2*/
7765 +       //MISC_GPIOB_PIN_ENABLE_REG |= (0x1 << 28); /* Set GPIOB28 to external interrupt 1*/
7766 +       /* select ClkOut source as pll_cpu_clk and ClkOut divider is by 16 */
7767 +       temp &=~(0x3 << 20);
7768 +       temp &=~(0xf << 16);
7769 +       temp |= (0x3 << 20); 
7770 +       temp |= (0x1 << 16);
7771 +       PM_CLK_CTRL_REG = temp;
7772 +}
7773 +
7774 +void cns3xxx_wfi(void)
7775 +{
7776 +       mb();
7777 +       asm volatile(
7778 +                       "mov r0, #0\n"
7779 +                       "mcr p15, 0, r0, c7, c10, 4\n"
7780 +                       "mcr p15, 0, r0, c7, c0, 4\n"
7781 +                       );
7782 +}
7783 +
7784 +/*
7785 + * cns3xxx_pwr_sleep - 
7786 + */
7787 +void cns3xxx_pwr_sleep(void)
7788 +{
7789 +       /* 1. Set in sleep mode
7790 +        * 2. disable all functional block
7791 +        * 3. make sure that all function block are in power off state
7792 +        * 4. power down all PLL 
7793 +        * 5. Let CPU enter into WFI state
7794 +        * 6. Wait PMU to change PLL_CPU and divider and wake up CPU 
7795 +        */     
7796 +       int i, j, count = 0;
7797 +       /* 1. Set in SLEEP mode */
7798 +       cns3xxx_pwr_mode(CNS3XXX_PWR_CPU_MODE_SLEEP);
7799 +
7800 +       /* 2. disable all functional block */
7801 +       i = PM_CLK_GATE_REG;
7802 +       PM_CLK_GATE_REG = 0x0;
7803 +
7804 +       /* 3. make sure that all function block are in power off state */
7805 +       while (0x4 != PM_PWR_STA_REG) {
7806 +               count++;
7807 +               if (1000 == count) {
7808 +                       count = PM_PWR_STA_REG;
7809 +                       break;
7810 +               }
7811 +       };
7812 +
7813 +       /* 4. power down all PLL */
7814 +       j = PM_PLL_HM_PD_CTRL_REG;
7815 +       PM_PLL_HM_PD_CTRL_REG = 0x00003FFC;
7816 +
7817 +#if    0
7818 +    /* set DMC to low power hand shake */
7819 +    PM_HS_CFG_REG |= (0x1 << 2);
7820 +    /* disable DMC */
7821 +    PM_CLK_GATE_REG &= ~(0x1<<2);
7822 +#endif
7823 +
7824 +       /* set wake up interrupt source, use ext_intr1 to wake up*/
7825 +       PM_WU_CTRL0_REG = 0x0; PM_WU_CTRL1_REG = 0x40000000;
7826 +       //MISC_GPIOB_PIN_ENABLE_REG |= (0x1 << 27);
7827 +
7828 +       /* 5. Let CPU enter into WFI state */
7829 +       GIC_REG_VALUE(0x104) = 0x1; /* enable clock scaling interrupt */
7830 +       printk("<0>enter WFI\n");
7831 +       cns3xxx_wfi();
7832 +       PM_CLK_GATE_REG = i;
7833 +       PM_PLL_HM_PD_CTRL_REG = j;
7834 +       printk("<0>leave WFI\n");
7835 +       GIC_REG_VALUE(0x104) = 0xffffffff;
7836 +       GIC_REG_VALUE(0x108) = 0xffffffff;
7837 +       cns3xxx_pwr_mode(CNS3XXX_PWR_CPU_MODE_DFS);
7838 +}
7839 +
7840 +/*
7841 + * cns3xxx_pwr_sleep_test - enter into sleep and won't be wake up
7842 + */
7843 +void cns3xxx_pwr_sleep_test(void)
7844 +{
7845 +       int i, j, count = 0;
7846 +       /* 1. Set in SLEEP mode */
7847 +       cns3xxx_pwr_mode(CNS3XXX_PWR_CPU_MODE_SLEEP);
7848 +
7849 +       /* 2. disable all functional block */
7850 +       i = PM_CLK_GATE_REG;
7851 +       PM_CLK_GATE_REG = 0x0;
7852 +
7853 +       /* 3. make sure that all function block are in power off state */
7854 +       while (0x4 != PM_PWR_STA_REG) {
7855 +               count++;
7856 +               if (1000 == count) {
7857 +                       count = PM_PWR_STA_REG;
7858 +                       break;
7859 +               }
7860 +       };
7861 +       /* 4. power down all PLL */
7862 +       j = PM_PLL_HM_PD_CTRL_REG;
7863 +       PM_PLL_HM_PD_CTRL_REG = 0x00003FFC;
7864 +
7865 +       /* set wake up interrupt source, do nothing */
7866 +       PM_WU_CTRL0_REG = 0x0; PM_WU_CTRL1_REG = 0x00000000;
7867 +
7868 +       /* 5. Let CPU enter into WFI state */
7869 +       GIC_REG_VALUE(0x104) = 0x1; /* enable clock scaling interrupt */
7870 +       printk("<0>enter WFI\n");
7871 +       cns3xxx_wfi();
7872 +       PM_CLK_GATE_REG = i;
7873 +       PM_PLL_HM_PD_CTRL_REG = j;
7874 +       printk("<0>leave WFI, count 0x%.8x\n", count);
7875 +       GIC_REG_VALUE(0x104) = 0xffffffff;
7876 +       GIC_REG_VALUE(0x108) = 0xffffffff;
7877 +       cns3xxx_pwr_mode(CNS3XXX_PWR_CPU_MODE_DFS);
7878 +}
7879 +
7880 +/*
7881 + * cns3xxx_pwr_doze - 
7882 + */
7883 +void cns3xxx_pwr_doze(void)
7884 +{
7885 +       /* 1. Set in doze mode */
7886 +       cns3xxx_pwr_mode(CNS3XXX_PWR_CPU_MODE_DOZE);
7887 +
7888 +
7889 +       /* set wake up interrupt source*/
7890 +       PM_WU_CTRL0_REG = 0x0; PM_WU_CTRL1_REG = 0x40000000;
7891 +       //MISC_GPIOB_PIN_ENABLE_REG |= (0x1 << 27);
7892 +
7893 +       /* 5. Let CPU enter into WFI state */
7894 +       GIC_REG_VALUE(0x104) = 0x1; /* enable clock scaling interrupt */
7895 +       printk("<0>enter WFI\n");
7896 +       cns3xxx_wfi();
7897 +       printk("<0>leave WFI\n");
7898 +       cns3xxx_pwr_mode(CNS3XXX_PWR_CPU_MODE_DFS);
7899 +}
7900 +
7901 +/*
7902 + * cns3xxx_pwr_idle -
7903 + * IDLE mode just turn off CPU clock. 
7904 + * L2 cache, peripheral, PLL, external DRAM and chip power are still on 
7905 + */
7906 +void cns3xxx_pwr_idle(void)
7907 +{
7908 +       /* 1. Set in IDLE mode */
7909 +       cns3xxx_pwr_mode(CNS3XXX_PWR_CPU_MODE_IDLE);
7910 +
7911 +#if 1
7912 +       /* disable all interrupt except interrupt ID-32 (clkscale_intr) 
7913 +        * 
7914 +        * CPU can be wake up by any interrupt here, 
7915 +        * we disable all interrupt is just for testing 
7916 +        */
7917 +
7918 +       /* disable all interrupt */
7919 +       GIC_REG_VALUE(0x184) = 0xffffffff; GIC_REG_VALUE(0x188) = 0xffffffff;
7920 +       /* enable interrupt id 32*/
7921 +       GIC_REG_VALUE(0x104) = 0x00000001; GIC_REG_VALUE(0x108) = 0x00000000;
7922 +#endif
7923 +
7924 +       /* set wake up interrupt source*/
7925 +       PM_WU_CTRL0_REG = 0x0; PM_WU_CTRL1_REG = 0x40000000;
7926 +       //MISC_GPIOB_PIN_ENABLE_REG |= (0x1 << 27);
7927 +
7928 +       /* 5. Let CPU enter into WFI state */
7929 +       printk("<0>enter WFI\n");
7930 +       cns3xxx_wfi();
7931 +       printk("<0>leave WFI\n");
7932 +       cns3xxx_pwr_mode(CNS3XXX_PWR_CPU_MODE_DFS);
7933 +       GIC_REG_VALUE(0x104) = 0xffffffff;
7934 +       GIC_REG_VALUE(0x108) = 0xffffffff;
7935 +}
7936 +
7937 +/*
7938 + * cns3xxx_pwr_halt - 
7939 + * HALT mode just turn off CPU and L2 cache clock. 
7940 + * peripheral, PLL, external DRAM and chip power are still on 
7941 + */
7942 +
7943 +void cns3xxx_pwr_halt(void)
7944 +{
7945 +       /* 1. Set in HALT mode */
7946 +       cns3xxx_pwr_mode(CNS3XXX_PWR_CPU_MODE_HALT);
7947 +
7948 +       /* 
7949 +        * CPU can be wake up by any interrupt here, 
7950 +        * for test, we disable all interrupt except ID-32
7951 +        */
7952 +       /* disable all interrupt */
7953 +       GIC_REG_VALUE(0x184) = 0xffffffff; GIC_REG_VALUE(0x188) = 0xffffffff;
7954 +       /* enable interrupt id 32*/
7955 +       GIC_REG_VALUE(0x104) = 0x00000001; GIC_REG_VALUE(0x108) = 0x00000000;
7956 +
7957 +       /* set wake up interrupt source to trigger clock scaling interrupt */
7958 +       PM_WU_CTRL0_REG = 0x0; PM_WU_CTRL1_REG = 0x40000000;
7959 +       //MISC_GPIOB_PIN_ENABLE_REG |= (0x1 << 27);
7960 +
7961 +       /* 5. Let CPU enter into WFI state */
7962 +       cns3xxx_wfi();
7963 +       cns3xxx_pwr_mode(CNS3XXX_PWR_CPU_MODE_DFS);
7964 +       GIC_REG_VALUE(0x104) = 0xffffffff;
7965 +       GIC_REG_VALUE(0x108) = 0xffffffff;
7966 +}
7967 +
7968 +/*
7969 + * cns3xxx_cpu_clock - return CPU/L2 clock
7970 + *  aclk: cpu clock/2
7971 + *  hclk: cpu clock/4
7972 + *  pclk: cpu clock/8
7973 + */
7974 +int cns3xxx_cpu_clock(void)
7975 +{
7976 +#define CPU_BASE 300
7977 +       int cpu, cpu_sel, div_sel;
7978 +       
7979 +       cpu_sel = (PM_CLK_CTRL_REG >> PM_CLK_CTRL_REG_OFFSET_PLL_CPU_SEL) & 0xf;
7980 +       div_sel = (PM_CLK_CTRL_REG >> PM_CLK_CTRL_REG_OFFSET_CPU_CLK_DIV) & 0x3;
7981 +
7982 +       cpu = (CPU_BASE + ((cpu_sel/3) * 100) + ((cpu_sel %3) *33)) >> div_sel;
7983 +       return cpu;
7984 +}
7985 +
7986 +static int __init cns3xxx_pmu_init(void)
7987 +{
7988 +       return 0;
7989 +}
7990 +
7991 +
7992 +EXPORT_SYMBOL(cns3xxx_pwr_power_up);
7993 +EXPORT_SYMBOL(cns3xxx_pwr_clk_en);
7994 +EXPORT_SYMBOL(cns3xxx_pwr_soft_rst);
7995 +EXPORT_SYMBOL(cns3xxx_pwr_soft_rst_force);
7996 +EXPORT_SYMBOL(cns3xxx_cpu_clock);
7997 +
7998 +module_init(cns3xxx_pmu_init);
7999 --- /dev/null
8000 +++ b/arch/arm/mach-cns3xxx/rdma.c
8001 @@ -0,0 +1,901 @@
8002 +/*
8003 + *  rdma.c - CNS3XXX RAID-DMA h/w acceleration
8004 + *
8005 + *  Revision History: arch/arm/mach-cns3xxx/ChangeLog.cns_raid.txt
8006 + */
8007 +#include <linux/kernel.h>
8008 +#include <linux/types.h>
8009 +#include <linux/init.h>
8010 +#include <linux/sched.h>
8011 +#include <linux/spinlock.h>
8012 +#include <linux/slab.h>
8013 +#include <linux/errno.h>
8014 +#include <linux/interrupt.h>
8015 +#include <linux/sched.h>
8016 +#include <linux/wait.h>
8017 +#include <linux/list.h>
8018 +#include <linux/mm.h>
8019 +#include <linux/pagemap.h>
8020 +#include <linux/module.h>
8021 +#include <linux/delay.h>
8022 +#include <asm/io.h>
8023 +#include <mach/irqs.h>
8024 +#include <linux/mempool.h>
8025 +#include <linux/dma-mapping.h>
8026 +
8027 +#include "rdma.h"
8028 +#include <mach/pm.h>
8029 +
8030 +int rdma_verbose;
8031 +u8 rdma_test_ptn[32] = {0};
8032 +unsigned int dma_timeout_jiffies;
8033 +mempool_t      *rdma_sg_pool = NULL;   /* pool */
8034 +rdma_chan_t *dma = NULL;                       /* dma channel */
8035 +
8036 +static DEFINE_SPINLOCK(process_lock);
8037 +
8038 +/* Debug Printk */
8039 +#define dprintk(x...)  ((void)(rdma_verbose && printk(KERN_WARNING x)))
8040 +#define        dump_regs(x)    \
8041 +do {   \
8042 +       dprintk("pa:%08x sg:%08x bp:%08x fp:%08x st:%08x qp:%08x sz:%08x\n", \
8043 +               *((x)->cregs->para),    \
8044 +               *((x)->cregs->sgad),    \
8045 +               *((x)->cregs->back),    \
8046 +               *((x)->cregs->frnt),    \
8047 +               *((x)->cregs->stat),    \
8048 +               *((x)->cregs->qpar),    \
8049 +               *((x)->cregs->blsz));   \
8050 +} while (0)
8051 +
8052 +
8053 +#define        rdma_dmac_flush_range(start, bytes)     \
8054 +       do { \
8055 +               dma_cache_maint(start, bytes, DMA_BIDIRECTIONAL);       \
8056 +       } while (0);
8057 +
8058 +#define        rdma_dmac_inv_range(start, bytes)       \
8059 +       do { \
8060 +               dma_cache_maint(start, bytes, DMA_FROM_DEVICE); \
8061 +       } while (0);
8062 +       
8063 +#define        rdma_dmac_clean_range(start, bytes)     \
8064 +       do { \
8065 +               dma_cache_maint(start, bytes, DMA_TO_DEVICE);   \
8066 +       } while (0);
8067 +
8068 +
8069 +
8070 +extern void *acs_mempool_alloc(mempool_t *pool);
8071 +
8072 +/**
8073 + * rdma_timeout_handle
8074 + */
8075 +static void rdma_timeout_handle(rdma_chan_t *rdma)
8076 +{
8077 +       printk("%s: timeout handling\n", __FUNCTION__);
8078 +       spin_lock_irq(&process_lock);   
8079 +       
8080 +       if (!list_empty(&rdma->process_q)) {
8081 +               sg_t *sg_fin = list_entry(rdma->process_q.next, sg_t, lru);
8082 +               list_del_init(&sg_fin->lru);
8083 +               sg_fin->status = SG_STATUS_DONE;
8084 +       }
8085 +       
8086 +       *(dma->cregs->para) = 0;
8087 +       *(dma->cregs->back) = rdma->q_first_phys;
8088 +       *(dma->cregs->frnt) = rdma->q_first_phys;
8089 +       flush_cache_all();
8090 +       spin_unlock_irq(&process_lock); 
8091 +}
8092 +
8093 +/**
8094 + * rdma_mempool_alloc - return a sg from pool
8095 + * @gfp_mask: gfp flag
8096 + *
8097 + * Return:
8098 + *  sg table
8099 + */
8100 +static void *rdma_sg_mempool_alloc(unsigned int gfp_mask)
8101 +{
8102 +       void *element;
8103 +       int exception_timeout = 30;
8104 +
8105 +repeat:
8106 +       element = acs_mempool_alloc(rdma_sg_pool);
8107 +       if (likely(element))
8108 +               return element;
8109 +       
8110 +       if (!(gfp_mask & __GFP_WAIT)) {
8111 +               return NULL;
8112 +       } else {
8113 +               msleep(1000);
8114 +               exception_timeout--;
8115 +               WARN_ON(exception_timeout < 0); /* Thresh check, we should check or increase if any warning */
8116 +               goto repeat;
8117 +       }
8118 +}
8119 +
8120 +#define        rdma_mempool_create(pool, name, size, min_nr, alloc_fn, free_fn, privp) \
8121 +do {   \
8122 +       printk("%s: pre-allocating %s: %d*%d=%d\n",     \
8123 +                               __FUNCTION__, (name), (min_nr), (size), (min_nr) * (size));     \
8124 +       pool = mempool_create((min_nr), (mempool_alloc_t *)(alloc_fn), free_fn, (privp));       \
8125 +       if (!pool)      \
8126 +               goto abort;     \
8127 +} while(0);
8128 +
8129 +#define rdma_mempool_destroy(pool)     \
8130 +do {   \
8131 +       if (pool)       \
8132 +               mempool_destroy(pool);  \
8133 +} while(0);
8134 +
8135 +#define        rdma_kfree_obj(obj)     \
8136 +do {   \
8137 +       if (obj)        \
8138 +               kfree(obj);     \
8139 +} while(0);
8140 +
8141 +/**
8142 + * rdma_sg_prealloc_fn - sg mempool pre-allocation callback
8143 + * @gfp_flags: GFP_ flags
8144 + * @data: private data, reserved
8145 + *
8146 + * Return:
8147 + *   pre-alloc sg table
8148 + */
8149 +static void *rdma_sg_prealloc_fn(int gfp_flags, void *data)
8150 +{
8151 +       sg_t *sg = NULL;
8152 +       sg = kzalloc(sizeof(sg_t), gfp_flags);
8153 +       INIT_LIST_HEAD(&sg->lru);
8154 +       init_waitqueue_head(&sg->wait);
8155 +       sg->status = SG_STATUS_FREE;
8156 +       
8157 +       /* Remove Debug Message */
8158 +#if 0
8159 +       printk("%s: pre-allocating sg=0x%p, phy=0x%p\n",
8160 +                               __FUNCTION__, (void *)sg, (void *)virt_to_phys(sg));
8161 +#endif
8162 +
8163 +       WARN_ON(!sg);
8164 +       return (void *)sg;
8165 +}
8166 +
8167 +/**
8168 + * rdma_sg_deconstruct_fn - sg mempool de-allocation callback
8169 + * @sg: sg elements
8170 + * @data: private data, reserved
8171 + */
8172 +static void rdma_sg_deconstruct_fn(void *sg, void *data)
8173 +{
8174 +       if (sg) {
8175 +               printk("%s: de-allocating sg=0x%p, phy=0x%p\n",
8176 +                               __FUNCTION__, (void *)sg, (void *)virt_to_phys(sg));
8177 +               kfree(sg);
8178 +       }
8179 +       return;
8180 +}
8181 +
8182 +
8183 +
8184 +/*-------------------------------------------------------- */
8185 +/**
8186 + * rdma_get_sg - alloc an SG
8187 + * @dma: dma chan
8188 + */
8189 +static sg_t *rdma_get_sg(rdma_chan_t *dma)
8190 +{
8191 +       sg_t *sg = (sg_t *)rdma_sg_mempool_alloc(GFP_KERNEL);
8192 +
8193 +       /*
8194 +        * No need to zero rest of un-used SG entries;
8195 +        * we detect the src+dst by parameter + sg, not by zero-valued sg.
8196 +        */
8197 +       // memzero(&(sg->entry[0]), SG_ENTRY_BYTES);
8198 +
8199 +       sg->status = SG_STATUS_ACQUIRED;
8200 +
8201 +       return sg;
8202 +}      
8203 +
8204 +
8205 +/**
8206 + * rdma_queue_sg - queue an SG, wait done and put it.
8207 + * @dma: dma chan
8208 + * @sg: sg
8209 + * @q_para: parameter 
8210 + * @q_blsz: block size
8211 + * @q_sgad: SG Addr
8212 + * @sg_cnt: count of (src_cnt + dst_cnt)
8213 + */
8214 +#define                QUEUE_MODE
8215 +static void rdma_queue_sg(rdma_chan_t *rdma, sg_t *sg, u32 q_para, u32 q_blsz, u32 q_sgad, int sg_cnt)
8216 +{
8217 +       cmdq_t *this_virt = NULL;
8218 +       
8219 +       spin_lock_irq(&process_lock);
8220 +
8221 +       sg->status = SG_STATUS_SCHEDULED;
8222 +       list_add_tail(&sg->lru, &rdma->process_q);
8223 +
8224 +       dump_regs(rdma);
8225 +
8226 +#ifdef QUEUE_MODE
8227 +       /* Setup BP */
8228 +       this_virt = (cmdq_t *)(phys_to_virt(*(rdma->cregs->back)));
8229 +       this_virt->parameter = q_para;
8230 +       this_virt->block_size = q_blsz;
8231 +       this_virt->sg_addr = q_sgad;
8232 +       this_virt->reserved = 0;
8233 +       dump_regs(rdma);
8234 +
8235 +       /* FP++ */
8236 +       *(rdma->cregs->frnt) = *(rdma->cregs->frnt) + 16;
8237 +       dump_regs(rdma);
8238 +
8239 +       /* FIXME */
8240 +       {
8241 +               void *sgp = (void *)sg;
8242 +               void *cqp = (void *)this_virt;
8243 +
8244 +               rdma_dmac_flush_range(sgp, (sg_cnt * sizeof(u64)));
8245 +               rdma_dmac_flush_range(cqp, sizeof(cmdq_t));
8246 +       }
8247 +
8248 +       /* Queue Enable */
8249 +       *(rdma->cregs->stat) = REG_STAT_CMD_QUEUE_ENABLE; 
8250 +       dump_regs(rdma);
8251 +
8252 +#else
8253 +       *(dma->cregs->blsz) = q_blsz;
8254 +       *(rdma->cregs->sgad) = q_sgad;
8255 +       *(rdma->cregs->para) = q_para;
8256 +       dump_regs(rdma);
8257 +#endif /* QUEUE_MODE */                
8258 +
8259 +       spin_unlock_irq(&process_lock);
8260 +       dump_regs(rdma);
8261 +
8262 +       wait_event_timeout(sg->wait, 
8263 +                                               sg->status & (SG_STATUS_DONE | SG_STATUS_ERROR), 
8264 +                                               dma_timeout_jiffies);
8265 +       dump_regs(rdma);
8266 +
8267 +       /* timed out */
8268 +       if (unlikely(sg->status & SG_STATUS_SCHEDULED)) {
8269 +               printk("%s: operation timeout\n", __FUNCTION__);
8270 +               rdma_timeout_handle(rdma);
8271 +       }
8272 +
8273 +       sg->status = SG_STATUS_FREE;
8274 +       mempool_free(sg, rdma_sg_pool);
8275 +       return;
8276 +}
8277 +
8278 +
8279 +#define        R6_RECOV_PD             1
8280 +#define        R6_RECOV_DD             2
8281 +#define        R6_RECOV_DQ             3
8282 +/**
8283 + * @src_no: source count
8284 + * @bytes: len in bytes
8285 + * @bh_ptr: srcs PA
8286 + * @w1_dst: pd: P,  dd: DD1, qd: DD
8287 + * @w2_dst: pd: DD, dd: DD2, qd: Q
8288 + * @pd_dd_qd: failed layout to recover
8289 + * @w1_idx: idx of w1_dst
8290 + * @w2_idx: idx of w2_dst
8291 + * @src_idx: source index; utilize data index only.
8292 + *
8293 + * Desc:
8294 + *     Recover P+DD / DD1+DD2 / DD+Q from bh_ptr
8295 + */
8296 +void do_cns_rdma_gfgen_pd_dd_dq(unsigned int src_no, unsigned int bytes, 
8297 +                                               void **bh_ptr, void *w1_dst, void *w2_dst,
8298 +                                               int pd_dd_qd, unsigned int w1_idx, unsigned int w2_idx,
8299 +                                               unsigned int *src_idx)
8300 +{
8301 +       int i;
8302 +       sg_t    *sg = NULL;
8303 +       u32 q_sgad, q_blsz, q_para;
8304 +
8305 +       /* clean src/dst */
8306 +       for (i=0; i<src_no; i++) 
8307 +       {
8308 +               if (likely(bh_ptr[i])) {
8309 +                       rdma_dmac_clean_range(bh_ptr[i], bytes);
8310 +               }
8311 +               else
8312 +                       goto abort;
8313 +       }
8314 +       rdma_dmac_clean_range(w1_dst, bytes);
8315 +       rdma_dmac_clean_range(w2_dst, bytes);
8316 +       
8317 +       sg = rdma_get_sg(dma);
8318 +
8319 +       /* Setup SG */
8320 +       switch(pd_dd_qd) 
8321 +       {
8322 +
8323 +       case R6_RECOV_PD:
8324 +               /* dd...dQ -> PD */
8325 +               for (i=0; i<(src_no - 1); i++) {
8326 +                       sg->entry[i] = (SG_ADDR_MASK & ((u64)virt_to_phys(bh_ptr[i])))
8327 +                                  | (SG_READ_IDX_MASK & ((u64)src_idx[i]) << SG_IDX_SHIFT)
8328 +                                                  | (RWI_RD_D);
8329 +               }
8330 +               sg->entry[src_no-1] =  (SG_ADDR_MASK & ((u64)virt_to_phys(bh_ptr[i])))
8331 +                                                               | (RWI_RD_Q);
8332 +
8333 +               /* pd */
8334 +               sg->entry[src_no]   = (SG_ADDR_MASK & ((u64)virt_to_phys(w1_dst))) | (RWI_W_P1);
8335 +               sg->entry[src_no+1] = (SG_ADDR_MASK & ((u64)virt_to_phys(w2_dst))) | (RWI_W_D2);
8336 +               
8337 +               q_para = REG_PARA_ENABLE 
8338 +                               | REG_PARA_XFER_END 
8339 +                               | REG_PARA_CALC_P
8340 +                               | (REG_PARA_FAULTY_DISKS_CNT * 2)
8341 +                               | w2_idx * REG_PARA_FDISK_2_Q_IDX;
8342 +               break;
8343 +
8344 +       case R6_RECOV_DD:
8345 +               /* dd...PQ -> DD */
8346 +               for (i=0; i<(src_no - 2); i++) {
8347 +                       sg->entry[i] = (SG_ADDR_MASK & ((u64)virt_to_phys(bh_ptr[i])))
8348 +                                  | (SG_READ_IDX_MASK & ((u64)src_idx[i]) << SG_IDX_SHIFT)
8349 +                                                  | (RWI_RD_D);
8350 +               }
8351 +               
8352 +               sg->entry[src_no-2] =  (SG_ADDR_MASK & ((u64)virt_to_phys(bh_ptr[i])))
8353 +                                                               | (RWI_RD_P);
8354 +               sg->entry[src_no-1] =  (SG_ADDR_MASK & ((u64)virt_to_phys(bh_ptr[i+1])))
8355 +                                                               | (RWI_RD_Q);
8356 +
8357 +               /* dd */
8358 +               sg->entry[src_no]   = (SG_ADDR_MASK & ((u64)virt_to_phys(w1_dst))) | (RWI_W_D1);
8359 +               sg->entry[src_no+1] = (SG_ADDR_MASK & ((u64)virt_to_phys(w2_dst))) | (RWI_W_D2);
8360 +               
8361 +               q_para = REG_PARA_ENABLE 
8362 +                               | REG_PARA_XFER_END 
8363 +                               | REG_PARA_CALC_DATA
8364 +                               | (REG_PARA_FAULTY_DISKS_CNT * 2)
8365 +                               | w1_idx * REG_PARA_FDISK_1_P_IDX
8366 +                               | w2_idx * REG_PARA_FDISK_2_Q_IDX;
8367 +
8368 +               break;
8369 +
8370 +       case R6_RECOV_DQ:
8371 +               /* dd...dP -> DQ */
8372 +               for (i=0; i<(src_no - 1); i++) {
8373 +                       sg->entry[i] = (SG_ADDR_MASK & ((u64)virt_to_phys(bh_ptr[i])))
8374 +                                  | (SG_READ_IDX_MASK & ((u64)src_idx[i]) << SG_IDX_SHIFT)
8375 +                                                  | (RWI_RD_D);
8376 +               }
8377 +               sg->entry[src_no-1] =  (SG_ADDR_MASK & ((u64)virt_to_phys(bh_ptr[i])))
8378 +                                                               | (RWI_RD_P);
8379 +
8380 +               /* qd */
8381 +               sg->entry[src_no]   = (SG_ADDR_MASK & ((u64)virt_to_phys(w1_dst))) | (RWI_W_D1);
8382 +               sg->entry[src_no+1] = (SG_ADDR_MASK & ((u64)virt_to_phys(w2_dst))) | (RWI_W_Q2);
8383 +               
8384 +               q_para = REG_PARA_ENABLE 
8385 +                               | REG_PARA_XFER_END 
8386 +                               | REG_PARA_CALC_Q
8387 +                               | (REG_PARA_FAULTY_DISKS_CNT * 2)
8388 +                               | w1_idx * REG_PARA_FDISK_1_P_IDX;
8389 +               break;
8390 +
8391 +       default:
8392 +               BUG();
8393 +               break;
8394 +
8395 +       }
8396 +       
8397 +       q_sgad = virt_to_phys(&(sg->entry[0]));
8398 +       q_blsz = bytes & REG_BLSZ_MASK;
8399 +
8400 +       if (unlikely(rdma_verbose)) {
8401 +               for (i=0; i<src_no; i++)
8402 +                       printk("set-SG::SRC[%d] = 0x%016llx\n", i, sg->entry[i]);
8403 +               printk("set-SG::DST1ptr= 0x%016llx\n", sg->entry[src_no]);
8404 +               printk("set-SG::DST2ptr= 0x%016llx\n", sg->entry[src_no+1]);
8405 +       }
8406
8407 +       /* Queue SG */
8408 +       rdma_queue_sg(dma, sg, q_para, q_blsz, q_sgad, (src_no + 2));
8409 +  
8410 +       /* Invalidate dst */
8411 +       rdma_dmac_inv_range(w1_dst, bytes);
8412 +       rdma_dmac_inv_range(w2_dst, bytes);
8413 +  
8414 +abort:
8415 +       return;
8416 +}
8417 +
8418 +/**
8419 + * @src_no: source count
8420 + * @bytes: len in bytes
8421 + * @bh_ptr: srcs PA
8422 + * @p_dst: P dest PA
8423 + * @q_dst: Q dest PA
8424 + *
8425 + * Desc:
8426 + *     p/q_dst = XOR/GFMUL(bh_ptr[0 ... src_no-1]), in Page Addr
8427 + */
8428 +void do_cns_rdma_gfgen(unsigned int src_no, unsigned int bytes, void **bh_ptr, 
8429 +                               void *p_dst, void *q_dst) // u8 *gfmr
8430 +{
8431 +       int i;
8432 +       sg_t    *sg = NULL;
8433 +       u32 q_sgad, q_blsz, q_para;
8434 +
8435 +       /* clean src/dst */
8436 +       for (i=0; i<src_no; i++) 
8437 +       {
8438 +               if (likely(bh_ptr[i])) {
8439 +                       rdma_dmac_clean_range(bh_ptr[i], bytes);
8440 +               }
8441 +               else
8442 +                       goto abort;
8443 +       }
8444 +       rdma_dmac_clean_range(p_dst, bytes);
8445 +       rdma_dmac_clean_range(q_dst, bytes);
8446 +       
8447 +       sg = rdma_get_sg(dma);
8448 +
8449 +       /* Setup SG::Read::SRC */
8450 +       for (i=0; i<src_no; i++) {
8451 +               /* Set addr, idx#, rw */
8452 +               sg->entry[i] = (SG_ADDR_MASK & ((u64)virt_to_phys(bh_ptr[i])))
8453 +                          | (SG_READ_IDX_MASK & ((u64)i + 1) << SG_IDX_SHIFT)
8454 +                                          | (RWI_RD_D);
8455 +       }
8456 +
8457 +       /* Setup SG::Write::P1 + Q2 */
8458 +       sg->entry[src_no]   = (SG_ADDR_MASK & ((u64)virt_to_phys(p_dst))) | (RWI_W_P1);
8459 +       sg->entry[src_no+1] = (SG_ADDR_MASK & ((u64)virt_to_phys(q_dst))) | (RWI_W_Q2);
8460 +
8461 +       /* Setup SGAD, BLSZ, PARAMETER */
8462 +       q_sgad = virt_to_phys(&(sg->entry[0]));
8463 +       q_blsz = bytes & REG_BLSZ_MASK;
8464 +       q_para = REG_PARA_ENABLE 
8465 +                       | REG_PARA_XFER_END 
8466 +                       | REG_PARA_CALC_PQ 
8467 +                       | (REG_PARA_FAULTY_DISKS_CNT * 2);
8468 +       
8469 +       if (unlikely(rdma_verbose)) {
8470 +               for (i=0; i<src_no; i++)
8471 +                       printk("set-SG::SRC[%d] = 0x%016llx\n", i, sg->entry[i]);
8472 +               printk("set-SG::DST1ptr= 0x%016llx\n", sg->entry[src_no]);
8473 +               printk("set-SG::DST2ptr= 0x%016llx\n", sg->entry[src_no+1]);
8474 +       }
8475 +
8476 +       /* Queue SG */
8477 +       rdma_queue_sg(dma, sg, q_para, q_blsz, q_sgad, (src_no + 2));
8478 +  
8479 +       /* Invalidate dst */
8480 +       rdma_dmac_inv_range(p_dst, bytes);
8481 +       rdma_dmac_inv_range(q_dst, bytes);
8482 +  
8483 +abort:
8484 +       return;
8485 +}
8486 +
8487 +/**
8488 + * @src_no: source count
8489 + * @bytes: len in bytes
8490 + * @bh_ptr: srcs PA
8491 + * @dst_ptr: dest PA
8492 + *
8493 + * Desc:
8494 + *     dst_ptr = XOR(bh_ptr[0 ... src_no-1]), in Page Addr
8495 + */
8496 +void do_cns_rdma_xorgen(unsigned int src_no, unsigned int bytes, void **bh_ptr, void *dst_ptr)
8497 +{
8498 +       int i;
8499 +       sg_t    *sg = NULL;
8500 +       u32 q_sgad, q_blsz, q_para;
8501 +
8502 +       /* clean src/dst */
8503 +       for (i=0; i<src_no; i++) 
8504 +       {
8505 +               if (likely(bh_ptr[i])) {
8506 +                       rdma_dmac_clean_range(bh_ptr[i], bytes);
8507 +               }
8508 +               else
8509 +                       goto abort;
8510 +       }
8511 +       rdma_dmac_clean_range(dst_ptr, bytes);
8512 +       
8513 +       sg = rdma_get_sg(dma);
8514 +
8515 +       /* Setup SG::Read::SRC */
8516 +       for (i=0; i<src_no; i++) {
8517 +               sg->entry[i] = (SG_ADDR_MASK & ((u64)virt_to_phys(bh_ptr[i])))
8518 +                          | (SG_READ_IDX_MASK & ((u64)i + 1) << SG_IDX_SHIFT)
8519 +                                          | (RWI_RD_D);
8520 +       }
8521 +
8522 +       /* Setup SG::Write::P1 */
8523 +       sg->entry[src_no] = (SG_ADDR_MASK & ((u64)virt_to_phys(dst_ptr)))
8524 +                                          | (RWI_W_P1);
8525
8526 +       /* Setup SGAD, BLSZ, PARAMETER */
8527 +       q_sgad = virt_to_phys(&(sg->entry[0]));
8528 +       q_blsz = bytes & REG_BLSZ_MASK;
8529 +       q_para = REG_PARA_ENABLE 
8530 +                       | REG_PARA_XFER_END 
8531 +                       | REG_PARA_CALC_P 
8532 +                       | (REG_PARA_FAULTY_DISKS_CNT * 1);
8533 +       
8534 +       if (unlikely(rdma_verbose)) {
8535 +               for (i=0; i<src_no; i++)
8536 +                       printk("set-SG::SRC[%d] = 0x%016llx\n", i, sg->entry[i]);
8537 +               printk("set-SG::DST1ptr= 0x%016llx\n", sg->entry[src_no]);
8538 +       }
8539 +
8540 +       /* Queue SG */
8541 +       rdma_queue_sg(dma, sg, q_para, q_blsz, q_sgad, (src_no + 1));
8542 +  
8543 +       /* Invalidate dst */
8544 +       rdma_dmac_inv_range(dst_ptr, bytes);
8545 +  
8546 +abort:
8547 +       return;
8548 +}
8549 +
8550 +
8551 +/**
8552 + * rdma_isr - rdma isr
8553 + * @irq: irq#
8554 + * @dev_id: private data
8555 + */
8556 +static irqreturn_t rdma_isr(int irq, void *dev_id)
8557 +{
8558 +       unsigned long flags;
8559 +       rdma_chan_t *this_dma = (rdma_chan_t *)dev_id;
8560 +
8561 +       /* Make sure the INT is for us */
8562 +       if (unlikely(dma != this_dma))
8563 +       {
8564 +               printk(KERN_ERR "Unexpected Interrupt, irq=%d, dma=%p, dev_id=%p\n", irq, dma, dev_id);
8565 +               return IRQ_NONE;
8566 +       }
8567 +
8568 +       dprintk("%s: pstat=0x%08x\n", __FUNCTION__, *(this_dma->cregs->stat));
8569 +       
8570 +       spin_lock_irqsave(&process_lock, flags);
8571 +
8572 +       /* clear */
8573 +       *(this_dma->cregs->stat) = REG_STAT_XFER_COMPLETE | REG_STAT_INTERRUPT_FLAG;
8574 +
8575 +       if (!list_empty(&this_dma->process_q)) {
8576 +               sg_t *sg_fin = list_entry(this_dma->process_q.next, sg_t, lru);
8577 +
8578 +               BUG_ON(!(sg_fin->status & SG_STATUS_SCHEDULED));
8579 +               
8580 +               list_del_init(&sg_fin->lru);
8581 +               sg_fin->status = SG_STATUS_DONE; // TODO: slave/decoder error handling
8582 +
8583 +               /* FP rewind */
8584 +               if (*(dma->cregs->frnt) == this_dma->q_last_phys) {
8585 +                       *(dma->cregs->back) = this_dma->q_first_phys;
8586 +                       *(dma->cregs->frnt) = this_dma->q_first_phys;
8587 +               }
8588 +
8589 +               wake_up(&sg_fin->wait); 
8590 +       }
8591 +       spin_unlock_irqrestore(&process_lock, flags);
8592 +       
8593 +       return IRQ_HANDLED;
8594 +}
8595 +
8596 +/**
8597 + * test_show - show unit test result
8598 + */
8599 +static void test_show(void **src, unsigned int bytes, void *p, void *q, unsigned int src_cnt, int stage)
8600 +{
8601 +       int i;
8602 +       char *buf;
8603 +       
8604 +       for (i=0; i<src_cnt; i++) {
8605 +               buf = (char *)src[i];
8606 +               printk("SRC[%d]-stage=%d: %02x %02x %02x %02x %02x %02x %02x %02x %02x, phys=%lx\n", 
8607 +                               i, stage,
8608 +                               buf[0], buf[1], buf[16], buf[64], 
8609 +                               buf[bytes/16], buf[bytes/8], buf[bytes/4], buf[bytes/2], buf[bytes-1], 
8610 +                               virt_to_phys(src[i]));
8611 +       }
8612 +               
8613 +       buf = (char *)p;
8614 +       printk("P-stage=%d:     %02x %02x %02x %02x %02x %02x %02x %02x %02x, phys=%lx\n", stage,
8615 +                               buf[0], buf[1], buf[16], buf[64], 
8616 +                               buf[bytes/16], buf[bytes/8], buf[bytes/4], buf[bytes/2], buf[bytes-1], 
8617 +                               virt_to_phys(p));
8618 +       
8619 +       buf = (char *)q;
8620 +       printk("Q-stage=%d:     %02x %02x %02x %02x %02x %02x %02x %02x %02x, phys=%lx\n", stage,
8621 +                               buf[0], buf[1], buf[16], buf[64], 
8622 +                               buf[bytes/16], buf[bytes/8], buf[bytes/4], buf[bytes/2], buf[bytes-1], 
8623 +                               virt_to_phys(q));
8624 +}
8625 +
8626 +/**
8627 + * rdma_unit_test - unit tset invoked by sysfs
8628 + * @action: test item
8629 + * @src_cnt: how many srcs
8630 + * @bytes: length
8631 + *
8632 + * Desc:
8633 + *    Unit Test
8634 + */
8635 +void rdma_unit_test(int action, unsigned int src_cnt, unsigned int bytes)
8636 +{
8637 +       int i, cnt;
8638 +       void *src_ptrs[MAX_ENTRIES_PER_SG];
8639 +       void *p_dst, *q_dst;
8640 +       unsigned int w1_idx, w2_idx;
8641 +       unsigned int read_idx[32] = {0};
8642 +
8643 +       /*
8644 +        * The lx330 demo board has only 256MB installed,
8645 +        * we'd be careful.
8646 +        */
8647 +       if (src_cnt >= (MAX_ENTRIES_PER_SG - 2))
8648 +               src_cnt = MAX_ENTRIES_PER_SG - 2;
8649 +
8650 +       if (src_cnt < 2)
8651 +               src_cnt = 2;
8652 +
8653 +       if (bytes > 65536)
8654 +               bytes = 65536;
8655 +
8656 +       if (bytes < 4096)
8657 +               bytes = 4096;
8658 +
8659 +       for (i = 0; i < MAX_ENTRIES_PER_SG; i++) {
8660 +               if (i < src_cnt) {
8661 +                       src_ptrs[i] = kmalloc(bytes, GFP_KERNEL);
8662 +               } else {
8663 +                       src_ptrs[i] = NULL;
8664 +               }
8665 +       }
8666 +       p_dst = kmalloc(bytes, GFP_KERNEL);
8667 +       q_dst = kmalloc(bytes, GFP_KERNEL);
8668 +
8669 +       printk("%s: ACTION=%d, src_cnt=%u, bytes=%u  p/w1=0x%p, q/w2=0x%p\n",
8670 +                       __FUNCTION__, action, src_cnt, bytes, p_dst, q_dst);
8671 +
8672 +       /* Shuffle the src and dst */
8673 +       for (i = 0; i < src_cnt; i++) {
8674 +               if (rdma_test_ptn[0] == 0) {
8675 +                       memset(src_ptrs[i], (jiffies % 240)+1, bytes);
8676 +                       msleep(10 + 10 * i);
8677 +               } else {
8678 +                       memset(src_ptrs[i], rdma_test_ptn[i], bytes);
8679 +               }
8680 +       }
8681 +       memset(p_dst, 0xff, bytes);
8682 +       memset(q_dst, 0xff, bytes);
8683 +
8684 +       // flush_cache_all();
8685 +       test_show(src_ptrs, bytes, p_dst, q_dst, src_cnt, 1);
8686 +
8687 +       switch (action)
8688 +       {
8689 +               /* P */
8690 +               case 1:
8691 +                       printk("\n%s: XORgen\n\n", __FUNCTION__);
8692 +                       do_cns_rdma_xorgen(src_cnt, bytes, src_ptrs, p_dst);
8693 +                       break;
8694 +
8695 +               /* PQ */
8696 +               case 2:
8697 +                       printk("\n%s: PQgen\n\n", __FUNCTION__);
8698 +                       do_cns_rdma_gfgen(src_cnt, bytes, src_ptrs, p_dst, q_dst);
8699 +                       break;
8700 +               
8701 +               /* PD */
8702 +               case 3:
8703 +                       w1_idx = src_cnt + 1;
8704 +                       w2_idx = 1;
8705 +                       cnt = 0;
8706 +
8707 +                       printk("read_idx: ");
8708 +                       for (i=1; i<=(src_cnt+2); i++)
8709 +                               if (i != w1_idx && i != w2_idx) {
8710 +                                       read_idx[cnt] = i;
8711 +                                       printk("%d ", i);
8712 +                                       cnt++;
8713 +                               }
8714 +                       printk("\n%s: PDgen w1/w2_idx=%u/%u\n\n", __FUNCTION__, w1_idx, w2_idx);
8715 +                       do_cns_rdma_gfgen_pd_dd_dq(src_cnt, bytes, src_ptrs, p_dst, q_dst,
8716 +                                                       R6_RECOV_PD, w1_idx, w2_idx, read_idx);
8717 +                       break;
8718 +       
8719 +               /* DD */
8720 +               case 4:
8721 +                       w1_idx = 1;
8722 +                       w2_idx = 2;
8723 +                       cnt = 0;
8724 +
8725 +                       printk("read_idx: ");
8726 +                       for (i=1; i<=(src_cnt+2); i++)
8727 +                               if (i != w1_idx && i != w2_idx) {
8728 +                                       read_idx[cnt] = i;
8729 +                                       printk("%d ", i);
8730 +                                       cnt++;
8731 +                               }
8732 +                       printk("\n%s: DDgen w1/w2_idx=%u/%u\n\n", __FUNCTION__, w1_idx, w2_idx);
8733 +                       do_cns_rdma_gfgen_pd_dd_dq(src_cnt, bytes, src_ptrs, p_dst, q_dst,
8734 +                                                       R6_RECOV_DD, w1_idx, w2_idx, read_idx);
8735 +                       break;
8736 +               
8737 +               /* DQ */
8738 +               case 5:
8739 +                       w1_idx = 1;
8740 +                       w2_idx = src_cnt + 2;
8741 +                       cnt = 0;
8742 +
8743 +                       printk("read_idx: ");
8744 +                       for (i=1; i<=(src_cnt+2); i++)
8745 +                               if (i != w1_idx && i != w2_idx) {
8746 +                                       read_idx[cnt] = i;
8747 +                                       printk("%d ", i);
8748 +                                       cnt++;
8749 +                               }
8750 +                       printk("\n%s: DQgen w1/w2_idx=%u/%u\n\n", __FUNCTION__, w1_idx, w2_idx);
8751 +                       do_cns_rdma_gfgen_pd_dd_dq(src_cnt, bytes, src_ptrs, p_dst, q_dst,
8752 +                                                       R6_RECOV_DQ, w1_idx, w2_idx, read_idx);
8753 +                       break;
8754 +
8755 +               /* Verbose */
8756 +               case 9999:
8757 +                       rdma_verbose = (rdma_verbose == 1 ? 0 : 1);
8758 +                       printk("\n%s: Setup verbose mode => %d\n\n", __FUNCTION__, rdma_verbose);
8759 +                       break;
8760 +
8761 +               /* 
8762 +                * SRC Pattern Assign 
8763 +                * e.g.  0x00000000 <-- do not assign
8764 +                * e.g.  0xbbccddee <-- 4 src: bb cc dd ee
8765 +                */
8766 +               default:
8767 +                       rdma_test_ptn[0] = (u8)(action >> 24 & 0x000000FF);
8768 +                       rdma_test_ptn[1] = (u8)(action >> 16 & 0x000000FF);
8769 +                       rdma_test_ptn[2] = (u8)(action >>  8 & 0x000000FF);
8770 +                       rdma_test_ptn[3] = (u8)(action       & 0x000000FF);
8771 +
8772 +                       printk("\n%s: Setup src test pattern => 0x%02x %02x %02x %02x\n\n", __FUNCTION__, 
8773 +                                               rdma_test_ptn[0],
8774 +                                               rdma_test_ptn[1],
8775 +                                               rdma_test_ptn[2],
8776 +                                               rdma_test_ptn[3]);
8777 +                       break;
8778 +       }
8779 +
8780 +       // flush_cache_all();
8781 +       test_show(src_ptrs, bytes, p_dst, q_dst, src_cnt, 2);
8782 +
8783 +       for (i = 0; i < MAX_ENTRIES_PER_SG; i++) {
8784 +               rdma_kfree_obj(src_ptrs[i]);
8785 +       }
8786 +       rdma_kfree_obj(p_dst);
8787 +       rdma_kfree_obj(q_dst);
8788 +
8789 +}
8790 +
8791 +void cns_rdma_hw_init(void){
8792 +
8793 +       cns3xxx_pwr_clk_en(0x1 << PM_CLK_GATE_REG_OFFSET_RAID);
8794 +       cns3xxx_pwr_soft_rst(0x1 << PM_SOFT_RST_REG_OFFST_RAID);
8795 +}
8796 +
8797 +/**
8798 + * cns_rdma_init - module init
8799 + */
8800 +int __init cns_rdma_init(void)
8801 +{
8802 +       int err = 0;
8803 +
8804 +       printk("%s: start\n", __FUNCTION__);
8805 +
8806 +       cns_rdma_hw_init();
8807 +       
8808 +       rdma_test_ptn[0] = 0;
8809 +       rdma_verbose = 0;
8810 +       dma_timeout_jiffies = HZ;
8811 +
8812 +       /* DMA chan */
8813 +       dma = (rdma_chan_t *) kzalloc(sizeof(rdma_chan_t), GFP_KERNEL);
8814 +       if (dma == NULL)
8815 +               goto abort;
8816 +
8817 +       INIT_LIST_HEAD(&(dma->process_q));
8818 +       
8819 +       //static DEFINE_SPINLOCK(dma->process_lock);
8820 +       dma->irq = IRQ_CNS3XXX_RAID;
8821 +       dma->irq_str = "CNS3XXX RAID acceleration";
8822 +       dma->cregs = NULL;
8823 +       dma->q_virt = NULL;
8824 +
8825 +       /* control register */
8826 +       dma->cregs = (struct ctrl_regs *) kzalloc(sizeof(struct ctrl_regs) + GENERIC_ALIGN, GFP_KERNEL);
8827 +       dma->cregs = (struct ctrl_regs *) (((u32) dma->cregs & GENERIC_ALIGN_MASK) + GENERIC_ALIGN);
8828 +       
8829 +       if (dma->cregs == NULL)
8830 +               goto abort;
8831 +       
8832 +       printk("%s: reg1: virt=0x%p\n",
8833 +                               __FUNCTION__, (void *)dma->cregs);
8834 +       
8835 +       dma->cregs->para = RDMA_REGS_VIRT(REG_PARA_OFFSET);
8836 +       dma->cregs->blsz = RDMA_REGS_VIRT(REG_BLSZ_OFFSET);
8837 +       dma->cregs->sgad = RDMA_REGS_VIRT(REG_SGAD_OFFSET);
8838 +       dma->cregs->stat = RDMA_REGS_VIRT(REG_STAT_OFFSET);
8839 +       dma->cregs->frnt = RDMA_REGS_VIRT(REG_FRNT_OFFSET);
8840 +       dma->cregs->back = RDMA_REGS_VIRT(REG_BACK_OFFSET);
8841 +       dma->cregs->qpar = RDMA_REGS_VIRT(REG_QPAR_OFFSET);
8842 +
8843 +       /* Pre-allocate S/G table */
8844 +       rdma_mempool_create(rdma_sg_pool, "rdma_sg", sizeof(sg_t),
8845 +                                           MAX_SG, rdma_sg_prealloc_fn, rdma_sg_deconstruct_fn, NULL);
8846 +
8847 +       /* Pre-allocate Queue Cmds */
8848 +       dma->q_virt = (cmdq_t *) kzalloc(sizeof(cmdq_t) * CURR_Q_DEPTH + CURR_Q_DEPTH_ALIGN, GFP_KERNEL);
8849 +       dma->q_virt = (cmdq_t *) (((u32) dma->q_virt & CURR_Q_DEPTH_ALIGN_MASK) + CURR_Q_DEPTH_ALIGN);
8850 +
8851 +       if (dma->q_virt == NULL)
8852 +               goto abort;
8853 +
8854 +       dma->q_first_phys = virt_to_phys((void *)dma->q_virt);
8855 +       dma->q_last_phys = dma->q_first_phys + sizeof(cmdq_t) * (CURR_Q_DEPTH - 1);
8856 +
8857 +       printk("%s: q1: virt=0x%p, phy=0x%x -> 0x%x\n",
8858 +                               __FUNCTION__, (void *)dma->q_virt, dma->q_first_phys, dma->q_last_phys);
8859 +
8860 +       *(dma->cregs->qpar) = REG_QPAR_DEPTH_32;
8861 +       *(dma->cregs->back) = dma->q_first_phys;
8862 +       *(dma->cregs->frnt) = dma->q_first_phys;
8863 +
8864 +       /* Register IRQ */
8865 +       err = request_irq(dma->irq, rdma_isr, 0, dma->irq_str, dma);
8866 +       if (err) {
8867 +               printk("%s: request irq failed\n", __FUNCTION__);
8868 +               goto abort;
8869 +       }
8870 +
8871 +       /* Clear 31 & 0 */
8872 +       *(dma->cregs->stat) = REG_STAT_INTERRUPT_FLAG;
8873 +
8874 +       err = 0;
8875 +       goto done;      
8876 +
8877 +abort:
8878 +       rdma_mempool_destroy(rdma_sg_pool);
8879 +       rdma_kfree_obj(dma->cregs);
8880 +       rdma_kfree_obj(dma);
8881 +       
8882 +
8883 +done:  
8884 +       printk("%s: done, err=%d\n", __FUNCTION__, err);
8885 +       return err;
8886 +}
8887 +
8888 +/**
8889 + * cns_rdma_exit - module exit
8890 + */
8891 +void cns_rdma_exit(void)
8892 +{
8893 +       printk("%s: start\n", __FUNCTION__);
8894 +
8895 +       rdma_mempool_destroy(rdma_sg_pool);
8896 +       rdma_kfree_obj(dma->cregs);
8897 +       rdma_kfree_obj(dma);
8898 +       printk("%s: done\n", __FUNCTION__);
8899 +}
8900 +
8901 +//module_init(cns_rdma_init);
8902 +//module_exit(cns_rdma_exit);
8903 --- /dev/null
8904 +++ b/arch/arm/mach-cns3xxx/rdma.h
8905 @@ -0,0 +1,178 @@
8906 +/*
8907 + * rdma.h - CNS3xxx hardware RAID acceleration
8908 + */
8909 +#ifndef _CNS3XXX_RDMA_H_
8910 +#define _CNS3XXX_RDMA_H_
8911 +
8912 +#include <mach/hardware.h>
8913 +
8914 +#define        RDMA_REGS_PHYS(x)       ((u32)(CNS3XXX_RAID_BASE + (x)))
8915 +#define        RDMA_REGS_VIRT(x)       ((u32 volatile *)(CNS3XXX_RAID_BASE_VIRT + (x)))
8916 +#define        RDMA_REGS_VALUE(x)      (*((u32 volatile *)(CNS3XXX_RAID_BASE_VIRT + (x))))
8917 +
8918 +
8919 +#define        GENERIC_ALIGN                   0x8                             /* 64-bits */
8920 +#define        GENERIC_ALIGN_MASK              0xFFFFFFF8UL
8921 +#define        QUEUE_DEPTH_ALIGN_MUL   0x10    /* 16 bytes; ALIGNMENT == QDEPTH * 16 bytes */
8922 +
8923 +
8924 +/* Register Offset */
8925 +#define        REG_PARA_OFFSET         0x00UL  /* Parameter */
8926 +#define        REG_BLSZ_OFFSET         0x04UL  /* Block Size */
8927 +#define        REG_SGAD_OFFSET         0x08UL  /* SG Address */
8928 +#define        REG_STAT_OFFSET         0x0CUL  /* Status */
8929 +#define        REG_FRNT_OFFSET         0x10UL  /* FP */
8930 +#define        REG_BACK_OFFSET         0x14UL  /* BP */
8931 +#define        REG_QPAR_OFFSET         0x18UL  /* Queue Parameter */
8932 +
8933 +
8934 +/* 0x00: PARA */
8935 +#define        REG_PARA_ENABLE                         0x80000000UL    /* 31 */
8936 +#define        REG_PARA_XFER_END                       0x40000000UL    /* 30 */
8937 +#define        REG_PARA_MEMORY_WR_DISABLE      0x20000000UL    /* 29 */
8938 +#define        REG_PARA_FAULTY_DISKS_CNT       0x08000000UL    /* 28:27 */
8939 +
8940 +#define        REG_PARA_CALC                           0x01000000UL    /* 26:24 */
8941 +       #define REG_PARA_CALC_DATA              0x00000000UL    
8942 +       #define REG_PARA_CALC_P                 0x01000000UL    
8943 +       #define REG_PARA_CALC_Q                 0x02000000UL    
8944 +       #define REG_PARA_CALC_R                 0x04000000UL    
8945 +       #define REG_PARA_CALC_PQ                0x03000000UL    
8946 +       #define REG_PARA_CALC_PR                0x05000000UL    
8947 +       #define REG_PARA_CALC_QR                0x06000000UL    
8948 +       #define REG_PARA_CALC_PQR               0x07000000UL    
8949 +
8950 +#define        REG_PARA_FDISK_3_R_IDX          0x00010000UL    /* 23:16 */
8951 +#define        REG_PARA_FDISK_2_Q_IDX          0x00000100UL    /* 15:8 */
8952 +#define        REG_PARA_FDISK_1_P_IDX          0x00000001UL    /* 7:0 */
8953 +
8954 +/* 0x04: BLSZ */
8955 +#define        REG_BLSZ_SHIFT                          3                               /* 19:3 */
8956 +#define        REG_BLSZ_MASK                           0x000FFFF8UL    /* N * 8bytes */
8957 +
8958 +/* 0x08: SGAD */
8959 +#define        REG_SGAD_SHIFT                          0
8960 +
8961 +/* 0x0C: STAT */
8962 +#define        REG_STAT_XFER_COMPLETE          0x80000000UL    /* 31 */
8963 +#define        REG_STAT_SLAVE_ERROR            0x40000000UL    /* 30 */
8964 +#define        REG_STAT_DECODER_ERROR          0x20000000UL    /* 29 */
8965 +#define        REG_STAT_R_FLAG                         0x00080000UL    /* 19 */
8966 +#define        REG_STAT_Q_FLAG                         0x00040000UL    /* 18 */
8967 +#define        REG_STAT_P_FLAG                         0x00020000UL    /* 17 */
8968 +#define        REG_STAT_CMD_QUEUE_ENABLE       0x00000002UL    /* 1 */
8969 +#define        REG_STAT_INTERRUPT_FLAG         0x00000001UL    /* 0 */
8970 +
8971 +/* 0x10/14: FRNT/BACK */
8972 +#define        REG_FRNT_SHIFT                          0
8973 +#define        REG_BACK_SHIFT                          0
8974 +
8975 +/* 0x18: QPAR */
8976 +#define        MAX_Q_DEPTH                             256
8977 +#define        REG_QPAR_DEPTH_256              0xFF
8978 +#define        REG_QPAR_DEPTH_128              0x7F
8979 +#define        REG_QPAR_DEPTH_64               0x3F
8980 +#define        REG_QPAR_DEPTH_32               0x1F
8981 +#define        REG_QPAR_DEPTH_16               0xF
8982 +#define        REG_QPAR_DEPTH_8                0x7
8983 +#define        REG_QPAR_DEPTH_4                0x3
8984 +#define        REG_QPAR_DEPTH_2                0x1
8985 +
8986 +/* len = 32 */
8987 +#define        CURR_Q_DEPTH                    (REG_QPAR_DEPTH_32 + 1)
8988 +#define        CURR_Q_DEPTH_ALIGN              ((CURR_Q_DEPTH) * (QUEUE_DEPTH_ALIGN_MUL))      /* 0x200 */
8989 +#define        CURR_Q_DEPTH_ALIGN_MASK 0xFFFFFE00UL
8990 +
8991 +
8992 +#define        MAX_SG                                  32   // cf. CURR_Q_DEPTH or MAX_Q_DEPTH
8993 +#define        MAX_ENTRIES_PER_SG              32
8994 +
8995 +/* SG Table */
8996 +#define        SG_ADDR_MASK            0x00000000FFFFFFFFULL
8997 +
8998 +#define        SG_READ_IDX_MASK        0x000000FF00000000ULL
8999 +#define        SG_IDX_SHIFT            32
9000 +
9001 +// ---------------------- 7654321076543210
9002 +#define        SG_RW_MASK              0x00000F0000000000ULL
9003 +#define        RWI_RD_D                0x0000000000000000ULL
9004 +#define        RWI_RD_P                0x0000010000000000ULL
9005 +#define        RWI_RD_Q                0x0000020000000000ULL
9006 +#define        RWI_RD_R                0x0000030000000000ULL
9007 +#define        RWI_W_D1                0x0000040000000000ULL
9008 +#define        RWI_W_P1                0x0000050000000000ULL
9009 +#define        RWI_W_Q1                0x0000060000000000ULL
9010 +#define        RWI_W_R1                0x0000070000000000ULL
9011 +#define        RWI_W_D2                0x0000080000000000ULL
9012 +#define        RWI_W_P2                0x0000090000000000ULL
9013 +#define        RWI_W_Q2                0x00000A0000000000ULL
9014 +#define        RWI_W_R2                0x00000B0000000000ULL
9015 +#define        RWI_W_D3                0x00000C0000000000ULL
9016 +#define        RWI_W_P3                0x00000D0000000000ULL
9017 +#define        RWI_W_Q3                0x00000E0000000000ULL
9018 +#define        RWI_W_R3                0x00000F0000000000ULL
9019 +
9020 +
9021 +#define        SG_STATUS_FREE                  0x00000001UL
9022 +#define        SG_STATUS_ACQUIRED              0x00000002UL
9023 +#define        SG_STATUS_SCHEDULED             0x00000004UL
9024 +#define SG_STATUS_DONE                 0x00000008UL
9025 +#define        SG_STATUS_ERROR                 0x00000010UL
9026 +
9027 +#define SG_ENTRY_BYTES (8 * MAX_ENTRIES_PER_SG)
9028 +
9029 +typedef struct rdma_sgtable sg_t;
9030 +struct rdma_sgtable {
9031 +       u64     entry[MAX_ENTRIES_PER_SG];
9032 +
9033 +       struct list_head lru;                   /* list_add_tail/list_del to/from process_q when schedule or isr */
9034 +       wait_queue_head_t wait;
9035 +       
9036 +       u32 status;
9037 +};
9038 +
9039 +/* Command Queue: cmdq_t */
9040 +typedef        struct rdma_cmdq cmdq_t;
9041 +struct rdma_cmdq {
9042 +       volatile u32 parameter;
9043 +       volatile u32 block_size;
9044 +       volatile u32 sg_addr;
9045 +       volatile u32 reserved;
9046 +};
9047
9048 +struct ctrl_regs {
9049 +       volatile u32 *para;
9050 +       volatile u32 *blsz;
9051 +       volatile u32 *sgad;
9052 +       volatile u32 *stat;
9053 +       volatile u32 *frnt;
9054 +       volatile u32 *back;
9055 +       volatile u32 *qpar;
9056 +};
9057 +
9058 +/* channel */
9059 +#define        RDMA_CHANNEL_COUNT                      1
9060 +typedef struct rdma_channel rdma_chan_t;
9061 +struct rdma_channel 
9062 +{
9063 +       struct list_head process_q;
9064 +       spinlock_t process_lock;        /* process queue lock */
9065 +
9066 +       int irq;                                        
9067 +       const char *irq_str;            
9068 +       
9069 +       /* cmd queue start address */
9070 +       volatile cmdq_t *q_virt;                        
9071 +       volatile u32 q_first_phys;
9072 +       volatile u32 q_last_phys;
9073 +
9074 +       /* control regs */
9075 +       struct ctrl_regs *cregs;
9076 +
9077 +       // wait_queue_head_t wait;
9078 +};
9079 +
9080 +int __init cns_rdma_init(void);
9081 +
9082 +#endif
9083 +
9084 --- a/arch/arm/Makefile
9085 +++ b/arch/arm/Makefile
9086 @@ -146,6 +146,7 @@ machine-$(CONFIG_ARCH_ORION5X)              := orion
9087  machine-$(CONFIG_ARCH_PNX4008)         := pnx4008
9088  machine-$(CONFIG_ARCH_PXA)             := pxa
9089  machine-$(CONFIG_ARCH_REALVIEW)                := realview
9090 +machine-$(CONFIG_ARCH_CNS3XXX)         := cns3xxx
9091  machine-$(CONFIG_ARCH_RPC)             := rpc
9092  machine-$(CONFIG_ARCH_S3C2410)         := s3c2410 s3c2400 s3c2412 s3c2440 s3c2442 s3c2443
9093  machine-$(CONFIG_ARCH_S3C24A0)         := s3c24a0
9094 --- /dev/null
9095 +++ b/arch/arm/mm/cache-l2cc.c
9096 @@ -0,0 +1,218 @@
9097 +/*******************************************************************************
9098 + *
9099 + *  arch/arm/mm/cache-l2cc.c - L2 cache controller support
9100 + *
9101 + *  Copyright (c) 2008 Cavium Networks 
9102 + * 
9103 + *  This file is free software; you can redistribute it and/or modify 
9104 + *  it under the terms of the GNU General Public License, Version 2, as 
9105 + *  published by the Free Software Foundation. 
9106 + *
9107 + *  This file is distributed in the hope that it will be useful, 
9108 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
9109 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
9110 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
9111 + *
9112 + *  You should have received a copy of the GNU General Public License 
9113 + *  along with this file; if not, write to the Free Software 
9114 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
9115 + *  visit http://www.gnu.org/licenses/. 
9116 + *
9117 + *  This file may also be available under a different license from Cavium. 
9118 + *  Contact Cavium Networks for more information
9119 + *
9120 + ******************************************************************************/
9121 +
9122 +#include <linux/init.h>
9123 +#include <linux/spinlock.h>
9124 +
9125 +#include <asm/cacheflush.h>
9126 +#include <asm/io.h>
9127 +#include <asm/hardware/cache-l2cc.h>
9128 +
9129 +#define CACHE_LINE_SIZE                32
9130 +
9131 +static void __iomem *cns3xxx_l2_base;
9132 +static DEFINE_SPINLOCK(cns3xxx_l2_lock);
9133 +
9134 +static inline void cache_wait(void __iomem *reg, unsigned long mask)
9135 +{
9136 +#ifndef CONFIG_L2CC_NO_WAIT
9137 +       /* wait for the operation to complete */
9138 +       while (readl(reg) & mask);
9139 +#endif
9140 +}
9141 +
9142 +static inline void sync_writel(unsigned long val, unsigned long reg,
9143 +                              unsigned long complete_mask)
9144 +{
9145 +       unsigned long flags;
9146 +
9147 +       spin_lock_irqsave(&cns3xxx_l2_lock, flags);
9148 +       writel(val, cns3xxx_l2_base + reg);
9149 +       /* wait for the operation to complete */
9150 +       while (readl(cns3xxx_l2_base + reg) & complete_mask)
9151 +               ;
9152 +       spin_unlock_irqrestore(&cns3xxx_l2_lock, flags);
9153 +}
9154 +
9155 +static inline void cache_sync(void)
9156 +{
9157 +       sync_writel(0, L2CC_CACHE_SYNC, 1);
9158 +}
9159 +
9160 +static inline void cns3xxx_l2_inv_all(void)
9161 +{
9162 +       /* invalidate all ways */
9163 +       sync_writel(0xffff, L2CC_INV_WAY, 0xffff);
9164 +       cache_sync();
9165 +}
9166 +
9167 +static void cns3xxx_l2_inv_range(unsigned long start, unsigned long end)
9168 +{
9169 +       unsigned long addr;
9170 +
9171 +       if (start & (CACHE_LINE_SIZE - 1)) {
9172 +               start &= ~(CACHE_LINE_SIZE - 1);
9173 +               writel(start, cns3xxx_l2_base + L2CC_CLEAN_INV_LINE_PA);
9174 +               start += CACHE_LINE_SIZE;
9175 +       }
9176 +
9177 +       if (end & (CACHE_LINE_SIZE - 1)) {
9178 +               end &= ~(CACHE_LINE_SIZE - 1);
9179 +               writel(end, cns3xxx_l2_base + L2CC_CLEAN_INV_LINE_PA);
9180 +       }
9181 +
9182 +       for (addr = start; addr < end; addr += CACHE_LINE_SIZE)
9183 +               writel(addr, cns3xxx_l2_base + L2CC_INV_LINE_PA);
9184 +
9185 +       cache_sync();
9186 +}
9187 +
9188 +static void cns3xxx_l2_clean_range(unsigned long start, unsigned long end)
9189 +{
9190 +       unsigned long addr;
9191 +
9192 +       start &= ~(CACHE_LINE_SIZE - 1);
9193 +       for (addr = start; addr < end; addr += CACHE_LINE_SIZE)
9194 +               writel(addr, cns3xxx_l2_base + L2CC_CLEAN_LINE_PA);
9195 +
9196 +       cache_wait(cns3xxx_l2_base + L2CC_CLEAN_LINE_PA, 1);
9197 +       cache_sync();
9198 +}
9199 +
9200 +static void cns3xxx_l2_flush_range(unsigned long start, unsigned long end)
9201 +{
9202 +       unsigned long addr;
9203 +
9204 +       start &= ~(CACHE_LINE_SIZE - 1);
9205 +       for (addr = start; addr < end; addr += CACHE_LINE_SIZE)
9206 +               writel(addr, cns3xxx_l2_base + L2CC_CLEAN_INV_LINE_PA);
9207 +
9208 +       cache_wait(cns3xxx_l2_base + L2CC_CLEAN_INV_LINE_PA, 1);
9209 +       cache_sync();
9210 +}
9211 +
9212 +void __init l2cc_init(void __iomem *base)
9213 +{
9214 +       __u32 aux, prefetch, tag, data;
9215 +
9216 +       printk(KERN_INFO "Initializing CNS3XXX L2 cache controller... ");
9217 +
9218 +       cns3xxx_l2_base = base;
9219 +
9220 +       /* disable L2CC */
9221 +       writel(0, cns3xxx_l2_base + L2CC_CTRL);
9222 +
9223 +       /*
9224 +        * Auxiliary control register 
9225 +        *
9226 +        * bit[22]      - shared attribute internally ignored
9227 +        * bit[21]      - parity enabled
9228 +        * bit[20]      - 
9229 +        * bit[19:17]   - 32kB way size 
9230 +        * bit[16]      - way associative
9231 +        * bit[12]      - exclusive cache disabled
9232 +        *
9233 +        */
9234 +       aux = readl(cns3xxx_l2_base + L2CC_AUX_CTRL);
9235 +       aux &= 0xfe000fff;
9236 +#ifdef CONFIG_CACHE_L2_I_PREFETCH
9237 +       aux |= 0x20000000;      /* bit[29]: Instruction prefetching enable, bit[29]: Data prefetching enable */
9238 +#endif
9239 +#ifdef CONFIG_CACHE_L2_D_PREFETCH
9240 +       aux |= 0x10000000;      /* bit[28]: Instruction prefetching enable, bit[28]: Data prefetching enable */
9241 +#endif
9242 +       aux |= 0x00540000;      /* ...010..., 32KB, 8-way, Parity Disable*/
9243 +       writel(aux, cns3xxx_l2_base + L2CC_AUX_CTRL);
9244 +
9245 +       prefetch = readl(cns3xxx_l2_base + 0xF60);
9246 +       prefetch |= 0x00000008; /* prefetch offset, bit[4..0] */
9247 +#ifdef CONFIG_CACHE_L2_I_PREFETCH
9248 +       prefetch |= 0x20000000;
9249 +#endif
9250 +#ifdef CONFIG_CACHE_L2_D_PREFETCH
9251 +       prefetch |= 0x10000000;
9252 +#endif
9253 +       writel(prefetch, cns3xxx_l2_base + 0xF60);
9254 +
9255 +       /* Tag RAM Control register
9256 +        * 
9257 +        * bit[10:8]    - 1 cycle of write accesses latency
9258 +        * bit[6:4]     - 1 cycle of read accesses latency
9259 +        * bit[3:0]     - 1 cycle of setup latency
9260 +        *
9261 +        * 1 cycle of latency for setup, read and write accesses
9262 +        */
9263 +       tag = readl(cns3xxx_l2_base + L2CC_TAG_RAM_LATENCY_CTRL);
9264 +       tag &= 0xfffff888;
9265 +       tag |= 0x00000000;
9266 +       writel(tag, cns3xxx_l2_base + L2CC_TAG_RAM_LATENCY_CTRL);
9267 +
9268 +       /* Data RAM Control register
9269 +        *
9270 +        * bit[10:8]    - 1 cycles of write accesses latency
9271 +        * bit[6:4]     - 1 cycles of read accesses latency
9272 +        * bit[3:0]     - 1 cycle of setup latency
9273 +        *
9274 +        * 1 cycle of setup latency, 2 cycles of read and write accesses latency
9275 +        */
9276 +       data = readl(cns3xxx_l2_base + L2CC_DATA_RAM_LATENCY_CTRL);
9277 +       data &= 0xfffff888;
9278 +       data |= 0x00000000;
9279 +       writel(data, cns3xxx_l2_base + L2CC_DATA_RAM_LATENCY_CTRL);
9280 +
9281 +       cns3xxx_l2_inv_all();
9282 +
9283 +       /* lockdown required ways for different effective size of the L2 cache */
9284 +#ifdef CONFIG_CACHE_L2CC_32KB
9285 +        /* 32KB, lock way7..1 */
9286 +        writel(0xfe, cns3xxx_l2_base + L2CC_LOCKDOWN_0_WAY_D);
9287 +        writel(0xfe, cns3xxx_l2_base + L2CC_LOCKDOWN_0_WAY_I);
9288 +        printk(KERN_INFO "CNS3XXX L2 cache lock down : way7..1\n");
9289 +#elif defined(CONFIG_CACHE_L2CC_64KB)
9290 +        /* 64KB, lock way7..2 */
9291 +        writel(0xfc, cns3xxx_l2_base + L2CC_LOCKDOWN_0_WAY_D);
9292 +        writel(0xfc, cns3xxx_l2_base + L2CC_LOCKDOWN_0_WAY_I);
9293 +        printk(KERN_INFO "CNS3XXX L2 cache lock down : way7..2\n");
9294 +#elif defined(CONFIG_CACHE_L2CC_96KB)
9295 +        /* 96KB, lock way7..3 */
9296 +        writel(0xf8, cns3xxx_l2_base + L2CC_LOCKDOWN_0_WAY_D);
9297 +        writel(0xf8, cns3xxx_l2_base + L2CC_LOCKDOWN_0_WAY_I);
9298 +        printk(KERN_INFO "CNS3XXX L2 cache lock down : way7..3\n");
9299 +#elif defined(CONFIG_CACHE_L2CC_128KB)
9300 +        /* 128KB, lock way7..4 */
9301 +        writel(0xf0, cns3xxx_l2_base + L2CC_LOCKDOWN_0_WAY_D);
9302 +        writel(0xf0, cns3xxx_l2_base + L2CC_LOCKDOWN_0_WAY_I);
9303 +        printk(KERN_INFO "CNS3XXX L2 cache lock down : way7..4\n");
9304 +#endif
9305 +
9306 +       /* enable L2CC */
9307 +       writel(1, cns3xxx_l2_base + L2CC_CTRL);
9308 +
9309 +       outer_cache.inv_range = cns3xxx_l2_inv_range;
9310 +       outer_cache.clean_range = cns3xxx_l2_clean_range;
9311 +       outer_cache.flush_range = cns3xxx_l2_flush_range;
9312 +
9313 +       printk("done.\n");
9314 +}
9315 --- a/arch/arm/mm/cache-l2x0.c
9316 +++ b/arch/arm/mm/cache-l2x0.c
9317 @@ -109,6 +109,25 @@ void __init l2x0_init(void __iomem *base
9318  
9319         l2x0_inv_all();
9320  
9321 +       /* lockdown required ways for different effective size of the L2 cache */
9322 +#ifdef CONFIG_CACHE_L2X0_128KB
9323 +       /* 128KB, lock way7..1 */
9324 +       writel(0xfe, l2x0_base + L2X0_LOCKDOWN_WAY_D);
9325 +       writel(0xfe, l2x0_base + L2X0_LOCKDOWN_WAY_I);
9326 +#elif defined(CONFIG_CACHE_L2X0_256KB)
9327 +       /* 256KB, lock way7..2 */
9328 +       writel(0xfc, l2x0_base + L2X0_LOCKDOWN_WAY_D);
9329 +       writel(0xfc, l2x0_base + L2X0_LOCKDOWN_WAY_I);
9330 +#elif defined(CONFIG_CACHE_L2X0_512KB)
9331 +       /* 512KB, lock way7..3 */
9332 +       writel(0xf8, l2x0_base + L2X0_LOCKDOWN_WAY_D);
9333 +       writel(0xf8, l2x0_base + L2X0_LOCKDOWN_WAY_I);
9334 +#elif defined(CONFIG_CACHE_L2X0_1MB)
9335 +       /* 1MB, lock way7..4 */
9336 +       writel(0xf0, l2x0_base + L2X0_LOCKDOWN_WAY_D);
9337 +       writel(0xf0, l2x0_base + L2X0_LOCKDOWN_WAY_I);
9338 +#endif
9339 +
9340         /* enable L2X0 */
9341         writel(1, l2x0_base + L2X0_CTRL);
9342  
9343 --- a/arch/arm/mm/dma-mapping.c
9344 +++ b/arch/arm/mm/dma-mapping.c
9345 @@ -29,7 +29,8 @@
9346  #error "CONSISTENT_DMA_SIZE must be multiple of 2MiB"
9347  #endif
9348  
9349 -#define CONSISTENT_END (0xffe00000)
9350 +//#define CONSISTENT_END       (0xffe00000)
9351 +#define CONSISTENT_END (0xf2000000)
9352  #define CONSISTENT_BASE        (CONSISTENT_END - CONSISTENT_DMA_SIZE)
9353  
9354  #define CONSISTENT_OFFSET(x)   (((unsigned long)(x) - CONSISTENT_BASE) >> PAGE_SHIFT)
9355 @@ -208,7 +209,7 @@ __dma_alloc(struct device *dev, size_t s
9356         {
9357                 void *ptr = page_address(page);
9358                 memset(ptr, 0, size);
9359 -               dmac_flush_range(ptr, ptr + size);
9360 +               smp_dma_flush_range(ptr, ptr + size);
9361                 outer_flush_range(__pa(ptr), __pa(ptr) + size);
9362         }
9363  
9364 @@ -498,15 +499,15 @@ void dma_cache_maint(const void *start, 
9365  
9366         switch (direction) {
9367         case DMA_FROM_DEVICE:           /* invalidate only */
9368 -               inner_op = dmac_inv_range;
9369 +               inner_op = smp_dma_inv_range;
9370                 outer_op = outer_inv_range;
9371                 break;
9372         case DMA_TO_DEVICE:             /* writeback only */
9373 -               inner_op = dmac_clean_range;
9374 +               inner_op = smp_dma_clean_range;
9375                 outer_op = outer_clean_range;
9376                 break;
9377         case DMA_BIDIRECTIONAL:         /* writeback and invalidate */
9378 -               inner_op = dmac_flush_range;
9379 +               inner_op = smp_dma_flush_range;
9380                 outer_op = outer_flush_range;
9381                 break;
9382         default:
9383 @@ -528,15 +529,15 @@ static void dma_cache_maint_contiguous(s
9384  
9385         switch (direction) {
9386         case DMA_FROM_DEVICE:           /* invalidate only */
9387 -               inner_op = dmac_inv_range;
9388 +               inner_op = smp_dma_inv_range;
9389                 outer_op = outer_inv_range;
9390                 break;
9391         case DMA_TO_DEVICE:             /* writeback only */
9392 -               inner_op = dmac_clean_range;
9393 +               inner_op = smp_dma_clean_range;
9394                 outer_op = outer_clean_range;
9395                 break;
9396         case DMA_BIDIRECTIONAL:         /* writeback and invalidate */
9397 -               inner_op = dmac_flush_range;
9398 +               inner_op = smp_dma_flush_range;
9399                 outer_op = outer_flush_range;
9400                 break;
9401         default:
9402 --- a/arch/arm/mm/Kconfig
9403 +++ b/arch/arm/mm/Kconfig
9404 @@ -391,7 +391,7 @@ config CPU_FEROCEON_OLD_ID
9405  
9406  # ARMv6
9407  config CPU_V6
9408 -       bool "Support ARM V6 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX
9409 +       bool "Support ARM V6 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || ARCH_CNS3XXX || MACH_REALVIEW_PBX
9410         select CPU_32v6
9411         select CPU_ABRT_EV6
9412         select CPU_PABRT_NOIFAR
9413 @@ -516,6 +516,16 @@ config CPU_CACHE_VIPT
9414  config CPU_CACHE_FA
9415         bool
9416  
9417 +config CPU_NO_CACHE_BCAST
9418 +       bool
9419 +       depends on SMP
9420 +       default y if CPU_V6
9421 +
9422 +config CPU_NO_CACHE_BCAST_DEBUG
9423 +       bool
9424 +       depends on SMP
9425 +       default y if CPU_V6
9426 +
9427  if MMU
9428  # The copy-page model
9429  config CPU_COPY_V3
9430 @@ -759,11 +769,84 @@ config CACHE_L2X0
9431         bool "Enable the L2x0 outer cache controller"
9432         depends on REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176 || \
9433                    REALVIEW_EB_A9MP || ARCH_MX35 || ARCH_MX31 || MACH_REALVIEW_PBX
9434 -       default y
9435 +       default n
9436         select OUTER_CACHE
9437         help
9438           This option enables the L2x0 PrimeCell.
9439  
9440 +choice
9441 +       prompt "L2 Cache Size"
9442 +       depends on CACHE_L2X0
9443 +       default CACHE_L2X0_1MB
9444 +
9445 +config CACHE_L2X0_128KB
9446 +       bool "128KB"
9447 +       help
9448 +         16KB/way, 8-way, evmon/parity/share enabled
9449 +
9450 +config CACHE_L2X0_256KB
9451 +       bool "256KB"
9452 +       help
9453 +         32KB/way, 8-way, evmon/parity/share enabled
9454 +
9455 +config CACHE_L2X0_512KB
9456 +       bool "512KB"
9457 +       help
9458 +         64KB/way, 8-way, evmon/parity/share enabled
9459 +
9460 +config CACHE_L2X0_1MB
9461 +       bool "1MB"
9462 +       help
9463 +         128KB/way, 8-way, evmon/parity/share enabled
9464 +endchoice
9465 +
9466 +config CACHE_L2CC
9467 +       bool "Enable the L2 outer cache controller"
9468 +       depends on ARCH_CNS3XXX
9469 +       default n
9470 +       select OUTER_CACHE
9471 +       help
9472 +         This option enables the L2 cache controller.
9473 +
9474 +choice
9475 +       prompt "L2 Cache Size"
9476 +       depends on CACHE_L2CC
9477 +       default CACHE_L2CC_256KB
9478 +
9479 +config CACHE_L2CC_32KB
9480 +       bool "32KB"
9481 +       help
9482 +         4KB/way, 8-way, evmon/share enabled
9483 +
9484 +config CACHE_L2CC_64KB
9485 +       bool "64KB"
9486 +       help
9487 +         8KB/way, 8-way, evmon/share enabled
9488 +
9489 +config CACHE_L2CC_96KB
9490 +       bool "96KB"
9491 +       help
9492 +         12KB/way, 8-way, evmon/share enabled
9493 +
9494 +config CACHE_L2CC_128KB
9495 +       bool "128KB"
9496 +       help
9497 +         16KB/way, 8-way, evmon/share enabled
9498 +
9499 +config CACHE_L2CC_256KB 
9500 +       bool "256KB"
9501 +       help
9502 +         32KB/way, 8-way, evmon/share enabled
9503 +
9504 +endchoice
9505 +
9506 +config CACHE_L2_I_PREFETCH
9507 +       bool "Enable the L2 instruction prefetching"
9508 +       depends on CACHE_L2CC
9509 +       default y
9510 +       help
9511 +         This option enables instruction prefetching.
9512 +
9513  config CACHE_XSC3L2
9514         bool "Enable the L2 cache on XScale3"
9515         depends on CPU_XSC3
9516 --- a/arch/arm/mm/Makefile
9517 +++ b/arch/arm/mm/Makefile
9518 @@ -82,5 +82,6 @@ obj-$(CONFIG_CPU_V7)          += proc-v7.o
9519  
9520  obj-$(CONFIG_CACHE_FEROCEON_L2)        += cache-feroceon-l2.o
9521  obj-$(CONFIG_CACHE_L2X0)       += cache-l2x0.o
9522 +obj-$(CONFIG_CACHE_L2CC)       += cache-l2cc.o
9523  obj-$(CONFIG_CACHE_XSC3L2)     += cache-xsc3l2.o
9524  
9525 --- a/arch/arm/mm/mmu.c
9526 +++ b/arch/arm/mm/mmu.c
9527 @@ -687,7 +687,7 @@ __early_param("vmalloc=", early_vmalloc)
9528  
9529  static void __init sanity_check_meminfo(void)
9530  {
9531 -       int i, j, highmem = 0;
9532 +       int i, j;
9533  
9534         for (i = 0, j = 0; i < meminfo.nr_banks; i++) {
9535                 struct membank *bank = &meminfo.bank[j];
9536 --- a/include/linux/pci_ids.h
9537 +++ b/include/linux/pci_ids.h
9538 @@ -2668,3 +2668,5 @@
9539  #define PCI_DEVICE_ID_RME_DIGI32       0x9896
9540  #define PCI_DEVICE_ID_RME_DIGI32_PRO   0x9897
9541  #define PCI_DEVICE_ID_RME_DIGI32_8     0x9898
9542 +
9543 +#define PCI_VENDOR_ID_CAVIUM 0x177d
9544 --- a/arch/arm/tools/mach-types
9545 +++ b/arch/arm/tools/mach-types
9546 @@ -12,7 +12,7 @@
9547  #
9548  #   http://www.arm.linux.org.uk/developer/machines/?action=new
9549  #
9550 -# Last update: Sat Jun 20 22:28:39 2009
9551 +# Last update: Wed Jun 9 02:11:30 2010
9552  #
9553  # machine_is_xxx       CONFIG_xxxx             MACH_TYPE_xxx           number
9554  #
9555 @@ -928,7 +928,7 @@ palmt5                      MACH_PALMT5             PALMT5                  917
9556  palmtc                 MACH_PALMTC             PALMTC                  918
9557  omap_apollon           MACH_OMAP_APOLLON       OMAP_APOLLON            919
9558  mxc30030evb            MACH_MXC30030EVB        MXC30030EVB             920
9559 -rea_2d                 MACH_REA_2D             REA_2D                  921
9560 +rea_cpu2               MACH_REA_2D             REA_2D                  921
9561  eti3e524               MACH_TI3E524            TI3E524                 922
9562  ateb9200               MACH_ATEB9200           ATEB9200                923
9563  auckland               MACH_AUCKLAND           AUCKLAND                924
9564 @@ -1319,7 +1319,7 @@ mistral                   MACH_MISTRAL            MISTRAL                 1315
9565  msm                    MACH_MSM                MSM                     1316
9566  ct5910                 MACH_CT5910             CT5910                  1317
9567  ct5912                 MACH_CT5912             CT5912                  1318
9568 -hynet_ine              MACH_HYNET_INE          HYNET_INE               1319
9569 +argonst_foundation     MACH_HYNET_INE          HYNET_INE               1319
9570  hynet_app              MACH_HYNET_APP          HYNET_APP               1320
9571  msm7200                        MACH_MSM7200            MSM7200                 1321
9572  msm7600                        MACH_MSM7600            MSM7600                 1322
9573 @@ -1638,7 +1638,7 @@ mx35evb                   MACH_MX35EVB            MX35EVB                 1643
9574  aml_m8050              MACH_AML_M8050          AML_M8050               1644
9575  mx35_3ds               MACH_MX35_3DS           MX35_3DS                1645
9576  mars                   MACH_MARS               MARS                    1646
9577 -ntosd_644xa            MACH_NTOSD_644XA        NTOSD_644XA             1647
9578 +neuros_osd2            MACH_NEUROS_OSD2        NEUROS_OSD2             1647
9579  badger                 MACH_BADGER             BADGER                  1648
9580  trizeps4wl             MACH_TRIZEPS4WL         TRIZEPS4WL              1649
9581  trizeps5               MACH_TRIZEPS5           TRIZEPS5                1650
9582 @@ -1654,7 +1654,7 @@ vf10xx                    MACH_VF10XX             VF10XX                  1659
9583  zoran43xx              MACH_ZORAN43XX          ZORAN43XX               1660
9584  sonix926               MACH_SONIX926           SONIX926                1661
9585  celestialsemi          MACH_CELESTIALSEMI      CELESTIALSEMI           1662
9586 -cc9m2443               MACH_CC9M2443           CC9M2443                1663
9587 +cc9m2443js             MACH_CC9M2443JS         CC9M2443JS              1663
9588  tw5334                 MACH_TW5334             TW5334                  1664
9589  omap_htcartemis                MACH_HTCARTEMIS         HTCARTEMIS              1665
9590  nal_hlite              MACH_NAL_HLITE          NAL_HLITE               1666
9591 @@ -1769,14 +1769,15 @@ mx31cicada              MACH_MX31CICADA         MX31CICADA      
9592  mi424wr                        MACH_MI424WR            MI424WR                 1778
9593  axs_ultrax             MACH_AXS_ULTRAX         AXS_ULTRAX              1779
9594  at572d940deb           MACH_AT572D940DEB       AT572D940DEB            1780
9595 -davinci_da8xx_evm      MACH_DAVINCI_DA8XX_EVM  DAVINCI_DA8XX_EVM       1781
9596 +davinci_da830_evm      MACH_DAVINCI_DA830_EVM  DAVINCI_DA830_EVM       1781
9597  ep9302                 MACH_EP9302             EP9302                  1782
9598  at572d940hfek          MACH_AT572D940HFEB      AT572D940HFEB           1783
9599  cybook3                        MACH_CYBOOK3            CYBOOK3                 1784
9600  wdg002                 MACH_WDG002             WDG002                  1785
9601  sg560adsl              MACH_SG560ADSL          SG560ADSL               1786
9602  nextio_n2800_ica       MACH_NEXTIO_N2800_ICA   NEXTIO_N2800_ICA        1787
9603 -marvell_newdb          MACH_MARVELL_NEWDB      MARVELL_NEWDB           1789
9604 +dove_db                        MACH_DOVE_DB            DOVE_DB                 1788
9605 +dove_avng              MACH_MARVELL_NEWDB      MARVELL_NEWDB           1789
9606  vandihud               MACH_VANDIHUD           VANDIHUD                1790
9607  magx_e8                        MACH_MAGX_E8            MAGX_E8                 1791
9608  magx_z6                        MACH_MAGX_Z6            MAGX_Z6                 1792
9609 @@ -1802,7 +1803,7 @@ ccw9p9215js               MACH_CCW9P9215JS        CCW9P9215J
9610  rd88f5181l_ge          MACH_RD88F5181L_GE      RD88F5181L_GE           1812
9611  sifmain                        MACH_SIFMAIN            SIFMAIN                 1813
9612  sam9_l9261             MACH_SAM9_L9261         SAM9_L9261              1814
9613 -cc9m2443js             MACH_CC9M2443JS         CC9M2443JS              1815
9614 +cc9m2443               MACH_CC9M2443           CC9M2443                1815
9615  xaria300               MACH_XARIA300           XARIA300                1816
9616  it9200                 MACH_IT9200             IT9200                  1817
9617  rd88f5181l_fxo         MACH_RD88F5181L_FXO     RD88F5181L_FXO          1818
9618 @@ -1962,7 +1963,7 @@ ethernut5         MACH_ETHERNUT5          ETHERNUT5               19
9619  arm11                  MACH_ARM11              ARM11                   1972
9620  cpuat9260              MACH_CPUAT9260          CPUAT9260               1973
9621  cpupxa255              MACH_CPUPXA255          CPUPXA255               1974
9622 -cpuimx27               MACH_CPUIMX27           CPUIMX27                1975
9623 +eukrea_cpuimx27                MACH_CPUIMX27           CPUIMX27                1975
9624  cheflux                        MACH_CHEFLUX            CHEFLUX                 1976
9625  eb_cpux9k2             MACH_EB_CPUX9K2         EB_CPUX9K2              1977
9626  opcotec                        MACH_OPCOTEC            OPCOTEC                 1978
9627 @@ -2249,14 +2250,14 @@ omap3_phrazer           MACH_OMAP3_PHRAZER      OMAP3_
9628  darwin                 MACH_DARWIN             DARWIN                  2262
9629  oratiscomu             MACH_ORATISCOMU         ORATISCOMU              2263
9630  rtsbc20                        MACH_RTSBC20            RTSBC20                 2264
9631 -i780                   MACH_I780               I780                    2265
9632 +sgh_i780               MACH_I780               I780                    2265
9633  gemini324              MACH_GEMINI324          GEMINI324               2266
9634  oratislan              MACH_ORATISLAN          ORATISLAN               2267
9635  oratisalog             MACH_ORATISALOG         ORATISALOG              2268
9636  oratismadi             MACH_ORATISMADI         ORATISMADI              2269
9637  oratisot16             MACH_ORATISOT16         ORATISOT16              2270
9638  oratisdesk             MACH_ORATISDESK         ORATISDESK              2271
9639 -v2p_ca9                        MACH_V2P_CA9            V2P_CA9                 2272
9640 +vexpress               MACH_VEXPRESS           VEXPRESS                2272
9641  sintexo                        MACH_SINTEXO            SINTEXO                 2273
9642  cm3389                 MACH_CM3389             CM3389                  2274
9643  omap3_cio              MACH_OMAP3_CIO          OMAP3_CIO               2275
9644 @@ -2280,3 +2281,615 @@ htcrhodium              MACH_HTCRHODIUM         HTCRHODIUM      
9645  htctopaz               MACH_HTCTOPAZ           HTCTOPAZ                2293
9646  matrix504              MACH_MATRIX504          MATRIX504               2294
9647  mrfsa                  MACH_MRFSA              MRFSA                   2295
9648 +sc_p270                        MACH_SC_P270            SC_P270                 2296
9649 +atlas5_evb             MACH_ATLAS5_EVB         ATLAS5_EVB              2297
9650 +pelco_lobox            MACH_PELCO_LOBOX        PELCO_LOBOX             2298
9651 +dilax_pcu200           MACH_DILAX_PCU200       DILAX_PCU200            2299
9652 +leonardo               MACH_LEONARDO           LEONARDO                2300
9653 +zoran_approach7                MACH_ZORAN_APPROACH7    ZORAN_APPROACH7         2301
9654 +dp6xx                  MACH_DP6XX              DP6XX                   2302
9655 +bcm2153_vesper         MACH_BCM2153_VESPER     BCM2153_VESPER          2303
9656 +mahimahi               MACH_MAHIMAHI           MAHIMAHI                2304
9657 +clickc                 MACH_CLICKC             CLICKC                  2305
9658 +zb_gateway             MACH_ZB_GATEWAY         ZB_GATEWAY              2306
9659 +tazcard                        MACH_TAZCARD            TAZCARD                 2307
9660 +tazdev                 MACH_TAZDEV             TAZDEV                  2308
9661 +annax_cb_arm           MACH_ANNAX_CB_ARM       ANNAX_CB_ARM            2309
9662 +annax_dm3              MACH_ANNAX_DM3          ANNAX_DM3               2310
9663 +cerebric               MACH_CEREBRIC           CEREBRIC                2311
9664 +orca                   MACH_ORCA               ORCA                    2312
9665 +pc9260                 MACH_PC9260             PC9260                  2313
9666 +ems285a                        MACH_EMS285A            EMS285A                 2314
9667 +gec2410                        MACH_GEC2410            GEC2410                 2315
9668 +gec2440                        MACH_GEC2440            GEC2440                 2316
9669 +mw903                  MACH_ARCH_MW903         ARCH_MW903              2317
9670 +mw2440                 MACH_MW2440             MW2440                  2318
9671 +ecac2378               MACH_ECAC2378           ECAC2378                2319
9672 +tazkiosk               MACH_TAZKIOSK           TAZKIOSK                2320
9673 +whiterabbit_mch                MACH_WHITERABBIT_MCH    WHITERABBIT_MCH         2321
9674 +sbox9263               MACH_SBOX9263           SBOX9263                2322
9675 +oreo_camera            MACH_OREO               OREO                    2323
9676 +smdk6442               MACH_SMDK6442           SMDK6442                2324
9677 +openrd_base            MACH_OPENRD_BASE        OPENRD_BASE             2325
9678 +incredible             MACH_INCREDIBLE         INCREDIBLE              2326
9679 +incrediblec            MACH_INCREDIBLEC        INCREDIBLEC             2327
9680 +heroct                 MACH_HEROCT             HEROCT                  2328
9681 +mmnet1000              MACH_MMNET1000          MMNET1000               2329
9682 +devkit8000             MACH_DEVKIT8000         DEVKIT8000              2330
9683 +devkit9000             MACH_DEVKIT9000         DEVKIT9000              2331
9684 +mx31txtr               MACH_MX31TXTR           MX31TXTR                2332
9685 +u380                   MACH_U380               U380                    2333
9686 +oamp3_hualu            MACH_HUALU_BOARD        HUALU_BOARD             2334
9687 +npcmx50                        MACH_NPCMX50            NPCMX50                 2335
9688 +mx51_lange51           MACH_MX51_LANGE51       MX51_LANGE51            2336
9689 +mx51_lange52           MACH_MX51_LANGE52       MX51_LANGE52            2337
9690 +riom                   MACH_RIOM               RIOM                    2338
9691 +comcas                 MACH_COMCAS             COMCAS                  2339
9692 +wsi_mx27               MACH_WSI_MX27           WSI_MX27                2340
9693 +cm_t35                 MACH_CM_T35             CM_T35                  2341
9694 +net2big                        MACH_NET2BIG            NET2BIG                 2342
9695 +motorola_a1600         MACH_MOTOROLA_A1600     MOTOROLA_A1600          2343
9696 +igep0020               MACH_IGEP0020           IGEP0020                2344
9697 +igep0010               MACH_IGEP0010           IGEP0010                2345
9698 +mv6281gtwge2           MACH_MV6281GTWGE2       MV6281GTWGE2            2346
9699 +scat100                        MACH_SCAT100            SCAT100                 2347
9700 +sanmina                        MACH_SANMINA            SANMINA                 2348
9701 +momento                        MACH_MOMENTO            MOMENTO                 2349
9702 +nuc9xx                 MACH_NUC9XX             NUC9XX                  2350
9703 +nuc910evb              MACH_NUC910EVB          NUC910EVB               2351
9704 +nuc920evb              MACH_NUC920EVB          NUC920EVB               2352
9705 +nuc950evb              MACH_NUC950EVB          NUC950EVB               2353
9706 +nuc945evb              MACH_NUC945EVB          NUC945EVB               2354
9707 +nuc960evb              MACH_NUC960EVB          NUC960EVB               2355
9708 +nuc932evb              MACH_NUC932EVB          NUC932EVB               2356
9709 +nuc900                 MACH_NUC900             NUC900                  2357
9710 +sd1soc                 MACH_SD1SOC             SD1SOC                  2358
9711 +ln2440bc               MACH_LN2440BC           LN2440BC                2359
9712 +rsbc                   MACH_RSBC               RSBC                    2360
9713 +openrd_client          MACH_OPENRD_CLIENT      OPENRD_CLIENT           2361
9714 +hpipaq11x              MACH_HPIPAQ11X          HPIPAQ11X               2362
9715 +wayland                        MACH_WAYLAND            WAYLAND                 2363
9716 +acnbsx102              MACH_ACNBSX102          ACNBSX102               2364
9717 +hwat91                 MACH_HWAT91             HWAT91                  2365
9718 +at91sam9263cs          MACH_AT91SAM9263CS      AT91SAM9263CS           2366
9719 +csb732                 MACH_CSB732             CSB732                  2367
9720 +u8500                  MACH_U8500              U8500                   2368
9721 +huqiu                  MACH_HUQIU              HUQIU                   2369
9722 +mx51_kunlun            MACH_MX51_KUNLUN        MX51_KUNLUN             2370
9723 +pmt1g                  MACH_PMT1G              PMT1G                   2371
9724 +htcelf                 MACH_HTCELF             HTCELF                  2372
9725 +armadillo420           MACH_ARMADILLO420       ARMADILLO420            2373
9726 +armadillo440           MACH_ARMADILLO440       ARMADILLO440            2374
9727 +u_chip_dual_arm                MACH_U_CHIP_DUAL_ARM    U_CHIP_DUAL_ARM         2375
9728 +csr_bdb3               MACH_CSR_BDB3           CSR_BDB3                2376
9729 +dolby_cat1018          MACH_DOLBY_CAT1018      DOLBY_CAT1018           2377
9730 +hy9307                 MACH_HY9307             HY9307                  2378
9731 +aspire_easystore       MACH_A_ES               A_ES                    2379
9732 +davinci_irif           MACH_DAVINCI_IRIF       DAVINCI_IRIF            2380
9733 +agama9263              MACH_AGAMA9263          AGAMA9263               2381
9734 +marvell_jasper         MACH_MARVELL_JASPER     MARVELL_JASPER          2382
9735 +flint                  MACH_FLINT              FLINT                   2383
9736 +tavorevb3              MACH_TAVOREVB3          TAVOREVB3               2384
9737 +sch_m490               MACH_SCH_M490           SCH_M490                2386
9738 +rbl01                  MACH_RBL01              RBL01                   2387
9739 +omnifi                 MACH_OMNIFI             OMNIFI                  2388
9740 +otavalo                        MACH_OTAVALO            OTAVALO                 2389
9741 +siena                  MACH_SIENNA             SIENNA                  2390
9742 +htc_excalibur_s620     MACH_HTC_EXCALIBUR_S620 HTC_EXCALIBUR_S620      2391
9743 +htc_opal               MACH_HTC_OPAL           HTC_OPAL                2392
9744 +touchbook              MACH_TOUCHBOOK          TOUCHBOOK               2393
9745 +latte                  MACH_LATTE              LATTE                   2394
9746 +xa200                  MACH_XA200              XA200                   2395
9747 +nimrod                 MACH_NIMROD             NIMROD                  2396
9748 +cc9p9215_3g            MACH_CC9P9215_3G        CC9P9215_3G             2397
9749 +cc9p9215_3gjs          MACH_CC9P9215_3GJS      CC9P9215_3GJS           2398
9750 +tk71                   MACH_TK71               TK71                    2399
9751 +comham3525             MACH_COMHAM3525         COMHAM3525              2400
9752 +mx31erebus             MACH_MX31EREBUS         MX31EREBUS              2401
9753 +mcardmx27              MACH_MCARDMX27          MCARDMX27               2402
9754 +paradise               MACH_PARADISE           PARADISE                2403
9755 +tide                   MACH_TIDE               TIDE                    2404
9756 +wzl2440                        MACH_WZL2440            WZL2440                 2405
9757 +sdrdemo                        MACH_SDRDEMO            SDRDEMO                 2406
9758 +ethercan2              MACH_ETHERCAN2          ETHERCAN2               2407
9759 +ecmimg20               MACH_ECMIMG20           ECMIMG20                2408
9760 +omap_dragon            MACH_OMAP_DRAGON        OMAP_DRAGON             2409
9761 +halo                   MACH_HALO               HALO                    2410
9762 +huangshan              MACH_HUANGSHAN          HUANGSHAN               2411
9763 +vl_ma2sc               MACH_VL_MA2SC           VL_MA2SC                2412
9764 +raumfeld_rc            MACH_RAUMFELD_RC        RAUMFELD_RC             2413
9765 +raumfeld_connector     MACH_RAUMFELD_CONNECTOR RAUMFELD_CONNECTOR      2414
9766 +raumfeld_speaker       MACH_RAUMFELD_SPEAKER   RAUMFELD_SPEAKER        2415
9767 +multibus_master                MACH_MULTIBUS_MASTER    MULTIBUS_MASTER         2416
9768 +multibus_pbk           MACH_MULTIBUS_PBK       MULTIBUS_PBK            2417
9769 +tnetv107x              MACH_TNETV107X          TNETV107X               2418
9770 +snake                  MACH_SNAKE              SNAKE                   2419
9771 +cwmx27                 MACH_CWMX27             CWMX27                  2420
9772 +sch_m480               MACH_SCH_M480           SCH_M480                2421
9773 +platypus               MACH_PLATYPUS           PLATYPUS                2422
9774 +pss2                   MACH_PSS2               PSS2                    2423
9775 +davinci_apm150         MACH_DAVINCI_APM150     DAVINCI_APM150          2424
9776 +str9100                        MACH_STR9100            STR9100                 2425
9777 +net5big                        MACH_NET5BIG            NET5BIG                 2426
9778 +seabed9263             MACH_SEABED9263         SEABED9263              2427
9779 +mx51_m2id              MACH_MX51_M2ID          MX51_M2ID               2428
9780 +octvocplus_eb          MACH_OCTVOCPLUS_EB      OCTVOCPLUS_EB           2429
9781 +klk_firefox            MACH_KLK_FIREFOX        KLK_FIREFOX             2430
9782 +klk_wirma_module       MACH_KLK_WIRMA_MODULE   KLK_WIRMA_MODULE        2431
9783 +klk_wirma_mmi          MACH_KLK_WIRMA_MMI      KLK_WIRMA_MMI           2432
9784 +supersonic             MACH_SUPERSONIC         SUPERSONIC              2433
9785 +liberty                        MACH_LIBERTY            LIBERTY                 2434
9786 +mh355                  MACH_MH355              MH355                   2435
9787 +pc7802                 MACH_PC7802             PC7802                  2436
9788 +gnet_sgc               MACH_GNET_SGC           GNET_SGC                2437
9789 +einstein15             MACH_EINSTEIN15         EINSTEIN15              2438
9790 +cmpd                   MACH_CMPD               CMPD                    2439
9791 +davinci_hase1          MACH_DAVINCI_HASE1      DAVINCI_HASE1           2440
9792 +lgeincitephone         MACH_LGEINCITEPHONE     LGEINCITEPHONE          2441
9793 +ea313x                 MACH_EA313X             EA313X                  2442
9794 +fwbd_39064             MACH_FWBD_39064         FWBD_39064              2443
9795 +fwbd_390128            MACH_FWBD_390128        FWBD_390128             2444
9796 +pelco_moe              MACH_PELCO_MOE          PELCO_MOE               2445
9797 +minimix27              MACH_MINIMIX27          MINIMIX27               2446
9798 +omap3_thunder          MACH_OMAP3_THUNDER      OMAP3_THUNDER           2447
9799 +passionc               MACH_PASSIONC           PASSIONC                2448
9800 +mx27amata              MACH_MX27AMATA          MX27AMATA               2449
9801 +bgat1                  MACH_BGAT1              BGAT1                   2450
9802 +buzz                   MACH_BUZZ               BUZZ                    2451
9803 +mb9g20                 MACH_MB9G20             MB9G20                  2452
9804 +yushan                 MACH_YUSHAN             YUSHAN                  2453
9805 +lizard                 MACH_LIZARD             LIZARD                  2454
9806 +omap3polycom           MACH_OMAP3POLYCOM       OMAP3POLYCOM            2455
9807 +smdkv210               MACH_SMDKV210           SMDKV210                2456
9808 +bravo                  MACH_BRAVO              BRAVO                   2457
9809 +siogentoo1             MACH_SIOGENTOO1         SIOGENTOO1              2458
9810 +siogentoo2             MACH_SIOGENTOO2         SIOGENTOO2              2459
9811 +sm3k                   MACH_SM3K               SM3K                    2460
9812 +acer_tempo_f900                MACH_ACER_TEMPO_F900    ACER_TEMPO_F900         2461
9813 +sst61vc010_dev         MACH_SST61VC010_DEV     SST61VC010_DEV          2462
9814 +glittertind            MACH_GLITTERTIND        GLITTERTIND             2463
9815 +omap_zoom3             MACH_OMAP_ZOOM3         OMAP_ZOOM3              2464
9816 +omap_3630sdp           MACH_OMAP_3630SDP       OMAP_3630SDP            2465
9817 +cybook2440             MACH_CYBOOK2440         CYBOOK2440              2466
9818 +torino_s               MACH_TORINO_S           TORINO_S                2467
9819 +havana                 MACH_HAVANA             HAVANA                  2468
9820 +beaumont_11            MACH_BEAUMONT_11        BEAUMONT_11             2469
9821 +vanguard               MACH_VANGUARD           VANGUARD                2470
9822 +s5pc110_draco          MACH_S5PC110_DRACO      S5PC110_DRACO           2471
9823 +cartesio_two           MACH_CARTESIO_TWO       CARTESIO_TWO            2472
9824 +aster                  MACH_ASTER              ASTER                   2473
9825 +voguesv210             MACH_VOGUESV210         VOGUESV210              2474
9826 +acm500x                        MACH_ACM500X            ACM500X                 2475
9827 +km9260                 MACH_KM9260             KM9260                  2476
9828 +nideflexg1             MACH_NIDEFLEXG1         NIDEFLEXG1              2477
9829 +ctera_plug_io          MACH_CTERA_PLUG_IO      CTERA_PLUG_IO           2478
9830 +smartq7                        MACH_SMARTQ7            SMARTQ7                 2479
9831 +at91sam9g10ek2         MACH_AT91SAM9G10EK2     AT91SAM9G10EK2          2480
9832 +asusp527               MACH_ASUSP527           ASUSP527                2481
9833 +at91sam9g20mpm2                MACH_AT91SAM9G20MPM2    AT91SAM9G20MPM2         2482
9834 +topasa900              MACH_TOPASA900          TOPASA900               2483
9835 +electrum_100           MACH_ELECTRUM_100       ELECTRUM_100            2484
9836 +mx51grb                        MACH_MX51GRB            MX51GRB                 2485
9837 +xea300                 MACH_XEA300             XEA300                  2486
9838 +htcstartrek            MACH_HTCSTARTREK        HTCSTARTREK             2487
9839 +lima                   MACH_LIMA               LIMA                    2488
9840 +csb740                 MACH_CSB740             CSB740                  2489
9841 +usb_s8815              MACH_USB_S8815          USB_S8815               2490
9842 +watson_efm_plugin      MACH_WATSON_EFM_PLUGIN  WATSON_EFM_PLUGIN       2491
9843 +milkyway               MACH_MILKYWAY           MILKYWAY                2492
9844 +g4evm                  MACH_G4EVM              G4EVM                   2493
9845 +picomod6               MACH_PICOMOD6           PICOMOD6                2494
9846 +omapl138_hawkboard     MACH_OMAPL138_HAWKBOARD OMAPL138_HAWKBOARD      2495
9847 +ip6000                 MACH_IP6000             IP6000                  2496
9848 +ip6010                 MACH_IP6010             IP6010                  2497
9849 +utm400                 MACH_UTM400             UTM400                  2498
9850 +omap3_zybex            MACH_OMAP3_ZYBEX        OMAP3_ZYBEX             2499
9851 +wireless_space         MACH_WIRELESS_SPACE     WIRELESS_SPACE          2500
9852 +sx560                  MACH_SX560              SX560                   2501
9853 +ts41x                  MACH_TS41X              TS41X                   2502
9854 +elphel10373            MACH_ELPHEL10373        ELPHEL10373             2503
9855 +rhobot                 MACH_RHOBOT             RHOBOT                  2504
9856 +mx51_refresh           MACH_MX51_REFRESH       MX51_REFRESH            2505
9857 +ls9260                 MACH_LS9260             LS9260                  2506
9858 +shank                  MACH_SHANK              SHANK                   2507
9859 +qsd8x50_st1            MACH_QSD8X50_ST1        QSD8X50_ST1             2508
9860 +at91sam9m10ekes                MACH_AT91SAM9M10EKES    AT91SAM9M10EKES         2509
9861 +hiram                  MACH_HIRAM              HIRAM                   2510
9862 +phy3250                        MACH_PHY3250            PHY3250                 2511
9863 +ea3250                 MACH_EA3250             EA3250                  2512
9864 +fdi3250                        MACH_FDI3250            FDI3250                 2513
9865 +htcwhitestone          MACH_WHITESTONE         WHITESTONE              2514
9866 +at91sam9263nit         MACH_AT91SAM9263NIT     AT91SAM9263NIT          2515
9867 +ccmx51                 MACH_CCMX51             CCMX51                  2516
9868 +ccmx51js               MACH_CCMX51JS           CCMX51JS                2517
9869 +ccwmx51                        MACH_CCWMX51            CCWMX51                 2518
9870 +ccwmx51js              MACH_CCWMX51JS          CCWMX51JS               2519
9871 +mini6410               MACH_MINI6410           MINI6410                2520
9872 +tiny6410               MACH_TINY6410           TINY6410                2521
9873 +nano6410               MACH_NANO6410           NANO6410                2522
9874 +at572d940hfnldb                MACH_AT572D940HFNLDB    AT572D940HFNLDB         2523
9875 +htcleo                 MACH_HTCLEO             HTCLEO                  2524
9876 +avp13                  MACH_AVP13              AVP13                   2525
9877 +xxsvideod              MACH_XXSVIDEOD          XXSVIDEOD               2526
9878 +vpnext                 MACH_VPNEXT             VPNEXT                  2527
9879 +swarco_itc3            MACH_SWARCO_ITC3        SWARCO_ITC3             2528
9880 +tx51                   MACH_TX51               TX51                    2529
9881 +dolby_cat1021          MACH_DOLBY_CAT1021      DOLBY_CAT1021           2530
9882 +mx28evk                        MACH_MX28EVK            MX28EVK                 2531
9883 +phoenix260             MACH_PHOENIX260         PHOENIX260              2532
9884 +uvaca_stork            MACH_UVACA_STORK        UVACA_STORK             2533
9885 +smartq5                        MACH_SMARTQ5            SMARTQ5                 2534
9886 +all3078                        MACH_ALL3078            ALL3078                 2535
9887 +ctera_2bay_ds          MACH_CTERA_2BAY_DS      CTERA_2BAY_DS           2536
9888 +siogentoo3             MACH_SIOGENTOO3         SIOGENTOO3              2537
9889 +epb5000                        MACH_EPB5000            EPB5000                 2538
9890 +hy9263                 MACH_HY9263             HY9263                  2539
9891 +acer_tempo_m900                MACH_ACER_TEMPO_M900    ACER_TEMPO_M900         2540
9892 +acer_tempo_dx650       MACH_ACER_TEMPO_DX900   ACER_TEMPO_DX900        2541
9893 +acer_tempo_x960                MACH_ACER_TEMPO_X960    ACER_TEMPO_X960         2542
9894 +acer_eten_v900         MACH_ACER_ETEN_V900     ACER_ETEN_V900          2543
9895 +acer_eten_x900         MACH_ACER_ETEN_X900     ACER_ETEN_X900          2544
9896 +bonnell                        MACH_BONNELL            BONNELL                 2545
9897 +oht_mx27               MACH_OHT_MX27           OHT_MX27                2546
9898 +htcquartz              MACH_HTCQUARTZ          HTCQUARTZ               2547
9899 +davinci_dm6467tevm     MACH_DAVINCI_DM6467TEVM DAVINCI_DM6467TEVM      2548
9900 +c3ax03                 MACH_C3AX03             C3AX03                  2549
9901 +mxt_td60               MACH_MXT_TD60           MXT_TD60                2550
9902 +esyx                   MACH_ESYX               ESYX                    2551
9903 +dove_db2               MACH_DOVE_DB2           DOVE_DB2                2552
9904 +bulldog                        MACH_BULLDOG            BULLDOG                 2553
9905 +derell_me2000          MACH_DERELL_ME2000      DERELL_ME2000           2554
9906 +bcmring_base           MACH_BCMRING_BASE       BCMRING_BASE            2555
9907 +bcmring_evm            MACH_BCMRING_EVM        BCMRING_EVM             2556
9908 +bcmring_evm_jazz       MACH_BCMRING_EVM_JAZZ   BCMRING_EVM_JAZZ        2557
9909 +bcmring_sp             MACH_BCMRING_SP         BCMRING_SP              2558
9910 +bcmring_sv             MACH_BCMRING_SV         BCMRING_SV              2559
9911 +bcmring_sv_jazz                MACH_BCMRING_SV_JAZZ    BCMRING_SV_JAZZ         2560
9912 +bcmring_tablet         MACH_BCMRING_TABLET     BCMRING_TABLET          2561
9913 +bcmring_vp             MACH_BCMRING_VP         BCMRING_VP              2562
9914 +bcmring_evm_seikor     MACH_BCMRING_EVM_SEIKOR BCMRING_EVM_SEIKOR      2563
9915 +bcmring_sp_wqvga       MACH_BCMRING_SP_WQVGA   BCMRING_SP_WQVGA        2564
9916 +bcmring_custom         MACH_BCMRING_CUSTOM     BCMRING_CUSTOM          2565
9917 +acer_s200              MACH_ACER_S200          ACER_S200               2566
9918 +bt270                  MACH_BT270              BT270                   2567
9919 +iseo                   MACH_ISEO               ISEO                    2568
9920 +cezanne                        MACH_CEZANNE            CEZANNE                 2569
9921 +lucca                  MACH_LUCCA              LUCCA                   2570
9922 +supersmart             MACH_SUPERSMART         SUPERSMART              2571
9923 +arm11_board            MACH_CS_MISANO          CS_MISANO               2572
9924 +magnolia2              MACH_MAGNOLIA2          MAGNOLIA2               2573
9925 +emxx                   MACH_EMXX               EMXX                    2574
9926 +outlaw                 MACH_OUTLAW             OUTLAW                  2575
9927 +riot_bei2              MACH_RIOT_BEI2          RIOT_BEI2               2576
9928 +riot_vox               MACH_RIOT_VOX           RIOT_VOX                2577
9929 +riot_x37               MACH_RIOT_X37           RIOT_X37                2578
9930 +mega25mx               MACH_MEGA25MX           MEGA25MX                2579
9931 +benzina2               MACH_BENZINA2           BENZINA2                2580
9932 +ignite                 MACH_IGNITE             IGNITE                  2581
9933 +foggia                 MACH_FOGGIA             FOGGIA                  2582
9934 +arezzo                 MACH_AREZZO             AREZZO                  2583
9935 +leica_skywalker                MACH_LEICA_SKYWALKER    LEICA_SKYWALKER         2584
9936 +jacinto2_jamr          MACH_JACINTO2_JAMR      JACINTO2_JAMR           2585
9937 +gts_nova               MACH_GTS_NOVA           GTS_NOVA                2586
9938 +p3600                  MACH_P3600              P3600                   2587
9939 +dlt2                   MACH_DLT2               DLT2                    2588
9940 +df3120                 MACH_DF3120             DF3120                  2589
9941 +ecucore_9g20           MACH_ECUCORE_9G20       ECUCORE_9G20            2590
9942 +nautel_lpc3240         MACH_NAUTEL_LPC3240     NAUTEL_LPC3240          2591
9943 +glacier                        MACH_GLACIER            GLACIER                 2592
9944 +phrazer_bulldog                MACH_PHRAZER_BULLDOG    PHRAZER_BULLDOG         2593
9945 +omap3_bulldog          MACH_OMAP3_BULLDOG      OMAP3_BULLDOG           2594
9946 +pca101                 MACH_PCA101             PCA101                  2595
9947 +buzzc                  MACH_BUZZC              BUZZC                   2596
9948 +sasie2                 MACH_SASIE2             SASIE2                  2597
9949 +davinci_dm6467_cio     MACH_DAVINCI_CIO        DAVINCI_CIO             2598
9950 +smartmeter_dl          MACH_SMARTMETER_DL      SMARTMETER_DL           2599
9951 +wzl6410                        MACH_WZL6410            WZL6410                 2600
9952 +wzl6410m               MACH_WZL6410M           WZL6410M                2601
9953 +wzl6410f               MACH_WZL6410F           WZL6410F                2602
9954 +wzl6410i               MACH_WZL6410I           WZL6410I                2603
9955 +spacecom1              MACH_SPACECOM1          SPACECOM1               2604
9956 +pingu920               MACH_PINGU920           PINGU920                2605
9957 +bravoc                 MACH_BRAVOC             BRAVOC                  2606
9958 +cybo2440               MACH_CYBO2440           CYBO2440                2607
9959 +vdssw                  MACH_VDSSW              VDSSW                   2608
9960 +romulus                        MACH_ROMULUS            ROMULUS                 2609
9961 +omap_magic             MACH_OMAP_MAGIC         OMAP_MAGIC              2610
9962 +eltd100                        MACH_ELTD100            ELTD100                 2611
9963 +capc7117               MACH_CAPC7117           CAPC7117                2612
9964 +swan                   MACH_SWAN               SWAN                    2613
9965 +veu                    MACH_VEU                VEU                     2614
9966 +rm2                    MACH_RM2                RM2                     2615
9967 +tt2100                 MACH_TT2100             TT2100                  2616
9968 +venice                 MACH_VENICE             VENICE                  2617
9969 +pc7323                 MACH_PC7323             PC7323                  2618
9970 +masp                   MACH_MASP               MASP                    2619
9971 +fujitsu_tvstbsoc0      MACH_FUJITSU_TVSTBSOC   FUJITSU_TVSTBSOC        2620
9972 +fujitsu_tvstbsoc1      MACH_FUJITSU_TVSTBSOC1  FUJITSU_TVSTBSOC1       2621
9973 +lexikon                        MACH_LEXIKON            LEXIKON                 2622
9974 +mini2440v2             MACH_MINI2440V2         MINI2440V2              2623
9975 +icontrol               MACH_ICONTROL           ICONTROL                2624
9976 +sheevad                        MACH_SHEEVAD            SHEEVAD                 2625
9977 +qsd8x50a_st1_1         MACH_QSD8X50A_ST1_1     QSD8X50A_ST1_1          2626
9978 +qsd8x50a_st1_5         MACH_QSD8X50A_ST1_5     QSD8X50A_ST1_5          2627
9979 +bee                    MACH_BEE                BEE                     2628
9980 +mx23evk                        MACH_MX23EVK            MX23EVK                 2629
9981 +ap4evb                 MACH_AP4EVB             AP4EVB                  2630
9982 +stockholm              MACH_STOCKHOLM          STOCKHOLM               2631
9983 +lpc_h3131              MACH_LPC_H3131          LPC_H3131               2632
9984 +stingray               MACH_STINGRAY           STINGRAY                2633
9985 +kraken                 MACH_KRAKEN             KRAKEN                  2634
9986 +gw2388                 MACH_GW2388             GW2388                  2635
9987 +jadecpu                        MACH_JADECPU            JADECPU                 2636
9988 +carlisle               MACH_CARLISLE           CARLISLE                2637
9989 +lux_sf9                        MACH_LUX_SFT9           LUX_SFT9                2638
9990 +nemid_tb               MACH_NEMID_TB           NEMID_TB                2639
9991 +terrier                        MACH_TERRIER            TERRIER                 2640
9992 +turbot                 MACH_TURBOT             TURBOT                  2641
9993 +sanddab                        MACH_SANDDAB            SANDDAB                 2642
9994 +mx35_cicada            MACH_MX35_CICADA        MX35_CICADA             2643
9995 +ghi2703d               MACH_GHI2703D           GHI2703D                2644
9996 +lux_sfx9               MACH_LUX_SFX9           LUX_SFX9                2645
9997 +lux_sf9g               MACH_LUX_SF9G           LUX_SF9G                2646
9998 +lux_edk9               MACH_LUX_EDK9           LUX_EDK9                2647
9999 +hw90240                        MACH_HW90240            HW90240                 2648
10000 +dm365_leopard          MACH_DM365_LEOPARD      DM365_LEOPARD           2649
10001 +mityomapl138           MACH_MITYOMAPL138       MITYOMAPL138            2650
10002 +scat110                        MACH_SCAT110            SCAT110                 2651
10003 +acer_a1                        MACH_ACER_A1            ACER_A1                 2652
10004 +cmcontrol              MACH_CMCONTROL          CMCONTROL               2653
10005 +pelco_lamar            MACH_PELCO_LAMAR        PELCO_LAMAR             2654
10006 +rfp43                  MACH_RFP43              RFP43                   2655
10007 +sk86r0301              MACH_SK86R0301          SK86R0301               2656
10008 +ctpxa                  MACH_CTPXA              CTPXA                   2657
10009 +epb_arm9_a             MACH_EPB_ARM9_A         EPB_ARM9_A              2658
10010 +guruplug               MACH_GURUPLUG           GURUPLUG                2659
10011 +spear310               MACH_SPEAR310           SPEAR310                2660
10012 +spear320               MACH_SPEAR320           SPEAR320                2661
10013 +robotx                 MACH_ROBOTX             ROBOTX                  2662
10014 +lsxhl                  MACH_LSXHL              LSXHL                   2663
10015 +smartlite              MACH_SMARTLITE          SMARTLITE               2664
10016 +cws2                   MACH_CWS2               CWS2                    2665
10017 +m619                   MACH_M619               M619                    2666
10018 +smartview              MACH_SMARTVIEW          SMARTVIEW               2667
10019 +lsa_salsa              MACH_LSA_SALSA          LSA_SALSA               2668
10020 +kizbox                 MACH_KIZBOX             KIZBOX                  2669
10021 +htccharmer             MACH_HTCCHARMER         HTCCHARMER              2670
10022 +guf_neso_lt            MACH_GUF_NESO_LT        GUF_NESO_LT             2671
10023 +pm9g45                 MACH_PM9G45             PM9G45                  2672
10024 +htcpanther             MACH_HTCPANTHER         HTCPANTHER              2673
10025 +htcpanther_cdma                MACH_HTCPANTHER_CDMA    HTCPANTHER_CDMA         2674
10026 +reb01                  MACH_REB01              REB01                   2675
10027 +aquila                 MACH_AQUILA             AQUILA                  2676
10028 +spark_sls_hw2          MACH_SPARK_SLS_HW2      SPARK_SLS_HW2           2677
10029 +sheeva_esata           MACH_ESATA_SHEEVAPLUG   ESATA_SHEEVAPLUG        2678
10030 +msm7x30_surf           MACH_MSM7X30_SURF       MSM7X30_SURF            2679
10031 +micro2440              MACH_MICRO2440          MICRO2440               2680
10032 +am2440                 MACH_AM2440             AM2440                  2681
10033 +tq2440                 MACH_TQ2440             TQ2440                  2682
10034 +lpc2478oem             MACH_LPC2478OEM         LPC2478OEM              2683
10035 +ak880x                 MACH_AK880X             AK880X                  2684
10036 +cobra3530              MACH_COBRA3530          COBRA3530               2685
10037 +pmppb                  MACH_PMPPB              PMPPB                   2686
10038 +u6715                  MACH_U6715              U6715                   2687
10039 +axar1500_sender                MACH_AXAR1500_SENDER    AXAR1500_SENDER         2688
10040 +g30_dvb                        MACH_G30_DVB            G30_DVB                 2689
10041 +vc088x                 MACH_VC088X             VC088X                  2690
10042 +mioa702                        MACH_MIOA702            MIOA702                 2691
10043 +hpmin                  MACH_HPMIN              HPMIN                   2692
10044 +ak880xak               MACH_AK880XAK           AK880XAK                2693
10045 +arm926tomap850         MACH_ARM926TOMAP850     ARM926TOMAP850          2694
10046 +lkevm                  MACH_LKEVM              LKEVM                   2695
10047 +mw6410                 MACH_MW6410             MW6410                  2696
10048 +terastation_wxl                MACH_TERASTATION_WXL    TERASTATION_WXL         2697
10049 +cpu8000e               MACH_CPU8000E           CPU8000E                2698
10050 +catania                        MACH_CATANIA            CATANIA                 2699
10051 +tokyo                  MACH_TOKYO              TOKYO                   2700
10052 +msm7201a_surf          MACH_MSM7201A_SURF      MSM7201A_SURF           2701
10053 +msm7201a_ffa           MACH_MSM7201A_FFA       MSM7201A_FFA            2702
10054 +msm7x25_surf           MACH_MSM7X25_SURF       MSM7X25_SURF            2703
10055 +msm7x25_ffa            MACH_MSM7X25_FFA        MSM7X25_FFA             2704
10056 +msm7x27_surf           MACH_MSM7X27_SURF       MSM7X27_SURF            2705
10057 +msm7x27_ffa            MACH_MSM7X27_FFA        MSM7X27_FFA             2706
10058 +msm7x30_ffa            MACH_MSM7X30_FFA        MSM7X30_FFA             2707
10059 +qsd8x50_surf           MACH_QSD8X50_SURF       QSD8X50_SURF            2708
10060 +qsd8x50_comet          MACH_QSD8X50_COMET      QSD8X50_COMET           2709
10061 +qsd8x50_ffa            MACH_QSD8X50_FFA        QSD8X50_FFA             2710
10062 +qsd8x50a_surf          MACH_QSD8X50A_SURF      QSD8X50A_SURF           2711
10063 +qsd8x50a_ffa           MACH_QSD8X50A_FFA       QSD8X50A_FFA            2712
10064 +adx_xgcp10             MACH_ADX_XGCP10         ADX_XGCP10              2713
10065 +mcgwumts2a             MACH_MCGWUMTS2A         MCGWUMTS2A              2714
10066 +mobikt                 MACH_MOBIKT             MOBIKT                  2715
10067 +mx53_evk               MACH_MX53_EVK           MX53_EVK                2716
10068 +igep0030               MACH_IGEP0030           IGEP0030                2717
10069 +axell_h40_h50_ctrl     MACH_AXELL_H40_H50_CTRL AXELL_H40_H50_CTRL      2718
10070 +dtcommod               MACH_DTCOMMOD           DTCOMMOD                2719
10071 +gould                  MACH_GOULD              GOULD                   2720
10072 +siberia                        MACH_SIBERIA            SIBERIA                 2721
10073 +sbc3530                        MACH_SBC3530            SBC3530                 2722
10074 +qarm                   MACH_QARM               QARM                    2723
10075 +mips                   MACH_MIPS               MIPS                    2724
10076 +mx27grb                        MACH_MX27GRB            MX27GRB                 2725
10077 +sbc8100                        MACH_SBC8100            SBC8100                 2726
10078 +saarb                  MACH_SAARB              SAARB                   2727
10079 +omap3mini              MACH_OMAP3MINI          OMAP3MINI               2728
10080 +cnmbook7se             MACH_CNMBOOK7SE         CNMBOOK7SE              2729
10081 +catan                  MACH_CATAN              CATAN                   2730
10082 +harmony                        MACH_HARMONY            HARMONY                 2731
10083 +tonga                  MACH_TONGA              TONGA                   2732
10084 +cybook_orizon          MACH_CYBOOK_ORIZON      CYBOOK_ORIZON           2733
10085 +htcrhodiumcdma         MACH_HTCRHODIUMCDMA     HTCRHODIUMCDMA          2734
10086 +epc_g45                        MACH_EPC_G45            EPC_G45                 2735
10087 +epc_lpc3250            MACH_EPC_LPC3250        EPC_LPC3250             2736
10088 +mxc91341evb            MACH_MXC91341EVB        MXC91341EVB             2737
10089 +rtw1000                        MACH_RTW1000            RTW1000                 2738
10090 +bobcat                 MACH_BOBCAT             BOBCAT                  2739
10091 +trizeps6               MACH_TRIZEPS6           TRIZEPS6                2740
10092 +msm7x30_fluid          MACH_MSM7X30_FLUID      MSM7X30_FLUID           2741
10093 +nedap9263              MACH_NEDAP9263          NEDAP9263               2742
10094 +netgear_ms2110         MACH_NETGEAR_MS2110     NETGEAR_MS2110          2743
10095 +bmx                    MACH_BMX                BMX                     2744
10096 +netstream              MACH_NETSTREAM          NETSTREAM               2745
10097 +vpnext_rcu             MACH_VPNEXT_RCU         VPNEXT_RCU              2746
10098 +vpnext_mpu             MACH_VPNEXT_MPU         VPNEXT_MPU              2747
10099 +bcmring_tablet_v1      MACH_BCMRING_TABLET_V1  BCMRING_TABLET_V1       2748
10100 +sgarm10                        MACH_SGARM10            SGARM10                 2749
10101 +cm_t3517               MACH_CM_T3517           CM_T3517                2750
10102 +omap3_cps              MACH_OMAP3_CPS          OMAP3_CPS               2751
10103 +axar1500_receiver      MACH_AXAR1500_RECEIVER  AXAR1500_RECEIVER       2752
10104 +wbd222                 MACH_WBD222             WBD222                  2753
10105 +mt65xx                 MACH_MT65XX             MT65XX                  2754
10106 +msm8x60_surf           MACH_MSM8X60_SURF       MSM8X60_SURF            2755
10107 +msm8x60_sim            MACH_MSM8X60_SIM        MSM8X60_SIM             2756
10108 +vmc300                 MACH_VMC300             VMC300                  2757
10109 +tcc8000_sdk            MACH_TCC8000_SDK        TCC8000_SDK             2758
10110 +nanos                  MACH_NANOS              NANOS                   2759
10111 +stamp9g10              MACH_STAMP9G10          STAMP9G10               2760
10112 +stamp9g45              MACH_STAMP9G45          STAMP9G45               2761
10113 +h6053                  MACH_H6053              H6053                   2762
10114 +smint01                        MACH_SMINT01            SMINT01                 2763
10115 +prtlvt2                        MACH_PRTLVT2            PRTLVT2                 2764
10116 +ap420                  MACH_AP420              AP420                   2765
10117 +htcclio                        MACH_HTCSHIFT           HTCSHIFT                2766
10118 +davinci_dm365_fc       MACH_DAVINCI_DM365_FC   DAVINCI_DM365_FC        2767
10119 +msm8x55_surf           MACH_MSM8X55_SURF       MSM8X55_SURF            2768
10120 +msm8x55_ffa            MACH_MSM8X55_FFA        MSM8X55_FFA             2769
10121 +esl_vamana             MACH_ESL_VAMANA         ESL_VAMANA              2770
10122 +sbc35                  MACH_SBC35              SBC35                   2771
10123 +mpx6446                        MACH_MPX6446            MPX6446                 2772
10124 +oreo_controller                MACH_OREO_CONTROLLER    OREO_CONTROLLER         2773
10125 +kopin_models           MACH_KOPIN_MODELS       KOPIN_MODELS            2774
10126 +ttc_vision2            MACH_TTC_VISION2        TTC_VISION2             2775
10127 +cns3420vb              MACH_CNS3420VB          CNS3420VB               2776
10128 +lpc_evo                        MACH_LPC2               LPC2                    2777
10129 +olympus                        MACH_OLYMPUS            OLYMPUS                 2778
10130 +vortex                 MACH_VORTEX             VORTEX                  2779
10131 +s5pc200                        MACH_S5PC200            S5PC200                 2780
10132 +ecucore_9263           MACH_ECUCORE_9263       ECUCORE_9263            2781
10133 +smdkc200               MACH_SMDKC200           SMDKC200                2782
10134 +emsiso_sx27            MACH_EMSISO_SX27        EMSISO_SX27             2783
10135 +apx_som9g45_ek         MACH_APX_SOM9G45_EK     APX_SOM9G45_EK          2784
10136 +songshan               MACH_SONGSHAN           SONGSHAN                2785
10137 +tianshan               MACH_TIANSHAN           TIANSHAN                2786
10138 +vpx500                 MACH_VPX500             VPX500                  2787
10139 +am3517sam              MACH_AM3517SAM          AM3517SAM               2788
10140 +skat91_sim508          MACH_SKAT91_SIM508      SKAT91_SIM508           2789
10141 +skat91_s3e             MACH_SKAT91_S3E         SKAT91_S3E              2790
10142 +omap4_panda            MACH_OMAP4_PANDA        OMAP4_PANDA             2791
10143 +df7220                 MACH_DF7220             DF7220                  2792
10144 +nemini                 MACH_NEMINI             NEMINI                  2793
10145 +t8200                  MACH_T8200              T8200                   2794
10146 +apf51                  MACH_APF51              APF51                   2795
10147 +dr_rc_unit             MACH_DR_RC_UNIT         DR_RC_UNIT              2796
10148 +bordeaux               MACH_BORDEAUX           BORDEAUX                2797
10149 +catania_b              MACH_CATANIA_B          CATANIA_B               2798
10150 +mx51_ocean             MACH_MX51_OCEAN         MX51_OCEAN              2799
10151 +ti8168evm              MACH_TI8168EVM          TI8168EVM               2800
10152 +neocoreomap            MACH_NEOCOREOMAP        NEOCOREOMAP             2801
10153 +withings_wbp           MACH_WITHINGS_WBP       WITHINGS_WBP            2802
10154 +dbps                   MACH_DBPS               DBPS                    2803
10155 +at91sam9261            MACH_SBC9261            SBC9261                 2804
10156 +pcbfp0001              MACH_PCBFP0001          PCBFP0001               2805
10157 +speedy                 MACH_SPEEDY             SPEEDY                  2806
10158 +chrysaor               MACH_CHRYSAOR           CHRYSAOR                2807
10159 +tango                  MACH_TANGO              TANGO                   2808
10160 +synology_dsx11         MACH_SYNOLOGY_DSX11     SYNOLOGY_DSX11          2809
10161 +hanlin_v3ext           MACH_HANLIN_V3EXT       HANLIN_V3EXT            2810
10162 +hanlin_v5              MACH_HANLIN_V5          HANLIN_V5               2811
10163 +hanlin_v3plus          MACH_HANLIN_V3PLUS      HANLIN_V3PLUS           2812
10164 +iriver_story           MACH_IRIVER_STORY       IRIVER_STORY            2813
10165 +irex_iliad             MACH_IREX_ILIAD         IREX_ILIAD              2814
10166 +irex_dr1000            MACH_IREX_DR1000        IREX_DR1000             2815
10167 +teton_bga              MACH_TETON_BGA          TETON_BGA               2816
10168 +snapper9g45            MACH_SNAPPER9G45        SNAPPER9G45             2817
10169 +tam3517                        MACH_TAM3517            TAM3517                 2818
10170 +pdc100                 MACH_PDC100             PDC100                  2819
10171 +eukrea_cpuimx25sd      MACH_EUKREA_CPUIMX25    EUKREA_CPUIMX25         2820
10172 +eukrea_cpuimx35sd      MACH_EUKREA_CPUIMX35    EUKREA_CPUIMX35         2821
10173 +eukrea_cpuimx51sd      MACH_EUKREA_CPUIMX51SD  EUKREA_CPUIMX51SD       2822
10174 +eukrea_cpuimx51                MACH_EUKREA_CPUIMX51    EUKREA_CPUIMX51         2823
10175 +p565                   MACH_P565               P565                    2824
10176 +acer_a4                        MACH_ACER_A4            ACER_A4                 2825
10177 +davinci_dm368_bip      MACH_DAVINCI_DM368_BIP  DAVINCI_DM368_BIP       2826
10178 +eshare                 MACH_ESHARE             ESHARE                  2827
10179 +hw_omapl138_europa     MACH_HW_OMAPL138_EUROPA HW_OMAPL138_EUROPA      2828
10180 +wlbargn                        MACH_WLBARGN            WLBARGN                 2829
10181 +bm170                  MACH_BM170              BM170                   2830
10182 +netspace_mini_v2       MACH_NETSPACE_MINI_V2   NETSPACE_MINI_V2        2831
10183 +netspace_plug_v2       MACH_NETSPACE_PLUG_V2   NETSPACE_PLUG_V2        2832
10184 +siemens_l1             MACH_SIEMENS_L1         SIEMENS_L1              2833
10185 +elv_lcu1               MACH_ELV_LCU1           ELV_LCU1                2834
10186 +mcu1                   MACH_MCU1               MCU1                    2835
10187 +omap3_tao3530          MACH_OMAP3_TAO3530      OMAP3_TAO3530           2836
10188 +omap3_pcutouch         MACH_OMAP3_PCUTOUCH     OMAP3_PCUTOUCH          2837
10189 +smdkc210               MACH_SMDKC210           SMDKC210                2838
10190 +omap3_braillo          MACH_OMAP3_BRAILLO      OMAP3_BRAILLO           2839
10191 +spyplug                        MACH_SPYPLUG            SPYPLUG                 2840
10192 +ginger                 MACH_GINGER             GINGER                  2841
10193 +tny_t3530              MACH_TNY_T3530          TNY_T3530               2842
10194 +pca102                 MACH_PCA102             PCA102                  2843
10195 +spade                  MACH_SPADE              SPADE                   2844
10196 +mxc25_topaz            MACH_MXC25_TOPAZ        MXC25_TOPAZ             2845
10197 +t5325                  MACH_T5325              T5325                   2846
10198 +gw2361                 MACH_GW2361             GW2361                  2847
10199 +elog                   MACH_ELOG               ELOG                    2848
10200 +income                 MACH_INCOME             INCOME                  2849
10201 +bcm589x                        MACH_BCM589X            BCM589X                 2850
10202 +etna                   MACH_ETNA               ETNA                    2851
10203 +hawks                  MACH_HAWKS              HAWKS                   2852
10204 +meson                  MACH_MESON              MESON                   2853
10205 +xsbase255              MACH_XSBASE255          XSBASE255               2854
10206 +pvm2030                        MACH_PVM2030            PVM2030                 2855
10207 +mioa502                        MACH_MIOA502            MIOA502                 2856
10208 +vvbox_sdorig2          MACH_VVBOX_SDORIG2      VVBOX_SDORIG2           2857
10209 +vvbox_sdlite2          MACH_VVBOX_SDLITE2      VVBOX_SDLITE2           2858
10210 +vvbox_sdpro4           MACH_VVBOX_SDPRO4       VVBOX_SDPRO4            2859
10211 +htc_spv_m700           MACH_HTC_SPV_M700       HTC_SPV_M700            2860
10212 +mx257sx                        MACH_MX257SX            MX257SX                 2861
10213 +goni                   MACH_GONI               GONI                    2862
10214 +msm8x55_svlte_ffa      MACH_MSM8X55_SVLTE_FFA  MSM8X55_SVLTE_FFA       2863
10215 +msm8x55_svlte_surf     MACH_MSM8X55_SVLTE_SURF MSM8X55_SVLTE_SURF      2864
10216 +quickstep              MACH_QUICKSTEP          QUICKSTEP               2865
10217 +dmw96                  MACH_DMW96              DMW96                   2866
10218 +hammerhead             MACH_HAMMERHEAD         HAMMERHEAD              2867
10219 +trident                        MACH_TRIDENT            TRIDENT                 2868
10220 +lightning              MACH_LIGHTNING          LIGHTNING               2869
10221 +iconnect               MACH_ICONNECT           ICONNECT                2870
10222 +autobot                        MACH_AUTOBOT            AUTOBOT                 2871
10223 +coconut                        MACH_COCONUT            COCONUT                 2872
10224 +durian                 MACH_DURIAN             DURIAN                  2873
10225 +cayenne                        MACH_CAYENNE            CAYENNE                 2874
10226 +fuji                   MACH_FUJI               FUJI                    2875
10227 +synology_6282          MACH_SYNOLOGY_6282      SYNOLOGY_6282           2876
10228 +em1sy                  MACH_EM1SY              EM1SY                   2877
10229 +m502                   MACH_M502               M502                    2878
10230 +matrix518              MACH_MATRIX518          MATRIX518               2879
10231 +tiny_gurnard           MACH_TINY_GURNARD       TINY_GURNARD            2880
10232 +spear1310              MACH_SPEAR1310          SPEAR1310               2881
10233 +bv07                   MACH_BV07               BV07                    2882
10234 +mxt_td61               MACH_MXT_TD61           MXT_TD61                2883
10235 +openrd_ultimate                MACH_OPENRD_ULTIMATE    OPENRD_ULTIMATE         2884
10236 +devixp                 MACH_DEVIXP             DEVIXP                  2885
10237 +miccpt                 MACH_MICCPT             MICCPT                  2886
10238 +mic256                 MACH_MIC256             MIC256                  2887
10239 +as1167                 MACH_AS1167             AS1167                  2888
10240 +omap3_ibiza            MACH_OMAP3_IBIZA        OMAP3_IBIZA             2889
10241 +u5500                  MACH_U5500              U5500                   2890
10242 +davinci_picto          MACH_DAVINCI_PICTO      DAVINCI_PICTO           2891
10243 +mecha                  MACH_MECHA              MECHA                   2892
10244 +bubba3                 MACH_BUBBA3             BUBBA3                  2893
10245 +pupitre                        MACH_PUPITRE            PUPITRE                 2894
10246 +tegra_harmony          MACH_TEGRA_HARMONY      TEGRA_HARMONY           2895
10247 +tegra_vogue            MACH_TEGRA_VOGUE        TEGRA_VOGUE             2896
10248 +tegra_e1165            MACH_TEGRA_E1165        TEGRA_E1165             2897
10249 +simplenet              MACH_SIMPLENET          SIMPLENET               2898
10250 +ec4350tbm              MACH_EC4350TBM          EC4350TBM               2899
10251 +pec_tc                 MACH_PEC_TC             PEC_TC                  2900
10252 +pec_hc2                        MACH_PEC_HC2            PEC_HC2                 2901
10253 +esl_mobilis_a          MACH_ESL_MOBILIS_A      ESL_MOBILIS_A           2902
10254 +esl_mobilis_b          MACH_ESL_MOBILIS_B      ESL_MOBILIS_B           2903
10255 +esl_wave_a             MACH_ESL_WAVE_A         ESL_WAVE_A              2904
10256 +esl_wave_b             MACH_ESL_WAVE_B         ESL_WAVE_B              2905
10257 +unisense_mmm           MACH_UNISENSE_MMM       UNISENSE_MMM            2906
10258 +blueshark              MACH_BLUESHARK          BLUESHARK               2907
10259 +e10                    MACH_E10                E10                     2908
10260 --- a/arch/arm/include/asm/thread_info.h
10261 +++ b/arch/arm/include/asm/thread_info.h
10262 @@ -115,7 +115,8 @@ extern void iwmmxt_task_restore(struct t
10263  extern void iwmmxt_task_release(struct thread_info *);
10264  extern void iwmmxt_task_switch(struct thread_info *);
10265  
10266 -extern void vfp_sync_state(struct thread_info *thread);
10267 +extern void vfp_sync_hwstate(struct thread_info *);
10268 +extern void vfp_flush_hwstate(struct thread_info *);
10269  
10270  #endif
10271  
10272 --- a/arch/arm/kernel/ptrace.c
10273 +++ b/arch/arm/kernel/ptrace.c
10274 @@ -663,7 +663,7 @@ static int ptrace_getvfpregs(struct task
10275         union vfp_state *vfp = &thread->vfpstate;
10276         struct user_vfp __user *ufp = data;
10277  
10278 -       vfp_sync_state(thread);
10279 +       vfp_sync_hwstate(thread);
10280  
10281         /* copy the floating point registers */
10282         if (copy_to_user(&ufp->fpregs, &vfp->hard.fpregs,
10283 @@ -686,7 +686,7 @@ static int ptrace_setvfpregs(struct task
10284         union vfp_state *vfp = &thread->vfpstate;
10285         struct user_vfp __user *ufp = data;
10286  
10287 -       vfp_sync_state(thread);
10288 +       vfp_sync_hwstate(thread);
10289  
10290         /* copy the floating point registers */
10291         if (copy_from_user(&vfp->hard.fpregs, &ufp->fpregs,
10292 @@ -697,6 +697,8 @@ static int ptrace_setvfpregs(struct task
10293         if (get_user(vfp->hard.fpscr, &ufp->fpscr))
10294                 return -EFAULT;
10295  
10296 +       vfp_flush_hwstate(thread);
10297 +
10298         return 0;
10299  }
10300  #endif
10301 --- a/arch/arm/vfp/entry.S
10302 +++ b/arch/arm/vfp/entry.S
10303 @@ -42,6 +42,7 @@ ENTRY(vfp_null_entry)
10304         mov     pc, lr
10305  ENDPROC(vfp_null_entry)
10306  
10307 +       .align  2
10308  .LCvfp:
10309         .word   vfp_vector
10310  
10311 @@ -61,6 +62,7 @@ ENTRY(vfp_testing_entry)
10312         mov     pc, r9                  @ we have handled the fault
10313  ENDPROC(vfp_testing_entry)
10314  
10315 +       .align  2
10316  VFP_arch_address:
10317         .word   VFP_arch
10318  
10319 --- a/arch/arm/vfp/vfphw.S
10320 +++ b/arch/arm/vfp/vfphw.S
10321 @@ -209,40 +209,55 @@ ENDPROC(vfp_save_state)
10322  last_VFP_context_address:
10323         .word   last_VFP_context
10324  
10325 -ENTRY(vfp_get_float)
10326 -       add     pc, pc, r0, lsl #3
10327 +       .macro  tbl_branch, base, tmp, shift
10328 +#ifdef CONFIG_THUMB2_KERNEL
10329 +       adr     \tmp, 1f
10330 +       add     \tmp, \tmp, \base, lsl \shift
10331 +       mov     pc, \tmp
10332 +#else
10333 +       add     pc, pc, \base, lsl \shift
10334         mov     r0, r0
10335 +#endif
10336 +1:
10337 +       .endm
10338 +
10339 +ENTRY(vfp_get_float)
10340 +       tbl_branch r0, r3, #3
10341         .irp    dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
10342 -       mrc     p10, 0, r0, c\dr, c0, 0 @ fmrs  r0, s0
10343 +1:     mrc     p10, 0, r0, c\dr, c0, 0 @ fmrs  r0, s0
10344         mov     pc, lr
10345 -       mrc     p10, 0, r0, c\dr, c0, 4 @ fmrs  r0, s1
10346 +       .org    1b + 8
10347 +1:     mrc     p10, 0, r0, c\dr, c0, 4 @ fmrs  r0, s1
10348         mov     pc, lr
10349 +       .org    1b + 8
10350         .endr
10351  ENDPROC(vfp_get_float)
10352  
10353  ENTRY(vfp_put_float)
10354 -       add     pc, pc, r1, lsl #3
10355 -       mov     r0, r0
10356 +       tbl_branch r1, r3, #3
10357         .irp    dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
10358 -       mcr     p10, 0, r0, c\dr, c0, 0 @ fmsr  r0, s0
10359 +1:     mcr     p10, 0, r0, c\dr, c0, 0 @ fmsr  r0, s0
10360         mov     pc, lr
10361 -       mcr     p10, 0, r0, c\dr, c0, 4 @ fmsr  r0, s1
10362 +       .org    1b + 8
10363 +1:     mcr     p10, 0, r0, c\dr, c0, 4 @ fmsr  r0, s1
10364         mov     pc, lr
10365 +       .org    1b + 8
10366         .endr
10367  ENDPROC(vfp_put_float)
10368  
10369  ENTRY(vfp_get_double)
10370 -       add     pc, pc, r0, lsl #3
10371 -       mov     r0, r0
10372 +       tbl_branch r0, r3, #3
10373         .irp    dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
10374 -       fmrrd   r0, r1, d\dr
10375 +1:     fmrrd   r0, r1, d\dr
10376         mov     pc, lr
10377 +       .org    1b + 8
10378         .endr
10379  #ifdef CONFIG_VFPv3
10380         @ d16 - d31 registers
10381         .irp    dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
10382 -       mrrc    p11, 3, r0, r1, c\dr    @ fmrrd r0, r1, d\dr
10383 +1:     mrrc    p11, 3, r0, r1, c\dr    @ fmrrd r0, r1, d\dr
10384         mov     pc, lr
10385 +       .org    1b + 8
10386         .endr
10387  #endif
10388  
10389 @@ -253,17 +268,18 @@ ENTRY(vfp_get_double)
10390  ENDPROC(vfp_get_double)
10391  
10392  ENTRY(vfp_put_double)
10393 -       add     pc, pc, r2, lsl #3
10394 -       mov     r0, r0
10395 +       tbl_branch r2, r3, #3
10396         .irp    dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
10397 -       fmdrr   d\dr, r0, r1
10398 +1:     fmdrr   d\dr, r0, r1
10399         mov     pc, lr
10400 +       .org    1b + 8
10401         .endr
10402  #ifdef CONFIG_VFPv3
10403         @ d16 - d31 registers
10404         .irp    dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
10405 -       mcrr    p11, 3, r1, r2, c\dr    @ fmdrr r1, r2, d\dr
10406 +1:     mcrr    p11, 3, r0, r1, c\dr    @ fmdrr r0, r1, d\dr
10407         mov     pc, lr
10408 +       .org    1b + 8
10409         .endr
10410  #endif
10411  ENDPROC(vfp_put_double)
10412 --- a/arch/arm/vfp/vfpmodule.c
10413 +++ b/arch/arm/vfp/vfpmodule.c
10414 @@ -38,16 +38,75 @@ union vfp_state *last_VFP_context[NR_CPU
10415   */
10416  unsigned int VFP_arch;
10417  
10418 +/*
10419 + * Per-thread VFP initialization.
10420 + */
10421 +static void vfp_thread_flush(struct thread_info *thread)
10422 +{
10423 +       union vfp_state *vfp = &thread->vfpstate;
10424 +       unsigned int cpu;
10425 +
10426 +       memset(vfp, 0, sizeof(union vfp_state));
10427 +
10428 +       vfp->hard.fpexc = FPEXC_EN;
10429 +       vfp->hard.fpscr = FPSCR_ROUND_NEAREST;
10430 +
10431 +       /*
10432 +        * Disable VFP to ensure we initialize it first.  We must ensure
10433 +        * that the modification of last_VFP_context[] and hardware disable
10434 +        * are done for the same CPU and without preemption.
10435 +        */
10436 +       cpu = get_cpu();
10437 +       if (last_VFP_context[cpu] == vfp)
10438 +               last_VFP_context[cpu] = NULL;
10439 +       fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN);
10440 +       put_cpu();
10441 +}
10442 +
10443 +static void vfp_thread_exit(struct thread_info *thread)
10444 +{
10445 +       /* release case: Per-thread VFP cleanup. */
10446 +       union vfp_state *vfp = &thread->vfpstate;
10447 +       unsigned int cpu = get_cpu();
10448 +
10449 +       if (last_VFP_context[cpu] == vfp)
10450 +               last_VFP_context[cpu] = NULL;
10451 +       put_cpu();
10452 +}
10453 +
10454 +/*
10455 + * When this function is called with the following 'cmd's, the following
10456 + * is true while this function is being run:
10457 + *  THREAD_NOFTIFY_SWTICH:
10458 + *   - the previously running thread will not be scheduled onto another CPU.
10459 + *   - the next thread to be run (v) will not be running on another CPU.
10460 + *   - thread->cpu is the local CPU number
10461 + *   - not preemptible as we're called in the middle of a thread switch
10462 + *  THREAD_NOTIFY_FLUSH:
10463 + *   - the thread (v) will be running on the local CPU, so
10464 + *     v === current_thread_info()
10465 + *   - thread->cpu is the local CPU number at the time it is accessed,
10466 + *     but may change at any time.
10467 + *   - we could be preempted if tree preempt rcu is enabled, so
10468 + *     it is unsafe to use thread->cpu.
10469 + *  THREAD_NOTIFY_EXIT
10470 + *   - the thread (v) will be running on the local CPU, so
10471 + *     v === current_thread_info()
10472 + *   - thread->cpu is the local CPU number at the time it is accessed,
10473 + *     but may change at any time.
10474 + *   - we could be preempted if tree preempt rcu is enabled, so
10475 + *     it is unsafe to use thread->cpu.
10476 + */
10477  static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v)
10478  {
10479         struct thread_info *thread = v;
10480 -       union vfp_state *vfp;
10481 -       __u32 cpu = thread->cpu;
10482  
10483         if (likely(cmd == THREAD_NOTIFY_SWITCH)) {
10484                 u32 fpexc = fmrx(FPEXC);
10485  
10486  #ifdef CONFIG_SMP
10487 +               unsigned int cpu = thread->cpu;
10488 +
10489                 /*
10490                  * On SMP, if VFP is enabled, save the old state in
10491                  * case the thread migrates to a different CPU. The
10492 @@ -74,25 +133,10 @@ static int vfp_notifier(struct notifier_
10493                 return NOTIFY_DONE;
10494         }
10495  
10496 -       vfp = &thread->vfpstate;
10497 -       if (cmd == THREAD_NOTIFY_FLUSH) {
10498 -               /*
10499 -                * Per-thread VFP initialisation.
10500 -                */
10501 -               memset(vfp, 0, sizeof(union vfp_state));
10502 -
10503 -               vfp->hard.fpexc = FPEXC_EN;
10504 -               vfp->hard.fpscr = FPSCR_ROUND_NEAREST;
10505 -
10506 -               /*
10507 -                * Disable VFP to ensure we initialise it first.
10508 -                */
10509 -               fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN);
10510 -       }
10511 -
10512 -       /* flush and release case: Per-thread VFP cleanup. */
10513 -       if (last_VFP_context[cpu] == vfp)
10514 -               last_VFP_context[cpu] = NULL;
10515 +       if (cmd == THREAD_NOTIFY_FLUSH)
10516 +               vfp_thread_flush(thread);
10517 +       else
10518 +               vfp_thread_exit(thread);
10519  
10520         return NOTIFY_DONE;
10521  }
10522 @@ -153,10 +197,13 @@ static void vfp_raise_exceptions(u32 exc
10523         }
10524  
10525         /*
10526 -        * Update the FPSCR with the additional exception flags.
10527 +        * If any of the status flags are set, update the FPSCR.
10528          * Comparison instructions always return at least one of
10529          * these flags set.
10530          */
10531 +       if (exceptions & (FPSCR_N|FPSCR_Z|FPSCR_C|FPSCR_V))
10532 +               fpscr &= ~(FPSCR_N|FPSCR_Z|FPSCR_C|FPSCR_V);
10533 +
10534         fpscr |= exceptions;
10535  
10536         fmxr(FPSCR, fpscr);
10537 @@ -381,54 +428,60 @@ static void vfp_pm_init(void)
10538  static inline void vfp_pm_init(void) { }
10539  #endif /* CONFIG_PM */
10540  
10541 -/*
10542 - * Synchronise the hardware VFP state of a thread other than current with the
10543 - * saved one. This function is used by the ptrace mechanism.
10544 - */
10545 -#ifdef CONFIG_SMP
10546 -void vfp_sync_state(struct thread_info *thread)
10547 +void vfp_sync_hwstate(struct thread_info *thread)
10548  {
10549 +       unsigned int cpu = get_cpu();
10550 +
10551         /*
10552 -        * On SMP systems, the VFP state is automatically saved at every
10553 -        * context switch. We mark the thread VFP state as belonging to a
10554 -        * non-existent CPU so that the saved one will be reloaded when
10555 -        * needed.
10556 +        * If the thread we're interested in is the current owner of the
10557 +        * hardware VFP state, then we need to save its state.
10558          */
10559 -       thread->vfpstate.hard.cpu = NR_CPUS;
10560 +       if (last_VFP_context[cpu] == &thread->vfpstate) {
10561 +               u32 fpexc = fmrx(FPEXC);
10562 +
10563 +               /*
10564 +                * Save the last VFP state on this CPU.
10565 +                */
10566 +               fmxr(FPEXC, fpexc | FPEXC_EN);
10567 +               vfp_save_state(&thread->vfpstate, fpexc | FPEXC_EN);
10568 +               fmxr(FPEXC, fpexc);
10569 +       }
10570 +
10571 +       put_cpu();
10572  }
10573 -#else
10574 -void vfp_sync_state(struct thread_info *thread)
10575 +
10576 +void vfp_flush_hwstate(struct thread_info *thread)
10577  {
10578         unsigned int cpu = get_cpu();
10579 -       u32 fpexc = fmrx(FPEXC);
10580  
10581         /*
10582 -        * If VFP is enabled, the previous state was already saved and
10583 -        * last_VFP_context updated.
10584 +        * If the thread we're interested in is the current owner of the
10585 +        * hardware VFP state, then we need to save its state.
10586          */
10587 -       if (fpexc & FPEXC_EN)
10588 -               goto out;
10589 +       if (last_VFP_context[cpu] == &thread->vfpstate) {
10590 +               u32 fpexc = fmrx(FPEXC);
10591  
10592 -       if (!last_VFP_context[cpu])
10593 -               goto out;
10594 +               fmxr(FPEXC, fpexc & ~FPEXC_EN);
10595  
10596 -       /*
10597 -        * Save the last VFP state on this CPU.
10598 -        */
10599 -       fmxr(FPEXC, fpexc | FPEXC_EN);
10600 -       vfp_save_state(last_VFP_context[cpu], fpexc);
10601 -       fmxr(FPEXC, fpexc);
10602 +               /*
10603 +                * Set the context to NULL to force a reload the next time
10604 +                * the thread uses the VFP.
10605 +                */
10606 +               last_VFP_context[cpu] = NULL;
10607 +       }
10608  
10609 +#ifdef CONFIG_SMP
10610         /*
10611 -        * Set the context to NULL to force a reload the next time the thread
10612 -        * uses the VFP.
10613 +        * For SMP we still have to take care of the case where the thread
10614 +        * migrates to another CPU and then back to the original CPU on which
10615 +        * the last VFP user is still the same thread. Mark the thread VFP
10616 +        * state as belonging to a non-existent CPU so that the saved one will
10617 +        * be reloaded in the above case.
10618          */
10619 -       last_VFP_context[cpu] = NULL;
10620 -
10621 -out:
10622 +       thread->vfpstate.hard.cpu = NR_CPUS;
10623 +#endif
10624         put_cpu();
10625  }
10626 -#endif
10627  
10628  #include <linux/smp.h>
10629  
10630 @@ -481,7 +534,7 @@ static int __init vfp_init(void)
10631                  */
10632                 elf_hwcap |= HWCAP_VFP;
10633  #ifdef CONFIG_VFPv3
10634 -               if (VFP_arch >= 3) {
10635 +               if (VFP_arch >= 2) {
10636                         elf_hwcap |= HWCAP_VFPv3;
10637  
10638                         /*
10639 --- /dev/null
10640 +++ b/arch/arm/mach-cns3xxx/pcie.c
10641 @@ -0,0 +1,360 @@
10642 +/*******************************************************************************
10643 + *
10644 + *  Copyright (c) 2008 Cavium Networks 
10645 + * 
10646 + *  This file is free software; you can redistribute it and/or modify 
10647 + *  it under the terms of the GNU General Public License, Version 2, as 
10648 + *  published by the Free Software Foundation. 
10649 + *
10650 + *  This file is distributed in the hope that it will be useful, 
10651 + *  but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of 
10652 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 
10653 + *  NONINFRINGEMENT.  See the GNU General Public License for more details. 
10654 + *
10655 + *  You should have received a copy of the GNU General Public License 
10656 + *  along with this file; if not, write to the Free Software 
10657 + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or 
10658 + *  visit http://www.gnu.org/licenses/. 
10659 + *
10660 + *  This file may also be available under a different license from Cavium. 
10661 + *  Contact Cavium Networks for more information
10662 + *
10663 + ******************************************************************************/
10664 +
10665 +#include <linux/kernel.h>
10666 +#include <linux/pci.h>
10667 +#include <linux/ptrace.h>
10668 +#include <linux/slab.h>
10669 +#include <linux/ioport.h>
10670 +#include <linux/interrupt.h>
10671 +#include <linux/spinlock.h>
10672 +#include <linux/init.h>
10673 +
10674 +#include <mach/hardware.h>
10675 +#include <asm/io.h>
10676 +#include <asm/irq.h>
10677 +#include <asm/system.h>
10678 +#include <asm/mach/pci.h>
10679 +#include <mach/pcie.h>
10680 +#include <linux/proc_fs.h>
10681 +#include <linux/delay.h>
10682 +#include <asm/uaccess.h>
10683 +#include <mach/pm.h>
10684 +
10685 +DEFINE_SPINLOCK(pci_config_lock);
10686 +
10687 +static int pcie_linked[2] = {0, 0};    // if 1, mean link ok. 
10688 +
10689 +u32 cns3xxx_pcie0_irqs[2] = { IRQ_CNS3XXX_PCIE0_RC, IRQ_CNS3XXX_PCIE0_DEVICE,  };
10690 +u32 cns3xxx_pcie1_irqs[2] = { IRQ_CNS3XXX_PCIE1_RC, IRQ_CNS3XXX_PCIE1_DEVICE,  };
10691 +
10692 +static u32 access_base[2][3] = { 
10693 +       { CNS3XXX_PCIE0_HOST_BASE_VIRT, CNS3XXX_PCIE0_CFG0_BASE_VIRT, CNS3XXX_PCIE0_CFG1_BASE_VIRT},
10694 +       { CNS3XXX_PCIE1_HOST_BASE_VIRT, CNS3XXX_PCIE1_CFG0_BASE_VIRT, CNS3XXX_PCIE1_CFG1_BASE_VIRT},
10695 +};
10696 +
10697 +static int cns3xxx_pci_cfg_base(struct pci_bus *bus,
10698 +                                        unsigned int devfn, int where)
10699 +{
10700 +       int domain = pci_domain_nr(bus);
10701 +       int slot = PCI_SLOT(devfn);     
10702 +       u32 base;
10703 +
10704 +       if ((!pcie_linked[domain]) && (bus->number || slot))
10705 +               return 0;
10706 +
10707 +       if (!(bus->number)) {
10708 +               if (slot > 1)
10709 +                       return 0;
10710 +               // CFG0 Type
10711 +               base = access_base[domain][slot];
10712 +       } else {
10713 +               // CFG1 Type
10714 +               base = access_base[domain][2];
10715 +       }
10716 +       base += (((bus->number & 0xf) << 20)| (devfn << 12) | (where & 0xfc));
10717 +       return base;
10718 +}
10719 +
10720 +static int cns3xxx_pci_read_config(struct pci_bus *bus,
10721 +                                  unsigned int devfn, int where, int size,
10722 +                                  u32 * val)
10723 +{
10724 +       u32 v = 0xffffffff;
10725 +       u32 base;
10726 +       u32 mask = (0x1ull << (size * 8)) - 1;
10727 +       int shift = (where % 4) * 8;    
10728 +
10729 +       base = cns3xxx_pci_cfg_base(bus, devfn, where);
10730 +       if (!base) {
10731 +               *val = 0xFFFFFFFF;
10732 +               return PCIBIOS_SUCCESSFUL;
10733 +       }
10734 +
10735 +       v = __raw_readl(base);
10736 +       if (bus->number == 0 && devfn == 0 &&
10737 +                       (where & 0xffc) == PCI_CLASS_REVISION) {
10738 +       /* RC's class is 0xb, but Linux PCI driver needs 0x604 for a PCIe bridge. */
10739 +               /* So we must dedicate the class code to 0x604 here */
10740 +               v &= 0xff;
10741 +               v |= (0x604 << 16);                 
10742 +       } 
10743 +
10744 +       *val = (v >> shift) & mask;
10745 +       return PCIBIOS_SUCCESSFUL;
10746 +}
10747 +
10748 +static int cns3xxx_pci_write_config(struct pci_bus *bus,
10749 +                                   unsigned int devfn, int where, int size,
10750 +                                   u32 val)
10751 +{
10752 +       u32 v;
10753 +       u32 base;
10754 +       u32 mask = (0x1ull << (size * 8)) - 1;
10755 +       int shift = (where % 4) * 8;    
10756 +
10757 +       base = cns3xxx_pci_cfg_base(bus, devfn, where);
10758 +       if (!base)
10759 +               return PCIBIOS_SUCCESSFUL;
10760 +       
10761 +       v = __raw_readl(base);
10762 +       v &= ~(mask << shift);
10763 +       v |= (val & mask) << shift;
10764 +       __raw_writel(v, base);
10765 +
10766 +       return PCIBIOS_SUCCESSFUL;
10767 +}
10768 +
10769 +static struct pci_ops cns3xxx_pcie_ops = {
10770 +       .read = cns3xxx_pci_read_config,
10771 +       .write = cns3xxx_pci_write_config,
10772 +};
10773 +
10774 +static struct resource cns3xxx_pcie0_io = {
10775 +       .name = "PCIe0 I/O space",
10776 +       .start = PCIE0_IO_SPACE_START,
10777 +       .end = PCIE0_IO_SPACE_END,
10778 +       .flags = IORESOURCE_IO,
10779 +};
10780 +
10781 +static struct resource cns3xxx_pcie1_io = {
10782 +       .name = "PCIe1 I/O space",
10783 +       .start = PCIE1_IO_SPACE_START,
10784 +       .end = PCIE1_IO_SPACE_END,
10785 +       .flags = IORESOURCE_IO,
10786 +};
10787 +
10788 +static struct resource cns3xxx_pcie0_mem = {
10789 +       .name = "PCIe0 non-prefetchable",
10790 +       .start = PCIE0_MEM_SPACE_START,
10791 +       .end = PCIE0_MEM_SPACE_END,
10792 +       .flags = IORESOURCE_MEM,
10793 +};
10794 +
10795 +static struct resource cns3xxx_pcie1_mem = {
10796 +       .name = "PCIe1 non-prefetchable",
10797 +       .start = PCIE1_MEM_SPACE_START,
10798 +       .end = PCIE1_MEM_SPACE_END,
10799 +       .flags = IORESOURCE_MEM,
10800 +};
10801 +
10802 +static int __init cns3xxx_pci_setup_resources(int nr, struct resource **resource)
10803 +{
10804 +       if(nr==0){
10805 +               BUG_ON(request_resource(&iomem_resource, &cns3xxx_pcie0_io) ||
10806 +                                        request_resource(&iomem_resource, &cns3xxx_pcie0_mem));
10807 +               resource[0] = &cns3xxx_pcie0_io;
10808 +               resource[1] = &cns3xxx_pcie0_mem;
10809 +       }else{
10810 +               BUG_ON(request_resource(&iomem_resource, &cns3xxx_pcie1_io) ||
10811 +                                        request_resource(&iomem_resource, &cns3xxx_pcie1_mem));
10812 +               resource[0] = &cns3xxx_pcie1_io;
10813 +               resource[1] = &cns3xxx_pcie1_mem;
10814 +       }
10815 +       return 0;
10816 +}
10817 +
10818 +int __init cns3xxx_pci_setup(int nr, struct pci_sys_data *sys)
10819 +{
10820 +       BUG_ON(cns3xxx_pci_setup_resources(sys->domain,sys->resource));
10821 +       return 1;
10822 +}
10823 +
10824 +struct pci_bus *cns3xxx_pci_scan_bus(int nr, struct pci_sys_data *sys)
10825 +{
10826 +  struct pci_bus *ret;
10827 +  ret = pci_scan_bus(sys->busnr, &cns3xxx_pcie_ops, sys);
10828 +  pci_assign_unassigned_resources();
10829 +  return ret;
10830 +}
10831 +
10832 +/* 
10833 + *   CNS3XXX PCIe device don't support hotplugin, and we will check the link at start up. 
10834 + *
10835 + */
10836 +static void cns3xxx_pcie_check_link(int port)
10837 +{
10838 +
10839 +       u32 reg;
10840 +       u32 time;
10841 +
10842 +       time = jiffies;         /* set the start time for the receive */
10843 +       while (1) {
10844 +               reg = __raw_readl( port == 0 ? CNS3XXX_PCIE0_PM_DEBUG : CNS3XXX_PCIE1_PM_DEBUG);        /* check link up */
10845 +               reg = __raw_readl( port == 0 ? CNS3XXX_PCIE0_PM_DEBUG : CNS3XXX_PCIE1_PM_DEBUG);
10846 +               if (reg & 0x1) {
10847 +                       pcie_linked[port]++;
10848 +                       break;
10849 +               } else if (time_after(jiffies, (unsigned long)(time + 50))) {
10850 +                       break;
10851 +               }
10852 +       }
10853 +
10854 +}
10855 +
10856 +static void cns3xxx_pcie_hw_init(int port){
10857 +       struct pci_bus bus;
10858 +       struct pci_sys_data sd;
10859 +       u32 devfn = 0;
10860 +       u8 pri_bus, sec_bus, sub_bus;
10861 +       u8 cp, u8tmp;
10862 +       u16 u16tmp,pos,dc;
10863 +       u32 mem_base, host_base, io_base, cfg0_base;
10864 +
10865 +       bus.number = 0; 
10866 +       bus.ops    = &cns3xxx_pcie_ops;
10867 +       sd.domain = port;
10868 +       bus.sysdata = &sd;      
10869 +
10870 +       mem_base = ( port == 0 ? CNS3XXX_PCIE0_MEM_BASE : CNS3XXX_PCIE1_MEM_BASE );
10871 +       mem_base = mem_base >> 16;
10872 +
10873 +       io_base = ( port == 0 ? CNS3XXX_PCIE0_IO_BASE : CNS3XXX_PCIE1_IO_BASE );
10874 +       io_base = io_base >> 16;
10875 +
10876 +       host_base = ( port == 0 ? CNS3XXX_PCIE0_HOST_BASE_VIRT : CNS3XXX_PCIE1_HOST_BASE_VIRT );
10877 +       host_base = ( host_base -1 ) >> 16;
10878 +
10879 +       cfg0_base = ( port == 0 ? CNS3XXX_PCIE0_CFG0_BASE_VIRT : CNS3XXX_PCIE1_CFG0_BASE_VIRT );
10880 +       cfg0_base = ( cfg0_base -1 ) >> 16;
10881 +
10882 +       pci_bus_write_config_byte(&bus, devfn, PCI_PRIMARY_BUS, 0);
10883 +       pci_bus_write_config_byte(&bus, devfn, PCI_SECONDARY_BUS, 1);
10884 +       pci_bus_write_config_byte(&bus, devfn, PCI_SUBORDINATE_BUS, 1);
10885 +
10886 +       pci_bus_read_config_byte(&bus, devfn, PCI_PRIMARY_BUS, &pri_bus);
10887 +       pci_bus_read_config_byte(&bus, devfn, PCI_SECONDARY_BUS, &sec_bus);
10888 +       pci_bus_read_config_byte(&bus, devfn, PCI_SUBORDINATE_BUS, &sub_bus);
10889 +
10890 +       pci_bus_write_config_word(&bus, devfn, PCI_MEMORY_BASE, mem_base);
10891 +       pci_bus_write_config_word(&bus, devfn, PCI_MEMORY_LIMIT, host_base);
10892 +       pci_bus_write_config_word(&bus, devfn, PCI_IO_BASE_UPPER16, io_base);
10893 +       pci_bus_write_config_word(&bus, devfn, PCI_IO_LIMIT_UPPER16, cfg0_base);
10894 +
10895 +       pci_bus_read_config_byte(&bus, devfn, PCI_CAPABILITY_LIST, &cp);
10896 +       while (cp != 0) {
10897 +               pci_bus_read_config_byte(&bus, devfn, cp, &u8tmp);
10898 +               // Read Next ID
10899 +               pci_bus_read_config_word(&bus, devfn, cp, &u16tmp);
10900 +               cp = (u16tmp & 0xFF00) >> 8;
10901 +       }
10902 +
10903 +       /* Modify device's Max_Read_Request size */
10904 +       devfn = PCI_DEVFN(1,0);
10905 +       if (!pcie_linked[port])
10906 +               return;
10907 +               
10908 +       pci_bus_read_config_byte(&bus, devfn, PCI_CAPABILITY_LIST, &cp);
10909 +       while (cp != 0) {
10910 +               pci_bus_read_config_byte(&bus, devfn, cp, &u8tmp);
10911 +               // Read Next ID
10912 +               pci_bus_read_config_word(&bus, devfn, cp, &u16tmp);
10913 +               cp = (u16tmp & 0xFF00) >> 8;
10914 +       }
10915 +
10916 +       /* Set Device Max_Read_Request_Size to 128 byte */
10917 +       pos = pci_bus_find_capability(&bus, devfn, PCI_CAP_ID_EXP);
10918 +       pci_bus_read_config_word(&bus, devfn, pos + PCI_EXP_DEVCTL, &dc);
10919 +       dc &= ~(0x3 << 12);     /* Clear Device Control Register [14:12] */
10920 +       pci_bus_write_config_word(&bus, devfn, pos + PCI_EXP_DEVCTL, dc);
10921 +       pci_bus_read_config_word(&bus, devfn, pos + PCI_EXP_DEVCTL, &dc);
10922 +       
10923 +       if (!port) {
10924 +               /* Disable PCIe0 Interrupt Mask INTA to INTD */
10925 +               __raw_writel(~0x3FFF, CNS3XXX_MISC_BASE_VIRT + 0x978);
10926 +       } else {
10927 +               /* Disable PCIe1 Interrupt Mask INTA to INTD */
10928 +               __raw_writel(~0x3FFF, CNS3XXX_MISC_BASE_VIRT + 0xA78);
10929 +       }
10930 +}
10931 +
10932 +
10933 +void __init cns3xxx_pcie0_preinit(void)
10934 +{
10935 +       cns3xxx_pcie_check_link(0);
10936 +       cns3xxx_pcie_hw_init(0);
10937 +}
10938 +
10939 +void __init cns3xxx_pcie1_preinit(void)
10940 +{
10941 +       cns3xxx_pcie_check_link(1);
10942 +       cns3xxx_pcie_hw_init(1);
10943 +}
10944 +
10945 +/*
10946 + * map the specified device/slot/pin to an IRQ.   Different backplanes may need to modify this.
10947 + */
10948 +
10949 +static int __init cns3xxx_pcie0_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
10950 +{
10951 +       return cns3xxx_pcie0_irqs[slot];
10952 +}
10953 +
10954 +static int __init cns3xxx_pcie1_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
10955 +{
10956 +       return cns3xxx_pcie1_irqs[slot];
10957 +}
10958 +
10959 +static struct hw_pci cns3xxx_pcie[2] __initdata = {
10960 +       {
10961 +               .swizzle = pci_std_swizzle,
10962 +               .map_irq = cns3xxx_pcie0_map_irq,
10963 +               .nr_controllers = 1,
10964 +               .nr_domains = 0,
10965 +               .setup = cns3xxx_pci_setup,
10966 +               .scan = cns3xxx_pci_scan_bus,
10967 +               .preinit = cns3xxx_pcie0_preinit,
10968 +       },
10969 +       {
10970 +               .swizzle = pci_std_swizzle,
10971 +               .map_irq = cns3xxx_pcie1_map_irq,
10972 +               .nr_controllers = 1,
10973 +               .nr_domains = 1,
10974 +               .setup = cns3xxx_pci_setup,
10975 +               .scan = cns3xxx_pci_scan_bus,
10976 +               .preinit = cns3xxx_pcie1_preinit,
10977 +       }
10978 +};
10979 +
10980 +static int cns3xxx_pcie_abort_handler(unsigned long addr, unsigned int fsr,
10981 +                                      struct pt_regs *regs)
10982 +{
10983 +  if (fsr & (1 << 10))
10984 +    regs->ARM_pc += 4;
10985 +  return 0;
10986 +}
10987 +
10988 +//extern void pci_common_init(struct hw_pci *);
10989 +int cns3xxx_pcie_init(u8 ports)
10990 +{
10991 +       hook_fault_code(16 + 6, cns3xxx_pcie_abort_handler, SIGBUS, "imprecise external abort");
10992 +
10993 +       if (ports & 0x1)
10994 +               pci_common_init(&cns3xxx_pcie[0]);
10995 +       if (ports & 0x2)
10996 +               pci_common_init(&cns3xxx_pcie[1]);
10997 +
10998 +       return 0;
10999 +}
11000 +
11001 +//device_initcall(cns3xxx_pcie_init);