[PATCH] NUC900: Add support for nuc932 SoC

Wan ZongShun mcuos.com at gmail.com
Tue Nov 17 00:43:12 EST 2009


Dear Russell,

Can this patch be submitted to your patch system now?

2009/10/3 Wan ZongShun <mcuos.com at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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



More information about the linux-arm-kernel mailing list