mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
[ARM] 5338/1: Add Nuvoton W90P910 Platform support
Add Nuvoton W90X900 ARM9 plat support to linux arm tree, Now, this patch include only W90P910 EVB of W90P910 CPU, Its driver is nothing. Signed-off-by: Wan ZongShun <mcuos.com@gmail.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
c5b84b3bb0
commit
7ec80ddf04
23 changed files with 986 additions and 0 deletions
|
@ -572,6 +572,13 @@ config ARCH_MSM
|
|||
interface to the ARM9 modem processor which runs the baseband stack
|
||||
and controls some vital subsystems (clock and power control, etc).
|
||||
|
||||
config ARCH_W90X900
|
||||
bool "Nuvoton W90X900 CPU"
|
||||
select CPU_ARM926T
|
||||
help
|
||||
Support for Nuvoton (Winbond logic dept.) ARM9 processor,You
|
||||
can login www.mcuos.com or www.nuvoton.com to know more.
|
||||
|
||||
endchoice
|
||||
|
||||
source "arch/arm/mach-clps711x/Kconfig"
|
||||
|
@ -650,6 +657,8 @@ source "arch/arm/mach-ks8695/Kconfig"
|
|||
|
||||
source "arch/arm/mach-msm/Kconfig"
|
||||
|
||||
source "arch/arm/mach-w90x900/Kconfig"
|
||||
|
||||
# Definitions to make life easier
|
||||
config ARCH_ACORN
|
||||
bool
|
||||
|
|
|
@ -143,6 +143,7 @@ endif
|
|||
machine-$(CONFIG_ARCH_MSM) := msm
|
||||
machine-$(CONFIG_ARCH_LOKI) := loki
|
||||
machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0
|
||||
machine-$(CONFIG_ARCH_W90X900) := w90x900
|
||||
|
||||
ifeq ($(CONFIG_ARCH_EBSA110),y)
|
||||
# This is what happens if you forget the IOCS16 line.
|
||||
|
|
19
arch/arm/mach-w90x900/Kconfig
Normal file
19
arch/arm/mach-w90x900/Kconfig
Normal file
|
@ -0,0 +1,19 @@
|
|||
if ARCH_W90X900
|
||||
|
||||
config CPU_W90P910
|
||||
bool
|
||||
help
|
||||
Support for W90P910 of Nuvoton W90X900 CPUs.
|
||||
|
||||
menu "W90P910 Machines"
|
||||
|
||||
config MACH_W90P910EVB
|
||||
bool "Nuvoton W90P910 Evaluation Board"
|
||||
default y
|
||||
select CPU_W90P910
|
||||
help
|
||||
Say Y here if you are using the Nuvoton W90P910EVB
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
15
arch/arm/mach-w90x900/Makefile
Normal file
15
arch/arm/mach-w90x900/Makefile
Normal file
|
@ -0,0 +1,15 @@
|
|||
#
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
# Object file lists.
|
||||
|
||||
obj-y := irq.o time.o
|
||||
|
||||
# W90X900 CPU support files
|
||||
|
||||
obj-$(CONFIG_CPU_W90P910) += w90p910.o
|
||||
|
||||
# machine support
|
||||
|
||||
obj-$(CONFIG_MACH_W90P910EVB) += mach-w90p910evb.o
|
3
arch/arm/mach-w90x900/Makefile.boot
Normal file
3
arch/arm/mach-w90x900/Makefile.boot
Normal file
|
@ -0,0 +1,3 @@
|
|||
zreladdr-y := 0x00008000
|
||||
params_phys-y := 0x00000100
|
||||
|
77
arch/arm/mach-w90x900/cpu.h
Normal file
77
arch/arm/mach-w90x900/cpu.h
Normal file
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/cpu.h
|
||||
*
|
||||
* Based on linux/include/asm-arm/plat-s3c24xx/cpu.h by Ben Dooks
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Header file for W90X900 CPU support
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#define IODESC_ENT(y) \
|
||||
{ \
|
||||
.virtual = (unsigned long)W90X900_VA_##y, \
|
||||
.pfn = __phys_to_pfn(W90X900_PA_##y), \
|
||||
.length = W90X900_SZ_##y, \
|
||||
.type = MT_DEVICE, \
|
||||
}
|
||||
|
||||
/*Cpu identifier register*/
|
||||
|
||||
#define W90X900PDID W90X900_VA_GCR
|
||||
#define W90P910_CPUID 0x02900910
|
||||
#define W90P920_CPUID 0x02900920
|
||||
#define W90P950_CPUID 0x02900950
|
||||
#define W90N960_CPUID 0x02900960
|
||||
|
||||
struct w90x900_uartcfg;
|
||||
struct map_desc;
|
||||
struct sys_timer;
|
||||
|
||||
/* core initialisation functions */
|
||||
|
||||
extern void w90x900_init_irq(void);
|
||||
extern void w90p910_init_io(struct map_desc *mach_desc, int size);
|
||||
extern void w90p910_init_uarts(struct w90x900_uartcfg *cfg, int no);
|
||||
extern void w90p910_init_clocks(int xtal);
|
||||
extern void w90p910_map_io(struct map_desc *mach_desc, int size);
|
||||
extern struct sys_timer w90x900_timer;
|
||||
|
||||
#define W90X900_RES(name) \
|
||||
struct resource w90x900_##name##_resource[] = { \
|
||||
[0] = { \
|
||||
.start = name##_PA, \
|
||||
.end = name##_PA + 0x0ff, \
|
||||
.flags = IORESOURCE_MEM, \
|
||||
}, \
|
||||
[1] = { \
|
||||
.start = IRQ_##name, \
|
||||
.end = IRQ_##name, \
|
||||
.flags = IORESOURCE_IRQ, \
|
||||
} \
|
||||
}
|
||||
|
||||
#define W90X900_DEVICE(devname, regname, devid, platdevname) \
|
||||
struct platform_device w90x900_##devname = { \
|
||||
.name = platdevname, \
|
||||
.id = devid, \
|
||||
.num_resources = ARRAY_SIZE(w90x900_##regname##_resource), \
|
||||
.resource = w90x900_##regname##_resource, \
|
||||
}
|
||||
|
||||
#define W90X900_UARTCFG(port, flag, uc, ulc, ufc) \
|
||||
{ \
|
||||
.hwport = port, \
|
||||
.flags = flag, \
|
||||
.ucon = uc, \
|
||||
.ulcon = ulc, \
|
||||
.ufcon = ufc, \
|
||||
}
|
34
arch/arm/mach-w90x900/include/mach/entry-macro.S
Normal file
34
arch/arm/mach-w90x900/include/mach/entry-macro.S
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/entry-macro.S
|
||||
*
|
||||
* Low-level IRQ helper macros for W90P910-based platforms
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/regs-irq.h>
|
||||
|
||||
.macro get_irqnr_preamble, base, tmp
|
||||
.endm
|
||||
|
||||
.macro arch_ret_to_user, tmp1, tmp2
|
||||
.endm
|
||||
|
||||
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
|
||||
|
||||
mov \base, #AIC_BA
|
||||
|
||||
ldr \irqnr, [ \base, #AIC_IPER]
|
||||
ldr \irqnr, [ \base, #AIC_ISNR]
|
||||
cmp \irqnr, #0
|
||||
|
||||
.endm
|
||||
|
||||
/* currently don't need an disable_fiq macro */
|
||||
|
||||
.macro disable_fiq
|
||||
.endm
|
24
arch/arm/mach-w90x900/include/mach/hardware.h
Normal file
24
arch/arm/mach-w90x900/include/mach/hardware.h
Normal file
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/hardware.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/hardware.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H
|
||||
#define __ASM_ARCH_HARDWARE_H
|
||||
|
||||
#include <asm/sizes.h>
|
||||
#include <mach/map.h>
|
||||
|
||||
#endif /* __ASM_ARCH_HARDWARE_H */
|
30
arch/arm/mach-w90x900/include/mach/io.h
Normal file
30
arch/arm/mach-w90x900/include/mach/io.h
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/io.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/io.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARM_ARCH_IO_H
|
||||
#define __ASM_ARM_ARCH_IO_H
|
||||
|
||||
#define IO_SPACE_LIMIT 0xffffffff
|
||||
|
||||
/*
|
||||
* 1:1 mapping for ioremapped regions.
|
||||
*/
|
||||
|
||||
#define __mem_pci(a) (a)
|
||||
#define __io(a) __typesafe_io(a)
|
||||
|
||||
#endif
|
45
arch/arm/mach-w90x900/include/mach/irqs.h
Normal file
45
arch/arm/mach-w90x900/include/mach/irqs.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/irqs.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/irqs.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_IRQS_H
|
||||
#define __ASM_ARCH_IRQS_H
|
||||
|
||||
/*
|
||||
* we keep the first set of CPU IRQs out of the range of
|
||||
* the ISA space, so that the PC104 has them to itself
|
||||
* and we don't end up having to do horrible things to the
|
||||
* standard ISA drivers....
|
||||
*
|
||||
*/
|
||||
|
||||
#define W90X900_IRQ(x) (x)
|
||||
|
||||
/* Main cpu interrupts */
|
||||
|
||||
#define IRQ_WDT W90X900_IRQ(1)
|
||||
#define IRQ_UART0 W90X900_IRQ(7)
|
||||
#define IRQ_UART1 W90X900_IRQ(8)
|
||||
#define IRQ_UART2 W90X900_IRQ(9)
|
||||
#define IRQ_UART3 W90X900_IRQ(10)
|
||||
#define IRQ_UART4 W90X900_IRQ(11)
|
||||
#define IRQ_TIMER0 W90X900_IRQ(12)
|
||||
#define IRQ_TIMER1 W90X900_IRQ(13)
|
||||
#define IRQ_T_INT_GROUP W90X900_IRQ(14)
|
||||
#define IRQ_ADC W90X900_IRQ(31)
|
||||
#define NR_IRQS (IRQ_ADC+1)
|
||||
|
||||
#endif /* __ASM_ARCH_IRQ_H */
|
76
arch/arm/mach-w90x900/include/mach/map.h
Normal file
76
arch/arm/mach-w90x900/include/mach/map.h
Normal file
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/map.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/map.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_MAP_H
|
||||
#define __ASM_ARCH_MAP_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#define W90X900_ADDR(x) ((void __iomem *)(0xF0000000 + (x)))
|
||||
#else
|
||||
#define W90X900_ADDR(x) (0xF0000000 + (x))
|
||||
#endif
|
||||
|
||||
#define AHB_IO_BASE 0xB0000000
|
||||
#define APB_IO_BASE 0xB8000000
|
||||
#define CLOCKPW_BASE (APB_IO_BASE+0x200)
|
||||
#define AIC_IO_BASE (APB_IO_BASE+0x2000)
|
||||
#define TIMER_IO_BASE (APB_IO_BASE+0x1000)
|
||||
|
||||
/*
|
||||
* interrupt controller is the first thing we put in, to make
|
||||
* the assembly code for the irq detection easier
|
||||
*/
|
||||
|
||||
#define W90X900_VA_IRQ W90X900_ADDR(0x00000000)
|
||||
#define W90X900_PA_IRQ (0xB8002000)
|
||||
#define W90X900_SZ_IRQ SZ_4K
|
||||
|
||||
#define W90X900_VA_GCR W90X900_ADDR(0x08002000)
|
||||
#define W90X900_PA_GCR (0xB0000000)
|
||||
#define W90X900_SZ_GCR SZ_4K
|
||||
|
||||
/* Clock and Power management */
|
||||
|
||||
#define W90X900_VA_CLKPWR (W90X900_VA_GCR+0x200)
|
||||
#define W90X900_PA_CLKPWR (0xB0000200)
|
||||
#define W90X900_SZ_CLKPWR SZ_4K
|
||||
|
||||
/* EBI management */
|
||||
|
||||
#define W90X900_VA_EBI W90X900_ADDR(0x00001000)
|
||||
#define W90X900_PA_EBI (0xB0001000)
|
||||
#define W90X900_SZ_EBI SZ_4K
|
||||
|
||||
/* UARTs */
|
||||
|
||||
#define W90X900_VA_UART W90X900_ADDR(0x08000000)
|
||||
#define W90X900_PA_UART (0xB8000000)
|
||||
#define W90X900_SZ_UART SZ_4K
|
||||
|
||||
/* Timers */
|
||||
|
||||
#define W90X900_VA_TIMER W90X900_ADDR(0x08001000)
|
||||
#define W90X900_PA_TIMER (0xB8001000)
|
||||
#define W90X900_SZ_TIMER SZ_4K
|
||||
|
||||
/* GPIO ports */
|
||||
|
||||
#define W90X900_VA_GPIO W90X900_ADDR(0x08003000)
|
||||
#define W90X900_PA_GPIO (0xB8003000)
|
||||
#define W90X900_SZ_GPIO SZ_4K
|
||||
|
||||
#endif /* __ASM_ARCH_MAP_H */
|
23
arch/arm/mach-w90x900/include/mach/memory.h
Normal file
23
arch/arm/mach-w90x900/include/mach/memory.h
Normal file
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/memory.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/memory.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_MEMORY_H
|
||||
#define __ASM_ARCH_MEMORY_H
|
||||
|
||||
#define PHYS_OFFSET UL(0x00000000)
|
||||
|
||||
#endif
|
51
arch/arm/mach-w90x900/include/mach/regs-irq.h
Normal file
51
arch/arm/mach-w90x900/include/mach/regs-irq.h
Normal file
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/regs-irq.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/regs-irq.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef ___ASM_ARCH_REGS_IRQ_H
|
||||
#define ___ASM_ARCH_REGS_IRQ_H
|
||||
|
||||
/* Advance Interrupt Controller (AIC) Registers */
|
||||
|
||||
#define AIC_BA W90X900_VA_IRQ
|
||||
|
||||
#define REG_AIC_IRQSC (AIC_BA+0x80)
|
||||
#define REG_AIC_GEN (AIC_BA+0x84)
|
||||
#define REG_AIC_GASR (AIC_BA+0x88)
|
||||
#define REG_AIC_GSCR (AIC_BA+0x8C)
|
||||
#define REG_AIC_IRSR (AIC_BA+0x100)
|
||||
#define REG_AIC_IASR (AIC_BA+0x104)
|
||||
#define REG_AIC_ISR (AIC_BA+0x108)
|
||||
#define REG_AIC_IPER (AIC_BA+0x10C)
|
||||
#define REG_AIC_ISNR (AIC_BA+0x110)
|
||||
#define REG_AIC_IMR (AIC_BA+0x114)
|
||||
#define REG_AIC_OISR (AIC_BA+0x118)
|
||||
#define REG_AIC_MECR (AIC_BA+0x120)
|
||||
#define REG_AIC_MDCR (AIC_BA+0x124)
|
||||
#define REG_AIC_SSCR (AIC_BA+0x128)
|
||||
#define REG_AIC_SCCR (AIC_BA+0x12C)
|
||||
#define REG_AIC_EOSCR (AIC_BA+0x130)
|
||||
#define AIC_IPER (0x10C)
|
||||
#define AIC_ISNR (0x110)
|
||||
|
||||
/*16-18 bits of REG_AIC_GEN define irq(2-4) group*/
|
||||
|
||||
#define TIMER2_IRQ (1 << 16)
|
||||
#define TIMER3_IRQ (1 << 17)
|
||||
#define TIMER4_IRQ (1 << 18)
|
||||
#define TIME_GROUP_IRQ (TIMER2_IRQ|TIMER3_IRQ|TIMER4_IRQ)
|
||||
|
||||
#endif /* ___ASM_ARCH_REGS_IRQ_H */
|
59
arch/arm/mach-w90x900/include/mach/regs-serial.h
Normal file
59
arch/arm/mach-w90x900/include/mach/regs-serial.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/regs-serial.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/regs-serial.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARM_REGS_SERIAL_H
|
||||
#define __ASM_ARM_REGS_SERIAL_H
|
||||
|
||||
#define UART0_BA W90X900_VA_UART
|
||||
#define UART1_BA (W90X900_VA_UART+0x100)
|
||||
#define UART2_BA (W90X900_VA_UART+0x200)
|
||||
#define UART3_BA (W90X900_VA_UART+0x300)
|
||||
#define UART4_BA (W90X900_VA_UART+0x400)
|
||||
|
||||
#define UART0_PA W90X900_PA_UART
|
||||
#define UART1_PA (W90X900_PA_UART+0x100)
|
||||
#define UART2_PA (W90X900_PA_UART+0x200)
|
||||
#define UART3_PA (W90X900_PA_UART+0x300)
|
||||
#define UART4_PA (W90X900_PA_UART+0x400)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
struct w90x900_uart_clksrc {
|
||||
const char *name;
|
||||
unsigned int divisor;
|
||||
unsigned int min_baud;
|
||||
unsigned int max_baud;
|
||||
};
|
||||
|
||||
struct w90x900_uartcfg {
|
||||
unsigned char hwport;
|
||||
unsigned char unused;
|
||||
unsigned short flags;
|
||||
unsigned long uart_flags;
|
||||
|
||||
unsigned long ucon;
|
||||
unsigned long ulcon;
|
||||
unsigned long ufcon;
|
||||
|
||||
struct w90x900_uart_clksrc *clocks;
|
||||
unsigned int clocks_size;
|
||||
};
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_ARM_REGS_SERIAL_H */
|
||||
|
42
arch/arm/mach-w90x900/include/mach/regs-timer.h
Normal file
42
arch/arm/mach-w90x900/include/mach/regs-timer.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/regs-timer.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/regs-timer.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_REGS_TIMER_H
|
||||
#define __ASM_ARCH_REGS_TIMER_H
|
||||
|
||||
/* Timer Registers */
|
||||
|
||||
#define TMR_BA W90X900_VA_TIMER
|
||||
#define REG_TCSR0 (TMR_BA+0x00)
|
||||
#define REG_TCSR1 (TMR_BA+0x04)
|
||||
#define REG_TICR0 (TMR_BA+0x08)
|
||||
#define REG_TICR1 (TMR_BA+0x0C)
|
||||
#define REG_TDR0 (TMR_BA+0x10)
|
||||
#define REG_TDR1 (TMR_BA+0x14)
|
||||
#define REG_TISR (TMR_BA+0x18)
|
||||
#define REG_WTCR (TMR_BA+0x1C)
|
||||
#define REG_TCSR2 (TMR_BA+0x20)
|
||||
#define REG_TCSR3 (TMR_BA+0x24)
|
||||
#define REG_TICR2 (TMR_BA+0x28)
|
||||
#define REG_TICR3 (TMR_BA+0x2C)
|
||||
#define REG_TDR2 (TMR_BA+0x30)
|
||||
#define REG_TDR3 (TMR_BA+0x34)
|
||||
#define REG_TCSR4 (TMR_BA+0x40)
|
||||
#define REG_TICR4 (TMR_BA+0x48)
|
||||
#define REG_TDR4 (TMR_BA+0x50)
|
||||
|
||||
#endif /* __ASM_ARCH_REGS_TIMER_H */
|
28
arch/arm/mach-w90x900/include/mach/system.h
Normal file
28
arch/arm/mach-w90x900/include/mach/system.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/system.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/system.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <asm/proc-fns.h>
|
||||
|
||||
static void arch_idle(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void arch_reset(char mode)
|
||||
{
|
||||
cpu_reset(0);
|
||||
}
|
||||
|
25
arch/arm/mach-w90x900/include/mach/timex.h
Normal file
25
arch/arm/mach-w90x900/include/mach/timex.h
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/timex.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/timex.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_TIMEX_H
|
||||
#define __ASM_ARCH_TIMEX_H
|
||||
|
||||
/* CLOCK_TICK_RATE Now, I don't use it. */
|
||||
|
||||
#define CLOCK_TICK_RATE 15000000
|
||||
|
||||
#endif /* __ASM_ARCH_TIMEX_H */
|
40
arch/arm/mach-w90x900/include/mach/uncompress.h
Normal file
40
arch/arm/mach-w90x900/include/mach/uncompress.h
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/uncompress.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/uncompress.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_UNCOMPRESS_H
|
||||
#define __ASM_ARCH_UNCOMPRESS_H
|
||||
|
||||
/* Defines for UART registers */
|
||||
|
||||
#include <mach/regs-serial.h>
|
||||
#include <mach/map.h>
|
||||
|
||||
#define arch_decomp_wdog()
|
||||
|
||||
static void putc(int ch)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void flush(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void arch_decomp_setup(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif/* __ASM_W90X900_UNCOMPRESS_H */
|
23
arch/arm/mach-w90x900/include/mach/vmalloc.h
Normal file
23
arch/arm/mach-w90x900/include/mach/vmalloc.h
Normal file
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* arch/arm/mach-w90x900/include/mach/vmalloc.h
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/vmalloc.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_VMALLOC_H
|
||||
#define __ASM_ARCH_VMALLOC_H
|
||||
|
||||
#define VMALLOC_END (0xE0000000)
|
||||
|
||||
#endif /* __ASM_ARCH_VMALLOC_H */
|
76
arch/arm/mach-w90x900/irq.c
Normal file
76
arch/arm/mach-w90x900/irq.c
Normal file
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-w90x900/irq.c
|
||||
*
|
||||
* based on linux/arch/arm/plat-s3c24xx/irq.c by Ben Dooks
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/regs-irq.h>
|
||||
|
||||
static void w90x900_irq_mask(unsigned int irq)
|
||||
{
|
||||
__raw_writel(1 << irq, REG_AIC_MDCR);
|
||||
}
|
||||
|
||||
/*
|
||||
* By the w90p910 spec,any irq,only write 1
|
||||
* to REG_AIC_EOSCR for ACK
|
||||
*/
|
||||
|
||||
static void w90x900_irq_ack(unsigned int irq)
|
||||
{
|
||||
__raw_writel(0x01, REG_AIC_EOSCR);
|
||||
}
|
||||
|
||||
static void w90x900_irq_unmask(unsigned int irq)
|
||||
{
|
||||
unsigned long mask;
|
||||
|
||||
if (irq == IRQ_T_INT_GROUP) {
|
||||
mask = __raw_readl(REG_AIC_GEN);
|
||||
__raw_writel(TIME_GROUP_IRQ | mask, REG_AIC_GEN);
|
||||
__raw_writel(1 << IRQ_T_INT_GROUP, REG_AIC_MECR);
|
||||
}
|
||||
__raw_writel(1 << irq, REG_AIC_MECR);
|
||||
}
|
||||
|
||||
static struct irq_chip w90x900_irq_chip = {
|
||||
.ack = w90x900_irq_ack,
|
||||
.mask = w90x900_irq_mask,
|
||||
.unmask = w90x900_irq_unmask,
|
||||
};
|
||||
|
||||
void __init w90x900_init_irq(void)
|
||||
{
|
||||
int irqno;
|
||||
|
||||
__raw_writel(0xFFFFFFFE, REG_AIC_MDCR);
|
||||
|
||||
for (irqno = IRQ_WDT; irqno <= IRQ_ADC; irqno++) {
|
||||
set_irq_chip(irqno, &w90x900_irq_chip);
|
||||
set_irq_handler(irqno, handle_level_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
}
|
72
arch/arm/mach-w90x900/mach-w90p910evb.c
Normal file
72
arch/arm/mach-w90x900/mach-w90p910evb.c
Normal file
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-w90x900/mach-w90p910evb.c
|
||||
*
|
||||
* Based on mach-s3c2410/mach-smdk2410.c by Jonas Dietsche
|
||||
*
|
||||
* Copyright (C) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/regs-serial.h>
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
static struct map_desc w90p910_iodesc[] __initdata = {
|
||||
};
|
||||
|
||||
static struct w90x900_uartcfg w90p910_uartcfgs[] = {
|
||||
W90X900_UARTCFG(0, 0, 0, 0, 0),
|
||||
W90X900_UARTCFG(1, 0, 0, 0, 0),
|
||||
W90X900_UARTCFG(2, 0, 0, 0, 0),
|
||||
W90X900_UARTCFG(3, 0, 0, 0, 0),
|
||||
W90X900_UARTCFG(4, 0, 0, 0, 0),
|
||||
};
|
||||
|
||||
/*Here should be your evb resourse,such as LCD*/
|
||||
|
||||
static struct platform_device *w90p910evb_dev[] __initdata = {
|
||||
};
|
||||
|
||||
static void __init w90p910evb_map_io(void)
|
||||
{
|
||||
w90p910_map_io(w90p910_iodesc, ARRAY_SIZE(w90p910_iodesc));
|
||||
w90p910_init_clocks(0);
|
||||
w90p910_init_uarts(w90p910_uartcfgs, ARRAY_SIZE(w90p910_uartcfgs));
|
||||
}
|
||||
|
||||
static void __init w90p910evb_init(void)
|
||||
{
|
||||
platform_add_devices(w90p910evb_dev, ARRAY_SIZE(w90p910evb_dev));
|
||||
}
|
||||
|
||||
MACHINE_START(W90P910EVB, "W90P910EVB")
|
||||
/* Maintainer: Wan ZongShun */
|
||||
.phys_io = W90X900_PA_UART,
|
||||
.io_pg_offst = (((u32)W90X900_VA_UART) >> 18) & 0xfffc,
|
||||
.boot_params = 0,
|
||||
.map_io = w90p910evb_map_io,
|
||||
.init_irq = w90x900_init_irq,
|
||||
.init_machine = w90p910evb_init,
|
||||
.timer = &w90x900_timer,
|
||||
MACHINE_END
|
80
arch/arm/mach-w90x900/time.c
Normal file
80
arch/arm/mach-w90x900/time.c
Normal file
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-w90x900/time.c
|
||||
*
|
||||
* Based on linux/arch/arm/plat-s3c24xx/time.c by Ben Dooks
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include <mach/system.h>
|
||||
#include <mach/map.h>
|
||||
#include <mach/regs-timer.h>
|
||||
|
||||
static unsigned long w90x900_gettimeoffset(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*IRQ handler for the timer*/
|
||||
|
||||
static irqreturn_t
|
||||
w90x900_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
timer_tick();
|
||||
__raw_writel(0x01, REG_TISR); /* clear TIF0 */
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct irqaction w90x900_timer_irq = {
|
||||
.name = "w90x900 Timer Tick",
|
||||
.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
|
||||
.handler = w90x900_timer_interrupt,
|
||||
};
|
||||
|
||||
/*Set up timer reg.*/
|
||||
|
||||
static void w90x900_timer_setup(void)
|
||||
{
|
||||
__raw_writel(0, REG_TCSR0);
|
||||
__raw_writel(0, REG_TCSR1);
|
||||
__raw_writel(0, REG_TCSR2);
|
||||
__raw_writel(0, REG_TCSR3);
|
||||
__raw_writel(0, REG_TCSR4);
|
||||
__raw_writel(0x1F, REG_TISR);
|
||||
__raw_writel(15000000/(100 * 100), REG_TICR0);
|
||||
__raw_writel(0x68000063, REG_TCSR0);
|
||||
}
|
||||
|
||||
static void __init w90x900_timer_init(void)
|
||||
{
|
||||
w90x900_timer_setup();
|
||||
setup_irq(IRQ_TIMER0, &w90x900_timer_irq);
|
||||
}
|
||||
|
||||
struct sys_timer w90x900_timer = {
|
||||
.init = w90x900_timer_init,
|
||||
.offset = w90x900_gettimeoffset,
|
||||
.resume = w90x900_timer_setup
|
||||
};
|
134
arch/arm/mach-w90x900/w90p910.c
Normal file
134
arch/arm/mach-w90x900/w90p910.c
Normal file
|
@ -0,0 +1,134 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-w90x900/w90p910.c
|
||||
*
|
||||
* Based on linux/arch/arm/plat-s3c24xx/s3c244x.c by Ben Dooks
|
||||
*
|
||||
* Copyright (c) 2008 Nuvoton technology corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Wan ZongShun <mcuos.com@gmail.com>
|
||||
*
|
||||
* W90P910 cpu support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/regs-serial.h>
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
/*W90P910 has five uarts*/
|
||||
|
||||
#define MAX_UART_COUNT 5
|
||||
static int uart_count;
|
||||
static struct platform_device *uart_devs[MAX_UART_COUNT-1];
|
||||
|
||||
/* Initial IO mappings */
|
||||
|
||||
static struct map_desc w90p910_iodesc[] __initdata = {
|
||||
IODESC_ENT(IRQ),
|
||||
IODESC_ENT(GCR),
|
||||
IODESC_ENT(UART),
|
||||
IODESC_ENT(TIMER),
|
||||
IODESC_ENT(EBI),
|
||||
/*IODESC_ENT(LCD),*/
|
||||
};
|
||||
|
||||
/*Init the dev resource*/
|
||||
|
||||
static W90X900_RES(UART0);
|
||||
static W90X900_RES(UART1);
|
||||
static W90X900_RES(UART2);
|
||||
static W90X900_RES(UART3);
|
||||
static W90X900_RES(UART4);
|
||||
static W90X900_DEVICE(uart0, UART0, 0, "w90x900-uart");
|
||||
static W90X900_DEVICE(uart1, UART1, 1, "w90x900-uart");
|
||||
static W90X900_DEVICE(uart2, UART2, 2, "w90x900-uart");
|
||||
static W90X900_DEVICE(uart3, UART3, 3, "w90x900-uart");
|
||||
static W90X900_DEVICE(uart4, UART4, 4, "w90x900-uart");
|
||||
|
||||
static struct platform_device *uart_devices[] __initdata = {
|
||||
&w90x900_uart0,
|
||||
&w90x900_uart1,
|
||||
&w90x900_uart2,
|
||||
&w90x900_uart3,
|
||||
&w90x900_uart4
|
||||
};
|
||||
|
||||
/*Init W90P910 uart device*/
|
||||
|
||||
void __init w90p910_init_uarts(struct w90x900_uartcfg *cfg, int no)
|
||||
{
|
||||
struct platform_device *platdev;
|
||||
int uart, uartdev;
|
||||
|
||||
/*By min() to judge count of uart be used indeed*/
|
||||
|
||||
uartdev = ARRAY_SIZE(uart_devices);
|
||||
no = min(uartdev, no);
|
||||
|
||||
for (uart = 0; uart < no; uart++, cfg++) {
|
||||
if (cfg->hwport != uart)
|
||||
printk(KERN_ERR "w90x900_uartcfg[%d] error\n", uart);
|
||||
platdev = uart_devices[cfg->hwport];
|
||||
uart_devs[uart] = platdev;
|
||||
platdev->dev.platform_data = cfg;
|
||||
}
|
||||
uart_count = uart;
|
||||
}
|
||||
|
||||
/*Init W90P910 evb io*/
|
||||
|
||||
void __init w90p910_map_io(struct map_desc *mach_desc, int mach_size)
|
||||
{
|
||||
unsigned long idcode = 0x0;
|
||||
|
||||
iotable_init(w90p910_iodesc, ARRAY_SIZE(w90p910_iodesc));
|
||||
|
||||
idcode = __raw_readl(W90X900PDID);
|
||||
if (idcode != W90P910_CPUID)
|
||||
printk(KERN_ERR "CPU type 0x%08lx is not W90P910\n", idcode);
|
||||
}
|
||||
|
||||
/*Init W90P910 clock*/
|
||||
|
||||
void __init w90p910_init_clocks(int xtal)
|
||||
{
|
||||
}
|
||||
|
||||
static int __init w90p910_init_cpu(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init w90x900_arch_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = w90p910_init_cpu();
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
return platform_add_devices(uart_devs, uart_count);
|
||||
|
||||
}
|
||||
arch_initcall(w90x900_arch_init);
|
Loading…
Reference in a new issue