[adm5120] fix RB-133/133C led definitions
[openwrt.git] / target / linux / storm / patches / 001-arch.patch
1 --- a/arch/arm/Kconfig
2 +++ b/arch/arm/Kconfig
3 @@ -220,6 +220,9 @@
4         help
5           This enables support for the Cirrus EP93xx series of CPUs.
6  
7 +config ARCH_SL2312
8 +    bool "SL2312"
9 +
10  config ARCH_FOOTBRIDGE
11         bool "FootBridge"
12         select FOOTBRIDGE
13 @@ -414,6 +417,8 @@
14  
15  source "arch/arm/mach-footbridge/Kconfig"
16  
17 +source "arch/arm/mach-sl2312/Kconfig"
18 +
19  source "arch/arm/mach-integrator/Kconfig"
20  
21  source "arch/arm/mach-iop32x/Kconfig"
22 @@ -549,6 +554,16 @@
23  config PCI_SYSCALL
24         def_bool PCI
25  
26 +config SL2312_LPC
27 +    bool "LPC Host Support"
28 +    depends on ARCH_SL2312
29 +    help
30 +
31 +config SL2312_LPC_IT8712
32 +    bool "IT8712 Support"
33 +    depends on ARCH_SL2312 && SL2312_LPC
34 +    help
35 +
36  # Select the host bridge type
37  config PCI_HOST_VIA82C505
38         bool
39 @@ -988,6 +1003,10 @@
40  source "drivers/mtd/Kconfig"
41  endif
42  
43 +if ARCH_SL2312
44 +source "drivers/telephony/Kconfig"
45 +endif
46 +
47  source "drivers/parport/Kconfig"
48  
49  source "drivers/pnp/Kconfig"
50 @@ -997,7 +1016,7 @@
51  if PCMCIA || ARCH_CLPS7500 || ARCH_IOP32X || ARCH_IOP33X || ARCH_IXP4XX \
52         || ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC \
53         || ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE \
54 -       || ARCH_IXP23XX
55 +       || ARCH_IXP23XX || ARCH_SL2312
56  source "drivers/ide/Kconfig"
57  endif
58  
59 --- a/arch/arm/Makefile
60 +++ b/arch/arm/Makefile
61 @@ -72,6 +72,7 @@
62  tune-$(CONFIG_CPU_ARM922T)     :=-mtune=arm9tdmi
63  tune-$(CONFIG_CPU_ARM925T)     :=-mtune=arm9tdmi
64  tune-$(CONFIG_CPU_ARM926T)     :=-mtune=arm9tdmi
65 +tune-$(CONFIG_CPU_FA52X)    :=-mtune=arm9tdmi
66  tune-$(CONFIG_CPU_SA110)       :=-mtune=strongarm110
67  tune-$(CONFIG_CPU_SA1100)      :=-mtune=strongarm1100
68  tune-$(CONFIG_CPU_XSCALE)      :=$(call cc-option,-mtune=xscale,-mtune=strongarm110) -Wa,-mcpu=xscale
69 @@ -111,6 +112,7 @@
70   machine-$(CONFIG_ARCH_PXA)       := pxa
71   machine-$(CONFIG_ARCH_L7200)     := l7200
72   machine-$(CONFIG_ARCH_INTEGRATOR) := integrator
73 + machine-$(CONFIG_ARCH_SL2312)     := sl2312
74   textofs-$(CONFIG_ARCH_CLPS711X)   := 0x00028000
75   machine-$(CONFIG_ARCH_CLPS711X)   := clps711x
76   machine-$(CONFIG_ARCH_IOP32X)    := iop32x
77 --- a/arch/arm/boot/compressed/Makefile
78 +++ b/arch/arm/boot/compressed/Makefile
79 @@ -19,6 +19,10 @@
80  OBJS           += head-shark.o ofw-shark.o
81  endif
82  
83 +ifeq ($(CONFIG_ARCH_SL2312),y)
84 +OBJS           += head-sl2312.o
85 +endif
86 +
87  ifeq ($(CONFIG_ARCH_L7200),y)
88  OBJS           += head-l7200.o
89  endif
90 --- /dev/null
91 +++ b/arch/arm/boot/compressed/head-sl2312.S
92 @@ -0,0 +1,6 @@
93 +#include <asm/mach-types.h>
94 +#include <asm/arch/sl2312.h>
95 +
96 +               .section        ".start", "ax"
97 +               mov     r7, #MACH_TYPE_SL2312
98 +
99 --- a/arch/arm/boot/compressed/head.S
100 +++ b/arch/arm/boot/compressed/head.S
101 @@ -57,6 +57,17 @@
102                 mov     \rb, #0x50000000
103                 add     \rb, \rb, #0x4000 * CONFIG_S3C_LOWLEVEL_UART_PORT
104                 .endm
105 +/*****************************************************
106 + *      for Storlink SoC
107 + *****************************************************/
108 +#elif defined(CONFIG_ARCH_SL2312)
109 +               .macro  loadsp, rb
110 +               mov     \rb, #0x16000000
111 +               .endm
112 +               .macro  writeb, rb
113 +               strb    \rb, [r3, #0]
114 +               .endm
115 +/****************************************************/
116  #else
117                 .macro  loadsp, rb
118                 addruart \rb
119 @@ -116,7 +127,28 @@
120                 .rept   8
121                 mov     r0, r0
122                 .endr
123 -
124 +/*****************************************************************************
125 + *  for Storlink Soc -- on chip UART
126 + *****************************************************************************/
127 +#ifndef CONFIG_SERIAL_IT8712           // Jason test
128 +@                mov     r3, #0x22000000
129 +                mov     r3, #0x42000000
130 +                mov     r11, #0x80
131 +                strb    r11, [r3, #0xc]
132 +                mov     r11, #0x0
133 +                strb    r11, [r3, #0x4]
134 +#ifndef CONFIG_SL3516_ASIC
135 +                mov     r11, #0x9C             /*0x9c->19200 0x4E->38400 0x34->57600 */
136 +#else
137 +               mov     r11, #0x9C              /* 0x61 for 30MHz on GeminiA chip*/
138 +#endif
139 +                strb    r11, [r3, #0x0]
140 +                mov     r11, #0x03
141 +                strb    r11, [r3, #0xc]
142 +                       mov     r11, #0xFB
143 +                strb    r11, [r3, #0x18]
144 +#endif
145 +/*****************************************************************************/
146                 b       1f
147                 .word   0x016f2818              @ Magic numbers to help the loader
148                 .word   start                   @ absolute load/run zImage address
149 @@ -458,6 +490,39 @@
150                 mcr     p15, 0, r0, c7, c5, 4   @ ISB
151                 mov     pc, r12
152  
153 +/*****************************************************************************
154 + *  for Storlink Soc -- CPU cache
155 + *****************************************************************************/
156 +__fa526_cache_on:
157 +                mov     r12, lr
158 +                bl      __setup_mmu
159 +                mov     r0, #0
160 +                mcr     p15, 0, r0, c7, c6, 0   @ Invalidate D cache
161 +                mcr     p15, 0, r0, c7, c5, 0   @ Invalidate I cache
162 +                mcr     p15, 0, r0, c7, c10, 4  @ drain write buffer
163 +                mcr     p15, 0, r0, c8, c7, 0   @ flush I,D TLBs
164 +                mcr     p15, 0, r3, c2, c0, 0   @ load page table pointer
165 +                mov     r0, #-1
166 +                mcr     p15, 0, r0, c3, c0, 0   @ load domain access register
167 +                mrc     p15, 0, r0, c1, c0, 0
168 +                mov     r0, r0
169 +                mov     r0, r0
170 +#ifndef CONFIG_CPU_DCACHE_DISABLE
171 +        orr     r0, r0, #0x0004                 @ .... .... .... .1..
172 +#endif
173 +#ifndef CONFIG_CPU_ICACHE_DISABLE
174 +        orr     r0, r0, #0x1000                 @ ...1 .... .... ....
175 +#endif
176 +
177 +#ifndef DEBUG
178 +                orr     r0, r0, #0x0039         @ Write buffer, mmu
179 +#endif
180 +                mcr     p15, 0, r0, c1, c0
181 +                mov     r0, r0
182 +                mov     r0, r0
183 +                mov     pc, r12
184 +/********************************************************************************/
185 +
186  __arm6_mmu_cache_on:
187                 mov     r12, lr
188                 bl      __setup_mmu
189 @@ -625,6 +690,16 @@
190  
191                 @ These match on the architecture ID
192  
193 +/*****************************************************************************
194 + *  for Storlink Soc -- CPU architecture ID
195 + *****************************************************************************/
196 +        .word   0x66015261              @ FA526
197 +        .word   0xff01fff1
198 +        b       __fa526_cache_on
199 +        b       __fa526_cache_off
200 +        b       __fa526_cache_flush
201 +/*****************************************************************************/
202 +
203                 .word   0x00020000              @ ARMv4T
204                 .word   0x000f0000
205                 b       __armv4_mmu_cache_on
206 @@ -712,6 +787,23 @@
207                 mcr     p15, 0, r0, c8, c7, 0   @ invalidate whole TLB
208                 mov     pc, r12
209  
210 +/*****************************************************************************
211 + *  for Storlink Soc -- CPU cache
212 + *****************************************************************************/
213 +__fa526_cache_off:
214 +        mrc     p15, 0, r0, c1, c0
215 +        bic     r0, r0, #0x000d
216 +        mov     r1, #0
217 +        mcr     p15, 0, r1, c7, c14, 0  @ clean and invalidate D cache
218 +        mcr     p15, 0, r1, c7, c10, 4  @ drain WB
219 +        mcr     p15, 0, r0, c1, c0      @ turn MMU and cache off
220 +        mov     r0, #0
221 +        mcr     p15, 0, r0, c7, c5, 0   @ invalidate whole cache v4
222 +        mcr     p15, 0, r0, c8, c7, 0   @ invalidate whole TLB v4
223 +        mov     pc, lr
224 +/*****************************************************************************/
225 +
226 +
227  __arm6_mmu_cache_off:
228                 mov     r0, #0x00000030         @ ARM6 control reg.
229                 b       __armv3_mmu_cache_off
230 @@ -759,6 +851,17 @@
231                 mcr     p15, 0, ip, c7, c10, 4  @ drain WB
232                 mov     pc, lr
233                 
234 +/*****************************************************************************
235 + *  for Storlink Soc -- CPU cache
236 + *****************************************************************************/
237 +__fa526_cache_flush:
238 +                mov     r1, #0
239 +                mcr     p15, 0, r1, c7, c14, 0  @ clean and invalidate D cache
240 +                mcr     p15, 0, r1, c7, c5, 0   @ flush I cache
241 +                mcr     p15, 0, r1, c7, c10, 4  @ drain WB
242 +                mov     pc, lr
243 +/*****************************************************************************/
244 +
245  
246  __armv6_mmu_cache_flush:
247                 mov     r1, #0
248 --- /dev/null
249 +++ b/arch/arm/boot/compressed/it8712.h
250 @@ -0,0 +1,25 @@
251 +
252 +#ifndef __IT8712_H__
253 +#define __IT8712_H__
254 +
255 +#include "asm/arch/sl2312.h"
256 +
257 +#define IT8712_IO_BASE                 SL2312_LPC_IO_BASE
258 +//#define IT8712_IO_BASE                       0x27000000
259 +// Device LDN
260 +#define LDN_SERIAL1                            0x01
261 +#define LDN_SERIAL2                            0x02
262 +#define LDN_PARALLEL                   0x03
263 +#define LDN_KEYBOARD                   0x05
264 +#define LDN_MOUSE                              0x06
265 +#define LDN_GPIO                               0x07
266 +
267 +#define IT8712_UART1_PORT              0x3F8
268 +#define IT8712_UART2_PORT              0x2F8
269 +
270 +#define IT8712_GPIO_BASE               0x800   // 0x800-0x804 for GPIO set1-set5
271 +
272 +void LPCSetConfig(char LdnNumber, char Index, char data);
273 +char LPCGetConfig(char LdnNumber, char Index);
274 +
275 +#endif
276 --- a/arch/arm/boot/compressed/misc.c
277 +++ b/arch/arm/boot/compressed/misc.c
278 @@ -30,7 +30,7 @@
279  #include <asm/arch/uncompress.h>
280  
281  #ifdef CONFIG_DEBUG_ICEDCC
282 -
283 +#include "it8712.h"
284  #ifdef CONFIG_CPU_V6
285  
286  static void icedcc_putc(int ch)
287 @@ -69,6 +69,7 @@
288  #define flush()        do { } while (0)
289  #endif
290  
291 +#if 0
292  static void putstr(const char *ptr)
293  {
294         char c;
295 @@ -81,11 +82,36 @@
296  
297         flush();
298  }
299 +#endif
300  
301  #endif
302  
303  #define __ptr_t void *
304  
305 +#ifdef CONFIG_SERIAL_IT8712
306 +unsigned int it8712_uart_base;
307 +#define UART_RX         0
308 +#define UART_TX         0
309 +#define UART_DLL        0
310 +#define UART_TRG        0
311 +#define UART_DLM        1
312 +#define UART_IER        1
313 +#define UART_FCTR       1
314 +#define UART_IIR        2
315 +#define UART_FCR        2
316 +#define UART_EFR        2
317 +#define UART_LCR        3
318 +#define UART_MCR        4
319 +#define UART_LSR        5
320 +#define UART_MSR        6
321 +#define UART_SCR        7
322 +#define UART_EMSR       7
323 +void LPCEnterMBPnP(void);
324 +void LPCExitMBPnP(void);
325 +int SearchIT8712(void);
326 +int InitLPCInterface(void);
327 +#endif
328 +
329  /*
330   * Optimised C version of memzero for the ARM.
331   */
332 @@ -346,6 +372,9 @@
333  decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p,
334                   int arch_id)
335  {
336 +#ifdef CONFIG_SERIAL_IT8712
337 +        unsigned char *addr;
338 +#endif
339         output_data             = (uch *)output_start;  /* Points to kernel start */
340         free_mem_ptr            = free_mem_ptr_p;
341         free_mem_ptr_end        = free_mem_ptr_end_p;
342 @@ -353,6 +382,33 @@
343  
344         arch_decomp_setup();
345  
346 +#ifdef CONFIG_SERIAL_IT8712
347 +
348 +        InitLPCInterface();
349 +        LPCSetConfig(0, 0x02, 0x01);
350 +        LPCSetConfig(LDN_SERIAL1, 0x30, 0x1);
351 +        LPCSetConfig(LDN_SERIAL1, 0x23, 0x0);
352 +        it8712_uart_base = IT8712_IO_BASE;
353 +        it8712_uart_base += ((LPCGetConfig(LDN_SERIAL1, 0x60) << 8) + LPCGetConfig(LDN_SERIAL1, 0x61));
354 +
355 +        do {
356 +        addr = (unsigned char *)(it8712_uart_base + UART_LCR) ;
357 +        *addr = 0x80;
358 +        // Set Baud Rate
359 +        addr = (unsigned char *)(it8712_uart_base+UART_DLL);
360 +        *addr = 0x06 ;
361 +        addr = (unsigned char *)(it8712_uart_base+UART_DLM);
362 +        *addr = 0x00 ;
363 +
364 +        addr = (unsigned char *)(it8712_uart_base+UART_LCR);    // LCR
365 +        *addr = 0x07 ;
366 +        addr = (unsigned char *)(it8712_uart_base+UART_MCR);    // MCR
367 +        *addr = 0x08 ;
368 +        addr = (unsigned char *)(it8712_uart_base+UART_FCR);    // FCR
369 +        *addr = 0x01 ;
370 +       } while(0);
371 +#endif
372 +
373         makecrc();
374         putstr("Uncompressing Linux...");
375         gunzip();
376 @@ -374,4 +430,119 @@
377         return 0;
378  }
379  #endif
380 +
381 +#ifdef CONFIG_SERIAL_IT8712
382 +
383 +#define LPC_KEY_ADDR    (unsigned char *)(SL2312_LPC_IO_BASE + 0x2e)
384 +#define LPC_DATA_ADDR   (unsigned char *)(SL2312_LPC_IO_BASE + 0x2f)
385 +#define LPC_BUS_CTRL                    *( unsigned char*) (SL2312_LPC_HOST_BASE + 0)
386 +#define LPC_BUS_STATUS                  *( unsigned char*) (SL2312_LPC_HOST_BASE + 2)
387 +#define LPC_SERIAL_IRQ_CTRL             *( unsigned char*) (SL2312_LPC_HOST_BASE + 4)
388 +
389 +char LPCGetConfig(char LdnNumber, char Index)
390 +{
391 +        char rtn;
392 +        unsigned char *addr ;
393 +
394 +        LPCEnterMBPnP();                                // Enter IT8712 MB PnP mode
395 +
396 +        addr = LPC_KEY_ADDR;
397 +        *addr = 0x07 ;
398 +
399 +        addr = LPC_DATA_ADDR;
400 +        *addr = LdnNumber ;
401 +
402 +        addr = LPC_KEY_ADDR;
403 +        *addr = Index ;
404 +
405 +        addr = LPC_DATA_ADDR ;
406 +        rtn = *addr ;
407 +
408 +        LPCExitMBPnP();
409 +        return rtn;
410 +
411 +}
412 +
413 +void LPCSetConfig(char LdnNumber, char Index, char data)
414 +{
415 +        unsigned char *addr;
416 +        LPCEnterMBPnP();                                // Enter IT8712 MB PnP mode
417 +        addr = LPC_KEY_ADDR;
418 +        *addr = 0x07;
419 +        addr = LPC_DATA_ADDR;
420 +        *addr = LdnNumber;
421 +        addr = LPC_KEY_ADDR;
422 +        *addr = Index;
423 +        addr = LPC_DATA_ADDR;
424 +        *addr = data;
425 +
426 +        LPCExitMBPnP();
427 +}
428 +
429 +//unsigned char key[4] ;
430 +void LPCEnterMBPnP(void)
431 +{
432 +        unsigned char *addr;
433 +        addr = LPC_KEY_ADDR;
434 +        unsigned char key[4] = {0x87, 0x01, 0x55, 0x55};
435 +
436 +               do {
437 +               *addr = key[0];
438 +               *addr = key[1];
439 +               *addr = key[2];
440 +               *addr = key[3];
441 +               }while(0);
442 +}
443 +
444 +void LPCExitMBPnP(void)
445 +{
446 +        unsigned char *addr;
447 +        addr = LPC_KEY_ADDR;
448 +        *addr = 0x02 ;
449 +
450 +        addr = LPC_DATA_ADDR;
451 +        *addr = 0x02 ;
452 +}
453 +
454 +int InitLPCInterface(void)
455 +{
456 +        int i;
457 +        LPC_BUS_CTRL = 0xc0;
458 +        LPC_SERIAL_IRQ_CTRL = 0xc0;
459 +
460 +        for(i=0;i<0x2000;i++) ;
461 +
462 +        LPC_SERIAL_IRQ_CTRL = 0x80;
463 +        if (!SearchIT8712()) ;
464 +//                     while(1);
465 +        return 0;
466 +}
467 +
468 +int SearchIT8712(void)
469 +{
470 +        unsigned char Id1, Id2;
471 +        unsigned short Id;
472 +        unsigned char *addr;
473 +
474 +        LPCEnterMBPnP();
475 +        addr = LPC_KEY_ADDR;
476 +        *addr = 0x20 ;
477 +        addr = LPC_DATA_ADDR;
478 +        Id1 = *addr ;
479 +
480 +        addr = LPC_KEY_ADDR;
481 +        *addr = 0x21 ;
482 +        addr = LPC_DATA_ADDR;
483 +        Id2 = *addr ;
484 +
485 +        Id = (Id1 << 8) | Id2;
486 +        LPCExitMBPnP();
487 +
488 +        if (Id == 0x8712)
489 +                return 1;
490 +        else
491 +                return 0;
492 +}
493 +
494 +#endif
495         
496 --- a/arch/arm/kernel/entry-armv.S
497 +++ b/arch/arm/kernel/entry-armv.S
498 @@ -18,6 +18,8 @@
499  #include <asm/memory.h>
500  #include <asm/glue.h>
501  #include <asm/vfpmacros.h>
502 +#include <asm/arch/irqs.h>
503 +#include <asm/hardware.h>
504  #include <asm/arch/entry-macro.S>
505  #include <asm/thread_notify.h>
506  
507 --- a/arch/arm/kernel/irq.c
508 +++ b/arch/arm/kernel/irq.c
509 @@ -40,6 +40,8 @@
510  #include <asm/system.h>
511  #include <asm/mach/time.h>
512  
513 +extern int fixup_irq(unsigned int irq);
514 +
515  /*
516   * No architecture-specific irq_finish function defined in arm/arch/irqs.h.
517   */
518 @@ -111,8 +113,11 @@
519  asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
520  {
521         struct pt_regs *old_regs = set_irq_regs(regs);
522 -       struct irq_desc *desc = irq_desc + irq;
523 +//     struct irq_desc *desc = irq_desc + irq;
524 +       struct irq_desc *desc;
525  
526 +       irq = fixup_irq(irq);
527 +       desc = irq_desc + irq;
528         /*
529          * Some hardware gives randomly wrong interrupts.  Rather
530          * than crashing, do something sensible.
531 --- a/arch/arm/kernel/process.c
532 +++ b/arch/arm/kernel/process.c
533 @@ -117,7 +117,7 @@
534  void (*pm_idle)(void);
535  EXPORT_SYMBOL(pm_idle);
536  
537 -void (*pm_power_off)(void);
538 +//void (*pm_power_off)(void);
539  EXPORT_SYMBOL(pm_power_off);
540  
541  void (*arm_pm_restart)(char str) = arm_machine_restart;
542 @@ -188,13 +188,37 @@
543  
544  void machine_halt(void)
545  {
546 +       unsigned int reg_v;
547 +
548 +       printk("arch_power_off\n");
549 +
550 +       reg_v = readl(IO_ADDRESS(SL2312_POWER_CTRL_BASE) + 0x04);
551 +       reg_v &= ~0x00000002;
552 +       reg_v |= 0x1;
553 +       mdelay(5);
554 +       // Power off
555 +       __raw_writel( reg_v, IO_ADDRESS(SL2312_POWER_CTRL_BASE) + 0x04);
556 +
557  }
558  
559  
560  void machine_power_off(void)
561  {
562 -       if (pm_power_off)
563 +       unsigned int reg_v;
564 +
565 +//     if (pm_power_off)
566 +       if (&pm_power_off!=NULL)
567                 pm_power_off();
568 +
569 +       printk("arch_power_off\n");
570 +
571 +       reg_v = readl(IO_ADDRESS(SL2312_POWER_CTRL_BASE) + 0x04);
572 +       reg_v &= ~0x00000002;
573 +       reg_v |= 0x1;
574 +       mdelay(5);
575 +       // Power off
576 +       __raw_writel( reg_v, IO_ADDRESS(SL2312_POWER_CTRL_BASE) + 0x04);
577 +
578  }
579  
580  void machine_restart(char * __unused)
581 --- a/arch/arm/kernel/time.c
582 +++ b/arch/arm/kernel/time.c
583 @@ -502,8 +502,13 @@
584  
585  device_initcall(timer_init_sysfs);
586  
587 +extern unsigned int rtc_get_time_second(void);
588 +
589  void __init time_init(void)
590  {
591 +#ifdef CONFIG_SL2312_RTC
592 +       xtime.tv_sec  = rtc_get_time_second() ;
593 +#endif
594  #ifndef CONFIG_GENERIC_TIME
595         if (system_timer->offset == NULL)
596                 system_timer->offset = dummy_gettimeoffset;
597 --- /dev/null
598 +++ b/arch/arm/mach-sl2312/Kconfig
599 @@ -0,0 +1,33 @@
600 +
601 +menu "SL2312"
602 +
603 +config SL3516_ASIC
604 +       bool "SL3516 ASIC version"
605 +       depends on ARCH_SL2312
606 +       help
607 +         This option to select AISC or FPGA
608 +config PCI
609 +       bool "SL2312 PCI"
610 +       depends on ARCH_SL2312
611 +       help
612 +         This option to enable Storlink PCI controller
613 +
614 +config SL2312_LPC
615 +       bool "SL2312 LPC"
616 +       depends on ARCH_SL2312
617 +       help
618 +         This option to enable Low Pin Count controller
619 +
620 +config SL2312_USB
621 +       bool "SL2312 USB"
622 +       depends on ARCH_SL2312
623 +       help
624 +         This option to enable USB OTG host controller
625 +
626 +config GEMINI_IPI
627 +       bool "Gemini IPI test"
628 +       depends on ARCH_SL2312
629 +       help
630 +        Enable this option to test dual cpu Inter-Processor-Interrupt
631 +endmenu
632 +
633 --- /dev/null
634 +++ b/arch/arm/mach-sl2312/Makefile
635 @@ -0,0 +1,16 @@
636 +#
637 +# Makefile for the linux kernel.
638 +#
639 +
640 +# Object file lists.
641 +
642 +obj-y                  := arch.o irq.o mm.o time.o sl3516_device.o
643 +obj-m                  :=
644 +obj-n                  :=
645 +
646 +
647 +obj-$(CONFIG_PCI) += pci.o
648 +obj-$(CONFIG_SL2312_LPC) += lpc.o
649 +obj-$(CONFIG_SL2312_USB) += sl2312-otg.o # sl2312-otg-1.o
650 +obj-$(CONFIG_GEMINI_XOR_ACCE) += xor.o
651 +obj-$(CONFIG_GEMINI_IPI)      += gemini_ipi.o
652 --- /dev/null
653 +++ b/arch/arm/mach-sl2312/Makefile.boot
654 @@ -0,0 +1,5 @@
655 +   zreladdr-y  := 0x00008000
656 +params_phys-y  := 0x00508100
657 +#params_phys-y := 0x00008100
658 +initrd_phys-y  := 0x00800000
659 +
660 --- /dev/null
661 +++ b/arch/arm/mach-sl2312/arch.c
662 @@ -0,0 +1,72 @@
663 +/*
664 + *  linux/arch/arm/mach-epxa10db/arch.c
665 + *
666 + *  Copyright (C) 2000 Deep Blue Solutions Ltd
667 + *  Copyright (C) 2001 Altera Corporation
668 + *
669 + * This program is free software; you can redistribute it and/or modify
670 + * it under the terms of the GNU General Public License as published by
671 + * the Free Software Foundation; either version 2 of the License, or
672 + * (at your option) any later version.
673 + *
674 + * This program is distributed in the hope that it will be useful,
675 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
676 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
677 + * GNU General Public License for more details.
678 + *
679 + * You should have received a copy of the GNU General Public License
680 + * along with this program; if not, write to the Free Software
681 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
682 + */
683 +#include <linux/types.h>
684 +#include <linux/init.h>
685 +
686 +#include <asm/hardware.h>
687 +#include <asm/setup.h>
688 +#include <asm/mach-types.h>
689 +#include <asm/mach/time.h>
690 +#include <asm/mach/arch.h>
691 +
692 +extern void sl2312_map_io(void);
693 +extern void sl2312_init_irq(void);
694 +extern unsigned long sl2312_gettimeoffset (void);
695 +extern void __init sl2312_time_init(void);
696 +
697 +static struct sys_timer sl2312_timer = {
698 +       .init           = sl2312_time_init,
699 +       .offset         = sl2312_gettimeoffset,
700 +};
701 +
702 +static void __init
703 +sl2312_fixup(struct machine_desc *desc, struct tag *tags,
704 +                 char **cmdline, struct meminfo *mi)
705 +{
706 +        mi->nr_banks      = 1;
707 +        mi->bank[0].start = 0;
708 +#ifdef CONFIG_GEMINI_IPI
709 +        mi->bank[0].size  = (64*1024*1024);  // 128M
710 +#else
711 +        mi->bank[0].size  = (128*1024*1024);  // 128M
712 +#endif
713 +        mi->bank[0].node  = 0;
714 +}
715 +
716 +/* MACHINE_START(SL2312, "GeminiA")
717 +       MAINTAINER("Storlink Semi")
718 +       BOOT_MEM(0x00000000, 0x90000000, 0xf0000000)
719 +        FIXUP(sl2312_fixup)
720 +       MAPIO(sl2312_map_io)
721 +       INITIRQ(sl2312_init_irq)
722 +       .timer = &sl2312_timer,
723 +MACHINE_END */
724 +
725 +MACHINE_START(SL2312, "GeminiA")
726 +       /* .phys_ram    = 0x00000000, */
727 +       .phys_io        = 0x7fffc000,
728 +       .io_pg_offst    = ((0xffffc000) >> 18) & 0xfffc,
729 +       .boot_params    = 0x100,
730 +       .fixup      = sl2312_fixup,
731 +       .map_io         = sl2312_map_io,
732 +       .init_irq       = sl2312_init_irq,
733 +       .timer          = &sl2312_timer,
734 +MACHINE_END
735 --- /dev/null
736 +++ b/arch/arm/mach-sl2312/gemini_ipi.c
737 @@ -0,0 +1,593 @@
738 +/*
739 + * FILE NAME sl_cir.c
740 + *
741 + * BRIEF MODULE DESCRIPTION
742 + *  IPI Driver for CPU1.
743 + *
744 + *  Author: StorLink, Corp.
745 + *          Jason Lee
746 + *
747 + * Copyright 2002~2006 StorLink, Corp.
748 + *
749 + *  This program is free software; you can redistribute  it and/or modify it
750 + *  under  the terms of  the GNU General  Public License as published by the
751 + *  Free Software Foundation;  either version 2 of the  License, or (at your
752 + *  option) any later version.
753 + *
754 + *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
755 + *  WARRANTIES,   INCLUDING, BUT NOT  LIMit8712D  TO, THE IMPLIED WARRANTIES OF
756 + *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
757 + *  NO  EVENT  SHALL   THE AUTHOR  BE  LIABLE FOR ANY   DIRECT, INDIRECT,
758 + *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
759 + *  NOT LIMit8712D   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
760 + *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
761 + *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
762 + *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
763 + *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
764 + *
765 + *  You should have received a copy of the  GNU General Public License along
766 + *  with this program; if not, writ8712  to the Free Software Foundation, Inc.,
767 + *  675 Mass Ave, Cambridge, MA 02139, USA.
768 + */
769 +
770 +#include <linux/module.h>
771 +#include <linux/types.h>
772 +#include <linux/kernel.h>
773 +#include <linux/miscdevice.h>
774 +#include <linux/init.h>
775 +#include <linux/pagemap.h>
776 +#include <asm/uaccess.h>
777 +#include <linux/ioport.h>
778 +#include <linux/sched.h>
779 +#include <linux/delay.h>
780 +#include <linux/fs.h>
781 +#include <linux/interrupt.h>
782 +#include <asm/io.h>
783 +#include <asm/delay.h>
784 +#include <linux/signal.h>
785 +#include <asm/arch/sl2312.h>
786 +#include <asm/arch/int_ctrl.h>
787 +#include <asm/arch/ipi.h>
788 +#include <linux/dma-mapping.h>
789 +
790 +
791 +#include <linux/mm.h>
792 +
793 +#include <linux/bootmem.h>
794 +
795 +#include <asm/hardware.h>
796 +#include <asm/page.h>
797 +#include <asm/setup.h>
798 +#include <asm/pgtable.h>
799 +#include <asm/pgalloc.h>
800 +
801 +#include <asm/mach/map.h>
802 +
803 +
804 +static int sl_ipi_debug = 1 ;
805 +#define DEB(x)  if(sl_ipi_debug>=1) x
806 +
807 +#define SRAM_PTR               IO_ADDRESS(SL2312_SRAM_BASE)
808 +volatile JSCALE_REQ_T *req=(JSCALE_REQ_T*)SRAM_PTR;
809 +volatile JSCALE_RSP_T *rsp=(JSCALE_RSP_T*)(SRAM_PTR+0x20);
810 +
811 +unsigned int jscale_status=0;
812 +
813 +#define JSCALE_WAIT    0
814 +#define XXXXXX_WAIT    1
815 +#define MAX_WAIT_Q     8
816 +wait_queue_head_t gemini_ipi_wait[MAX_WAIT_Q];
817 +
818 +#define DRAMCTL_DMA_CTL                0X20
819 +#define DRAMCTL_DMA_SA         0X24
820 +#define DRAMCTL_DMA_DA         0X28
821 +#define DRAMCTL_DMA_CNT                0X2C
822 +#define MEMCPY_UNIT            0x40000
823 +int hw_memcpy(const void *to, const void *from, unsigned int bytes)
824 +{
825 +       unsigned int reg_a,reg_d;
826 +       int count = bytes,i=0;
827 +
828 +       consistent_sync((unsigned int *)to, bytes, DMA_BIDIRECTIONAL);
829 +       consistent_sync((unsigned int *)from,bytes, DMA_TO_DEVICE);
830 +
831 +       DEB(printk("hwmemcpy:count %d\n",count));
832 +       while(count>0){
833 +               // SA
834 +               reg_a = IO_ADDRESS(SL2312_DRAM_CTRL_BASE)+DRAMCTL_DMA_SA;
835 +               reg_d = (unsigned int )__virt_to_phys(from) + i*MEMCPY_UNIT;
836 +               DEB(printk("hwmemcpy:from 0x%08x\n",reg_d));
837 +               writel(reg_d,reg_a);
838 +               // DA
839 +               reg_a = IO_ADDRESS(SL2312_DRAM_CTRL_BASE)+DRAMCTL_DMA_DA;
840 +               reg_d = (unsigned int )__virt_to_phys(to) + i*MEMCPY_UNIT;
841 +               writel(reg_d,reg_a);
842 +               DEB(printk("hwmemcpy:to 0x%08x\n",reg_d));
843 +               // byte count
844 +               reg_a = IO_ADDRESS(SL2312_DRAM_CTRL_BASE)+DRAMCTL_DMA_CNT;
845 +               reg_d = (count>=MEMCPY_UNIT)?MEMCPY_UNIT:count;
846 +               writel(reg_d,reg_a);
847 +               // start DMA
848 +               reg_a = IO_ADDRESS(SL2312_DRAM_CTRL_BASE)+DRAMCTL_DMA_CTL;
849 +               writel(0x80000001,reg_a);
850 +
851 +               do{
852 +                       cond_resched();
853 +//                     msleep(4);
854 +                       reg_d = readl(IO_ADDRESS(SL2312_DRAM_CTRL_BASE)+DRAMCTL_DMA_CTL);
855 +               }while(reg_d&0x1);
856 +
857 +               count -= MEMCPY_UNIT;
858 +               i++;
859 +       }
860 +
861 +       return bytes;
862 +}
863 +
864 +static irqreturn_t ipi_interrupt()
865 +{
866 +       unsigned int id=getcpuid(),tmp;
867 +
868 +       //dmac_inv_range(__phys_to_virt(SL2312_SRAM_BASE),__phys_to_virt(SHAREADDR)+0x2000);
869 +
870 +
871 +       // Clear Interrupt
872 +       if(id==CPU0) {
873 +               tmp = readl(CPU1_STATUS);
874 +               tmp &= ~CPU_IPI_BIT_MASK;
875 +               writel(tmp,CPU1_STATUS);
876 +       }
877 +       else{
878 +               tmp = readl(CPU0_STATUS);
879 +               tmp &= ~CPU_IPI_BIT_MASK;
880 +               writel(tmp,CPU0_STATUS);
881 +       }
882 +
883 +       //
884 +       DEB(printk("ipi interrupt:0x%x\n",rsp->status));
885 +       switch(rsp->status){
886 +               case JSCALE_STATUS_OK:
887 +
888 +                       break;
889 +               case JSCALE_UNKNOWN_MSG_TYPE:
890 +
891 +                       break;
892 +               case JSCALE_FAILED_FILE_SIZE:
893 +
894 +                       break;
895 +               case JSCALE_FAILED_MALLOC:
896 +
897 +                       break;
898 +               case JSCALE_FAILED_FORMAT:
899 +
900 +                       break;
901 +               case JSCALE_DECODE_ERROR:
902 +
903 +                       break;
904 +
905 +       }
906 +       jscale_status = rsp->status;
907 +//     wake_up(&gemini_ipi_wait[JSCALE_WAIT]);
908 +
909 +       return IRQ_HANDLED;
910 +}
911 +
912 +static int gemini_ipi_open(struct inode *inode, struct file *file)
913 +{
914 +       DEB(printk("ipi open\n"));
915 +       return 0;
916 +}
917 +
918 +
919 +static int gemini_ipi_release(struct inode *inode, struct file *file)
920 +{
921 +       DEB(printk("ipi release\n"));
922 +       return 0;
923 +}
924 +
925 +
926 +static int gemini_ipi_ioctl(struct inode *inode, struct file *file,
927 +       unsigned int cmd, unsigned long arg)
928 +{
929 +       JSCALE_RSP_T tmp;
930 +
931 +       switch(cmd) {
932 +               case GEMINI_IPI_JSCALE_REQ:
933 +                       DEB(printk("ipi:ioctl jscale request %dX%d Q:%d\n",req->ScaledImageWidth,req->ScaledImageHeight,req->ScaledImageQuality));
934 +                       if (copy_from_user(req, (JSCALE_REQ_T *)arg, sizeof(JSCALE_REQ_T)))
935 +                               return -EFAULT;
936 +                       req->hdr.type = IPC_JSCALE_REQ_MSG;
937 +                       req->hdr.length = sizeof(JSCALE_REQ_T);
938 +                       req->input_location  = CPU_1_DATA_OFFSET;
939 +                       req->output_location = CPU_1_DATA_OFFSET;
940 +                       break;
941 +               case GEMINI_IPI_JSCALE_STAT:
942 +                       DEB(printk("ipi:ioctl jscale stat \n"));
943 +                       if(jscale_status==JSCALE_BUSY){                                         // not yet
944 +                               tmp.status = JSCALE_BUSY;
945 +                               if (copy_to_user((JSCALE_RSP_T *)arg,&tmp, sizeof(JSCALE_RSP_T)))
946 +                                       return -EFAULT;
947 +                       }
948 +                       else{                                                                                           // finish or error
949 +                               if (copy_to_user((JSCALE_RSP_T *)arg,rsp, sizeof(JSCALE_RSP_T)))
950 +                                       return -EFAULT;
951 +                       }
952 +                       break;
953 +               default:
954 +                       printk("IPI: Error IOCTL number\n");
955 +                       return -ENOIOCTLCMD;
956 +       }
957 +
958 +       return 0;
959 +}
960 +
961 +#define SRAM_SIZE      0x2000
962 +static ssize_t gemini_ipi_write(struct file *file_p, const char *buf, size_t count, loff_t * ppos)
963 +{
964 +       int i=0,tmp=0,j;
965 +       const char *ptr=(unsigned int)__phys_to_virt(CPU_1_MEM_BASE+CPU_1_DATA_OFFSET);
966 +       DEB(printk("ipi:write 0x%x to 0x%x length:%d\n",&buf,ptr,count));
967 +       memcpy(ptr,buf,count);
968 +       consistent_sync(ptr,count, DMA_TO_DEVICE);
969 +       //hw_memcpy(ptr,&buf,count);
970 +
971 +/*     if(count>SRAM_SIZE){
972 +               for(i=0;i<(count/SRAM_SIZE);i++)
973 +                       raid_memcpy(ptr+i*SRAM_SIZE,buf+i*SRAM_SIZE,SRAM_SIZE);
974 +               if(count%SRAM_SIZE)
975 +                       raid_memcpy(ptr+i*SRAM_SIZE,buf+i*SRAM_SIZE,count%SRAM_SIZE);
976 +       }
977 +       else
978 +               raid_memcpy(ptr,buf,count);
979 +*/
980 +
981 +/*     for(i=0;i<count;i++){
982 +               if(buf[i]!=ptr[i])
983 +                       printk("ipi error:offset %d valud %x[should %x]\n",i,ptr[i],buf[i]);
984 +       }
985 +
986 +       printk("===========input buf===============\n");
987 +       for(i=0;i<64;i+=16){
988 +               for(j=0;j<16;j++)
989 +                       printk("%02x ",buf[i+j]);
990 +               printk("\n");
991 +               cond_resched();
992 +       }
993 +       printk("===========output buf==============\n");
994 +       for(i=0;i<64;i+=16){
995 +               for(j=0;j<16;j++)
996 +                       printk("%02x ",ptr[i+j]);
997 +               printk("\n");
998 +               cond_resched();
999 +       }
1000 +*/
1001 +       // send irq for CPU1
1002 +       tmp |= CPU_IPI_BIT_MASK;
1003 +       writel(tmp,CPU0_STATUS);
1004 +       jscale_status = JSCALE_BUSY;
1005 +
1006 +       return count;
1007 +}
1008 +
1009 +static ssize_t gemini_ipi_read(struct file * file_p, char *buf, size_t length, loff_t * ppos)
1010 +{
1011 +       int i=0;
1012 +       const char *ptr=(unsigned int )__phys_to_virt(CPU_1_MEM_BASE+CPU_1_DATA_OFFSET);
1013 +
1014 +       consistent_sync(ptr,length, DMA_FROM_DEVICE);
1015 +       memcpy(buf,ptr,length);
1016 +       DEB(printk("ipi:read 0x%x to 0x%x length:%d\n",ptr,buf,length));
1017 +
1018 +       //consistent_sync((unsigned int *)ptr,0x2000, DMA_FROM_DEVICE);         // invalid
1019 +       //hw_memcpy(buf,ptr,length);
1020 +
1021 +       // need encoded file size ********
1022 +/*     if(count>SRAM_SIZE){
1023 +               for(i=0;i<(count/SRAM_SIZE);i++)
1024 +                       raid_memcpy(buf+i*SRAM_SIZE,p_mbox->message+i*SRAM_SIZE,SRAM_SIZE);
1025 +               if(count%0xFFFF)
1026 +                       raid_memcpy(buf+i*SRAM_SIZE,p_mbox->message+i*SRAM_SIZE,length%SRAM_SIZE);
1027 +       }
1028 +       else
1029 +               raid_memcpy(buf,p_mbox->message,length);
1030 +*/
1031 +       return length;
1032 +}
1033 +
1034 +void do_mapping_read(struct address_space *mapping,
1035 +                            struct file_ra_state *_ra,
1036 +                            struct file *filp,
1037 +                            loff_t *ppos,
1038 +                            read_descriptor_t *desc,
1039 +                            read_actor_t actor)
1040 +{
1041 +       struct inode *inode = mapping->host;
1042 +       unsigned long index;
1043 +       unsigned long end_index;
1044 +       unsigned long offset;
1045 +       unsigned long last_index;
1046 +       unsigned long next_index;
1047 +       unsigned long prev_index;
1048 +       loff_t isize;
1049 +       struct page *cached_page;
1050 +       int error;
1051 +       struct file_ra_state ra = *_ra;
1052 +
1053 +       cached_page = NULL;
1054 +       index = *ppos >> PAGE_CACHE_SHIFT;
1055 +       next_index = index;
1056 +       prev_index = ra.prev_page;
1057 +       last_index = (*ppos + desc->count + PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT;
1058 +       offset = *ppos & ~PAGE_CACHE_MASK;
1059 +
1060 +       isize = i_size_read(inode);
1061 +       if (!isize)
1062 +               goto out;
1063 +
1064 +       end_index = (isize - 1) >> PAGE_CACHE_SHIFT;
1065 +       for (;;) {
1066 +               struct page *page;
1067 +               unsigned long nr, ret;
1068 +
1069 +               /* nr is the maximum number of bytes to copy from this page */
1070 +               nr = PAGE_CACHE_SIZE;
1071 +               if (index >= end_index) {
1072 +                       if (index > end_index)
1073 +                               goto out;
1074 +                       nr = ((isize - 1) & ~PAGE_CACHE_MASK) + 1;
1075 +                       if (nr <= offset) {
1076 +                               goto out;
1077 +                       }
1078 +               }
1079 +               nr = nr - offset;
1080 +
1081 +               cond_resched();
1082 +               if (index == next_index)
1083 +                       next_index = page_cache_readahead(mapping, &ra, filp,
1084 +                                       index, last_index - index);
1085 +
1086 +find_page:
1087 +               page = find_get_page(mapping, index);
1088 +               if (unlikely(page == NULL)) {
1089 +                       handle_ra_miss(mapping, &ra, index);
1090 +                       goto no_cached_page;
1091 +               }
1092 +               if (!PageUptodate(page))
1093 +                       goto page_not_up_to_date;
1094 +page_ok:
1095 +
1096 +               /* If users can be writing to this page using arbitrary
1097 +                * virtual addresses, take care about potential aliasing
1098 +                * before reading the page on the kernel side.
1099 +                */
1100 +               if (mapping_writably_mapped(mapping))
1101 +                       flush_dcache_page(page);
1102 +
1103 +               /*
1104 +                * When (part of) the same page is read multiple times
1105 +                * in succession, only mark it as accessed the first time.
1106 +                */
1107 +               if (prev_index != index)
1108 +                       mark_page_accessed(page);
1109 +               prev_index = index;
1110 +
1111 +               /*
1112 +                * Ok, we have the page, and it's up-to-date, so
1113 +                * now we can copy it to user space...
1114 +                *
1115 +                * The actor routine returns how many bytes were actually used..
1116 +                * NOTE! This may not be the same as how much of a user buffer
1117 +                * we filled up (we may be padding etc), so we can only update
1118 +                * "pos" here (the actor routine has to update the user buffer
1119 +                * pointers and the remaining count).
1120 +                */
1121 +               ret = actor(desc, page, offset, nr);
1122 +               offset += ret;
1123 +               index += offset >> PAGE_CACHE_SHIFT;
1124 +               offset &= ~PAGE_CACHE_MASK;
1125 +
1126 +               page_cache_release(page);
1127 +               if (ret == nr && desc->count)
1128 +                       continue;
1129 +               goto out;
1130 +
1131 +page_not_up_to_date:
1132 +               /* Get exclusive access to the page ... */
1133 +               lock_page(page);
1134 +
1135 +               /* Did it get unhashed before we got the lock? */
1136 +               if (!page->mapping) {
1137 +                       unlock_page(page);
1138 +                       page_cache_release(page);
1139 +                       continue;
1140 +               }
1141 +
1142 +               /* Did somebody else fill it already? */
1143 +               if (PageUptodate(page)) {
1144 +                       unlock_page(page);
1145 +                       goto page_ok;
1146 +               }
1147 +
1148 +readpage:
1149 +               /* Start the actual read. The read will unlock the page. */
1150 +               error = mapping->a_ops->readpage(filp, page);
1151 +
1152 +               if (unlikely(error))
1153 +                       goto readpage_error;
1154 +
1155 +               if (!PageUptodate(page)) {
1156 +                       lock_page(page);
1157 +                       if (!PageUptodate(page)) {
1158 +                               if (page->mapping == NULL) {
1159 +                                       /*
1160 +                                        * invalidate_inode_pages got it
1161 +                                        */
1162 +                                       unlock_page(page);
1163 +                                       page_cache_release(page);
1164 +                                       goto find_page;
1165 +                               }
1166 +                               unlock_page(page);
1167 +                               error = -EIO;
1168 +                               goto readpage_error;
1169 +                       }
1170 +                       unlock_page(page);
1171 +               }
1172 +
1173 +               /*
1174 +                * i_size must be checked after we have done ->readpage.
1175 +                *
1176 +                * Checking i_size after the readpage allows us to calculate
1177 +                * the correct value for "nr", which means the zero-filled
1178 +                * part of the page is not copied back to userspace (unless
1179 +                * another truncate extends the file - this is desired though).
1180 +                */
1181 +               isize = i_size_read(inode);
1182 +               end_index = (isize - 1) >> PAGE_CACHE_SHIFT;
1183 +               if (unlikely(!isize || index > end_index)) {
1184 +                       page_cache_release(page);
1185 +                       goto out;
1186 +               }
1187 +
1188 +               /* nr is the maximum number of bytes to copy from this page */
1189 +               nr = PAGE_CACHE_SIZE;
1190 +               if (index == end_index) {
1191 +                       nr = ((isize - 1) & ~PAGE_CACHE_MASK) + 1;
1192 +                       if (nr <= offset) {
1193 +                               page_cache_release(page);
1194 +                               goto out;
1195 +                       }
1196 +               }
1197 +               nr = nr - offset;
1198 +               goto page_ok;
1199 +
1200 +readpage_error:
1201 +               /* UHHUH! A synchronous read error occurred. Report it */
1202 +               desc->error = error;
1203 +               page_cache_release(page);
1204 +               goto out;
1205 +
1206 +no_cached_page:
1207 +               /*
1208 +                * Ok, it wasn't cached, so we need to create a new
1209 +                * page..
1210 +                */
1211 +               if (!cached_page) {
1212 +                       cached_page = page_cache_alloc_cold(mapping);
1213 +                       if (!cached_page) {
1214 +                               desc->error = -ENOMEM;
1215 +                               goto out;
1216 +                       }
1217 +               }
1218 +               error = add_to_page_cache_lru(cached_page, mapping,
1219 +                                               index, GFP_KERNEL);
1220 +               if (error) {
1221 +                       if (error == -EEXIST)
1222 +                               goto find_page;
1223 +                       desc->error = error;
1224 +                       goto out;
1225 +               }
1226 +               page = cached_page;
1227 +               cached_page = NULL;
1228 +               goto readpage;
1229 +       }
1230 +
1231 +out:
1232 +       *_ra = ra;
1233 +
1234 +       *ppos = ((loff_t) index << PAGE_CACHE_SHIFT) + offset;
1235 +       if (cached_page)
1236 +               page_cache_release(cached_page);
1237 +       if (filp)
1238 +               file_accessed(filp);
1239 +}
1240 +
1241 +int ipi_send_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size)
1242 +{
1243 +       ssize_t written;
1244 +       unsigned long count = desc->count;
1245 +       struct file *file = desc->arg.data;
1246 +       unsigned int *ptr_to=(unsigned int)__phys_to_virt(CPU_1_MEM_BASE+CPU_1_DATA_OFFSET) + desc->written;
1247 +       void *ptr_from;
1248 +
1249 +       if (size > count)
1250 +               size = count;
1251 +
1252 +       ptr_from = page_address(page)+offset;
1253 +       written = memcpy(ptr_to,ptr_from,size);
1254 +
1255 +       if (written < 0) {
1256 +               desc->error = written;
1257 +               written = 0;
1258 +       }
1259 +       desc->count = count - written;
1260 +       desc->written += written;
1261 +       return written;
1262 +}
1263 +
1264 +ssize_t gemini_ipi_sendfile(struct file *in_file, loff_t *ppos,
1265 +                        size_t count, read_actor_t actor, void *TARGET)
1266 +{
1267 +       read_descriptor_t desc;
1268 +
1269 +       if (!count)
1270 +               return 0;
1271 +
1272 +       desc.written = 0;
1273 +       desc.count = count;
1274 +       desc.arg.data = TARGET;
1275 +       desc.error = 0;
1276 +
1277 +       do_mapping_read(in_file->f_mapping,&in_file->f_ra,in_file, ppos, &desc, ipi_send_actor);
1278 +
1279 +       if (desc.written)
1280 +               return desc.written;
1281 +       return desc.error;
1282 +}
1283 +static struct file_operations gemini_ipi_fops = {
1284 +       .owner  =       THIS_MODULE,
1285 +       .ioctl  =       gemini_ipi_ioctl,
1286 +       .open   =       gemini_ipi_open,
1287 +       .release=       gemini_ipi_release,
1288 +       .write  =       gemini_ipi_write,
1289 +       .read   =       gemini_ipi_read,
1290 +       .sendfile = gemini_ipi_sendfile,
1291 +};
1292 +
1293 +#ifndef STORLINK_IPI
1294 +#define STORLINK_IPI   242             // Documents/devices.txt suggest to use 240~255 for local driver!!
1295 +#endif
1296 +
1297 +static struct miscdevice gemini_ipi_miscdev =
1298 +{
1299 +       STORLINK_IPI,
1300 +       "slave_ipc",
1301 +       &gemini_ipi_fops
1302 +};
1303 +
1304 +int __init sl_ipi_init(void)
1305 +{
1306 +
1307 +       printk("Gemini IPI Driver Initialization...\n");
1308 +       printk("REQ Head :0x%x(phy:0x%x)\n",(unsigned int)req,(unsigned int)SL2312_SRAM_BASE);
1309 +       printk("RSP Head :0x%x(phy:0x%x)\n",(unsigned int)rsp,(unsigned int)SL2312_SRAM_BASE+0x20);
1310 +       printk("Data buff:0x%x(phy:0x%x)\n",__phys_to_virt(CPU_1_MEM_BASE+CPU_1_DATA_OFFSET),CPU_1_MEM_BASE+CPU_1_DATA_OFFSET);
1311 +
1312 +       misc_register(&gemini_ipi_miscdev);
1313 +
1314 +       if (request_irq(IRQ_CPU0_IP_IRQ_OFFSET, ipi_interrupt, SA_INTERRUPT, "ipi", NULL))
1315 +               printk("Error: Register IRQ for Storlink IPI failed\n");
1316 +
1317 +       return 0;
1318 +}
1319 +
1320 +void __exit sl_ipi_exit(void)
1321 +{
1322 +
1323 +}
1324 +
1325 +module_init(sl_ipi_init);
1326 +module_exit(sl_ipi_exit);
1327 +
1328 +MODULE_AUTHOR("Jason Lee <jason@storlink.com.tw>");
1329 +MODULE_DESCRIPTION("Storlink IPI driver");
1330 +MODULE_LICENSE("GPL");
1331 --- /dev/null
1332 +++ b/arch/arm/mach-sl2312/hw_xor.h
1333 @@ -0,0 +1,573 @@
1334 +/*
1335 +*  linux/include/asm-arm/xor.h
1336 +*
1337 +*  Copyright (C) 2001 Storlink Semi.
1338 +*      Jason Lee <jason@storlink.com.tw>
1339 +*
1340 +*/
1341 +#include <asm/arch/sl2312.h>
1342 +#include <asm/io.h>
1343 +//#include <linux/compatmac.h>
1344 +
1345 +#undef BIG_ENDIAN
1346 +#define CPU            0
1347 +#define DMA            1
1348 +
1349 +#define DESC_NO        8
1350 +#define TX_DESC_NUM            DESC_NO
1351 +#define RX_DESC_NUM            DESC_NO
1352 +
1353 +#define RAID_BASE_ADDR IO_ADDRESS(SL2312_RAID_BASE)
1354 +
1355 +#define SRAM_PAR_0k            0
1356 +#define SRAM_PAR_4k            1
1357 +#define SRAM_PAR_8k            2
1358 +#define SRAM_PAR_16k           3
1359 +#define SRAM_PAR_SIZE  SRAM_PAR_8k
1360 +
1361 +#define RUNNING                0x1
1362 +#define COMPLETE       0x2
1363 +#define ERROR          0x4
1364 +
1365 +#define CMD_XOR                0x0
1366 +#define CMD_FILL       0x1
1367 +#define CMD_CPY                0x3
1368 +#define CMD_CHK                0x4
1369 +
1370 +enum RAID_DMA_REGISTER {
1371 +       RAID_DMA_DEVICE_ID              = 0xff00,
1372 +       RAID_DMA_STATUS                 = 0xff04,
1373 +       RAID_FCHDMA_CTRL                = 0xff08,
1374 +       RAID_FCHDMA_FIRST_DESC  = 0xff0C,
1375 +       RAID_FCHDMA_CURR_DESC   = 0xff10,
1376 +       RAID_STRDMA_CTRL                = 0xff14,
1377 +       RAID_STRDMA_FIRST_DESC  = 0xff18,
1378 +       RAID_STRDMA_CURR_DESC   = 0xff1C,
1379 +       RAID_TX_FLG_REG                 = 0xff24,
1380 +       RAID_RX_FLG_REG                 = 0xff34,
1381 +       RAID_PCR                                = 0xff50,
1382 +       SMC_CMD_REG                             = 0xff60,
1383 +       SMC_STATUS_REG                  = 0xff64
1384 +       };
1385 +
1386 +enum RAID_FUNC_MODE {
1387 +       RAID_XOR                        = 0,
1388 +       RAID_MIX                        = 2,
1389 +       RAID_SRAM                       = 3,
1390 +       RAID_ENDIAN                     = 4,
1391 +       RAID_MEM_BLK            = 5,
1392 +       RAID_MEM2MEM            = 7,
1393 +       RAID_BUF_SIZE           = 8,
1394 +       RAID_ERR_TEST           = 9,
1395 +       RAID_BURST                      = 10,
1396 +       RAID_BUS                        = 11
1397 +       };
1398 +
1399 +typedef struct reg_info {
1400 +       int mask;
1401 +       char err[32];
1402 +       int offset;
1403 +} REG_INFO;
1404 +
1405 +/********************************************************/
1406 +/*     the definition of RAID DMA Module Register      */
1407 +/********************************************************/
1408 +typedef union
1409 +{
1410 +       unsigned int bit32;
1411 +       struct bits_ff00
1412 +       {
1413 +               #ifdef BIG_ENDIAN
1414 +               unsigned int                            : 8;
1415 +               unsigned int teytPerr           : 4; /* define protocol error under tsPErrI*/
1416 +               unsigned int reytPerr           : 14; /* define protocol error under rsPErrI */
1417 +               unsigned int device_id          : 12;
1418 +               unsigned int revision_id        : 4;
1419 +               #else
1420 +               unsigned int revision_id        : 4;
1421 +               unsigned int device_id          : 12;
1422 +               unsigned int reytPerr           : 14; /* define protocol error under rsPErrI */
1423 +               unsigned int teytPerr           : 4; /* define protocol error under tsPErrI*/
1424 +               unsigned int                            : 8;
1425 +               #endif
1426 +       } bits;
1427 +} RAID_DMA_DEVICE_ID_T;
1428 +
1429 +typedef union
1430 +{
1431 +       unsigned int bits32;
1432 +       struct bits_ff04
1433 +       {
1434 +               #ifdef BIG_ENDIAN
1435 +               unsigned int tsFinishI          : 1; /* owner bit error interrupt */
1436 +               unsigned int tsDErrI            : 1; /* AHB bus error interrupt */
1437 +               unsigned int tsPErrI            : 1; /* RAID XOR fetch descriptor protocol error interrupt */
1438 +               unsigned int tsEODI                     : 1; /* RAID XOR fetch DMA end of descriptor interrupt */
1439 +               unsigned int tsEOFI                     : 1; /* RAID XOR fetch DMA end of frame interrupt */
1440 +               unsigned int rsFinishI          : 1; /* owner bit error interrupt */
1441 +               unsigned int rsDErrI            : 1; /* AHB bus error while RAID XOR store interrupt */
1442 +               unsigned int rsPErrI            : 1; /* RAID XOR store descriptor protocol error interrupt */
1443 +               unsigned int rsEODI                     : 1; /* RAID XOR store DMA end of descriptor interrupt */
1444 +               unsigned int rsEOFI                     : 1; /* RAID XOR store DMA end of frame interrupt */
1445 +               unsigned int inter                      : 8; /* pattern check error interrupt */
1446 +               unsigned int                            : 5;
1447 +               unsigned int Loopback           : 1; /* loopback */
1448 +               unsigned int intEnable          : 8; /*pattern check error interrupt enable */
1449 +               #else
1450 +               unsigned int intEnable          : 8; /*pattern check error interrupt enable */
1451 +               unsigned int Loopback           : 1; /* loopback */
1452 +               unsigned int                            : 5;
1453 +               unsigned int inter                      : 8; /* pattern check error interrupt */
1454 +               unsigned int rsEOFI                     : 1; /* RAID XOR store DMA end of frame interrupt */
1455 +               unsigned int rsEODI                     : 1; /* RAID XOR store DMA end of descriptor interrupt */
1456 +               unsigned int rsPErrI            : 1; /* RAID XOR store descriptor protocol error interrupt */
1457 +               unsigned int rsDErrI            : 1; /* AHB bus error while RAID XOR store interrupt */
1458 +               unsigned int rsFinishI          : 1; /* owner bit error interrupt */
1459 +               unsigned int tsEOFI                     : 1; /* RAID XOR fetch DMA end of frame interrupt */
1460 +               unsigned int tsEODI                     : 1; /* RAID XOR fetch DMA end of descriptor interrupt */
1461 +               unsigned int tsPErrI            : 1; /* RAID XOR fetch descriptor protocol error interrupt */
1462 +               unsigned int tsDErrI            : 1; /* AHB bus error interrupt */
1463 +               unsigned int tsFinishI          : 1; /* owner bit error interrupt */
1464 +               #endif
1465 +       } bits;
1466 +} RAID_DMA_STATUS_T;
1467 +
1468 +
1469 +typedef union
1470 +{
1471 +       unsigned int bits32;
1472 +       struct bits_ff08
1473 +       {
1474 +               #ifdef BIG_ENDIAN
1475 +               unsigned int td_start           :  1;   /* Start DMA transfer */
1476 +               unsigned int td_continue        :  1;   /* Continue DMA operation */
1477 +               unsigned int td_chain_mode      :  1;   /* Descriptor Chain Mode;1-Descriptor Chain mode, 0-Direct DMA mode*/
1478 +               unsigned int                            :  1;
1479 +               unsigned int td_prot            :  4;   /* DMA protection control */
1480 +               unsigned int td_burst_size  :  2;       /* DMA max burst size for every AHB request */
1481 +               unsigned int td_bus                 :  2;       /* peripheral bus width */
1482 +               unsigned int td_endian          :  1;   /* AHB Endian. 0-little endian; 1-big endian */
1483 +               unsigned int td_finish_en   :  1;       /* DMA Finish Event Interrupt Enable;1-enable;0-mask */
1484 +               unsigned int td_fail_en         :  1;   /* DMA Fail Interrupt Enable;1-enable;0-mask */
1485 +               unsigned int td_perr_en         :  1;   /* Protocol Failure Interrupt Enable;1-enable;0-mask */
1486 +               unsigned int td_eod_en          :  1;   /* End of Descriptor interrupt Enable;1-enable;0-mask */
1487 +               unsigned int td_eof_en      :  1;   /* End of frame interrupt Enable;1-enable;0-mask */
1488 +               unsigned int                            : 14;
1489 +               #else
1490 +               unsigned int                            : 14;
1491 +               unsigned int td_eof_en      :  1;   /* End of frame interrupt Enable;1-enable;0-mask */
1492 +               unsigned int td_eod_en          :  1;   /* End of Descriptor interrupt Enable;1-enable;0-mask */
1493 +               unsigned int td_perr_en         :  1;   /* Protocol Failure Interrupt Enable;1-enable;0-mask */
1494 +               unsigned int td_fail_en         :  1;   /* DMA Fail Interrupt Enable;1-enable;0-mask */
1495 +               unsigned int td_finish_en   :  1;       /* DMA Finish Event Interrupt Enable;1-enable;0-mask */
1496 +               unsigned int td_endian          :  1;   /* AHB Endian. 0-little endian; 1-big endian */
1497 +               unsigned int td_bus                 :  2;       /* peripheral bus width;0 - 8 bits;1 - 16 bits */
1498 +               unsigned int td_burst_size  :  2;       /* TxDMA max burst size for every AHB request */
1499 +               unsigned int td_prot            :  4;   /* TxDMA protection control */
1500 +               unsigned int                            :  1;
1501 +               unsigned int td_chain_mode      :  1;   /* Descriptor Chain Mode;1-Descriptor Chain mode, 0-Direct DMA mode*/
1502 +               unsigned int td_continue        :  1;   /* Continue DMA operation */
1503 +               unsigned int td_start           :  1;   /* Start DMA transfer */
1504 +               #endif
1505 +       } bits;
1506 +} RAID_TXDMA_CTRL_T;
1507 +
1508 +typedef union
1509 +{
1510 +       unsigned int bits32;
1511 +       struct bits_ff0c
1512 +       {
1513 +               #ifdef BIG_ENDIAN
1514 +               unsigned int td_first_des_ptr   : 28;/* first descriptor address */
1515 +               unsigned int td_busy                    :  1;/* 1-TxDMA busy; 0-TxDMA idle */
1516 +               unsigned int                                    :  3;
1517 +               #else
1518 +               unsigned int                                    :  3;
1519 +               unsigned int td_busy                    :  1;/* 1-TxDMA busy; 0-TxDMA idle */
1520 +               unsigned int td_first_des_ptr   : 28;/* first descriptor address */
1521 +               #endif
1522 +       } bits;
1523 +} RAID_TXDMA_FIRST_DESC_T;
1524 +
1525 +typedef union
1526 +{
1527 +       unsigned int bits32;
1528 +       struct bits_ff10
1529 +       {
1530 +               #ifdef BIG_ENDIAN
1531 +               unsigned int ndar                       : 28;   /* next descriptor address */
1532 +               unsigned int eofie                      :  1;   /* end of frame interrupt enable */
1533 +               unsigned int                            :  1;
1534 +               unsigned int sof_eof            :  2;
1535 +               #else
1536 +               unsigned int sof_eof            :  2;
1537 +               unsigned int                            :  1;
1538 +               unsigned int eofie                      :  1;   /* end of frame interrupt enable */
1539 +               unsigned int ndar                       : 28;   /* next descriptor address */
1540 +               #endif
1541 +       } bits;
1542 +} RAID_TXDMA_CURR_DESC_T;
1543 +
1544 +typedef union
1545 +{
1546 +       unsigned int bits32;
1547 +       struct bits_ff14
1548 +       {
1549 +               #ifdef BIG_ENDIAN
1550 +               unsigned int rd_start           :  1;   /* Start DMA transfer */
1551 +               unsigned int rd_continue        :  1;   /* Continue DMA operation */
1552 +               unsigned int rd_chain_mode      :  1;   /* Descriptor Chain Mode;1-Descriptor Chain mode, 0-Direct DMA mode*/
1553 +               unsigned int                            :  1;
1554 +               unsigned int rd_prot            :  4;   /* DMA protection control */
1555 +               unsigned int rd_burst_size  :  2;       /* DMA max burst size for every AHB request */
1556 +               unsigned int rd_bus                 :  2;       /* peripheral bus width;0 - 8 bits;1 - 16 bits */
1557 +               unsigned int rd_endian          :  1;   /* AHB Endian. 0-little endian; 1-big endian */
1558 +               unsigned int rd_finish_en   :  1;       /* DMA Finish Event Interrupt Enable;1-enable;0-mask */
1559 +               unsigned int rd_fail_en         :  1;   /* DMA Fail Interrupt Enable;1-enable;0-mask */
1560 +               unsigned int rd_perr_en         :  1;   /* Protocol Failure Interrupt Enable;1-enable;0-mask */
1561 +               unsigned int rd_eod_en          :  1;   /* End of Descriptor interrupt Enable;1-enable;0-mask */
1562 +               unsigned int rd_eof_en      :  1;   /* End of frame interrupt Enable;1-enable;0-mask */
1563 +               unsigned int                            : 14;
1564 +               #else
1565 +               unsigned int                            : 14;
1566 +               unsigned int rd_eof_en      :  1;   /* End of frame interrupt Enable;1-enable;0-mask */
1567 +               unsigned int rd_eod_en          :  1;   /* End of Descriptor interrupt Enable;1-enable;0-mask */
1568 +               unsigned int rd_perr_en         :  1;   /* Protocol Failure Interrupt Enable;1-enable;0-mask */
1569 +               unsigned int rd_fail_en         :  1;   /* DMA Fail Interrupt Enable;1-enable;0-mask */
1570 +               unsigned int rd_finish_en   :  1;       /* DMA Finish Event Interrupt Enable;1-enable;0-mask */
1571 +               unsigned int rd_endian          :  1;   /* AHB Endian. 0-little endian; 1-big endian */
1572 +               unsigned int rd_bus                 :  2;       /* peripheral bus width;0 - 8 bits;1 - 16 bits */
1573 +               unsigned int rd_burst_size  :  2;       /* DMA max burst size for every AHB request */
1574 +               unsigned int rd_prot            :  4;   /* DMA protection control */
1575 +               unsigned int                            :  1;
1576 +               unsigned int rd_chain_mode      :  1;   /* Descriptor Chain Mode;1-Descriptor Chain mode, 0-Direct DMA mode*/
1577 +               unsigned int rd_continue        :  1;   /* Continue DMA operation */
1578 +               unsigned int rd_start           :  1;   /* Start DMA transfer */
1579 +               #endif
1580 +       } bits;
1581 +} RAID_RXDMA_CTRL_T;
1582 +
1583 +typedef union
1584 +{
1585 +       unsigned int bits32;
1586 +       struct bits_ff18
1587 +       {
1588 +               #ifdef BIG_ENDIAN
1589 +               unsigned int rd_first_des_ptr   : 28;/* first descriptor address */
1590 +               unsigned int rd_busy                    :  1;/* 1-RxDMA busy; 0-RxDMA idle */
1591 +               unsigned int                                    :  3;
1592 +               #else
1593 +               unsigned int                                    :  3;
1594 +               unsigned int rd_busy                    :  1;/* 1-RxDMA busy; 0-RxDMA idle */
1595 +               unsigned int rd_first_des_ptr   : 28;/* first descriptor address */
1596 +               #endif
1597 +       } bits;
1598 +} RAID_RXDMA_FIRST_DESC_T;
1599 +
1600 +typedef union
1601 +{
1602 +       unsigned int bits32;
1603 +       struct bits_ff1c
1604 +       {
1605 +               #ifdef BIG_ENDIAN
1606 +               unsigned int ndar                       : 28;   /* next descriptor address */
1607 +               unsigned int eofie                      :  1;   /* end of frame interrupt enable */
1608 +               unsigned int dec                        :  1;   /* AHB bus address increment(0)/decrement(1) */
1609 +               unsigned int sof_eof            :  2;
1610 +               #else
1611 +               unsigned int sof_eof            :  2;
1612 +               unsigned int dec                        :  1;   /* AHB bus address increment(0)/decrement(1) */
1613 +               unsigned int eofie                      :  1;   /* end of frame interrupt enable */
1614 +               unsigned int ndar                       : 28;   /* next descriptor address */
1615 +               #endif
1616 +       } bits;
1617 +} RAID_RXDMA_CURR_DESC_T;
1618 +
1619 +typedef union
1620 +{
1621 +       unsigned int bit32;
1622 +       struct bits_ff50
1623 +       {
1624 +               unsigned int pat                        : 32; /* data for pattern check */
1625 +       } bits;
1626 +} RAID_PACR_T;
1627 +
1628 +/******************************************************/
1629 +/*     the definition of DMA Descriptor Register     */
1630 +/******************************************************/
1631 +typedef struct raid_descriptor_t
1632 +{
1633 +       union func_ctrl_t
1634 +       {
1635 +               unsigned int bit32;
1636 +               struct bits_0000
1637 +               {
1638 +                       #ifdef BIG_ENDIAN
1639 +                       unsigned int own                                : 1; /* owner bit */
1640 +                       unsigned int derr                               : 1;    /* data error during processing this descriptor */
1641 +                       unsigned int perr                               : 1;    /* protocol error during processing this descriptor */
1642 +                       unsigned int raid_ctrl_status   : 7; /* pass RAID XOR fetch/store control status to CPU */
1643 +                       unsigned int desc_cnt                   : 6;
1644 +                       unsigned int buffer_size                : 16;   /* transfer buffer size associated with current description*/
1645 +                       #else
1646 +                       unsigned int buffer_size                : 16;   /* transfer buffer size associated with current description*/
1647 +                       unsigned int desc_cnt                   : 6;
1648 +                       unsigned int raid_ctrl_status   : 7; /* pass RAID XOR fetch/store control status to CPU */
1649 +                       unsigned int perr                               : 1;    /* protocol error during processing this descriptor */
1650 +                       unsigned int derr                               : 1;    /* data error during processing this descriptor */
1651 +                       unsigned int own                                : 1; /* owner bit */
1652 +                       #endif
1653 +               } bits;
1654 +       } func_ctrl;
1655 +
1656 +       union flg_status_t
1657 +       {
1658 +               unsigned int bits32;
1659 +               struct bit_004
1660 +               {
1661 +                       #ifdef BIG_ENDIAN
1662 +                       unsigned int bcc                : 16;
1663 +                       unsigned int                    : 13
1664 +                       unsigned int mode               : 3;
1665 +                       #else
1666 +                       unsigned int mode               : 3;
1667 +                       unsigned int                    : 13;
1668 +                       unsigned int bcc                : 16;
1669 +                       #endif
1670 +               } bits_cmd_status;
1671 +       } flg_status;  //Sanders
1672 +
1673 +       unsigned int buf_addr;
1674 +
1675 +       union next_desc_addr_t
1676 +       {
1677 +               unsigned int bits32;
1678 +               struct bits_000c
1679 +               {
1680 +                       #ifdef BIG_ENDIAN
1681 +                       unsigned int ndar               : 28; /* next descriptor address */
1682 +                       unsigned int eofie              : 1; /* end of frame interrupt enable */
1683 +                       unsigned int                    : 1;
1684 +                       unsigned int sof_eof    : 2; /* the position of the descriptor in chain */
1685 +                       #else
1686 +                       unsigned int sof_eof    : 2; /* the position of the descriptor in chain */
1687 +                       unsigned int                    : 1;
1688 +                       unsigned int eofie              : 1; /* end of frame interrupt enable */
1689 +                       unsigned int ndar               : 28; /* next descriptor address */
1690 +                       #endif
1691 +               } bits;
1692 +       } next_desc_addr;
1693 +} RAID_DESCRIPTOR_T;
1694 +
1695 +/******************************************************/
1696 +/*     the offset of RAID SMC register               */
1697 +/******************************************************/
1698 +enum RAID_SMC_REGISTER {
1699 +       RAID_SMC_CMD_REG                = 0xff60,
1700 +       RAID_SMC_STATUS_REG             = 0xff64
1701 +       };
1702 +
1703 +/******************************************************/
1704 +/*     the definition of RAID SMC module register    */
1705 +/******************************************************/
1706 +typedef union
1707 +{
1708 +       unsigned int bits32;
1709 +       struct bits_ff60
1710 +       {
1711 +               #ifdef BIG_ENDIAN
1712 +               unsigned int pat_mode           : 2; /* partition mode selection */
1713 +               unsigned int                            : 14;
1714 +               unsigned int device_id          : 12;
1715 +               unsigned int revision_id        : 4;
1716 +               #else
1717 +               unsigned int revision_id        : 4;
1718 +               unsigned int device_id          : 12;
1719 +               unsigned int                            : 14;
1720 +               unsigned int pat_mode           : 2; /* partition mode selection */
1721 +               #endif
1722 +       } bits;
1723 +} RAID_SMC_CMD;
1724 +
1725 +typedef union
1726 +{
1727 +       unsigned int bits32;
1728 +       struct bits_ff64
1729 +       {
1730 +               #ifdef BIG_ENDIAN
1731 +               unsigned int addr_err1          : 1; /* address is out of range for controller 1 */
1732 +               unsigned int ahb_err1           : 1; /* AHB bus error for controller 1 */
1733 +               unsigned int                            : 14;
1734 +               unsigned int addr_err2          : 1;    /* address is out of range for controller 2 */
1735 +               unsigned int ahb_err2           : 1; /* AHB bus error for controller 2 */
1736 +               unsigned int                            : 14;
1737 +               #else
1738 +               unsigned int                            : 14;
1739 +               unsigned int ahb_err2           : 1; /* AHB bus error for controller 2 */
1740 +               unsigned int addr_err2          : 1;    /* address is out of range for controller 2 */
1741 +               unsigned int                            : 14;
1742 +               unsigned int ahb_err1           : 1; /* AHB bus error for controller 1 */
1743 +               unsigned int addr_err1          : 1; /* address is out of range for controller 1 */
1744 +               #endif
1745 +       } bits;
1746 +} RAID_SMC_STATUS;
1747 +
1748 +typedef struct RAID_S
1749 +{
1750 +       const char *device_name;
1751 +       wait_queue_head_t wait;
1752 +       unsigned int busy;
1753 +       int irq;
1754 +       unsigned int status;
1755 +       RAID_DESCRIPTOR_T *tx_desc;  /*   point to virtual TX descriptor address */
1756 +       RAID_DESCRIPTOR_T *rx_desc;  /* point ot virtual RX descriptor address */
1757 +       RAID_DESCRIPTOR_T *tx_cur_desc; /* current TX descriptor */
1758 +       RAID_DESCRIPTOR_T *rx_cur_desc; /* current RX descriptor */
1759 +       RAID_DESCRIPTOR_T *tx_finished_desc;
1760 +       RAID_DESCRIPTOR_T *rx_finished_desc;
1761 +       RAID_DESCRIPTOR_T *tx_first_desc;
1762 +       RAID_DESCRIPTOR_T *rx_first_desc;
1763 +
1764 +//     unsigned int *tx_buf[TX_DESC_NUM];
1765 +       unsigned int *rx_desc_dma;                      // physical address of rx_descript
1766 +       unsigned int *tx_desc_dma;                      // physical address of tx_descript
1767 +       unsigned int *rx_bufs_dma;
1768 +       unsigned int *tx_bufs_dma;
1769 +
1770 +} RAID_T;
1771 +
1772 +struct reg_ioctl
1773 +{
1774 +       unsigned int reg_addr;
1775 +       unsigned int val_in;
1776 +       unsigned int val_out;
1777 +};
1778 +
1779 +typedef struct dma_ctrl {
1780 +       int sram;
1781 +       int prot;
1782 +       int burst;
1783 +       int bus;
1784 +       int endian;
1785 +       int mode;
1786 +} DMA_CTRL;
1787 +
1788 +
1789 +#ifdef XOR_SW_FILL_IN
1790 +
1791 +#define __XOR(a1, a2) a1 ^= a2
1792 +
1793 +#define GET_BLOCK_2(dst) \
1794 +       __asm__("ldmia  %0, {%1, %2}" \
1795 +               : "=r" (dst), "=r" (a1), "=r" (a2) \
1796 +               : "0" (dst))
1797 +
1798 +#define GET_BLOCK_4(dst) \
1799 +       __asm__("ldmia  %0, {%1, %2, %3, %4}" \
1800 +               : "=r" (dst), "=r" (a1), "=r" (a2), "=r" (a3), "=r" (a4) \
1801 +               : "0" (dst))
1802 +
1803 +#define XOR_BLOCK_2(src) \
1804 +       __asm__("ldmia  %0!, {%1, %2}" \
1805 +               : "=r" (src), "=r" (b1), "=r" (b2) \
1806 +               : "0" (src)); \
1807 +       __XOR(a1, b1); __XOR(a2, b2);
1808 +
1809 +#define XOR_BLOCK_4(src) \
1810 +       __asm__("ldmia  %0!, {%1, %2, %3, %4}" \
1811 +               : "=r" (src), "=r" (b1), "=r" (b2), "=r" (b3), "=r" (b4) \
1812 +               : "0" (src)); \
1813 +       __XOR(a1, b1); __XOR(a2, b2); __XOR(a3, b3); __XOR(a4, b4)
1814 +
1815 +#define PUT_BLOCK_2(dst) \
1816 +       __asm__ __volatile__("stmia     %0!, {%2, %3}" \
1817 +               : "=r" (dst) \
1818 +               : "0" (dst), "r" (a1), "r" (a2))
1819 +
1820 +#define PUT_BLOCK_4(dst) \
1821 +       __asm__ __volatile__("stmia     %0!, {%2, %3, %4, %5}" \
1822 +               : "=r" (dst) \
1823 +               : "0" (dst), "r" (a1), "r" (a2), "r" (a3), "r" (a4))
1824 +
1825 +static void
1826 +xor_arm4regs_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
1827 +{
1828 +       unsigned int lines = bytes / sizeof(unsigned long) / 4;
1829 +       register unsigned int a1 __asm__("r4");
1830 +       register unsigned int a2 __asm__("r5");
1831 +       register unsigned int a3 __asm__("r6");
1832 +       register unsigned int a4 __asm__("r7");
1833 +       register unsigned int b1 __asm__("r8");
1834 +       register unsigned int b2 __asm__("r9");
1835 +       register unsigned int b3 __asm__("ip");
1836 +       register unsigned int b4 __asm__("lr");
1837 +
1838 +       do {
1839 +               GET_BLOCK_4(p1);
1840 +               XOR_BLOCK_4(p2);
1841 +               PUT_BLOCK_4(p1);
1842 +       } while (--lines);
1843 +}
1844 +
1845 +static void
1846 +xor_arm4regs_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
1847 +               unsigned long *p3)
1848 +{
1849 +       unsigned int lines = bytes / sizeof(unsigned long) / 4;
1850 +       register unsigned int a1 __asm__("r4");
1851 +       register unsigned int a2 __asm__("r5");
1852 +       register unsigned int a3 __asm__("r6");
1853 +       register unsigned int a4 __asm__("r7");
1854 +       register unsigned int b1 __asm__("r8");
1855 +       register unsigned int b2 __asm__("r9");
1856 +       register unsigned int b3 __asm__("ip");
1857 +       register unsigned int b4 __asm__("lr");
1858 +
1859 +       do {
1860 +               GET_BLOCK_4(p1);
1861 +               XOR_BLOCK_4(p2);
1862 +               XOR_BLOCK_4(p3);
1863 +               PUT_BLOCK_4(p1);
1864 +       } while (--lines);
1865 +}
1866 +
1867 +static void
1868 +xor_arm4regs_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
1869 +               unsigned long *p3, unsigned long *p4)
1870 +{
1871 +       unsigned int lines = bytes / sizeof(unsigned long) / 2;
1872 +       register unsigned int a1 __asm__("r8");
1873 +       register unsigned int a2 __asm__("r9");
1874 +       register unsigned int b1 __asm__("ip");
1875 +       register unsigned int b2 __asm__("lr");
1876 +
1877 +       do {
1878 +               GET_BLOCK_2(p1);
1879 +               XOR_BLOCK_2(p2);
1880 +               XOR_BLOCK_2(p3);
1881 +               XOR_BLOCK_2(p4);
1882 +               PUT_BLOCK_2(p1);
1883 +       } while (--lines);
1884 +}
1885 +
1886 +static void
1887 +xor_arm4regs_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
1888 +               unsigned long *p3, unsigned long *p4, unsigned long *p5)
1889 +{
1890 +       unsigned int lines = bytes / sizeof(unsigned long) / 2;
1891 +       register unsigned int a1 __asm__("r8");
1892 +       register unsigned int a2 __asm__("r9");
1893 +       register unsigned int b1 __asm__("ip");
1894 +       register unsigned int b2 __asm__("lr");
1895 +
1896 +       do {
1897 +               GET_BLOCK_2(p1);
1898 +               XOR_BLOCK_2(p2);
1899 +               XOR_BLOCK_2(p3);
1900 +               XOR_BLOCK_2(p4);
1901 +               XOR_BLOCK_2(p5);
1902 +               PUT_BLOCK_2(p1);
1903 +       } while (--lines);
1904 +}
1905 +#endif //XOR_SW_FILL_IN
1906 +
1907 --- /dev/null
1908 +++ b/arch/arm/mach-sl2312/irq.c
1909 @@ -0,0 +1,202 @@
1910 +/*
1911 + *  linux/arch/arm/mach-epxa10db/irq.c
1912 + *
1913 + *  Copyright (C) 2001 Altera Corporation
1914 + *
1915 + * This program is free software; you can redistribute it and/or modify
1916 + * it under the terms of the GNU General Public License as published by
1917 + * the Free Software Foundation; either version 2 of the License, or
1918 + * (at your option) any later version.
1919 + *
1920 + * This program is distributed in the hope that it will be useful,
1921 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1922 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1923 + * GNU General Public License for more details.
1924 + *
1925 + * You should have received a copy of the GNU General Public License
1926 + * along with this program; if not, write to the Free Software
1927 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1928 + */
1929 +#include <linux/init.h>
1930 +#include <linux/ioport.h>
1931 +#include <linux/stddef.h>
1932 +#include <linux/list.h>
1933 +#include <linux/sched.h>
1934 +#include <asm/hardware.h>
1935 +#include <asm/irq.h>
1936 +#include <asm/io.h>
1937 +#include <asm/mach/irq.h>
1938 +#include <asm/arch/platform.h>
1939 +#include <asm/arch/int_ctrl.h>
1940 +
1941 +#ifdef CONFIG_PCI
1942 +#include <asm/arch/pci.h>
1943 +#endif
1944 +
1945 +int fixup_irq(unsigned int irq)
1946 +{
1947 +#ifdef CONFIG_PCI
1948 +       if (irq == IRQ_PCI) {
1949 +               return sl2312_pci_get_int_src();
1950 +       }
1951 +#endif
1952 +       return irq;
1953 +}
1954 +
1955 +static void sl2312_ack_irq(unsigned int irq)
1956 +{
1957 +   __raw_writel(1 << irq, IRQ_CLEAR(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
1958 +}
1959 +
1960 +static void sl2312_mask_irq(unsigned int irq)
1961 +{
1962 +       unsigned int mask;
1963 +
1964 +#ifdef CONFIG_PCI
1965 +       if (irq >= PCI_IRQ_OFFSET)
1966 +       {
1967 +               mask = __raw_readl(IRQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
1968 +               mask &= ~IRQ_PCI_MASK ;
1969 +               __raw_writel(mask, IRQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
1970 +               sl2312_pci_mask_irq(irq - PCI_IRQ_OFFSET);
1971 +       }
1972 +       else
1973 +#endif
1974 +       if(irq >= FIQ_OFFSET)
1975 +       {
1976 +           mask = __raw_readl(FIQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
1977 +           mask &= ~(1 << (irq - FIQ_OFFSET));
1978 +           __raw_writel(mask, FIQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
1979 +        }
1980 +        else
1981 +        {
1982 +           mask = __raw_readl(IRQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
1983 +           mask &= ~(1 << irq);
1984 +           __raw_writel(mask, IRQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
1985 +        }
1986 +
1987 +}
1988 +
1989 +static void sl2312_unmask_irq(unsigned int irq)
1990 +{
1991 +       unsigned int mask;
1992 +
1993 +#ifdef CONFIG_PCI
1994 +       if (irq >= PCI_IRQ_OFFSET)
1995 +       {
1996 +               mask = __raw_readl(IRQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
1997 +               mask |= IRQ_PCI_MASK ;
1998 +               __raw_writel(mask, IRQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
1999 +               sl2312_pci_unmask_irq(irq - PCI_IRQ_OFFSET);
2000 +       }
2001 +       else
2002 +#endif
2003 +       if(irq >= FIQ_OFFSET)
2004 +        {
2005 +          mask = __raw_readl(FIQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
2006 +          mask |= (1 << (irq - FIQ_OFFSET));
2007 +          __raw_writel(mask, FIQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
2008 +       }
2009 +        else
2010 +        {
2011 +          mask = __raw_readl(IRQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
2012 +          mask |= (1 << irq);
2013 +          __raw_writel(mask, IRQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
2014 +        }
2015 +}
2016 +
2017 +static struct irq_chip sl2312_level_irq = {
2018 +        .ack            = sl2312_mask_irq,
2019 +        .mask           = sl2312_mask_irq,
2020 +        .unmask         = sl2312_unmask_irq,
2021 +//             .set_type       = ixp4xx_set_irq_type,
2022 +};
2023 +
2024 +static struct irq_chip sl2312_edge_irq = {
2025 +        .ack            = sl2312_ack_irq,
2026 +        .mask           = sl2312_mask_irq,
2027 +        .unmask         = sl2312_unmask_irq,
2028 +//             .set_type       = ixp4xx_set_irq_type,
2029 +};
2030 +
2031 +static struct resource irq_resource = {
2032 +        .name   = "irq_handler",
2033 +        .start  = IO_ADDRESS(SL2312_INTERRUPT_BASE),
2034 +        .end    = IO_ADDRESS(FIQ_STATUS(SL2312_INTERRUPT_BASE))+4,
2035 +};
2036 +
2037 +void __init sl2312_init_irq(void)
2038 +{
2039 +       unsigned int i, mode, level;
2040 +
2041 +    request_resource(&iomem_resource, &irq_resource);
2042 +
2043 +       for (i = 0; i < NR_IRQS; i++)
2044 +       {
2045 +           if((i>=IRQ_TIMER1 && i<=IRQ_TIMER3)||(i>=IRQ_SERIRQ0 && i<=IRQ_SERIRQ_MAX))
2046 +        {
2047 +               set_irq_chip(i, &sl2312_edge_irq);
2048 +               set_irq_handler(i, handle_edge_irq);
2049 +        }
2050 +           else
2051 +        {
2052 +               set_irq_chip(i, &sl2312_level_irq);
2053 +            set_irq_handler(i,handle_level_irq);
2054 +        }
2055 +        set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
2056 +       }
2057 +
2058 +       /* Disable all interrupt */
2059 +       __raw_writel(0,IRQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
2060 +       __raw_writel(0,FIQ_MASK(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
2061 +
2062 +       /* Set interrupt mode */
2063 +    /* emac & ipsec type is level trigger and high active */
2064 +    mode = __raw_readl(IRQ_TMODE(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
2065 +    level = __raw_readl(IRQ_TLEVEL(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
2066 +
2067 +       mode &= ~IRQ_GMAC0_MASK;
2068 +       level &= ~IRQ_GMAC0_MASK;
2069 +
2070 +       mode &= ~IRQ_GMAC1_MASK;
2071 +       level &= ~IRQ_GMAC1_MASK;
2072 +
2073 +       mode &= ~IRQ_IPSEC_MASK;
2074 +       level &= ~IRQ_IPSEC_MASK;
2075 +
2076 +       // for IDE0,1, high active and level trigger
2077 +       mode &= ~IRQ_IDE0_MASK;
2078 +       level &= ~IRQ_IDE0_MASK;
2079 +       mode &= ~IRQ_IDE1_MASK;
2080 +       level &= ~IRQ_IDE1_MASK;
2081 +
2082 +
2083 +       // for PCI, high active and level trigger
2084 +       mode &= ~IRQ_PCI_MASK;
2085 +       level &= ~IRQ_PCI_MASK;
2086 +
2087 +       // for USB, high active and level trigger
2088 +       mode &= ~IRQ_USB0_MASK;
2089 +       level &= ~IRQ_USB0_MASK;
2090 +
2091 +       mode &= ~IRQ_USB1_MASK;
2092 +       level &= ~IRQ_USB1_MASK;
2093 +
2094 +       // for LPC, high active and edge trigger
2095 +       mode |= 0xffff0000;
2096 +       level &= 0x0000ffff;
2097 +
2098 +       // for GPIO, high active and level trigger
2099 +       mode &= ~(IRQ_GPIO_MASK);
2100 +       level &= ~(IRQ_GPIO_MASK);
2101 +
2102 +       mode &= ~(IRQ_GPIO1_MASK);
2103 +       level &= ~(IRQ_GPIO1_MASK);
2104 +
2105 +       mode &= ~(IRQ_GPIO2_MASK);
2106 +       level &= ~(IRQ_GPIO2_MASK);
2107 +
2108 +       __raw_writel(mode,IRQ_TMODE(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
2109 +       __raw_writel(level,IRQ_TLEVEL(IO_ADDRESS(SL2312_INTERRUPT_BASE)));
2110 +
2111 +}
2112 --- /dev/null
2113 +++ b/arch/arm/mach-sl2312/lpc.c
2114 @@ -0,0 +1,125 @@
2115 +/*
2116 + *
2117 + * BRIEF MODULE DESCRIPTION
2118 + *     ITE Semi IT8712 Super I/O functions.
2119 + *
2120 + * Copyright 2001 MontaVista Software Inc.
2121 + * Author: MontaVista Software, Inc.
2122 + *             ppopov@mvista.com or source@mvista.com
2123 + *
2124 + *  This program is free software; you can redistribute  it and/or modify it
2125 + *  under  the terms of  the GNU General  Public License as published by the
2126 + *  Free Software Foundation;  either version 2 of the  License, or (at your
2127 + *  option) any later version.
2128 + *
2129 + *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
2130 + *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
2131 + *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
2132 + *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
2133 + *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2134 + *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
2135 + *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
2136 + *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
2137 + *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2138 + *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2139 + *
2140 + *  You should have received a copy of the  GNU General Public License along
2141 + *  with this program; if not, write  to the Free Software Foundation, Inc.,
2142 + *  675 Mass Ave, Cambridge, MA 02139, USA.
2143 + */
2144 +#include <linux/kernel.h>
2145 +#include <linux/delay.h>
2146 +#include <asm/io.h>
2147 +#include <asm/types.h>
2148 +#include <asm/arch/it8712.h>
2149 +#include <linux/init.h>
2150 +#include <asm/arch/hardware.h>
2151 +
2152 +#ifndef TRUE
2153 +#define TRUE 1
2154 +#endif
2155 +
2156 +#ifndef FALSE
2157 +#define FALSE 0
2158 +#endif
2159 +
2160 +
2161 +// MB PnP configuration register
2162 +#define LPC_KEY_ADDR   (IO_ADDRESS(SL2312_LPC_IO_BASE) + 0x2e)
2163 +#define LPC_DATA_ADDR  (IO_ADDRESS(SL2312_LPC_IO_BASE) + 0x2f)
2164 +
2165 +#define LPC_BUS_CTRL                   *(volatile unsigned char*) (IO_ADDRESS(SL2312_LPC_HOST_BASE) + 0)
2166 +#define LPC_BUS_STATUS                 *(volatile unsigned char*) (IO_ADDRESS(SL2312_LPC_HOST_BASE) + 2)
2167 +#define LPC_SERIAL_IRQ_CTRL            *(volatile unsigned char*) (IO_ADDRESS(SL2312_LPC_HOST_BASE) + 4)
2168 +
2169 +int it8712_exist;
2170 +
2171 +static void LPCEnterMBPnP(void)
2172 +{
2173 +       int i;
2174 +       unsigned char key[4] = {0x87, 0x01, 0x55, 0x55};
2175 +
2176 +       for (i = 0; i<4; i++)
2177 +               outb(key[i], LPC_KEY_ADDR);
2178 +
2179 +}
2180 +
2181 +static void LPCExitMBPnP(void)
2182 +{
2183 +       outb(0x02, LPC_KEY_ADDR);
2184 +       outb(0x02, LPC_DATA_ADDR);
2185 +}
2186 +
2187 +void LPCSetConfig(char LdnNumber, char Index, char data)
2188 +{
2189 +       LPCEnterMBPnP();                                // Enter IT8712 MB PnP mode
2190 +       outb(0x07, LPC_KEY_ADDR);
2191 +       outb(LdnNumber, LPC_DATA_ADDR);
2192 +       outb(Index, LPC_KEY_ADDR);
2193 +       outb(data, LPC_DATA_ADDR);
2194 +       LPCExitMBPnP();
2195 +}
2196 +
2197 +char LPCGetConfig(char LdnNumber, char Index)
2198 +{
2199 +       char rtn;
2200 +
2201 +       LPCEnterMBPnP();                                // Enter IT8712 MB PnP mode
2202 +       outb(0x07, LPC_KEY_ADDR);
2203 +       outb(LdnNumber, LPC_DATA_ADDR);
2204 +       outb(Index, LPC_KEY_ADDR);
2205 +       rtn = inb(LPC_DATA_ADDR);
2206 +       LPCExitMBPnP();
2207 +       return rtn;
2208 +}
2209 +
2210 +static int SearchIT8712(void)
2211 +{
2212 +       unsigned char Id1, Id2;
2213 +       unsigned short Id;
2214 +
2215 +       LPCEnterMBPnP();
2216 +       outb(0x20, LPC_KEY_ADDR); /* chip id byte 1 */
2217 +       Id1 = inb(LPC_DATA_ADDR);
2218 +       outb(0x21, LPC_KEY_ADDR); /* chip id byte 2 */
2219 +       Id2 = inb(LPC_DATA_ADDR);
2220 +       Id = (Id1 << 8) | Id2;
2221 +       LPCExitMBPnP();
2222 +       if (Id == 0x8712)
2223 +               return TRUE;
2224 +       else
2225 +               return FALSE;
2226 +}
2227 +
2228 +int InitLPCInterface(void)
2229 +{
2230 +       LPC_BUS_CTRL = 0xc0;
2231 +       LPC_SERIAL_IRQ_CTRL = 0xc0;
2232 +       mdelay(1);              // wait for 1 serial IRQ cycle
2233 +       LPC_SERIAL_IRQ_CTRL = 0x80;
2234 +       it8712_exist = SearchIT8712();
2235 +       printk("IT8712 %s exist\n", it8712_exist?"":"doesn't");
2236 +       return 0;
2237 +}
2238 +
2239 +//__initcall(InitLPCInterface);
2240 --- /dev/null
2241 +++ b/arch/arm/mach-sl2312/mm.c
2242 @@ -0,0 +1,80 @@
2243 +/*
2244 + *  linux/arch/arm/mach-epxa10db/mm.c
2245 + *
2246 + *  MM routines for Altera'a Epxa10db board
2247 + *
2248 + *  Copyright (C) 2001 Altera Corporation
2249 + *
2250 + * This program is free software; you can redistribute it and/or modify
2251 + * it under the terms of the GNU General Public License as published by
2252 + * the Free Software Foundation; either version 2 of the License, or
2253 + * (at your option) any later version.
2254 + *
2255 + * This program is distributed in the hope that it will be useful,
2256 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2257 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2258 + * GNU General Public License for more details.
2259 + *
2260 + * You should have received a copy of the GNU General Public License
2261 + * along with this program; if not, write to the Free Software
2262 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
2263 + */
2264 +#include <linux/sched.h>
2265 +#include <linux/mm.h>
2266 +#include <linux/init.h>
2267 +
2268 +#include <asm/hardware.h>
2269 +#include <asm/io.h>
2270 +#include <asm/pgtable.h>
2271 +#include <asm/page.h>
2272 +#include <asm/sizes.h>
2273 +
2274 +#include <asm/mach/map.h>
2275 +
2276 +/* Page table mapping for I/O region */
2277 +static struct map_desc sl2312_io_desc[] __initdata = {
2278 +#ifdef CONFIG_GEMINI_IPI
2279 +{__phys_to_virt(CPU_1_MEM_BASE),         __phys_to_pfn(CPU_1_MEM_BASE),        SZ_64M,  MT_MEMORY},
2280 +#endif
2281 +{IO_ADDRESS(SL2312_SRAM_BASE),         __phys_to_pfn(SL2312_SRAM_BASE),        SZ_512K,  MT_DEVICE},
2282 +{IO_ADDRESS(SL2312_DRAM_CTRL_BASE),    __phys_to_pfn(SL2312_DRAM_CTRL_BASE),   SZ_512K,  MT_DEVICE},
2283 +{IO_ADDRESS(SL2312_GLOBAL_BASE),       __phys_to_pfn(SL2312_GLOBAL_BASE),      SZ_512K,  MT_DEVICE},
2284 +{IO_ADDRESS(SL2312_WAQTCHDOG_BASE),    __phys_to_pfn(SL2312_WAQTCHDOG_BASE),   SZ_512K,  MT_DEVICE},
2285 +{IO_ADDRESS(SL2312_UART_BASE),         __phys_to_pfn(SL2312_UART_BASE),        SZ_512K,  MT_DEVICE},
2286 +{IO_ADDRESS(SL2312_TIMER_BASE),        __phys_to_pfn(SL2312_TIMER_BASE),       SZ_512K,  MT_DEVICE},
2287 +{IO_ADDRESS(SL2312_LCD_BASE),          __phys_to_pfn(SL2312_LCD_BASE),         SZ_512K,  MT_DEVICE},
2288 +{IO_ADDRESS(SL2312_RTC_BASE),          __phys_to_pfn(SL2312_RTC_BASE),         SZ_512K,  MT_DEVICE},
2289 +{IO_ADDRESS(SL2312_SATA_BASE),         __phys_to_pfn(SL2312_SATA_BASE),        SZ_512K,  MT_DEVICE},
2290 +{IO_ADDRESS(SL2312_LPC_HOST_BASE),     __phys_to_pfn(SL2312_LPC_HOST_BASE),    SZ_512K,  MT_DEVICE},
2291 +{IO_ADDRESS(SL2312_LPC_IO_BASE),       __phys_to_pfn(SL2312_LPC_IO_BASE),      SZ_512K,  MT_DEVICE},
2292 +{IO_ADDRESS(SL2312_INTERRUPT_BASE),    __phys_to_pfn(SL2312_INTERRUPT_BASE),   SZ_512K,  MT_DEVICE},
2293 +{IO_ADDRESS(SL2312_INTERRUPT1_BASE),   __phys_to_pfn(SL2312_INTERRUPT1_BASE),  SZ_512K,  MT_DEVICE},
2294 +{IO_ADDRESS(SL2312_SSP_CTRL_BASE),     __phys_to_pfn(SL2312_SSP_CTRL_BASE),    SZ_512K,  MT_DEVICE},
2295 +{IO_ADDRESS(SL2312_POWER_CTRL_BASE),   __phys_to_pfn(SL2312_POWER_CTRL_BASE),  SZ_512K,  MT_DEVICE},
2296 +{IO_ADDRESS(SL2312_CIR_BASE),          __phys_to_pfn(SL2312_CIR_BASE),         SZ_512K,  MT_DEVICE},
2297 +{IO_ADDRESS(SL2312_GPIO_BASE),         __phys_to_pfn(SL2312_GPIO_BASE),        SZ_512K,  MT_DEVICE},
2298 +{IO_ADDRESS(SL2312_GPIO_BASE1),        __phys_to_pfn(SL2312_GPIO_BASE1),       SZ_512K,  MT_DEVICE},
2299 +{IO_ADDRESS(SL2312_GPIO_BASE2),        __phys_to_pfn(SL2312_GPIO_BASE2),       SZ_512K,  MT_DEVICE},
2300 +{IO_ADDRESS(SL2312_PCI_IO_BASE),          __phys_to_pfn(SL2312_PCI_IO_BASE),      SZ_512K,  MT_DEVICE},
2301 +{IO_ADDRESS(SL2312_PCI_MEM_BASE),         __phys_to_pfn(SL2312_PCI_MEM_BASE),     SZ_512K,  MT_DEVICE},
2302 +#ifdef CONFIG_NET_SL351X
2303 +{IO_ADDRESS(SL2312_TOE_BASE),          __phys_to_pfn(SL2312_TOE_BASE)       ,   SZ_512K,  MT_DEVICE},
2304 +#endif
2305 +{IO_ADDRESS(SL2312_GMAC0_BASE),               __phys_to_pfn(SL2312_GMAC0_BASE),           SZ_512K,  MT_DEVICE},
2306 +{IO_ADDRESS(SL2312_GMAC1_BASE),               __phys_to_pfn(SL2312_GMAC1_BASE),           SZ_512K,  MT_DEVICE},
2307 +{IO_ADDRESS(SL2312_SECURITY_BASE),     __phys_to_pfn(SL2312_SECURITY_BASE),    SZ_512K,  MT_DEVICE},
2308 +{IO_ADDRESS(SL2312_IDE0_BASE),         __phys_to_pfn(SL2312_IDE0_BASE),        SZ_512K,  MT_DEVICE},
2309 +{IO_ADDRESS(SL2312_IDE1_BASE),         __phys_to_pfn(SL2312_IDE1_BASE),        SZ_512K,  MT_DEVICE},
2310 +{IO_ADDRESS(SL2312_RAID_BASE),         __phys_to_pfn(SL2312_RAID_BASE),        SZ_512K,  MT_DEVICE},
2311 +{IO_ADDRESS(SL2312_FLASH_CTRL_BASE),   __phys_to_pfn(SL2312_FLASH_CTRL_BASE),  SZ_512K,  MT_DEVICE},
2312 +{IO_ADDRESS(SL2312_DRAM_CTRL_BASE),    __phys_to_pfn(SL2312_DRAM_CTRL_BASE),   SZ_512K,  MT_DEVICE},
2313 +{IO_ADDRESS(SL2312_GENERAL_DMA_BASE),  __phys_to_pfn(SL2312_GENERAL_DMA_BASE), SZ_512K,  MT_DEVICE},
2314 +{IO_ADDRESS(SL2312_USB0_BASE),         __phys_to_pfn(SL2312_USB_BASE),         SZ_512K,  MT_DEVICE},
2315 +{IO_ADDRESS(SL2312_USB1_BASE),         __phys_to_pfn(SL2312_USB1_BASE),        SZ_512K,  MT_DEVICE},
2316 +{FLASH_VADDR(SL2312_FLASH_BASE),       __phys_to_pfn(SL2312_FLASH_BASE),       SZ_16M,    MT_DEVICE},
2317 +};
2318 +
2319 +void __init sl2312_map_io(void)
2320 +{
2321 +       iotable_init(sl2312_io_desc, ARRAY_SIZE(sl2312_io_desc));
2322 +}
2323 --- /dev/null
2324 +++ b/arch/arm/mach-sl2312/pci.c
2325 @@ -0,0 +1,359 @@
2326 +/*
2327 + *  linux/arch/arm/mach-sl2312/pci_sl2312.c
2328 + *
2329 + *  PCI functions for sl2312 host PCI bridge
2330 + *
2331 + *  Copyright (C) 2003 StorLink Corp.
2332 + *
2333 + * This program is free software; you can redistribute it and/or modify
2334 + * it under the terms of the GNU General Public License as published by
2335 + * the Free Software Foundation; either version 2 of the License, or
2336 + * (at your option) any later version.
2337 + *
2338 + * This program is distributed in the hope that it will be useful,
2339 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2340 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2341 + * GNU General Public License for more details.
2342 + *
2343 + * You should have received a copy of the GNU General Public License
2344 + * along with this program; if not, write to the Free Software
2345 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
2346 + */
2347 +#include <linux/sched.h>
2348 +#include <linux/kernel.h>
2349 +#include <linux/pci.h>
2350 +#include <linux/ptrace.h>
2351 +#include <linux/slab.h>
2352 +#include <linux/ioport.h>
2353 +#include <linux/interrupt.h>
2354 +#include <linux/spinlock.h>
2355 +#include <linux/init.h>
2356 +
2357 +#include <asm/sizes.h>
2358 +#include <asm/hardware.h>
2359 +#include <asm/irq.h>
2360 +#include <asm/system.h>
2361 +#include <asm/mach/pci.h>
2362 +#include <asm/mach/irq.h>
2363 +#include <asm/mach-types.h>
2364 +
2365 +#include <asm/arch/pci.h>
2366 +
2367 +//#define DEBUG
2368 +
2369 +// sl2312 PCI bridge access routines
2370 +
2371 +#define PCI_IOSIZE_REG (*(volatile unsigned long *) (IO_ADDRESS(SL2312_PCI_IO_BASE)))
2372 +#define PCI_PROT_REG   (*(volatile unsigned long *) (IO_ADDRESS(SL2312_PCI_IO_BASE) + 0x04))
2373 +#define PCI_CTRL_REG   (*(volatile unsigned long *) (IO_ADDRESS(SL2312_PCI_IO_BASE) + 0x08))
2374 +#define PCI_SOFTRST_REG        (*(volatile unsigned long *) (IO_ADDRESS(SL2312_PCI_IO_BASE) + 0x10))
2375 +#define PCI_CONFIG_REG (*(volatile unsigned long *) (IO_ADDRESS(SL2312_PCI_IO_BASE) + 0x28))
2376 +#define PCI_DATA_REG   (*(volatile unsigned long *) (IO_ADDRESS(SL2312_PCI_IO_BASE) + 0x2C))
2377 +
2378 +static spinlock_t sl2312_pci_lock = SPIN_LOCK_UNLOCKED;
2379 +// for initialize PCI devices
2380 +struct resource pci_ioport_resource = {
2381 +               .name = "PCI I/O Space",
2382 +               .start = IO_ADDRESS(SL2312_PCI_IO_BASE) + 0x100,
2383 +               .end = IO_ADDRESS(SL2312_PCI_IO_BASE) + SZ_512K - 1,
2384 +               .flags = IORESOURCE_IO,
2385 +};
2386 +struct resource pci_iomem_resource = {
2387 +               .name = "PCI Mem Space",
2388 +               .start = SL2312_PCI_MEM_BASE,
2389 +               .end = SL2312_PCI_MEM_BASE + SZ_128M - 1,
2390 +               .flags = IORESOURCE_MEM,
2391 +};
2392 +
2393 +static int sl2312_read_config(struct pci_bus *bus, unsigned int devfn, int where,int size, u32 *val)
2394 +{
2395 +       unsigned long addr,data;
2396 +       unsigned long flags;
2397 +
2398 +       spin_lock_irqsave(&sl2312_pci_lock, flags);
2399 +    addr = 0x80000000 | (PCI_SLOT(devfn) << 11) | (PCI_FUNC(devfn) << 8) | (where & ~3);
2400 +       PCI_CONFIG_REG = addr;
2401 +       data = PCI_DATA_REG;
2402 +
2403 +       switch (size) {
2404 +       case 1:
2405 +           *val = (u8) (data >> ((where & 0x03) * 8));
2406 +               break;
2407 +       case 2:
2408 +           *val = (u16) (data >> ((where & 0x02) * 8));
2409 +               break;
2410 +       case 4:
2411 +           *val = data;
2412 +       if ((where >= 0x10) && (where <= 0x24)) {
2413 +               if ((*val & 0xfff00000) == SL2312_PCI_IO_BASE) {
2414 +                       *val &= 0x000fffff;
2415 +                       *val |= IO_ADDRESS(SL2312_PCI_IO_BASE);
2416 +               }
2417 +       }
2418 +               break;
2419 +       }
2420 +       spin_unlock_irqrestore(&sl2312_pci_lock, flags);
2421 +//     printk("READ==>slot=%d fn=%d where=%d value=%x\n",PCI_SLOT(devfn),PCI_FUNC(devfn),where,*val);
2422 +       return PCIBIOS_SUCCESSFUL;
2423 +}
2424 +
2425 +static int sl2312_write_config(struct pci_bus *bus, unsigned int devfn, int where,int size, u32 val)
2426 +{
2427 +       unsigned long addr,data;
2428 +       unsigned long flags;
2429 +
2430 +       spin_lock_irqsave(&sl2312_pci_lock, flags);
2431 +    addr = 0x80000000 | (PCI_SLOT(devfn) << 11) | (PCI_FUNC(devfn) << 8) | (where & ~3);
2432 +       PCI_CONFIG_REG = addr;
2433 +       data = PCI_DATA_REG;
2434 +
2435 +       switch (size) {
2436 +       case 1:
2437 +       data &= ~(0xff << ((where & 0x03) * 8));
2438 +       data |= (val << ((where & 0x03) * 8));
2439 +       PCI_DATA_REG = data;
2440 +               break;
2441 +       case 2:
2442 +       data &= ~(0xffff << ((where & 0x02) * 8));
2443 +       data |= (val << ((where & 0x02) * 8));
2444 +       PCI_DATA_REG = data;
2445 +               break;
2446 +       case 4:
2447 +       if ((where >= 0x10) && (where <= 0x24)) {
2448 +               if ((val & 0xfff00000) == IO_ADDRESS(SL2312_PCI_IO_BASE)) {
2449 +                       val &= 0x000fffff;
2450 +                       val |= SL2312_PCI_IO_BASE;
2451 +               }
2452 +       }
2453 +           PCI_DATA_REG = val;
2454 +               break;
2455 +       }
2456 +       spin_unlock_irqrestore(&sl2312_pci_lock, flags);
2457 +
2458 +//     printk("WRITE==> slot=%d fn=%d where=%d value=%x \n",PCI_SLOT(devfn),PCI_FUNC(devfn),where,val);
2459 +       return PCIBIOS_SUCCESSFUL;
2460 +}
2461 +
2462 +static struct pci_ops sl2312_pci_ops = {
2463 +       .read   = sl2312_read_config,
2464 +       .write  = sl2312_write_config,
2465 +};
2466 +
2467 +
2468 +int __init sl2312_pci_setup_resources(struct resource **resource)
2469 +{
2470 +       PCI_IOSIZE_REG = 0;             // 1M IO size
2471 +       PCI_CTRL_REG = 0x06;
2472 +
2473 +       resource[0] = &pci_ioport_resource;
2474 +       resource[1] = &pci_iomem_resource;
2475 +       resource[2] = NULL;
2476 +
2477 +       return 1;
2478 +}
2479 +
2480 +//static int sl2312_pci_fault(unsigned long addr, struct pt_regs *regs)
2481 +//{
2482 +//     return 1;
2483 +//}
2484 +
2485 +
2486 +/**********************************************************************
2487 + * MASK(disable) PCI interrupt
2488 + *    0: PCI INTA, 1: PCI INTB, ...            // for Linux interrupt routing
2489 + *   16: PERR                                                          // for PCI module internal use
2490 + *   17: SERR,.. respect to PCI CTRL2 REG
2491 + **********************************************************************/
2492 +void sl2312_pci_mask_irq(unsigned int irq)
2493 +{
2494 +    struct pci_bus bus;
2495 +       unsigned int tmp;
2496 +
2497 +    bus.number = 0;
2498 +    sl2312_read_config(&bus, 0, SL2312_PCI_CTRL2, 4, &tmp);
2499 +       if (irq < 16) {                                         // for linux int routing
2500 +               tmp &= ~(1 << (irq + 16 + 6));
2501 +       }
2502 +       else {
2503 +               tmp &= ~(1 << irq);
2504 +       }
2505 +    sl2312_write_config(&bus, 0, SL2312_PCI_CTRL2, 4, tmp);
2506 +}
2507 +
2508 +/* UNMASK(enable) PCI interrupt */
2509 +void sl2312_pci_unmask_irq(unsigned int irq)
2510 +{
2511 +    struct pci_bus bus;
2512 +       unsigned int tmp;
2513 +
2514 +    bus.number = 0;
2515 +    sl2312_read_config(&bus, 0, SL2312_PCI_CTRL2, 4, &tmp);
2516 +       if (irq < 16) {                                         // for linux int routing
2517 +               tmp |= (1 << (irq + 16 + 6));
2518 +       }
2519 +       else {
2520 +               tmp |= (1 << irq);
2521 +       }
2522 +    sl2312_write_config(&bus, 0, SL2312_PCI_CTRL2, 4, tmp);
2523 +}
2524 +
2525 +/* Get PCI interrupt source */
2526 +int sl2312_pci_get_int_src(void)
2527 +{
2528 +    struct pci_bus bus;
2529 +       unsigned int tmp=0;
2530 +
2531 +    bus.number = 0;
2532 +    sl2312_read_config(&bus, 0, SL2312_PCI_CTRL2, 4, &tmp);
2533 +       if (tmp & (1 << 28)) {          // PCI INTA
2534 +        sl2312_write_config(&bus, 0, SL2312_PCI_CTRL2, 4, tmp);
2535 +               return IRQ_PCI_INTA;
2536 +       }
2537 +       if (tmp & (1 << 29)) {          // PCI INTB
2538 +        sl2312_write_config(&bus, 0, SL2312_PCI_CTRL2, 4, tmp);
2539 +               return IRQ_PCI_INTB;
2540 +       }
2541 +       if (tmp & (1 << 30)) {          // PCI INTC
2542 +        sl2312_write_config(&bus, 0, SL2312_PCI_CTRL2, 4, tmp);
2543 +               return IRQ_PCI_INTC;
2544 +       }
2545 +       if (tmp & (1 << 31)) {          // PCI INTD
2546 +        sl2312_write_config(&bus, 0, SL2312_PCI_CTRL2, 4, tmp);
2547 +               return IRQ_PCI_INTD;
2548 +       }
2549 +       // otherwise, it should be a PCI error
2550 +       return IRQ_PCI;
2551 +}
2552 +
2553 +static irqreturn_t sl2312_pci_irq(int irq, void *devid)
2554 +{
2555 +    struct irq_desc *desc;
2556 +       struct irqaction *action;
2557 +       int retval = 0;
2558 +
2559 +    return 1;
2560 +
2561 +       irq = sl2312_pci_get_int_src();
2562 +       desc = &irq_desc[irq];
2563 +       action = desc->action;
2564 +       do {
2565 +               retval |= action->handler(irq, devid);
2566 +               action = action->next;
2567 +       } while (action);
2568 +
2569 +    return 1;
2570 +}
2571 +
2572 +//extern int (*external_fault)(unsigned long addr, struct pt_regs *regs);
2573 +
2574 +void __init sl2312_pci_preinit(void)
2575 +{
2576 +    struct pci_bus bus;
2577 +       unsigned long flags;
2578 +       unsigned int temp;
2579 +       int ret;
2580 +
2581 +       /*
2582 +        * Hook in our fault handler for PCI errors
2583 +        */
2584 +//     external_fault = sl2312_pci_fault;
2585 +
2586 +       spin_lock_irqsave(&sl2312_pci_lock, flags);
2587 +
2588 +       /*
2589 +        * Grab the PCI interrupt.
2590 +        */
2591 +       ret = request_irq(IRQ_PCI, sl2312_pci_irq, 0, "sl2312 pci int", NULL);
2592 +       if (ret)
2593 +               printk(KERN_ERR "PCI: unable to grab PCI error "
2594 +                      "interrupt: %d\n", ret);
2595 +
2596 +       spin_unlock_irqrestore(&sl2312_pci_lock, flags);
2597 +
2598 +       // setup pci bridge
2599 +    bus.number = 0;   /* device 0, function 0 */
2600 +       temp = (SL2312_PCI_DMA_MEM1_BASE & 0xfff00000) | (SL2312_PCI_DMA_MEM1_SIZE << 16);
2601 +    sl2312_write_config(&bus, 0, SL2312_PCI_MEM1_BASE_SIZE, 4, temp);
2602 +}
2603 +
2604 +/*
2605 + *     No swizzle on SL2312
2606 + */
2607 +static u8 __init sl2312_pci_swizzle(struct pci_dev *dev, u8 *pinp)
2608 +{
2609 +       return PCI_SLOT(dev->devfn);
2610 +}
2611 +
2612 +/*
2613 + * map the specified device/slot/pin to an IRQ.  This works out such
2614 + * that slot 9 pin 1 is INT0, pin 2 is INT1, and slot 10 pin 1 is INT1.
2615 + */
2616 +static int __init sl2312_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
2617 +{
2618 +       int intnr = ((slot  + (pin - 1)) & 3) + 4;  /* the IRQ number of PCI bridge */
2619 +
2620 +       // printk("%s : slot = %d  pin = %d \n",__func__,slot,pin);
2621 +    switch (slot)
2622 +    {
2623 +        case 12:
2624 +               if (pin==1)
2625 +               {
2626 +                       intnr = 3;
2627 +                   }
2628 +                   else
2629 +                   {
2630 +                       intnr = 0;
2631 +                   }
2632 +            break;
2633 +        case 11:
2634 +                   intnr = (2 + (pin - 1)) & 3;
2635 +            break;
2636 +        case 10:
2637 +                   intnr = (1 + (pin - 1)) & 3;
2638 +            break;
2639 +        case  9:
2640 +                   intnr = (pin - 1) & 3;
2641 +            break;
2642 +    }
2643 +//     if (slot == 10)
2644 +//             intnr = (1 + (pin - 1)) & 3;
2645 +//     else if (slot == 9)
2646 +//             intnr = (pin - 1) & 3;
2647 +       return (IRQ_PCI_INTA + intnr);
2648 +}
2649 +
2650 +struct pci_bus * __init sl2312_pci_scan_bus(int nr, struct pci_sys_data *sysdata)
2651 +{
2652 +       return (pci_scan_bus(0, &sl2312_pci_ops, sysdata));
2653 +
2654 +}
2655 +
2656 +int __init sl2312_pci_setup(int nr, struct pci_sys_data *sys)
2657 +{
2658 +       int ret = 0;
2659 +
2660 +       if (nr == 0) {
2661 +               ret = sl2312_pci_setup_resources(sys->resource);
2662 +       }
2663 +
2664 +       return ret;
2665 +}
2666 +
2667 +
2668 +struct hw_pci sl2312_pci __initdata = {
2669 +       .setup          =       sl2312_pci_setup,
2670 +       .preinit                =       sl2312_pci_preinit,
2671 +       .nr_controllers =   1,
2672 +       .swizzle                =       sl2312_pci_swizzle,
2673 +       .map_irq                =       sl2312_pci_map_irq,
2674 +       .scan           =   sl2312_pci_scan_bus,
2675 +};
2676 +
2677 +static int __init sl2312_pci_init(void)
2678 +{
2679 +       if (machine_is_sl2312())
2680 +               pci_common_init(&sl2312_pci);
2681 +       return 0;
2682 +}
2683 +
2684 +subsys_initcall(sl2312_pci_init);
2685 --- /dev/null
2686 +++ b/arch/arm/mach-sl2312/sl2312-otg-1.c
2687 @@ -0,0 +1,64 @@
2688 +/*
2689 + *  linux/arch/arm/mach-pxa/sl2312.c
2690 + *
2691 + *  Author:    Nicolas Pitre
2692 + *  Created:   Nov 05, 2002
2693 + *  Copyright: MontaVista Software Inc.
2694 + *
2695 + * Code specific to sl2312 aka Bulverde.
2696 + *
2697 + * This program is free software; you can redistribute it and/or modify
2698 + * it under the terms of the GNU General Public License version 2 as
2699 + * published by the Free Software Foundation.
2700 + */
2701 +#include <linux/module.h>
2702 +#include <linux/kernel.h>
2703 +#include <linux/init.h>
2704 +#include <linux/pm.h>
2705 +#include <linux/device.h>
2706 +#include "asm/arch/sl2312.h"
2707 +#include "asm/arch/irqs.h"
2708 +#include <asm/hardware.h>
2709 +#include <asm/irq.h>
2710 +#include <linux/platform_device.h>
2711 +
2712 +/*
2713 + * device registration specific to sl2312.
2714 + */
2715 +
2716 +static u64 sl2312_dmamask_1 = 0xffffffffUL;
2717 +
2718 +static struct resource sl2312_otg_resources_1[] = {
2719 +       [0] = {
2720 +               .start  = 0x69000000,
2721 +               .end    = 0x69000fff,
2722 +               .flags  = IORESOURCE_MEM,
2723 +       },
2724 +       [1] = {
2725 +               .start  = IRQ_USB1,
2726 +               .end    = IRQ_USB1,
2727 +               .flags  = IORESOURCE_IRQ,
2728 +       },
2729 +};
2730 +
2731 +static struct platform_device ehci_1_device = {
2732 +       .name           = "ehci-hcd-FOTG2XX",
2733 +       .id             = -1,
2734 +       .dev            = {
2735 +               .dma_mask = &sl2312_dmamask_1,
2736 +               .coherent_dma_mask = 0xffffffff,
2737 +       },
2738 +       .num_resources  = ARRAY_SIZE(sl2312_otg_resources_1),
2739 +       .resource       = sl2312_otg_resources_1,
2740 +};
2741 +
2742 +static struct platform_device *devices[] __initdata = {
2743 +       &ehci_1_device,
2744 +};
2745 +
2746 +static int __init sl2312_1_init(void)
2747 +{
2748 +       return platform_add_devices(devices, ARRAY_SIZE(devices));
2749 +}
2750 +
2751 +subsys_initcall(sl2312_1_init);
2752 --- /dev/null
2753 +++ b/arch/arm/mach-sl2312/sl2312-otg.c
2754 @@ -0,0 +1,87 @@
2755 +/*
2756 + *  linux/arch/arm/mach-pxa/sl2312.c
2757 + *
2758 + *  Author:    Nicolas Pitre
2759 + *  Created:   Nov 05, 2002
2760 + *  Copyright: MontaVista Software Inc.
2761 + *
2762 + * Code specific to sl2312 aka Bulverde.
2763 + *
2764 + * This program is free software; you can redistribute it and/or modify
2765 + * it under the terms of the GNU General Public License version 2 as
2766 + * published by the Free Software Foundation.
2767 + */
2768 +#include <linux/module.h>
2769 +#include <linux/kernel.h>
2770 +#include <linux/init.h>
2771 +#include <linux/pm.h>
2772 +#include <linux/device.h>
2773 +#include "asm/arch/sl2312.h"
2774 +#include "asm/arch/irqs.h"
2775 +#include <asm/hardware.h>
2776 +#include <asm/irq.h>
2777 +#include <linux/platform_device.h>
2778 +
2779 +/*
2780 + * device registration specific to sl2312.
2781 + */
2782 +
2783 +static u64 sl2312_dmamask = 0xffffffffUL;
2784 +
2785 +static struct resource sl2312_otg_resources_1[] = {
2786 +       [0] = {
2787 +               .start  = 0x68000000,
2788 +               .end    = 0x68000fff,
2789 +               .flags  = IORESOURCE_MEM,
2790 +       },
2791 +       [1] = {
2792 +               .start  = IRQ_USB0,
2793 +               .end    = IRQ_USB0,
2794 +               .flags  = IORESOURCE_IRQ,
2795 +       },
2796 +};
2797 +static struct resource sl2312_otg_resources_2[] = {
2798 +       [2] = {
2799 +               .start  = 0x69000000,
2800 +               .end    = 0x69000fff,
2801 +               .flags  = IORESOURCE_MEM,
2802 +       },
2803 +       [3] = {
2804 +               .start  = IRQ_USB1,
2805 +               .end    = IRQ_USB1,
2806 +               .flags  = IORESOURCE_IRQ,
2807 +       },
2808 +};
2809 +
2810 +static struct platform_device ehci_device_1 = {
2811 +       .name           = "ehci-hcd-FOTG2XX",
2812 +       .id             = 1,
2813 +       .dev            = {
2814 +               .dma_mask = &sl2312_dmamask,
2815 +               .coherent_dma_mask = 0xffffffff,
2816 +       },
2817 +       .num_resources  = ARRAY_SIZE(sl2312_otg_resources_1),
2818 +       .resource       = sl2312_otg_resources_1,
2819 +};
2820 +
2821 +static struct platform_device ehci_device_2 = {
2822 +       .name           = "ehci-hcd-FOTG2XX",
2823 +       .id             = 2,
2824 +       .dev            = {
2825 +               .dma_mask = &sl2312_dmamask,
2826 +               .coherent_dma_mask = 0xffffffff,
2827 +       },
2828 +       .num_resources  = ARRAY_SIZE(sl2312_otg_resources_2),
2829 +       .resource       = sl2312_otg_resources_2,
2830 +};
2831 +
2832 +static struct platform_device *devices[] __initdata = {
2833 +       &ehci_device_1, /* &ehci_device_2, */
2834 +};
2835 +
2836 +static int __init sl2312_init(void)
2837 +{
2838 +       return platform_add_devices(devices, ARRAY_SIZE(devices));
2839 +}
2840 +
2841 +subsys_initcall(sl2312_init);
2842 --- /dev/null
2843 +++ b/arch/arm/mach-sl2312/sl3516_device.c
2844 @@ -0,0 +1,89 @@
2845 +/*
2846 + *  linux/arch/arm/mach-2312/sl3516_device.c
2847 + *
2848 + *  Author:    Nicolas Pitre
2849 + *  Created:   Nov 05, 2002
2850 + *  Copyright: MontaVista Software Inc.
2851 + *
2852 + * Code specific to sl2312 aka Bulverde.
2853 + *
2854 + * This program is free software; you can redistribute it and/or modify
2855 + * it under the terms of the GNU General Public License version 2 as
2856 + * published by the Free Software Foundation.
2857 + */
2858 +#include <linux/module.h>
2859 +#include <linux/kernel.h>
2860 +#include <linux/init.h>
2861 +#include <linux/pm.h>
2862 +#include <linux/device.h>
2863 +#include <linux/platform_device.h>
2864 +#include "asm/arch/sl2312.h"
2865 +#include "asm/arch/irqs.h"
2866 +#include <asm/hardware.h>
2867 +#include <asm/irq.h>
2868 +
2869 +/*
2870 + * device registration specific to sl2312.
2871 + */
2872 +
2873 +static u64 sl3516_dmamask = 0xffffffffUL;
2874 +
2875 +static struct resource sl3516_sata_resources[] = {
2876 +       [0] = {
2877 +               .start  = 0x63400000,
2878 +               .end    = 0x63400040,
2879 +               .flags  = IORESOURCE_MEM,
2880 +       },
2881 +       [1] = {
2882 +               .start  = IRQ_IDE1,
2883 +               .end    = IRQ_IDE1,
2884 +               .flags  = IORESOURCE_IRQ,
2885 +       },
2886 +};
2887 +
2888 +static struct platform_device sata_device = {
2889 +       .name           = "lepus-sata",
2890 +       .id             = -1,
2891 +       .dev            = {
2892 +               .dma_mask = &sl3516_dmamask,
2893 +               .coherent_dma_mask = 0xffffffff,
2894 +       },
2895 +       .num_resources  = ARRAY_SIZE(sl3516_sata_resources),
2896 +       .resource       = sl3516_sata_resources,
2897 +};
2898 +
2899 +static struct resource sl3516_sata0_resources[] = {
2900 +       [0] = {
2901 +               .start  = 0x63000000,
2902 +               .end    = 0x63000040,
2903 +               .flags  = IORESOURCE_MEM,
2904 +       },
2905 +       [1] = {
2906 +               .start  = IRQ_IDE0,
2907 +               .end    = IRQ_IDE0,
2908 +               .flags  = IORESOURCE_IRQ,
2909 +       },
2910 +};
2911 +
2912 +static struct platform_device sata0_device = {
2913 +       .name           = "lepus-sata0",
2914 +       .id             = -1,
2915 +       .dev            = {
2916 +               .dma_mask = &sl3516_dmamask,
2917 +               .coherent_dma_mask = 0xffffffff,
2918 +       },
2919 +       .num_resources  = ARRAY_SIZE(sl3516_sata0_resources),
2920 +       .resource       = sl3516_sata0_resources,
2921 +};
2922 +
2923 +static struct platform_device *sata_devices[] __initdata = {
2924 +       &sata_device,
2925 +       &sata0_device,
2926 +};
2927 +
2928 +static int __init sl3516_init(void)
2929 +{
2930 +       return platform_add_devices(sata_devices, ARRAY_SIZE(sata_devices));
2931 +}
2932 +
2933 +subsys_initcall(sl3516_init);
2934 --- /dev/null
2935 +++ b/arch/arm/mach-sl2312/time.c
2936 @@ -0,0 +1,134 @@
2937 +/*
2938 + *  linux/include/asm-arm/arch-epxa10db/time.h
2939 + *
2940 + *  Copyright (C) 2001 Altera Corporation
2941 + *
2942 + * This program is free software; you can redistribute it and/or modify
2943 + * it under the terms of the GNU General Public License as published by
2944 + * the Free Software Foundation; either version 2 of the License, or
2945 + * (at your option) any later version.
2946 + *
2947 + * This program is distributed in the hope that it will be useful,
2948 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2949 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2950 + * GNU General Public License for more details.
2951 + *
2952 + * You should have received a copy of the GNU General Public License
2953 + * along with this program; if not, write to the Free Software
2954 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
2955 + */
2956 +#include <linux/interrupt.h>
2957 +#include <linux/irq.h>
2958 +#include <asm/io.h>
2959 +#include <asm/system.h>
2960 +#include <asm/leds.h>
2961 +#include <asm/arch/hardware.h>
2962 +#include <asm/mach/time.h>
2963 +#define TIMER_TYPE (volatile unsigned int*)
2964 +#include <asm/arch/timer.h>
2965 +// #define FIQ_PLUS     1
2966 +
2967 +
2968 +/*
2969 + * IRQ handler for the timer
2970 + */
2971 +static irqreturn_t sl2312_timer_interrupt(int irq, void *dev_id)
2972 +{
2973 +//        unsigned int led;
2974 +       // ...clear the interrupt
2975 +#ifdef FIQ_PLUS
2976 +       *((volatile unsigned int *)FIQ_CLEAR(IO_ADDRESS(SL2312_INTERRUPT_BASE))) |= (unsigned int)(IRQ_TIMER1_MASK);
2977 +#else
2978 +       *((volatile unsigned int *)IRQ_CLEAR(IO_ADDRESS(SL2312_INTERRUPT_BASE))) |= (unsigned int)(IRQ_TIMER2_MASK);
2979 +#endif
2980 +
2981 +#if 0
2982 +        if(!(jiffies % HZ))
2983 +        {
2984 +            led = jiffies / HZ;
2985 +//            printk("ticks %x \n", led);
2986 +           }
2987 +       do_leds();
2988 +       do_timer(regs);
2989 +       do_profile(regs);
2990 +#endif
2991 +    timer_tick();
2992 +    return IRQ_HANDLED;
2993 +}
2994 +
2995 +static struct irqaction sl2312_timer_irq = {
2996 +       .name           = "SL2312 Timer Tick",
2997 +       .flags          = IRQF_DISABLED | IRQF_TIMER,
2998 +       .handler        = sl2312_timer_interrupt,
2999 +};
3000 +
3001 +unsigned long sl2312_gettimeoffset (void)
3002 +{
3003 +    return 0L;
3004 +}
3005 +
3006 +/*
3007 + * Set up timer interrupt, and return the current time in seconds.
3008 + */
3009 +void __init sl2312_time_init(void)
3010 +{
3011 +       // For clock rate adjusting
3012 +       unsigned int tick_rate=0;
3013 +
3014 +#ifdef CONFIG_SL3516_ASIC
3015 +       unsigned int clock_rate_base = 130000000;
3016 +       unsigned int reg_v=0;
3017 +
3018 +       //--> Add by jason for clock adjust
3019 +       reg_v = readl(IO_ADDRESS((SL2312_GLOBAL_BASE+GLOBAL_STATUS)));
3020 +       reg_v >>= 15;
3021 +       tick_rate = (clock_rate_base + (reg_v & 0x07)*10000000);
3022 +
3023 +       //  FPGA use AHB bus tick rate
3024 +       printk("Bus: %dMHz",tick_rate/1000000);
3025 +
3026 +       tick_rate /= 6;                         // APB bus run AHB*(1/6)
3027 +
3028 +       switch((reg_v>>3)&3){
3029 +               case 0: printk("(1/1)\n") ;
3030 +                                       break;
3031 +               case 1: printk("(3/2)\n") ;
3032 +                                       break;
3033 +               case 2: printk("(24/13)\n") ;
3034 +                                       break;
3035 +               case 3: printk("(2/1)\n") ;
3036 +                                       break;
3037 +       }
3038 +       //<--
3039 +#else
3040 +       printk("Bus: %dMHz(1/1)\n",CLOCK_TICK_RATE/1000000);            // FPGA use 20MHz
3041 +       tick_rate = CLOCK_TICK_RATE;
3042 +#endif
3043 +
3044 +
3045 +       /*
3046 +        * Make irqs happen for the system timer
3047 +        */
3048 +       // initialize timer interrupt
3049 +       // low active and edge trigger
3050 +#ifdef FIQ_PLUS
3051 +       *((volatile unsigned int *)FIQ_TMODE(IO_ADDRESS(SL2312_INTERRUPT_BASE))) |= (unsigned int)(IRQ_TIMER1_MASK);
3052 +       *((volatile unsigned int *)FIQ_LEVEL(IO_ADDRESS(SL2312_INTERRUPT_BASE))) |= (unsigned int)(IRQ_TIMER1_MASK);
3053 +       setup_irq(IRQ_TIMER1, &sl2312_timer_irq);
3054 +       /* Start the timer */
3055 +       *TIMER_COUNT(IO_ADDRESS(SL2312_TIMER1_BASE))=(unsigned int)(tick_rate/HZ);
3056 +       *TIMER_LOAD(IO_ADDRESS(SL2312_TIMER1_BASE))=(unsigned int)(tick_rate/HZ);
3057 +       *TIMER_CR(IO_ADDRESS(SL2312_TIMER1_BASE))=(unsigned int)(TIMER_1_CR_ENABLE_MSK|TIMER_1_CR_INT_MSK);
3058 +#else
3059 +       *((volatile unsigned int *)IRQ_TMODE(IO_ADDRESS(SL2312_INTERRUPT_BASE))) |= (unsigned int)(IRQ_TIMER2_MASK);
3060 +       *((volatile unsigned int *)IRQ_TLEVEL(IO_ADDRESS(SL2312_INTERRUPT_BASE))) |= (unsigned int)(IRQ_TIMER2_MASK);
3061 +       setup_irq(IRQ_TIMER2, &sl2312_timer_irq);
3062 +       /* Start the timer */
3063 +       *TIMER_COUNT(IO_ADDRESS(SL2312_TIMER2_BASE))=(unsigned int)(tick_rate/HZ);
3064 +       *TIMER_LOAD(IO_ADDRESS(SL2312_TIMER2_BASE))=(unsigned int)(tick_rate/HZ);
3065 +       *TIMER_CR(IO_ADDRESS(SL2312_TIMER1_BASE))=(unsigned int)(TIMER_2_CR_ENABLE_MSK|TIMER_2_CR_INT_MSK);
3066 +#endif
3067 +
3068 +}
3069 +
3070 +
3071 --- /dev/null
3072 +++ b/arch/arm/mach-sl2312/xor.c
3073 @@ -0,0 +1,1200 @@
3074 +/*
3075 + * arch/arm/mach-sl2312/xor.c
3076 + *
3077 + * Support functions for the Gemini Soc. This is
3078 + * a HW XOR unit that is specifically designed for use with RAID5
3079 + * applications.  This driver provides an interface that is used by
3080 + * the Linux RAID stack.
3081 + *
3082 + * Original Author: Jason Lee<jason@storlink.com.tw>
3083 + *
3084 + * Contributors:Sanders<sanders@storlink.com.tw>
3085 +                               Jason Lee<jason@storlink.com.tw>
3086 + *
3087 + *
3088 + * Maintainer: Jason Lee<jason@storlink.com.tw>
3089 + *
3090 + * Copyright (C) 2005 Storlink Corporation
3091 + *
3092 + * This program is free software; you can redistribute it and/or modify
3093 + * it under the terms of the GNU General Public License version 2 as
3094 + * published by the Free Software Foundation.
3095 + *
3096 + *
3097 + * History:    (06/25/2005, DJ) Initial Creation
3098 + *
3099 + *     Versing 1.0.0   Initial version
3100 + */
3101 +
3102 +#include <linux/types.h>
3103 +#include <linux/init.h>
3104 +#include <linux/sched.h>
3105 +#include <linux/spinlock.h>
3106 +#include <linux/slab.h>
3107 +#include <linux/errno.h>
3108 +#include <linux/interrupt.h>
3109 +#include <linux/sched.h>
3110 +#include <linux/wait.h>
3111 +#include <linux/list.h>
3112 +#include <linux/pci.h>
3113 +#include <linux/delay.h>
3114 +#include <linux/dma-mapping.h>
3115 +#include <linux/mm.h>
3116 +#include <asm/irq.h>
3117 +#include <asm/delay.h>
3118 +#include <asm/uaccess.h>
3119 +#include <asm/cacheflush.h>
3120 +#include <asm/hardware.h>
3121 +#include <asm/arch/xor.h>
3122 +#include <asm/pci.h>
3123 +#include <linux/version.h>
3124 +
3125 +/*
3126 + * pick up local definitions
3127 + */
3128 +#define XOR_SW_FILL_IN
3129 +#include "hw_xor.h"
3130 +
3131 +
3132 +//#define XOR_DEBUG
3133 +//#define XOR_TEST     1
3134 +#ifdef XOR_TEST
3135 +#define TEST_ITERATION 1000
3136 +#define SPIN_WAIT      1
3137 +#endif
3138 +#ifdef XOR_DEBUG
3139 +#define DPRINTK(s, args...) printk("Gemini XOR: " s "\n", ## args)
3140 +#define DENTER() DPRINTK("Entered...\n");
3141 +#define DEXIT() DPRINTK("Exited...\n");
3142 +#else
3143 +#define DPRINTK(s, args...)
3144 +#define DENTER()
3145 +#define DEXIT()
3146 +#endif
3147 +
3148 +//#define SPIN_WAIT
3149 +
3150 +/* globals */
3151 +static RAID_T tp;
3152 +static RAID_TXDMA_CTRL_T       txdma_ctrl;
3153 +RAID_RXDMA_CTRL_T                      rxdma_ctrl;
3154 +
3155 +//#ifndef SPIN_WAIT
3156 +static spinlock_t          raid_lock;
3157 +//#endif
3158 +
3159 +static unsigned int     tx_desc_virtual_base;
3160 +static unsigned int     rx_desc_virtual_base;
3161 +RAID_DESCRIPTOR_T      *tx_desc_ptr;
3162 +RAID_DESCRIPTOR_T      *rx_desc_ptr;
3163 +
3164 +/* static prototypes */
3165 +#define DMA_MALLOC(size,handle)                pci_alloc_consistent(NULL,size,handle)
3166 +#define DMA_MFREE(mem,size,handle)     pci_free_consistent(NULL,size,mem,handle)
3167 +
3168 +static int gemini_xor_init_desc(void);
3169 +
3170 +static unsigned int raid_read_reg(unsigned int offset)
3171 +{
3172 +    unsigned int    reg_val;
3173 +
3174 +    reg_val = readl(RAID_BASE_ADDR + offset);
3175 +       return (reg_val);
3176 +}
3177 +
3178 +static void raid_write_reg(unsigned int offset,unsigned int data,unsigned int bit_mask)
3179 +{
3180 +       unsigned int reg_val;
3181 +    unsigned int *addr;
3182 +
3183 +       reg_val = ( raid_read_reg(offset) & (~bit_mask) ) | (data & bit_mask);
3184 +       addr = (unsigned int *)(RAID_BASE_ADDR + offset);
3185 +    writel(reg_val,addr);
3186 +       return;
3187 +}
3188 +
3189 +#ifndef SPIN_WAIT
3190 +__inline__ void xor_queue_descriptor(void)
3191 +{
3192 +       unsigned int flags,status=1;
3193 +
3194 +       DPRINTK("Going to sleep");
3195 +
3196 +       while(status){
3197 +               yield();
3198 +               //schedule();
3199 +               spin_lock_irqsave(&raid_lock,flags);
3200 +               status = tp.busy;
3201 +               spin_unlock_irqrestore(&raid_lock, flags);
3202 +       }
3203 +//     tp.status = COMPLETE;
3204 +       DPRINTK("woken up!");
3205 +
3206 +}
3207 +#endif
3208 +
3209 +#ifdef SPIN_WAIT
3210 +static void gemini_xor_isr(int d_n)
3211 +#else
3212 +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,28)
3213 +static void gemini_xor_isr(int irq, void *dev_id, struct pt_regs *regs)
3214 +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
3215 +static irqreturn_t gemini_xor_isr(int irq, void *dev_instance, struct pt_regs *regs)
3216 +#endif
3217 +#endif
3218 +{
3219 +
3220 +       unsigned int err;
3221 +       RAID_DMA_STATUS_T       dma_status;
3222 +//     RAID_DESCRIPTOR_T *rdesc,*tdesc;
3223 +//     unsigned int *paddr;
3224 +
3225 +       dma_status.bits32 = raid_read_reg(RAID_DMA_STATUS);
3226 +#ifdef SPIN_WAIT
3227 +       while( (dma_status.bits32& (1<<31) ) ==0 ){
3228 +               udelay(1);
3229 +               dma_status.bits32 = raid_read_reg(RAID_DMA_STATUS);
3230 +       }
3231 +
3232 +/*     tdesc = tp.tx_first_desc;
3233 +       rdesc = tp.rx_first_desc;
3234 +       for(d_n;d_n>0;d_n--){
3235 +               if( tdesc->func_ctrl.bits.own == DMA ){
3236 +                       paddr = tdesc;
3237 +                       printk("error tx desc:0x%x\n",*paddr++);
3238 +                       printk("error tx desc:0x%x\n",*paddr++);
3239 +                       printk("error tx desc:0s%x\n",*paddr++);
3240 +                       printk("error tx desc:0x%x\n",*paddr);
3241 +                       while(1);
3242 +               }
3243 +               tdesc = (RAID_DESCRIPTOR_T *)((tdesc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3244 +       }
3245 +
3246 +       if( rdesc->func_ctrl.bits.own == DMA ){
3247 +               paddr = rdesc;
3248 +               printk("error rx desc:0x%x\n",*paddr++);
3249 +               printk("error rx desc:0x%x\n",*paddr++);
3250 +               printk("error rx desc:0s%x\n",*paddr++);
3251 +               printk("error rx desc:0x%x\n",*paddr);
3252 +               while(1);
3253 +       }
3254 +*/
3255 +#endif
3256 +
3257 +       if(dma_status.bits32 & ((1<<31)|(1<<26))){
3258 +               // if no bug , we can turn off rx finish interrupt
3259 +               dma_status.bits32 = raid_read_reg(RAID_DMA_STATUS);
3260 +               err = raid_read_reg(RAID_DMA_DEVICE_ID);
3261 +               tp.busy = 0;
3262 +
3263 +               if(err&0x00FF0000){
3264 +                       tp.status = ERROR;
3265 +                       printk("XOR:<HW>%s error code %x\n",(err&0x00F00000)?"tx":"rx",err);
3266 +
3267 +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,28)
3268 +                       return ;
3269 +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
3270 +#ifndef SPIN_WAIT
3271 +                       return IRQ_RETVAL(IRQ_HANDLED);
3272 +#endif
3273 +#endif
3274 +               }
3275 +               // 16~19 rx error code
3276 +               // 20~23 tx error codd
3277 +
3278 +               dma_status.bits.tsFinishI = 1;
3279 +               dma_status.bits.rsFinishI = 1;
3280 +               raid_write_reg(RAID_DMA_STATUS, dma_status.bits32,0x84000000);  // clear INT
3281 +
3282 +//             printk("xor %d\n",d_n);
3283 +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,28)
3284 +                       return ;
3285 +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
3286 +#ifndef SPIN_WAIT
3287 +                       return IRQ_RETVAL(IRQ_HANDLED);
3288 +#endif
3289 +#endif
3290 +       }
3291 +
3292 +       #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,28)
3293 +               return ;
3294 +       #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
3295 +       #ifndef SPIN_WAIT
3296 +               printk("XOR: DMA status register(0x%8x)\n",dma_status.bits32);
3297 +               return IRQ_RETVAL(IRQ_HANDLED);
3298 +       #endif
3299 +       #endif
3300 +}
3301 +
3302 +void
3303 +xor_gemini_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
3304 +{
3305 +       int status=0;
3306 +       unsigned int flags;
3307 +
3308 +       if(bytes > (1<<(SRAM_PAR_SIZE+11))){
3309 +               printk("XOR: out of SRAM partition!![0x%x]\n",(unsigned int)bytes);
3310 +       }
3311 +
3312 +       spin_lock_irqsave(&raid_lock,flags);
3313 +       while(tp.status != COMPLETE){
3314 +               spin_unlock_irqrestore(&raid_lock, flags);
3315 +               //printk("XOR yield2\n");
3316 +#ifdef XOR_SW_FILL_IN
3317 +               xor_arm4regs_2(bytes,p1,p2);
3318 +               return ;
3319 +#else
3320 +               yield();
3321 +#endif
3322 +       }
3323 +       spin_unlock_irqrestore(&raid_lock, flags);
3324 +       tp.status = RUNNING;
3325 +
3326 +       // flush the cache to memory before H/W XOR touches them
3327 +       consistent_sync(p1, bytes, DMA_BIDIRECTIONAL);
3328 +       consistent_sync(p2, bytes, DMA_TO_DEVICE);
3329 +
3330 +
3331 +       tp.tx_desc = tp.tx_first_desc;
3332 +       tp.rx_desc = tp.rx_first_desc;
3333 +       if((tp.tx_desc->func_ctrl.bits.own == CPU)/*&&(tp.rx_desc->func_ctrl.bits.own == DMA)*/){
3334 +               // prepare tx descript
3335 +               raid_write_reg(RAID_FCHDMA_CURR_DESC,(unsigned int)tp.tx_desc-tx_desc_virtual_base,0xffffffff);
3336 +               tp.tx_desc->buf_addr = (unsigned int)__pa(p1);          // physical address
3337 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3338 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 2;                 // first descript
3339 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3340 +               tp.tx_desc->flg_status.bits32 = 0x00020000;
3341 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3342 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3343 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3344 +               wmb();
3345 +       tp.tx_desc = tp.tx_cur_desc;
3346 +       tp.tx_desc->buf_addr = (unsigned int)__pa(p2);          // pysical address
3347 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3348 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 1;                 // last descript
3349 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3350 +               tp.tx_desc->flg_status.bits32 = 0x00010000;
3351 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3352 +       tp.tx_desc->next_desc_addr.bits32 = 0x0000000b;// end of descript
3353 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);                                                  // keep last descript
3354 +
3355 +       wmb();
3356 +       // prepare rx descript
3357 +       raid_write_reg(RAID_STRDMA_CURR_DESC,(unsigned int)tp.rx_desc-rx_desc_virtual_base,0xFFFFFFFf);
3358 +       tp.rx_desc->buf_addr = (unsigned int)__pa(p1);
3359 +       tp.rx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3360 +       tp.rx_desc->flg_status.bits32 = 0;                              // link data from XOR
3361 +//     tp.rx_cur_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3362 +       tp.rx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3363 +       tp.rx_desc->next_desc_addr.bits32 = 0x0000000b;// end of descript
3364 +
3365 +       }
3366 +       else{
3367 +               /* no free tx descriptor */
3368 +               printk("XOR:no free tx descript");
3369 +               return ;
3370 +       }
3371 +
3372 +       // change status
3373 +//     tp.status = RUNNING;
3374 +       status = tp.busy = 1;
3375 +
3376 +       // start tx DMA
3377 +       rxdma_ctrl.bits.rd_start = 1;
3378 +       // start rx DMA
3379 +       txdma_ctrl.bits.td_start = 1;
3380 +
3381 +       raid_write_reg(RAID_FCHDMA_CTRL, txdma_ctrl.bits32,0x80000000);
3382 +       raid_write_reg(RAID_STRDMA_CTRL, rxdma_ctrl.bits32,0x80000000);
3383 +
3384 +#ifdef SPIN_WAIT
3385 +       gemini_xor_isr(2);
3386 +#else
3387 +       xor_queue_descriptor();
3388 +#endif
3389 +
3390 +       tp.tx_desc->next_desc_addr.bits32 = ((unsigned long)tp.tx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*2) ;
3391 +       tp.status = COMPLETE;
3392 +//     tp.rx_desc->next_desc_addr.bits32 = ((unsigned long)tp.rx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*1) ;
3393 +//     tp.rx_desc = tp.rx_first_desc ;
3394 +//     tp.rx_desc->func_ctrl.bits.own = DMA;
3395 +
3396 +}
3397 +
3398 +void
3399 +xor_gemini_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
3400 +               unsigned long *p3)
3401 +{
3402 +       int status=0;
3403 +       unsigned int flags;
3404 +
3405 +       if(bytes > (1<<(SRAM_PAR_SIZE+11))){
3406 +               printk("XOR: out of SRAM partition!![0x%x]\n",(unsigned int)bytes);
3407 +       }
3408 +
3409 +       spin_lock_irqsave(&raid_lock,flags);
3410 +       if(tp.status != COMPLETE){
3411 +               spin_unlock_irqrestore(&raid_lock, flags);
3412 +               //printk("XOR yield3\n");
3413 +#ifdef XOR_SW_FILL_IN
3414 +               xor_arm4regs_3(bytes,p1,p2,p3);
3415 +               return;
3416 +#else
3417 +               yield();
3418 +#endif
3419 +       }
3420 +       spin_unlock_irqrestore(&raid_lock, flags);
3421 +       tp.status = RUNNING;
3422 +
3423 +       // flush the cache to memory before H/W XOR touches them
3424 +       consistent_sync(p1, bytes, DMA_BIDIRECTIONAL);
3425 +       consistent_sync(p2, bytes, DMA_TO_DEVICE);
3426 +       consistent_sync(p3, bytes, DMA_TO_DEVICE);
3427 +
3428 +       tp.tx_desc = tp.tx_first_desc;
3429 +       tp.rx_desc = tp.rx_first_desc;
3430 +       if((tp.tx_desc->func_ctrl.bits.own == CPU)/*&&(tp.rx_desc->func_ctrl.bits.own == DMA)*/){
3431 +               // prepare tx descript
3432 +               raid_write_reg(RAID_FCHDMA_CURR_DESC,(unsigned int)tp.tx_desc-tx_desc_virtual_base,0xffffffff);
3433 +               tp.tx_desc->buf_addr = (unsigned int)__pa(p1);          // physical address
3434 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3435 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 2;                 // first descript
3436 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3437 +               tp.tx_desc->flg_status.bits32 = 0x00020000;
3438 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3439 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3440 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3441 +
3442 +       tp.tx_desc = tp.tx_cur_desc;
3443 +       tp.tx_desc->buf_addr = (unsigned int)__pa(p2);          // pysical address
3444 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3445 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 0;                 // first descript
3446 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3447 +               tp.tx_desc->flg_status.bits32 = 0x0000000;
3448 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3449 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3450 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3451 +
3452 +       tp.tx_desc = tp.tx_cur_desc;
3453 +       tp.tx_desc->buf_addr = (unsigned int)__pa(p3);          // pysical address
3454 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3455 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 1;                 // last descript
3456 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3457 +               tp.tx_desc->flg_status.bits32 = 0x00010000;
3458 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3459 +       tp.tx_desc->next_desc_addr.bits32 = 0x0000000b;// end of descript
3460 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);                                                  // keep last descript
3461 +
3462 +       // prepare rx descript
3463 +       raid_write_reg(RAID_STRDMA_CURR_DESC,(unsigned int)tp.rx_desc-rx_desc_virtual_base,0xFFFFFFFf);
3464 +       tp.rx_desc->buf_addr = (unsigned int)__pa(p1);
3465 +       tp.rx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3466 +       tp.rx_desc->flg_status.bits32 = 0;                              // link data from XOR
3467 +//     tp.rx_cur_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3468 +       tp.rx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3469 +       tp.rx_desc->next_desc_addr.bits32 = 0x0000000b;// end of descript
3470 +
3471 +       }
3472 +       else{
3473 +               /* no free tx descriptor */
3474 +               printk("XOR:no free tx descript \n");
3475 +               return ;
3476 +       }
3477 +
3478 +       // change status
3479 +//     tp.status = RUNNING;
3480 +       status = tp.busy = 1;
3481 +
3482 +       // start tx DMA
3483 +       rxdma_ctrl.bits.rd_start = 1;
3484 +       // start rx DMA
3485 +       txdma_ctrl.bits.td_start = 1;
3486 +       wmb();
3487 +       raid_write_reg(RAID_FCHDMA_CTRL, txdma_ctrl.bits32,0x80000000);
3488 +       raid_write_reg(RAID_STRDMA_CTRL, rxdma_ctrl.bits32,0x80000000);
3489 +
3490 +#ifdef SPIN_WAIT
3491 +       gemini_xor_isr(3);
3492 +#else
3493 +       xor_queue_descriptor();
3494 +#endif
3495 +       tp.tx_desc->next_desc_addr.bits32 = ((unsigned long)tp.tx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*3) | 0x0B;
3496 +       tp.status = COMPLETE;
3497 +//     tp.rx_desc->next_desc_addr.bits32 = ((unsigned long)tp.rx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*1) | 0x0B;
3498 +       //tp.rx_desc = tp.rx_first_desc ;
3499 +//     tp.rx_desc->func_ctrl.bits.own = DMA;
3500 +
3501 +}
3502 +
3503 +void
3504 +xor_gemini_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
3505 +               unsigned long *p3, unsigned long *p4)
3506 +{
3507 +       int status=0;
3508 +       unsigned int flags;
3509 +
3510 +       if(bytes > (1<<(SRAM_PAR_SIZE+11))){
3511 +               printk("XOR: out of SRAM partition!![0x%x]\n",(unsigned int)bytes);
3512 +       }
3513 +
3514 +       spin_lock_irqsave(&raid_lock,flags);
3515 +       if(tp.status != COMPLETE){
3516 +               spin_unlock_irqrestore(&raid_lock, flags);
3517 +               //printk("S\n");
3518 +#ifdef XOR_SW_FILL_IN
3519 +               xor_arm4regs_4(bytes,p1,p2,p3,p4);
3520 +               return;
3521 +#else
3522 +               msleep(1);
3523 +               yield();
3524 +#endif
3525 +       }
3526 +       spin_unlock_irqrestore(&raid_lock, flags);
3527 +
3528 +       tp.status = RUNNING;
3529 +
3530 +       // flush the cache to memory before H/W XOR touches them
3531 +       consistent_sync(p1, bytes, DMA_BIDIRECTIONAL);
3532 +       consistent_sync(p2, bytes, DMA_TO_DEVICE);
3533 +       consistent_sync(p3, bytes, DMA_TO_DEVICE);
3534 +       consistent_sync(p4, bytes, DMA_TO_DEVICE);
3535 +
3536 +       tp.tx_desc = tp.tx_first_desc;
3537 +       tp.rx_desc = tp.rx_first_desc;
3538 +       if((tp.tx_desc->func_ctrl.bits.own == CPU)/*&&(tp.rx_desc->func_ctrl.bits.own == DMA)*/){
3539 +               // prepare tx descript
3540 +               raid_write_reg(RAID_FCHDMA_CURR_DESC,(unsigned int)tp.tx_desc-tx_desc_virtual_base,0xffffffff);
3541 +               tp.tx_desc->buf_addr = (unsigned int)__pa(p1);          // physical address
3542 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3543 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 2;                 // first descript
3544 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3545 +               tp.tx_desc->flg_status.bits32 = 0x00020000;
3546 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3547 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3548 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3549 +
3550 +       tp.tx_desc = tp.tx_cur_desc;
3551 +       tp.tx_cur_desc->buf_addr = (unsigned int)__pa(p2);              // pysical address
3552 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3553 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 0;                 // first descript
3554 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3555 +               tp.tx_desc->flg_status.bits32 = 0x00000000;
3556 +       tp.tx_cur_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3557 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3558 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3559 +
3560 +       tp.tx_desc = tp.tx_cur_desc;
3561 +       tp.tx_desc->buf_addr = (unsigned int)__pa(p3);          // pysical address
3562 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3563 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 0;                 // first descript
3564 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3565 +               tp.tx_desc->flg_status.bits32 = 0x00000000;
3566 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3567 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3568 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3569 +
3570 +
3571 +       tp.tx_desc = tp.tx_cur_desc;
3572 +       tp.tx_desc->buf_addr = (unsigned int)__pa(p4);          // pysical address
3573 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3574 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 1;                 // last descript
3575 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3576 +               tp.tx_desc->flg_status.bits32 = 0x00010000;
3577 +//     tp.tx_cur_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3578 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3579 +       tp.tx_desc->next_desc_addr.bits32 = 0x0000000b;// end of descript
3580 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);                                                  // keep last descript
3581 +
3582 +       // prepare rx descript
3583 +       raid_write_reg(RAID_STRDMA_CURR_DESC,(unsigned int)tp.rx_desc-rx_desc_virtual_base,0xFFFFFFFF);
3584 +       tp.rx_desc->buf_addr = (unsigned int)__pa(p1);
3585 +       tp.rx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3586 +       tp.rx_desc->flg_status.bits32 = 0;                              // link data from XOR
3587 +//     tp.rx_cur_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3588 +       tp.rx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3589 +       tp.rx_desc->next_desc_addr.bits32 = 0x0000000b;// end of descript
3590 +
3591 +       }
3592 +       else{
3593 +               /* no free tx descriptor */
3594 +               printk("XOR:no free tx descript");
3595 +               return ;
3596 +       }
3597 +
3598 +       // change status
3599 +//     tp.status = RUNNING;
3600 +       status = tp.busy = 1;
3601 +
3602 +       // start tx DMA
3603 +       rxdma_ctrl.bits.rd_start = 1;
3604 +       // start rx DMA
3605 +       txdma_ctrl.bits.td_start = 1;
3606 +       wmb();
3607 +       raid_write_reg(RAID_FCHDMA_CTRL, txdma_ctrl.bits32,0x80000000);
3608 +       raid_write_reg(RAID_STRDMA_CTRL, rxdma_ctrl.bits32,0x80000000);
3609 +
3610 +#ifdef SPIN_WAIT
3611 +       gemini_xor_isr(4);
3612 +#else
3613 +       xor_queue_descriptor();
3614 +#endif
3615 +
3616 +       tp.tx_desc->next_desc_addr.bits32 = ((unsigned long)tp.tx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*4) | 0x0B;
3617 +       tp.status = COMPLETE;
3618 +//     tp.rx_desc->next_desc_addr.bits32 = ((unsigned long)tp.rx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*1) | 0x0B;
3619 +       //tp.rx_desc = tp.rx_first_desc ;
3620 +//     tp.rx_desc->func_ctrl.bits.own = DMA;
3621 +
3622 +}
3623 +
3624 +void
3625 +xor_gemini_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
3626 +               unsigned long *p3, unsigned long *p4, unsigned long *p5)
3627 +{
3628 +
3629 +       int status=0;
3630 +       unsigned int flags;
3631 +
3632 +
3633 +       if(bytes > (1<<(SRAM_PAR_SIZE+11))){
3634 +               printk("XOR: out of SRAM partition!![0x%x]\n",(unsigned int)bytes);
3635 +       }
3636 +
3637 +       spin_lock_irqsave(&raid_lock,flags);
3638 +       while(tp.status != COMPLETE){
3639 +               spin_unlock_irqrestore(&raid_lock, flags);
3640 +               //printk("XOR yield5\n");
3641 +#ifdef XOR_SW_FILL_IN
3642 +               xor_arm4regs_5(bytes,p1,p2,p3,p4,p5);
3643 +               return;
3644 +#else
3645 +               msleep(1);
3646 +               yield();
3647 +#endif
3648 +       }
3649 +       spin_unlock_irqrestore(&raid_lock, flags);
3650 +       tp.status = RUNNING;
3651 +
3652 +       // flush the cache to memory before H/W XOR touches them
3653 +       consistent_sync(p1, bytes, DMA_BIDIRECTIONAL);
3654 +       consistent_sync(p2, bytes, DMA_TO_DEVICE);
3655 +       consistent_sync(p3, bytes, DMA_TO_DEVICE);
3656 +       consistent_sync(p4, bytes, DMA_TO_DEVICE);
3657 +       consistent_sync(p5, bytes, DMA_TO_DEVICE);
3658 +
3659 +       tp.tx_desc = tp.tx_first_desc;
3660 +       tp.rx_desc = tp.rx_first_desc;
3661 +       if((tp.tx_desc->func_ctrl.bits.own == CPU)/*&&(tp.rx_desc->func_ctrl.bits.own == DMA)*/){
3662 +               // prepare tx descript
3663 +               raid_write_reg(RAID_FCHDMA_CURR_DESC,(unsigned int)tp.tx_desc-tx_desc_virtual_base,0xffffffff);
3664 +               tp.tx_desc->buf_addr = (unsigned int)__pa(p1);          // physical address
3665 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3666 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 2;                 // first descript
3667 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3668 +               tp.tx_desc->flg_status.bits32 = 0x00020000;
3669 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3670 +       wmb();
3671 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3672 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3673 +
3674 +       tp.tx_desc = tp.tx_cur_desc;
3675 +       tp.tx_desc->buf_addr = (unsigned int)__pa(p2);          // pysical address
3676 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3677 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 0;                 // first descript
3678 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3679 +               tp.tx_desc->flg_status.bits32 = 0x00000000;
3680 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3681 +       wmb();
3682 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3683 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3684 +
3685 +       tp.tx_desc = tp.tx_cur_desc;
3686 +       tp.tx_desc->buf_addr = (unsigned int)__pa(p3);          // pysical address
3687 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3688 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 0;                 // first descript
3689 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3690 +               tp.tx_desc->flg_status.bits32 = 0x00000000;
3691 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3692 +       wmb();
3693 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3694 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3695 +
3696 +               tp.tx_desc = tp.tx_cur_desc;
3697 +       tp.tx_desc->buf_addr = (unsigned int)__pa(p4);          // pysical address
3698 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3699 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 0;                 // first descript
3700 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3701 +               tp.tx_desc->flg_status.bits32 = 0x00000000;
3702 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3703 +       wmb();
3704 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3705 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3706 +
3707 +
3708 +       tp.tx_desc = tp.tx_cur_desc;
3709 +       tp.tx_desc->buf_addr = (unsigned int)__pa(p5);          // pysical address
3710 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3711 +//     tp.tx_desc->flg_status.bits_cmd_status.bcc = 1;                 // last descript
3712 +//     tp.tx_desc->flg_status.bits_cmd_status.mode = 0;                // only support XOR command
3713 +//     tp.tx_cur_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3714 +               tp.tx_desc->flg_status.bits32 = 0x00010000;
3715 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3716 +       tp.tx_desc->next_desc_addr.bits32 = 0x0000000b;// end of descript
3717 +       tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xfffffff0)+tx_desc_virtual_base);
3718 +       tp.tx_finished_desc = tp.tx_desc;                                                               // keep last descript
3719 +
3720 +       // prepare rx descript
3721 +       raid_write_reg(RAID_STRDMA_CURR_DESC,(unsigned int)tp.rx_desc-rx_desc_virtual_base,0xFFFFFFFF);
3722 +       tp.rx_desc->buf_addr = (unsigned int)__pa(p1);
3723 +       tp.rx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3724 +       tp.rx_desc->flg_status.bits32 = 0;                              // link data from XOR
3725 +//     tp.rx_cur_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3726 +       tp.rx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3727 +       tp.rx_desc->next_desc_addr.bits32 = 0x0000000b;// end of descript
3728 +
3729 +       }
3730 +       else{
3731 +               /* no free tx descriptor */
3732 +               printk("XOR:no free tx descript");
3733 +               return ;
3734 +       }
3735 +
3736 +       // change status
3737 +//     tp.status = RUNNING;
3738 +       status = tp.busy = 1;
3739 +
3740 +       // start tx DMA
3741 +       rxdma_ctrl.bits.rd_start = 1;
3742 +       // start rx DMA
3743 +       txdma_ctrl.bits.td_start = 1;
3744 +       wmb();
3745 +       raid_write_reg(RAID_FCHDMA_CTRL, txdma_ctrl.bits32,0x80000000);
3746 +       raid_write_reg(RAID_STRDMA_CTRL, rxdma_ctrl.bits32,0x80000000);
3747 +
3748 +#ifdef SPIN_WAIT
3749 +       gemini_xor_isr(5);
3750 +#else
3751 +       xor_queue_descriptor();
3752 +#endif
3753 +
3754 +       tp.tx_desc->next_desc_addr.bits32 = ((unsigned long)tp.tx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*5) | 0x0B;
3755 +       tp.status = COMPLETE;
3756 +//     tp.rx_desc->next_desc_addr.bits32 = ((unsigned long)tp.rx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*1) | 0x0B;
3757 +       //tp.rx_desc = tp.rx_first_desc ;
3758 +//     tp.rx_desc->func_ctrl.bits.own = DMA;
3759 +
3760 +}
3761 +
3762 +#ifdef XOR_TEST
3763 +void
3764 +raid_memset(unsigned int *p1, unsigned int pattern, unsigned int bytes)
3765 +{
3766 +       int status=0,i;
3767 +
3768 +       if(bytes > (1<<(SRAM_PAR_SIZE+11))){
3769 +               printk("XOR: out of SRAM partition!![0x%x]\n",(unsigned int)bytes);
3770 +       }
3771 +
3772 +       *p1 = pattern;
3773 +
3774 +       // flush the cache to memory before H/W XOR touches them
3775 +       consistent_sync(p1, bytes, DMA_BIDIRECTIONAL);
3776 +
3777 +       while(tp.status != COMPLETE){
3778 +               DPRINTK("XOR yield\n");
3779 +               //schedule();
3780 +               yield();
3781 +       }
3782 +       tp.status = RUNNING;
3783 +
3784 +       tp.tx_desc = tp.tx_first_desc;
3785 +       tp.rx_desc = tp.rx_first_desc;
3786 +       if((tp.tx_desc->func_ctrl.bits.own == CPU)/*&&(tp.rx_desc->func_ctrl.bits.own == DMA)*/){
3787 +               // prepare tx descript
3788 +               raid_write_reg(RAID_FCHDMA_CURR_DESC,(unsigned int)tp.tx_desc-tx_desc_virtual_base,0xFFFFFFFF);
3789 +               tp.tx_desc->buf_addr = (unsigned int)__pa(p1);          // physical address
3790 +       tp.tx_desc->func_ctrl.bits.buffer_size = 4;             /* total frame byte count */
3791 +       tp.tx_desc->flg_status.bits_cmd_status.bcc = bytes;                     // bytes to fill
3792 +       tp.tx_desc->flg_status.bits_cmd_status.mode = CMD_FILL;         // only support memory FILL command
3793 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3794 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3795 +       tp.tx_desc->next_desc_addr.bits32 = 0x0000000b;
3796 +//     tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xFFFFFFF0)+tx_desc_virtual_base);
3797 +
3798 +       // prepare rx descript
3799 +       raid_write_reg(RAID_STRDMA_CURR_DESC,(unsigned int)tp.rx_desc-rx_desc_virtual_base,0xFFFFFFFF);
3800 +       tp.rx_desc->buf_addr = (unsigned int)__pa(p1);
3801 +       tp.rx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3802 +       tp.rx_desc->flg_status.bits32 = 0;                              // link data from XOR
3803 +       tp.rx_cur_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3804 +       tp.rx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3805 +//     tp.rx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.rx_cur_desc->next_desc_addr.bits32 & 0xfffffff0)+rx_desc_virtual_base);
3806 +       tp.rx_desc->next_desc_addr.bits32 = 0x0000000b;// end of descript
3807 +       tp.rx_finished_desc = tp.rx_desc;
3808 +
3809 +       }
3810 +       else{
3811 +               /* no free tx descriptor */
3812 +               printk("XOR:no free tx descript");
3813 +               return ;
3814 +       }
3815 +
3816 +       // change status
3817 +       //tp.status = RUNNING;
3818 +       status = tp.busy = 1;
3819 +
3820 +       // start tx DMA
3821 +       rxdma_ctrl.bits.rd_start = 1;
3822 +       // start rx DMA
3823 +       txdma_ctrl.bits.td_start = 1;
3824 +
3825 +       raid_write_reg(RAID_FCHDMA_CTRL, txdma_ctrl.bits32,0x80000000);
3826 +       raid_write_reg(RAID_STRDMA_CTRL, rxdma_ctrl.bits32,0x80000000);
3827 +
3828 +#ifdef SPIN_WAIT
3829 +       gemini_xor_isr(2);
3830 +#else
3831 +       xor_queue_descriptor();
3832 +#endif
3833 +
3834 +       for(i=1; i<(bytes/sizeof(int)); i++) {
3835 +               if(p1[0]!=p1[i]){
3836 +                       printk("pattern set error!\n");
3837 +                       while(1);
3838 +               }
3839 +       }
3840 +
3841 +       tp.tx_desc->next_desc_addr.bits32 = ((unsigned long)tp.tx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*1) ;
3842 +       tp.status = COMPLETE;
3843 +//     tp.rx_desc->next_desc_addr.bits32 = ((unsigned long)tp.rx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*1) ;
3844 +       //tp.rx_desc = tp.rx_first_desc ;
3845 +//     tp.rx_desc->func_ctrl.bits.own = DMA;
3846 +
3847 +}
3848 +#endif
3849 +
3850 +void
3851 +raid_memcpy(unsigned int *to, unsigned int *from, unsigned int bytes)
3852 +{
3853 +       int status=0,i;
3854 +
3855 +       if(bytes > (1<<(SRAM_PAR_SIZE+11))){
3856 +               printk("XOR: out of SRAM partition!![0x%x]\n",(unsigned int)bytes);
3857 +       }
3858 +
3859 +       // flush the cache to memory before H/W XOR touches them
3860 +       consistent_sync(to, bytes, DMA_BIDIRECTIONAL);
3861 +       consistent_sync(from,bytes, DMA_TO_DEVICE);
3862 +
3863 +       while(tp.status != COMPLETE){
3864 +               DPRINTK("XOR yield\n");
3865 +               //schedule();
3866 +               yield();
3867 +       }
3868 +       tp.status = RUNNING;
3869 +
3870 +       tp.tx_desc = tp.tx_first_desc;
3871 +       tp.rx_desc = tp.rx_first_desc;
3872 +       if((tp.tx_desc->func_ctrl.bits.own == CPU)/*&&(tp.rx_desc->func_ctrl.bits.own == DMA)*/){
3873 +               // prepare tx descript
3874 +               raid_write_reg(RAID_FCHDMA_CURR_DESC,(unsigned int)tp.tx_desc-tx_desc_virtual_base,0xFFFFFFFF);
3875 +               tp.tx_desc->buf_addr = (unsigned int)__pa(from);                // physical address
3876 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3877 +       tp.tx_desc->flg_status.bits32 = CMD_CPY;                // only support memory FILL command
3878 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3879 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3880 +       tp.tx_desc->next_desc_addr.bits32 = 0x0000000b;
3881 +//     tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xFFFFFFF0)+tx_desc_virtual_base);
3882 +
3883 +       // prepare rx descript
3884 +       raid_write_reg(RAID_STRDMA_CURR_DESC,(unsigned int)tp.rx_desc-rx_desc_virtual_base,0xFFFFFFFF);
3885 +       tp.rx_desc->buf_addr = (unsigned int)__pa(to);
3886 +       tp.rx_desc->func_ctrl.bits.buffer_size = bytes;                 /* total frame byte count */
3887 +       tp.rx_desc->flg_status.bits32 = 0;                              // link data from XOR
3888 +       tp.rx_cur_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3889 +       tp.rx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3890 +//     tp.rx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.rx_cur_desc->next_desc_addr.bits32 & 0xfffffff0)+rx_desc_virtual_base);
3891 +       tp.rx_desc->next_desc_addr.bits32 = 0x0000000b;// end of descript
3892 +
3893 +       }
3894 +       else{
3895 +               /* no free tx descriptor */
3896 +               printk("XOR:no free tx descript");
3897 +               return ;
3898 +       }
3899 +
3900 +       // change status
3901 +       //tp.status = RUNNING;
3902 +       status = tp.busy = 1;
3903 +
3904 +       // start tx DMA
3905 +       rxdma_ctrl.bits.rd_start = 1;
3906 +       // start rx DMA
3907 +       txdma_ctrl.bits.td_start = 1;
3908 +
3909 +       raid_write_reg(RAID_FCHDMA_CTRL, txdma_ctrl.bits32,0x80000000);
3910 +       raid_write_reg(RAID_STRDMA_CTRL, rxdma_ctrl.bits32,0x80000000);
3911 +
3912 +#ifdef SPIN_WAIT
3913 +       gemini_xor_isr(2);
3914 +#else
3915 +       xor_queue_descriptor();
3916 +#endif
3917 +
3918 +#ifdef XOR_TEST
3919 +       for(i=1; i<(bytes/sizeof(int)); i++) {
3920 +               if(to[i]!=from[i]){
3921 +                       printk("pattern check error!\n");
3922 +                       printk("offset=0x%x p1=%x p2=%x\n",i*4,to[i],from[i]);
3923 +                       while(1);
3924 +               }
3925 +       }
3926 +#endif
3927 +
3928 +       tp.tx_desc->next_desc_addr.bits32 = ((unsigned long)tp.tx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*1) ;
3929 +       tp.status = COMPLETE;
3930 +//     tp.rx_desc->next_desc_addr.bits32 = ((unsigned long)tp.rx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*1) ;
3931 +       //tp.rx_desc = tp.rx_first_desc ;
3932 +//     tp.rx_desc->func_ctrl.bits.own = DMA;
3933 +
3934 +}
3935 +EXPORT_SYMBOL(raid_memcpy);
3936 +
3937 +#ifdef XOR_TEST
3938 +int
3939 +raid_memchk(unsigned int *p1, unsigned int pattern, unsigned int bytes)
3940 +{
3941 +       int status=0;
3942 +       RAID_DMA_STATUS_T       dma_status;
3943 +
3944 +       if(bytes > (1<<(SRAM_PAR_SIZE+11))){
3945 +               printk("XOR: out of SRAM partition!![0x%x]\n",(unsigned int)bytes);
3946 +       }
3947 +
3948 +       status = ((pattern&0xFFFF)%bytes )/4;
3949 +       p1[status] = pattern;
3950 +
3951 +       while(tp.status != COMPLETE){
3952 +               DPRINTK("XOR yield\n");
3953 +               //schedule();
3954 +               yield();
3955 +       }
3956 +       tp.status = RUNNING;
3957 +
3958 +       // flush the cache to memory before H/W XOR touches them
3959 +       consistent_sync(p1, bytes, DMA_BIDIRECTIONAL);
3960 +
3961 +       tp.tx_desc = tp.tx_first_desc;
3962 +       if((tp.tx_desc->func_ctrl.bits.own == CPU)/*&&(tp.rx_desc->func_ctrl.bits.own == DMA)*/){
3963 +               // prepare tx descript
3964 +               raid_write_reg(RAID_FCHDMA_CURR_DESC,(unsigned int)tp.tx_desc-tx_desc_virtual_base,0xFFFFFFFF);
3965 +               tp.tx_desc->buf_addr = (unsigned int)__pa(p1);          // physical address
3966 +       tp.tx_desc->func_ctrl.bits.raid_ctrl_status = 0;
3967 +       tp.tx_desc->func_ctrl.bits.buffer_size = bytes ;                /* total frame byte count */
3968 +       tp.tx_desc->flg_status.bits32 = CMD_CHK;                // only support memory FILL command
3969 +       tp.tx_desc->next_desc_addr.bits.sof_eof = 0x03;          /*only one descriptor*/
3970 +       tp.tx_desc->func_ctrl.bits.own = DMA;                           /* set owner bit */
3971 +       tp.tx_desc->next_desc_addr.bits32 = 0x0000000b;
3972 +//     tp.tx_cur_desc = (RAID_DESCRIPTOR_T *)((tp.tx_desc->next_desc_addr.bits32 & 0xFFFFFFF0)+tx_desc_virtual_base);
3973 +
3974 +       }
3975 +       else{
3976 +               /* no free tx descriptor */
3977 +               printk("XOR:no free tx descript");
3978 +               return -1;
3979 +       }
3980 +
3981 +       // change status
3982 +       //tp.status = RUNNING;
3983 +       status = tp.busy = 1;
3984 +
3985 +       // start tx DMA
3986 +       txdma_ctrl.bits.td_start = 1;
3987 +
3988 +       raid_write_reg(RAID_FCHDMA_CTRL, txdma_ctrl.bits32,0x80000000);
3989 +//     raid_write_reg(RAID_STRDMA_CTRL, rxdma_ctrl.bits32,0x80000000);
3990 +
3991 +#ifdef SPIN_WAIT
3992 +       gemini_xor_isr(2);
3993 +#else
3994 +       xor_queue_descriptor();
3995 +#endif
3996 +
3997 +//     dma_status.bits32 = raid_read_reg(RAID_DMA_STATUS);
3998 +//     if (dma_status.bits32 & (1<<15))        {
3999 +
4000 +       if((tp.tx_first_desc->func_ctrl.bits.raid_ctrl_status & 0x2)) {
4001 +               status = 1;
4002 +//             raid_write_reg(RAID_DMA_STATUS,0x00008000,0x00080000);
4003 +       }
4004 +       else{
4005 +               status = 0;
4006 +       }
4007 +
4008 +       tp.tx_desc->next_desc_addr.bits32 = ((unsigned long)tp.tx_first_desc - tx_desc_virtual_base + sizeof(RAID_DESCRIPTOR_T)*1) ;
4009 +       tp.status = COMPLETE;
4010 +//     tp.rx_desc->func_ctrl.bits.own = DMA;
4011 +       return status ;
4012 +}
4013 +#endif
4014 +
4015 +int __init gemini_xor_init(void)
4016 +{
4017 +       unsigned int res;
4018 +       unsigned int *paddr1,*paddr2,*paddr3,i;
4019 +       unsigned volatile char  *charact;
4020 +       unsigned volatile short *two_char;
4021 +       unsigned volatile int   *four_char;
4022 +
4023 +       // init descript
4024 +       res = gemini_xor_init_desc();
4025 +       if(res) {
4026 +               printk("Init RAID Descript Fail!!\n");
4027 +               return -res;
4028 +       }
4029 +
4030 +       tp.device_name = "Gemini XOR Acceleration";
4031 +
4032 +       // request irq
4033 +#ifndef SPIN_WAIT
4034 +       res = request_irq(IRQ_RAID, gemini_xor_isr, SA_INTERRUPT, tp.device_name, NULL);
4035 +#endif
4036 +       if(res){
4037 +               printk(KERN_ERR "%s: unable to request IRQ %d for "
4038 +                      "HW XOR %d\n", tp.device_name, IRQ_RAID, res);
4039 +               return -EBUSY;
4040 +       }
4041 +
4042 +#ifdef XOR_TEST
4043 +
4044 +RETEST:
4045 +       paddr1 = kmalloc(0x1000,GFP_KERNEL);
4046 +       paddr2 = kmalloc(0x1000,GFP_KERNEL);
4047 +       paddr3 = kmalloc(0x1000,GFP_KERNEL);
4048 +       for(i=0;i<TEST_ITERATION;i++) {
4049 +               printk("XOR test round %d\n",i);
4050 +               for(res=0;res<(0x1000)/sizeof(int);res++){              // prepare data pattern
4051 +                       paddr1[res]= readl(0xf62000ac);
4052 +                       paddr2[res]= readl(0xf62000ac);
4053 +               }
4054 +               for(res=0;res<0x1000/sizeof(int);res++){                // calculate xor by software
4055 +                       paddr3[res] = paddr1[res]^paddr2[res];
4056 +               }
4057 +               xor_gemini_2(0x1000,paddr1,paddr2);                             // calculate xor by hw
4058 +               for(res=0;res<0x1000/sizeof(int);res++){                // check error
4059 +                       if(paddr1[res]!=paddr3[res]){
4060 +                               printk("XOR ERROR\n");
4061 +                               printk("[%d][0x%x]=0x%x should be %x\n",res,&paddr1[res],paddr1[res],paddr3[res]);
4062 +                               while(1);
4063 +                       }
4064 +               }
4065 +       }
4066 +       kfree(paddr1);
4067 +       kfree(paddr2);
4068 +       kfree(paddr3);
4069 +
4070 +
4071 +       // memcpy test
4072 +       paddr1 = kmalloc(0x4000,GFP_KERNEL);
4073 +       for(i=0;i<TEST_ITERATION;i++) {
4074 +               for(res=0;res<(0x4000)/sizeof(int);res++)
4075 +                       paddr1[res]= readl(0xf62000ac);
4076 +
4077 +               printk("MEMCOPY round %d\n",i);
4078 +               paddr2 = kmalloc(0x4000,GFP_KERNEL);
4079 +               raid_memcpy(paddr2,paddr1,0x4000);
4080 +               kfree(paddr2);
4081 +       }
4082 +       kfree(paddr1);
4083 +
4084 +       // memset test
4085 +       for(i=0;i<TEST_ITERATION;i++) {
4086 +               raid_memset(paddr1,0xFFFFFFFF,0x4000);
4087 +               res = readl(0xf62000ac);
4088 +               printk("MEMFILL fill 0x%x round %d\n",res,i);
4089 +               paddr1 = kmalloc(0x4000,GFP_KERNEL);
4090 +               raid_memset(paddr1,res,0x4000);
4091 +               raid_memset(paddr1,0x0,0x4000);
4092 +               kfree(paddr1);
4093 +       }
4094 +
4095 +       paddr1 = kmalloc(0x4000,GFP_KERNEL);
4096 +       for(i=0;i<TEST_ITERATION;i++){
4097 +               raid_memset(paddr1, i,0x4000);
4098 +               printk("Pattern check same ? ");
4099 +               res = raid_memchk(paddr1, i,0x4000);
4100 +               printk("%s\n",res?"Fail":"OK");
4101 +               if(res) while(1);
4102 +
4103 +               printk("Pattern check diff ? ");
4104 +               res = raid_memchk(paddr1,readl(0xf62000ac),0x4000);
4105 +               printk("%s\n",res?"OK":"Fail");
4106 +               if(!res)        while(1);
4107 +       }
4108 +       kfree(paddr1);
4109 +
4110 +       // SRAM test
4111 +       raid_write_reg(RAID_PCR, 0,0x00000003);
4112 +       for(i=0;i<TEST_ITERATION;i++) {
4113 +               printk("SRAM test %d\n",i);
4114 +               charact = 0xF7000000;
4115 +               two_char = 0xF7000000;
4116 +               four_char = 0xF7000000;
4117 +               for(res=0;res<(16*1024)/sizeof(char);res++) {           // 8-bit access
4118 +                       *charact++ = (unsigned char)res;
4119 +               }
4120 +               charact = 0xF7000000;
4121 +               for(res=0;res<(16*1024)/sizeof(char);res++) {
4122 +                       if(*charact++ != (unsigned char)res){
4123 +                               printk("SRAM data error(8)\n");
4124 +                               while(1);
4125 +                       }
4126 +               }
4127 +
4128 +               for(res=0;res<(16*1024)/sizeof(short);res++) {          // 16-bit access
4129 +                       *two_char++ = (unsigned short)res;
4130 +               }
4131 +               two_char = 0xF7000000;
4132 +               for(res=0;res<(16*1024)/sizeof(short);res++) {
4133 +                       if(*two_char++ != (unsigned short)res){
4134 +                               printk("SRAM data error(16)\n");
4135 +                               while(1);
4136 +                       }
4137 +               }
4138 +
4139 +               for(res=0;res<(16*1024)/sizeof(int);res++) {            // 32-bit access
4140 +                       *four_char++ = (unsigned int)res;
4141 +               }
4142 +               four_char = 0xF7000000;
4143 +               for(res=0;res<(16*1024)/sizeof(int);res++) {
4144 +                       if(*four_char++ != (unsigned int)res){
4145 +                               printk("SRAM data error(32)\n");
4146 +                               while(1);
4147 +                       }
4148 +               }
4149 +       }
4150 +       raid_write_reg(RAID_PCR, SRAM_PAR_SIZE,0x00000003);
4151 +
4152 +#endif
4153 +       return 0;
4154 +}
4155 +
4156 +void __exit gemini_xor_exit(void)
4157 +{
4158 +       DMA_MFREE(tp.tx_desc, TX_DESC_NUM*sizeof(RAID_DESCRIPTOR_T),(unsigned int)tp.tx_desc_dma);
4159 +       DMA_MFREE(tp.rx_desc, RX_DESC_NUM*sizeof(RAID_DESCRIPTOR_T),(unsigned int)tp.rx_desc_dma);
4160 +       free_irq(IRQ_RAID, NULL);
4161 +}
4162 +
4163 +
4164 +static int gemini_xor_init_desc(void)
4165 +{
4166 +       unsigned int i;
4167 +       dma_addr_t          tx_first_desc_dma;
4168 +       dma_addr_t          rx_first_desc_dma;
4169 +       RAID_DMA_STATUS_T       dma_status;
4170 +
4171 +       printk("Initial RAID Descripter...\n");
4172 +
4173 +       tp.tx_desc = (RAID_DESCRIPTOR_T*)DMA_MALLOC(TX_DESC_NUM*sizeof(RAID_DESCRIPTOR_T),(dma_addr_t *)&tp.tx_desc_dma);
4174 +    tx_desc_virtual_base = (unsigned int)tp.tx_desc - (unsigned int)tp.tx_desc_dma;
4175 +    memset(tp.tx_desc,0x00,TX_DESC_NUM*sizeof(RAID_DESCRIPTOR_T));
4176 +
4177 +       tp.rx_desc = (RAID_DESCRIPTOR_T*)DMA_MALLOC(RX_DESC_NUM*sizeof(RAID_DESCRIPTOR_T),(dma_addr_t *)&tp.rx_desc_dma);
4178 +    rx_desc_virtual_base = (unsigned int)tp.rx_desc - (unsigned int)tp.rx_desc_dma;
4179 +    memset(tp.rx_desc,0x00,RX_DESC_NUM*sizeof(RAID_DESCRIPTOR_T));
4180 +       printk("XOR:tx_desc = %08x\n",(unsigned int)tp.tx_desc);
4181 +    printk("XOR:rx_desc = %08x\n",(unsigned int)tp.rx_desc);
4182 +       printk("XOR:tx_desc_dma = %08x\n",(unsigned int)tp.tx_desc_dma);
4183 +       printk("XOR:rx_desc_dma = %08x\n",(unsigned int)tp.rx_desc_dma);
4184 +
4185 +       if ((tp.tx_desc == NULL) || (tp.rx_desc == NULL)) {
4186 +               if (tp.tx_desc)
4187 +                       DMA_MFREE(tp.tx_desc, TX_DESC_NUM*sizeof(RAID_DESCRIPTOR_T),(dma_addr_t)tp.tx_desc_dma);
4188 +               if (tp.rx_desc)
4189 +                       DMA_MFREE(tp.rx_desc, RX_DESC_NUM*sizeof(RAID_DESCRIPTOR_T),(dma_addr_t)tp.rx_desc_dma);
4190 +               return -ENOMEM;
4191 +       }
4192 +
4193 +       tp.tx_cur_desc = tp.tx_desc;  /* virtual address */
4194 +       tp.tx_finished_desc = tp.tx_desc; /* virtual address */
4195 +       tx_first_desc_dma = (dma_addr_t)tp.tx_desc_dma; /* physical address */
4196 +       for (i = 1; i < TX_DESC_NUM; i++) {
4197 +               tp.tx_desc->func_ctrl.bits.own = CPU;
4198 +               tp.tx_desc->func_ctrl.bits.buffer_size = 0;
4199 +               tp.tx_desc_dma = tp.tx_desc_dma + sizeof(RAID_DESCRIPTOR_T);
4200 +//             tp.tx_desc->next_desc_addr.bits32 = (unsigned int)tp.tx_desc_dma | 0x0B;
4201 +               tp.tx_desc->next_desc_addr.bits32 = ((unsigned int)tx_first_desc_dma | 0x0B) + i*0x10;
4202 +               tp.tx_desc = &tp.tx_desc[1];
4203 +       }
4204 +       tp.tx_desc->func_ctrl.bits.own = DMA;
4205 +       tp.tx_desc->next_desc_addr.bits32 = (unsigned int)tx_first_desc_dma|0x0b;
4206 +       tp.tx_desc = tp.tx_cur_desc;
4207 +       tp.tx_desc_dma = (unsigned int*)tx_first_desc_dma;
4208 +       tp.tx_first_desc = tp.tx_desc ;
4209 +
4210 +       tp.rx_cur_desc = tp.rx_desc;  /* virtual address */
4211 +       tp.rx_finished_desc = tp.rx_desc; /* virtual address */
4212 +       rx_first_desc_dma = (dma_addr_t)tp.rx_desc_dma; /* physical address */
4213 +       for (i = 1; i < RX_DESC_NUM; i++) {
4214 +               tp.rx_desc->func_ctrl.bits.own = DMA;
4215 +               tp.rx_desc->func_ctrl.bits.buffer_size = 0;
4216 +               tp.rx_desc_dma = tp.rx_desc_dma + sizeof(RAID_DESCRIPTOR_T);
4217 +//             tp.rx_desc->next_desc_addr.bits32 = (unsigned int)tp.rx_desc_dma | 0x0B;
4218 +               tp.rx_desc->next_desc_addr.bits32 = ((unsigned int)rx_first_desc_dma | 0x0B) + i*0x10;
4219 +               tp.rx_desc = &tp.rx_desc[1];
4220 +       }
4221 +       tp.rx_desc->func_ctrl.bits.own = DMA;
4222 +       tp.rx_desc->next_desc_addr.bits32 = rx_first_desc_dma|0x0b;
4223 +       tp.rx_desc = tp.rx_cur_desc;
4224 +       tp.rx_desc_dma = (unsigned int*)rx_first_desc_dma;
4225 +       tp.rx_first_desc = tp.rx_desc ;
4226 +       tp.busy = 0;
4227 +       tp.status = COMPLETE;
4228 +
4229 +       // Partition SRAM size
4230 +       raid_write_reg(RAID_PCR, SRAM_PAR_SIZE,0x00000003);
4231 +
4232 +       // config tx DMA controler
4233 +       txdma_ctrl.bits32 = 0;
4234 +       txdma_ctrl.bits.td_start = 0;
4235 +       txdma_ctrl.bits.td_continue = 1;
4236 +       txdma_ctrl.bits.td_chain_mode = 1;
4237 +       txdma_ctrl.bits.td_prot = 0;
4238 +       txdma_ctrl.bits.td_burst_size = 1;
4239 +       txdma_ctrl.bits.td_bus = 3;
4240 +       txdma_ctrl.bits.td_endian = 0;
4241 +       txdma_ctrl.bits.td_finish_en = 1;
4242 +       txdma_ctrl.bits.td_fail_en = 1;
4243 +       txdma_ctrl.bits.td_perr_en = 1;
4244 +       txdma_ctrl.bits.td_eod_en = 0;  // enable tx descript
4245 +       txdma_ctrl.bits.td_eof_en = 0;
4246 +       raid_write_reg(RAID_FCHDMA_CTRL, txdma_ctrl.bits32,0xFFFFFFFF);
4247 +
4248 +       // config rx DMA controler
4249 +       rxdma_ctrl.bits32 = 0;
4250 +       rxdma_ctrl.bits.rd_start = 0;
4251 +       rxdma_ctrl.bits.rd_continue = 1;
4252 +       rxdma_ctrl.bits.rd_chain_mode = 1;
4253 +       rxdma_ctrl.bits.rd_prot = 0;
4254 +       rxdma_ctrl.bits.rd_burst_size = 1;
4255 +       rxdma_ctrl.bits.rd_bus = 3;
4256 +       rxdma_ctrl.bits.rd_endian = 0;
4257 +       rxdma_ctrl.bits.rd_finish_en = 0;
4258 +       rxdma_ctrl.bits.rd_fail_en = 1;
4259 +       rxdma_ctrl.bits.rd_perr_en = 1;
4260 +       rxdma_ctrl.bits.rd_eod_en = 0;
4261 +       rxdma_ctrl.bits.rd_eof_en = 0;
4262 +       raid_write_reg(RAID_STRDMA_CTRL, rxdma_ctrl.bits32,0xFFFFFFFF);
4263 +
4264 +       // enable interrupt
4265 +       dma_status.bits32 = 3;  // enable RpInt
4266 +       raid_write_reg(RAID_DMA_STATUS, dma_status.bits32,0xFFFFFFFF);
4267 +
4268 +       return 0;
4269 +}
4270 +
4271 +module_init(gemini_xor_init);
4272 +module_exit(gemini_xor_exit);
4273 +
4274 --- a/arch/arm/mm/Kconfig
4275 +++ b/arch/arm/mm/Kconfig
4276 @@ -187,6 +187,26 @@
4277           Say Y if you want support for the ARM926T processor.
4278           Otherwise, say N.
4279  
4280 +###### for Storlink SoC ######
4281 +config CPU_FA526
4282 +       bool "FA526 processor"
4283 +       depends on ARCH_SL2312
4284 +       default y
4285 +       select CPU_32v4
4286 +       select CPU_ABRT_EV4
4287 +       select CPU_CACHE_FA
4288 +       select CPU_CACHE_VIVT
4289 +       select CPU_CP15_MMU
4290 +       select CPU_COPY_FA
4291 +       select CPU_TLB_FA
4292 +       select CPU_FA_BTB
4293 +       help
4294 +         The FA526 is a version of the ARM9 compatible processor, but with smaller
4295 +         instruction and data caches. It is used in Storlink Sword device family.
4296 +
4297 +         Say Y if you want support for the FA526 processor.
4298 +         Otherwise, say N.
4299 +
4300  # ARM940T
4301  config CPU_ARM940T
4302         bool "Support ARM940T processor" if ARCH_INTEGRATOR
4303 @@ -461,6 +481,9 @@
4304  config CPU_CACHE_VIPT
4305         bool
4306  
4307 +config CPU_CACHE_FA
4308 +       bool
4309 +
4310  if MMU
4311  # The copy-page model
4312  config CPU_COPY_V3
4313 @@ -475,6 +498,12 @@
4314  config CPU_COPY_V6
4315         bool
4316  
4317 +config CPU_COPY_FA
4318 +       bool
4319 +
4320 +config CPU_FA_BTB
4321 +       bool
4322 +
4323  # This selects the TLB model
4324  config CPU_TLB_V3
4325         bool
4326 @@ -534,6 +563,14 @@
4327  config IO_36
4328         bool
4329  
4330 +config CPU_TLB_FA
4331 +       bool
4332 +       help
4333 +         //TODO
4334 +         Faraday ARM FA526 architecture, unified TLB with writeback cache
4335 +         and invalidate instruction cache entry. Branch target buffer is also
4336 +         supported.
4337 +
4338  comment "Processor Features"
4339  
4340  config ARM_THUMB
4341 @@ -600,7 +637,7 @@
4342  
4343  config CPU_DCACHE_WRITETHROUGH
4344         bool "Force write through D-cache"
4345 -       depends on (CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020) && !CPU_DCACHE_DISABLE
4346 +       depends on (CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_FA526) && !CPU_DCACHE_DISABLE
4347         default y if CPU_ARM925T
4348         help
4349           Say Y here to use the data cache in writethrough mode. Unless you
4350 --- a/arch/arm/mm/Makefile
4351 +++ b/arch/arm/mm/Makefile
4352 @@ -32,6 +32,7 @@
4353  obj-$(CONFIG_CPU_CACHE_V4WB)   += cache-v4wb.o
4354  obj-$(CONFIG_CPU_CACHE_V6)     += cache-v6.o
4355  obj-$(CONFIG_CPU_CACHE_V7)     += cache-v7.o
4356 +obj-$(CONFIG_CPU_CACHE_FA)     += cache-fa.o
4357  
4358  obj-$(CONFIG_CPU_COPY_V3)      += copypage-v3.o
4359  obj-$(CONFIG_CPU_COPY_V4WT)    += copypage-v4wt.o
4360 @@ -40,6 +41,7 @@
4361  obj-$(CONFIG_CPU_SA1100)       += copypage-v4mc.o
4362  obj-$(CONFIG_CPU_XSCALE)       += copypage-xscale.o
4363  obj-$(CONFIG_CPU_XSC3)         += copypage-xsc3.o
4364 +obj-$(CONFIG_CPU_COPY_FA)      += copypage-fa.o
4365  
4366  obj-$(CONFIG_CPU_TLB_V3)       += tlb-v3.o
4367  obj-$(CONFIG_CPU_TLB_V4WT)     += tlb-v4.o
4368 @@ -47,6 +49,7 @@
4369  obj-$(CONFIG_CPU_TLB_V4WBI)    += tlb-v4wbi.o
4370  obj-$(CONFIG_CPU_TLB_V6)       += tlb-v6.o
4371  obj-$(CONFIG_CPU_TLB_V7)       += tlb-v7.o
4372 +obj-$(CONFIG_CPU_TLB_FA)       += tlb-fa.o
4373  
4374  obj-$(CONFIG_CPU_ARM610)       += proc-arm6_7.o
4375  obj-$(CONFIG_CPU_ARM710)       += proc-arm6_7.o
4376 @@ -60,6 +63,7 @@
4377  obj-$(CONFIG_CPU_ARM926T)      += proc-arm926.o
4378  obj-$(CONFIG_CPU_ARM940T)      += proc-arm940.o
4379  obj-$(CONFIG_CPU_ARM946E)      += proc-arm946.o
4380 +obj-$(CONFIG_CPU_FA526)                += proc-fa526.o
4381  obj-$(CONFIG_CPU_ARM1020)      += proc-arm1020.o
4382  obj-$(CONFIG_CPU_ARM1020E)     += proc-arm1020e.o
4383  obj-$(CONFIG_CPU_ARM1022)      += proc-arm1022.o
4384 --- /dev/null
4385 +++ b/arch/arm/mm/cache-fa.S
4386 @@ -0,0 +1,400 @@
4387 +/*
4388 + *  linux/arch/arm/mm/cache-fa.S
4389 + *
4390 + *  Copyright (C) 2005 Faraday Corp.
4391 + *
4392 + * This program is free software; you can redistribute it and/or modify
4393 + * it under the terms of the GNU General Public License version 2 as
4394 + * published by the Free Software Foundation.
4395 + *
4396 + *  Processors: FA520 FA526 FA626      
4397 + * 03/31/2005 :        Luke Lee created, modified from cache-v4wb.S
4398 + * 04/06/2005 :        1. Read CR0-1 and determine the cache size dynamically,
4399 + *                to suit all Faraday CPU series
4400 + *             2. Fixed all functions
4401 + * 04/08/2005 :        insert CONFIG_CPU_ICACHE_DISABLE and CONFIG_CPU_DCACHE_DISABLE
4402 + * 04/12/2005 :        TODO: make this processor dependent or a self-modifying code to 
4403 + *             inline cache len/size info into the instructions, as reading cache 
4404 + *             size and len info in memory could cause another cache miss.
4405 + * 05/05/2005 :        Modify fa_flush_user_cache_range to comply APCS.
4406 + * 05/19/2005 :        Adjust for boundary conditions.
4407 + */
4408 +#include <linux/linkage.h>
4409 +#include <linux/init.h>
4410 +#include <asm/hardware.h>
4411 +#include <asm/page.h>
4412 +#include "proc-macros.S"
4413 +
4414 +#define CACHE_DLINESIZE           16
4415 +#ifdef CONFIG_SL3516_ASIC
4416 +#define CACHE_DSIZE       8192
4417 +#else
4418 +#define CACHE_DSIZE       16384 
4419 +#endif 
4420 +#define CACHE_ILINESIZE           16
4421 +#define CACHE_ISIZE       16384
4422 +
4423 +/* Luke Lee 04/06/2005 ins begin */
4424 +/*
4425 + *     initialize_cache_info()
4426 + *
4427 + *     Automatic detection of DSIZE, DLEN, ISIZE, ILEN variables according to 
4428 + *     system register CR0-1
4429 + *     Destroyed register: r0, r1, r2, r3, ip
4430 + */
4431 +       .align
4432 +ENTRY(fa_initialize_cache_info)
4433 +       mov     r3, #1                          @ r3 always = 1
4434 +       adr     ip, __fa_cache_ilen
4435 +       
4436 +       mrc     p15, 0, r0, c0, c0, 1
4437 +       /* ILEN */
4438 +       and     r1, r0, #3                      @ bits [1:0]
4439 +       add     r1, r1, #3                      @ cache line size is at least 8 bytes (2^3)
4440 +       mov     r2, r3, lsl r1                  @ r2 = 1<<r1
4441 +       str     r2, [ip], #4
4442 +       /* ISIZE */
4443 +       mov     r1, r0, lsr #6                  @ bits [8:6]
4444 +       and     r1, r1, #7
4445 +       add     r1, r1, #9                      @ cache size is at least 512 bytes (2^9)
4446 +       mov     r2, r3, lsl r1
4447 +       str     r2, [ip], #4
4448 +       /* DLEN */
4449 +       mov     r1, r0, lsr #12
4450 +       and     r1, r1, #3                      @ bits [13:12]
4451 +       add     r1, r1, #3                      @ cache line size is at least 8 bytes (2^3)
4452 +       mov     r2, r3, lsl r1                  @ r2 = 1<<r1
4453 +       str     r2, [ip], #4
4454 +       /* DSIZE */
4455 +       mov     r1, r0, lsr #18                 @ bits [20:18]
4456 +       and     r1, r1, #7
4457 +       add     r1, r1, #9                      @ cache size is at least 512 bytes (2^9)
4458 +       mov     r2, r3, lsl r1
4459 +       str     r2, [ip]
4460 +       mov     pc, lr
4461 +
4462 +       /* Warning : Do not change the order ! Successive codes depends on this */
4463 +       .align
4464 +       .globl __fa_cache_ilen, __fa_cache_isize, __fa_cache_dlen, __fa_cache_dsize
4465 +__fa_cache_ilen:
4466 +       .word   0                               @ instruction cache line length
4467 +__fa_cache_isize:
4468 +       .word   0                               @ instruction cache size
4469 +__fa_cache_dlen:
4470 +       .word   0                               @ data cahce line length        
4471 +__fa_cache_dsize:
4472 +       .word   0                               @ data cache size
4473 +
4474 +/* Luke Lee 04/06/2005 ins end */
4475 +
4476 +/*
4477 + *     flush_user_cache_all()
4478 + *
4479 + *     Clean and invalidate all cache entries in a particular address
4480 + *     space.
4481 + */
4482 +ENTRY(fa_flush_user_cache_all)
4483 +       /* FALLTHROUGH */
4484 +/*
4485 + *     flush_kern_cache_all()
4486 + *
4487 + *     Clean and invalidate the entire cache.
4488 + */
4489 +ENTRY(fa_flush_kern_cache_all)
4490 +/* Luke Lee 04/06/2005 mod ok */
4491 +       mov     ip, #0
4492 +       
4493 +#ifndef CONFIG_CPU_ICACHE_DISABLE
4494 +       mcr     p15, 0, ip, c7, c5, 0           @ invalidate I cache
4495 +#endif
4496 +       
4497 +__flush_whole_cache:
4498 +       
4499 +#ifndef CONFIG_CPU_DCACHE_DISABLE
4500 +       mov     ip, #0
4501 +#  ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
4502 +       mcr     p15, 0, ip, c7, c6, 0           @ invalidate D cache
4503 +#  else
4504 +       mcr     p15, 0, ip, c7,c14, 0           @ clean/invalidate D cache
4505 +#  endif
4506 +#endif /*CONFIG_CPU_DCACHE_DISABLE*/
4507 +       
4508 +#ifndef CONFIG_CPU_FA_WB_DISABLE       
4509 +       mcr     p15, 0, ip, c7, c10, 4          @ drain write buffer
4510 +#endif
4511 +       
4512 +#ifdef CONFIG_CPU_FA_BTB
4513 +       mcr     p15, 0, ip, c7, c5, 6           @ invalidate BTB
4514 +       nop
4515 +       nop
4516 +#endif
4517 +       
4518 +/* Luke Lee 04/06/2005 que todo tofix : should iscratchpad and dscratchpad be invalidated ? */
4519 +       mov     pc, lr
4520 +
4521 +/*
4522 + *     flush_user_cache_range(start, end, flags)
4523 + *
4524 + *     Invalidate a range of cache entries in the specified
4525 + *     address space.
4526 + *
4527 + *     - start - start address (inclusive, page aligned)
4528 + *     - end   - end address (exclusive, page aligned)
4529 + *     - flags - vma_area_struct flags describing address space
4530 + */
4531 +ENTRY(fa_flush_user_cache_range)
4532 +
4533 +/* Luke Lee 04/06/2005 mod ok */
4534 +       /* Luke Lee 04/07/2005 ins 1 */
4535 +       mov     ip, #0
4536 +       sub     r3, r1, r0                      @ calculate total size
4537 +#ifndef CONFIG_CPU_ICACHE_DISABLE
4538 +       tst     r2, #VM_EXEC                    @ executable region?
4539 +       mcrne   p15, 0, ip, c7, c5, 0           @ invalidate I cache
4540 +#endif
4541 +
4542 +#ifndef CONFIG_CPU_DCACHE_DISABLE      
4543 +       /* Luke Lee 04/06/2005 ins 2 mod 1 */
4544 +       cmp     r3, #CACHE_DSIZE                @ total size >= limit?
4545 +       bhs     __flush_whole_cache             @ flush whole D cache
4546 +
4547 +       //debug_Aaron
4548 +        bic     r0, r0, #CACHE_DLINESIZE-1  
4549 +       mcr     p15, 0, r0, c7, c14, 1          @ clean and invalidate boundary D entry
4550 +        bic     r1, r1, #CACHE_DLINESIZE-1  
4551 +       mcr     p15, 0, r1, c7, c14, 1          @ clean and invalidate boundary D entry
4552 +
4553 +
4554 +1:     /* Luke Lee 04/06/2005 del 2 ins 5 */
4555 +       
4556 +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
4557 +       mcr     p15, 0, r0, c7, c6, 1           @ invalidate D entry
4558 +#else
4559 +       mcr     p15, 0, r0, c7, c14, 1          @ clean and invalidate D entry
4560 +#endif
4561 +       /* Luke Lee 04/06/2005 mod 1 */
4562 +       add     r0, r0, #CACHE_DLINESIZE
4563 +       cmp     r0, r1
4564 +       bls     1b                              @ Luke Lee 05/19/2005
4565 +#endif /* CONFIG_CPU_DCACHE_DISABLE */
4566 +       
4567 +#ifndef CONFIG_CPU_FA_WB_DISABLE
4568 +       tst     r2, #VM_EXEC
4569 +       /* Luke Lee 04/06/2005 mod 1 tofix todo : ne->eq */
4570 +       mcreq   p15, 0, r4, c7, c10, 4          @ drain write buffer
4571 +#endif
4572 +
4573 +       /* Luke Lee 04/06/2005 ins block */
4574 +#ifdef CONFIG_CPU_FA_BTB
4575 +        tst     r2, #VM_EXEC
4576 +       mov     ip, #0
4577 +       mcrne   p15, 0, ip, c7, c5, 6           @ invalidate BTB
4578 +       nop
4579 +       nop
4580 +#endif
4581 +       mov     pc, lr
4582 +
4583 +/*
4584 + *     flush_kern_dcache_page(void *page)
4585 + *
4586 + *     Ensure no D cache aliasing occurs, either with itself or
4587 + *     the I cache
4588 + *
4589 + *     - addr  - page aligned address
4590 + */
4591 +ENTRY(fa_flush_kern_dcache_page)
4592 +       add     r1, r0, #PAGE_SZ
4593 +       /* fall through */
4594 +
4595 +/*
4596 + *     coherent_kern_range(start, end)
4597 + *
4598 + *     Ensure coherency between the Icache and the Dcache in the
4599 + *     region described by start.  If you have non-snooping
4600 + *     Harvard caches, you need to implement this function.
4601 + *
4602 + *     - start  - virtual start address
4603 + *     - end    - virtual end address
4604 + */
4605 +ENTRY(fa_coherent_kern_range)
4606 +       /* fall through */
4607 +
4608 +/*
4609 + *     coherent_user_range(start, end)
4610 + *
4611 + *     Ensure coherency between the Icache and the Dcache in the
4612 + *     region described by start.  If you have non-snooping
4613 + *     Harvard caches, you need to implement this function.
4614 + *
4615 + *     - start  - virtual start address
4616 + *     - end    - virtual end address
4617 + */
4618 +ENTRY(fa_coherent_user_range)
4619 +
4620 +/* Luke Lee 04/06/2005 mod ok */
4621 +       /* Luke Lee 04/06/2005 ins 3 mod 1 */
4622 +       bic     r0, r0, #CACHE_DLINESIZE-1
4623 +
4624 + //debug_Aaron
4625 +        bic     r0, r0, #CACHE_DLINESIZE-1
4626 +        mcr     p15, 0, r0, c7, c14, 1          @ clean and invalidate boundary D entry
4627 +        bic     r1, r1, #CACHE_DLINESIZE-1
4628 +        mcr     p15, 0, r1, c7, c14, 1          @ clean and invalidate boundary D entry
4629 +
4630 +#if !(defined(CONFIG_CPU_DCACHE_DISABLE) && defined(CONFIG_CPU_ICACHE_DISABLE))
4631 +1:     /* Luke Lee 04/06/2005 del 2 ins 5 mod 1 */
4632 +#ifndef CONFIG_CPU_DCACHE_DISABLE      
4633 +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
4634 +       mcr     p15, 0, r0, c7, c6, 1           @ invalidate D entry
4635 +#else
4636 +       mcr     p15, 0, r0, c7, c14, 1          @ clean and invalidate D entry
4637 +#endif
4638 +#endif /* CONFIG_CPU_DCACHE_DISABLE */
4639 +       
4640 +#ifndef CONFIG_CPU_ICACHE_DISABLE
4641 +       mcr     p15, 0, r0, c7, c5, 1           @ invalidate I entry
4642 +#endif
4643 +       add     r0, r0, #CACHE_DLINESIZE
4644 +       cmp     r0, r1
4645 +       bls     1b                              @ Luke Lee 05/19/2005 blo->bls  
4646 +#endif /* !(defined(CONFIG_CPU_DCACHE_DISABLE) && defined(CONFIG_CPU_ICACHE_DISABLE)) */
4647 +
4648 +       mov     ip, #0
4649 +#ifdef CONFIG_CPU_FA_BTB
4650 +       mcr     p15, 0, ip, c7, c5, 6           @ invalidate BTB
4651 +       nop
4652 +       nop
4653 +#endif
4654 +
4655 +/* Luke Lee 04/08/2005 ins 1 skp 1 ins 1 */
4656 +#ifndef CONFIG_CPU_FA_WB_DISABLE
4657 +       mcr     p15, 0, ip, c7, c10, 4          @ drain WB
4658 +#endif
4659 +
4660 +       mov     pc, lr
4661 +
4662 +/*
4663 + *     dma_inv_range(start, end)
4664 + *
4665 + *     Invalidate (discard) the specified virtual address range.
4666 + *     May not write back any entries.  If 'start' or 'end'
4667 + *     are not cache line aligned, those lines must be written
4668 + *     back.
4669 + *
4670 + *     - start  - virtual start address
4671 + *     - end    - virtual end address
4672 + */
4673 +ENTRY(fa_dma_inv_range)
4674 +
4675 +/* Luke Lee 04/06/2005 mod ok */
4676 +
4677 +#ifndef CONFIG_CPU_DCACHE_DISABLE      
4678 +
4679 + //debug_Aaron
4680 +        bic     r0, r0, #CACHE_DLINESIZE-1
4681 +        mcr     p15, 0, r0, c7, c6, 1          @ invalidate boundary D entry
4682 +        bic     r1, r1, #CACHE_DLINESIZE-1
4683 +        mcr     p15, 0, r1, c7, c6, 1          @ invalidate boundary D entry
4684 +
4685 +       /* Luke Lee 04/06/2005 ins 4 mod 2 */
4686 +#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
4687 +       tst     r0, #CACHE_DLINESIZE -1
4688 +       bic     r0, r0, #CACHE_DLINESIZE -1
4689 +
4690 +//debug_Aaron
4691 +       //mcrne p15, 0, r0, c7, c10, 1          @ clean boundary D entry
4692 +
4693 +       /* Luke Lee 04/06/2005 mod 1 */
4694 +       /* Luke Lee 05/19/2005 always clean the end-point boundary mcrne->mcr */
4695 +       ////tst r1, #CACHE_DLINESIZE -1
4696 +       //mcr   p15, 0, r1, c7, c10, 1          @ clean boundary D entry
4697 +       /* Luke Lee 04/06/2005 ins 1 */
4698 +#else
4699 +       bic     r0, r0, #CACHE_DLINESIZE -1     
4700 +#endif
4701 +
4702 +//debug_Aaron  
4703 +1:     mcr     p15, 0, r0, c7, c6, 1           @ invalidate D entry
4704 +//1:   mcr     p15, 0, r0, c7, c14, 1          @ clean and invalidate D entry
4705 +
4706 +       /* Luke Lee 04/06/2005 mod 1 */ 
4707 +       add     r0, r0, #CACHE_DLINESIZE
4708 +       cmp     r0, r1
4709 +       bls     1b                              @ Luke Lee 05/19/2005 blo->bls
4710 +#endif /* CONFIG_CPU_DCACHE_DISABLE */
4711 +
4712 +       /* Luke Lee 04/06/2005 ins 1 */         
4713 +#ifndef CONFIG_CPU_FA_WB_DISABLE
4714 +       mov     r0, #0
4715 +       mcr     p15, 0, r0, c7, c10, 4          @ drain write buffer
4716 +#endif 
4717 +
4718 +       mov     pc, lr
4719 +
4720 +/*
4721 + *     dma_clean_range(start, end)
4722 + *
4723 + *     Clean (write back) the specified virtual address range.
4724 + *
4725 + *     - start  - virtual start address
4726 + *     - end    - virtual end address
4727 + */
4728 +ENTRY(fa_dma_clean_range)
4729 +
4730 +/* Luke Lee 04/06/2005 mod ok */
4731 +#ifndef CONFIG_CPU_DCACHE_DISABLE      
4732 +
4733 + //debug_Aaron
4734 +        bic     r0, r0, #CACHE_DLINESIZE-1
4735 +        mcr     p15, 0, r0, c7, c10, 1          @ clean boundary D entry
4736 +        bic     r1, r1, #CACHE_DLINESIZE-1
4737 +        mcr     p15, 0, r1, c7, c10, 1          @ clean boundary D entry
4738 +
4739 +       /* Luke Lee 04/06/2005 ins 4 mod 2 */
4740 +#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
4741 +       bic     r0, r0, #CACHE_DLINESIZE - 1
4742 +
4743 +//debug_Aaron
4744 +1:     mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
4745 +//1:   mcr     p15, 0, r0, c7, c14, 1          @ clean D entry
4746 +       add     r0, r0, #CACHE_DLINESIZE
4747 +       cmp     r0, r1
4748 +       bls     1b                              @ Luke Lee 05/19/2005 blo->bls
4749 +       /* Luke Lee 04/06/2005 ins 2 */
4750 +#endif
4751 +#endif /* CONFIG_CPU_DCACHE_DISABLE */
4752 +
4753 +#ifndef CONFIG_CPU_FA_WB_DISABLE
4754 +       mov     r0, #0  
4755 +       mcr     p15, 0, r0, c7, c10, 4          @ drain write buffer
4756 +#endif 
4757 +
4758 +       mov     pc, lr
4759 +
4760 +/*
4761 + *     dma_flush_range(start, end)
4762 + *
4763 + *     Clean and invalidate the specified virtual address range.
4764 + *
4765 + *     - start  - virtual start address
4766 + *     - end    - virtual end address
4767 + *
4768 + *     This is actually the same as fa_coherent_kern_range()
4769 + */
4770 +       .globl  fa_dma_flush_range
4771 +       .set    fa_dma_flush_range, fa_coherent_kern_range
4772 +
4773 +       __INITDATA
4774 +
4775 +       .type   fa_cache_fns, #object
4776 +ENTRY(fa_cache_fns)
4777 +       .long   fa_flush_kern_cache_all
4778 +       .long   fa_flush_user_cache_all
4779 +       .long   fa_flush_user_cache_range
4780 +       .long   fa_coherent_kern_range
4781 +       .long   fa_coherent_user_range
4782 +       .long   fa_flush_kern_dcache_page
4783 +       .long   fa_dma_inv_range
4784 +       .long   fa_dma_clean_range
4785 +       .long   fa_dma_flush_range
4786 +       .size   fa_cache_fns, . - fa_cache_fns
4787 --- /dev/null
4788 +++ b/arch/arm/mm/copypage-fa.S
4789 @@ -0,0 +1,106 @@
4790 +/*
4791 + *  linux/arch/arm/lib/copypage-fa.S
4792 + *
4793 + *  Copyright (C) 2005 Faraday Corp.
4794 + *
4795 + * This program is free software; you can redistribute it and/or modify
4796 + * it under the terms of the GNU General Public License version 2 as
4797 + * published by the Free Software Foundation.
4798 + *
4799 + *  ASM optimised string functions
4800 + * 05/18/2005 :        Luke Lee created, modified from copypage-v4wb.S
4801 + */
4802 +#include <linux/linkage.h>
4803 +#include <linux/init.h>
4804 +#include <asm/asm-offsets.h>
4805 +
4806 +       .text
4807 +/*
4808 + * ARMv4 optimised copy_user_page for Faraday processors
4809 + *
4810 + * We flush the destination cache lines just before we write the data into the
4811 + * corresponding address.  Since the Dcache is read-allocate, this removes the
4812 + * Dcache aliasing issue.  The writes will be forwarded to the write buffer,
4813 + * and merged as appropriate.
4814 + *
4815 + * Note: We rely on all ARMv4 processors implementing the "invalidate D line"
4816 + * instruction.  If your processor does not supply this, you have to write your
4817 + * own copy_user_page that does the right thing.
4818 + *
4819 + * copy_user_page(to,from,vaddr)
4820 + */
4821 +       .align  4
4822 +ENTRY(fa_copy_user_page)
4823 +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
4824 +       /* Write through */
4825 +       stmfd   sp!, {r4, lr}                   @ 2
4826 +       mov     r2, #PAGE_SZ/32                 @ 1
4827 +
4828 +       ldmia   r1!, {r3, r4, ip, lr}           @ 4
4829 +1:     stmia   r0!, {r3, r4, ip, lr}           @ 4
4830 +       ldmia   r1!, {r3, r4, ip, lr}           @ 4+1
4831 +       subs    r2, r2, #1                      @ 1
4832 +       stmia   r0!, {r3, r4, ip, lr}           @ 4
4833 +       ldmneia r1!, {r3, r4, ip, lr}           @ 4
4834 +       bne     1b                              @ 1
4835 +
4836 +       mcr     p15, 0, r2, c7, c7, 0           @ flush ID cache
4837 +       ldmfd   sp!, {r4, pc}                   @ 3
4838 +#else
4839 +       /* Write back */
4840 +       stmfd   sp!, {r4, lr}                   @ 2
4841 +       mov     r2, #PAGE_SZ/32                 @ 1
4842 +
4843 +1:     ldmia   r1!, {r3, r4, ip, lr}           @ 4
4844 +       mcr     p15, 0, r0, c7, c6, 1           @ 1   invalidate D line
4845 +       stmia   r0!, {r3, r4, ip, lr}           @ 4
4846 +       ldmia   r1!, {r3, r4, ip, lr}           @ 4
4847 +       mcr     p15, 0, r0, c7, c6, 1           @ 1   invalidate D line
4848 +       stmia   r0!, {r3, r4, ip, lr}           @ 4
4849 +       subs    r2, r2, #1                      @ 1
4850 +       bne     1b
4851 +       mcr     p15, 0, r2, c7, c10, 4          @ 1   drain WB
4852 +       ldmfd   sp!, {r4, pc}                   @ 3
4853 +#endif
4854 +
4855 +/*
4856 + * ARMv4 optimised clear_user_page
4857 + *
4858 + * Same story as above.
4859 + */
4860 +       .align  4
4861 +ENTRY(fa_clear_user_page)
4862 +       str     lr, [sp, #-4]!
4863 +       mov     r1, #PAGE_SZ/32                 @ 1
4864 +       mov     r2, #0                          @ 1
4865 +       mov     r3, #0                          @ 1
4866 +       mov     ip, #0                          @ 1
4867 +       mov     lr, #0                          @ 1
4868 +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
4869 +       /* Write through */
4870 +1:     stmia   r0!, {r2, r3, ip, lr}           @ 4
4871 +       stmia   r0!, {r2, r3, ip, lr}           @ 4
4872 +       subs    r1, r1, #1                      @ 1
4873 +       bne     1b                              @ 1
4874 +
4875 +       mcr     p15, 0, r1, c7, c7, 0           @ flush ID cache
4876 +       ldr     pc, [sp], #4
4877 +#else
4878 +       /* Write back */
4879 +1:     mcr     p15, 0, r0, c7, c6, 1           @ 1   invalidate D line
4880 +       stmia   r0!, {r2, r3, ip, lr}           @ 4
4881 +       mcr     p15, 0, r0, c7, c6, 1           @ 1   invalidate D line
4882 +       stmia   r0!, {r2, r3, ip, lr}           @ 4
4883 +       subs    r1, r1, #1                      @ 1
4884 +       bne     1b                              @ 1
4885 +       mcr     p15, 0, r1, c7, c10, 4          @ 1   drain WB
4886 +       ldr     pc, [sp], #4
4887 +#endif
4888 +
4889 +       __INITDATA
4890 +
4891 +       .type   fa_user_fns, #object
4892 +ENTRY(fa_user_fns)
4893 +       .long   fa_clear_user_page
4894 +       .long   fa_copy_user_page
4895 +       .size   fa_user_fns, . - fa_user_fns
4896 --- a/arch/arm/mm/init.c
4897 +++ b/arch/arm/mm/init.c
4898 @@ -23,6 +23,7 @@
4899  
4900  #include <asm/mach/arch.h>
4901  #include <asm/mach/map.h>
4902 +#include <asm/arch/ipi.h>
4903  
4904  #include "mm.h"
4905  
4906 @@ -252,6 +253,11 @@
4907                 initrd_end = initrd_start + phys_initrd_size;
4908         }
4909  #endif
4910 +#ifdef CONFIG_GEMINI_IPI
4911 +       printk("CPU ID:%d\n",getcpuid());
4912 +//     reserve_bootmem_node(NODE_DATA(0), 0x400000, 0x400000);         //CPU0 space
4913 +//     reserve_bootmem_node(NODE_DATA(0), SHAREADDR, SHARE_MEM_SIZE);          //share memory
4914 +#endif
4915  
4916         /*
4917          * Finally, reserve any node zero regions.
4918 --- /dev/null
4919 +++ b/arch/arm/mm/proc-fa526.S
4920 @@ -0,0 +1,407 @@
4921 +/*
4922 + *  linux/arch/arm/mm/proc-fa526.S: MMU functions for FA526
4923 + *
4924 + *  Copyright (C) 2005 Faraday Corp.
4925 + *
4926 + * This program is free software; you can redistribute it and/or modify
4927 + * it under the terms of the GNU General Public License as published by
4928 + * the Free Software Foundation; either version 2 of the License, or
4929 + * (at your option) any later version.
4930 + *
4931 + * This program is distributed in the hope that it will be useful,
4932 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
4933 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
4934 + * GNU General Public License for more details.
4935 + *
4936 + * You should have received a copy of the GNU General Public License
4937 + * along with this program; if not, write to the Free Software
4938 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
4939 + *
4940 + *
4941 + * These are the low level assembler for performing cache and TLB
4942 + * functions on the fa526.
4943 + *
4944 + *  Written by : Luke Lee
4945 + */
4946 +#include <linux/linkage.h>
4947 +#include <linux/init.h>
4948 +#include <asm/assembler.h>
4949 +#include <asm/pgtable.h>
4950 +#include <asm/pgtable-hwdef.h>
4951 +#include <asm/elf.h>
4952 +#include <asm/hardware.h>
4953 +#include <asm/page.h>
4954 +#include <asm/ptrace.h>
4955 +#include <asm/system.h>
4956 +#include "proc-macros.S"
4957 +
4958 +#define CACHE_DLINESIZE           16
4959 +
4960 +       .text
4961 +/*
4962 + * cpu_fa526_proc_init()
4963 + */
4964 +ENTRY(cpu_fa526_proc_init)
4965 +       /* MMU is already ON here, ICACHE, DCACHE conditionally disabled */
4966 +
4967 +        mov     r0, #1
4968 +       nop
4969 +       nop
4970 +        mcr     p15, 0, r0, c1, c1, 0          @ turn-on ECR
4971 +       nop
4972 +       nop
4973 +
4974 +       mrc     p15, 0, r0, c1, c0, 0           @ read ctrl register
4975 +
4976 +#ifdef CONFIG_CPU_FA_BTB
4977 +       orr     r0, r0, #CR_Z
4978 +#else
4979 +       bic     r0, r0, #CR_Z
4980 +#endif
4981 +#ifdef CONFIG_CPU_FA_WB_DISABLE
4982 +       mov     r1, #0
4983 +       mcr     p15, 0, r1, c7, c10, 4          @ drain write buffer
4984 +       nop
4985 +       nop
4986 +       bic     r0, r0, #CR_W
4987 +#else
4988 +       orr     r0, r0, #CR_W
4989 +#endif
4990 +#ifdef CONFIG_CPU_DCACHE_DISABLE
4991 +       bic     r0, r0, #CR_C
4992 +#else
4993 +       orr     r0, r0, #CR_C
4994 +#endif
4995 +#ifdef CONFIG_CPU_ICACHE_DISABLE
4996 +       bic     r0, r0, #CR_I
4997 +#else
4998 +       orr     r0, r0, #CR_I
4999 +#endif
5000 +
5001 +       nop
5002 +       nop
5003 +       mcr     p15, 0, r0, c1, c0, 0
5004 +       nop
5005 +       nop
5006 +
5007 +       mov     r5, lr
5008 +       bl      fa_initialize_cache_info        @ destroy r0~r4
5009 +       mov     pc, r5                          @ return
5010 +
5011 +
5012 +/*
5013 + * cpu_fa526_proc_fin()
5014 + */
5015 +ENTRY(cpu_fa526_proc_fin)
5016 +       stmfd   sp!, {lr}
5017 +       mov     ip, #PSR_F_BIT | PSR_I_BIT | SVC_MODE
5018 +       msr     cpsr_c, ip
5019 +
5020 +       bl      fa_flush_kern_cache_all
5021 +       mrc     p15, 0, r0, c1, c0, 0           @ ctrl register
5022 +       bic     r0, r0, #0x1000                 @ ...i............
5023 +       bic     r0, r0, #0x000e                 @ ............wca.
5024 +       mcr     p15, 0, r0, c1, c0, 0           @ disable caches
5025 +
5026 +       nop
5027 +       nop
5028 +       ldmfd   sp!, {pc}
5029 +
5030 +/*
5031 + * cpu_fa526_reset(loc)
5032 + *
5033 + * Perform a soft reset of the system.  Put the CPU into the
5034 + * same state as it would be if it had been reset, and branch
5035 + * to what would be the reset vector.
5036 + *
5037 + * loc: location to jump to for soft reset
5038 + */
5039 +       .align  4
5040 +ENTRY(cpu_fa526_reset)
5041 +       mov     ip, #0
5042 +       mcr     p15, 0, ip, c7, c7, 0           @ invalidate I,D caches
5043 +#ifndef CONFIG_CPU_FA_WB_DISABLE
5044 +       mcr     p15, 0, ip, c7, c10, 4          @ drain WB
5045 +#endif
5046 +       mcr     p15, 0, ip, c8, c7, 0           @ invalidate I & D TLBs
5047 +       mrc     p15, 0, ip, c1, c0, 0           @ ctrl register
5048 +       bic     ip, ip, #0x000f                 @ ............wcam
5049 +       bic     ip, ip, #0x1100                 @ ...i...s........
5050 +
5051 +       bic     ip, ip, #0x0800                 @ BTB off
5052 +       mcr     p15, 0, ip, c1, c0, 0           @ ctrl register
5053 +       nop
5054 +       nop
5055 +       mov     pc, r0
5056 +
5057 +/*
5058 + * cpu_fa526_do_idle()
5059 + */
5060 +       .align  4
5061 +ENTRY(cpu_fa526_do_idle)
5062 +
5063 +#ifdef CONFIG_CPU_FA_IDLE
5064 +       nop
5065 +       nop
5066 +       mcr     p15, 0, r0, c7, c0, 4           @ Wait for interrupt (IDLE mode)
5067 +#endif
5068 +       mov     pc, lr
5069 +
5070 +
5071 +ENTRY(cpu_fa526_dcache_clean_area)
5072 +
5073 +#ifndef CONFIG_CPU_DCACHE_DISABLE
5074 +#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
5075 +1:     mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
5076 +       add     r0, r0, #CACHE_DLINESIZE
5077 +       subs    r1, r1, #CACHE_DLINESIZE
5078 +       bhi     1b
5079 +#endif
5080 +#endif
5081 +       mov     pc, lr
5082 +
5083 +
5084 +/* =============================== PageTable ============================== */
5085 +
5086 +/*
5087 + * cpu_fa526_switch_mm(pgd)
5088 + *
5089 + * Set the translation base pointer to be as described by pgd.
5090 + *
5091 + * pgd: new page tables
5092 + */
5093 +       .align  4
5094 +
5095 +       .globl  fault_address
5096 +fault_address:
5097 +       .long   0
5098 +
5099 +ENTRY(cpu_fa526_switch_mm)
5100 +
5101 +       mov     ip, #0
5102 +#ifndef CONFIG_CPU_DCACHE_DISABLE
5103 +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
5104 +       mcr     p15, 0, ip, c7, c6, 0           @ invalidate D cache
5105 +#else
5106 +       mcr     p15, 0, ip, c7, c14, 0          @ Clean and invalidate whole DCache
5107 +#endif
5108 +#endif /*CONFIG_CPU_DCACHE_DISABLE*/
5109 +
5110 +#ifndef CONFIG_CPU_ICACHE_DISABLE
5111 +       mcr     p15, 0, ip, c7, c5, 0           @ invalidate I cache
5112 +#endif
5113 +
5114 +#ifndef CONFIG_CPU_FA_WB_DISABLE
5115 +       mcr     p15, 0, ip, c7, c10, 4          @ drain WB
5116 +#endif
5117 +
5118 +#ifdef CONFIG_CPU_FA_BTB
5119 +       mcr     p15, 0, ip, c7, c5, 6           @ invalidate BTB since mm changed
5120 +       nop
5121 +       nop
5122 +#endif
5123 +       bic     r0, r0, #0xff                   @ clear bits [7:0]
5124 +       bic     r0, r0, #0x3f00                 @ clear bits [13:8]
5125 +       mcr     p15, 0, r0, c2, c0, 0           @ load page table pointer
5126 +       mcr     p15, 0, ip, c8, c7, 0           @ invalidate UTLB
5127 +       nop
5128 +       nop
5129 +       mov     pc, lr
5130 +
5131 +/*
5132 + * cpu_fa526_set_pte_ext(ptep, pte, ext)
5133 + *
5134 + * Set a PTE and flush it out
5135 + */
5136 +       .align  4
5137 +ENTRY(cpu_fa526_set_pte_ext)
5138 +       str     r1, [r0], #-2048                @ linux version
5139 +
5140 +       eor     r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY
5141 +
5142 +       bic     r2, r1, #PTE_SMALL_AP_MASK
5143 +       bic     r2, r2, #PTE_TYPE_MASK
5144 +       orr     r2, r2, #PTE_TYPE_SMALL
5145 +
5146 +       tst     r1, #L_PTE_USER                 @ User?
5147 +       orrne   r2, r2, #PTE_SMALL_AP_URO_SRW
5148 +
5149 +       tst     r1, #L_PTE_WRITE | L_PTE_DIRTY  @ Write and Dirty?
5150 +       orreq   r2, r2, #PTE_SMALL_AP_UNO_SRW
5151 +
5152 +       tst     r1, #L_PTE_PRESENT | L_PTE_YOUNG        @ Present and Young?
5153 +       movne   r2, #0
5154 +
5155 +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
5156 +       eor     r3, r2, #0x0a                   @ C & small page?  1010
5157 +       tst     r3, #0x0b                       @                  1011
5158 +       biceq   r2, r2, #4
5159 +#endif
5160 +       str     r2, [r0]                        @ hardware version
5161 +
5162 +       mov     r2, #0
5163 +       mcr     p15, 0, r2, c7, c10, 0          @ clean D cache all
5164 +
5165 +#ifndef CONFIG_CPU_FA_WB_DISABLE
5166 +       mcr     p15, 0, r2, c7, c10, 4          @ drain WB
5167 +#endif
5168 +#ifdef CONFIG_CPU_FA_BTB
5169 +       mcr     p15, 0, r2, c7, c5, 6           @ invalidate BTB
5170 +       nop
5171 +       nop
5172 +#endif
5173 +       mov     pc, lr
5174 +
5175 +       __INIT
5176 +
5177 +       .type   __fa526_setup, #function
5178 +__fa526_setup:
5179 +       /* On return of this routine, r0 must carry correct flags for CFG register */
5180 +       mov     r0, #0
5181 +       mcr     p15, 0, r0, c7, c7              @ invalidate I,D caches on v4
5182 +       mcr     p15, 0, r0, c7, c10, 4          @ drain write buffer on v4
5183 +       mcr     p15, 0, r0, c8, c7              @ invalidate I,D TLBs on v4
5184 +
5185 +       mcr     p15, 0, r0, c7, c5, 5           @ invalidate IScratchpad RAM
5186 +
5187 +        mov     r0, #1
5188 +        mcr     p15, 0, r0, c1, c1, 0          @ turn-on ECR
5189 +
5190 +       mrc     p15, 0, r0, c9, c1, 0           @ DScratchpad
5191 +       bic     r0, r0, #1
5192 +       mcr     p15, 0, r0, c9, c1, 0
5193 +       mrc     p15, 0, r0, c9, c1, 1           @ IScratchpad
5194 +       bic     r0, r0, #1
5195 +       mcr     p15, 0, r0, c9, c1, 1
5196 +
5197 +       mov     r0, #0
5198 +       mcr     p15, 0, r0, c1, c1, 0           @ turn-off ECR
5199 +
5200 +#ifdef CONFIG_CPU_FA_BTB
5201 +       mcr     p15, 0, r0, c7, c5, 6           @ invalidate BTB All
5202 +       nop
5203 +       nop
5204 +#endif
5205 +
5206 +       mov     r0, #0x1f                       @ Domains 0, 1 = manager, 2 = client
5207 +       mcr     p15, 0, r0, c3, c0              @ load domain access register
5208 +
5209 +       mrc     p15, 0, r0, c1, c0              @ get control register v4
5210 +       ldr     r5, fa526_cr1_clear
5211 +       bic     r0, r0, r5
5212 +       ldr     r5, fa526_cr1_set
5213 +       orr     r0, r0, r5
5214 +
5215 +#ifdef CONFIG_CPU_FA_BTB
5216 +       orr     r0, r0, #CR_Z
5217 +#else
5218 +       bic     r0, r0, #CR_Z
5219 +#endif
5220 +#ifdef CONFIG_CPU_FA_WB_DISABLE
5221 +       mov     r12, #0
5222 +       mcr     p15, 0, r12, c7, c10, 4         @ drain write buffer
5223 +       nop
5224 +       nop
5225 +       bic     r0, r0, #CR_W                   @ .... .... .... 1...
5226 +#else
5227 +       orr     r0, r0, #CR_W
5228 +#endif
5229 +
5230 +       mov     pc, lr
5231 +       .size   __fa526_setup, . - __fa526_setup
5232 +
5233 +       /*
5234 +        * .RVI ZFRS BLDP WCAM
5235 +        * ..11 0001 .111 1101
5236 +        *
5237 +        */
5238 +       .type   fa526_cr1_clear, #object
5239 +       .type   fa526_cr1_set, #object
5240 +fa526_cr1_clear:
5241 +       .word   0x3f3f
5242 +fa526_cr1_set:
5243 +       .word   0x317D
5244 +
5245 +       __INITDATA
5246 +
5247 +/*
5248 + * Purpose : Function pointers used to access above functions - all calls
5249 + *          come through these
5250 + */
5251 +       .type   fa526_processor_functions, #object
5252 +fa526_processor_functions:
5253 +       .word   v4_early_abort
5254 +       .word   cpu_fa526_proc_init
5255 +       .word   cpu_fa526_proc_fin
5256 +       .word   cpu_fa526_reset
5257 +       .word   cpu_fa526_do_idle
5258 +       .word   cpu_fa526_dcache_clean_area
5259 +       .word   cpu_fa526_switch_mm
5260 +       .word   cpu_fa526_set_pte_ext
5261 +       .size   fa526_processor_functions, . - fa526_processor_functions
5262 +
5263 +       .section ".rodata"
5264 +
5265 +       .type   cpu_arch_name, #object
5266 +cpu_arch_name:
5267 +       .asciz  "armv4"
5268 +       .size   cpu_arch_name, . - cpu_arch_name
5269 +
5270 +       .type   cpu_elf_name, #object
5271 +cpu_elf_name:
5272 +       .asciz  "v4"
5273 +       .size   cpu_elf_name, . - cpu_elf_name
5274 +
5275 +       .type   cpu_fa526_name, #object
5276 +cpu_fa526_name:
5277 +       .ascii  "FA526"
5278 +#ifndef CONFIG_CPU_ICACHE_DISABLE
5279 +       .ascii  "i"
5280 +#endif
5281 +#ifndef CONFIG_CPU_DCACHE_DISABLE
5282 +       .ascii  "d"
5283 +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
5284 +       .ascii  "(wt)"
5285 +#else
5286 +       .ascii  "(wb)"
5287 +#endif
5288 +#endif
5289 +       .ascii  "\0"
5290 +       .size   cpu_fa526_name, . - cpu_fa526_name
5291 +
5292 +       .align
5293 +
5294 +       .section ".proc.info.init", #alloc, #execinstr
5295 +
5296 +#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
5297 +#define __PMD_SECT_BUFFERABLE  0
5298 +#else
5299 +#define __PMD_SECT_BUFFERABLE  PMD_SECT_BUFFERABLE
5300 +#endif
5301 +
5302 +       .type   __fa526_proc_info,#object
5303 +__fa526_proc_info:
5304 +       .long   0x66015261
5305 +       .long   0xff01fff1
5306 +       .long   PMD_TYPE_SECT | \
5307 +               __PMD_SECT_BUFFERABLE | \
5308 +               PMD_SECT_CACHEABLE | \
5309 +               PMD_BIT4 | \
5310 +               PMD_SECT_AP_WRITE | \
5311 +               PMD_SECT_AP_READ
5312 +       .long   PMD_TYPE_SECT | \
5313 +               PMD_BIT4 | \
5314 +               PMD_SECT_AP_WRITE | \
5315 +               PMD_SECT_AP_READ
5316 +       b       __fa526_setup
5317 +       .long   cpu_arch_name
5318 +       .long   cpu_elf_name
5319 +       .long   HWCAP_SWP | HWCAP_HALF
5320 +       .long   cpu_fa526_name
5321 +       .long   fa526_processor_functions
5322 +       .long   fa_tlb_fns
5323 +       .long   fa_user_fns
5324 +       .long   fa_cache_fns
5325 +       .size   __fa526_proc_info, . - __fa526_proc_info
5326 +
5327 +
5328 --- /dev/null
5329 +++ b/arch/arm/mm/tlb-fa.S
5330 @@ -0,0 +1,96 @@
5331 +/*
5332 + *  linux/arch/arm/mm/tlb-fa.S
5333 + *
5334 + *  Copyright (C) 2005 Faraday Corp.
5335 + *
5336 + * This program is free software; you can redistribute it and/or modify
5337 + * it under the terms of the GNU General Public License version 2 as
5338 + * published by the Free Software Foundation.
5339 + *
5340 + *  ARM architecture version 4, Faraday variation.
5341 + *  This assume an unified TLBs, with a write buffer, and branch target buffer (BTB)
5342 + *
5343 + *  Processors: FA520 FA526 FA626
5344 + *  03/31/2005 : Created by Luke Lee, modified from tlb-v4wbi.S
5345 + *  05/06/2005 : Fixed buggy CPU versions that did not invalidate the associated
5346 + *               data cache entries when invalidating TLB entries.
5347 + */
5348 +#include <linux/linkage.h>
5349 +#include <linux/init.h>
5350 +#include <asm/asm-offsets.h>
5351 +#include <asm/tlbflush.h>
5352 +#include "proc-macros.S"
5353 +
5354 +
5355 +/*
5356 + *     flush_user_tlb_range(start, end, mm)
5357 + *
5358 + *     Invalidate a range of TLB entries in the specified address space.
5359 + *
5360 + *     - start - range start address
5361 + *     - end   - range end address
5362 + *     - mm    - mm_struct describing address space
5363 + */
5364 +       .align  4
5365 +ENTRY(fa_flush_user_tlb_range)
5366 +
5367 +       vma_vm_mm ip, r2
5368 +       act_mm  r3                              @ get current->active_mm
5369 +       eors    r3, ip, r3                      @ == mm ?
5370 +       movne   pc, lr                          @ no, we dont do anything
5371 +       mov     r3, #0
5372 +
5373 +#ifndef CONFIG_CPU_FA_WB_DISABLE
5374 +       mcr     p15, 0, r3, c7, c10, 4          @ drain WB
5375 +#endif
5376 +
5377 +       vma_vm_flags r2, r2
5378 +       bic     r0, r0, #0x0ff
5379 +       bic     r0, r0, #0xf00
5380 +
5381 +1:     mcr     p15, 0, r0, c8, c7, 1           @ invalidate UTLB entry
5382 +       add     r0, r0, #PAGE_SZ
5383 +       cmp     r0, r1
5384 +       bls     1b                              @ Luke Lee 05/19/2005 blo -> bls
5385 +
5386 +#ifdef CONFIG_CPU_FA_BTB
5387 +       mcr     p15, 0, r3, c7, c5, 6           @ invalidate BTB
5388 +       nop
5389 +       nop
5390 +#endif
5391 +       mov     pc, lr
5392 +
5393 +
5394 +ENTRY(fa_flush_kern_tlb_range)
5395 +       mov     r3, #0
5396 +
5397 +       mcr     p15, 0, r3, c7, c10, 0          @ clean Dcache all 06/03/2005
5398 +
5399 +#ifndef CONFIG_CPU_FA_WB_DISABLE
5400 +       mcr     p15, 0, r3, c7, c10, 4          @ drain WB
5401 +#endif
5402 +
5403 +       bic     r0, r0, #0x0ff
5404 +       bic     r0, r0, #0xf00
5405 +1:
5406 +       mcr     p15, 0, r0, c8, c7, 1           @ invalidate UTLB entry
5407 +       add     r0, r0, #PAGE_SZ
5408 +       cmp     r0, r1
5409 +       bls     1b                              @ Luke Lee 05/19/2005 blo -> bls
5410 +
5411 +#ifdef CONFIG_CPU_FA_BTB
5412 +       mcr     p15, 0, r3, c7, c5, 6           @ invalidate BTB
5413 +       nop
5414 +       nop
5415 +#endif
5416 +       mov     pc, lr
5417 +
5418 +
5419 +       __INITDATA
5420 +
5421 +       .type   fa_tlb_fns, #object
5422 +ENTRY(fa_tlb_fns)
5423 +       .long   fa_flush_user_tlb_range
5424 +       .long   fa_flush_kern_tlb_range
5425 +       .long   fa_tlb_flags
5426 +       .size   fa_tlb_fns, . - fa_tlb_fns
5427 --- a/arch/arm/tools/mach-types
5428 +++ b/arch/arm/tools/mach-types
5429 @@ -208,7 +208,8 @@
5430  fester                 SA1100_FESTER           FESTER                  191
5431  gpi                    ARCH_GPI                GPI                     192
5432  smdk2410               ARCH_SMDK2410           SMDK2410                193
5433 -i519                   ARCH_I519               I519                    194
5434 +#i519                  ARCH_I519               I519                    194
5435 +sl2312          ARCH_SL2312         SL2312          194
5436  nexio                  SA1100_NEXIO            NEXIO                   195
5437  bitbox                 SA1100_BITBOX           BITBOX                  196
5438  g200                   SA1100_G200             G200                    197
5439 --- /dev/null
5440 +++ b/include/asm-arm/arch-sl2312/SL_gpio.h
5441 @@ -0,0 +1,59 @@
5442 +#define GPIO_MINOR_LAST 31
5443 +#define GPIO_MAJOR     120     // Experiemental
5444 +
5445 +#define GPIO_IRQ_NBR   12
5446 +
5447 +#define GPIOBASEADDR           (IO_ADDRESS(0x021000000))
5448 +
5449 +#define GPIODATAOUTOFF         0x00
5450 +#define GPIODATAINOFF          0x04
5451 +#define GPIOPINDIROFF          0x08
5452 +#define GPIOPINBYPASSOFF       0x0C
5453 +#define GPIODATASETOFF         0x10
5454 +#define GPIODATACLEAROFF       0x14
5455 +#define GPIOPINPULLENBOFF      0x18
5456 +#define GPIOPINPULLTPOFF       0x1C
5457 +#define GPIOINTRENBOFF         0x20
5458 +#define GPIOINTRRAWSOFF                0x24
5459 +#define GPIOINTRMASKEDSTATEOFF 0x28
5460 +#define GPIOINTRMASKOFF                0x2C
5461 +#define GPIOINTRCLEAROFF       0x30
5462 +#define GPIOINTRTRIGGEROFF     0x34
5463 +#define GPIOINTRBOTHOFF                0x38
5464 +#define GPIOINTRRISENEGOFF     0x3C
5465 +#define GPIOBNCEENBOFF         0x40
5466 +#define GPIOBNCEPRESOFF                0x44
5467 +
5468 +#define GPIO_IOCTRL_SETDIR     0x20
5469 +#define GPIO_IOCTRL_SET                0x40
5470 +#define GPIO_IOCTRL_CLEAR      0x50
5471 +#define GPIO_IOCTRL_ENBINT     0x60
5472 +#define GPIO_IOCTRL_MASKINT    0x70
5473 +#define GPIO_IOCTRL_LVLTRIG    0x75
5474 +#define GPIO_IOCTRL_EDGINT     0x77
5475 +#define GPIO_IOCTRL_EDGPOLINT  0x78
5476 +#define GPIO_IOCTRL_BYPASS     0x30
5477 +#define GPIO_IOCTRL_PRESCLK    0x80
5478 +#define GPIO_IOCTRL_CLKVAL     0x90
5479 +#define GPIO_IOCTRL_PULLENB    0xA0
5480 +#define GPIO_IOCTRL_PULLTYPE   0xA8
5481 +
5482 +
5483 +#define GPIO_MAJOR     120     /* experimental MAJOR number */
5484 +                               // Minor - 0 : 31 gpio pins
5485 +
5486 +#define GPIO_SET       0x01
5487 +#define GPIO_CLEAR     0x01
5488 +
5489 +#define GPIO_INPUT     0
5490 +#define GPIO_OUTPUT    1
5491 +#define GPIO_EDGEINTR  0
5492 +#define GPIO_EDGESINGL 0
5493 +#define GPIO_EDGEBOTH  1
5494 +#define GPIO_POSITIVE  0
5495 +#define GPIO_ENBINT    1
5496 +#define GPIO_DISABLEMASK       1
5497 +#define GPIO_PULLDOWN  0
5498 +#define GPIO_PULLUP    1
5499 +#define GPIO_ENABLEPULL        1
5500 +#define GPIO_DISABLEPULL       0
5501 --- /dev/null
5502 +++ b/include/asm-arm/arch-sl2312/debug-macro.S
5503 @@ -0,0 +1,20 @@
5504 +/* linux/include/asm-arm/arch-ebsa110/debug-macro.S
5505 + *
5506 + * Debugging macro include header
5507 + *
5508 + *  Copyright (C) 1994-1999 Russell King
5509 + *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
5510 + *
5511 + * This program is free software; you can redistribute it and/or modify
5512 + * it under the terms of the GNU General Public License version 2 as
5513 + * published by the Free Software Foundation.
5514 + *
5515 +**/
5516 +
5517 +               .macro  addruart,rx
5518 +               mov     \rx, #0x42000000
5519 +               .endm
5520 +
5521 +#define UART_SHIFT     2
5522 +#define FLOW_CONTROL
5523 +#include <asm/hardware/debug-8250.S>
5524 --- /dev/null
5525 +++ b/include/asm-arm/arch-sl2312/dma.h
5526 @@ -0,0 +1,28 @@
5527 +/*
5528 + *  linux/include/asm-arm/arch-camelot/dma.h
5529 + *
5530 + *  Copyright (C) 1997,1998 Russell King
5531 + *
5532 + * This program is free software; you can redistribute it and/or modify
5533 + * it under the terms of the GNU General Public License as published by
5534 + * the Free Software Foundation; either version 2 of the License, or
5535 + * (at your option) any later version.
5536 + *
5537 + * This program is distributed in the hope that it will be useful,
5538 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
5539 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5540 + * GNU General Public License for more details.
5541 + *
5542 + * You should have received a copy of the GNU General Public License
5543 + * along with this program; if not, write to the Free Software
5544 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
5545 + */
5546 +#ifndef __ASM_ARCH_DMA_H
5547 +#define __ASM_ARCH_DMA_H
5548 +
5549 +#define MAX_DMA_ADDRESS                0xffffffff
5550 +
5551 +#define MAX_DMA_CHANNELS       0
5552 +
5553 +#endif /* _ASM_ARCH_DMA_H */
5554 +
5555 --- /dev/null
5556 +++ b/include/asm-arm/arch-sl2312/entry-macro.S
5557 @@ -0,0 +1,42 @@
5558 +/*
5559 + * include/asm-arm/arch-arm/entry-macro.S
5560 + *
5561 + * Low-level IRQ helper macros for ebsa110 platform.
5562 + *
5563 + * This file is licensed under  the terms of the GNU General Public
5564 + * License version 2. This program is licensed "as is" without any
5565 + * warranty of any kind, whether express or implied.
5566 + */
5567 +#include <asm/arch/platform.h>
5568 +#include <asm/arch/int_ctrl.h>
5569 +
5570 +
5571 +                .macro  disable_fiq
5572 +                .endm
5573 +
5574 +                .macro  get_irqnr_preamble, base, tmp
5575 +                .endm
5576 +
5577 +                .macro  arch_ret_to_user, tmp1, tmp2
5578 +                .endm
5579 +
5580 +                .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
5581 +                ldr     \irqstat, =IRQ_STATUS(IO_ADDRESS(SL2312_INTERRUPT_BASE))
5582 +                ldr     \irqnr,[\irqstat]
5583 +                cmp     \irqnr,#0
5584 +                beq     2313f
5585 +                mov     \tmp,\irqnr
5586 +                mov     \irqnr,#0
5587 +2312:
5588 +                tst     \tmp, #1
5589 +                bne     2313f
5590 +                add     \irqnr, \irqnr, #1
5591 +                mov     \tmp, \tmp, lsr #1
5592 +                cmp     \irqnr, #31
5593 +                bcc     2312b
5594 +2313:
5595 +                .endm
5596 +
5597 +                .macro  irq_prio_table
5598 +                .endm
5599 +
5600 --- /dev/null
5601 +++ b/include/asm-arm/arch-sl2312/flash.h
5602 @@ -0,0 +1,83 @@
5603 +#ifndef __ASM_ARM_ARCH_FLASH_H
5604 +#define __ASM_ARM_ARCH_FLASH_H
5605 +
5606 +#define FLASH_START                                     SL2312_FLASH_BASE
5607 +#define SFLASH_SIZE                                    0x00400000
5608 +#define SPAGE_SIZE                                     0x200
5609 +#define BLOCK_ERASE                                    0x50
5610 +#define BUFFER1_READ                                   0x54
5611 +#define BUFFER2_READ                                   0x56
5612 +#define PAGE_ERASE                                     0x81
5613 +#define MAIN_MEMORY_PAGE_READ                          0x52
5614 +#define MAIN_MEMORY_PROGRAM_BUFFER1                    0x82
5615 +#define MAIN_MEMORY_PROGRAM_BUFFER2                    0x85
5616 +#define BUFFER1_TO_MAIN_MEMORY                         0x83
5617 +#define BUFFER2_TO_MAIN_MEMORY                         0x86
5618 +#define MAIN_MEMORY_TO_BUFFER1                         0x53
5619 +#define MAIN_MEMORY_TO_BUFFER2                         0x55
5620 +#define BUFFER1_WRITE                                  0x84
5621 +#define BUFFER2_WRITE                                  0x87
5622 +#define AUTO_PAGE_REWRITE_BUFFER1                      0x58
5623 +#define AUTO_PAGE_REWRITE_BUFFER2                      0x59
5624 +#define READ_STATUS                                    0x57
5625 +
5626 +#define MAIN_MEMORY_PAGE_READ_SPI                      0xD2
5627 +#define BUFFER1_READ_SPI                               0xD4
5628 +#define BUFFER2_READ_SPI                               0xD6
5629 +#define READ_STATUS_SPI                                0xD7
5630 +
5631 +#define        FLASH_ACCESS_OFFSET                             0x00000010
5632 +#define        FLASH_ADDRESS_OFFSET                            0x00000014
5633 +#define        FLASH_WRITE_DATA_OFFSET                         0x00000018
5634 +#define        FLASH_READ_DATA_OFFSET                          0x00000018
5635 +#define SERIAL_FLASH_CHIP1_EN            0x00010000  // 16th bit = 1
5636 +#define SERIAL_FLASH_CHIP0_EN            0x00000000  // 16th bit = 0
5637 +#define AT45DB321_PAGE_SHIFT                    0xa
5638 +#define AT45DB642_PAGE_SHIFT                    0xb
5639 +#define CONTINUOUS_MODE                         0x00008000
5640 +
5641 +#define FLASH_ACCESS_ACTION_OPCODE                      0x0000
5642 +#define FLASH_ACCESS_ACTION_OPCODE_DATA                 0x0100
5643 +#define FLASH_ACCESS_ACTION_SHIFT_ADDRESS               0x0200
5644 +#define FLASH_ACCESS_ACTION_SHIFT_ADDRESS_DATA          0x0300
5645 +#define FLASH_ACCESS_ACTION_SHIFT_ADDRESS_X_DATA          0x0400
5646 +#define FLASH_ACCESS_ACTION_SHIFT_ADDRESS_2X_DATA         0x0500
5647 +#define FLASH_ACCESS_ACTION_SHIFT_ADDRESS_3X_DATA         0x0600
5648 +#define FLASH_ACCESS_ACTION_SHIFT_ADDRESS_4X_DATA         0x0700
5649 +//#define FLASH_ACCESS_ACTION_SHIFT_ADDRESS_X_DATA        0x0600
5650 +//#define FLASH_ACCESS_ACTION_SHIFT_ADDRESS_4X_DATA       0x0700
5651 +
5652 +#define M25P80_PAGE_SIZE  0x100
5653 +#define M25P80_SECTOR_SIZE  0x10000
5654 +
5655 +
5656 +//#define M25P80_BULK_ERASE                                      1
5657 +//#define M25P80_SECTOR_ERASE                                    2
5658 +//#define M25P80_SECTOR_SIZE                                     0x10000
5659 +
5660 +#define M25P80_WRITE_ENABLE                            0x06
5661 +#define M25P80_WRITE_DISABLE                           0x04
5662 +#define M25P80_READ_STATUS                             0x05
5663 +#define M25P80_WRITE_STATUS                            0x01
5664 +#define M25P80_READ                                    0x03
5665 +#define M25P80_FAST_READ                               0x0B
5666 +#define M25P80_PAGE_PROGRAM                            0x02
5667 +#define M25P80_SECTOR_ERASE                            0xD8
5668 +#define M25P80_BULK_ERASE                              0xC7
5669 +#define FLASH_ERR_OK                                                   0x0
5670 +
5671 +extern void address_to_page(__u32, __u16 *, __u16 *);
5672 +extern void main_memory_page_read(__u8, __u16, __u16, __u8 *);
5673 +extern void buffer_to_main_memory(__u8, __u16);
5674 +extern void main_memory_to_buffer(__u8, __u16);
5675 +extern void main_memory_page_program(__u8, __u16, __u16, __u8);
5676 +extern void atmel_flash_read_page(__u32, __u8 *, __u32);
5677 +extern void atmel_erase_page(__u8, __u16);
5678 +extern void atmel_read_status(__u8, __u8 *);
5679 +extern void atmel_flash_program_page(__u32, __u8 *, __u32);
5680 +extern void atmel_buffer_write(__u8, __u16, __u8);
5681 +extern void flash_delay(void);
5682 +
5683 +extern int m25p80_sector_erase(__u32 address, __u32 schip_en);
5684 +
5685 +#endif
5686 --- /dev/null
5687 +++ b/include/asm-arm/arch-sl2312/gemini_cir.h
5688 @@ -0,0 +1,102 @@
5689 +#ifndef _ASM_ARCH_CIR_H
5690 +#define _ASM_ARCH_CIR_H
5691 +#include <linux/ioctl.h>
5692 +
5693 +#define VCR_KEY_POWER          0x613E609F
5694 +#define TV1_KEY_POWER          0x40040100
5695 +#define TV1_KEY_POWER_EXT      0xBCBD
5696 +#define RC5_KER_POWER          0x0CF3
5697 +
5698 +#define VCC_H_ACT_PER          (16-1)
5699 +#define VCC_L_ACT_PER          (8-1)
5700 +#define VCC_DATA_LEN           (32-1)
5701 +#define TV1_H_ACT_PER          (8-1)
5702 +#define TV1_L_ACT_PER          (4-1)
5703 +#define TV1_DATA_LEN           (48-1)
5704 +
5705 +#define VCC_BAUD               540
5706 +#define TV1_BAUD               430
5707 +#ifdef  CONFIG_SL3516_ASIC
5708 +#define        EXT_CLK                 60
5709 +#else
5710 +#define        EXT_CLK                 20
5711 +#endif
5712 +
5713 +#define        NEC_PROTOCOL    0x0
5714 +#define        RC5_PROTOCOL    0x1
5715 +#define VCC_PROTOCOL   0x0
5716 +#define TV1_PROTOCOL   0x01
5717 +
5718 +#ifndef        SL2312_CIR_BASE
5719 +#define        SL2312_CIR_BASE         0x4C000000
5720 +#endif
5721 +#define        CIR_BASE_ADDR           IO_ADDRESS(SL2312_CIR_BASE)
5722 +#define STORLINK_CIR_ID                0x00010400
5723 +
5724 +#define        CIR_IP_ID               *(volatile unsigned int *)(CIR_BASE_ADDR + 0x00)
5725 +#define        CIR_CTR_REG             *(volatile unsigned int *)(CIR_BASE_ADDR + 0x04)
5726 +#define        CIR_STATUS_REG          *(volatile unsigned int *)(CIR_BASE_ADDR + 0x08)
5727 +#define        CIR_RX_REG              *(volatile unsigned int *)(CIR_BASE_ADDR + 0x0C)
5728 +#define        CIR_RX_EXT_REG          *(volatile unsigned int *)(CIR_BASE_ADDR + 0x10)
5729 +#define        CIR_PWR_REG             *(volatile unsigned int *)(CIR_BASE_ADDR + 0x14)
5730 +#define        CIR_PWR_EXT_REG         *(volatile unsigned int *)(CIR_BASE_ADDR + 0x18)
5731 +#define        CIR_TX_CTR_REG          *(volatile unsigned int *)(CIR_BASE_ADDR + 0x1C)
5732 +#define        CIR_TX_FEQ_REG          *(volatile unsigned int *)(CIR_BASE_ADDR + 0x20)
5733 +#define        CIR_TX_REG              *(volatile unsigned int *)(CIR_BASE_ADDR + 0x24)
5734 +#define        CIR_TX_EXT_REG          *(volatile unsigned int *)(CIR_BASE_ADDR + 0x28)
5735 +
5736 +
5737 +#ifndef        SL2312_POWER_CTRL_BASE
5738 +#define        SL2312_POWER_CTRL_BASE          0x4B000000
5739 +#endif
5740 +
5741 +#ifndef PWR_BASE_ADDR
5742 +#define        PWR_BASE_ADDR           IO_ADDRESS(SL2312_POWER_CTRL_BASE)
5743 +#endif
5744 +#define        PWR_CTRL_ID             *(unsigned int*)(PWR_BASE_ADDR+0x00)
5745 +#define        PWR_CTRL_REG            *(unsigned int*)(PWR_BASE_ADDR+0x04)
5746 +#define        PWR_STATUS_REG          *(unsigned int*)(PWR_BASE_ADDR+0x08)
5747 +
5748 +
5749 +#define BIT(x)                 (1<<x)
5750 +#define TX_STATUS              BIT(3)
5751 +
5752 +#define        PWR_STAT_CIR            0x10
5753 +#define        PWR_STAT_RTC            0x20
5754 +#define        PWR_STAT_PUSH           0x40
5755 +#define        PWR_SHUTDOWN            0x01
5756 +
5757 +#define CARR_FREQ              38000
5758 +
5759 +struct cir_ioctl_data {
5760 +       __u32 data;
5761 +};
5762 +struct cir_ioctl_data48 {
5763 +       __u32 timeout;
5764 +       __u32 length;
5765 +       __u8  ret;
5766 +       __u32 data;
5767 +       __u32 data_ext;
5768 +};
5769 +#define OLD_DATA                       0
5770 +#define NEW_RECEIVE                    1
5771 +
5772 +#define        CIR_IOCTL_BASE          ('I'|'R')
5773 +#define CIR_SET_BAUDRATE                       _IOW (CIR_IOCTL_BASE,  0, struct cir_ioctl_data)
5774 +#define CIR_SET_HIGH_PERIOD                    _IOW (CIR_IOCTL_BASE,  1, struct cir_ioctl_data)
5775 +#define CIR_SET_LOW_PERIOD                     _IOW (CIR_IOCTL_BASE,  2, struct cir_ioctl_data)
5776 +#define CIR_SET_PROTOCOL                       _IOW (CIR_IOCTL_BASE,  3, struct cir_ioctl_data)
5777 +#define CIR_SET_ENABLE_COMPARE         _IOW (CIR_IOCTL_BASE,  4, struct cir_ioctl_data)
5778 +#define CIR_SET_ENABLE_DEMOD           _IOW (CIR_IOCTL_BASE,  5, struct cir_ioctl_data)
5779 +#define CIR_SET_POWER_KEY                      _IOW (CIR_IOCTL_BASE,  6, struct cir_ioctl_data)
5780 +#define CIR_GET_BAUDRATE                       _IOR (CIR_IOCTL_BASE,  7, struct cir_ioctl_data)
5781 +#define CIR_GET_HIGH_PERIOD                    _IOR (CIR_IOCTL_BASE,  8 ,struct cir_ioctl_data)
5782 +#define CIR_GET_LOW_PERIOD                     _IOR (CIR_IOCTL_BASE,  9 ,struct cir_ioctl_data)
5783 +#define CIR_GET_PROTOCOL                       _IOR (CIR_IOCTL_BASE, 10, struct cir_ioctl_data)
5784 +#define CIR_GET_ENABLE_COMPARE         _IOR (CIR_IOCTL_BASE, 11, struct cir_ioctl_data)
5785 +#define CIR_GET_ENABLE_DEMOD           _IOR (CIR_IOCTL_BASE, 12, struct cir_ioctl_data)
5786 +#define CIR_GET_POWER_KEY                      _IOR (CIR_IOCTL_BASE, 13, struct cir_ioctl_data)
5787 +#define CIR_GET_DATA                           _IOWR (CIR_IOCTL_BASE, 14, struct cir_ioctl_data48)
5788 +#define CIR_WAIT_INT_DATA                      _IOWR (CIR_IOCTL_BASE, 15, struct cir_ioctl_data48)
5789 +
5790 +#endif //_ASM_ARCH_CIR_H
5791 --- /dev/null
5792 +++ b/include/asm-arm/arch-sl2312/gemini_gpio.h
5793 @@ -0,0 +1,77 @@
5794 +/*
5795 + * FILE NAME gemini_gpio.h
5796 + *
5797 + * BRIEF MODULE DESCRIPTION
5798 + *     Generic Gemini GPIO
5799 + *
5800 + *  Author: Storlink Software [Device driver]
5801 + *          Jason Lee <jason@storlink.com.tw>
5802 + *
5803 + * Copyright 2005 Storlink Inc.
5804 + *
5805 + *  This program is free software; you can redistribute  it and/or modify it
5806 + *  under  the terms of  the GNU General  Public License as published by the
5807 + *  Free Software Foundation;  either version 2 of the  License, or (at your
5808 + *  option) any later version.
5809 + *
5810 + *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
5811 + *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
5812 + *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
5813 + *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
5814 + *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
5815 + *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
5816 + *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
5817 + *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
5818 + *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
5819 + *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
5820 + *
5821 + *  You should have received a copy of the  GNU General Public License along
5822 + *  with this program; if not, write  to the Free Software Foundation, Inc.,
5823 + *  675 Mass Ave, Cambridge, MA 02139, USA.
5824 + */
5825 +
5826 +#ifndef __GEMINI_GPIO_H
5827 +#define __GEMINI_GPIO_H
5828 +
5829 +#include <linux/ioctl.h>
5830 +
5831 +#define STATUS_HIGH    1
5832 +#define STATUS_LOW     0
5833 +#define DIRECT_OUT     1
5834 +#define DIRECT_IN      0
5835 +
5836 +#define EDGE_TRIG      0
5837 +#define RISING_EDGE    0
5838 +#define FALL_EDGE      1
5839 +#define SINGLE_EDGE    0
5840 +#define BOTH_EDGE      1
5841 +
5842 +#define LEVEL_TRIG     1
5843 +#define HIGH_ACTIVE    0
5844 +#define LOW_ACTIVE     1
5845 +
5846 +struct gemini_gpio_ioctl_data {
5847 +       __u32 pin;
5848 +       __u8 status;                    // status or pin direction
5849 +                                       // 0: status low or Input
5850 +                                       // 1: status high or Output
5851 +
5852 +       /* these member are used to config GPIO interrupt parameter */
5853 +       __u8    use_default;            // if not sure ,set this argument 1
5854 +       __u8    trig_type;              // 0/1:edge/level triger ?
5855 +       __u8    trig_polar;             // 0/1:rising/falling high/low active ?
5856 +       __u8    trig_both;              // 0/1:single/both detect both ?
5857 +};
5858 +
5859 +#define GEMINI_GPIO_IOCTL_BASE 'Z'
5860 +
5861 +#define GEMINI_SET_GPIO_PIN_DIR                _IOW (GEMINI_GPIO_IOCTL_BASE,16, struct gemini_gpio_ioctl_data)
5862 +#define        GEMINI_SET_GPIO_PIN_STATUS      _IOW (GEMINI_GPIO_IOCTL_BASE,17, struct gemini_gpio_ioctl_data)
5863 +#define        GEMINI_GET_GPIO_PIN_STATUS      _IOWR(GEMINI_GPIO_IOCTL_BASE,18, struct gemini_gpio_ioctl_data)
5864 +#define GEMINI_WAIT_GPIO_PIN_INT       _IOWR(GEMINI_GPIO_IOCTL_BASE,19, struct gemini_gpio_ioctl_data)
5865 +
5866 +
5867 +extern void init_gpio_int(__u32 pin,__u8 trig_type,__u8 trig_polar,__u8 trig_both);
5868 +extern int request_gpio_irq(int bit,void (*handler)(int),char level,char high,char both);
5869 +extern int free_gpio_irq(int bit);
5870 +#endif
5871 --- /dev/null
5872 +++ b/include/asm-arm/arch-sl2312/gemini_i2s.h
5873 @@ -0,0 +1,169 @@
5874 +#ifndef __GEMINI_I2S_H__
5875 +#define __GEMINI_I2S_H__
5876 +#include <linux/ioctl.h>
5877 +#include <linux/types.h>
5878 +#include <asm/arch-sl2312/irqs.h>
5879 +
5880 +typedef __u16 UINT16;
5881 +typedef __u32 UINT32;
5882 +typedef __u8 UINT8;
5883 +typedef __u8 BOOL;
5884 +
5885 +/***************************************/
5886 +/* define GPIO module base address     */
5887 +/***************************************/
5888 +#define DMA_CONTROL_PHY_BASE  (IO_ADDRESS(SL2312_GENERAL_DMA_BASE))
5889 +#define DMA_CONTROL_SSP_BASE  (IO_ADDRESS(SL2312_SSP_CTRL_BASE))
5890 +#define SSP_INT                                IRQ_SSP
5891 +#define GPIO_BASE_ADDR      (IO_ADDRESS(SL2312_GPIO_BASE))
5892 +#define GPIO_BASE_ADDR1      (IO_ADDRESS(SL2312_GPIO_BASE1))
5893 +#define GLOBAL_BASE      (IO_ADDRESS(SL2312_GLOBAL_BASE))
5894 +
5895 +/* define read/write register utility */
5896 +#define READ_SSP_REG(offset)                   (__raw_readl(offset+DMA_CONTROL_SSP_BASE))
5897 +#define WRITE_SSP_REG(offset,val)      (__raw_writel(val,offset+DMA_CONTROL_SSP_BASE))
5898 +
5899 +#define READ_GPIO_REG(offset)                  (__raw_readl(offset+GPIO_BASE_ADDR))
5900 +#define WRITE_GPIO_REG(offset,val)     (__raw_writel(val,offset+GPIO_BASE_ADDR))
5901 +
5902 +#define READ_GPIO1_REG(offset)                 (__raw_readl(offset+GPIO_BASE_ADDR1))
5903 +#define WRITE_GPIO1_REG(offset,val)    (__raw_writel(val,offset+GPIO_BASE_ADDR1))
5904 +
5905 +#define READ_DMA_REG(offset)                   (__raw_readl(offset+DMA_CONTROL_PHY_BASE))
5906 +#define WRITE_DMA_REG(offset,val)      (__raw_writel(val,offset+DMA_CONTROL_PHY_BASE))
5907 +
5908 +#define READ_GLOBAL_REG(offset)                        (__raw_readl(offset+GLOBAL_BASE))
5909 +#define WRITE_GLOBAL_REG(offset,val)   (__raw_writel(val,offset+GLOBAL_BASE))
5910 +
5911 +#define SSP_GPIO_INT           IRQ_GPIO
5912 +
5913 +#ifndef CONFIG_SL3516_ASIC
5914 +#define SSP_GPIO_INT_BIT    0x00000400                         //GPIO[10] : SLIC interrupt pin
5915 +
5916 +#define GPIO_EECK           0x00000040         /*   SCK: GPIO[06]   */
5917 +#define GPIO_EECS           0x00000080                 /*   SCS: GPIO[07]   */
5918 +#define GPIO_MISO           0x00000200         /*   SDO: GPIO[09]   receive from 6996*/
5919 +#define GPIO_MOSI           0x00000100         /*   SDI: GPIO[08]   send to 6996*/
5920 +#define GPIO_MISO_BIT   9
5921 +#else
5922 +#define SSP_GPIO_INT_BIT    0x00000001                         //GPIO[0] : SLIC interrupt pin
5923 +
5924 +//#if 0
5925 +//#define GPIO_EECK         0x80000000         /*   SCK: GPIO1[31]   */
5926 +//#define GPIO_EECS         0x40000000                 /*   SCS: GPIO1[30]   */
5927 +//#define GPIO_MISO         0x20000000         /*   SDO: GPIO1[29]   receive from 6996*/
5928 +//#define GPIO_MOSI         0x10000000         /*   SDI: GPIO1[28]   send to 6996*/
5929 +//#define GPIO_MISO_BIT        29
5930 +//#else
5931 +//#define GPIO_EECK         0x00000100         /*   SCK: GPIO1[08]   */
5932 +//#define GPIO_EECS         0x08000000                 /*   SCS: GPIO1[27]   */
5933 +//#define GPIO_MISO         0x00000080         /*   SDO: GPIO1[07]   receive from 6996*/
5934 +//#define GPIO_MOSI         0x00000200         /*   SDI: GPIO1[09]   send to 6996*/
5935 +//#define GPIO_MISO_BIT        7
5936 +//#endif
5937 +#endif
5938 +
5939 +
5940 +enum GPIO_REG
5941 +{
5942 +       GPIO_DATA_OUT           = 0x00,
5943 +       GPIO_DATA_IN            = 0x04,
5944 +       GPIO_PIN_DIR            = 0x08,
5945 +       GPIO_BY_PASS            = 0x0c,
5946 +       GPIO_DATA_SET           = 0x10,
5947 +       GPIO_DATA_CLEAR         = 0x14,
5948 +       GPIO_INT_ENABLE     = 0x20,
5949 +       GPIO_INT_RAWSTATE   = 0x24,
5950 +       GPIO_INT_MASKSTATE  = 0x28,
5951 +       GPIO_INT_MASK       = 0x2C,
5952 +       GPIO_INT_CLEAR      = 0x30,
5953 +       GPIO_INT_TRIGGER    = 0x34,
5954 +       GPIO_INT_BOTH       = 0x38,
5955 +       GPIO_INT_POLARITY   = 0x3C
5956 +};
5957 +
5958 +typedef struct
5959 +{
5960 +       UINT32 src_addr;
5961 +       UINT32 dst_addr;
5962 +       UINT32 llp;
5963 +       UINT32 ctrl_size;
5964 +       UINT32 owner;
5965 +}DMA_LLP_t;
5966 +
5967 +typedef struct
5968 +{
5969 +       UINT32 owner;
5970 +       UINT32 src_addr;
5971 +       UINT32 ctrl_size;
5972 +}IOCTL_LLP_t;
5973 +
5974 +typedef unsigned char byte;
5975 +typedef unsigned short word;
5976 +typedef unsigned long dword;
5977 +
5978 +/* DMA Registers */
5979 +#define        DMA_INT                                 0x00000000
5980 +#define        DMA_INT_TC                              0x00000004
5981 +#define        DMA_CFG                                 0x00000024
5982 +#define        DMA_INT_TC_CLR                          0x00000008
5983 +#define        DMA_TC                                          0x00000014
5984 +#define        DMA_CSR                                         0x00000024
5985 +#define        DMA_SYNC                                        0x00000028
5986 +
5987 +#define        DMA_CH2_CSR                             0x00000140
5988 +#define        DMA_CH2_CFG                             0x00000144
5989 +#define        DMA_CH2_SRC_ADDR                0x00000148
5990 +#define        DMA_CH2_DST_ADDR                0x0000014c
5991 +#define        DMA_CH2_LLP                             0x00000150
5992 +#define        DMA_CH2_SIZE                            0x00000154
5993 +
5994 +#define        DMA_CH3_CSR                             0x00000160
5995 +#define        DMA_CH3_CFG                             0x00000164
5996 +#define        DMA_CH3_SRC_ADDR                0x00000168
5997 +#define        DMA_CH3_DST_ADDR                0x0000016c
5998 +#define        DMA_CH3_LLP                             0x00000170
5999 +#define        DMA_CH3_SIZE                            0x00000174
6000 +
6001 +#define    SSP_DEVICE_ID                       0x00
6002 +#define    SSP_CTRL_STATUS                     0x04
6003 +#define           SSP_FRAME_CTRL           0x08
6004 +#define    SSP_BAUD_RATE            0x0c
6005 +#define    SSP_FRAME_CTRL2          0x10
6006 +#define    SSP_FIFO_CTRL            0x14
6007 +#define    SSP_TX_SLOT_VALID0       0x18
6008 +#define    SSP_TX_SLOT_VALID1       0x1c
6009 +#define    SSP_TX_SLOT_VALID2       0x20
6010 +#define    SSP_TX_SLOT_VALID3       0x24
6011 +#define    SSP_RX_SLOT_VALID0       0x28
6012 +#define    SSP_RX_SLOT_VALID1       0x2c
6013 +#define    SSP_RX_SLOT_VALID2       0x30
6014 +#define    SSP_RX_SLOT_VALID3       0x34
6015 +#define    SSP_SLOT_SIZE0           0x38
6016 +#define    SSP_SLOT_SIZE1           0x3c
6017 +#define    SSP_SLOT_SIZE2           0x40
6018 +#define    SSP_SLOT_SIZE3           0x44
6019 +#define    SSP_READ_PORT            0x48
6020 +#define    SSP_WRITE_PORT           0x4c
6021 +
6022 +
6023 +
6024 +#define SSP_I2S_INIT_BUF                       _IO  ('q', 0x00)
6025 +#define SSP_I2S_STOP_DMA                       _IO  ('q', 0x01)
6026 +#define SSP_I2S_FILE_LEN                       _IOW  ('q', 0x2, int)
6027 +/*
6028 +#define SSP_GET_HOOK_STATUS                    _IOR  ('q', 0xC0, int)
6029 +#define SSP_GET_LINEFEED                       _IOR  ('q', 0xC1, int)
6030 +#define SSP_SET_LINEFEED                       _IOW  ('q', 0xC2, int)
6031 +#define SSP_GET_REG                 _IOWR ('q', 0xC3, struct Ssp_reg *)
6032 +#define SSP_SET_REG                 _IOWR ('q', 0xC4, struct Ssp_reg *)
6033 +#define SSP_GEN_OFFHOOK_TONE           _IO   ('q', 0xC5)
6034 +#define SSP_GEN_BUSY_TONE                      _IO   ('q', 0xC6)
6035 +#define SSP_GEN_RINGBACK_TONE          _IO   ('q', 0xC7)
6036 +#define SSP_GEN_CONGESTION_TONE                _IO   ('q', 0xC8)
6037 +#define SSP_DISABLE_DIALTONE           _IO   ('q', 0xC9)
6038 +#define SSP_PHONE_RING_START           _IO   ('q', 0xCA)
6039 +*/
6040 +
6041 +
6042 +#endif //__GEMINI_I2S_H__
6043 --- /dev/null
6044 +++ b/include/asm-arm/arch-sl2312/gemini_ssp.h
6045 @@ -0,0 +1,263 @@
6046 +/******************************************************************************
6047 + *    gemini_ssp.h
6048 + *
6049 + *
6050 + *****************************************************************************/
6051 +
6052 +#include <linux/types.h>
6053 +#include <asm/arch-sl2312/irqs.h>
6054 +#include <linux/phonedev.h>
6055 +#include <linux/telephony.h>
6056 +//#include "proslic.h"
6057 +
6058 +typedef __u16 UINT16;
6059 +typedef __u32 UINT32;
6060 +typedef __u8 UINT8;
6061 +typedef __u8 BOOL;
6062 +
6063 +#define TRUE 1
6064 +#define FALSE 0
6065 +
6066 +/***************************************/
6067 +/* define GPIO module base address     */
6068 +/***************************************/
6069 +#define DMA_CONTROL_PHY_BASE  (IO_ADDRESS(SL2312_GENERAL_DMA_BASE))
6070 +#define DMA_CONTROL_SSP_BASE  (IO_ADDRESS(SL2312_SSP_CTRL_BASE))
6071 +#define SSP_INT                                IRQ_SSP
6072 +#define GPIO_BASE_ADDR      (IO_ADDRESS(SL2312_GPIO_BASE))
6073 +#define GPIO_BASE_ADDR1      (IO_ADDRESS(SL2312_GPIO_BASE1))
6074 +#define GLOBAL_BASE      (IO_ADDRESS(SL2312_GLOBAL_BASE))
6075 +
6076 +/* define read/write register utility */
6077 +#define READ_SSP_REG(offset)                   (__raw_readl(offset+DMA_CONTROL_SSP_BASE))
6078 +#define WRITE_SSP_REG(offset,val)      (__raw_writel(val,offset+DMA_CONTROL_SSP_BASE))
6079 +
6080 +#define READ_GPIO_REG(offset)                  (__raw_readl(offset+GPIO_BASE_ADDR))
6081 +#define WRITE_GPIO_REG(offset,val)     (__raw_writel(val,offset+GPIO_BASE_ADDR))
6082 +
6083 +#define READ_GPIO1_REG(offset)                 (__raw_readl(offset+GPIO_BASE_ADDR1))
6084 +#define WRITE_GPIO1_REG(offset,val)    (__raw_writel(val,offset+GPIO_BASE_ADDR1))
6085 +
6086 +#define READ_DMA_REG(offset)                   (__raw_readl(offset+DMA_CONTROL_PHY_BASE))
6087 +#define WRITE_DMA_REG(offset,val)      (__raw_writel(val,offset+DMA_CONTROL_PHY_BASE))
6088 +
6089 +#define READ_GLOBAL_REG(offset)                        (__raw_readl(offset+GLOBAL_BASE))
6090 +#define WRITE_GLOBAL_REG(offset,val)   (__raw_writel(val,offset+GLOBAL_BASE))
6091 +
6092 +
6093 +#define SSP_GPIO_INT           IRQ_GPIO
6094 +
6095 +#ifndef CONFIG_SL3516_ASIC
6096 +#define SSP_GPIO_INT_BIT    0x00000400                         //GPIO[10] : SLIC interrupt pin
6097 +
6098 +#define GPIO_EECK           0x00000040         /*   SCK: GPIO[06]   */
6099 +#define GPIO_EECS           0x00000080                 /*   SCS: GPIO[07]   */
6100 +#define GPIO_MISO           0x00000200         /*   SDO: GPIO[09]   receive from 6996*/
6101 +#define GPIO_MOSI           0x00000100         /*   SDI: GPIO[08]   send to 6996*/
6102 +#define GPIO_MISO_BIT   9
6103 +#else
6104 +#define SSP_GPIO_INT_BIT    0x00000001                         //GPIO[0] : SLIC interrupt pin
6105 +
6106 +//#if 0
6107 +//#define GPIO_EECK         0x80000000         /*   SCK: GPIO1[31]   */
6108 +//#define GPIO_EECS         0x40000000                 /*   SCS: GPIO1[30]   */
6109 +//#define GPIO_MISO         0x20000000         /*   SDO: GPIO1[29]   receive from 6996*/
6110 +//#define GPIO_MOSI         0x10000000         /*   SDI: GPIO1[28]   send to 6996*/
6111 +//#define GPIO_MISO_BIT        29
6112 +//#else
6113 +//#define GPIO_EECK         0x00000100         /*   SCK: GPIO1[08]   */
6114 +//#define GPIO_EECS         0x08000000                 /*   SCS: GPIO1[27]   */
6115 +//#define GPIO_MISO         0x00000080         /*   SDO: GPIO1[07]   receive from 6996*/
6116 +//#define GPIO_MOSI         0x00000200         /*   SDI: GPIO1[09]   send to 6996*/
6117 +//#define GPIO_MISO_BIT        7
6118 +//#endif
6119 +#endif
6120 +
6121 +
6122 +enum GPIO_REG
6123 +{
6124 +       GPIO_DATA_OUT           = 0x00,
6125 +       GPIO_DATA_IN            = 0x04,
6126 +       GPIO_PIN_DIR            = 0x08,
6127 +       GPIO_BY_PASS            = 0x0c,
6128 +       GPIO_DATA_SET           = 0x10,
6129 +       GPIO_DATA_CLEAR         = 0x14,
6130 +       GPIO_INT_ENABLE     = 0x20,
6131 +       GPIO_INT_RAWSTATE   = 0x24,
6132 +       GPIO_INT_MASKSTATE  = 0x28,
6133 +       GPIO_INT_MASK       = 0x2C,
6134 +       GPIO_INT_CLEAR      = 0x30,
6135 +       GPIO_INT_TRIGGER    = 0x34,
6136 +       GPIO_INT_BOTH       = 0x38,
6137 +       GPIO_INT_POLARITY   = 0x3C
6138 +};
6139 +
6140 +
6141 +#define SPI_ADD_LEN         7                  // bits of Address
6142 +#define SPI_DAT_LEN         8                  // bits of Data
6143 +
6144 +
6145 +
6146 +//#ifdef MIDWAY_DIAG
6147 +#define        DAISY_MODE      1
6148 +#if (DAISY_MODE==1)
6149 +#define NUMBER_OF_CHAN 2
6150 +#else
6151 +#define NUMBER_OF_CHAN 1
6152 +#endif
6153 +#define LLP_SIZE   8
6154 +#define SBUF_SIZE  512 //0xff0 //2560
6155 +#define DBUF_SIZE  SBUF_SIZE*NUMBER_OF_CHAN //0xff0 //2560
6156 +#define TBUF_SIZE  (LLP_SIZE)*DBUF_SIZE
6157 +#define DESC_NUM   1
6158 +#define DTMF_NUM   20
6159 +
6160 +/* define owner bit of SSP */
6161 +//data into SSP and transfer to AP==> SSP_Rx
6162 +//data out of SSP and transfer to SLIC==> SSP_Tx
6163 +#define CPU            0
6164 +#define DMA            1
6165 +
6166 +#define DMA_DEMO   0
6167 +#define DMA_NDEMO  1
6168 +//#define DMA_NONE   2
6169 +
6170 +enum exceptions {
6171 +       PROSLICiNSANE,
6172 +       TIMEoUTpOWERuP,
6173 +       TIMEoUTpOWERdOWN,
6174 +       POWERlEAK,
6175 +       TIPoRrINGgROUNDsHORT,
6176 +       POWERaLARMQ1,
6177 +       POWERaLARMQ2,
6178 +       POWERaLARMQ3,
6179 +       POWERaLARMQ4,
6180 +       POWERaLARMQ5,
6181 +       OWERaLARMQ6,
6182 +       CM_CAL_ERR
6183 +};
6184 +
6185 +typedef struct
6186 +{
6187 +       UINT32 src_addr;
6188 +       UINT32 dst_addr;
6189 +       UINT32 llp;
6190 +       UINT32 ctrl_size;
6191 +}DMA_LLP_t;
6192 +
6193 +typedef struct {
6194 +       unsigned int own ;
6195 +       char  *tbuf;
6196 +       //UINT32 *LinkAddrT;
6197 +       DMA_LLP_t LLPT[LLP_SIZE];
6198 +}DMA_Tx_t;
6199 +
6200 +typedef struct {
6201 +       unsigned int own ;
6202 +       char  *rbuf;
6203 +       //UINT32 *LinkAddrR;
6204 +       DMA_LLP_t LLPR[LLP_SIZE];
6205 +}DMA_Rx_t;
6206 +
6207 +//typedef struct {
6208 +//     //UINT32 init_stat;
6209 +//     struct chipStruct chipData ; /* Represents a proslics state, cached information, and timers */
6210 +//     struct phone_device p;
6211 +//
6212 +//
6213 +//}SSP_SLIC;
6214 +
6215 +
6216 +
6217 +/* DMA Registers */
6218 +#define        DMA_INT                                 0x00000000
6219 +#define        DMA_INT_TC                              0x00000004
6220 +#define        DMA_CFG                                 0x00000024
6221 +#define        DMA_INT_TC_CLR                          0x00000008
6222 +#define        DMA_TC                                          0x00000014
6223 +#define        DMA_CSR                                         0x00000024
6224 +#define        DMA_SYNC                                        0x00000028
6225 +
6226 +#define        DMA_CH2_CSR                             0x00000140
6227 +#define        DMA_CH2_CFG                             0x00000144
6228 +#define        DMA_CH2_SRC_ADDR                0x00000148
6229 +#define        DMA_CH2_DST_ADDR                0x0000014c
6230 +#define        DMA_CH2_LLP                             0x00000150
6231 +#define        DMA_CH2_SIZE                            0x00000154
6232 +
6233 +#define        DMA_CH3_CSR                             0x00000160
6234 +#define        DMA_CH3_CFG                             0x00000164
6235 +#define        DMA_CH3_SRC_ADDR                0x00000168
6236 +#define        DMA_CH3_DST_ADDR                0x0000016c
6237 +#define        DMA_CH3_LLP                             0x00000170
6238 +#define        DMA_CH3_SIZE                            0x00000174
6239 +
6240 +#define    SSP_DEVICE_ID                       0x00
6241 +#define    SSP_CTRL_STATUS                     0x04
6242 +#define           SSP_FRAME_CTRL           0x08
6243 +#define    SSP_BAUD_RATE            0x0c
6244 +#define    SSP_FRAME_CTRL2          0x10
6245 +#define    SSP_FIFO_CTRL            0x14
6246 +#define    SSP_TX_SLOT_VALID0       0x18
6247 +#define    SSP_TX_SLOT_VALID1       0x1c
6248 +#define    SSP_TX_SLOT_VALID2       0x20
6249 +#define    SSP_TX_SLOT_VALID3       0x24
6250 +#define    SSP_RX_SLOT_VALID0       0x28
6251 +#define    SSP_RX_SLOT_VALID1       0x2c
6252 +#define    SSP_RX_SLOT_VALID2       0x30
6253 +#define    SSP_RX_SLOT_VALID3       0x34
6254 +#define    SSP_SLOT_SIZE0           0x38
6255 +#define    SSP_SLOT_SIZE1           0x3c
6256 +#define    SSP_SLOT_SIZE2           0x40
6257 +#define    SSP_SLOT_SIZE3           0x44
6258 +#define    SSP_READ_PORT            0x48
6259 +#define    SSP_WRITE_PORT           0x4c
6260 +
6261 +
6262 +void printFreq_Revision(int num);
6263 +void SLIC_SPI_write(int num, UINT8 ,UINT8);
6264 +UINT8 SLIC_SPI_read(int num, UINT8);
6265 +void SLIC_SPI_write_bit(char);
6266 +void SLIC_SPI_ind_write(int num, UINT8, UINT16);
6267 +UINT16 SLIC_SPI_ind_read(int num, UINT8);
6268 +void SLIC_SPI_CS_enable(UINT8);
6269 +unsigned int SLIC_SPI_read_bit(void);
6270 +void SLIC_SPI_pre_st(void);
6271 +UINT32 ssp_init(void);
6272 +UINT16 SLIC_SPI_get_identifier(int num);
6273 +int selfTest(int num);
6274 +void exception (int num, enum exceptions e);
6275 +int SLIC_init(int num);
6276 +UINT8 version(int num);
6277 +UINT8 chipType (int num);
6278 +void SLIC_init_ind_reg_set(int num);
6279 +UINT8 powerUp(int num);
6280 +UINT8 powerLeakTest(int num);
6281 +void SLIC_init_reg_set(int num);
6282 +int calibrate(int num);
6283 +void goActive(int num);
6284 +void clearInterrupts(int num);
6285 +void setState(int num, int);
6286 +UINT8 loopStatus(int num);
6287 +int verifyIndirectRegisters(int num);
6288 +int verifyIndirectReg(int num, UINT8 , UINT16);
6289 +void sendProSLICID(int num);
6290 +void disableOscillators(int num);
6291 +UINT8 checkSum(int num, char * string );
6292 +void fskInitialization (int num);
6293 +void fskByte(int num, UINT8 c);
6294 +void waitForInterrupt (int num);
6295 +//void findNumber(void);
6296 +UINT8 dtmfAction(int num);
6297 +UINT8 digit(int num);
6298 +void interrupt_init(void);
6299 +//void gemini_slic_isr (int );
6300 +int groundShort(int num);
6301 +void clearAlarmBits(int num);
6302 +void stopRinging(int num);
6303 +void activateRinging(int num);
6304 +void initializeLoopDebounceReg(int num);
6305 +void busyJapan(int num) ;
6306 +void ringBackJapan(int num) ;
6307 +void stateMachine(int num);
6308 +
6309 --- /dev/null
6310 +++ b/include/asm-arm/arch-sl2312/hardware.h
6311 @@ -0,0 +1,47 @@
6312 +/*
6313 + *  linux/include/asm-arm/arch-epxa10/hardware.h
6314 + *
6315 + *  This file contains the hardware definitions of the Integrator.
6316 + *
6317 + *  Copyright (C) 1999 ARM Limited.
6318 + *  Copyright (C) 2001 Altera Corporation
6319 + *
6320 + * This program is free software; you can redistribute it and/or modify
6321 + * it under the terms of the GNU General Public License as published by
6322 + * the Free Software Foundation; either version 2 of the License, or
6323 + * (at your option) any later version.
6324 + *
6325 + * This program is distributed in the hope that it will be useful,
6326 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
6327 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6328 + * GNU General Public License for more details.
6329 + *
6330 + * You should have received a copy of the GNU General Public License
6331 + * along with this program; if not, write to the Free Software
6332 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6333 + */
6334 +#ifndef __ASM_ARCH_HARDWARE_H
6335 +#define __ASM_ARCH_HARDWARE_H
6336 +
6337 +#include <asm/arch/platform.h>
6338 +
6339 +#define pcibios_assign_all_busses()    1
6340 +
6341 +/*
6342 + * Where in virtual memory the IO devices (timers, system controllers
6343 + * and so on)
6344 + *
6345 + * macro to get at IO space when running virtually
6346 +*/
6347 +
6348 +#define IO_ADDRESS(x)      (((x&0xfff00000)>>4)|(x & 0x000fffff)|0xF0000000)
6349 +#define FLASH_VBASE         0xFE000000
6350 +#define FLASH_SIZE 0x1000000// 8M
6351 +#define FLASH_START         SL2312_FLASH_BASE
6352 +#define FLASH_VADDR(x)      ((x & 0x00ffffff)|0xFE000000)       // flash virtual address
6353 +
6354 +#define PCIBIOS_MIN_IO                                 0x100           // 0x000-0x100 AHB reg and PCI config, data
6355 +#define PCIBIOS_MIN_MEM                                        0
6356 +
6357 +#endif
6358 +
6359 --- /dev/null
6360 +++ b/include/asm-arm/arch-sl2312/int_ctrl.h
6361 @@ -0,0 +1,171 @@
6362 +/*
6363 + *
6364 + *  This file contains the register definitions for the Excalibur
6365 + *  Timer TIMER00.
6366 + *
6367 + *  Copyright (C) 2001 Altera Corporation
6368 + *
6369 + * This program is free software; you can redistribute it and/or modify
6370 + * it under the terms of the GNU General Public License as published by
6371 + * the Free Software Foundation; either version 2 of the License, or
6372 + * (at your option) any later version.
6373 + *
6374 + * This program is distributed in the hope that it will be useful,
6375 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
6376 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6377 + * GNU General Public License for more details.
6378 + *
6379 + * You should have received a copy of the GNU General Public License
6380 + * along with this program; if not, write to the Free Software
6381 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6382 + */
6383 +
6384 +#ifndef __INT_CTRL_H
6385 +#define __INT_CTRL_H
6386 +
6387 +#define PCI_IRQ_OFFSET                   64    /* PCI start IRQ number */
6388 +#define FIQ_OFFSET                32
6389 +
6390 +#define IRQ_SOURCE(base_addr)   (INT_CTRL_TYPE(base_addr  + 0x00))
6391 +#define IRQ_MASK(base_addr)     (INT_CTRL_TYPE (base_addr  + 0x04 ))
6392 +#define IRQ_CLEAR(base_addr)    (INT_CTRL_TYPE (base_addr  + 0x08 ))
6393 +#define IRQ_TMODE(base_addr)    (INT_CTRL_TYPE (base_addr  + 0x0C ))
6394 +#define IRQ_TLEVEL(base_addr)    (INT_CTRL_TYPE (base_addr  + 0x10 ))
6395 +#define IRQ_STATUS(base_addr)   (INT_CTRL_TYPE (base_addr  + 0x14 ))
6396 +#define FIQ_SOURCE(base_addr)   (INT_CTRL_TYPE (base_addr  + 0x20 ))
6397 +#define FIQ_MASK(base_addr)     (INT_CTRL_TYPE (base_addr  + 0x24 ))
6398 +#define FIQ_CLEAR(base_addr)    (INT_CTRL_TYPE (base_addr  + 0x28 ))
6399 +#define FIQ_TMODE(base_addr)    (INT_CTRL_TYPE (base_addr  + 0x2C ))
6400 +#define FIQ_LEVEL(base_addr)    (INT_CTRL_TYPE (base_addr  + 0x30 ))
6401 +#define FIQ_STATUS(base_addr)   (INT_CTRL_TYPE (base_addr  + 0x34 ))
6402 +
6403 +#ifdef CONFIG_SL3516_ASIC
6404 +#define        IRQ_SERIRQ0_OFFSET                      30
6405 +#define        IRQ_PCID_OFFSET                         29
6406 +#define        IRQ_PCIC_OFFSET                         28
6407 +#define        IRQ_PCIB_OFFSET                         27
6408 +#define IRQ_PWR_OFFSET                                 26
6409 +#define IRQ_CIR_OFFSET                                         25
6410 +#define        IRQ_GPIO2_OFFSET                        24
6411 +#define        IRQ_GPIO1_OFFSET                        23
6412 +#define        IRQ_GPIO_OFFSET                         22
6413 +#define        IRQ_SSP_OFFSET                          21
6414 +#define IRQ_LPC_OFFSET                      20
6415 +#define IRQ_LCD_OFFSET                      19
6416 +#define        IRQ_UART_OFFSET                         18
6417 +#define        IRQ_RTC_OFFSET                                  17
6418 +#define        IRQ_TIMER3_OFFSET                       16
6419 +#define        IRQ_TIMER2_OFFSET                       15
6420 +#define        IRQ_TIMER1_OFFSET                       14
6421 +#define IRQ_FLASH_OFFSET                                       12
6422 +#define        IRQ_USB1_OFFSET                         11
6423 +#define IRQ_USB0_OFFSET                                                10
6424 +#define        IRQ_DMA_OFFSET                          9
6425 +#define        IRQ_PCI_OFFSET                          8
6426 +#define        IRQ_IPSEC_OFFSET                        7
6427 +#define        IRQ_RAID_OFFSET                     6
6428 +#define        IRQ_IDE1_OFFSET                         5
6429 +#define        IRQ_IDE0_OFFSET                         4
6430 +#define        IRQ_WATCHDOG_OFFSET                 3
6431 +#define        IRQ_GMAC1_OFFSET                    2
6432 +#define IRQ_GMAC0_OFFSET                                       1
6433 +#define        IRQ_CPU0_IP_IRQ_OFFSET              0
6434 +
6435 +#define        IRQ_SERIRQ0_MASK                        (1<<30)
6436 +#define IRQ_PCID_MASK                                  (1<<29)
6437 +#define IRQ_PCIC_MASK                                  (1<<28)
6438 +#define IRQ_PCIB_MASK                                  (1<<27)
6439 +#define IRQ_PWR_MASK                                   (1<<26)
6440 +#define IRQ_CIR_MASK                                           (1<<25)
6441 +#define        IRQ_GPIO2_MASK                          (1<<24)
6442 +#define        IRQ_GPIO1_MASK                          (1<<23)
6443 +#define        IRQ_GPIO_MASK                       (1<<22)
6444 +#define        IRQ_SSP_MASK                        (1<<21)
6445 +#define IRQ_LPC_MASK                        (1<<20)
6446 +#define IRQ_LCD_MASK                        (1<<19)
6447 +#define        IRQ_UART_MASK                       (1<<18)
6448 +#define        IRQ_RTC_MASK                                (1<<17)
6449 +#define        IRQ_TIMER3_MASK                     (1<<16)
6450 +#define        IRQ_TIMER2_MASK                     (1<<15)
6451 +#define        IRQ_TIMER1_MASK                     (1<<14)
6452 +#define IRQ_FLASH_MASK                                     (1<<12)
6453 +#define        IRQ_USB1_MASK                       (1<<11)
6454 +#define IRQ_USB0_MASK                                      (1<<10)
6455 +#define        IRQ_DMA_MASK                        (1<< 9)
6456 +#define        IRQ_PCI_MASK                        (1<< 8)
6457 +#define        IRQ_IPSEC_MASK                              (1<< 7)
6458 +#define        IRQ_RAID_MASK                       (1<< 6)
6459 +#define        IRQ_IDE1_MASK                       (1<< 5)
6460 +#define        IRQ_IDE0_MASK                       (1<< 4)
6461 +#define        IRQ_WATCHDOG_MASK                   (1<< 3)
6462 +#define        IRQ_GMAC1_MASK                      (1<< 2)
6463 +#define IRQ_GMAC0_MASK                                     (1<< 1)
6464 +#define        IRQ_CPU0_IP_IRQ_MASK                (1<< 0)
6465 +#else
6466 +#define        IRQ_SERIRQ0_OFFSET                      30
6467 +#define        IRQ_PCID_OFFSET                         29
6468 +#define        IRQ_PCIC_OFFSET                         28
6469 +#define        IRQ_PCIB_OFFSET                         27
6470 +#define IRQ_PWR_OFFSET                                 26
6471 +#define IRQ_CIR_OFFSET                                         25
6472 +#define        IRQ_GPIO2_OFFSET                        24
6473 +#define        IRQ_GPIO1_OFFSET                        23
6474 +#define        IRQ_GPIO_OFFSET                         22
6475 +#define        IRQ_SSP_OFFSET                          21
6476 +#define IRQ_LPC_OFFSET                      20
6477 +#define IRQ_LCD_OFFSET                      19
6478 +#define        IRQ_UART_OFFSET                         18
6479 +#define        IRQ_RTC_OFFSET                                  17
6480 +#define        IRQ_TIMER3_OFFSET                       16
6481 +#define        IRQ_TIMER2_OFFSET                       15
6482 +#define        IRQ_TIMER1_OFFSET                       14
6483 +#define IRQ_FLASH_OFFSET                                       12
6484 +#define        IRQ_USB1_OFFSET                         11
6485 +#define IRQ_USB0_OFFSET                                                10
6486 +#define        IRQ_DMA_OFFSET                          9
6487 +#define        IRQ_PCI_OFFSET                          8
6488 +#define        IRQ_IPSEC_OFFSET                        7
6489 +#define        IRQ_RAID_OFFSET                     6
6490 +#define        IRQ_IDE1_OFFSET                         5
6491 +#define        IRQ_IDE0_OFFSET                         4
6492 +#define        IRQ_WATCHDOG_OFFSET                 3
6493 +#define        IRQ_GMAC1_OFFSET                    2
6494 +#define IRQ_GMAC0_OFFSET                                       1
6495 +#define        IRQ_CPU0_IP_IRQ_OFFSET              0
6496 +
6497 +#define        IRQ_SERIRQ0_MASK                        (1<<30)
6498 +#define IRQ_PCID_MASK                                  (1<<29)
6499 +#define IRQ_PCIC_MASK                                  (1<<28)
6500 +#define IRQ_PCIB_MASK                                  (1<<27)
6501 +#define IRQ_PWR_MASK                                   (1<<26)
6502 +#define IRQ_CIR_MASK                                           (1<<25)
6503 +#define        IRQ_GPIO2_MASK                          (1<<24)
6504 +#define        IRQ_GPIO1_MASK                          (1<<23)
6505 +#define        IRQ_GPIO_MASK                       (1<<22)
6506 +#define        IRQ_SSP_MASK                        (1<<21)
6507 +#define IRQ_LPC_MASK                        (1<<20)
6508 +#define IRQ_LCD_MASK                        (1<<19)
6509 +#define        IRQ_UART_MASK                       (1<<18)
6510 +#define        IRQ_RTC_MASK                                (1<<17)
6511 +#define        IRQ_TIMER3_MASK                     (1<<16)
6512 +#define        IRQ_TIMER2_MASK                     (1<<15)
6513 +#define        IRQ_TIMER1_MASK                     (1<<14)
6514 +#define IRQ_FLASH_MASK                                     (1<<12)
6515 +#define        IRQ_USB1_MASK                       (1<<11)
6516 +#define IRQ_USB0_MASK                                      (1<<10)
6517 +#define        IRQ_DMA_MASK                        (1<< 9)
6518 +#define        IRQ_PCI_MASK                        (1<< 8)
6519 +#define        IRQ_IPSEC_MASK                              (1<< 7)
6520 +#define        IRQ_RAID_MASK                       (1<< 6)
6521 +#define        IRQ_IDE1_MASK                       (1<< 5)
6522 +#define        IRQ_IDE0_MASK                       (1<< 4)
6523 +#define        IRQ_WATCHDOG_MASK                   (1<< 3)
6524 +#define        IRQ_GMAC1_MASK                      (1<< 2)
6525 +#define IRQ_GMAC0_MASK                                     (1<< 1)
6526 +#define        IRQ_CPU0_IP_IRQ_MASK                (1<< 0)
6527 +#endif
6528 +
6529 +
6530 +#endif /* __INT_CTRL_H */
6531 +
6532 +
6533 --- /dev/null
6534 +++ b/include/asm-arm/arch-sl2312/io.h
6535 @@ -0,0 +1,50 @@
6536 +/*
6537 + *  linux/include/asm-arm/arch-epxa10db/io.h
6538 + *
6539 + *  Copyright (C) 1999 ARM Limited
6540 + *
6541 + * This program is free software; you can redistribute it and/or modify
6542 + * it under the terms of the GNU General Public License as published by
6543 + * the Free Software Foundation; either version 2 of the License, or
6544 + * (at your option) any later version.
6545 + *
6546 + * This program is distributed in the hope that it will be useful,
6547 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
6548 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6549 + * GNU General Public License for more details.
6550 + *
6551 + * You should have received a copy of the GNU General Public License
6552 + * along with this program; if not, write to the Free Software
6553 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6554 + */
6555 +#ifndef __ASM_ARM_ARCH_IO_H
6556 +#define __ASM_ARM_ARCH_IO_H
6557 +
6558 +#define IO_SPACE_LIMIT 0xffffffff
6559 +
6560 +
6561 +/*
6562 + * Generic virtual read/write
6563 + */
6564 +/*
6565 +#define __arch_getw(a)         (*(volatile unsigned short *)(a))
6566 +#define __arch_putw(v,a)       (*(volatile unsigned short *)(a) = (v))
6567 +*/
6568 +/*#define outsw   __arch_writesw
6569 +#define outsl   __arch_writesl
6570 +#define outsb   __arch_writesb
6571 +#define insb    __arch_readsb
6572 +#define insw    __arch_readsw
6573 +#define insl    __arch_readsl*/
6574 +
6575 +#define __io(a)                        (a)
6576 +#define __mem_pci(a)            (a)
6577 +/*
6578 +#define __arch_getw(a)                 (*(volatile unsigned short  *)(a))
6579 +#define __arch_putw(v,a)               (*(volatile unsigned short *)(a) = (v))
6580 +*/
6581 +#define iomem_valid_addr(off,size) (1)
6582 +#define iomem_to_phys(off) (off)
6583 +
6584 +
6585 +#endif
6586 --- /dev/null
6587 +++ b/include/asm-arm/arch-sl2312/ipi.h
6588 @@ -0,0 +1,189 @@
6589 +/*
6590 + *  linux/include/asm-arm/arch-sl2312/system.h
6591 + *
6592 + *  Copyright (C) 1999 ARM Limited
6593 + *  Copyright (C) 2000 Deep Blue Solutions Ltd
6594 + *  Copyright (C) 2001 Altera Corporation
6595 + *
6596 + * This program is free software; you can redistribute it and/or modify
6597 + * it under the terms of the GNU General Public License as published by
6598 + * the Free Software Foundation; either version 2 of the License, or
6599 + * (at your option) any later version.
6600 + *
6601 + * This program is distributed in the hope that it will be useful,
6602 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
6603 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6604 + * GNU General Public License for more details.
6605 + *
6606 + * You should have received a copy of the GNU General Public License
6607 + * along with this program; if not, write to the Free Software
6608 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6609 + */
6610 +#ifndef __ASM_ARCH_IPI_H
6611 +#define __ASM_ARCH_IPI_H
6612 +#include <asm/io.h>
6613 +
6614 +//#define spin_lock(x) spin_lock_dt(x)
6615 +//#define spin_unlock(x)       spin_unlock_dt(x)
6616 +
6617 +#define SWAP_OFFSET                                                    0x400000
6618 +#define SWAP_SIZE                                                      0x400000
6619 +
6620 +#define SHARE_MEM_ADDR                                         0x2000000
6621 +#define SHARE_MEM_SIZE                                         1024*1024
6622 +
6623 +
6624 +//--> Add by jason for IPI testing
6625 +// memory layout for maste & slave bin
6626 +#define MASTERTEXT      0x8000
6627 +#define SLAVETEXT              0x108000
6628 +#define SHARESIZE              0x4000
6629 +#define SHAREADDR              SHARE_MEM_ADDR // starting 8M
6630 +
6631 +// CPU1 reset release
6632 +#define GLOBAL_BASE            IO_ADDRESS(0x40000000)
6633 +#define GLOBAL_SOFTRESET       (GLOBAL_BASE + 0x0C)
6634 +#define CPU1_RESET_BIT_MASK     0x40000000
6635 +
6636 +// IPI , need to redefine the folliwing,  bug
6637 +#define CPU0_STATUS                    (GLOBAL_BASE + 0x0038)
6638 +#define CPU1_STATUS                    (GLOBAL_BASE + 0x003C)
6639 +#define CPU_IPI_BIT_MASK    0x80000000
6640 +
6641 +/* Your basic SMP spinlocks, allowing only a single CPU anywhere
6642 +*/
6643 +typedef struct {
6644 +       volatile unsigned int lock;
6645 +} spinlock_dt;
6646 +
6647 +
6648 +#define         MASTER_BIT      0x01
6649 +#define         SLAVE_BIT       0x02
6650 +#define         HEART_BIT       0x04
6651 +#define         IPI0_IRQ_BIT    0x08
6652 +#define         IPI0_FIQ_BIT    0x10
6653 +#define         IPI1_IRQ_BIT    0x20
6654 +#define         IPI1_FIQ_BIT    0x40
6655 +
6656 +#define IRQ     0
6657 +#define FIQ     1
6658 +#define DONE    0xff
6659 +
6660 +#define         CPU0            0x0
6661 +#define         CPU1            0x1
6662 +
6663 +#define         MAXCHAR         128*1024
6664 +typedef struct  {
6665 +       int flag;
6666 +       int uart_flag;
6667 +       int cnt;
6668 +       spinlock_dt lk;
6669 +       char message[MAXCHAR];
6670 +}s_mailbox;
6671 +
6672 +// JScale proj definition
6673 +typedef struct {
6674 +       u16             type;                           // message Type
6675 +       u16             length;                         // message length, including message header
6676 +} IPC_MSG_HDR_T;
6677 +
6678 +typedef struct{
6679 +       IPC_MSG_HDR_T   hdr;
6680 +       u32                             input_location;
6681 +       u32                             input_size;
6682 +       u32                             output_location;
6683 +       u16                     ScaledImageWidth;
6684 +       u16                     ScaledImageHeight;
6685 +       u8                      ScaledImageQuality;
6686 +       u8                      MaintainResultionRatio;
6687 +       u8                      TwoStepScaling;
6688 +       u8                      InputFormat;
6689 +       u8                              verbose;
6690 +       u8                              reserved[3];
6691 +} JSCALE_REQ_T;
6692 +
6693 +typedef struct{
6694 +       IPC_MSG_HDR_T   hdr;
6695 +       u32                             status;
6696 +       u32                             code;
6697 +       u32                             output_size;
6698 +} JSCALE_RSP_T;
6699 +
6700 +#define IPC_JSCALE_REQ_MSG                     0       // JScale request from CPU-0 to CPU-1
6701 +#define IPC_JSCALE_RSP_MSG                     1       // JScale response from CPU-1 to CPU-0
6702 +
6703 +enum {
6704 +       JSCALE_STATUS_OK = 0,
6705 +       JSCALE_UNKNOWN_MSG_TYPE,
6706 +       JSCALE_FAILED_FILE_SIZE,
6707 +       JSCALE_FAILED_MALLOC,
6708 +       JSCALE_FAILED_FORMAT,
6709 +       JSCALE_DECODE_ERROR,
6710 +       JSCALE_BUSY,
6711 +};
6712 +// <-- JScale
6713 +
6714 +#define GEMINI_IPI_IOCTL_BASE  'Z'
6715 +#define GEMINI_IPI_JSCALE_REQ          _IOW (GEMINI_IPI_IOCTL_BASE,0,JSCALE_REQ_T)
6716 +#define GEMINI_IPI_JSCALE_STAT         _IOR (GEMINI_IPI_IOCTL_BASE,1,JSCALE_RSP_T)
6717 +
6718 +
6719 +/*
6720 +* Simple spin lock operations.
6721 +*
6722 +*/
6723 +
6724 +#define spin_is_locked_dt(x)((x)->lock != 0)
6725 +
6726 +static inline int test_and_set_dt(spinlock_dt *lock)
6727 +{
6728 +unsigned long tmp;
6729 +__asm__ __volatile__(
6730 +"swp     %0, %2, [%1]\n"
6731 +: "=&r" (tmp)
6732 +: "r" (&lock->lock), "r" (1)
6733 +: "cc", "memory");
6734 +
6735 +return tmp;
6736 +}
6737 +
6738 +static inline void spin_lock_dt(spinlock_dt *lock)
6739 +{
6740 +
6741 +unsigned long tmp;
6742 +__asm__ __volatile__(
6743 +"1:     ldr   %0, [%1]\n"
6744 +"teq     %0, #0\n"
6745 +"swpeq   %0, %2, [%1]\n"
6746 +"       teqeq   %0, #0\n"
6747 +"       bne     1b"
6748 +       : "=&r" (tmp)
6749 +       : "r" (&lock->lock), "r" (1)
6750 +       : "cc", "memory");
6751 +}
6752 +
6753 +static inline void spin_unlock_dt(spinlock_dt *lock)
6754 +{
6755 +       __asm__ __volatile__(
6756 +"       str     %1, [%0]"
6757 +       :
6758 +       : "r" (&lock->lock), "r" (0)
6759 +       : "cc", "memory");
6760 +}
6761 +
6762 +static inline int getcpuid(void)
6763 +{
6764 +       int cpuid;
6765 +
6766 +      __asm__(
6767 +"mrc p8, 0, r0, c0, c0, 0\n"
6768 +"mov %0, r0"
6769 +       :"=r"(cpuid)
6770 +       :
6771 +       :"r0");
6772 +       return (cpuid & 0x07);
6773 +}
6774 +
6775 +
6776 +
6777 +#endif
6778 --- /dev/null
6779 +++ b/include/asm-arm/arch-sl2312/irq.h
6780 @@ -0,0 +1,23 @@
6781 +/*
6782 + *  linux/include/asm-arm/arch-sl2312/irq.h
6783 + *
6784 + *  Copyright (C) 1999 ARM Limited
6785 + *
6786 + * This program is free software; you can redistribute it and/or modify
6787 + * it under the terms of the GNU General Public License as published by
6788 + * the Free Software Foundation; either version 2 of the License, or
6789 + * (at your option) any later version.
6790 + *
6791 + * This program is distributed in the hope that it will be useful,
6792 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
6793 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6794 + * GNU General Public License for more details.
6795 + *
6796 + * You should have received a copy of the GNU General Public License
6797 + * along with this program; if not, write to the Free Software
6798 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6799 + */
6800 +
6801 + // Since we have PCI interrupt which the interrupt line is pseudo
6802 + // we need do some fixup
6803 +int fixup_irq(int irq);
6804 --- /dev/null
6805 +++ b/include/asm-arm/arch-sl2312/irqs.h
6806 @@ -0,0 +1,102 @@
6807 +/*
6808 + *  linux/include/asm-arm/arch-camelot/irqs.h
6809 + *
6810 + *  Copyright (C) 2001 Altera Corporation
6811 + *
6812 + * This program is free software; you can redistribute it and/or modify
6813 + * it under the terms of the GNU General Public License as published by
6814 + * the Free Software Foundation; either version 2 of the License, or
6815 + * (at your option) any later version.
6816 + *
6817 + * This program is distributed in the hope that it will be useful,
6818 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
6819 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6820 + * GNU General Public License for more details.
6821 + *
6822 + * You should have received a copy of the GNU General Public License
6823 + * along with this program; if not, write to the Free Software
6824 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6825 + */
6826 +
6827 +/* Use the Excalibur chip definitions */
6828 +#define INT_CTRL_TYPE
6829 +#include "asm/arch/int_ctrl.h"
6830 +
6831 +#ifdef CONFIG_SL3516_ASIC
6832 +#define        IRQ_SERIRQ_MAX                                  31
6833 +#define        IRQ_SERIRQ1                                             31
6834 +#define        IRQ_SERIRQ0                     30
6835 +#define        IRQ_PCID                                29
6836 +#define        IRQ_PCIC                        28
6837 +#define        IRQ_PCIB                                27
6838 +#define IRQ_PWR                                                        26
6839 +#define IRQ_CIR                                                        25
6840 +#define        IRQ_GPIO2                       24
6841 +#define        IRQ_GPIO1                       23
6842 +#define        IRQ_GPIO                                22
6843 +#define        IRQ_SSP                         21
6844 +#define IRQ_LPC                         20
6845 +#define IRQ_LCD                         19
6846 +#define        IRQ_UART                                18
6847 +#define        IRQ_RTC                                 17
6848 +#define        IRQ_TIMER3                      16
6849 +#define        IRQ_TIMER2                      15
6850 +#define        IRQ_TIMER1                      14
6851 +#define IRQ_FLASH                                              12
6852 +#define        IRQ_USB1                        11
6853 +#define IRQ_USB0                                               10
6854 +#define        IRQ_DMA                         9
6855 +#define        IRQ_PCI                                 8
6856 +#define        IRQ_IPSEC                               7
6857 +#define        IRQ_RAID                        6
6858 +#define        IRQ_IDE1                        5
6859 +#define        IRQ_IDE0                                4
6860 +#define        IRQ_WATCHDOG                    3
6861 +#define        IRQ_GMAC1                       2
6862 +#define IRQ_GMAC0                                              1
6863 +#define        IRQ_CPU0_IP_IRQ                 0
6864 +#else
6865 +#define        IRQ_SERIRQ_MAX                                  31
6866 +#define        IRQ_SERIRQ1                                             31
6867 +#define        IRQ_SERIRQ0                     30
6868 +#define        IRQ_PCID                                29
6869 +#define        IRQ_PCIC                        28
6870 +#define        IRQ_PCIB                                27
6871 +#define IRQ_PWR                                                        26
6872 +#define IRQ_CIR                                                        25
6873 +#define        IRQ_GPIO2                       24
6874 +#define        IRQ_GPIO1                       23
6875 +#define        IRQ_GPIO                                22
6876 +#define        IRQ_SSP                         21
6877 +#define IRQ_LPC                         20
6878 +#define IRQ_LCD                         19
6879 +#define        IRQ_UART                                18
6880 +#define        IRQ_RTC                                 17
6881 +#define        IRQ_TIMER3                      16
6882 +#define        IRQ_TIMER2                      15
6883 +#define        IRQ_TIMER1                      14
6884 +#define IRQ_FLASH                                              12
6885 +#define        IRQ_USB1                        11
6886 +#define IRQ_USB0                                               10
6887 +#define        IRQ_DMA                         9
6888 +#define        IRQ_PCI                                 8
6889 +#define        IRQ_IPSEC                               7
6890 +#define        IRQ_RAID                        6
6891 +#define        IRQ_IDE1                        5
6892 +#define        IRQ_IDE0                                4
6893 +#define        IRQ_WATCHDOG                    3
6894 +#define        IRQ_GMAC1                       2
6895 +#define IRQ_GMAC0                                              1
6896 +#endif
6897 +
6898 +#define ARCH_TIMER_IRQ                        IRQ_TIMER2   /* for MV 4.0 */
6899 +
6900 +#define IRQ_PCI_INTA                                  PCI_IRQ_OFFSET + 0
6901 +#define IRQ_PCI_INTB                                  PCI_IRQ_OFFSET + 1
6902 +#define IRQ_PCI_INTC                                  PCI_IRQ_OFFSET + 2
6903 +#define IRQ_PCI_INTD                                  PCI_IRQ_OFFSET + 3
6904 +
6905 +#define NR_IRQS                           (IRQ_PCI_INTD + 4)
6906 +
6907 +
6908 +
6909 --- /dev/null
6910 +++ b/include/asm-arm/arch-sl2312/it8712.h
6911 @@ -0,0 +1,24 @@
6912 +
6913 +#ifndef __IT8712_H__
6914 +#define __IT8712_H__
6915 +
6916 +#include "asm/arch/sl2312.h"
6917 +
6918 +#define IT8712_IO_BASE                 SL2312_LPC_IO_BASE
6919 +// Device LDN
6920 +#define LDN_SERIAL1                            0x01
6921 +#define LDN_SERIAL2                            0x02
6922 +#define LDN_PARALLEL                   0x03
6923 +#define LDN_KEYBOARD                   0x05
6924 +#define LDN_MOUSE                              0x06
6925 +#define LDN_GPIO                               0x07
6926 +
6927 +#define IT8712_UART1_PORT              0x3F8
6928 +#define IT8712_UART2_PORT              0x2F8
6929 +
6930 +#define IT8712_GPIO_BASE               0x800   // 0x800-0x804 for GPIO set1-set5
6931 +
6932 +void LPCSetConfig(char LdnNumber, char Index, char data);
6933 +char LPCGetConfig(char LdnNumber, char Index);
6934 +
6935 +#endif
6936 --- /dev/null
6937 +++ b/include/asm-arm/arch-sl2312/memory.h
6938 @@ -0,0 +1,38 @@
6939 +/*
6940 + *  linux/include/asm-arm/arch-sl2312/memory.h
6941 + *
6942 + *  Copyright (C) 2001 Altera Corporation
6943 + *
6944 + * This program is free software; you can redistribute it and/or modify
6945 + * it under the terms of the GNU General Public License as published by
6946 + * the Free Software Foundation; either version 2 of the License, or
6947 + * (at your option) any later version.
6948 + *
6949 + * This program is distributed in the hope that it will be useful,
6950 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
6951 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6952 + * GNU General Public License for more details.
6953 + *
6954 + * You should have received a copy of the GNU General Public License
6955 + * along with this program; if not, write to the Free Software
6956 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6957 + */
6958 +#ifndef __ASM_ARCH_MMU_H
6959 +#define __ASM_ARCH_MMU_H
6960 +
6961 +/*
6962 + * Physical DRAM offset.
6963 + */
6964 +#define PHYS_OFFSET    UL(0x00000000)
6965 +
6966 +/*
6967 + * Virtual view <-> DMA view memory address translations
6968 + * virt_to_bus: Used to translate the virtual address to an
6969 + *              address suitable to be passed to set_dma_addr
6970 + * bus_to_virt: Used to convert an address for DMA operations
6971 + *              to an address that the kernel can use.
6972 + */
6973 +#define __virt_to_bus(x)       (x - PAGE_OFFSET + /*SDRAM_BASE*/0)
6974 +#define __bus_to_virt(x)       (x - /*SDRAM_BASE*/0 + PAGE_OFFSET)
6975 +
6976 +#endif
6977 --- /dev/null
6978 +++ b/include/asm-arm/arch-sl2312/param.h
6979 @@ -0,0 +1,20 @@
6980 +/*
6981 + *  linux/include/asm-arm/arch-epxa10db/param.h
6982 + *
6983 + *  Copyright (C) 1999 ARM Limited
6984 + *
6985 + * This program is free software; you can redistribute it and/or modify
6986 + * it under the terms of the GNU General Public License as published by
6987 + * the Free Software Foundation; either version 2 of the License, or
6988 + * (at your option) any later version.
6989 + *
6990 + * This program is distributed in the hope that it will be useful,
6991 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
6992 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6993 + * GNU General Public License for more details.
6994 + *
6995 + * You should have received a copy of the GNU General Public License
6996 + * along with this program; if not, write to the Free Software
6997 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6998 + */
6999 +
7000 --- /dev/null
7001 +++ b/include/asm-arm/arch-sl2312/pci.h
7002 @@ -0,0 +1,18 @@
7003 +
7004 +#ifndef __SL2312_PCI_H__
7005 +#define __SL2312_PCI_H__
7006 +
7007 +#define SL2312_PCI_PMC                         0x40
7008 +#define SL2312_PCI_PMCSR                       0x44
7009 +#define SL2312_PCI_CTRL1                       0x48
7010 +#define SL2312_PCI_CTRL2                       0x4c
7011 +#define SL2312_PCI_MEM1_BASE_SIZE      0x50
7012 +#define SL2312_PCI_MEM2_BASE_SIZE      0x54
7013 +#define SL2312_PCI_MEM3_BASE_SIZE      0x58
7014 +
7015 +
7016 +void sl2312_pci_mask_irq(unsigned int irq);
7017 +void sl2312_pci_unmask_irq(unsigned int irq);
7018 +int sl2312_pci_get_int_src(void);
7019 +
7020 +#endif
7021 --- /dev/null
7022 +++ b/include/asm-arm/arch-sl2312/platform.h
7023 @@ -0,0 +1,7 @@
7024 +#ifndef PLATFORM_H
7025 +#define PLATFORM_H
7026 +#include "sl2312.h"
7027 +
7028 +#define MAXIRQNUM 68
7029 +#endif
7030 +
7031 --- /dev/null
7032 +++ b/include/asm-arm/arch-sl2312/preempt.h
7033 @@ -0,0 +1,63 @@
7034 +/*
7035 + * include/asm-arm/arch-sl2312/preempt.h
7036 + *
7037 + * Timing support for preempt-stats, kfi, ilatency patches
7038 + *
7039 + * Author: dsingleton <dsingleton@mvista.com>
7040 + *
7041 + * 2001-2004 (c) MontaVista Software, Inc. This file is licensed under
7042 + * the terms of the GNU General Public License version 2. This program
7043 + * is licensed "as is" without any warranty of any kind, whether express
7044 + * or implied.
7045 + */
7046 +
7047 +#ifndef _ASM_ARCH_PREEMT_H
7048 +#define _ASM_ARCH_PREEMT_H
7049 +
7050 +#include <asm/arch/hardware.h>
7051 +#include <asm/arch/sl2312.h>
7052 +
7053 +static inline unsigned long clock_diff(unsigned long start, unsigned long stop)
7054 +{
7055 +        return (start - stop);
7056 +}
7057 +
7058 +static inline unsigned int readclock(void)
7059 +{
7060 +       unsigned int    x;
7061 +
7062 +       x = readl(IO_ADDRESS(SL2312_TIMER2_BASE));
7063 +       return x;
7064 +}
7065 +
7066 +static inline unsigned __ticks_per_usec(void)
7067 +{
7068 +#ifdef CONFIG_SL3516_ASIC
7069 +       unsigned int ahb_clock_rate_base=130;  /* unit = MHz*/
7070 +       unsigned int reg_v=0;
7071 +       unsigned int ticks_usec;
7072 +
7073 +       reg_v = readl(IO_ADDRESS((SL2312_GLOBAL_BASE+4)));
7074 +       reg_v >>=15;
7075 +       ticks_usec = (ahb_clock_rate_base + (reg_v & 0x07)*10)>>2;
7076 +
7077 +#else
7078 +       unsigned int ticks_usec=20;
7079 +#endif
7080 +
7081 +    return ticks_usec;
7082 +}
7083 +
7084 +/*
7085 + * timer 1 runs @ 6Mhz  6 ticks = 1 microsecond
7086 + * and is configed as a count down timer.
7087 + */
7088 +#define TICKS_PER_USEC             __ticks_per_usec()
7089 +#define ARCH_PREDEFINES_TICKS_PER_USEC
7090 +
7091 +#define clock_to_usecs(x)          ((x) / TICKS_PER_USEC)
7092 +
7093 +#define INTERRUPTS_ENABLED(x)   (!(x & PSR_I_BIT))
7094 +
7095 +#endif
7096 +
7097 --- /dev/null
7098 +++ b/include/asm-arm/arch-sl2312/sl2312.h
7099 @@ -0,0 +1,254 @@
7100 +#ifndef __sl2312_h
7101 +#define __sl2312_h
7102 +
7103 +/****************************************************************************
7104 + * Copyright  Storlink Corp 2002-2003.  All rights reserved.                *
7105 + *--------------------------------------------------------------------------*
7106 + * Name:board.s                                                             *
7107 + * Description:  SL231x specfic define                                      *
7108 + * Author: Plus Chen                                                        *
7109 + * Version: 0.9 Create
7110 + ****************************************************************************/
7111 +
7112 +/*
7113 +  CPE address map;
7114 +
7115 +               +====================================================
7116 +    0x00000000 | FLASH
7117 +    0x0FFFFFFF |
7118 +               |====================================================
7119 +    0x10000000 | SDRAM
7120 +    0x1FFFFFFF |
7121 +               |====================================================
7122 +    0x20000000 | Global Registers        0x20000000-0x20FFFFFF
7123 +               | EMAC and DMA            0x21000000-0x21FFFFFF
7124 +               | UART Module             0x22000000-0x22FFFFFF
7125 +               | Timer Module            0x23000000-0x23FFFFFF
7126 +               | Interrupt Module        0x24000000-0x24FFFFFF
7127 +               | RTC Module              0x25000000-0x25FFFFFF
7128 +               | LPC Host Controller     0x26000000-0x26FFFFFF
7129 +               | LPC Peripherial IO      0x27000000-0x27FFFFFF
7130 +               | WatchDog Timer          0x28000000-0x28FFFFFF
7131 +    0x2FFFFFFF | Reserved                0x29000000-0x29FFFFFF
7132 +               |=====================================================
7133 +    0x30000000 | PCI IO, Configuration Registers
7134 +    0x3FFFFFFF |
7135 +               |=====================================================
7136 +    0x40000000 | PCI Memory
7137 +    0x4FFFFFFF |
7138 +               |=====================================================
7139 +    0x50000000 | Ethernet MAC and DMA    0x50000000-0x50FFFFFF
7140 +               | Security and DMA        0x51000000-0x51FFFFFF
7141 +               | IDE Channel 0 Register  0x52000000-0x527FFFFF
7142 +               | IDE Channel 1 Register  0x52800000-0x52FFFFFF
7143 +               | USB Register            0x53000000-0x53FFFFFF
7144 +               | Flash Controller        0x54000000-0x54FFFFFF
7145 +               | DRAM Controller         0x55000000-0x55FFFFFF
7146 +    0x5FFFFFFF | Reserved                0x56000000-0x5FFFFFFF
7147 +               |=====================================================
7148 +    0x60000000 | Reserved
7149 +    0x6FFFFFFF |
7150 +               |=====================================================
7151 +    0x70000000 | FLASH shadow Memory
7152 +    0x7FFFFFFF |
7153 +               |=====================================================
7154 +    0x80000000 | Big Endian of memory    0x00000000-0x7FFFFFFF
7155 +    0xFFFFFFFF |
7156 +               +=====================================================
7157 +*/
7158 +
7159 +
7160 +
7161 +/*-------------------------------------------------------------------------------
7162 + Memory Map definitions
7163 +-------------------------------------------------------------------------------- */
7164 +#define TEST           1
7165 +#if 0
7166 +
7167 +static inline int GETCPUID()
7168 +{
7169 +       int cpuid;
7170 +      __asm__(
7171 +"mrc p8, 0, r0, c0, c0, 0\n"
7172 +"mov %0, r0"
7173 +       :"=r"(cpuid)
7174 +       :
7175 +       :"r0");
7176 +       return (cpuid & 0x07);
7177 +}
7178 +#endif
7179 +#define SL2312_SRAM_BASE                0x70000000       //  SRAM base after remap
7180 +#define SL2312_DRAM_BASE                0x00000000       //  DRAM base after remap
7181 +#define SL2312_RAM_BASE                 0x10000000       //  RAM code base before remap
7182 +#define SL2312_FLASH_BASE                  0x30000000
7183 +#define SL2312_ROM_BASE                 0x30000000
7184 +#define SL2312_GLOBAL_BASE              0x40000000
7185 +#define SL2312_WAQTCHDOG_BASE           0x41000000
7186 +#define SL2312_UART_BASE                0x42000000
7187 +#define SL2312_TIMER_BASE               0x43000000
7188 +#define SL2312_LCD_BASE                 0x44000000
7189 +#define SL2312_RTC_BASE                 0x45000000
7190 +#define SL2312_SATA_BASE                0x46000000
7191 +#define SL2312_LPC_HOST_BASE            0x47000000
7192 +#define SL2312_LPC_IO_BASE              0x47800000
7193 +// #define SL2312_INTERRUPT_BASE           0x48000000
7194 +#define SL2312_INTERRUPT0_BASE          0x48000000
7195 +#define SL2312_INTERRUPT1_BASE          0x49000000
7196 +//#define SL2312_INTERRUPT_BASE                ((getcpuid()==0)?SL2312_INTERRUPT0_BASE:SL2312_INTERRUPT1_BASE)
7197 +#define SL2312_INTERRUPT_BASE              0x48000000
7198 +#define SL2312_SSP_CTRL_BASE            0x4A000000
7199 +#define SL2312_POWER_CTRL_BASE          0x4B000000
7200 +#define SL2312_CIR_BASE                 0x4C000000
7201 +#define SL2312_GPIO_BASE                0x4D000000
7202 +#define SL2312_GPIO_BASE1               0x4E000000
7203 +#define SL2312_GPIO_BASE2               0x4F000000
7204 +#define SL2312_PCI_IO_BASE              0x50000000
7205 +#define SL2312_PCI_MEM_BASE             0x58000000
7206 +#ifdef  CONFIG_NET_SL351X
7207 +#define SL2312_TOE_BASE                 0x60000000
7208 +#define SL2312_GMAC0_BASE               0x6000A000
7209 +#define SL2312_GMAC1_BASE               0x6000E000
7210 +#else
7211 +#define SL2312_GMAC0_BASE               0x60000000
7212 +#define SL2312_GMAC1_BASE               0x61000000
7213 +#endif
7214 +#define SL2312_SECURITY_BASE            0x62000000
7215 +#define SL2312_IDE0_BASE                0x63000000
7216 +#define SL2312_IDE1_BASE                       0x63400000
7217 +#define SL2312_RAID_BASE                0x64000000
7218 +#define SL2312_FLASH_CTRL_BASE          0x65000000
7219 +#define SL2312_DRAM_CTRL_BASE           0x66000000
7220 +#define SL2312_GENERAL_DMA_BASE         0x67000000
7221 +#define SL2312_USB_BASE                 0x68000000
7222 +#define SL2312_USB0_BASE                0x68000000
7223 +#define SL2312_USB1_BASE                0x69000000
7224 +#define SL2312_FLASH_SHADOW             0x30000000
7225 +#define SL2312_BIG_ENDIAN_BASE                 0x80000000
7226 +
7227 +#ifdef CONFIG_GEMINI_IPI
7228 +#define CPU_1_MEM_BASE                 0x4000000                               // 64 MB
7229 +#define CPU_1_DATA_OFFSET              0x4000000-0x300000              // Offset 61 MB
7230 +#endif
7231 +
7232 +#define SL2312_TIMER1_BASE              SL2312_TIMER_BASE
7233 +#define SL2312_TIMER2_BASE              (SL2312_TIMER_BASE + 0x10)
7234 +#define SL2312_TIMER3_BASE              (SL2312_TIMER_BASE + 0x20)
7235 +
7236 +#define SL2312_PCI_DMA_MEM1_BASE               0x00000000
7237 +#define SL2312_PCI_DMA_MEM2_BASE               0x00000000
7238 +#define SL2312_PCI_DMA_MEM3_BASE               0x00000000
7239 +#define SL2312_PCI_DMA_MEM1_SIZE               7
7240 +#define SL2312_PCI_DMA_MEM2_SIZE               6
7241 +#define SL2312_PCI_DMA_MEM3_SIZE               6
7242 +
7243 +/*-------------------------------------------------------------------------------
7244 + Global Module
7245 +---------------------------------------------------------------------------------*/
7246 +#define GLOBAL_ID                       0x00
7247 +#define GLOBAL_CHIP_ID                  0x002311
7248 +#define GLOBAL_CHIP_REV                 0xA0
7249 +#define GLOBAL_STATUS                   0x04
7250 +#define GLOBAL_CONTROL                  0x1C
7251 +#define GLOBAL_REMAP_BIT                0x01
7252 +#define GLOBAL_RESET_REG               0x0C
7253 +#define GLOBAL_MISC_REG                                        0x30
7254 +#define PFLASH_SHARE_BIT                               0x02
7255 +
7256 +#define GLOBAL_RESET           (1<<31)
7257 +#define RESET_CPU1                     (1<<30)
7258 +#define RESET_SATA1                    (1<<27)
7259 +#define RESET_SATA0                    (1<<26)
7260 +#define RESET_CIR                      (1<<25)
7261 +#define RESET_EXT_DEV          (1<<24)
7262 +#define RESET_WD                       (1<<23)
7263 +#define RESET_GPIO2                    (1<<22)
7264 +#define RESET_GPIO1                    (1<<21)
7265 +#define RESET_GPIO0                    (1<<20)
7266 +#define RESET_SSP                      (1<<19)
7267 +#define RESET_UART                     (1<<18)
7268 +#define RESET_TIMER                    (1<<17)
7269 +#define RESET_RTC                      (1<<16)
7270 +#define RESET_INT0                     (1<<15)
7271 +#define RESET_INT1                     (1<<14)
7272 +#define RESET_LCD                      (1<<13)
7273 +#define RESET_LPC                      (1<<12)
7274 +#define RESET_APB                      (1<<11)
7275 +#define RESET_DMA                      (1<<10)
7276 +#define RESET_USB1                     (1<<9 )
7277 +#define RESET_USB0                     (1<<8 )
7278 +#define RESET_PCI                      (1<<7 )
7279 +#define RESET_GMAC1                    (1<<6 )
7280 +#define RESET_GMAC0                    (1<<5 )
7281 +#define RESET_IPSEC                    (1<<4 )
7282 +#define RESET_RAID                     (1<<3 )
7283 +#define RESET_IDE                      (1<<2 )
7284 +#define RESET_FLASH                    (1<<1 )
7285 +#define RESET_DRAM                     (1<<0 )
7286 +
7287 +
7288 +
7289 +
7290 +
7291 +
7292 +
7293 +
7294 +/*-------------------------------------------------------------------------------
7295 + DRAM Module
7296 +---------------------------------------------------------------------------------*/
7297 +#define DRAM_SIZE_32M                   0x2000000
7298 +#define DRAM_SIZE_64M                   0x4000000
7299 +#define DRAM_SIZE_128M                  0x8000000
7300 +
7301 +#define DRAM_SIZE                       DRAM_SIZE_128M
7302 +
7303 +#define DRAM_SDRMR                      0x00
7304 +#define SDRMR_DISABLE_DLL               0x80010000
7305 +
7306 +/*------------------------------------------------------------------------------
7307 + Share Pin Flag
7308 +--------------------------------------------------------------------------------*/
7309 +#ifdef CONFIG_SL2312_SHARE_PIN
7310 +#define FLASH_SHARE_BIT                    0
7311 +#define UART_SHARE_BIT                     1
7312 +#define EMAC_SHARE_BIT                     2
7313 +#define IDE_RW_SHARE_BIT                   3
7314 +#define IDE_CMD_SHARE_BIT                  4
7315 +#endif
7316 +/*-------------------------------------------------------------------------------
7317 + System Clock
7318 +---------------------------------------------------------------------------------*/
7319 +
7320 +#ifndef SYS_CLK
7321 +#ifdef CONFIG_SL3516_ASIC
7322 +#define SYS_CLK                         150000000
7323 +#else
7324 +#define SYS_CLK                        20000000
7325 +#endif
7326 +#endif
7327 +
7328 +#define AHB_CLK                        SYS_CLK
7329 +#define MAX_TIMER                      3
7330 +#ifndef APB_CLK
7331 +#ifdef CONFIG_SL3516_ASIC
7332 +#define APB_CLK                        (SYS_CLK / 6)
7333 +#else
7334 +#define APB_CLK                                SYS_CLK
7335 +#endif
7336 +#endif
7337 +
7338 +#ifdef CONFIG_SL3516_ASIC
7339 +#define UART_CLK                        48000000       // 30000000 for GeminiA chip, else 48000000
7340 +#else
7341 +#define UART_CLK                       48000000
7342 +#endif
7343 +
7344 +#define SL2312_BAUD_115200              (UART_CLK / 1843200)
7345 +#define SL2312_BAUD_57600               (UART_CLK / 921600)
7346 +#define SL2312_BAUD_38400                      (UART_CLK / 614400)
7347 +#define SL2312_BAUD_19200               (UART_CLK / 307200)
7348 +#define SL2312_BAUD_14400               (UART_CLK / 230400)
7349 +#define SL2312_BAUD_9600                (UART_CLK / 153600)
7350 +
7351 +#endif
7352 +
7353 +
7354 --- /dev/null
7355 +++ b/include/asm-arm/arch-sl2312/sl2312_ipsec.h
7356 @@ -0,0 +1,684 @@
7357 +#ifndef _IPSEC_DIAG_H
7358 +#define _IPSEC_DIAG_H
7359 +
7360 +#include <linux/scatterlist.h>
7361 +
7362 +#define BIG_ENDIAN    0
7363 +
7364 +#define IPSEC_TEST    0
7365 +#define ZERO_COPY     1
7366 +
7367 +#define UINT unsigned int
7368 +#define BYTE unsigned char
7369 +
7370 +/* define cipher algorithm */
7371 +enum CIPHER {
7372 +       DES_ECB_E       =20,
7373 +       TDES_ECB_E      =21,
7374 +       AES_ECB_E       =22,
7375 +       DES_CBC_E       =24,
7376 +       TDES_CBC_E      =25,
7377 +       AES_CBC_E       =26,
7378 +
7379 +       DES_ECB_D       =27,
7380 +       TDES_ECB_D      =28,
7381 +       AES_ECB_D       =29,
7382 +       DES_CBC_D       =31,
7383 +       TDES_CBC_D      =32,
7384 +       AES_CBC_D       =33,
7385 +       A_SHA1      =12,
7386 +       A_HMAC_SHA1 =13,
7387 +       A_MD5       =14,
7388 +       A_HMAC_MD5  =15,
7389 +};
7390 +
7391 +// opMode
7392 +#define CIPHER_ENC    0x1
7393 +#define CIPHER_DEC    0x3
7394 +#define AUTH          0x4
7395 +#define ENC_AUTH      0x5
7396 +#define AUTH_DEC      0x7
7397 +
7398 +// cipherAlgorithm
7399 +#define CBC_DES       0x4
7400 +#define CBC_3DES      0x5
7401 +#define CBC_AES       0x6
7402 +#define ECB_DES       0x0
7403 +#define ECB_3DES      0x1
7404 +#define ECB_AES       0x2
7405 +
7406 +// authAlgorithm
7407 +#define SHA1         0
7408 +#define MD5          1
7409 +#define HMAC_SHA1    2
7410 +#define HMAC_MD5     3
7411 +#define FCS          4
7412 +
7413 +//cipher mode
7414 +#define ECB          0
7415 +#define CBC          1
7416 +
7417 +// authMode
7418 +#define AUTH_APPEND  0
7419 +#define AUTH_CHKVAL  1
7420 +
7421 +/******************************************************/
7422 +/*          the offset of IPSEC DMA register          */
7423 +/******************************************************/
7424 +enum IPSEC_DMA_REGISTER {
7425 +       IPSEC_DMA_DEVICE_ID             = 0xff00,
7426 +       IPSEC_DMA_STATUS                = 0xff04,
7427 +       IPSEC_TXDMA_CTRL                = 0xff08,
7428 +       IPSEC_TXDMA_FIRST_DESC  = 0xff0c,
7429 +       IPSEC_TXDMA_CURR_DESC   = 0xff10,
7430 +       IPSEC_RXDMA_CTRL                = 0xff14,
7431 +       IPSEC_RXDMA_FIRST_DESC  = 0xff18,
7432 +       IPSEC_RXDMA_CURR_DESC   = 0xff1c,
7433 +       IPSEC_TXDMA_BUF_ADDR    = 0xff28,
7434 +       IPSEC_RXDMA_BUF_ADDR    = 0xff38,
7435 +       IPSEC_RXDMA_BUF_SIZE            = 0xff30,
7436 +};
7437 +
7438 +#define IPSEC_STATUS_REG    0x00a8
7439 +#define IPSEC_RAND_NUM_REG  0x00ac
7440 +
7441 +/******************************************************/
7442 +/* the field definition of IPSEC DMA Module Register  */
7443 +/******************************************************/
7444 +typedef union
7445 +{
7446 +       unsigned int bits32;
7447 +       struct bit2_ff00
7448 +       {
7449 +#if (BIG_ENDIAN==1)
7450 +               unsigned int p_wclk             :  4;   /* DMA_APB write clock period */
7451 +               unsigned int p_rclk             :  4;   /* DMA_APB read clock period */
7452 +               unsigned int                            :  8;
7453 +               unsigned int device_id          : 12;
7454 +               unsigned int revision_id        :  4;
7455 +#else
7456 +               unsigned int revision_id        :  4;
7457 +               unsigned int device_id          : 12;
7458 +               unsigned int                            :  8;
7459 +               unsigned int p_rclk             :  4;   /* DMA_APB read clock period */
7460 +               unsigned int p_wclk             :  4;   /* DMA_APB write clock period */
7461 +#endif
7462 +       } bits;
7463 +} IPSEC_DMA_DEVICE_ID_T;
7464 +
7465 +typedef union
7466 +{
7467 +       unsigned int bits32;
7468 +       struct bit2_ff04
7469 +       {
7470 +#if (BIG_ENDIAN==1)
7471 +               unsigned int ts_finish          :  1;   /* finished tx interrupt */
7472 +               unsigned int ts_derr            :  1;   /* AHB Bus Error while tx */
7473 +               unsigned int ts_perr            :  1;   /* Tx Descriptor protocol error */
7474 +               unsigned int ts_eodi            :  1;   /* TxDMA end of descriptor interrupt */
7475 +               unsigned int ts_eofi            :  1;   /* TxDMA end of frame interrupt */
7476 +               unsigned int rs_finish          :  1;   /* finished rx interrupt */
7477 +               unsigned int rs_derr            :  1;   /* AHB Bus Error while rx */
7478 +               unsigned int rs_perr            :  1;   /* Rx Descriptor protocol error */
7479 +               unsigned int rs_eodi            :  1;   /* RxDMA end of descriptor interrupt */
7480 +               unsigned int rs_eofi            :  1;   /* RxDMA end of frame interrupt */
7481 +        unsigned int intr           :  8;   /* Peripheral interrupt */
7482 +               unsigned int dma_reset          :  1;   /* write 1 to this bit will cause DMA HClk domain soft reset */
7483 +               unsigned int peri_reset         :  1;   /* write 1 to this bit will cause DMA PClk domain soft reset */
7484 +               unsigned int                            :  3;
7485 +               unsigned int loop_back          :  1;   /* loopback TxDMA to RxDMA */
7486 +        unsigned int intr_enable    :  8;   /* Peripheral Interrupt Enable */
7487 +#else
7488 +        unsigned int intr_enable    :  8;   /* Peripheral Interrupt Enable */
7489 +               unsigned int loop_back          :  1;   /* loopback TxDMA to RxDMA */
7490 +               unsigned int                            :  3;
7491 +               unsigned int peri_reset         :  1;   /* write 1 to this bit will cause DMA PClk domain soft reset */
7492 +               unsigned int dma_reset          :  1;   /* write 1 to this bit will cause DMA HClk domain soft reset */
7493 +        unsigned int intr           :  8;   /* Peripheral interrupt */
7494 +               unsigned int rs_eofi            :  1;   /* RxDMA end of frame interrupt */
7495 +               unsigned int rs_eodi            :  1;   /* RxDMA end of descriptor interrupt */
7496 +               unsigned int rs_perr            :  1;   /* Rx Descriptor protocol error */
7497 +               unsigned int rs_derr            :  1;   /* AHB Bus Error while rx */
7498 +               unsigned int rs_finish          :  1;   /* finished rx interrupt */
7499 +               unsigned int ts_eofi            :  1;   /* TxDMA end of frame interrupt */
7500 +               unsigned int ts_eodi            :  1;   /* TxDMA end of descriptor interrupt */
7501 +               unsigned int ts_perr            :  1;   /* Tx Descriptor protocol error */
7502 +               unsigned int ts_derr            :  1;   /* AHB Bus Error while tx */
7503 +               unsigned int ts_finish          :  1;   /* finished tx interrupt */
7504 +#endif
7505 +       } bits;
7506 +} IPSEC_DMA_STATUS_T;
7507 +
7508 +typedef union
7509 +{
7510 +       unsigned int bits32;
7511 +       struct bit2_ff08
7512 +       {
7513 +#if (BIG_ENDIAN==1)
7514 +               unsigned int td_start           :  1;   /* Start DMA transfer */
7515 +               unsigned int td_continue        :  1;   /* Continue DMA operation */
7516 +               unsigned int td_chain_mode      :  1;   /* Descriptor Chain Mode;1-Descriptor Chain mode, 0-Direct DMA mode*/
7517 +               unsigned int                            :  1;
7518 +               unsigned int td_prot            :  4;   /* TxDMA protection control */
7519 +               unsigned int td_burst_size  :  2;       /* TxDMA max burst size for every AHB request */
7520 +               unsigned int td_bus                 :  2;       /* peripheral bus width;0 - 8 bits;1 - 16 bits */
7521 +               unsigned int td_endian          :  1;   /* AHB Endian. 0-little endian; 1-big endian */
7522 +               unsigned int td_finish_en   :  1;       /* DMA Finish Event Interrupt Enable;1-enable;0-mask */
7523 +               unsigned int td_fail_en         :  1;   /* DMA Fail Interrupt Enable;1-enable;0-mask */
7524 +               unsigned int td_perr_en         :  1;   /* Protocol Failure Interrupt Enable;1-enable;0-mask */
7525 +               unsigned int td_eod_en          :  1;   /* End of Descriptor interrupt Enable;1-enable;0-mask */
7526 +               unsigned int td_eof_en      :  1;   /* End of frame interrupt Enable;1-enable;0-mask */
7527 +               unsigned int                            : 14;
7528 +#else
7529 +               unsigned int                            : 14;
7530 +               unsigned int td_eof_en      :  1;   /* End of frame interrupt Enable;1-enable;0-mask */
7531 +               unsigned int td_eod_en          :  1;   /* End of Descriptor interrupt Enable;1-enable;0-mask */
7532 +               unsigned int td_perr_en         :  1;   /* Protocol Failure Interrupt Enable;1-enable;0-mask */
7533 +               unsigned int td_fail_en         :  1;   /* DMA Fail Interrupt Enable;1-enable;0-mask */
7534 +               unsigned int td_finish_en   :  1;       /* DMA Finish Event Interrupt Enable;1-enable;0-mask */
7535 +               unsigned int td_endian          :  1;   /* AHB Endian. 0-little endian; 1-big endian */
7536 +               unsigned int td_bus                 :  2;       /* peripheral bus width;0 - 8 bits;1 - 16 bits */
7537 +               unsigned int td_burst_size  :  2;       /* TxDMA max burst size for every AHB request */
7538 +               unsigned int td_prot            :  4;   /* TxDMA protection control */
7539 +               unsigned int                            :  1;
7540 +               unsigned int td_chain_mode      :  1;   /* Descriptor Chain Mode;1-Descriptor Chain mode, 0-Direct DMA mode*/
7541 +               unsigned int td_continue        :  1;   /* Continue DMA operation */
7542 +               unsigned int td_start           :  1;   /* Start DMA transfer */
7543 +#endif
7544 +       } bits;
7545 +} IPSEC_TXDMA_CTRL_T;
7546 +
7547 +typedef union
7548 +{
7549 +       unsigned int bits32;
7550 +       struct bit2_ff0c
7551 +       {
7552 +#if (BIG_ENDIAN==1)
7553 +               unsigned int td_first_des_ptr   : 28;/* first descriptor address */
7554 +               unsigned int td_busy                    :  1;/* 1-TxDMA busy; 0-TxDMA idle */
7555 +               unsigned int                                    :  3;
7556 +#else
7557 +               unsigned int                                    :  3;
7558 +               unsigned int td_busy                    :  1;/* 1-TxDMA busy; 0-TxDMA idle */
7559 +               unsigned int td_first_des_ptr   : 28;/* first descriptor address */
7560 +#endif
7561 +       } bits;
7562 +} IPSEC_TXDMA_FIRST_DESC_T;
7563 +
7564 +typedef union
7565 +{
7566 +       unsigned int bits32;
7567 +       struct bit2_ff10
7568 +       {
7569 +#if (BIG_ENDIAN==1)
7570 +               unsigned int ndar                       : 28;   /* next descriptor address */
7571 +               unsigned int eofie                      :  1;   /* end of frame interrupt enable */
7572 +               unsigned int dec                        :  1;   /* AHB bus address increment(0)/decrement(1) */
7573 +               unsigned int sof_eof            :  2;
7574 +#else
7575 +               unsigned int sof_eof            :  2;
7576 +               unsigned int dec                        :  1;   /* AHB bus address increment(0)/decrement(1) */
7577 +               unsigned int eofie                      :  1;   /* end of frame interrupt enable */
7578 +               unsigned int ndar                       : 28;   /* next descriptor address */
7579 +#endif
7580 +       } bits;
7581 +} IPSEC_TXDMA_CURR_DESC_T;
7582 +
7583 +
7584 +typedef union
7585 +{
7586 +       unsigned int bits32;
7587 +       struct bit2_ff14
7588 +       {
7589 +#if (BIG_ENDIAN==1)
7590 +               unsigned int rd_start           :  1;   /* Start DMA transfer */
7591 +               unsigned int rd_continue        :  1;   /* Continue DMA operation */
7592 +               unsigned int rd_chain_mode      :  1;   /* Descriptor Chain Mode;1-Descriptor Chain mode, 0-Direct DMA mode*/
7593 +               unsigned int                            :  1;
7594 +               unsigned int rd_prot            :  4;   /* DMA protection control */
7595 +               unsigned int rd_burst_size  :  2;       /* DMA max burst size for every AHB request */
7596 +               unsigned int rd_bus                 :  2;       /* peripheral bus width;0 - 8 bits;1 - 16 bits */
7597 +               unsigned int rd_endian          :  1;   /* AHB Endian. 0-little endian; 1-big endian */
7598 +               unsigned int rd_finish_en   :  1;       /* DMA Finish Event Interrupt Enable;1-enable;0-mask */
7599 +               unsigned int rd_fail_en         :  1;   /* DMA Fail Interrupt Enable;1-enable;0-mask */
7600 +               unsigned int rd_perr_en         :  1;   /* Protocol Failure Interrupt Enable;1-enable;0-mask */
7601 +               unsigned int rd_eod_en          :  1;   /* End of Descriptor interrupt Enable;1-enable;0-mask */
7602 +               unsigned int rd_eof_en      :  1;   /* End of frame interrupt Enable;1-enable;0-mask */
7603 +               unsigned int                            : 14;
7604 +#else
7605 +               unsigned int                            : 14;
7606 +               unsigned int rd_eof_en      :  1;   /* End of frame interrupt Enable;1-enable;0-mask */
7607 +               unsigned int rd_eod_en          :  1;   /* End of Descriptor interrupt Enable;1-enable;0-mask */
7608 +               unsigned int rd_perr_en         :  1;   /* Protocol Failure Interrupt Enable;1-enable;0-mask */
7609 +               unsigned int rd_fail_en         :  1;   /* DMA Fail Interrupt Enable;1-enable;0-mask */
7610 +               unsigned int rd_finish_en   :  1;       /* DMA Finish Event Interrupt Enable;1-enable;0-mask */
7611 +               unsigned int rd_endian          :  1;   /* AHB Endian. 0-little endian; 1-big endian */
7612 +               unsigned int rd_bus                 :  2;       /* peripheral bus width;0 - 8 bits;1 - 16 bits */
7613 +               unsigned int rd_burst_size  :  2;       /* DMA max burst size for every AHB request */
7614 +               unsigned int rd_prot            :  4;   /* DMA protection control */
7615 +               unsigned int                            :  1;
7616 +               unsigned int rd_chain_mode      :  1;   /* Descriptor Chain Mode;1-Descriptor Chain mode, 0-Direct DMA mode*/
7617 +               unsigned int rd_continue        :  1;   /* Continue DMA operation */
7618 +               unsigned int rd_start           :  1;   /* Start DMA transfer */
7619 +#endif
7620 +       } bits;
7621 +} IPSEC_RXDMA_CTRL_T;
7622 +
7623 +typedef union
7624 +{
7625 +       unsigned int bits32;
7626 +       struct bit2_ff18
7627 +       {
7628 +#if (BIG_ENDIAN==1)
7629 +               unsigned int rd_first_des_ptr   : 28;/* first descriptor address */
7630 +               unsigned int rd_busy                    :  1;/* 1-RxDMA busy; 0-RxDMA idle */
7631 +               unsigned int                                    :  3;
7632 +#else
7633 +               unsigned int                                    :  3;
7634 +               unsigned int rd_busy                    :  1;/* 1-RxDMA busy; 0-RxDMA idle */
7635 +               unsigned int rd_first_des_ptr   : 28;/* first descriptor address */
7636 +#endif
7637 +       } bits;
7638 +} IPSEC_RXDMA_FIRST_DESC_T;
7639 +
7640 +typedef union
7641 +{
7642 +       unsigned int bits32;
7643 +       struct bit2_ff1c
7644 +       {
7645 +#if (BIG_ENDIAN==1)
7646 +               unsigned int ndar                       : 28;   /* next descriptor address */
7647 +               unsigned int eofie                      :  1;   /* end of frame interrupt enable */
7648 +               unsigned int dec                        :  1;   /* AHB bus address increment(0)/decrement(1) */
7649 +               unsigned int sof_eof            :  2;
7650 +#else
7651 +               unsigned int sof_eof            :  2;
7652 +               unsigned int dec                        :  1;   /* AHB bus address increment(0)/decrement(1) */
7653 +               unsigned int eofie                      :  1;   /* end of frame interrupt enable */
7654 +               unsigned int ndar                       : 28;   /* next descriptor address */
7655 +#endif
7656 +       } bits;
7657 +} IPSEC_RXDMA_CURR_DESC_T;
7658 +
7659 +
7660 +
7661 +/******************************************************/
7662 +/*    the field definition of IPSEC module Register   */
7663 +/******************************************************/
7664 +typedef union
7665 +{
7666 +       unsigned int id;
7667 +       struct bit_0000
7668 +       {
7669 +#if (BIG_ENDIAN==1)
7670 +               unsigned int device_id          : 28;
7671 +               unsigned int revision_id        :  4;
7672 +#else
7673 +               unsigned int revision_id        :  4;
7674 +               unsigned int device_id          : 28;
7675 +#endif
7676 +       } bits;
7677 +} IPSEC_ID_T;
7678 +
7679 +typedef union
7680 +{
7681 +    unsigned int control;
7682 +    struct bit_0004
7683 +    {
7684 +#if (BIG_ENDIAN==1)
7685 +        unsigned int op_mode            :  4; /* Operation Mode for the IPSec Module */
7686 +        unsigned int                    :  1;
7687 +        unsigned int cipher_algorithm   :  3;
7688 +        unsigned int aesnk              :  4; /* AES Key Size */
7689 +        unsigned int mix_key_sel        :  1; /* 0:use rCipherKey0-3  1:use Key Mixer */
7690 +        unsigned int                    :  2;
7691 +        unsigned int fcs_stream_copy    :  1; /* enable authentication stream copy */
7692 +        unsigned int auth_mode          :  1; /* 0-Append or 1-Check Authentication Result */
7693 +        unsigned int auth_algorithm     :  3;
7694 +        unsigned int                    :  1;
7695 +        unsigned int auth_check_len     :  3; /* Number of 32-bit words to be check or appended */
7696 +                                              /* by the authentication module */
7697 +        unsigned int process_id         :  8; /* Used to identify process.This number will be */
7698 +                                              /* copied to the descriptor status of received packet*/
7699 +#else
7700 +        unsigned int process_id         :  8; /* Used to identify process.This number will be */
7701 +                                              /* copied to the descriptor status of received packet*/
7702 +        unsigned int auth_check_len     :  3; /* Number of 32-bit words to be check or appended */
7703 +                                              /* by the authentication module */
7704 +        unsigned int                    :  1;
7705 +        unsigned int auth_algorithm     :  3;
7706 +        unsigned int auth_mode          :  1; /* 0-Append or 1-Check Authentication Result */
7707 +        unsigned int fcs_stream_copy    :  1; /* enable authentication stream copy */
7708 +        unsigned int                    :  2;
7709 +        unsigned int mix_key_sel        :  1; /* 0:use rCipherKey0-3  1:use Key Mixer */
7710 +        unsigned int aesnk              :  4; /* AES Key Size */
7711 +        unsigned int cipher_algorithm   :  3;
7712 +        unsigned int                    :  1;
7713 +        unsigned int op_mode            :  4; /* Operation Mode for the IPSec Module */
7714 +#endif
7715 +    } bits;
7716 +} IPSEC_CONTROL_T;
7717 +
7718 +
7719 +typedef union
7720 +{
7721 +    unsigned int cipher_packet;
7722 +    struct bit_0008
7723 +    {
7724 +#if (BIG_ENDIAN==1)
7725 +        unsigned int cipher_header_len    : 16; /* The header length to be skipped by the cipher */
7726 +        unsigned int cipher_algorithm_len : 16; /* The length of message body to be encrypted/decrypted */
7727 +#else
7728 +        unsigned int cipher_algorithm_len : 16; /* The length of message body to be encrypted/decrypted */
7729 +        unsigned int cipher_header_len    : 16; /* The header length to be skipped by the cipher */
7730 +#endif
7731 +    } bits;
7732 +} IPSEC_CIPHER_PACKET_T;
7733 +
7734 +typedef union
7735 +{
7736 +    unsigned int auth_packet;
7737 +    struct bit_000c
7738 +    {
7739 +#if (BIG_ENDIAN==1)
7740 +        unsigned int auth_header_len    : 16; /* The header length that is to be skipped by the authenticator */
7741 +        unsigned int auth_algorithm_len : 16; /* The length of message body that is to be authenticated */
7742 +#else
7743 +        unsigned int auth_algorithm_len : 16; /* The length of message body that is to be authenticated */
7744 +        unsigned int auth_header_len    : 16; /* The header length that is to be skipped by the authenticator */
7745 +#endif
7746 +    } bits;
7747 +} IPSEC_AUTH_PACKET_T;
7748 +
7749 +typedef union
7750 +{
7751 +    unsigned int status;
7752 +    struct bit_00a8
7753 +    {
7754 +#if (BIG_ENDIAN==1)
7755 +        unsigned int auth_cmp_rslt  :  1; /* Authentication Compare result */
7756 +        unsigned int wep_crc_ok     :  1; /* WEP ICV compare result */
7757 +        unsigned int tkip_mic_ok    :  1; /* TKIP Mic compare result */
7758 +        unsigned int ccm_mic_ok     :  1; /* CCM Mic compare result */
7759 +        unsigned int                : 16;
7760 +        unsigned int parser_err_code:  4; /* Authentication Compare result */
7761 +        unsigned int auth_err_code  :  4; /* Authentication module error code */
7762 +        unsigned int cipher_err_code:  4; /* Cipher module erroe code */
7763 +#else
7764 +        unsigned int cipher_err_code:  4; /* Cipher module erroe code */
7765 +        unsigned int auth_err_code  :  4; /* Authentication module error code */
7766 +        unsigned int parser_err_code:  4; /* Authentication Compare result */
7767 +        unsigned int                : 16;
7768 +        unsigned int ccm_mic_ok     :  1; /* CCM Mic compare result */
7769 +        unsigned int tkip_mic_ok    :  1; /* TKIP Mic compare result */
7770 +        unsigned int wep_crc_ok     :  1; /* WEP ICV compare result */
7771 +        unsigned int auth_cmp_rslt  :  1; /* Authentication Compare result */
7772 +#endif
7773 +    } bits;
7774 +} IPSEC_STATUS_T;
7775 +
7776 +
7777 +
7778 +/************************************************************************/
7779 +/*              IPSec Descriptor Format                                 */
7780 +/************************************************************************/
7781 +typedef struct descriptor_t
7782 +{
7783 +       union frame_control_t
7784 +       {
7785 +               unsigned int bits32;
7786 +               struct bits_0000
7787 +               {
7788 +#if (BIG_ENDIAN==1)
7789 +                       unsigned int own                : 1;    /* owner bit. 0-CPU, 1-DMA */
7790 +                       unsigned int derr               : 1;    /* data error during processing this descriptor */
7791 +                       unsigned int perr               : 1;    /* protocol error during processing this descriptor */
7792 +                       unsigned int            : 1;    /* authentication compare result */
7793 +                       unsigned int            : 6;    /* checksum[15:8] */
7794 +                       unsigned int desc_count : 6;    /* number of descriptors used for the current frame */
7795 +                       unsigned int buffer_size:16;    /* transfer buffer size associated with current description*/
7796 +#else
7797 +                       unsigned int buffer_size:16;    /* transfer buffer size associated with current description*/
7798 +                       unsigned int desc_count : 6;    /* number of descriptors used for the current frame */
7799 +                       unsigned int            : 6;    /* checksum[15:8] */
7800 +                       unsigned int            : 1;    /* authentication compare result */
7801 +                       unsigned int perr               : 1;    /* protocol error during processing this descriptor */
7802 +                       unsigned int derr               : 1;    /* data error during processing this descriptor */
7803 +                       unsigned int own                : 1;    /* owner bit. 0-CPU, 1-DMA */
7804 +#endif
7805 +               } bits;
7806 +       } frame_ctrl;
7807 +
7808 +       union flag_status_t
7809 +       {
7810 +               unsigned int bits32;
7811 +               struct bits_0004
7812 +               {
7813 +#if (BIG_ENDIAN==1)
7814 +//            unsigned int checksum   : 8; /* checksum[7:0] */
7815 +                       unsigned int            : 4;
7816 +                       unsigned int auth_result: 1;
7817 +                       unsigned int wep_crc_ok : 1;
7818 +                       unsigned int tkip_mic_ok: 1;
7819 +                       unsigned int ccmp_mic_ok: 1;
7820 +                       unsigned int process_id : 8;
7821 +                       unsigned int frame_count:16;
7822 +#else
7823 +                       unsigned int frame_count:16;
7824 +                       unsigned int process_id : 8;
7825 +                       unsigned int ccmp_mic_ok: 1;
7826 +                       unsigned int tkip_mic_ok: 1;
7827 +                       unsigned int wep_crc_ok : 1;
7828 +                       unsigned int auth_result: 1;
7829 +                       unsigned int            : 4;
7830 +//            unsigned int checksum   : 8; /* checksum[7:0] */
7831 +#endif
7832 +               } bits_rx_status;
7833 +
7834 +               struct bits_0005
7835 +               {
7836 +#if (BIG_ENDIAN==1)
7837 +            unsigned int            : 8;
7838 +                       unsigned int process_id : 8;
7839 +                       unsigned int frame_count:16;
7840 +#else
7841 +                       unsigned int frame_count:16;
7842 +                       unsigned int process_id : 8;
7843 +            unsigned int            : 8;
7844 +#endif
7845 +               } bits_tx_status;
7846 +
7847 +               struct bits_0006
7848 +               {
7849 +#if (BIG_ENDIAN==1)
7850 +                       unsigned int            :22;
7851 +                       unsigned int tqflag     :10;
7852 +#else
7853 +                       unsigned int tqflag     :10;
7854 +                       unsigned int            :22;
7855 +#endif
7856 +               } bits_tx_flag;
7857 +       } flag_status;
7858 +
7859 +       unsigned int buf_adr;   /* data buffer address */
7860 +
7861 +       union next_desc_t
7862 +       {
7863 +               unsigned int next_descriptor;
7864 +               struct bits_000c
7865 +               {
7866 +#if (BIG_ENDIAN==1)
7867 +                       unsigned int ndar               :28;    /* next descriptor address */
7868 +                       unsigned int eofie              : 1;    /* end of frame interrupt enable */
7869 +                       unsigned int dec                : 1;    /* AHB bus address. 0-increment; 1-decrement */
7870 +                       unsigned int sof_eof    : 2;    /* 00-the linking descriptor   01-the last descriptor of a frame*/
7871 +                                                       /* 10-the first descriptor of a frame    11-only one descriptor for a frame*/
7872 +#else
7873 +                       unsigned int sof_eof    : 2;    /* 00-the linking descriptor   01-the last descriptor of a frame*/
7874 +                                                       /* 10-the first descriptor of a frame    11-only one descriptor for a frame*/
7875 +                       unsigned int dec                : 1;    /* AHB bus address. 0-increment; 1-decrement */
7876 +                       unsigned int eofie              : 1;    /* end of frame interrupt enable */
7877 +                       unsigned int ndar               :28;    /* next descriptor address */
7878 +#endif
7879 +               } bits;
7880 +       } next_desc;
7881 +} IPSEC_DESCRIPTOR_T;
7882 +
7883 +
7884 +typedef struct IPSEC_S
7885 +{
7886 +    unsigned char       *tx_bufs;
7887 +    unsigned char       *rx_bufs;
7888 +       IPSEC_DESCRIPTOR_T      *tx_desc;           /* point to virtual TX descriptor address*/
7889 +       IPSEC_DESCRIPTOR_T      *rx_desc;           /* point to virtual RX descriptor address*/
7890 +       IPSEC_DESCRIPTOR_T      *tx_cur_desc;   /* point to current TX descriptor */
7891 +       IPSEC_DESCRIPTOR_T      *rx_cur_desc;   /* point to current RX descriptor */
7892 +       IPSEC_DESCRIPTOR_T  *tx_finished_desc;
7893 +       IPSEC_DESCRIPTOR_T  *rx_finished_desc;
7894 +       dma_addr_t          rx_desc_dma;        /* physical RX descriptor address */
7895 +       dma_addr_t          tx_desc_dma;    /* physical TX descriptor address */
7896 +       dma_addr_t          rx_bufs_dma;    /* physical RX descriptor address */
7897 +       dma_addr_t          tx_bufs_dma;    /* physical TX descriptor address */
7898 +} IPSEC_T;
7899 +
7900 +
7901 +/*=====================================================================================================*/
7902 +/*  Data Structure of IPSEC Control Packet  */
7903 +/*=====================================================================================================*/
7904 +typedef struct IPSEC_ECB_AUTH_S
7905 +{
7906 +    IPSEC_CONTROL_T         control; /* control parameter */
7907 +    IPSEC_CIPHER_PACKET_T   cipher; /* cipher packet parameter */
7908 +    IPSEC_AUTH_PACKET_T     auth;   /* authentication packet parameter */
7909 +    unsigned char           cipher_key[8*4];
7910 +    unsigned char           auth_check_val[5*4];
7911 +} IPSEC_ECB_AUTH_T;
7912 +
7913 +typedef struct IPSEC_CBC_AUTH_S
7914 +{
7915 +    IPSEC_CONTROL_T         control; /* control parameter */
7916 +    IPSEC_CIPHER_PACKET_T   cipher; /* cipher packet parameter */
7917 +    IPSEC_AUTH_PACKET_T     auth;   /* authentication packet parameter */
7918 +    unsigned char           cipher_iv[4*4];
7919 +    unsigned char           cipher_key[8*4];
7920 +    unsigned char           auth_check_val[5*4];
7921 +} IPSEC_CBC_AUTH_T;
7922 +
7923 +typedef struct IPSEC_ECB_HMAC_AUTH_S
7924 +{
7925 +    IPSEC_CONTROL_T         control; /* control parameter */
7926 +    IPSEC_CIPHER_PACKET_T   cipher; /* cipher packet parameter */
7927 +    IPSEC_AUTH_PACKET_T     auth;   /* authentication packet parameter */
7928 +    unsigned char           cipher_key[8*4];
7929 +    unsigned char           auth_key[16*4];
7930 +    unsigned char           auth_check_val[5*4];
7931 +} IPSEC_ECB_AUTH_HMAC_T;
7932 +
7933 +typedef struct IPSEC_CBC_HMAC_AUTH_S
7934 +{
7935 +    IPSEC_CONTROL_T         control; /* control parameter */
7936 +    IPSEC_CIPHER_PACKET_T   cipher; /* cipher packet parameter */
7937 +    IPSEC_AUTH_PACKET_T     auth;   /* authentication packet parameter */
7938 +    unsigned char           cipher_iv[4*4];
7939 +    unsigned char           cipher_key[8*4];
7940 +    unsigned char           auth_key[16*4];
7941 +    unsigned char           auth_check_val[5*4];
7942 +} IPSEC_CBC_AUTH_HMAC_T;
7943 +
7944 +typedef struct IPSEC_HMAC_AUTH_S
7945 +{
7946 +    IPSEC_CONTROL_T         control; /* control parameter */
7947 +    IPSEC_AUTH_PACKET_T     auth;   /* authentication packet parameter */
7948 +    unsigned char           auth_key[16*4];
7949 +    unsigned char           auth_check_val[5*4];
7950 +} IPSEC_HMAC_AUTH_T;
7951 +
7952 +typedef union
7953 +{
7954 +    unsigned char auth_pkt[28];
7955 +
7956 +    struct IPSEC_AUTH_S
7957 +    {
7958 +        IPSEC_CONTROL_T         control; /* control parameter(4-byte) */
7959 +        IPSEC_AUTH_PACKET_T     auth;   /* authentication packet parameter(4-byte) */
7960 +        unsigned char           auth_check_val[5*4];
7961 +    } var;
7962 +} IPSEC_AUTH_T;
7963 +
7964 +typedef struct IPSEC_CIPHER_CBC_S
7965 +{
7966 +    IPSEC_CONTROL_T         control; /* control parameter */
7967 +    IPSEC_CIPHER_PACKET_T   cipher; /* cipher packet parameter */
7968 +    unsigned char           cipher_iv[4*4];
7969 +    unsigned char           cipher_key[8*4];
7970 +} IPSEC_CIPHER_CBC_T;
7971 +
7972 +typedef struct IPSEC_CIPHER_ECB_S
7973 +{
7974 +    IPSEC_CONTROL_T         control; /* control parameter */
7975 +    IPSEC_CIPHER_PACKET_T   cipher; /* cipher packet parameter */
7976 +    unsigned char           cipher_key[8*4];
7977 +} IPSEC_CIPHER_ECB_T;
7978 +
7979 +
7980 +/****************************************************************************
7981 + *                          Structure Definition                            *
7982 + ****************************************************************************/
7983 +struct IPSEC_PACKET_S
7984 +{
7985 +    unsigned int    op_mode;            /* CIPHER_ENC(1),CIPHER_DEC(3),AUTH(4),ENC_AUTH(5),AUTH_DEC(7) */
7986 +    unsigned int    cipher_algorithm;   /* ECB_DES(0),ECB_3DES(1),ECB_AES(2),CBC_DES(4),CBC_3DES(5),CBC_AES(6) */
7987 +    unsigned int    auth_algorithm;     /* SHA1(0),MD5(1),HMAC_SHA1(2),HMAC_MD5(3),FCS(4) */
7988 +    unsigned int    auth_result_mode;   /* AUTH_APPEND(0),AUTH_CHKVAL(1) */
7989 +    unsigned int    process_id;         /* Used to identify the process */
7990 +    unsigned int    auth_header_len;    /* Header length to be skipped by the authenticator */
7991 +    unsigned int    auth_algorithm_len; /* Length of message body that is to be authenticated */
7992 +    unsigned int    cipher_header_len;  /* Header length to be skipped by the cipher */
7993 +    unsigned int    cipher_algorithm_len;   /* Length of message body to be encrypted or decrypted */
7994 +    unsigned char   iv[16];             /* Initial vector used for DES,3DES,AES */
7995 +    unsigned int    iv_size;            /* Initial vector size */
7996 +    unsigned char   auth_key[64];       /* authentication key */
7997 +    unsigned int    auth_key_size;      /* authentication key size */
7998 +    unsigned char   cipher_key[32];     /* cipher key */
7999 +    unsigned int    cipher_key_size;    /* cipher key size */
8000 +    struct scatterlist *in_packet;         /* input_packet buffer pointer */
8001 +    //unsigned char            *in_packet;         /* input_packet buffer pointer */
8002 +    unsigned int    pkt_len;            /* input total packet length */
8003 +    unsigned char   auth_checkval[20];  /* Authentication check value/FCS check value */
8004 +    struct IPSEC_PACKET_S *next,*prev;        /* pointer to next/previous operation to perform on buffer */
8005 +    void (*callback)(struct IPSEC_PACKET_S *); /* function to call when done authentication/cipher */
8006 +    unsigned char   *out_packet;        /* output_packet buffer pointer */
8007 +    //struct scatterlist *out_packet;        /* output_packet buffer pointer */
8008 +    unsigned int    out_pkt_len;        /* output total packet length */
8009 +    unsigned int    auth_cmp_result;    /* authentication compare result */
8010 +    unsigned int    checksum;           /* checksum value */
8011 +    unsigned int    status;             /* ipsec return status. 0:success, others:fail */
8012 +#if (IPSEC_TEST == 1)
8013 +    unsigned char    *sw_packet;         /* for test only */
8014 +    unsigned int    sw_pkt_len;         /* for test only */
8015 +#endif
8016 +} ;
8017 +
8018 +/*****************************************************************************
8019 + * Function    : ipsec_crypto_hw_process
8020 + * Description : This function processes H/W authentication and cipher.
8021 + *       Input : op_info - the authentication and cipher information for IPSec module.
8022 + *      Output : none.
8023 + *      Return : 0 - success, others - failure.
8024 + *****************************************************************************/
8025 +int ipsec_crypto_hw_process(struct IPSEC_PACKET_S  *op_info);
8026 +
8027 +int ipsec_get_cipher_algorithm(unsigned char *alg_name,unsigned int alg_mode);
8028 +int ipsec_get_auth_algorithm(unsigned char *alg_name,unsigned int alg_mode);
8029 +#if 0
8030 +void ipsec_sw_authentication(char *data,unsigned int data_len,char *authkey,char authAlgorithm,char *auth_result);
8031 +void ipsec_sw_cipher(unsigned char *pt,unsigned int pt_len, unsigned char *cipher_key, unsigned int key_size,
8032 +                            unsigned char *iv,unsigned int cipherAlgorithm,unsigned char *ct);
8033 +void ipsec_sw_auth_cipher(unsigned int op_mode,char *data,unsigned int data_len,
8034 +                                BYTE *auth_key,char authAlgorithm,char *auth_result,
8035 +                                char *pt, unsigned int pt_len,char *cipher_key, int key_size,
8036 +                                char *iv, char cipherAlgorithm,char *ct);
8037 +#endif
8038 +
8039 +
8040 +#endif
8041 --- /dev/null
8042 +++ b/include/asm-arm/arch-sl2312/sl_random.h
8043 @@ -0,0 +1,2 @@
8044 +#define RANDOM_ADD             (IO_ADDRESS (0x051000000) + 0x0AC)
8045 +
8046 --- /dev/null
8047 +++ b/include/asm-arm/arch-sl2312/system.h
8048 @@ -0,0 +1,54 @@
8049 +/*
8050 + *  linux/include/asm-arm/arch-sl2312/system.h
8051 + *
8052 + *  Copyright (C) 1999 ARM Limited
8053 + *  Copyright (C) 2000 Deep Blue Solutions Ltd
8054 + *  Copyright (C) 2001 Altera Corporation
8055 + *
8056 + * This program is free software; you can redistribute it and/or modify
8057 + * it under the terms of the GNU General Public License as published by
8058 + * the Free Software Foundation; either version 2 of the License, or
8059 + * (at your option) any later version.
8060 + *
8061 + * This program is distributed in the hope that it will be useful,
8062 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8063 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8064 + * GNU General Public License for more details.
8065 + *
8066 + * You should have received a copy of the GNU General Public License
8067 + * along with this program; if not, write to the Free Software
8068 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
8069 + */
8070 +#ifndef __ASM_ARCH_SYSTEM_H
8071 +#define __ASM_ARCH_SYSTEM_H
8072 +
8073 +#include <asm/arch/platform.h>
8074 +#include <asm/arch/hardware.h>
8075 +#include <asm/arch/it8712.h>
8076 +#include <asm/io.h>
8077 +
8078 +static void arch_idle(void)
8079 +{
8080 +       /*
8081 +        * This should do all the clock switching
8082 +        * and wait for interrupt tricks
8083 +        */
8084 +       cpu_do_idle();
8085 +}
8086 +
8087 +extern __inline__ void arch_reset(char mode)
8088 +{
8089 +       __raw_writel( (int) GLOBAL_RESET|RESET_CPU1, IO_ADDRESS(SL2312_GLOBAL_BASE) + GLOBAL_RESET_REG);
8090 +}
8091 +
8092 +
8093 +void (*pm_power_off)(void);
8094 +//{
8095 +//     printk("arch_power_off\n");
8096 +
8097 +       // Power off
8098 +//     __raw_writel( (int) 0x00000001, IO_ADDRESS(SL2312_POWER_CTRL_BASE) + 0x04);
8099 +
8100 +//}
8101 +
8102 +#endif
8103 --- /dev/null
8104 +++ b/include/asm-arm/arch-sl2312/timer.h
8105 @@ -0,0 +1,53 @@
8106 +/*
8107 + *
8108 + *  This file contains the register definitions for the Excalibur
8109 + *  Timer TIMER00.
8110 + *
8111 + *  Copyright (C) 2001 Altera Corporation
8112 + *
8113 + * This program is free software; you can redistribute it and/or modify
8114 + * it under the terms of the GNU General Public License as published by
8115 + * the Free Software Foundation; either version 2 of the License, or
8116 + * (at your option) any later version.
8117 + *
8118 + * This program is distributed in the hope that it will be useful,
8119 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8120 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8121 + * GNU General Public License for more details.
8122 + *
8123 + * You should have received a copy of the GNU General Public License
8124 + * along with this program; if not, write to the Free Software
8125 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
8126 + */
8127 +#ifndef __TIMER_H
8128 +#define __TIMER_H
8129 +
8130 +/*
8131 + * Register definitions for the timers
8132 + */
8133 +
8134 +#define TIMER_COUNT(BASE_ADDR)          (TIMER_TYPE (BASE_ADDR  + 0x00 ))
8135 +#define TIMER_LOAD(BASE_ADDR)           (TIMER_TYPE (BASE_ADDR  + 0x04 ))
8136 +#define TIMER_MATCH1(BASE_ADDR)         (TIMER_TYPE (BASE_ADDR  + 0x08 ))
8137 +#define TIMER_MATCH2(BASE_ADDR)         (TIMER_TYPE (BASE_ADDR  + 0x0C ))
8138 +#define TIMER_CR(BASE_ADDR)             (TIMER_TYPE (BASE_ADDR  + 0x30 ))
8139 +#define TIMER_1_CR_ENABLE_MSK              (0x00000001)
8140 +#define TIMER_1_CR_ENABLE_OFST                     (0)
8141 +#define TIMER_1_CR_CLOCK_MSK               (0x00000002)
8142 +#define TIMER_1_CR_CLOCK_OFST              (1)
8143 +#define TIMER_1_CR_INT_MSK                     (0x00000004)
8144 +#define TIMER_1_CR_INT_OFST                (2)
8145 +#define TIMER_2_CR_ENABLE_MSK              (0x00000008)
8146 +#define TIMER_2_CR_ENABLE_OFST                     (3)
8147 +#define TIMER_2_CR_CLOCK_MSK               (0x00000010)
8148 +#define TIMER_2_CR_CLOCK_OFST              (4)
8149 +#define TIMER_2_CR_INT_MSK                     (0x00000020)
8150 +#define TIMER_2_CR_INT_OFST                (5)
8151 +#define TIMER_3_CR_ENABLE_MSK              (0x00000040)
8152 +#define TIMER_3_CR_ENABLE_OFST                     (6)
8153 +#define TIMER_3_CR_CLOCK_MSK               (0x00000080)
8154 +#define TIMER_3_CR_CLOCK_OFST              (7)
8155 +#define TIMER_3_CR_INT_MSK                     (0x00000100)
8156 +#define TIMER_3_CR_INT_OFST                (8)
8157 +
8158 +#endif /* __TIMER00_H */
8159 --- /dev/null
8160 +++ b/include/asm-arm/arch-sl2312/timex.h
8161 @@ -0,0 +1,29 @@
8162 +/*
8163 + *  linux/include/asm-arm/arch-epxa10db/timex.h
8164 + *
8165 + *  Excalibur timex specifications
8166 + *
8167 + *  Copyright (C) 2001 Altera Corporation
8168 + *
8169 + * This program is free software; you can redistribute it and/or modify
8170 + * it under the terms of the GNU General Public License as published by
8171 + * the Free Software Foundation; either version 2 of the License, or
8172 + * (at your option) any later version.
8173 + *
8174 + * This program is distributed in the hope that it will be useful,
8175 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8176 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8177 + * GNU General Public License for more details.
8178 + *
8179 + * You should have received a copy of the GNU General Public License
8180 + * along with this program; if not, write to the Free Software
8181 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
8182 + */
8183 +
8184 +/*
8185 + * ??
8186 + */
8187 +#include <asm/arch/sl2312.h>
8188 +
8189 +#define CLOCK_TICK_RATE                APB_CLK
8190 +
8191 --- /dev/null
8192 +++ b/include/asm-arm/arch-sl2312/uart.h
8193 @@ -0,0 +1,100 @@
8194 +/* *
8195 + *  Copyright (C) 2001 Altera Corporation
8196 + *
8197 + * This program is free software; you can redistribute it and/or modify
8198 + * it under the terms of the GNU General Public License as published by
8199 + * the Free Software Foundation; either version 2 of the License, or
8200 + * (at your option) any later version.
8201 + *
8202 + * This program is distributed in the hope that it will be useful,
8203 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8204 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8205 + * GNU General Public License for more details.
8206 + *
8207 + * You should have received a copy of the GNU General Public License
8208 + * along with this program; if not, write to the Free Software
8209 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
8210 + */
8211 +#ifndef __UART_H
8212 +#define __UART_H
8213 +
8214 +/*
8215 + * Register definitions for the UART
8216 + */
8217 +
8218 +#define UART_TX_FIFO_SIZE      (15)
8219 +
8220 +#define UART_RBR(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x00))  // read
8221 +#define UART_THR(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x00))  // write
8222 +#define UART_IER(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x04))
8223 +#define UART_IER_MS                                 (0x08)
8224 +#define UART_IER_RLS                                (0x04)
8225 +#define UART_IER_TE                                 (0x02)
8226 +#define UART_IER_DR                                 (0x01)
8227 +#define UART_IIR(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x08))   // read
8228 +#define UART_IIR_NONE                              (0x01)      /* No interrupt pending */
8229 +#define UART_IIR_RLS                               (0x06)      /* Receive Line Status */
8230 +#define UART_IIR_DR                                (0x04)      /* Receive Data Ready */
8231 +#define UART_IIR_TIMEOUT                           (0x0c)      /* Receive Time Out */
8232 +#define UART_IIR_TE                                (0x02)      /* THR Empty */
8233 +#define UART_IIR_MODEM                             (0x00)      /* Modem Status */
8234 +#define UART_FCR(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x08))  // write
8235 +#define UART_FCR_FE                                (0x01)      /* FIFO Enable */
8236 +#define UART_FCR_RXFR                              (0x02)      /* Rx FIFO Reset */
8237 +#define UART_FCR_TXFR                              (0x04)      /* Tx FIFO Reset */
8238 +#define UART_FCR_FIFO_1C                            (0x00)
8239 +#define UART_FCR_FIFO_4C                            (0x40)
8240 +#define UART_FCR_FIFO_8C                            (0x80)
8241 +#define UART_FCR_FIFO_14C                           (0xC0)
8242 +#define UART_LCR(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x0C))
8243 +#define UART_LCR_MSK                                (0x03)
8244 +#define UART_LCR_LEN5                              (0x00)
8245 +#define UART_LCR_LEN6                              (0x01)
8246 +#define UART_LCR_LEN7                              (0x02)
8247 +#define UART_LCR_LEN8                              (0x03)
8248 +#define UART_LCR_STOP                              (0x04)
8249 +#define UART_LCR_EVEN                              (0x18)      /* Even Parity */
8250 +#define UART_LCR_ODD                               (0x08)      /* Odd Parity */
8251 +#define UART_LCR_PE                                (0x08)      /* Parity Enable */
8252 +#define UART_LCR_SETBREAK                          (0x40)      /* Set Break condition */
8253 +#define UART_LCR_STICKPARITY                       (0x20)      /* Stick Parity Enable */
8254 +#define UART_LCR_DLAB                              (0x80)      /* Divisor Latch Access Bit */
8255 +#define UART_MCR(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x10))
8256 +#define UART_MCR_DTR                               (0x1)       /* Data Terminal Ready */
8257 +#define UART_MCR_RTS                               (0x2)       /* Request to Send */
8258 +#define UART_MCR_OUT1                              (0x4)       /* output       1 */
8259 +#define UART_MCR_OUT2                              (0x8)       /* output2 or global interrupt enable */
8260 +#define UART_MCR_LPBK                              (0x10)      /* loopback mode */
8261 +#define UART_MCR_MASK                               (0xE3)
8262 +#define UART_LSR(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x14))
8263 +#define UART_LSR_DR                                (0x01)      /* Data Ready */
8264 +#define UART_LSR_OE                                (0x02)      /* Overrun Error */
8265 +#define UART_LSR_PE                                (0x04)      /* Parity Error */
8266 +#define UART_LSR_FE                                (0x08)      /* Framing Error */
8267 +#define UART_LSR_BI                                 (0x10)             /* Break Interrupt */
8268 +#define UART_LSR_THRE                               (0x20)             /* THR Empty */
8269 +#define UART_LSR_TE                                 (0x40)             /* Transmitte Empty */
8270 +#define UART_LSR_DE                                 (0x80)             /* FIFO Data Error */
8271 +#define UART_MSR(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x18))
8272 +#define UART_MSR_DELTACTS                          (0x01)      /* Delta CTS */
8273 +#define UART_MSR_DELTADSR                          (0x02)      /* Delta DSR */
8274 +#define UART_MSR_TERI                              (0x04)      /* Trailing Edge RI */
8275 +#define UART_MSR_DELTACD                           (0x08)      /* Delta CD */
8276 +#define UART_MSR_CTS                               (0x10)      /* Clear To Send */
8277 +#define UART_MSR_DSR                               (0x20)      /* Data Set Ready */
8278 +#define UART_MSR_RI                                (0x40)      /* Ring Indicator */
8279 +#define UART_MSR_DCD                               (0x80)      /* Data Carrier Detect */
8280 +#define UART_SPR(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x1C))
8281 +#define UART_DIV_LO(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x0))
8282 +#define UART_DIV_HI(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x4))
8283 +#define UART_PSR(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x8))
8284 +#define UART_MDR(BASE_ADDR) (UART_TYPE (BASE_ADDR  + 0x20))
8285 +#define UART_MDR_SERIAL                             (0x0)
8286 +
8287 +#define UART_MSR_DDCD  0x08    /* Delta DCD */
8288 +#define UART_MSR_DDSR  0x02    /* Delta DSR */
8289 +#define UART_MSR_DCTS  0x01    /* Delta CTS */
8290 +#define UART_MSR_ANY_DELTA 0x0F        /* Any of the delta bits! */
8291 +
8292 +
8293 +#endif /* __UART_H */
8294 --- /dev/null
8295 +++ b/include/asm-arm/arch-sl2312/uncompress.h
8296 @@ -0,0 +1,94 @@
8297 +/*
8298 + *  linux/include/asm-arm/arch-epxa10db/uncompress.h
8299 + *
8300 + *  Copyright (C) 1999 ARM Limited
8301 + *  Copyright (C) 2001 Altera Corporation
8302 + *
8303 + * This program is free software; you can redistribute it and/or modify
8304 + * it under the terms of the GNU General Public License as published by
8305 + * the Free Software Foundation; either version 2 of the License, or
8306 + * (at your option) any later version.
8307 + *
8308 + * This program is distributed in the hope that it will be useful,
8309 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8310 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8311 + * GNU General Public License for more details.
8312 + *
8313 + * You should have received a copy of the GNU General Public License
8314 + * along with this program; if not, write to the Free Software
8315 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
8316 + */
8317 +#include "asm/arch/platform.h"
8318 +#include "asm/arch/hardware.h"
8319 +#define UART_TYPE (volatile unsigned int*)
8320 +#ifndef CONFIG_SERIAL_IT8712
8321 +#include "asm/arch/uart.h"
8322 +#endif
8323 +extern unsigned int it8712_uart_base;
8324 +
8325 +/*
8326 + * This does not append a newline
8327 + */
8328 +static void putstr(const char *s)
8329 +{
8330 +
8331 +#ifdef CONFIG_SERIAL_IT8712
8332 +
8333 +       unsigned char *base,*status,stat;
8334 +       int i ;
8335 +
8336 +       status = (unsigned char*)it8712_uart_base + 5;
8337 +       base = (unsigned char*)it8712_uart_base ;
8338 +
8339 +       while (*s) {
8340 +
8341 +               stat = *status;
8342 +               while (!(stat&0x20)) {                          // check status
8343 +                       for(i=0;i<0x10;i++)     ;
8344 +                       status = (unsigned char*)it8712_uart_base + 5;
8345 +                       stat = *status ;
8346 +               }
8347 +
8348 +               *base = *s;
8349 +               barrier();
8350 +
8351 +               if (*s == '\n') {
8352 +                       stat = *status;
8353 +                       while (!(stat&0x20)) {                  // check status
8354 +                               for(i=0;i<0x10;i++)     ;
8355 +                               status = (unsigned char*)it8712_uart_base + 5;
8356 +                               stat = *status ;
8357 +               }
8358 +
8359 +                       barrier();
8360 +                       *base = '\r';
8361 +               }
8362 +               s++;
8363 +       }
8364 +
8365 +#else
8366 +       while (*s) {
8367 +               while (!(*UART_LSR(SL2312_UART_BASE) &
8368 +                        UART_LSR_THRE));
8369 +                      barrier();
8370 +
8371 +               *UART_THR(SL2312_UART_BASE) = *s;
8372 +
8373 +               if (*s == '\n') {
8374 +                       while (!(*UART_LSR(SL2312_UART_BASE) &
8375 +                                UART_LSR_THRE));
8376 +                               barrier();
8377 +
8378 +                       *UART_THR(SL2312_UART_BASE) = '\r';
8379 +               }
8380 +               s++;
8381 +       }
8382 +#endif
8383 +}
8384 +
8385 +/*
8386 + * nothing to do
8387 + */
8388 +#define arch_decomp_setup()
8389 +
8390 +#define arch_decomp_wdog()
8391 --- /dev/null
8392 +++ b/include/asm-arm/arch-sl2312/vmalloc.h
8393 @@ -0,0 +1,36 @@
8394 +/*
8395 + *  linux/include/asm-arm/arch-epxa10db/vmalloc.h
8396 + *
8397 + *  Copyright (C) 2000 Russell King.
8398 + *
8399 + * This program is free software; you can redistribute it and/or modify
8400 + * it under the terms of the GNU General Public License as published by
8401 + * the Free Software Foundation; either version 2 of the License, or
8402 + * (at your option) any later version.
8403 + *
8404 + * This program is distributed in the hope that it will be useful,
8405 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8406 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8407 + * GNU General Public License for more details.
8408 + *
8409 + * You should have received a copy of the GNU General Public License
8410 + * along with this program; if not, write to the Free Software
8411 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
8412 + */
8413 +
8414 +/*
8415 + * Just any arbitrary offset to the start of the vmalloc VM area: the
8416 + * current 8MB value just means that there will be a 8MB "hole" after the
8417 + * physical memory until the kernel virtual memory starts.  That means that
8418 + * any out-of-bounds memory accesses will hopefully be caught.
8419 + * The vmalloc() routines leaves a hole of 4kB between each vmalloced
8420 + * area for the same reason. ;)
8421 + */
8422 +#define VMALLOC_OFFSET   (8*1024*1024)
8423 +#define VMALLOC_START    (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
8424 +#define VMALLOC_VMADDR(x) ((unsigned long)(x))
8425 +#define VMALLOC_END       (PAGE_OFFSET + 0x10000000)
8426 +
8427 +//#define MODULE_START    (PAGE_OFFSET - 16*1048576)
8428 +//#define MODULE_END      (PAGE_OFFSET)
8429 +
8430 --- /dev/null
8431 +++ b/include/asm-arm/arch-sl2312/watchdog.h
8432 @@ -0,0 +1,58 @@
8433 +#ifndef __WATCHDOG_H
8434 +#define __WATCHDOG_H
8435 +
8436 +#define WATCHDOG_BASE                    (IO_ADDRESS (SL2312_WAQTCHDOG_BASE))
8437 +#define WATCHDOG_COUNTER                  (WATCHDOG_BASE + 0x00)
8438 +#define WATCHDOG_LOAD                     (WATCHDOG_BASE + 0x04)
8439 +#define WATCHDOG_RESTART                  (WATCHDOG_BASE + 0x08)
8440 +#define WATCHDOG_CR                       (WATCHDOG_BASE + 0x0C)
8441 +#define WATCHDOG_STATUS                   (WATCHDOG_BASE + 0x10)
8442 +#define WATCHDOG_CLEAR                    (WATCHDOG_BASE + 0x14)
8443 +#define WATCHDOG_INTRLEN                  (WATCHDOG_BASE + 0x18)
8444 +
8445 +#define WATCHDOG_WDENABLE_MSK            (0x00000001)
8446 +#define WATCHDOG_WDENABLE_OFST                   (0)
8447 +#define WATCHDOG_WDRST_MSK               (0x00000002)
8448 +#define WATCHDOG_WDRST_OFST              (1)
8449 +#define WATCHDOG_WDINTR_MSK              (0x00000004)
8450 +#define WATCHDOG_WDINTR_OFST             (2)
8451 +#define WATCHDOG_WDEXT_MSK               (0x00000008)
8452 +#define WATCHDOG_WDEXT_OFST              (3)
8453 +#define WATCHDOG_WDCLOCK_MSK             (0x00000010)
8454 +#define WATCHDOG_WDCLOCK_OFST            (4)
8455 +#define WATCHDOG_CR_MASK                  (0x0000001F)
8456 +
8457 +#define WATCHDOG_CLEAR_STATUS             0x1
8458 +#define WATCHDOG_ENABLE                   1
8459 +#define WATCHDOG_DISABLE                  0
8460 +#define WATCHDOG_RESTART_VALUE            0x5AB9
8461 +
8462 +#define WATCHDOG_MINOR                   130
8463 +
8464 +#define WATCHDOG_IOCTRL_DISABLE                  0x01
8465 +#define WATCHDOG_IOCTRL_SETTIME                  0x02
8466 +#define WATCHDOG_IOCTRL_ENABLE           0x03
8467 +#define WATCHDOG_IOCTRL_RESTART                  0x04
8468 +
8469 +#define WATCHDOG_TIMEOUT_SCALE            APB_CLK
8470 +#define WATCHDOG_TIMEOUT_MARGIN           30
8471 +#define WATCHDOG_DRIVER_OPEN              1
8472 +#define WATCHDOG_DRIVER_CLOSE             0
8473 +
8474 +
8475 +static void     watchdog_disable(void);
8476 +static void     watchdog_enable(void);
8477 +static int      watchdog_open(struct inode *, struct file *);
8478 +static int      watchdog_release(struct inode *, struct file *);
8479 +static ssize_t  watchdog_read(struct file *, char *, size_t, loff_t *);
8480 +static ssize_t  watchdog_write(struct file *, const char *, size_t, loff_t *);
8481 +static int      watchdog_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
8482 +#ifdef WATCHDOG_TEST
8483 +static void watchdog_fire(int, void *, struct pt_regs *);
8484 +#endif
8485 +
8486 +
8487 +
8488 +
8489 +
8490 +#endif
8491 --- /dev/null
8492 +++ b/include/asm-arm/arch-sl2312/xor.h
8493 @@ -0,0 +1,29 @@
8494 +/*
8495 + * include/asm-arm/arch-sl2312/xor.h
8496 + *
8497 + * Copyright (C) 2005 Storlink Corp.
8498 + *
8499 + * This program is free software; you can redistribute it and/or modify
8500 + * it under the terms of the GNU General Public License version 2 as
8501 + * published by the Free Software Foundation.
8502 + */
8503 +
8504 +#ifndef _ASM_ARCH_XOR_H
8505 +#define _ASM_ARCH_XOR_H
8506 +
8507 +/*
8508 + * Function prototypes
8509 + */
8510 +void xor_gemini_2(unsigned long bytes, unsigned long *p1, unsigned long *p2);
8511 +
8512 +void xor_gemini_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
8513 +                            unsigned long *p3);
8514 +
8515 +void xor_gemini_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
8516 +                            unsigned long *p3, unsigned long *p4);
8517 +
8518 +void xor_gemini_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
8519 +                            unsigned long *p3, unsigned long *p4, unsigned long *p5);
8520 +
8521 +#endif /* _ASM_ARCH_XOR_H */
8522 +
8523 --- a/include/asm-arm/cacheflush.h
8524 +++ b/include/asm-arm/cacheflush.h
8525 @@ -46,6 +46,18 @@
8526  # define MULTI_CACHE 1
8527  #endif
8528  
8529 +/***********************************************************************
8530 + *             Storlink SoC -- Cache
8531 + ***********************************************************************/
8532 +#if defined(CONFIG_CPU_FA526)
8533 +# ifdef _CACHE
8534 +#  define MULTI_CACHE 1
8535 +# else
8536 +#  define _CACHE fa
8537 +# endif
8538 +#endif
8539 +/***********************************************************************/
8540 +
8541  #if defined(CONFIG_CPU_ARM926T)
8542  # ifdef _CACHE
8543  #  define MULTI_CACHE 1
8544 --- a/include/asm-arm/page.h
8545 +++ b/include/asm-arm/page.h
8546 @@ -74,6 +74,18 @@
8547  # endif
8548  #endif
8549  
8550 +/***********************************************************************
8551 + *             Storlink SoC -- flash
8552 + ***********************************************************************/
8553 +#ifdef CONFIG_CPU_COPY_FA
8554 +# ifdef _USER
8555 +#  define MULTI_USER 1
8556 +# else
8557 +#  define _USER fa
8558 +# endif
8559 +#endif
8560 +/***********************************************************************/
8561 +
8562  #ifdef CONFIG_CPU_SA1100
8563  # ifdef _USER
8564  #  define MULTI_USER 1
8565 --- a/include/asm-arm/proc-fns.h
8566 +++ b/include/asm-arm/proc-fns.h
8567 @@ -89,6 +89,14 @@
8568  #   define CPU_NAME cpu_arm922
8569  #  endif
8570  # endif
8571 +# ifdef CONFIG_CPU_FA526
8572 +#  ifdef CPU_NAME
8573 +#   undef  MULTI_CPU
8574 +#   define MULTI_CPU
8575 +#  else
8576 +#   define CPU_NAME cpu_fa526
8577 +#  endif
8578 +# endif
8579  # ifdef CONFIG_CPU_ARM925T
8580  #  ifdef CPU_NAME
8581  #   undef  MULTI_CPU
8582 --- a/include/asm-arm/tlbflush.h
8583 +++ b/include/asm-arm/tlbflush.h
8584 @@ -39,6 +39,8 @@
8585  #define TLB_V6_D_ASID  (1 << 17)
8586  #define TLB_V6_I_ASID  (1 << 18)
8587  
8588 +#define TLB_DINVAL      (1 << 28)
8589 +#define TLB_BTB         (1 << 29)
8590  #define TLB_DCLEAN     (1 << 30)
8591  #define TLB_WB         (1 << 31)
8592  
8593 @@ -52,6 +54,7 @@
8594   *       v4wb  - ARMv4 with write buffer without I TLB flush entry instruction
8595   *       v4wbi - ARMv4 with write buffer with I TLB flush entry instruction
8596   *       v6wbi - ARMv6 with write buffer with I TLB flush entry instruction
8597 + *    fa    - ARMv4 with write buffer with UTLB and branch target buffer (BTB)
8598   */
8599  #undef _TLB
8600  #undef MULTI_TLB
8601 @@ -86,6 +89,44 @@
8602  # define v4_always_flags       (-1UL)
8603  #endif
8604  
8605 +#ifdef CONFIG_CPU_FA_BTB
8606 +#define __TLB_BTB      TLB_BTB
8607 +#else
8608 +#define __TLB_BTB      0
8609 +#endif
8610 +
8611 +#ifdef CONFIG_CPU_FA_WB_DISABLE
8612 +#define __TLB_WB       0
8613 +#else
8614 +#define __TLB_WB       TLB_WB
8615 +#endif
8616 +
8617 +/* Fix buggy CPU which doesn't invalidate Dcache properly */
8618 +#ifdef CONFIG_CPU_FA520
8619 +#define __TLB_DINVAL   TLB_DINVAL
8620 +#elif defined(CONFIG_CPU_FA526)
8621 +//#define __TLB_DINVAL   TLB_DINVAL
8622 +#define __TLB_DINVAL   0
8623 +#else
8624 +#define __TLB_DINVAL   0
8625 +#endif
8626 +
8627 +#define fa_tlb_flags   (__TLB_WB | __TLB_BTB | __TLB_DINVAL | TLB_DCLEAN | \
8628 +                         TLB_V4_U_FULL | TLB_V4_U_PAGE)
8629 +
8630 +#ifdef CONFIG_CPU_TLB_FA
8631 +# define fa_possible_flags     fa_tlb_flags
8632 +# define fa_always_flags       fa_tlb_flags
8633 +# ifdef _TLB
8634 +#  define MULTI_TLB 1
8635 +# else
8636 +#  define _TLB fa
8637 +# endif
8638 +#else
8639 +# define fa_possible_flags     0
8640 +# define fa_always_flags       (-1UL)
8641 +#endif
8642 +
8643  #define v4wbi_tlb_flags        (TLB_WB | TLB_DCLEAN | \
8644                          TLB_V4_I_FULL | TLB_V4_D_FULL | \
8645                          TLB_V4_I_PAGE | TLB_V4_D_PAGE)
8646 @@ -246,12 +287,14 @@
8647                                  v4_possible_flags | \
8648                                  v4wbi_possible_flags | \
8649                                  v4wb_possible_flags | \
8650 +                 fa_possible_flags | \
8651                                  v6wbi_possible_flags)
8652  
8653  #define always_tlb_flags       (v3_always_flags & \
8654                                  v4_always_flags & \
8655                                  v4wbi_always_flags & \
8656                                  v4wb_always_flags & \
8657 +                 fa_always_flags & \
8658                                  v6wbi_always_flags)
8659  
8660  #define tlb_flag(f)    ((always_tlb_flags & (f)) || (__tlb_flag & possible_tlb_flags & (f)))
8661 @@ -261,6 +304,9 @@
8662         const int zero = 0;
8663         const unsigned int __tlb_flag = __cpu_tlb_flags;
8664  
8665 +       if (tlb_flag(TLB_DINVAL))
8666 +               asm("mcr%? p15, 0, %0, c7, c14, 0" : : "r" (zero));
8667 +
8668         if (tlb_flag(TLB_WB))
8669                 dsb();
8670  
8671 @@ -281,6 +327,13 @@
8672                 dsb();
8673                 isb();
8674         }
8675 +
8676 +       if (tlb_flag(TLB_BTB))
8677 +       {
8678 +        asm("mcr%? p15, 0, %0, c7, c5, 6" : : "r" (zero));
8679 +               asm("mov r0, r0" : : );
8680 +               asm("mov r0, r0" : : );
8681 +       }
8682  }
8683  
8684  static inline void local_flush_tlb_mm(struct mm_struct *mm)
8685 @@ -289,6 +342,9 @@
8686         const int asid = ASID(mm);
8687         const unsigned int __tlb_flag = __cpu_tlb_flags;
8688  
8689 +       if (tlb_flag(TLB_DINVAL))
8690 +               asm("mcr%? p15, 0, %0, c7, c14, 0" : : "r" (zero));
8691 +
8692         if (tlb_flag(TLB_WB))
8693                 dsb();
8694  
8695 @@ -317,6 +373,14 @@
8696                 asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero) : "cc");
8697                 dsb();
8698         }
8699 +
8700 +       if (tlb_flag(TLB_BTB))
8701 +       {
8702 +        asm("mcr%? p15, 0, %0, c7, c5, 6" : : "r" (zero));
8703 +               asm("mov r0, r0" : : );
8704 +               asm("mov r0, r0" : : );
8705 +       }
8706 +
8707  }
8708  
8709  static inline void
8710 @@ -327,6 +391,9 @@
8711  
8712         uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm);
8713  
8714 +       if (tlb_flag(TLB_DINVAL))
8715 +        asm("mcr%? p15, 0, %0, c7, c14, 0" : : "r" (zero)); // clean & invalidate data cache all
8716 +
8717         if (tlb_flag(TLB_WB))
8718                 dsb();
8719  
8720 @@ -357,6 +424,13 @@
8721                 asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero) : "cc");
8722                 dsb();
8723         }
8724 +
8725 +       if (tlb_flag(TLB_BTB))
8726 +       {
8727 +        asm("mcr%? p15, 0, %0, c7, c5, 6" : : "r" (zero));
8728 +               asm("mov r0, r0" : : );
8729 +               asm("mov r0, r0" : : );
8730 +       }
8731  }
8732  
8733  static inline void local_flush_tlb_kernel_page(unsigned long kaddr)
8734 @@ -366,6 +440,9 @@
8735  
8736         kaddr &= PAGE_MASK;
8737  
8738 +       if (tlb_flag(TLB_DINVAL))
8739 +        asm("mcr%? p15, 0, %0, c7, c14, 0" : : "r" (zero));
8740 +
8741         if (tlb_flag(TLB_WB))
8742                 dsb();
8743  
8744 @@ -386,6 +463,12 @@
8745                 asm("mcr p15, 0, %0, c8, c6, 1" : : "r" (kaddr) : "cc");
8746         if (tlb_flag(TLB_V6_I_PAGE))
8747                 asm("mcr p15, 0, %0, c8, c5, 1" : : "r" (kaddr) : "cc");
8748 +       if (tlb_flag(TLB_BTB))
8749 +       {
8750 +        asm("mcr%? p15, 0, %0, c7, c5, 6" : : "r" (zero));
8751 +               asm("mov r0, r0" : : );
8752 +               asm("mov r0, r0" : : );
8753 +       }
8754  
8755         if (tlb_flag(TLB_V6_I_FULL | TLB_V6_D_FULL |
8756                      TLB_V6_I_PAGE | TLB_V6_D_PAGE |
8757 @@ -412,6 +495,7 @@
8758   */
8759  static inline void flush_pmd_entry(pmd_t *pmd)
8760  {
8761 +       const unsigned int zero = 0;
8762         const unsigned int __tlb_flag = __cpu_tlb_flags;
8763  
8764         if (tlb_flag(TLB_DCLEAN))
8765 @@ -419,15 +503,30 @@
8766                         : : "r" (pmd) : "cc");
8767         if (tlb_flag(TLB_WB))
8768                 dsb();
8769 +
8770 +       if (tlb_flag(TLB_BTB)) // Luke Lee 05/16/2005
8771 +       {
8772 +        asm("mcr%? p15, 0, %0, c7, c5, 6" : : "r" (zero));
8773 +               asm("mov r0, r0" : : );
8774 +               asm("mov r0, r0" : : );
8775 +       }
8776  }
8777  
8778  static inline void clean_pmd_entry(pmd_t *pmd)
8779  {
8780 +    const unsigned int zero = 0; // Luke Lee 05/16/2005 ins 1
8781         const unsigned int __tlb_flag = __cpu_tlb_flags;
8782  
8783         if (tlb_flag(TLB_DCLEAN))
8784                 asm("mcr        p15, 0, %0, c7, c10, 1  @ flush_pmd"
8785                         : : "r" (pmd) : "cc");
8786 +
8787 +       if (tlb_flag(TLB_BTB)) // Luke Lee 05/16/2005
8788 +       {
8789 +        asm("mcr%? p15, 0, %0, c7, c5, 6" : : "r" (zero));
8790 +               asm("mov r0, r0" : : );
8791 +               asm("mov r0, r0" : : );
8792 +       }
8793  }
8794  
8795  #undef tlb_flag
8796 --- a/include/asm-arm/xor.h
8797 +++ b/include/asm-arm/xor.h
8798 @@ -139,3 +139,18 @@
8799                 xor_speed(&xor_block_8regs);    \
8800                 xor_speed(&xor_block_32regs);   \
8801         } while (0)
8802 +
8803 +#ifdef CONFIG_GEMINI_XOR_ACCE
8804 +#include <asm/arch/xor.h>
8805 +static struct xor_block_template xor_block_gemini = {
8806 +       .name   = "gemini xor acceleration",
8807 +       .do_2   = xor_gemini_2,
8808 +       .do_3   = xor_gemini_3,
8809 +       .do_4   = xor_gemini_4,
8810 +       .do_5   = xor_gemini_5,};
8811 +#undef XOR_TRY_TEMPLATES
8812 +#define XOR_TRY_TEMPLATES                      \
8813 +       do {                                    \
8814 +       xor_speed(&xor_block_gemini); \
8815 +       } while (0)
8816 +#endif
8817 --- a/include/linux/apm_bios.h
8818 +++ b/include/linux/apm_bios.h
8819 @@ -217,4 +217,24 @@
8820  #define APM_IOC_STANDBY                _IO('A', 1)
8821  #define APM_IOC_SUSPEND                _IO('A', 2)
8822  
8823 +// add by jason for power control
8824 +struct pwc_ioctl_data {
8825 +       unsigned int action;    // sword struct
8826 +       unsigned int data;      // stand shutdown time for PWC_SET_SHUT_TIME
8827 +                               // stand shutdown source for PWC_WAIT_BTN
8828 +};
8829 +
8830 +#define POWEROFF               0x01
8831 +#define RESTORE_DEFAULT        0x02
8832 +#define SYSTEM_REBOOT  0x04
8833 +
8834 +#define PWR_SRC_CIR            0x10
8835 +#define PWR_SRC_RTC            0x20
8836 +#define PWR_SRC_BTN            0x40
8837 +
8838 +#define        PWC_IOCTL_BASE                  'A'                             // use linux APM ioctl
8839 +#define PWC_SET_SHUT_TIME              _IOW('A', 16, struct pwc_ioctl_data)
8840 +#define PWC_WAIT_BTN                   _IOR('A', 17, struct pwc_ioctl_data)
8841 +#define PWC_SHUTDOWN                   _IO ('A', 18)
8842 +
8843  #endif /* LINUX_APM_H */
8844 --- a/kernel/time.c
8845 +++ b/kernel/time.c
8846 @@ -76,6 +76,7 @@
8847   * why not move it into the appropriate arch directory (for those
8848   * architectures that need it).
8849   */
8850 +extern void rtc_set_time_second(unsigned int second);
8851   
8852  asmlinkage long sys_stime(time_t __user *tptr)
8853  {
8854 @@ -87,6 +88,10 @@
8855  
8856         tv.tv_nsec = 0;
8857  
8858 +#ifdef CONFIG_SL2312_RTC
8859 +    rtc_set_time_second(tv.tv_sec);
8860 +#endif
8861 +
8862         err = security_settime(&tv, NULL);
8863         if (err)
8864                 return err;