linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] NUC900: Add support for nuc932 SoC
@ 2009-10-03  8:21 Wan ZongShun
  2009-11-17  5:43 ` Wan ZongShun
  0 siblings, 1 reply; 3+ messages in thread
From: Wan ZongShun @ 2009-10-03  8:21 UTC (permalink / raw)
  To: linux-arm-kernel

Dear Russell,

The NUC932 is not same to NUC900 series SoCs, which contains sensor interface supports, H/W JPEG image codec,TV-Out and there are not different register addressing between them,but there are the same IPs in VIC, uart, timer.so I add the nuc932 platform to my nuc900 and modify some interfaces of nuc900 to apply to nuc932, for avoiding wasteful duplication of codes.

Signed-off-by: Wan ZongShun <mcuos.com@gmail.com>


---
 arch/arm/mach-w90x900/Kconfig                |   15 +++
 arch/arm/mach-w90x900/Makefile               |   12 ++-
 arch/arm/mach-w90x900/clock.c                |    2 +-
 arch/arm/mach-w90x900/clock.h                |    6 +
 arch/arm/mach-w90x900/cpu.c                  |   18 +++-
 arch/arm/mach-w90x900/cpu.h                  |    5 +-
 arch/arm/mach-w90x900/dev_932.c              |   44 ++++++++
 arch/arm/mach-w90x900/groupirq.c             |  140 ++++++++++++++++++++++++++
 arch/arm/mach-w90x900/groupirq.h             |   16 +++
 arch/arm/mach-w90x900/include/mach/irqs.h    |   44 ++++++++
 arch/arm/mach-w90x900/include/mach/map.h     |  105 ++++----------------
 arch/arm/mach-w90x900/include/mach/reg_900.h |   93 +++++++++++++++++
 arch/arm/mach-w90x900/include/mach/reg_932.h |   57 +++++++++++
 arch/arm/mach-w90x900/irq.c                  |  139 +-------------------------
 arch/arm/mach-w90x900/mach-nuc932evb.c       |   42 ++++++++
 arch/arm/mach-w90x900/nuc910.c               |    3 +-
 arch/arm/mach-w90x900/nuc932.c               |   54 ++++++++++
 arch/arm/mach-w90x900/nuc932.h               |   28 +++++
 arch/arm/mach-w90x900/nuc950.c               |    2 +-
 arch/arm/mach-w90x900/nuc960.c               |    2 +-
 arch/arm/mach-w90x900/time.c                 |   69 +------------
 arch/arm/mach-w90x900/time.h                 |   33 ++++++
 arch/arm/mach-w90x900/time_900.c             |   90 +++++++++++++++++
 arch/arm/mach-w90x900/time_932.c             |   59 +++++++++++
 24 files changed, 780 insertions(+), 298 deletions(-)
 create mode 100644 arch/arm/mach-w90x900/dev_932.c
 create mode 100644 arch/arm/mach-w90x900/groupirq.c
 create mode 100644 arch/arm/mach-w90x900/groupirq.h
 create mode 100644 arch/arm/mach-w90x900/include/mach/reg_900.h
 create mode 100644 arch/arm/mach-w90x900/include/mach/reg_932.h
 create mode 100644 arch/arm/mach-w90x900/mach-nuc932evb.c
 create mode 100644 arch/arm/mach-w90x900/nuc932.c
 create mode 100644 arch/arm/mach-w90x900/nuc932.h
 create mode 100644 arch/arm/mach-w90x900/time.h
 create mode 100644 arch/arm/mach-w90x900/time_900.c
 create mode 100644 arch/arm/mach-w90x900/time_932.c

diff --git a/arch/arm/mach-w90x900/Kconfig b/arch/arm/mach-w90x900/Kconfig
index 69bab32..f4b96fe 100644
--- a/arch/arm/mach-w90x900/Kconfig
+++ b/arch/arm/mach-w90x900/Kconfig
@@ -15,6 +15,11 @@ config CPU_NUC960
 	help
 	  Support for NUCP960 of Nuvoton NUC900 CPUs.
 
+config CPU_NUC932
+	bool
+	help
+	  Support for NUCP932 of Nuvoton NUC900 CPUs.
+
 menu "W90P910 Machines"
 
 config MACH_W90P910EVB
@@ -46,4 +51,14 @@ config MACH_W90N960EVB
 
 endmenu
 
+menu "NUC932 Machines"
+
+config MACH_NUC932EVB
+	bool "Nuvoton NUC932 Evaluation Board"
+	select CPU_NUC932
+	help
+	   Say Y here if you are using the Nuvoton NUC932EVB
+
+endmenu
+
 endif
diff --git a/arch/arm/mach-w90x900/Makefile b/arch/arm/mach-w90x900/Makefile
index 828c032..69631f6 100644
--- a/arch/arm/mach-w90x900/Makefile
+++ b/arch/arm/mach-w90x900/Makefile
@@ -4,16 +4,24 @@
 
 # Object file lists.
 
-obj-y				:= irq.o time.o mfp.o gpio.o clock.o
-obj-y				+= clksel.o dev.o cpu.o
+obj-y				:= irq.o time.o cpu.o clock.o clksel.o mfp.o
+
+ifndef CONFIG_CPU_NUC932
+obj-y				+= dev.o groupirq.o time_900.o
+else
+obj-y				+= dev_932.o time_932.o
+endif
+
 # W90X900 CPU support files
 
 obj-$(CONFIG_CPU_W90P910)	+= nuc910.o
 obj-$(CONFIG_CPU_NUC950)	+= nuc950.o
 obj-$(CONFIG_CPU_NUC960)	+= nuc960.o
+obj-$(CONFIG_CPU_NUC932)	+= nuc932.o
 
 # machine support
 
 obj-$(CONFIG_MACH_W90P910EVB)	+= mach-nuc910evb.o
 obj-$(CONFIG_MACH_W90P950EVB)	+= mach-nuc950evb.o
 obj-$(CONFIG_MACH_W90N960EVB)	+= mach-nuc960evb.o
+obj-$(CONFIG_MACH_NUC932EVB)	+= mach-nuc932evb.o
diff --git a/arch/arm/mach-w90x900/clock.c b/arch/arm/mach-w90x900/clock.c
index b785994..df6e63b 100644
--- a/arch/arm/mach-w90x900/clock.c
+++ b/arch/arm/mach-w90x900/clock.c
@@ -57,7 +57,7 @@ EXPORT_SYMBOL(clk_disable);
 
 unsigned long clk_get_rate(struct clk *clk)
 {
-	return 15000000;
+	return EXTCLK;
 }
 EXPORT_SYMBOL(clk_get_rate);
 
diff --git a/arch/arm/mach-w90x900/clock.h b/arch/arm/mach-w90x900/clock.h
index f5816a0..b9ea2e6 100644
--- a/arch/arm/mach-w90x900/clock.h
+++ b/arch/arm/mach-w90x900/clock.h
@@ -12,6 +12,12 @@
 
 #include <asm/clkdev.h>
 
+#ifndef CONFIG_CPU_NUC932
+#define EXTCLK	15000000
+#else
+#define EXTCLK	27000000
+#endif
+
 void nuc900_clk_enable(struct clk *clk, int enable);
 void nuc900_subclk_enable(struct clk *clk, int enable);
 void clks_register(struct clk_lookup *clks, size_t num);
diff --git a/arch/arm/mach-w90x900/cpu.c b/arch/arm/mach-w90x900/cpu.c
index 921cef9..401b1c8 100644
--- a/arch/arm/mach-w90x900/cpu.c
+++ b/arch/arm/mach-w90x900/cpu.c
@@ -35,7 +35,7 @@
 #include <mach/regs-ebi.h>
 
 #include "cpu.h"
-#include "clock.h"
+
 
 /* Initial IO mappings */
 
@@ -201,12 +201,24 @@ void __init nuc900_map_io(struct map_desc *mach_desc, int mach_size)
 		printk(KERN_INFO "CPU type 0x%08lx is NUC950\n", idcode);
 	else if (idcode == NUC960_CPUID)
 		printk(KERN_INFO "CPU type 0x%08lx is NUC960\n", idcode);
+	else if (idcode == NUC932_CPUID)
+		printk(KERN_INFO "CPU type 0x%08lx is NUC932\n", idcode);
 }
 
 /*Init NUC900 clock*/
 
-void __init nuc900_init_clocks(void)
+void __init nuc900_init_clocks(struct clk_lookup *clks, size_t num)
 {
-	clks_register(nuc900_clkregs, ARRAY_SIZE(nuc900_clkregs));
+	struct clk_lookup *pclks;
+	size_t pnum;
+
+	if (clks == NULL) {
+		pclks = nuc900_clkregs;
+		pnum = ARRAY_SIZE(nuc900_clkregs);
+	} else {
+		pclks = clks;
+		pnum = num;
+	}
+	clks_register(pclks, pnum);
 }
 
diff --git a/arch/arm/mach-w90x900/cpu.h b/arch/arm/mach-w90x900/cpu.h
index 4d58ba1..4493d4d 100644
--- a/arch/arm/mach-w90x900/cpu.h
+++ b/arch/arm/mach-w90x900/cpu.h
@@ -15,6 +15,7 @@
  * published by the Free Software Foundation.
  *
  */
+#include "clock.h"
 
 #define IODESC_ENT(y)                                  \
 {                                                      \
@@ -42,13 +43,15 @@
 #define NUC920_CPUID	0x02900920
 #define NUC950_CPUID	0x02900950
 #define NUC960_CPUID	0x02900960
+#define NUC932_CPUID	0x29550091
 
 /* extern file from cpu.c */
 
 extern void nuc900_clock_source(struct device *dev, unsigned char *src);
-extern void nuc900_init_clocks(void);
+extern void nuc900_init_clocks(struct clk_lookup *clks, size_t num);
 extern void nuc900_map_io(struct map_desc *mach_desc, int mach_size);
 extern void nuc900_board_init(struct platform_device **device, int size);
+extern void nuc932_dev_board_init(void);
 
 /* for either public between 910 and 920, or between 920 and 950 */
 
diff --git a/arch/arm/mach-w90x900/dev_932.c b/arch/arm/mach-w90x900/dev_932.c
new file mode 100644
index 0000000..c2d2cef
--- /dev/null
+++ b/arch/arm/mach-w90x900/dev_932.c
@@ -0,0 +1,44 @@
+/*
+ * linux/arch/arm/mach-w90x900/dev_932.c
+ *
+ * Copyright (C) 2009 Nuvoton corporation.
+ *
+ * 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;version 2 of the License.
+ *
+ */
+
+#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 <mach/map.h>
+
+#include "cpu.h"
+
+/*Here should be your evb resourse,such as LCD*/
+
+static struct platform_device *nuc932_dev[] __initdata = {
+	&nuc900_serial_device,
+};
+
+/* Provide adding specific CPU platform devices API */
+
+void __init nuc932_dev_board_init(void)
+{
+	platform_add_devices(nuc932_dev, ARRAY_SIZE(nuc932_dev));
+}
+
diff --git a/arch/arm/mach-w90x900/groupirq.c b/arch/arm/mach-w90x900/groupirq.c
new file mode 100644
index 0000000..b3a74db
--- /dev/null
+++ b/arch/arm/mach-w90x900/groupirq.c
@@ -0,0 +1,140 @@
+/*
+ * linux/arch/arm/mach-w90x900/groupirq.c
+ *
+ * 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;version 2 of the License.
+ *
+ */
+
+#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>
+
+struct group_irq {
+	unsigned long		gpen;
+	unsigned int		enabled;
+	void			(*enable)(struct group_irq *, int enable);
+};
+
+static DEFINE_SPINLOCK(groupirq_lock);
+
+#define DEFINE_GROUP(_name, _ctrlbit, _num)				\
+struct group_irq group_##_name = {					\
+		.enable		= nuc900_group_enable,			\
+		.gpen		= ((1 << _num) - 1) << _ctrlbit,	\
+	}
+
+static void nuc900_group_enable(struct group_irq *gpirq, int enable);
+
+static DEFINE_GROUP(nirq0, 0, 4);
+static DEFINE_GROUP(nirq1, 4, 4);
+static DEFINE_GROUP(usbh, 8, 2);
+static DEFINE_GROUP(ottimer, 16, 3);
+static DEFINE_GROUP(gdma, 20, 2);
+static DEFINE_GROUP(sc, 24, 2);
+static DEFINE_GROUP(i2c, 26, 2);
+static DEFINE_GROUP(ps2, 28, 2);
+
+static int group_irq_enable(struct group_irq *group_irq)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&groupirq_lock, flags);
+	if (group_irq->enabled++ == 0)
+		(group_irq->enable)(group_irq, 1);
+	spin_unlock_irqrestore(&groupirq_lock, flags);
+
+	return 0;
+}
+
+static void group_irq_disable(struct group_irq *group_irq)
+{
+	unsigned long flags;
+
+	WARN_ON(group_irq->enabled == 0);
+
+	spin_lock_irqsave(&groupirq_lock, flags);
+	if (--group_irq->enabled == 0)
+		(group_irq->enable)(group_irq, 0);
+	spin_unlock_irqrestore(&groupirq_lock, flags);
+}
+
+static void nuc900_group_enable(struct group_irq *gpirq, int enable)
+{
+	unsigned int groupen = gpirq->gpen;
+	unsigned long regval;
+
+	regval = __raw_readl(REG_AIC_GEN);
+
+	if (enable)
+		regval |= groupen;
+	else
+		regval &= ~groupen;
+
+	__raw_writel(regval, REG_AIC_GEN);
+}
+
+void nuc900_groupirq_mask(unsigned int irq, unsigned int mask)
+{
+	struct group_irq *group_irq;
+
+	group_irq = NULL;
+
+	switch (irq) {
+	case IRQ_GROUP0:
+		group_irq = &group_nirq0;
+		break;
+
+	case IRQ_GROUP1:
+		group_irq = &group_nirq1;
+		break;
+
+	case IRQ_USBH:
+		group_irq = &group_usbh;
+		break;
+
+	case IRQ_T_INT_GROUP:
+		group_irq = &group_ottimer;
+		break;
+
+	case IRQ_GDMAGROUP:
+		group_irq = &group_gdma;
+		break;
+
+	case IRQ_SCGROUP:
+		group_irq = &group_sc;
+		break;
+
+	case IRQ_I2CGROUP:
+		group_irq = &group_i2c;
+		break;
+
+	case IRQ_P2SGROUP:
+		group_irq = &group_ps2;
+		break;
+	}
+
+	if (group_irq) {
+		if (mask)
+			group_irq_disable(group_irq);
+		else
+			group_irq_enable(group_irq);
+	}
+}
+
diff --git a/arch/arm/mach-w90x900/groupirq.h b/arch/arm/mach-w90x900/groupirq.h
new file mode 100644
index 0000000..65fbd8c
--- /dev/null
+++ b/arch/arm/mach-w90x900/groupirq.h
@@ -0,0 +1,16 @@
+/*
+ * arch/arm/mach-w90x900/groupirq.h
+ *
+ * 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.
+ *
+ */
+
+extern void nuc900_groupirq_mask(unsigned int irq, unsigned int mask);
diff --git a/arch/arm/mach-w90x900/include/mach/irqs.h b/arch/arm/mach-w90x900/include/mach/irqs.h
index 9d5cba3..1cb105f 100644
--- a/arch/arm/mach-w90x900/include/mach/irqs.h
+++ b/arch/arm/mach-w90x900/include/mach/irqs.h
@@ -28,6 +28,8 @@
 
 /* Main cpu interrupts */
 
+#ifndef CONFIG_CPU_NUC932
+
 #define IRQ_WDT		W90X900_IRQ(1)
 #define IRQ_GROUP0	W90X900_IRQ(2)
 #define IRQ_GROUP1	W90X900_IRQ(3)
@@ -83,4 +85,46 @@
 #define	IRQ_GROUP1_IRQ6	0x00000040
 #define	IRQ_GROUP1_IRQ7	0x00000080
 
+#else
+
+#define IRQ_WDT		W90X900_IRQ(1)
+#define IRQ_IRQ0	W90X900_IRQ(2)
+#define IRQ_IRQ1	W90X900_IRQ(3)
+#define IRQ_IRQ2	W90X900_IRQ(4)
+#define IRQ_IRQ3	W90X900_IRQ(5)
+#define IRQ_USBH	W90X900_IRQ(6)
+#define IRQ_APU		W90X900_IRQ(7)
+#define IRQ_VPOST	W90X900_IRQ(8)
+#define IRQ_ADC		W90X900_IRQ(9)
+#define IRQ_UART0	W90X900_IRQ(10)
+#define IRQ_TIMER0	W90X900_IRQ(11)
+#define IRQ_GPU0	W90X900_IRQ(12)
+#define IRQ_GPU1	W90X900_IRQ(13)
+#define IRQ_GPU2	W90X900_IRQ(14)
+#define IRQ_GPU3	W90X900_IRQ(15)
+#define IRQ_GPU4	W90X900_IRQ(16)
+#define IRQ_VIN		W90X900_IRQ(17)
+#define IRQ_USBD	W90X900_IRQ(18)
+#define IRQ_VRAMLD	W90X900_IRQ(19)
+#define IRQ_GDMA0	W90X900_IRQ(20)
+#define IRQ_GDMA1	W90X900_IRQ(21)
+#define IRQ_SDIO	W90X900_IRQ(22)
+#define IRQ_FMI		W90X900_IRQ(22)
+#define IRQ_JPEG	W90X900_IRQ(23)
+#define IRQ_SPI0	W90X900_IRQ(24)
+#define IRQ_SPI1	W90X900_IRQ(25)
+#define IRQ_RTC		W90X900_IRQ(26)
+#define IRQ_PWM0	W90X900_IRQ(27)
+#define IRQ_PWM1	W90X900_IRQ(28)
+#define IRQ_PWM2	W90X900_IRQ(29)
+#define IRQ_PWM3	W90X900_IRQ(30)
+#define IRQ_I2SAC97	W90X900_IRQ(31)
+#define IRQ_CAP0	IRQ_PWM0
+#define IRQ_CAP1	IRQ_PWM1
+#define IRQ_CAP2	IRQ_PWM2
+#define IRQ_CAP3	IRQ_PWM3
+#define NR_IRQS		(IRQ_I2SAC97 + 1)
+
+#endif
+
 #endif /* __ASM_ARCH_IRQ_H */
diff --git a/arch/arm/mach-w90x900/include/mach/map.h b/arch/arm/mach-w90x900/include/mach/map.h
index 1a20953..33c548f 100644
--- a/arch/arm/mach-w90x900/include/mach/map.h
+++ b/arch/arm/mach-w90x900/include/mach/map.h
@@ -16,142 +16,73 @@
 #ifndef __ASM_ARCH_MAP_H
 #define __ASM_ARCH_MAP_H
 
-#ifndef __ASSEMBLY__
-#define W90X900_ADDR(x)		((void __iomem *)(0xF0000000 + (x)))
+#ifdef CONFIG_CPU_NUC932
+#include "reg_932.h"
 #else
-#define W90X900_ADDR(x)		(0xF0000000 + (x))
+#include "reg_900.h"
 #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_VA_GCR		W90X900_ADDR(W90X900_PA_IRQ)
+#define W90X900_VA_CLKPWR	(W90X900_VA_GCR+CLK_OFFSET)
 #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_VA_EBI		W90X900_ADDR(W90X900_PA_EBI)
 #define W90X900_SZ_EBI		SZ_4K
 
 /* UARTs */
-#define W90X900_VA_UART		W90X900_ADDR(0x08000000)
-#define W90X900_PA_UART		(0xB8000000)
+#define W90X900_VA_UART		W90X900_ADDR(W90X900_PA_UART)
 #define W90X900_SZ_UART		SZ_4K
 
 /* Timers */
-#define W90X900_VA_TIMER	W90X900_ADDR(0x08001000)
-#define W90X900_PA_TIMER	(0xB8001000)
+#define W90X900_VA_TIMER	W90X900_ADDR(W90X900_PA_TIMER)
 #define W90X900_SZ_TIMER	SZ_4K
 
 /* GPIO ports */
-#define W90X900_VA_GPIO		W90X900_ADDR(0x08003000)
-#define W90X900_PA_GPIO		(0xB8003000)
+#define W90X900_VA_GPIO		W90X900_ADDR(W90X900_PA_GPIO)
 #define W90X900_SZ_GPIO		SZ_4K
 
 /* GDMA control */
-#define W90X900_VA_GDMA		W90X900_ADDR(0x00004000)
-#define W90X900_PA_GDMA		(0xB0004000)
+#define W90X900_VA_GDMA		W90X900_ADDR(W90X900_PA_GDMA)
 #define W90X900_SZ_GDMA		SZ_4K
 
-/* USB host controller*/
-#define W90X900_VA_USBEHCIHOST	W90X900_ADDR(0x00005000)
-#define W90X900_PA_USBEHCIHOST	(0xB0005000)
-#define W90X900_SZ_USBEHCIHOST	SZ_4K
-
-#define W90X900_VA_USBOHCIHOST	W90X900_ADDR(0x00007000)
-#define W90X900_PA_USBOHCIHOST	(0xB0007000)
-#define W90X900_SZ_USBOHCIHOST	SZ_4K
-
 /* I2C hardware controller */
-#define W90X900_VA_I2C		W90X900_ADDR(0x08006000)
-#define W90X900_PA_I2C		(0xB8006000)
+#define W90X900_VA_I2C		W90X900_ADDR(W90X900_PA_I2C)
 #define W90X900_SZ_I2C		SZ_4K
 
-/* Keypad Interface*/
-#define W90X900_VA_KPI		W90X900_ADDR(0x08008000)
-#define W90X900_PA_KPI		(0xB8008000)
-#define W90X900_SZ_KPI		SZ_4K
-
-/* Smart card host*/
-#define W90X900_VA_SC		W90X900_ADDR(0x08005000)
-#define W90X900_PA_SC		(0xB8005000)
-#define W90X900_SZ_SC		SZ_4K
-
 /* LCD controller*/
-#define W90X900_VA_LCD		W90X900_ADDR(0x00008000)
-#define W90X900_PA_LCD		(0xB0008000)
+#define W90X900_VA_LCD		W90X900_ADDR(W90X900_PA_LCD)
 #define W90X900_SZ_LCD		SZ_4K
 
 /* 2D controller*/
-#define W90X900_VA_GE		W90X900_ADDR(0x0000B000)
-#define W90X900_PA_GE		(0xB000B000)
+#define W90X900_VA_GE		W90X900_ADDR(W90X900_PA_GE)
 #define W90X900_SZ_GE		SZ_4K
 
-/* ATAPI */
-#define W90X900_VA_ATAPI	W90X900_ADDR(0x0000A000)
-#define W90X900_PA_ATAPI	(0xB000A000)
-#define W90X900_SZ_ATAPI	SZ_4K
-
 /* ADC */
-#define W90X900_VA_ADC		W90X900_ADDR(0x0800A000)
-#define W90X900_PA_ADC		(0xB800A000)
+#define W90X900_VA_ADC		W90X900_ADDR(W90X900_PA_ADC)
 #define W90X900_SZ_ADC		SZ_4K
 
-/* PS2 Interface*/
-#define W90X900_VA_PS2		W90X900_ADDR(0x08009000)
-#define W90X900_PA_PS2		(0xB8009000)
-#define W90X900_SZ_PS2		SZ_4K
-
 /* RTC */
-#define W90X900_VA_RTC		W90X900_ADDR(0x08004000)
-#define W90X900_PA_RTC		(0xB8004000)
+#define W90X900_VA_RTC		W90X900_ADDR(W90X900_PA_RTC)
 #define W90X900_SZ_RTC		SZ_4K
 
 /* Pulse Width Modulation(PWM) Registers */
-#define W90X900_VA_PWM		W90X900_ADDR(0x08007000)
-#define W90X900_PA_PWM		(0xB8007000)
+#define W90X900_VA_PWM		W90X900_ADDR(W90X900_PA_PWM)
 #define W90X900_SZ_PWM		SZ_4K
 
 /* Audio Controller controller */
-#define W90X900_VA_ACTL		W90X900_ADDR(0x00009000)
-#define W90X900_PA_ACTL		(0xB0009000)
+#define W90X900_VA_ACTL		W90X900_ADDR(W90X900_PA_ACTL)
 #define W90X900_SZ_ACTL		SZ_4K
 
-/* DMA controller */
-#define W90X900_VA_DMA		W90X900_ADDR(0x0000c000)
-#define W90X900_PA_DMA		(0xB000c000)
-#define W90X900_SZ_DMA		SZ_4K
-
-/* FMI controller */
-#define W90X900_VA_FMI		W90X900_ADDR(0x0000d000)
-#define W90X900_PA_FMI		(0xB000d000)
-#define W90X900_SZ_FMI		SZ_4K
-
 /* USB Device port */
-#define W90X900_VA_USBDEV	W90X900_ADDR(0x00006000)
-#define W90X900_PA_USBDEV	(0xB0006000)
+#define W90X900_VA_USBDEV	W90X900_ADDR(W90X900_PA_USBDEV)
 #define W90X900_SZ_USBDEV	SZ_4K
 
-/* External MAC control*/
-#define W90X900_VA_EMC		W90X900_ADDR(0x00003000)
-#define W90X900_PA_EMC		(0xB0003000)
-#define W90X900_SZ_EMC		SZ_4K
-
 #endif /* __ASM_ARCH_MAP_H */
diff --git a/arch/arm/mach-w90x900/include/mach/reg_900.h b/arch/arm/mach-w90x900/include/mach/reg_900.h
new file mode 100644
index 0000000..5a07224
--- /dev/null
+++ b/arch/arm/mach-w90x900/include/mach/reg_900.h
@@ -0,0 +1,93 @@
+/*
+ * arch/arm/mach-w90x900/include/mach/reg_900.h
+ *
+ * Copyright (c) 2008 Nuvoton technology corporation.
+ *
+ * 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;version 2 of the License.
+ *
+ */
+
+#ifndef __ASM_ARCH_REG_H
+#define __ASM_ARCH_REG_H
+
+/*
+ * interrupt controller is the first thing we put in, to make
+ * the assembly code for the irq detection easier
+ */
+
+#define MAP_OFFSET	(0xB0000000)
+#define CLK_OFFSET	(0x200)
+
+#ifndef __ASSEMBLY__
+#define W90X900_ADDR(x)	((void __iomem *)(0xF0000000 + ((x)&(~MAP_OFFSET))))
+#else
+#define W90X900_ADDR(x)	(0xF0000000 + ((x)&(~MAP_OFFSET)))
+#endif
+
+#define W90X900_PA_IRQ		(0xB8002000)
+#define W90X900_PA_GCR		(0xB0000000)
+#define W90X900_PA_CLKPWR	(0xB0000200)
+#define W90X900_PA_EBI		(0xB0001000)
+#define W90X900_PA_UART		(0xB8000000)
+#define W90X900_PA_TIMER	(0xB8001000)
+#define W90X900_PA_GPIO		(0xB8003000)
+#define W90X900_PA_GDMA		(0xB0004000)
+#define W90X900_PA_USBEHCIHOST	(0xB0005000)
+#define W90X900_PA_USBOHCIHOST	(0xB0007000)
+#define W90X900_PA_I2C		(0xB8006000)
+#define W90X900_PA_KPI		(0xB8008000)
+#define W90X900_PA_SC		(0xB8005000)
+#define W90X900_PA_LCD		(0xB0008000)
+#define W90X900_PA_GE		(0xB000B000)
+#define W90X900_PA_ATAPI	(0xB000A000)
+#define W90X900_PA_ADC		(0xB800A000)
+#define W90X900_PA_PS2		(0xB8009000)
+#define W90X900_PA_RTC		(0xB8004000)
+#define W90X900_PA_PWM		(0xB8007000)
+#define W90X900_PA_ACTL		(0xB0009000)
+#define W90X900_PA_DMA		(0xB000c000)
+#define W90X900_PA_FMI		(0xB000d000)
+#define W90X900_PA_USBDEV	(0xB0006000)
+#define W90X900_PA_EMC		(0xB0003000)
+
+
+/* USB host controller*/
+#define W90X900_VA_USBEHCIHOST	W90X900_ADDR(W90X900_PA_USBEHCIHOST)
+#define W90X900_SZ_USBEHCIHOST	SZ_4K
+
+#define W90X900_VA_USBOHCIHOST	W90X900_ADDR(W90X900_PA_USBOHCIHOST)
+#define W90X900_SZ_USBOHCIHOST	SZ_4K
+
+/* Keypad Interface*/
+#define W90X900_VA_KPI		W90X900_ADDR(W90X900_PA_KPI)
+#define W90X900_SZ_KPI		SZ_4K
+
+/* Smart card host*/
+#define W90X900_VA_SC		W90X900_ADDR(W90X900_PA_SC)
+#define W90X900_SZ_SC		SZ_4K
+
+/* ATAPI */
+#define W90X900_VA_ATAPI	W90X900_ADDR(W90X900_PA_ATAPI)
+#define W90X900_SZ_ATAPI	SZ_4K
+
+/* PS2 Interface*/
+#define W90X900_VA_PS2		W90X900_ADDR(W90X900_PA_PS2)
+#define W90X900_SZ_PS2		SZ_4K
+
+/* DMA controller */
+#define W90X900_VA_DMA		W90X900_ADDR(W90X900_PA_DMA)
+#define W90X900_SZ_DMA		SZ_4K
+
+/* FMI controller */
+#define W90X900_VA_FMI		W90X900_ADDR(W90X900_PA_FMI)
+#define W90X900_SZ_FMI		SZ_4K
+
+/* External MAC control*/
+#define W90X900_VA_EMC		W90X900_ADDR(W90X900_PA_EMC)
+#define W90X900_SZ_EMC		SZ_4K
+
+#endif /* __ASM_ARCH_REG_H */
diff --git a/arch/arm/mach-w90x900/include/mach/reg_932.h b/arch/arm/mach-w90x900/include/mach/reg_932.h
new file mode 100644
index 0000000..3ac5a0d
--- /dev/null
+++ b/arch/arm/mach-w90x900/include/mach/reg_932.h
@@ -0,0 +1,57 @@
+/*
+ * arch/arm/mach-w90x900/include/mach/reg_932.h
+ *
+ * Copyright (c) 2008 Nuvoton technology corporation.
+ *
+ * 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;version 2 of the License.
+ *
+ */
+
+#ifndef __ASM_ARCH_REG_H
+#define __ASM_ARCH_REG_H
+
+#define MAP_OFFSET	(0xfff00000)
+#define CLK_OFFSET	(0x10)
+
+#ifndef __ASSEMBLY__
+#define W90X900_ADDR(x)	((void __iomem *)(0xF0000000 + ((x)&(~MAP_OFFSET))))
+#else
+#define W90X900_ADDR(x)	(0xF0000000 + ((x)&(~MAP_OFFSET)))
+#endif
+
+#define W90X900_PA_IRQ		(0xFFF83000)
+#define W90X900_PA_GCR		(0xFFF00000)
+#define W90X900_PA_EBI		(0xFFF01000)
+#define W90X900_PA_UART		(0xFFF80000)
+#define W90X900_PA_TIMER	(0xFFF81000)
+#define W90X900_PA_GPIO		(0xFFF84000)
+#define W90X900_PA_GDMA		(0xFFF03000)
+#define W90X900_PA_USBHOST	(0xFFF0d000)
+#define W90X900_PA_I2C		(0xFFF89000)
+#define W90X900_PA_LCD		(0xFFF06000)
+#define W90X900_PA_GE		(0xFFF05000)
+#define W90X900_PA_ADC		(0xFFF85000)
+#define W90X900_PA_RTC		(0xFFF87000)
+#define W90X900_PA_PWM		(0xFFF82000)
+#define W90X900_PA_ACTL		(0xFFF0a000)
+#define W90X900_PA_USBDEV	(0xFFF0C000)
+#define W90X900_PA_JEPEG	(0xFFF0e000)
+#define W90X900_PA_CACHE_T	(0xFFF60000)
+#define W90X900_PA_VRAM		(0xFFF0b000)
+#define W90X900_PA_DMAC		(0xFFF09000)
+#define W90X900_PA_I2SM		(0xFFF08000)
+#define W90X900_PA_CACHE	(0xFFF02000)
+#define W90X900_PA_GPU		(0xFFF04000)
+#define W90X900_PA_VIDEOIN	(0xFFF07000)
+#define W90X900_PA_SPI0		(0xFFF86000)
+#define W90X900_PA_SPI1		(0xFFF88000)
+
+/* USB host controller*/
+#define W90X900_VA_USBHOST	W90X900_ADDR(W90X900_PA_USBHOST)
+#define W90X900_SZ_USBHOST	SZ_4K
+
+#endif /* __ASM_ARCH_REG_H */
diff --git a/arch/arm/mach-w90x900/irq.c b/arch/arm/mach-w90x900/irq.c
index 0ce9d8e..5444a27 100644
--- a/arch/arm/mach-w90x900/irq.c
+++ b/arch/arm/mach-w90x900/irq.c
@@ -27,70 +27,7 @@
 
 #include <mach/hardware.h>
 #include <mach/regs-irq.h>
-
-struct group_irq {
-	unsigned long		gpen;
-	unsigned int		enabled;
-	void			(*enable)(struct group_irq *, int enable);
-};
-
-static DEFINE_SPINLOCK(groupirq_lock);
-
-#define DEFINE_GROUP(_name, _ctrlbit, _num)				\
-struct group_irq group_##_name = {					\
-		.enable		= nuc900_group_enable,			\
-		.gpen		= ((1 << _num) - 1) << _ctrlbit,	\
-	}
-
-static void nuc900_group_enable(struct group_irq *gpirq, int enable);
-
-static DEFINE_GROUP(nirq0, 0, 4);
-static DEFINE_GROUP(nirq1, 4, 4);
-static DEFINE_GROUP(usbh, 8, 2);
-static DEFINE_GROUP(ottimer, 16, 3);
-static DEFINE_GROUP(gdma, 20, 2);
-static DEFINE_GROUP(sc, 24, 2);
-static DEFINE_GROUP(i2c, 26, 2);
-static DEFINE_GROUP(ps2, 28, 2);
-
-static int group_irq_enable(struct group_irq *group_irq)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&groupirq_lock, flags);
-	if (group_irq->enabled++ == 0)
-		(group_irq->enable)(group_irq, 1);
-	spin_unlock_irqrestore(&groupirq_lock, flags);
-
-	return 0;
-}
-
-static void group_irq_disable(struct group_irq *group_irq)
-{
-	unsigned long flags;
-
-	WARN_ON(group_irq->enabled == 0);
-
-	spin_lock_irqsave(&groupirq_lock, flags);
-	if (--group_irq->enabled == 0)
-		(group_irq->enable)(group_irq, 0);
-	spin_unlock_irqrestore(&groupirq_lock, flags);
-}
-
-static void nuc900_group_enable(struct group_irq *gpirq, int enable)
-{
-	unsigned int groupen = gpirq->gpen;
-	unsigned long regval;
-
-	regval = __raw_readl(REG_AIC_GEN);
-
-	if (enable)
-		regval |= groupen;
-	else
-		regval &= ~groupen;
-
-	__raw_writel(regval, REG_AIC_GEN);
-}
+#include "groupirq.h"
 
 static void nuc900_irq_mask(unsigned int irq)
 {
@@ -100,42 +37,7 @@ static void nuc900_irq_mask(unsigned int irq)
 
 	__raw_writel(1 << irq, REG_AIC_MDCR);
 
-	switch (irq) {
-	case IRQ_GROUP0:
-		group_irq = &group_nirq0;
-		break;
-
-	case IRQ_GROUP1:
-		group_irq = &group_nirq1;
-		break;
-
-	case IRQ_USBH:
-		group_irq = &group_usbh;
-		break;
-
-	case IRQ_T_INT_GROUP:
-		group_irq = &group_ottimer;
-		break;
-
-	case IRQ_GDMAGROUP:
-		group_irq = &group_gdma;
-		break;
-
-	case IRQ_SCGROUP:
-		group_irq = &group_sc;
-		break;
-
-	case IRQ_I2CGROUP:
-		group_irq = &group_i2c;
-		break;
-
-	case IRQ_P2SGROUP:
-		group_irq = &group_ps2;
-		break;
-	}
-
-	if (group_irq)
-		group_irq_disable(group_irq);
+	nuc900_groupirq_mask(irq, 1);
 }
 
 /*
@@ -156,42 +58,7 @@ static void nuc900_irq_unmask(unsigned int irq)
 
 	__raw_writel(1 << irq, REG_AIC_MECR);
 
-	switch (irq) {
-	case IRQ_GROUP0:
-		group_irq = &group_nirq0;
-		break;
-
-	case IRQ_GROUP1:
-		group_irq = &group_nirq1;
-		break;
-
-	case IRQ_USBH:
-		group_irq = &group_usbh;
-		break;
-
-	case IRQ_T_INT_GROUP:
-		group_irq = &group_ottimer;
-		break;
-
-	case IRQ_GDMAGROUP:
-		group_irq = &group_gdma;
-		break;
-
-	case IRQ_SCGROUP:
-		group_irq = &group_sc;
-		break;
-
-	case IRQ_I2CGROUP:
-		group_irq = &group_i2c;
-		break;
-
-	case IRQ_P2SGROUP:
-		group_irq = &group_ps2;
-		break;
-	}
-
-	if (group_irq)
-		group_irq_enable(group_irq);
+	nuc900_groupirq_mask(irq, 0);
 }
 
 static struct irq_chip nuc900_irq_chip = {
diff --git a/arch/arm/mach-w90x900/mach-nuc932evb.c b/arch/arm/mach-w90x900/mach-nuc932evb.c
new file mode 100644
index 0000000..bcc67d2
--- /dev/null
+++ b/arch/arm/mach-w90x900/mach-nuc932evb.c
@@ -0,0 +1,42 @@
+/*
+ * linux/arch/arm/mach-w90x900/mach-nuc932evb.c
+ *
+ * Copyright (C) 2009 Nuvoton technology corporation.
+ *
+ * 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;version 2 of the License.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach-types.h>
+#include <mach/map.h>
+
+#include "nuc932.h"
+
+static void __init nuc932evb_map_io(void)
+{
+	nuc932_map_io();
+	nuc932_init_clocks();
+}
+
+static void __init nuc932evb_init(void)
+{
+	nuc932_board_init();
+}
+
+MACHINE_START(NUC932EVB, "NUC932EVB")
+	/* Maintainer: Wan ZongShun */
+	.phys_io	= W90X900_PA_UART,
+	.io_pg_offst	= (((u32)W90X900_VA_UART) >> 18) & 0xfffc,
+	.boot_params	= 0,
+	.map_io		= nuc932evb_map_io,
+	.init_irq	= nuc900_init_irq,
+	.init_machine	= nuc932evb_init,
+	.timer		= &nuc900_timer,
+MACHINE_END
diff --git a/arch/arm/mach-w90x900/nuc910.c b/arch/arm/mach-w90x900/nuc910.c
index 656f03b..85d358f 100644
--- a/arch/arm/mach-w90x900/nuc910.c
+++ b/arch/arm/mach-w90x900/nuc910.c
@@ -19,7 +19,6 @@
 #include <asm/mach/map.h>
 #include <mach/hardware.h>
 #include "cpu.h"
-#include "clock.h"
 
 /* define specific CPU platform device */
 
@@ -49,7 +48,7 @@ void __init nuc910_map_io(void)
 
 void __init nuc910_init_clocks(void)
 {
-	nuc900_init_clocks();
+	nuc900_init_clocks(NULL, (size_t)NULL);
 }
 
 /*Init NUC910 board info*/
diff --git a/arch/arm/mach-w90x900/nuc932.c b/arch/arm/mach-w90x900/nuc932.c
new file mode 100644
index 0000000..6ad68aa
--- /dev/null
+++ b/arch/arm/mach-w90x900/nuc932.c
@@ -0,0 +1,54 @@
+/*
+ * linux/arch/arm/mach-w90x900/nuc932.c
+ *
+ * Copyright (c) 2009 Nuvoton technology corporation.
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * NUC932 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;version 2 of the License.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <asm/mach/map.h>
+#include <mach/hardware.h>
+#include "cpu.h"
+
+static struct clk_lookup nuc932_clkregs[] = {
+};
+
+/* define specific CPU platform io map */
+
+static struct map_desc nuc932evb_iodesc[] __initdata = {
+};
+
+/*Init NUC932 evb io*/
+
+void __init nuc932_map_io(void)
+{
+	nuc900_map_io(nuc932evb_iodesc, ARRAY_SIZE(nuc932evb_iodesc));
+}
+
+/*Init NUC932 clock*/
+
+void __init nuc932_init_clocks(void)
+{
+	nuc900_init_clocks(nuc932_clkregs, ARRAY_SIZE(nuc932_clkregs));
+}
+
+/*Init NUC932 board info*/
+
+void __init nuc932_board_init(void)
+{
+	nuc932_dev_board_init();
+}
+
+/*NUC932 group irq api*/
+void nuc900_groupirq_mask(unsigned int irq, unsigned int mask)
+{
+}
+
diff --git a/arch/arm/mach-w90x900/nuc932.h b/arch/arm/mach-w90x900/nuc932.h
new file mode 100644
index 0000000..4cf1182
--- /dev/null
+++ b/arch/arm/mach-w90x900/nuc932.h
@@ -0,0 +1,28 @@
+/*
+ * arch/arm/mach-w90x900/nuc932.h
+ *
+ * Copyright (c) 2008 Nuvoton corporation
+ *
+ * Header file for NUC900 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.
+ *
+ */
+
+struct map_desc;
+struct sys_timer;
+
+/* core initialisation functions */
+
+extern void nuc900_init_irq(void);
+extern struct sys_timer nuc900_timer;
+
+/* extern file from nuc932.c */
+
+extern void nuc932_board_init(void);
+extern void nuc932_init_clocks(void);
+extern void nuc932_map_io(void);
diff --git a/arch/arm/mach-w90x900/nuc950.c b/arch/arm/mach-w90x900/nuc950.c
index 1495081..9a4bc34 100644
--- a/arch/arm/mach-w90x900/nuc950.c
+++ b/arch/arm/mach-w90x900/nuc950.c
@@ -43,7 +43,7 @@ void __init nuc950_map_io(void)
 
 void __init nuc950_init_clocks(void)
 {
-	nuc900_init_clocks();
+	nuc900_init_clocks(NULL, (size_t)NULL);
 }
 
 /*Init NUC950 board info*/
diff --git a/arch/arm/mach-w90x900/nuc960.c b/arch/arm/mach-w90x900/nuc960.c
index 8851a3a..e523866 100644
--- a/arch/arm/mach-w90x900/nuc960.c
+++ b/arch/arm/mach-w90x900/nuc960.c
@@ -43,7 +43,7 @@ void __init nuc960_map_io(void)
 
 void __init nuc960_init_clocks(void)
 {
-	nuc900_init_clocks();
+	nuc900_init_clocks(NULL, (size_t)NULL);
 }
 
 /*Init NUC960 board info*/
diff --git a/arch/arm/mach-w90x900/time.c b/arch/arm/mach-w90x900/time.c
index 4128af8..34d8532 100644
--- a/arch/arm/mach-w90x900/time.c
+++ b/arch/arm/mach-w90x900/time.c
@@ -33,16 +33,7 @@
 #include <mach/map.h>
 #include <mach/regs-timer.h>
 
-#define RESETINT	0x1f
-#define PERIOD		(0x01 << 27)
-#define ONESHOT		(0x00 << 27)
-#define COUNTEN		(0x01 << 30)
-#define INTEN		(0x01 << 29)
-
-#define TICKS_PER_SEC	100
-#define PRESCALE	0x63 /* Divider = prescale + 1 */
-
-unsigned int timer0_load;
+#include "time.h"
 
 static void nuc900_clockevent_setmode(enum clock_event_mode mode,
 		struct clock_event_device *clk)
@@ -86,7 +77,7 @@ static int nuc900_clockevent_setnextevent(unsigned long evt,
 }
 
 static struct clock_event_device nuc900_clockevent_device = {
-	.name		= "nuc900-timer0",
+	.name		= TIME0NAME,
 	.shift		= 32,
 	.features	= CLOCK_EVT_MODE_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
 	.set_mode	= nuc900_clockevent_setmode,
@@ -107,12 +98,12 @@ static irqreturn_t nuc900_timer0_interrupt(int irq, void *dev_id)
 }
 
 static struct irqaction nuc900_timer0_irq = {
-	.name		= "nuc900-timer0",
+	.name		= TIME0NAME,
 	.flags		= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
 	.handler	= nuc900_timer0_interrupt,
 };
 
-static void __init nuc900_clockevents_init(unsigned int rate)
+static void nuc900_clockevents_init(unsigned int rate)
 {
 	nuc900_clockevent_device.mult = div_sc(rate, NSEC_PER_SEC,
 					nuc900_clockevent_device.shift);
@@ -125,58 +116,8 @@ static void __init nuc900_clockevents_init(unsigned int rate)
 	clockevents_register_device(&nuc900_clockevent_device);
 }
 
-static cycle_t nuc900_get_cycles(struct clocksource *cs)
+void nuc900_timer_init_clockevents(unsigned int rate)
 {
-	return ~__raw_readl(REG_TDR1);
-}
-
-static struct clocksource clocksource_nuc900 = {
-	.name	= "nuc900-timer1",
-	.rating	= 200,
-	.read	= nuc900_get_cycles,
-	.mask	= CLOCKSOURCE_MASK(32),
-	.shift	= 20,
-	.flags	= CLOCK_SOURCE_IS_CONTINUOUS,
-};
-
-static void __init nuc900_clocksource_init(unsigned int rate)
-{
-	unsigned int val;
-
-	__raw_writel(0xffffffff, REG_TICR1);
-
-	val = __raw_readl(REG_TCSR1);
-	val |= (COUNTEN | PERIOD);
-	__raw_writel(val, REG_TCSR1);
-
-	clocksource_nuc900.mult =
-		clocksource_khz2mult((rate / 1000), clocksource_nuc900.shift);
-	clocksource_register(&clocksource_nuc900);
-}
-
-static void __init nuc900_timer_init(void)
-{
-	struct clk *ck_ext = clk_get(NULL, "ext");
-	unsigned int	rate;
-
-	BUG_ON(IS_ERR(ck_ext));
-
-	rate = clk_get_rate(ck_ext);
-	clk_put(ck_ext);
-	rate = rate / (PRESCALE + 0x01);
-
-	 /* set a known state */
-	__raw_writel(0x00, REG_TCSR0);
-	__raw_writel(0x00, REG_TCSR1);
-	__raw_writel(RESETINT, REG_TISR);
-	timer0_load = (rate / TICKS_PER_SEC);
-
 	setup_irq(IRQ_TIMER0, &nuc900_timer0_irq);
-
-	nuc900_clocksource_init(rate);
 	nuc900_clockevents_init(rate);
 }
-
-struct sys_timer nuc900_timer = {
-	.init		= nuc900_timer_init,
-};
diff --git a/arch/arm/mach-w90x900/time.h b/arch/arm/mach-w90x900/time.h
new file mode 100644
index 0000000..cb52f34
--- /dev/null
+++ b/arch/arm/mach-w90x900/time.h
@@ -0,0 +1,33 @@
+/*
+ * arch/arm/mach-w90x900/time.h
+ *
+ * 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.
+ *
+ */
+#ifndef CONFIG_CPU_NUC932
+#define TIME0NAME	"nuc900-timer0"
+#define RESETINT	0x1f
+#else
+#define TIME0NAME	"nuc932-timer0"
+#define RESETINT	0x01
+#endif
+
+#define PERIOD		(0x01 << 27)
+#define ONESHOT		(0x00 << 27)
+#define COUNTEN		(0x01 << 30)
+#define INTEN		(0x01 << 29)
+
+#define TICKS_PER_SEC	100
+#define PRESCALE	0x63 /* Divider = prescale + 1 */
+
+static unsigned int timer0_load;
+extern void nuc900_timer_init_clockevents(unsigned int rate);
+
diff --git a/arch/arm/mach-w90x900/time_900.c b/arch/arm/mach-w90x900/time_900.c
new file mode 100644
index 0000000..d01c660
--- /dev/null
+++ b/arch/arm/mach-w90x900/time_900.c
@@ -0,0 +1,90 @@
+/*
+ * linux/arch/arm/mach-w90x900/time.c
+ *
+ * Based on linux/arch/arm/plat-s3c24xx/time.c by Ben Dooks
+ *
+ * Copyright (c) 2009 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 <linux/clocksource.h>
+#include <linux/clockchips.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/irq.h>
+#include <asm/mach/time.h>
+
+#include <mach/map.h>
+#include <mach/regs-timer.h>
+
+#include "time.h"
+
+static cycle_t nuc900_get_cycles(struct clocksource *cs)
+{
+	return ~__raw_readl(REG_TDR1);
+}
+
+static struct clocksource clocksource_nuc900 = {
+	.name	= "nuc900-timer1",
+	.rating	= 200,
+	.read	= nuc900_get_cycles,
+	.mask	= CLOCKSOURCE_MASK(32),
+	.shift	= 20,
+	.flags	= CLOCK_SOURCE_IS_CONTINUOUS,
+};
+
+static void __init nuc900_clocksource_init(unsigned int rate)
+{
+	unsigned int val;
+
+	__raw_writel(0xffffffff, REG_TICR1);
+
+	val = __raw_readl(REG_TCSR1);
+	val |= (COUNTEN | PERIOD);
+	__raw_writel(val, REG_TCSR1);
+
+	clocksource_nuc900.mult =
+		clocksource_khz2mult((rate / 1000), clocksource_nuc900.shift);
+	clocksource_register(&clocksource_nuc900);
+}
+
+static void __init nuc900_timer_init(void)
+{
+	struct clk *ck_ext = clk_get(NULL, "ext");
+	unsigned int	rate;
+
+	BUG_ON(IS_ERR(ck_ext));
+
+	rate = clk_get_rate(ck_ext);
+	clk_put(ck_ext);
+	rate = rate / (PRESCALE + 0x01);
+
+	 /* set a known state */
+	__raw_writel(0x00, REG_TCSR0);
+	__raw_writel(0x00, REG_TCSR1);
+	__raw_writel(RESETINT, REG_TISR);
+	timer0_load = (rate / TICKS_PER_SEC);
+
+	nuc900_clocksource_init(rate);
+	nuc900_timer_init_clockevents(rate);
+}
+
+struct sys_timer nuc900_timer = {
+	.init		= nuc900_timer_init,
+};
diff --git a/arch/arm/mach-w90x900/time_932.c b/arch/arm/mach-w90x900/time_932.c
new file mode 100644
index 0000000..c50f9c0
--- /dev/null
+++ b/arch/arm/mach-w90x900/time_932.c
@@ -0,0 +1,59 @@
+/*
+ * linux/arch/arm/mach-w90x900/time.c
+ *
+ * Based on linux/arch/arm/plat-s3c24xx/time.c by Ben Dooks
+ *
+ * Copyright (c) 2009 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 <linux/clocksource.h>
+#include <linux/clockchips.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/irq.h>
+#include <asm/mach/time.h>
+
+#include <mach/map.h>
+#include <mach/regs-timer.h>
+
+#include "time.h"
+
+static void __init nuc900_timer_init(void)
+{
+	struct clk *ck_ext = clk_get(NULL, "ext");
+	unsigned int	rate;
+
+	BUG_ON(IS_ERR(ck_ext));
+
+	rate = clk_get_rate(ck_ext);
+	clk_put(ck_ext);
+	rate = rate / (PRESCALE + 0x01);
+
+	 /* set a known state */
+	__raw_writel(0x00, REG_TCSR0);
+	__raw_writel(RESETINT, REG_TISR);
+	timer0_load = (rate / TICKS_PER_SEC);
+
+	nuc900_timer_init_clockevents(rate);
+}
+
+struct sys_timer nuc900_timer = {
+	.init		= nuc900_timer_init,
+};
-- 
1.5.6.3
   

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH] NUC900: Add support for nuc932 SoC
@ 2009-10-03  8:34 Wan ZongShun
  0 siblings, 0 replies; 3+ messages in thread
From: Wan ZongShun @ 2009-10-03  8:34 UTC (permalink / raw)
  To: linux-arm-kernel

Add "CC" to LKML
-------------- next part --------------
An embedded message was scrubbed...
From: Wan ZongShun <mcuos.com@gmail.com>
Subject: [PATCH] NUC900: Add support for nuc932 SoC
Date: Sat, 03 Oct 2009 16:21:09 +0800
Size: 40817
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20091003/cb829308/attachment-0001.eml>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH] NUC900: Add support for nuc932 SoC
  2009-10-03  8:21 [PATCH] NUC900: Add support for nuc932 SoC Wan ZongShun
@ 2009-11-17  5:43 ` Wan ZongShun
  0 siblings, 0 replies; 3+ messages in thread
From: Wan ZongShun @ 2009-11-17  5:43 UTC (permalink / raw)
  To: linux-arm-kernel

Dear Russell,

Can this patch be submitted to your patch system now?

2009/10/3 Wan ZongShun <mcuos.com@gmail.com>:
> Dear Russell,
>
> The NUC932 is not same to NUC900 series SoCs, which contains sensor interface supports, H/W JPEG image codec,TV-Out and there are not different register addressing between them,but there are the same IPs in VIC, uart, timer.so I add the nuc932 platform to my nuc900 and modify some interfaces of nuc900 to apply to nuc932, for avoiding wasteful duplication of codes.
>
> Signed-off-by: Wan ZongShun <mcuos.com@gmail.com>
>
>
> ---
> ?arch/arm/mach-w90x900/Kconfig ? ? ? ? ? ? ? ?| ? 15 +++
> ?arch/arm/mach-w90x900/Makefile ? ? ? ? ? ? ? | ? 12 ++-
> ?arch/arm/mach-w90x900/clock.c ? ? ? ? ? ? ? ?| ? ?2 +-
> ?arch/arm/mach-w90x900/clock.h ? ? ? ? ? ? ? ?| ? ?6 +
> ?arch/arm/mach-w90x900/cpu.c ? ? ? ? ? ? ? ? ?| ? 18 +++-
> ?arch/arm/mach-w90x900/cpu.h ? ? ? ? ? ? ? ? ?| ? ?5 +-
> ?arch/arm/mach-w90x900/dev_932.c ? ? ? ? ? ? ?| ? 44 ++++++++
> ?arch/arm/mach-w90x900/groupirq.c ? ? ? ? ? ? | ?140 ++++++++++++++++++++++++++
> ?arch/arm/mach-w90x900/groupirq.h ? ? ? ? ? ? | ? 16 +++
> ?arch/arm/mach-w90x900/include/mach/irqs.h ? ?| ? 44 ++++++++
> ?arch/arm/mach-w90x900/include/mach/map.h ? ? | ?105 ++++----------------
> ?arch/arm/mach-w90x900/include/mach/reg_900.h | ? 93 +++++++++++++++++
> ?arch/arm/mach-w90x900/include/mach/reg_932.h | ? 57 +++++++++++
> ?arch/arm/mach-w90x900/irq.c ? ? ? ? ? ? ? ? ?| ?139 +-------------------------
> ?arch/arm/mach-w90x900/mach-nuc932evb.c ? ? ? | ? 42 ++++++++
> ?arch/arm/mach-w90x900/nuc910.c ? ? ? ? ? ? ? | ? ?3 +-
> ?arch/arm/mach-w90x900/nuc932.c ? ? ? ? ? ? ? | ? 54 ++++++++++
> ?arch/arm/mach-w90x900/nuc932.h ? ? ? ? ? ? ? | ? 28 +++++
> ?arch/arm/mach-w90x900/nuc950.c ? ? ? ? ? ? ? | ? ?2 +-
> ?arch/arm/mach-w90x900/nuc960.c ? ? ? ? ? ? ? | ? ?2 +-
> ?arch/arm/mach-w90x900/time.c ? ? ? ? ? ? ? ? | ? 69 +------------
> ?arch/arm/mach-w90x900/time.h ? ? ? ? ? ? ? ? | ? 33 ++++++
> ?arch/arm/mach-w90x900/time_900.c ? ? ? ? ? ? | ? 90 +++++++++++++++++
> ?arch/arm/mach-w90x900/time_932.c ? ? ? ? ? ? | ? 59 +++++++++++
> ?24 files changed, 780 insertions(+), 298 deletions(-)
> ?create mode 100644 arch/arm/mach-w90x900/dev_932.c
> ?create mode 100644 arch/arm/mach-w90x900/groupirq.c
> ?create mode 100644 arch/arm/mach-w90x900/groupirq.h
> ?create mode 100644 arch/arm/mach-w90x900/include/mach/reg_900.h
> ?create mode 100644 arch/arm/mach-w90x900/include/mach/reg_932.h
> ?create mode 100644 arch/arm/mach-w90x900/mach-nuc932evb.c
> ?create mode 100644 arch/arm/mach-w90x900/nuc932.c
> ?create mode 100644 arch/arm/mach-w90x900/nuc932.h
> ?create mode 100644 arch/arm/mach-w90x900/time.h
> ?create mode 100644 arch/arm/mach-w90x900/time_900.c
> ?create mode 100644 arch/arm/mach-w90x900/time_932.c
>
> diff --git a/arch/arm/mach-w90x900/Kconfig b/arch/arm/mach-w90x900/Kconfig
> index 69bab32..f4b96fe 100644
> --- a/arch/arm/mach-w90x900/Kconfig
> +++ b/arch/arm/mach-w90x900/Kconfig
> @@ -15,6 +15,11 @@ config CPU_NUC960
> ? ? ? ?help
> ? ? ? ? ?Support for NUCP960 of Nuvoton NUC900 CPUs.
>
> +config CPU_NUC932
> + ? ? ? bool
> + ? ? ? help
> + ? ? ? ? Support for NUCP932 of Nuvoton NUC900 CPUs.
> +
> ?menu "W90P910 Machines"
>
> ?config MACH_W90P910EVB
> @@ -46,4 +51,14 @@ config MACH_W90N960EVB
>
> ?endmenu
>
> +menu "NUC932 Machines"
> +
> +config MACH_NUC932EVB
> + ? ? ? bool "Nuvoton NUC932 Evaluation Board"
> + ? ? ? select CPU_NUC932
> + ? ? ? help
> + ? ? ? ? ?Say Y here if you are using the Nuvoton NUC932EVB
> +
> +endmenu
> +
> ?endif
> diff --git a/arch/arm/mach-w90x900/Makefile b/arch/arm/mach-w90x900/Makefile
> index 828c032..69631f6 100644
> --- a/arch/arm/mach-w90x900/Makefile
> +++ b/arch/arm/mach-w90x900/Makefile
> @@ -4,16 +4,24 @@
>
> ?# Object file lists.
>
> -obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?:= irq.o time.o mfp.o gpio.o clock.o
> -obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= clksel.o dev.o cpu.o
> +obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?:= irq.o time.o cpu.o clock.o clksel.o mfp.o
> +
> +ifndef CONFIG_CPU_NUC932
> +obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= dev.o groupirq.o time_900.o
> +else
> +obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= dev_932.o time_932.o
> +endif
> +
> ?# W90X900 CPU support files
>
> ?obj-$(CONFIG_CPU_W90P910) ? ? ?+= nuc910.o
> ?obj-$(CONFIG_CPU_NUC950) ? ? ? += nuc950.o
> ?obj-$(CONFIG_CPU_NUC960) ? ? ? += nuc960.o
> +obj-$(CONFIG_CPU_NUC932) ? ? ? += nuc932.o
>
> ?# machine support
>
> ?obj-$(CONFIG_MACH_W90P910EVB) ?+= mach-nuc910evb.o
> ?obj-$(CONFIG_MACH_W90P950EVB) ?+= mach-nuc950evb.o
> ?obj-$(CONFIG_MACH_W90N960EVB) ?+= mach-nuc960evb.o
> +obj-$(CONFIG_MACH_NUC932EVB) ? += mach-nuc932evb.o
> diff --git a/arch/arm/mach-w90x900/clock.c b/arch/arm/mach-w90x900/clock.c
> index b785994..df6e63b 100644
> --- a/arch/arm/mach-w90x900/clock.c
> +++ b/arch/arm/mach-w90x900/clock.c
> @@ -57,7 +57,7 @@ EXPORT_SYMBOL(clk_disable);
>
> ?unsigned long clk_get_rate(struct clk *clk)
> ?{
> - ? ? ? return 15000000;
> + ? ? ? return EXTCLK;
> ?}
> ?EXPORT_SYMBOL(clk_get_rate);
>
> diff --git a/arch/arm/mach-w90x900/clock.h b/arch/arm/mach-w90x900/clock.h
> index f5816a0..b9ea2e6 100644
> --- a/arch/arm/mach-w90x900/clock.h
> +++ b/arch/arm/mach-w90x900/clock.h
> @@ -12,6 +12,12 @@
>
> ?#include <asm/clkdev.h>
>
> +#ifndef CONFIG_CPU_NUC932
> +#define EXTCLK 15000000
> +#else
> +#define EXTCLK 27000000
> +#endif
> +
> ?void nuc900_clk_enable(struct clk *clk, int enable);
> ?void nuc900_subclk_enable(struct clk *clk, int enable);
> ?void clks_register(struct clk_lookup *clks, size_t num);
> diff --git a/arch/arm/mach-w90x900/cpu.c b/arch/arm/mach-w90x900/cpu.c
> index 921cef9..401b1c8 100644
> --- a/arch/arm/mach-w90x900/cpu.c
> +++ b/arch/arm/mach-w90x900/cpu.c
> @@ -35,7 +35,7 @@
> ?#include <mach/regs-ebi.h>
>
> ?#include "cpu.h"
> -#include "clock.h"
> +
>
> ?/* Initial IO mappings */
>
> @@ -201,12 +201,24 @@ void __init nuc900_map_io(struct map_desc *mach_desc, int mach_size)
> ? ? ? ? ? ? ? ?printk(KERN_INFO "CPU type 0x%08lx is NUC950\n", idcode);
> ? ? ? ?else if (idcode == NUC960_CPUID)
> ? ? ? ? ? ? ? ?printk(KERN_INFO "CPU type 0x%08lx is NUC960\n", idcode);
> + ? ? ? else if (idcode == NUC932_CPUID)
> + ? ? ? ? ? ? ? printk(KERN_INFO "CPU type 0x%08lx is NUC932\n", idcode);
> ?}
>
> ?/*Init NUC900 clock*/
>
> -void __init nuc900_init_clocks(void)
> +void __init nuc900_init_clocks(struct clk_lookup *clks, size_t num)
> ?{
> - ? ? ? clks_register(nuc900_clkregs, ARRAY_SIZE(nuc900_clkregs));
> + ? ? ? struct clk_lookup *pclks;
> + ? ? ? size_t pnum;
> +
> + ? ? ? if (clks == NULL) {
> + ? ? ? ? ? ? ? pclks = nuc900_clkregs;
> + ? ? ? ? ? ? ? pnum = ARRAY_SIZE(nuc900_clkregs);
> + ? ? ? } else {
> + ? ? ? ? ? ? ? pclks = clks;
> + ? ? ? ? ? ? ? pnum = num;
> + ? ? ? }
> + ? ? ? clks_register(pclks, pnum);
> ?}
>
> diff --git a/arch/arm/mach-w90x900/cpu.h b/arch/arm/mach-w90x900/cpu.h
> index 4d58ba1..4493d4d 100644
> --- a/arch/arm/mach-w90x900/cpu.h
> +++ b/arch/arm/mach-w90x900/cpu.h
> @@ -15,6 +15,7 @@
> ?* published by the Free Software Foundation.
> ?*
> ?*/
> +#include "clock.h"
>
> ?#define IODESC_ENT(y) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> @@ -42,13 +43,15 @@
> ?#define NUC920_CPUID ? 0x02900920
> ?#define NUC950_CPUID ? 0x02900950
> ?#define NUC960_CPUID ? 0x02900960
> +#define NUC932_CPUID ? 0x29550091
>
> ?/* extern file from cpu.c */
>
> ?extern void nuc900_clock_source(struct device *dev, unsigned char *src);
> -extern void nuc900_init_clocks(void);
> +extern void nuc900_init_clocks(struct clk_lookup *clks, size_t num);
> ?extern void nuc900_map_io(struct map_desc *mach_desc, int mach_size);
> ?extern void nuc900_board_init(struct platform_device **device, int size);
> +extern void nuc932_dev_board_init(void);
>
> ?/* for either public between 910 and 920, or between 920 and 950 */
>
> diff --git a/arch/arm/mach-w90x900/dev_932.c b/arch/arm/mach-w90x900/dev_932.c
> new file mode 100644
> index 0000000..c2d2cef
> --- /dev/null
> +++ b/arch/arm/mach-w90x900/dev_932.c
> @@ -0,0 +1,44 @@
> +/*
> + * linux/arch/arm/mach-w90x900/dev_932.c
> + *
> + * Copyright (C) 2009 Nuvoton corporation.
> + *
> + * 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;version 2 of the License.
> + *
> + */
> +
> +#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 <mach/map.h>
> +
> +#include "cpu.h"
> +
> +/*Here should be your evb resourse,such as LCD*/
> +
> +static struct platform_device *nuc932_dev[] __initdata = {
> + ? ? ? &nuc900_serial_device,
> +};
> +
> +/* Provide adding specific CPU platform devices API */
> +
> +void __init nuc932_dev_board_init(void)
> +{
> + ? ? ? platform_add_devices(nuc932_dev, ARRAY_SIZE(nuc932_dev));
> +}
> +
> diff --git a/arch/arm/mach-w90x900/groupirq.c b/arch/arm/mach-w90x900/groupirq.c
> new file mode 100644
> index 0000000..b3a74db
> --- /dev/null
> +++ b/arch/arm/mach-w90x900/groupirq.c
> @@ -0,0 +1,140 @@
> +/*
> + * linux/arch/arm/mach-w90x900/groupirq.c
> + *
> + * 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;version 2 of the License.
> + *
> + */
> +
> +#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>
> +
> +struct group_irq {
> + ? ? ? unsigned long ? ? ? ? ? gpen;
> + ? ? ? unsigned int ? ? ? ? ? ?enabled;
> + ? ? ? void ? ? ? ? ? ? ? ? ? ?(*enable)(struct group_irq *, int enable);
> +};
> +
> +static DEFINE_SPINLOCK(groupirq_lock);
> +
> +#define DEFINE_GROUP(_name, _ctrlbit, _num) ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> +struct group_irq group_##_name = { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? .enable ? ? ? ? = nuc900_group_enable, ? ? ? ? ? ? ? ? ?\
> + ? ? ? ? ? ? ? .gpen ? ? ? ? ? = ((1 << _num) - 1) << _ctrlbit, ? ? ? ?\
> + ? ? ? }
> +
> +static void nuc900_group_enable(struct group_irq *gpirq, int enable);
> +
> +static DEFINE_GROUP(nirq0, 0, 4);
> +static DEFINE_GROUP(nirq1, 4, 4);
> +static DEFINE_GROUP(usbh, 8, 2);
> +static DEFINE_GROUP(ottimer, 16, 3);
> +static DEFINE_GROUP(gdma, 20, 2);
> +static DEFINE_GROUP(sc, 24, 2);
> +static DEFINE_GROUP(i2c, 26, 2);
> +static DEFINE_GROUP(ps2, 28, 2);
> +
> +static int group_irq_enable(struct group_irq *group_irq)
> +{
> + ? ? ? unsigned long flags;
> +
> + ? ? ? spin_lock_irqsave(&groupirq_lock, flags);
> + ? ? ? if (group_irq->enabled++ == 0)
> + ? ? ? ? ? ? ? (group_irq->enable)(group_irq, 1);
> + ? ? ? spin_unlock_irqrestore(&groupirq_lock, flags);
> +
> + ? ? ? return 0;
> +}
> +
> +static void group_irq_disable(struct group_irq *group_irq)
> +{
> + ? ? ? unsigned long flags;
> +
> + ? ? ? WARN_ON(group_irq->enabled == 0);
> +
> + ? ? ? spin_lock_irqsave(&groupirq_lock, flags);
> + ? ? ? if (--group_irq->enabled == 0)
> + ? ? ? ? ? ? ? (group_irq->enable)(group_irq, 0);
> + ? ? ? spin_unlock_irqrestore(&groupirq_lock, flags);
> +}
> +
> +static void nuc900_group_enable(struct group_irq *gpirq, int enable)
> +{
> + ? ? ? unsigned int groupen = gpirq->gpen;
> + ? ? ? unsigned long regval;
> +
> + ? ? ? regval = __raw_readl(REG_AIC_GEN);
> +
> + ? ? ? if (enable)
> + ? ? ? ? ? ? ? regval |= groupen;
> + ? ? ? else
> + ? ? ? ? ? ? ? regval &= ~groupen;
> +
> + ? ? ? __raw_writel(regval, REG_AIC_GEN);
> +}
> +
> +void nuc900_groupirq_mask(unsigned int irq, unsigned int mask)
> +{
> + ? ? ? struct group_irq *group_irq;
> +
> + ? ? ? group_irq = NULL;
> +
> + ? ? ? switch (irq) {
> + ? ? ? case IRQ_GROUP0:
> + ? ? ? ? ? ? ? group_irq = &group_nirq0;
> + ? ? ? ? ? ? ? break;
> +
> + ? ? ? case IRQ_GROUP1:
> + ? ? ? ? ? ? ? group_irq = &group_nirq1;
> + ? ? ? ? ? ? ? break;
> +
> + ? ? ? case IRQ_USBH:
> + ? ? ? ? ? ? ? group_irq = &group_usbh;
> + ? ? ? ? ? ? ? break;
> +
> + ? ? ? case IRQ_T_INT_GROUP:
> + ? ? ? ? ? ? ? group_irq = &group_ottimer;
> + ? ? ? ? ? ? ? break;
> +
> + ? ? ? case IRQ_GDMAGROUP:
> + ? ? ? ? ? ? ? group_irq = &group_gdma;
> + ? ? ? ? ? ? ? break;
> +
> + ? ? ? case IRQ_SCGROUP:
> + ? ? ? ? ? ? ? group_irq = &group_sc;
> + ? ? ? ? ? ? ? break;
> +
> + ? ? ? case IRQ_I2CGROUP:
> + ? ? ? ? ? ? ? group_irq = &group_i2c;
> + ? ? ? ? ? ? ? break;
> +
> + ? ? ? case IRQ_P2SGROUP:
> + ? ? ? ? ? ? ? group_irq = &group_ps2;
> + ? ? ? ? ? ? ? break;
> + ? ? ? }
> +
> + ? ? ? if (group_irq) {
> + ? ? ? ? ? ? ? if (mask)
> + ? ? ? ? ? ? ? ? ? ? ? group_irq_disable(group_irq);
> + ? ? ? ? ? ? ? else
> + ? ? ? ? ? ? ? ? ? ? ? group_irq_enable(group_irq);
> + ? ? ? }
> +}
> +
> diff --git a/arch/arm/mach-w90x900/groupirq.h b/arch/arm/mach-w90x900/groupirq.h
> new file mode 100644
> index 0000000..65fbd8c
> --- /dev/null
> +++ b/arch/arm/mach-w90x900/groupirq.h
> @@ -0,0 +1,16 @@
> +/*
> + * arch/arm/mach-w90x900/groupirq.h
> + *
> + * 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.
> + *
> + */
> +
> +extern void nuc900_groupirq_mask(unsigned int irq, unsigned int mask);
> diff --git a/arch/arm/mach-w90x900/include/mach/irqs.h b/arch/arm/mach-w90x900/include/mach/irqs.h
> index 9d5cba3..1cb105f 100644
> --- a/arch/arm/mach-w90x900/include/mach/irqs.h
> +++ b/arch/arm/mach-w90x900/include/mach/irqs.h
> @@ -28,6 +28,8 @@
>
> ?/* Main cpu interrupts */
>
> +#ifndef CONFIG_CPU_NUC932
> +
> ?#define IRQ_WDT ? ? ? ? ? ? ? ?W90X900_IRQ(1)
> ?#define IRQ_GROUP0 ? ? W90X900_IRQ(2)
> ?#define IRQ_GROUP1 ? ? W90X900_IRQ(3)
> @@ -83,4 +85,46 @@
> ?#define ? ? ? ?IRQ_GROUP1_IRQ6 0x00000040
> ?#define ? ? ? ?IRQ_GROUP1_IRQ7 0x00000080
>
> +#else
> +
> +#define IRQ_WDT ? ? ? ? ? ? ? ?W90X900_IRQ(1)
> +#define IRQ_IRQ0 ? ? ? W90X900_IRQ(2)
> +#define IRQ_IRQ1 ? ? ? W90X900_IRQ(3)
> +#define IRQ_IRQ2 ? ? ? W90X900_IRQ(4)
> +#define IRQ_IRQ3 ? ? ? W90X900_IRQ(5)
> +#define IRQ_USBH ? ? ? W90X900_IRQ(6)
> +#define IRQ_APU ? ? ? ? ? ? ? ?W90X900_IRQ(7)
> +#define IRQ_VPOST ? ? ?W90X900_IRQ(8)
> +#define IRQ_ADC ? ? ? ? ? ? ? ?W90X900_IRQ(9)
> +#define IRQ_UART0 ? ? ?W90X900_IRQ(10)
> +#define IRQ_TIMER0 ? ? W90X900_IRQ(11)
> +#define IRQ_GPU0 ? ? ? W90X900_IRQ(12)
> +#define IRQ_GPU1 ? ? ? W90X900_IRQ(13)
> +#define IRQ_GPU2 ? ? ? W90X900_IRQ(14)
> +#define IRQ_GPU3 ? ? ? W90X900_IRQ(15)
> +#define IRQ_GPU4 ? ? ? W90X900_IRQ(16)
> +#define IRQ_VIN ? ? ? ? ? ? ? ?W90X900_IRQ(17)
> +#define IRQ_USBD ? ? ? W90X900_IRQ(18)
> +#define IRQ_VRAMLD ? ? W90X900_IRQ(19)
> +#define IRQ_GDMA0 ? ? ?W90X900_IRQ(20)
> +#define IRQ_GDMA1 ? ? ?W90X900_IRQ(21)
> +#define IRQ_SDIO ? ? ? W90X900_IRQ(22)
> +#define IRQ_FMI ? ? ? ? ? ? ? ?W90X900_IRQ(22)
> +#define IRQ_JPEG ? ? ? W90X900_IRQ(23)
> +#define IRQ_SPI0 ? ? ? W90X900_IRQ(24)
> +#define IRQ_SPI1 ? ? ? W90X900_IRQ(25)
> +#define IRQ_RTC ? ? ? ? ? ? ? ?W90X900_IRQ(26)
> +#define IRQ_PWM0 ? ? ? W90X900_IRQ(27)
> +#define IRQ_PWM1 ? ? ? W90X900_IRQ(28)
> +#define IRQ_PWM2 ? ? ? W90X900_IRQ(29)
> +#define IRQ_PWM3 ? ? ? W90X900_IRQ(30)
> +#define IRQ_I2SAC97 ? ?W90X900_IRQ(31)
> +#define IRQ_CAP0 ? ? ? IRQ_PWM0
> +#define IRQ_CAP1 ? ? ? IRQ_PWM1
> +#define IRQ_CAP2 ? ? ? IRQ_PWM2
> +#define IRQ_CAP3 ? ? ? IRQ_PWM3
> +#define NR_IRQS ? ? ? ? ? ? ? ?(IRQ_I2SAC97 + 1)
> +
> +#endif
> +
> ?#endif /* __ASM_ARCH_IRQ_H */
> diff --git a/arch/arm/mach-w90x900/include/mach/map.h b/arch/arm/mach-w90x900/include/mach/map.h
> index 1a20953..33c548f 100644
> --- a/arch/arm/mach-w90x900/include/mach/map.h
> +++ b/arch/arm/mach-w90x900/include/mach/map.h
> @@ -16,142 +16,73 @@
> ?#ifndef __ASM_ARCH_MAP_H
> ?#define __ASM_ARCH_MAP_H
>
> -#ifndef __ASSEMBLY__
> -#define W90X900_ADDR(x) ? ? ? ? ? ? ? ?((void __iomem *)(0xF0000000 + (x)))
> +#ifdef CONFIG_CPU_NUC932
> +#include "reg_932.h"
> ?#else
> -#define W90X900_ADDR(x) ? ? ? ? ? ? ? ?(0xF0000000 + (x))
> +#include "reg_900.h"
> ?#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_VA_GCR ? ? ? ? W90X900_ADDR(W90X900_PA_IRQ)
> +#define W90X900_VA_CLKPWR ? ? ?(W90X900_VA_GCR+CLK_OFFSET)
> ?#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_VA_EBI ? ? ? ? W90X900_ADDR(W90X900_PA_EBI)
> ?#define W90X900_SZ_EBI ? ? ? ? SZ_4K
>
> ?/* UARTs */
> -#define W90X900_VA_UART ? ? ? ? ? ? ? ?W90X900_ADDR(0x08000000)
> -#define W90X900_PA_UART ? ? ? ? ? ? ? ?(0xB8000000)
> +#define W90X900_VA_UART ? ? ? ? ? ? ? ?W90X900_ADDR(W90X900_PA_UART)
> ?#define W90X900_SZ_UART ? ? ? ? ? ? ? ?SZ_4K
>
> ?/* Timers */
> -#define W90X900_VA_TIMER ? ? ? W90X900_ADDR(0x08001000)
> -#define W90X900_PA_TIMER ? ? ? (0xB8001000)
> +#define W90X900_VA_TIMER ? ? ? W90X900_ADDR(W90X900_PA_TIMER)
> ?#define W90X900_SZ_TIMER ? ? ? SZ_4K
>
> ?/* GPIO ports */
> -#define W90X900_VA_GPIO ? ? ? ? ? ? ? ?W90X900_ADDR(0x08003000)
> -#define W90X900_PA_GPIO ? ? ? ? ? ? ? ?(0xB8003000)
> +#define W90X900_VA_GPIO ? ? ? ? ? ? ? ?W90X900_ADDR(W90X900_PA_GPIO)
> ?#define W90X900_SZ_GPIO ? ? ? ? ? ? ? ?SZ_4K
>
> ?/* GDMA control */
> -#define W90X900_VA_GDMA ? ? ? ? ? ? ? ?W90X900_ADDR(0x00004000)
> -#define W90X900_PA_GDMA ? ? ? ? ? ? ? ?(0xB0004000)
> +#define W90X900_VA_GDMA ? ? ? ? ? ? ? ?W90X900_ADDR(W90X900_PA_GDMA)
> ?#define W90X900_SZ_GDMA ? ? ? ? ? ? ? ?SZ_4K
>
> -/* USB host controller*/
> -#define W90X900_VA_USBEHCIHOST W90X900_ADDR(0x00005000)
> -#define W90X900_PA_USBEHCIHOST (0xB0005000)
> -#define W90X900_SZ_USBEHCIHOST SZ_4K
> -
> -#define W90X900_VA_USBOHCIHOST W90X900_ADDR(0x00007000)
> -#define W90X900_PA_USBOHCIHOST (0xB0007000)
> -#define W90X900_SZ_USBOHCIHOST SZ_4K
> -
> ?/* I2C hardware controller */
> -#define W90X900_VA_I2C ? ? ? ? W90X900_ADDR(0x08006000)
> -#define W90X900_PA_I2C ? ? ? ? (0xB8006000)
> +#define W90X900_VA_I2C ? ? ? ? W90X900_ADDR(W90X900_PA_I2C)
> ?#define W90X900_SZ_I2C ? ? ? ? SZ_4K
>
> -/* Keypad Interface*/
> -#define W90X900_VA_KPI ? ? ? ? W90X900_ADDR(0x08008000)
> -#define W90X900_PA_KPI ? ? ? ? (0xB8008000)
> -#define W90X900_SZ_KPI ? ? ? ? SZ_4K
> -
> -/* Smart card host*/
> -#define W90X900_VA_SC ? ? ? ? ?W90X900_ADDR(0x08005000)
> -#define W90X900_PA_SC ? ? ? ? ?(0xB8005000)
> -#define W90X900_SZ_SC ? ? ? ? ?SZ_4K
> -
> ?/* LCD controller*/
> -#define W90X900_VA_LCD ? ? ? ? W90X900_ADDR(0x00008000)
> -#define W90X900_PA_LCD ? ? ? ? (0xB0008000)
> +#define W90X900_VA_LCD ? ? ? ? W90X900_ADDR(W90X900_PA_LCD)
> ?#define W90X900_SZ_LCD ? ? ? ? SZ_4K
>
> ?/* 2D controller*/
> -#define W90X900_VA_GE ? ? ? ? ?W90X900_ADDR(0x0000B000)
> -#define W90X900_PA_GE ? ? ? ? ?(0xB000B000)
> +#define W90X900_VA_GE ? ? ? ? ?W90X900_ADDR(W90X900_PA_GE)
> ?#define W90X900_SZ_GE ? ? ? ? ?SZ_4K
>
> -/* ATAPI */
> -#define W90X900_VA_ATAPI ? ? ? W90X900_ADDR(0x0000A000)
> -#define W90X900_PA_ATAPI ? ? ? (0xB000A000)
> -#define W90X900_SZ_ATAPI ? ? ? SZ_4K
> -
> ?/* ADC */
> -#define W90X900_VA_ADC ? ? ? ? W90X900_ADDR(0x0800A000)
> -#define W90X900_PA_ADC ? ? ? ? (0xB800A000)
> +#define W90X900_VA_ADC ? ? ? ? W90X900_ADDR(W90X900_PA_ADC)
> ?#define W90X900_SZ_ADC ? ? ? ? SZ_4K
>
> -/* PS2 Interface*/
> -#define W90X900_VA_PS2 ? ? ? ? W90X900_ADDR(0x08009000)
> -#define W90X900_PA_PS2 ? ? ? ? (0xB8009000)
> -#define W90X900_SZ_PS2 ? ? ? ? SZ_4K
> -
> ?/* RTC */
> -#define W90X900_VA_RTC ? ? ? ? W90X900_ADDR(0x08004000)
> -#define W90X900_PA_RTC ? ? ? ? (0xB8004000)
> +#define W90X900_VA_RTC ? ? ? ? W90X900_ADDR(W90X900_PA_RTC)
> ?#define W90X900_SZ_RTC ? ? ? ? SZ_4K
>
> ?/* Pulse Width Modulation(PWM) Registers */
> -#define W90X900_VA_PWM ? ? ? ? W90X900_ADDR(0x08007000)
> -#define W90X900_PA_PWM ? ? ? ? (0xB8007000)
> +#define W90X900_VA_PWM ? ? ? ? W90X900_ADDR(W90X900_PA_PWM)
> ?#define W90X900_SZ_PWM ? ? ? ? SZ_4K
>
> ?/* Audio Controller controller */
> -#define W90X900_VA_ACTL ? ? ? ? ? ? ? ?W90X900_ADDR(0x00009000)
> -#define W90X900_PA_ACTL ? ? ? ? ? ? ? ?(0xB0009000)
> +#define W90X900_VA_ACTL ? ? ? ? ? ? ? ?W90X900_ADDR(W90X900_PA_ACTL)
> ?#define W90X900_SZ_ACTL ? ? ? ? ? ? ? ?SZ_4K
>
> -/* DMA controller */
> -#define W90X900_VA_DMA ? ? ? ? W90X900_ADDR(0x0000c000)
> -#define W90X900_PA_DMA ? ? ? ? (0xB000c000)
> -#define W90X900_SZ_DMA ? ? ? ? SZ_4K
> -
> -/* FMI controller */
> -#define W90X900_VA_FMI ? ? ? ? W90X900_ADDR(0x0000d000)
> -#define W90X900_PA_FMI ? ? ? ? (0xB000d000)
> -#define W90X900_SZ_FMI ? ? ? ? SZ_4K
> -
> ?/* USB Device port */
> -#define W90X900_VA_USBDEV ? ? ?W90X900_ADDR(0x00006000)
> -#define W90X900_PA_USBDEV ? ? ?(0xB0006000)
> +#define W90X900_VA_USBDEV ? ? ?W90X900_ADDR(W90X900_PA_USBDEV)
> ?#define W90X900_SZ_USBDEV ? ? ?SZ_4K
>
> -/* External MAC control*/
> -#define W90X900_VA_EMC ? ? ? ? W90X900_ADDR(0x00003000)
> -#define W90X900_PA_EMC ? ? ? ? (0xB0003000)
> -#define W90X900_SZ_EMC ? ? ? ? SZ_4K
> -
> ?#endif /* __ASM_ARCH_MAP_H */
> diff --git a/arch/arm/mach-w90x900/include/mach/reg_900.h b/arch/arm/mach-w90x900/include/mach/reg_900.h
> new file mode 100644
> index 0000000..5a07224
> --- /dev/null
> +++ b/arch/arm/mach-w90x900/include/mach/reg_900.h
> @@ -0,0 +1,93 @@
> +/*
> + * arch/arm/mach-w90x900/include/mach/reg_900.h
> + *
> + * Copyright (c) 2008 Nuvoton technology corporation.
> + *
> + * 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;version 2 of the License.
> + *
> + */
> +
> +#ifndef __ASM_ARCH_REG_H
> +#define __ASM_ARCH_REG_H
> +
> +/*
> + * interrupt controller is the first thing we put in, to make
> + * the assembly code for the irq detection easier
> + */
> +
> +#define MAP_OFFSET ? ? (0xB0000000)
> +#define CLK_OFFSET ? ? (0x200)
> +
> +#ifndef __ASSEMBLY__
> +#define W90X900_ADDR(x) ? ? ? ?((void __iomem *)(0xF0000000 + ((x)&(~MAP_OFFSET))))
> +#else
> +#define W90X900_ADDR(x) ? ? ? ?(0xF0000000 + ((x)&(~MAP_OFFSET)))
> +#endif
> +
> +#define W90X900_PA_IRQ ? ? ? ? (0xB8002000)
> +#define W90X900_PA_GCR ? ? ? ? (0xB0000000)
> +#define W90X900_PA_CLKPWR ? ? ?(0xB0000200)
> +#define W90X900_PA_EBI ? ? ? ? (0xB0001000)
> +#define W90X900_PA_UART ? ? ? ? ? ? ? ?(0xB8000000)
> +#define W90X900_PA_TIMER ? ? ? (0xB8001000)
> +#define W90X900_PA_GPIO ? ? ? ? ? ? ? ?(0xB8003000)
> +#define W90X900_PA_GDMA ? ? ? ? ? ? ? ?(0xB0004000)
> +#define W90X900_PA_USBEHCIHOST (0xB0005000)
> +#define W90X900_PA_USBOHCIHOST (0xB0007000)
> +#define W90X900_PA_I2C ? ? ? ? (0xB8006000)
> +#define W90X900_PA_KPI ? ? ? ? (0xB8008000)
> +#define W90X900_PA_SC ? ? ? ? ?(0xB8005000)
> +#define W90X900_PA_LCD ? ? ? ? (0xB0008000)
> +#define W90X900_PA_GE ? ? ? ? ?(0xB000B000)
> +#define W90X900_PA_ATAPI ? ? ? (0xB000A000)
> +#define W90X900_PA_ADC ? ? ? ? (0xB800A000)
> +#define W90X900_PA_PS2 ? ? ? ? (0xB8009000)
> +#define W90X900_PA_RTC ? ? ? ? (0xB8004000)
> +#define W90X900_PA_PWM ? ? ? ? (0xB8007000)
> +#define W90X900_PA_ACTL ? ? ? ? ? ? ? ?(0xB0009000)
> +#define W90X900_PA_DMA ? ? ? ? (0xB000c000)
> +#define W90X900_PA_FMI ? ? ? ? (0xB000d000)
> +#define W90X900_PA_USBDEV ? ? ?(0xB0006000)
> +#define W90X900_PA_EMC ? ? ? ? (0xB0003000)
> +
> +
> +/* USB host controller*/
> +#define W90X900_VA_USBEHCIHOST W90X900_ADDR(W90X900_PA_USBEHCIHOST)
> +#define W90X900_SZ_USBEHCIHOST SZ_4K
> +
> +#define W90X900_VA_USBOHCIHOST W90X900_ADDR(W90X900_PA_USBOHCIHOST)
> +#define W90X900_SZ_USBOHCIHOST SZ_4K
> +
> +/* Keypad Interface*/
> +#define W90X900_VA_KPI ? ? ? ? W90X900_ADDR(W90X900_PA_KPI)
> +#define W90X900_SZ_KPI ? ? ? ? SZ_4K
> +
> +/* Smart card host*/
> +#define W90X900_VA_SC ? ? ? ? ?W90X900_ADDR(W90X900_PA_SC)
> +#define W90X900_SZ_SC ? ? ? ? ?SZ_4K
> +
> +/* ATAPI */
> +#define W90X900_VA_ATAPI ? ? ? W90X900_ADDR(W90X900_PA_ATAPI)
> +#define W90X900_SZ_ATAPI ? ? ? SZ_4K
> +
> +/* PS2 Interface*/
> +#define W90X900_VA_PS2 ? ? ? ? W90X900_ADDR(W90X900_PA_PS2)
> +#define W90X900_SZ_PS2 ? ? ? ? SZ_4K
> +
> +/* DMA controller */
> +#define W90X900_VA_DMA ? ? ? ? W90X900_ADDR(W90X900_PA_DMA)
> +#define W90X900_SZ_DMA ? ? ? ? SZ_4K
> +
> +/* FMI controller */
> +#define W90X900_VA_FMI ? ? ? ? W90X900_ADDR(W90X900_PA_FMI)
> +#define W90X900_SZ_FMI ? ? ? ? SZ_4K
> +
> +/* External MAC control*/
> +#define W90X900_VA_EMC ? ? ? ? W90X900_ADDR(W90X900_PA_EMC)
> +#define W90X900_SZ_EMC ? ? ? ? SZ_4K
> +
> +#endif /* __ASM_ARCH_REG_H */
> diff --git a/arch/arm/mach-w90x900/include/mach/reg_932.h b/arch/arm/mach-w90x900/include/mach/reg_932.h
> new file mode 100644
> index 0000000..3ac5a0d
> --- /dev/null
> +++ b/arch/arm/mach-w90x900/include/mach/reg_932.h
> @@ -0,0 +1,57 @@
> +/*
> + * arch/arm/mach-w90x900/include/mach/reg_932.h
> + *
> + * Copyright (c) 2008 Nuvoton technology corporation.
> + *
> + * 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;version 2 of the License.
> + *
> + */
> +
> +#ifndef __ASM_ARCH_REG_H
> +#define __ASM_ARCH_REG_H
> +
> +#define MAP_OFFSET ? ? (0xfff00000)
> +#define CLK_OFFSET ? ? (0x10)
> +
> +#ifndef __ASSEMBLY__
> +#define W90X900_ADDR(x) ? ? ? ?((void __iomem *)(0xF0000000 + ((x)&(~MAP_OFFSET))))
> +#else
> +#define W90X900_ADDR(x) ? ? ? ?(0xF0000000 + ((x)&(~MAP_OFFSET)))
> +#endif
> +
> +#define W90X900_PA_IRQ ? ? ? ? (0xFFF83000)
> +#define W90X900_PA_GCR ? ? ? ? (0xFFF00000)
> +#define W90X900_PA_EBI ? ? ? ? (0xFFF01000)
> +#define W90X900_PA_UART ? ? ? ? ? ? ? ?(0xFFF80000)
> +#define W90X900_PA_TIMER ? ? ? (0xFFF81000)
> +#define W90X900_PA_GPIO ? ? ? ? ? ? ? ?(0xFFF84000)
> +#define W90X900_PA_GDMA ? ? ? ? ? ? ? ?(0xFFF03000)
> +#define W90X900_PA_USBHOST ? ? (0xFFF0d000)
> +#define W90X900_PA_I2C ? ? ? ? (0xFFF89000)
> +#define W90X900_PA_LCD ? ? ? ? (0xFFF06000)
> +#define W90X900_PA_GE ? ? ? ? ?(0xFFF05000)
> +#define W90X900_PA_ADC ? ? ? ? (0xFFF85000)
> +#define W90X900_PA_RTC ? ? ? ? (0xFFF87000)
> +#define W90X900_PA_PWM ? ? ? ? (0xFFF82000)
> +#define W90X900_PA_ACTL ? ? ? ? ? ? ? ?(0xFFF0a000)
> +#define W90X900_PA_USBDEV ? ? ?(0xFFF0C000)
> +#define W90X900_PA_JEPEG ? ? ? (0xFFF0e000)
> +#define W90X900_PA_CACHE_T ? ? (0xFFF60000)
> +#define W90X900_PA_VRAM ? ? ? ? ? ? ? ?(0xFFF0b000)
> +#define W90X900_PA_DMAC ? ? ? ? ? ? ? ?(0xFFF09000)
> +#define W90X900_PA_I2SM ? ? ? ? ? ? ? ?(0xFFF08000)
> +#define W90X900_PA_CACHE ? ? ? (0xFFF02000)
> +#define W90X900_PA_GPU ? ? ? ? (0xFFF04000)
> +#define W90X900_PA_VIDEOIN ? ? (0xFFF07000)
> +#define W90X900_PA_SPI0 ? ? ? ? ? ? ? ?(0xFFF86000)
> +#define W90X900_PA_SPI1 ? ? ? ? ? ? ? ?(0xFFF88000)
> +
> +/* USB host controller*/
> +#define W90X900_VA_USBHOST ? ? W90X900_ADDR(W90X900_PA_USBHOST)
> +#define W90X900_SZ_USBHOST ? ? SZ_4K
> +
> +#endif /* __ASM_ARCH_REG_H */
> diff --git a/arch/arm/mach-w90x900/irq.c b/arch/arm/mach-w90x900/irq.c
> index 0ce9d8e..5444a27 100644
> --- a/arch/arm/mach-w90x900/irq.c
> +++ b/arch/arm/mach-w90x900/irq.c
> @@ -27,70 +27,7 @@
>
> ?#include <mach/hardware.h>
> ?#include <mach/regs-irq.h>
> -
> -struct group_irq {
> - ? ? ? unsigned long ? ? ? ? ? gpen;
> - ? ? ? unsigned int ? ? ? ? ? ?enabled;
> - ? ? ? void ? ? ? ? ? ? ? ? ? ?(*enable)(struct group_irq *, int enable);
> -};
> -
> -static DEFINE_SPINLOCK(groupirq_lock);
> -
> -#define DEFINE_GROUP(_name, _ctrlbit, _num) ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> -struct group_irq group_##_name = { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> - ? ? ? ? ? ? ? .enable ? ? ? ? = nuc900_group_enable, ? ? ? ? ? ? ? ? ?\
> - ? ? ? ? ? ? ? .gpen ? ? ? ? ? = ((1 << _num) - 1) << _ctrlbit, ? ? ? ?\
> - ? ? ? }
> -
> -static void nuc900_group_enable(struct group_irq *gpirq, int enable);
> -
> -static DEFINE_GROUP(nirq0, 0, 4);
> -static DEFINE_GROUP(nirq1, 4, 4);
> -static DEFINE_GROUP(usbh, 8, 2);
> -static DEFINE_GROUP(ottimer, 16, 3);
> -static DEFINE_GROUP(gdma, 20, 2);
> -static DEFINE_GROUP(sc, 24, 2);
> -static DEFINE_GROUP(i2c, 26, 2);
> -static DEFINE_GROUP(ps2, 28, 2);
> -
> -static int group_irq_enable(struct group_irq *group_irq)
> -{
> - ? ? ? unsigned long flags;
> -
> - ? ? ? spin_lock_irqsave(&groupirq_lock, flags);
> - ? ? ? if (group_irq->enabled++ == 0)
> - ? ? ? ? ? ? ? (group_irq->enable)(group_irq, 1);
> - ? ? ? spin_unlock_irqrestore(&groupirq_lock, flags);
> -
> - ? ? ? return 0;
> -}
> -
> -static void group_irq_disable(struct group_irq *group_irq)
> -{
> - ? ? ? unsigned long flags;
> -
> - ? ? ? WARN_ON(group_irq->enabled == 0);
> -
> - ? ? ? spin_lock_irqsave(&groupirq_lock, flags);
> - ? ? ? if (--group_irq->enabled == 0)
> - ? ? ? ? ? ? ? (group_irq->enable)(group_irq, 0);
> - ? ? ? spin_unlock_irqrestore(&groupirq_lock, flags);
> -}
> -
> -static void nuc900_group_enable(struct group_irq *gpirq, int enable)
> -{
> - ? ? ? unsigned int groupen = gpirq->gpen;
> - ? ? ? unsigned long regval;
> -
> - ? ? ? regval = __raw_readl(REG_AIC_GEN);
> -
> - ? ? ? if (enable)
> - ? ? ? ? ? ? ? regval |= groupen;
> - ? ? ? else
> - ? ? ? ? ? ? ? regval &= ~groupen;
> -
> - ? ? ? __raw_writel(regval, REG_AIC_GEN);
> -}
> +#include "groupirq.h"
>
> ?static void nuc900_irq_mask(unsigned int irq)
> ?{
> @@ -100,42 +37,7 @@ static void nuc900_irq_mask(unsigned int irq)
>
> ? ? ? ?__raw_writel(1 << irq, REG_AIC_MDCR);
>
> - ? ? ? switch (irq) {
> - ? ? ? case IRQ_GROUP0:
> - ? ? ? ? ? ? ? group_irq = &group_nirq0;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_GROUP1:
> - ? ? ? ? ? ? ? group_irq = &group_nirq1;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_USBH:
> - ? ? ? ? ? ? ? group_irq = &group_usbh;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_T_INT_GROUP:
> - ? ? ? ? ? ? ? group_irq = &group_ottimer;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_GDMAGROUP:
> - ? ? ? ? ? ? ? group_irq = &group_gdma;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_SCGROUP:
> - ? ? ? ? ? ? ? group_irq = &group_sc;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_I2CGROUP:
> - ? ? ? ? ? ? ? group_irq = &group_i2c;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_P2SGROUP:
> - ? ? ? ? ? ? ? group_irq = &group_ps2;
> - ? ? ? ? ? ? ? break;
> - ? ? ? }
> -
> - ? ? ? if (group_irq)
> - ? ? ? ? ? ? ? group_irq_disable(group_irq);
> + ? ? ? nuc900_groupirq_mask(irq, 1);
> ?}
>
> ?/*
> @@ -156,42 +58,7 @@ static void nuc900_irq_unmask(unsigned int irq)
>
> ? ? ? ?__raw_writel(1 << irq, REG_AIC_MECR);
>
> - ? ? ? switch (irq) {
> - ? ? ? case IRQ_GROUP0:
> - ? ? ? ? ? ? ? group_irq = &group_nirq0;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_GROUP1:
> - ? ? ? ? ? ? ? group_irq = &group_nirq1;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_USBH:
> - ? ? ? ? ? ? ? group_irq = &group_usbh;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_T_INT_GROUP:
> - ? ? ? ? ? ? ? group_irq = &group_ottimer;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_GDMAGROUP:
> - ? ? ? ? ? ? ? group_irq = &group_gdma;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_SCGROUP:
> - ? ? ? ? ? ? ? group_irq = &group_sc;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_I2CGROUP:
> - ? ? ? ? ? ? ? group_irq = &group_i2c;
> - ? ? ? ? ? ? ? break;
> -
> - ? ? ? case IRQ_P2SGROUP:
> - ? ? ? ? ? ? ? group_irq = &group_ps2;
> - ? ? ? ? ? ? ? break;
> - ? ? ? }
> -
> - ? ? ? if (group_irq)
> - ? ? ? ? ? ? ? group_irq_enable(group_irq);
> + ? ? ? nuc900_groupirq_mask(irq, 0);
> ?}
>
> ?static struct irq_chip nuc900_irq_chip = {
> diff --git a/arch/arm/mach-w90x900/mach-nuc932evb.c b/arch/arm/mach-w90x900/mach-nuc932evb.c
> new file mode 100644
> index 0000000..bcc67d2
> --- /dev/null
> +++ b/arch/arm/mach-w90x900/mach-nuc932evb.c
> @@ -0,0 +1,42 @@
> +/*
> + * linux/arch/arm/mach-w90x900/mach-nuc932evb.c
> + *
> + * Copyright (C) 2009 Nuvoton technology corporation.
> + *
> + * 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;version 2 of the License.
> + *
> + */
> +
> +#include <linux/platform_device.h>
> +#include <asm/mach/arch.h>
> +#include <asm/mach/map.h>
> +#include <asm/mach-types.h>
> +#include <mach/map.h>
> +
> +#include "nuc932.h"
> +
> +static void __init nuc932evb_map_io(void)
> +{
> + ? ? ? nuc932_map_io();
> + ? ? ? nuc932_init_clocks();
> +}
> +
> +static void __init nuc932evb_init(void)
> +{
> + ? ? ? nuc932_board_init();
> +}
> +
> +MACHINE_START(NUC932EVB, "NUC932EVB")
> + ? ? ? /* Maintainer: Wan ZongShun */
> + ? ? ? .phys_io ? ? ? ?= W90X900_PA_UART,
> + ? ? ? .io_pg_offst ? ?= (((u32)W90X900_VA_UART) >> 18) & 0xfffc,
> + ? ? ? .boot_params ? ?= 0,
> + ? ? ? .map_io ? ? ? ? = nuc932evb_map_io,
> + ? ? ? .init_irq ? ? ? = nuc900_init_irq,
> + ? ? ? .init_machine ? = nuc932evb_init,
> + ? ? ? .timer ? ? ? ? ?= &nuc900_timer,
> +MACHINE_END
> diff --git a/arch/arm/mach-w90x900/nuc910.c b/arch/arm/mach-w90x900/nuc910.c
> index 656f03b..85d358f 100644
> --- a/arch/arm/mach-w90x900/nuc910.c
> +++ b/arch/arm/mach-w90x900/nuc910.c
> @@ -19,7 +19,6 @@
> ?#include <asm/mach/map.h>
> ?#include <mach/hardware.h>
> ?#include "cpu.h"
> -#include "clock.h"
>
> ?/* define specific CPU platform device */
>
> @@ -49,7 +48,7 @@ void __init nuc910_map_io(void)
>
> ?void __init nuc910_init_clocks(void)
> ?{
> - ? ? ? nuc900_init_clocks();
> + ? ? ? nuc900_init_clocks(NULL, (size_t)NULL);
> ?}
>
> ?/*Init NUC910 board info*/
> diff --git a/arch/arm/mach-w90x900/nuc932.c b/arch/arm/mach-w90x900/nuc932.c
> new file mode 100644
> index 0000000..6ad68aa
> --- /dev/null
> +++ b/arch/arm/mach-w90x900/nuc932.c
> @@ -0,0 +1,54 @@
> +/*
> + * linux/arch/arm/mach-w90x900/nuc932.c
> + *
> + * Copyright (c) 2009 Nuvoton technology corporation.
> + *
> + * Wan ZongShun <mcuos.com@gmail.com>
> + *
> + * NUC932 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;version 2 of the License.
> + *
> + */
> +
> +#include <linux/platform_device.h>
> +#include <asm/mach/map.h>
> +#include <mach/hardware.h>
> +#include "cpu.h"
> +
> +static struct clk_lookup nuc932_clkregs[] = {
> +};
> +
> +/* define specific CPU platform io map */
> +
> +static struct map_desc nuc932evb_iodesc[] __initdata = {
> +};
> +
> +/*Init NUC932 evb io*/
> +
> +void __init nuc932_map_io(void)
> +{
> + ? ? ? nuc900_map_io(nuc932evb_iodesc, ARRAY_SIZE(nuc932evb_iodesc));
> +}
> +
> +/*Init NUC932 clock*/
> +
> +void __init nuc932_init_clocks(void)
> +{
> + ? ? ? nuc900_init_clocks(nuc932_clkregs, ARRAY_SIZE(nuc932_clkregs));
> +}
> +
> +/*Init NUC932 board info*/
> +
> +void __init nuc932_board_init(void)
> +{
> + ? ? ? nuc932_dev_board_init();
> +}
> +
> +/*NUC932 group irq api*/
> +void nuc900_groupirq_mask(unsigned int irq, unsigned int mask)
> +{
> +}
> +
> diff --git a/arch/arm/mach-w90x900/nuc932.h b/arch/arm/mach-w90x900/nuc932.h
> new file mode 100644
> index 0000000..4cf1182
> --- /dev/null
> +++ b/arch/arm/mach-w90x900/nuc932.h
> @@ -0,0 +1,28 @@
> +/*
> + * arch/arm/mach-w90x900/nuc932.h
> + *
> + * Copyright (c) 2008 Nuvoton corporation
> + *
> + * Header file for NUC900 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.
> + *
> + */
> +
> +struct map_desc;
> +struct sys_timer;
> +
> +/* core initialisation functions */
> +
> +extern void nuc900_init_irq(void);
> +extern struct sys_timer nuc900_timer;
> +
> +/* extern file from nuc932.c */
> +
> +extern void nuc932_board_init(void);
> +extern void nuc932_init_clocks(void);
> +extern void nuc932_map_io(void);
> diff --git a/arch/arm/mach-w90x900/nuc950.c b/arch/arm/mach-w90x900/nuc950.c
> index 1495081..9a4bc34 100644
> --- a/arch/arm/mach-w90x900/nuc950.c
> +++ b/arch/arm/mach-w90x900/nuc950.c
> @@ -43,7 +43,7 @@ void __init nuc950_map_io(void)
>
> ?void __init nuc950_init_clocks(void)
> ?{
> - ? ? ? nuc900_init_clocks();
> + ? ? ? nuc900_init_clocks(NULL, (size_t)NULL);
> ?}
>
> ?/*Init NUC950 board info*/
> diff --git a/arch/arm/mach-w90x900/nuc960.c b/arch/arm/mach-w90x900/nuc960.c
> index 8851a3a..e523866 100644
> --- a/arch/arm/mach-w90x900/nuc960.c
> +++ b/arch/arm/mach-w90x900/nuc960.c
> @@ -43,7 +43,7 @@ void __init nuc960_map_io(void)
>
> ?void __init nuc960_init_clocks(void)
> ?{
> - ? ? ? nuc900_init_clocks();
> + ? ? ? nuc900_init_clocks(NULL, (size_t)NULL);
> ?}
>
> ?/*Init NUC960 board info*/
> diff --git a/arch/arm/mach-w90x900/time.c b/arch/arm/mach-w90x900/time.c
> index 4128af8..34d8532 100644
> --- a/arch/arm/mach-w90x900/time.c
> +++ b/arch/arm/mach-w90x900/time.c
> @@ -33,16 +33,7 @@
> ?#include <mach/map.h>
> ?#include <mach/regs-timer.h>
>
> -#define RESETINT ? ? ? 0x1f
> -#define PERIOD ? ? ? ? (0x01 << 27)
> -#define ONESHOT ? ? ? ? ? ? ? ?(0x00 << 27)
> -#define COUNTEN ? ? ? ? ? ? ? ?(0x01 << 30)
> -#define INTEN ? ? ? ? ?(0x01 << 29)
> -
> -#define TICKS_PER_SEC ?100
> -#define PRESCALE ? ? ? 0x63 /* Divider = prescale + 1 */
> -
> -unsigned int timer0_load;
> +#include "time.h"
>
> ?static void nuc900_clockevent_setmode(enum clock_event_mode mode,
> ? ? ? ? ? ? ? ?struct clock_event_device *clk)
> @@ -86,7 +77,7 @@ static int nuc900_clockevent_setnextevent(unsigned long evt,
> ?}
>
> ?static struct clock_event_device nuc900_clockevent_device = {
> - ? ? ? .name ? ? ? ? ? = "nuc900-timer0",
> + ? ? ? .name ? ? ? ? ? = TIME0NAME,
> ? ? ? ?.shift ? ? ? ? ?= 32,
> ? ? ? ?.features ? ? ? = CLOCK_EVT_MODE_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
> ? ? ? ?.set_mode ? ? ? = nuc900_clockevent_setmode,
> @@ -107,12 +98,12 @@ static irqreturn_t nuc900_timer0_interrupt(int irq, void *dev_id)
> ?}
>
> ?static struct irqaction nuc900_timer0_irq = {
> - ? ? ? .name ? ? ? ? ? = "nuc900-timer0",
> + ? ? ? .name ? ? ? ? ? = TIME0NAME,
> ? ? ? ?.flags ? ? ? ? ?= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
> ? ? ? ?.handler ? ? ? ?= nuc900_timer0_interrupt,
> ?};
>
> -static void __init nuc900_clockevents_init(unsigned int rate)
> +static void nuc900_clockevents_init(unsigned int rate)
> ?{
> ? ? ? ?nuc900_clockevent_device.mult = div_sc(rate, NSEC_PER_SEC,
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?nuc900_clockevent_device.shift);
> @@ -125,58 +116,8 @@ static void __init nuc900_clockevents_init(unsigned int rate)
> ? ? ? ?clockevents_register_device(&nuc900_clockevent_device);
> ?}
>
> -static cycle_t nuc900_get_cycles(struct clocksource *cs)
> +void nuc900_timer_init_clockevents(unsigned int rate)
> ?{
> - ? ? ? return ~__raw_readl(REG_TDR1);
> -}
> -
> -static struct clocksource clocksource_nuc900 = {
> - ? ? ? .name ? = "nuc900-timer1",
> - ? ? ? .rating = 200,
> - ? ? ? .read ? = nuc900_get_cycles,
> - ? ? ? .mask ? = CLOCKSOURCE_MASK(32),
> - ? ? ? .shift ?= 20,
> - ? ? ? .flags ?= CLOCK_SOURCE_IS_CONTINUOUS,
> -};
> -
> -static void __init nuc900_clocksource_init(unsigned int rate)
> -{
> - ? ? ? unsigned int val;
> -
> - ? ? ? __raw_writel(0xffffffff, REG_TICR1);
> -
> - ? ? ? val = __raw_readl(REG_TCSR1);
> - ? ? ? val |= (COUNTEN | PERIOD);
> - ? ? ? __raw_writel(val, REG_TCSR1);
> -
> - ? ? ? clocksource_nuc900.mult =
> - ? ? ? ? ? ? ? clocksource_khz2mult((rate / 1000), clocksource_nuc900.shift);
> - ? ? ? clocksource_register(&clocksource_nuc900);
> -}
> -
> -static void __init nuc900_timer_init(void)
> -{
> - ? ? ? struct clk *ck_ext = clk_get(NULL, "ext");
> - ? ? ? unsigned int ? ?rate;
> -
> - ? ? ? BUG_ON(IS_ERR(ck_ext));
> -
> - ? ? ? rate = clk_get_rate(ck_ext);
> - ? ? ? clk_put(ck_ext);
> - ? ? ? rate = rate / (PRESCALE + 0x01);
> -
> - ? ? ? ?/* set a known state */
> - ? ? ? __raw_writel(0x00, REG_TCSR0);
> - ? ? ? __raw_writel(0x00, REG_TCSR1);
> - ? ? ? __raw_writel(RESETINT, REG_TISR);
> - ? ? ? timer0_load = (rate / TICKS_PER_SEC);
> -
> ? ? ? ?setup_irq(IRQ_TIMER0, &nuc900_timer0_irq);
> -
> - ? ? ? nuc900_clocksource_init(rate);
> ? ? ? ?nuc900_clockevents_init(rate);
> ?}
> -
> -struct sys_timer nuc900_timer = {
> - ? ? ? .init ? ? ? ? ? = nuc900_timer_init,
> -};
> diff --git a/arch/arm/mach-w90x900/time.h b/arch/arm/mach-w90x900/time.h
> new file mode 100644
> index 0000000..cb52f34
> --- /dev/null
> +++ b/arch/arm/mach-w90x900/time.h
> @@ -0,0 +1,33 @@
> +/*
> + * arch/arm/mach-w90x900/time.h
> + *
> + * 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.
> + *
> + */
> +#ifndef CONFIG_CPU_NUC932
> +#define TIME0NAME ? ? ?"nuc900-timer0"
> +#define RESETINT ? ? ? 0x1f
> +#else
> +#define TIME0NAME ? ? ?"nuc932-timer0"
> +#define RESETINT ? ? ? 0x01
> +#endif
> +
> +#define PERIOD ? ? ? ? (0x01 << 27)
> +#define ONESHOT ? ? ? ? ? ? ? ?(0x00 << 27)
> +#define COUNTEN ? ? ? ? ? ? ? ?(0x01 << 30)
> +#define INTEN ? ? ? ? ?(0x01 << 29)
> +
> +#define TICKS_PER_SEC ?100
> +#define PRESCALE ? ? ? 0x63 /* Divider = prescale + 1 */
> +
> +static unsigned int timer0_load;
> +extern void nuc900_timer_init_clockevents(unsigned int rate);
> +
> diff --git a/arch/arm/mach-w90x900/time_900.c b/arch/arm/mach-w90x900/time_900.c
> new file mode 100644
> index 0000000..d01c660
> --- /dev/null
> +++ b/arch/arm/mach-w90x900/time_900.c
> @@ -0,0 +1,90 @@
> +/*
> + * linux/arch/arm/mach-w90x900/time.c
> + *
> + * Based on linux/arch/arm/plat-s3c24xx/time.c by Ben Dooks
> + *
> + * Copyright (c) 2009 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 <linux/clocksource.h>
> +#include <linux/clockchips.h>
> +
> +#include <asm/mach-types.h>
> +#include <asm/mach/irq.h>
> +#include <asm/mach/time.h>
> +
> +#include <mach/map.h>
> +#include <mach/regs-timer.h>
> +
> +#include "time.h"
> +
> +static cycle_t nuc900_get_cycles(struct clocksource *cs)
> +{
> + ? ? ? return ~__raw_readl(REG_TDR1);
> +}
> +
> +static struct clocksource clocksource_nuc900 = {
> + ? ? ? .name ? = "nuc900-timer1",
> + ? ? ? .rating = 200,
> + ? ? ? .read ? = nuc900_get_cycles,
> + ? ? ? .mask ? = CLOCKSOURCE_MASK(32),
> + ? ? ? .shift ?= 20,
> + ? ? ? .flags ?= CLOCK_SOURCE_IS_CONTINUOUS,
> +};
> +
> +static void __init nuc900_clocksource_init(unsigned int rate)
> +{
> + ? ? ? unsigned int val;
> +
> + ? ? ? __raw_writel(0xffffffff, REG_TICR1);
> +
> + ? ? ? val = __raw_readl(REG_TCSR1);
> + ? ? ? val |= (COUNTEN | PERIOD);
> + ? ? ? __raw_writel(val, REG_TCSR1);
> +
> + ? ? ? clocksource_nuc900.mult =
> + ? ? ? ? ? ? ? clocksource_khz2mult((rate / 1000), clocksource_nuc900.shift);
> + ? ? ? clocksource_register(&clocksource_nuc900);
> +}
> +
> +static void __init nuc900_timer_init(void)
> +{
> + ? ? ? struct clk *ck_ext = clk_get(NULL, "ext");
> + ? ? ? unsigned int ? ?rate;
> +
> + ? ? ? BUG_ON(IS_ERR(ck_ext));
> +
> + ? ? ? rate = clk_get_rate(ck_ext);
> + ? ? ? clk_put(ck_ext);
> + ? ? ? rate = rate / (PRESCALE + 0x01);
> +
> + ? ? ? ?/* set a known state */
> + ? ? ? __raw_writel(0x00, REG_TCSR0);
> + ? ? ? __raw_writel(0x00, REG_TCSR1);
> + ? ? ? __raw_writel(RESETINT, REG_TISR);
> + ? ? ? timer0_load = (rate / TICKS_PER_SEC);
> +
> + ? ? ? nuc900_clocksource_init(rate);
> + ? ? ? nuc900_timer_init_clockevents(rate);
> +}
> +
> +struct sys_timer nuc900_timer = {
> + ? ? ? .init ? ? ? ? ? = nuc900_timer_init,
> +};
> diff --git a/arch/arm/mach-w90x900/time_932.c b/arch/arm/mach-w90x900/time_932.c
> new file mode 100644
> index 0000000..c50f9c0
> --- /dev/null
> +++ b/arch/arm/mach-w90x900/time_932.c
> @@ -0,0 +1,59 @@
> +/*
> + * linux/arch/arm/mach-w90x900/time.c
> + *
> + * Based on linux/arch/arm/plat-s3c24xx/time.c by Ben Dooks
> + *
> + * Copyright (c) 2009 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 <linux/clocksource.h>
> +#include <linux/clockchips.h>
> +
> +#include <asm/mach-types.h>
> +#include <asm/mach/irq.h>
> +#include <asm/mach/time.h>
> +
> +#include <mach/map.h>
> +#include <mach/regs-timer.h>
> +
> +#include "time.h"
> +
> +static void __init nuc900_timer_init(void)
> +{
> + ? ? ? struct clk *ck_ext = clk_get(NULL, "ext");
> + ? ? ? unsigned int ? ?rate;
> +
> + ? ? ? BUG_ON(IS_ERR(ck_ext));
> +
> + ? ? ? rate = clk_get_rate(ck_ext);
> + ? ? ? clk_put(ck_ext);
> + ? ? ? rate = rate / (PRESCALE + 0x01);
> +
> + ? ? ? ?/* set a known state */
> + ? ? ? __raw_writel(0x00, REG_TCSR0);
> + ? ? ? __raw_writel(RESETINT, REG_TISR);
> + ? ? ? timer0_load = (rate / TICKS_PER_SEC);
> +
> + ? ? ? nuc900_timer_init_clockevents(rate);
> +}
> +
> +struct sys_timer nuc900_timer = {
> + ? ? ? .init ? ? ? ? ? = nuc900_timer_init,
> +};
> --
> 1.5.6.3
>
>



-- 
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2009-11-17  5:43 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-03  8:21 [PATCH] NUC900: Add support for nuc932 SoC Wan ZongShun
2009-11-17  5:43 ` Wan ZongShun
  -- strict thread matches above, loose matches on Subject: below --
2009-10-03  8:34 Wan ZongShun

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).