NUC900: Add support for nuc932 SoC
Subsystems (2)
PATCH 1/1 NUC900: Add support for nuc932 SoC
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.
--- 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
arch/arm/mach-w90x900/Kconfig +15 -0
@@ -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
arch/arm/mach-w90x900/Makefile +10 -2
@@ -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
arch/arm/mach-w90x900/clock.c +1 -1
@@ -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);
arch/arm/mach-w90x900/clock.h +6 -0
@@ -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);
arch/arm/mach-w90x900/cpu.c +15 -3
@@ -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); }
arch/arm/mach-w90x900/cpu.h +4 -1
@@ -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 */
arch/arm/mach-w90x900/dev_932.c new file +44 -0
44 lines not on this page · raw message
arch/arm/mach-w90x900/groupirq.c new file +140 -0
140 lines not on this page · raw message
arch/arm/mach-w90x900/groupirq.h new file +16 -0
@@ -0,0 +1,16 @@ +/* +* arch/arm/mach-w90x900/groupirq.h +* +* Copyright (c) 2008 Nuvoton technology corporation +* All rights reserved. +* +* Wan ZongShun <[email protected]> +* +* 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);
arch/arm/mach-w90x900/include/mach/irqs.h +44 -0
54 lines not on this page · raw message
arch/arm/mach-w90x900/include/mach/map.h +18 -87
160 lines not on this page · raw message
arch/arm/mach-w90x900/include/mach/reg_900.h new file +93 -0
93 lines not on this page · raw message
arch/arm/mach-w90x900/include/mach/reg_932.h new file +57 -0
57 lines not on this page · raw message
arch/arm/mach-w90x900/irq.c +3 -136
157 lines not on this page · raw message
arch/arm/mach-w90x900/mach-nuc932evb.c new file +42 -0
42 lines not on this page · raw message
arch/arm/mach-w90x900/nuc910.c +1 -2
@@ -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*/
arch/arm/mach-w90x900/nuc932.c new file +54 -0
54 lines not on this page · raw message
arch/arm/mach-w90x900/nuc932.h new file +28 -0
@@ -0,0 +1,28 @@ +/* +* arch/arm/mach-w90x900/nuc932.h +* +* Copyright (c) 2008 Nuvoton corporation +* +* Header file for NUC900 CPU support +* +* Wan ZongShun <[email protected]> +* +* 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 );
arch/arm/mach-w90x900/nuc950.c +1 -1
@@ -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*/
arch/arm/mach-w90x900/nuc960.c +1 -1
@@ -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*/
arch/arm/mach-w90x900/time.c +5 -64
98 lines not on this page · raw message
arch/arm/mach-w90x900/time.h new file +33 -0
@@ -0,0 +1,33 @@ +/* +* arch/arm/mach-w90x900/time.h +* +* Copyright (c) 2008 Nuvoton technology corporation +* All rights reserved. +* +* Wan ZongShun <[email protected]> +* +* 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); +
arch/arm/mach-w90x900/time_900.c new file +90 -0
90 lines not on this page · raw message
arch/arm/mach-w90x900/time_932.c new file +59 -0
59 lines not on this page · raw message
Signature · 1 line
1.5.6.3
PATCH 1/1 NUC900: Add support for nuc932 SoC
Dear Russell,
Can this patch be submitted to your patch system now?
2009/10/3 Wan ZongShun <[email protected]>:
Quoted 1,474 lines
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 <[email protected]>---
?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 100644arch/arm/mach-w90x900/groupirq.c?create mode 100644arch/arm/mach-w90x900/groupirq.h?create mode 100644arch/arm/mach-w90x900/include/mach/reg_900.h?create mode 100644arch/arm/mach-w90x900/include/mach/reg_932.h?create mode 100644arch/arm/mach-w90x900/mach-nuc932evb.c?create mode 100644arch/arm/mach-w90x900/nuc932.c?create mode 100644arch/arm/mach-w90x900/nuc932.h?create mode 100644arch/arm/mach-w90x900/time.h?create mode 100644arch/arm/mach-w90x900/time_900.c?create mode 100644arch/arm/mach-w90x900/time_932.carch/arm/mach-w90x900/Kconfig +0
-0@@ -15,6 +15,11 @@ config CPU_NUC960? ? ? ?help
? ? ? ? ?Support for NUCP960 of Nuvoton NUC900 CPUs.arch/arm/mach-w90x900/Kconfig +5
-0+config CPU_NUC932 + ? ? ? bool + ? ? ? help + ? ? ? ? Support for NUCP932 of Nuvoton NUC900 CPUs. +?menu "W90P910 Machines"
?config
MACH_W90P910EVBarch/arm/mach-w90x900/Kconfig +0
-0@@ -46,4 +51,14 @@ config MACH_W90N960EVB?endmenu
arch/arm/mach-w90x900/Kconfig +10
-0+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
arch/arm/mach-w90x900/Makefile +0
-0@@ -4,16 +4,24 @@?# Object file lists.
arch/arm/mach-w90x900/Makefile +8
-2-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
arch/arm/mach-w90x900/Makefile +1
-0+obj-$(CONFIG_MACH_NUC932EVB) ? += mach-nuc932evb.oarch/arm/mach-w90x900/clock.c +1
-1@@ -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);arch/arm/mach-w90x900/clock.h +0
-0@@ -12,6 +12,12 @@?#include <
asm/clkdev.h>arch/arm/mach-w90x900/clock.h +6
-0+#ifndef CONFIG_CPU_NUC932 +#define EXTCLK 15000000 +#else +#define EXTCLK 27000000 +#endif +?void
nuc900_clk_enable(struct clk *clk, int enable); ?voidnuc900_subclk_enable(struct clk *clk, int enable); ?voidclks_register(struct clk_lookup *clks, size_t num);arch/arm/mach-w90x900/cpu.c +0
-0@@ -35,7 +35,7 @@?#include <
mach/regs-ebi.h>?#include "
cpu.h"arch/arm/mach-w90x900/cpu.c +1
-1-#include "clock.h" +?/* Initial IO mappings */
arch/arm/mach-w90x900/cpu.c +2
-0@@ -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*/
arch/arm/mach-w90x900/cpu.c +1
-1-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));
+ ? ? ? structclk_lookup*pclks;
+ ? ? ?size_tpnum;
+
+ ? ? ? if (clks == NULL) {
+ ? ? ? ? ? ? ? pclks =nuc900_clkregs;
+ ? ? ? ? ? ? ? pnum =ARRAY_SIZE(nuc900_clkregs);
+ ? ? ? } else {
+ ? ? ? ? ? ? ? pclks = clks;
+ ? ? ? ? ? ? ? pnum = num;
+ ? ? ? }
+ ? ? ?clks_register(pclks, pnum);
?}arch/arm/mach-w90x900/cpu.h +0
-0@@ -15,6 +15,7 @@?* published by the Free Software Foundation.
?*
?*/
+#include "clock.h"?#define
IODESC_ENT(y)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\arch/arm/mach-w90x900/cpu.h +0
-0@@ -42,13 +43,15 @@?#define
NUC920_CPUID?0x02900920
?#defineNUC950_CPUID?0x02900950
?#defineNUC960_CPUID?0x02900960
+#defineNUC932_CPUID?0x29550091?/* extern file from
cpu.c*/?extern void
nuc900_clock_source(struct device *dev, unsigned char *src);arch/arm/mach-w90x900/cpu.h +1
-1-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 voidnuc900_board_init(struct platform_device **device, int size); +extern voidnuc932_dev_board_init(void);?/* for either public between 910 and 920, or between 920 and 950 */
arch/arm/mach-w90x900/dev_932.c new file +44
-0@@ -0,0 +1,44 @@ +/* +* linux/arch/arm/mach-w90x900/dev_932.c +* +* Copyright (C) 2009 Nuvoton corporation. +* +* Wan ZongShun <[email protected]> +* +* 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)); +} +arch/arm/mach-w90x900/groupirq.c new file +140
-0@@ -0,0 +1,140 @@ +/* +* linux/arch/arm/mach-w90x900/groupirq.c +* +* Copyright (c) 2008 Nuvoton technology corporation +* All rights reserved. +* +* Wan ZongShun <[email protected]> +* +* 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); + ? ? ? } +} +arch/arm/mach-w90x900/groupirq.h new file +16
-0@@ -0,0 +1,16 @@ +/* +* arch/arm/mach-w90x900/groupirq.h +* +* Copyright (c) 2008 Nuvoton technology corporation +* All rights reserved. +* +* Wan ZongShun <[email protected]> +* +* 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);arch/arm/mach-w90x900/include/mach/irqs.h +0
-0@@ -28,6 +28,8 @@?/* Main cpu interrupts */
arch/arm/mach-w90x900/include/mach/irqs.h +2
-0+#ifndef CONFIG_CPU_NUC932 +?#define
IRQ_WDT? ? ? ? ? ? ? ?W90X900_IRQ(1)
?#defineIRQ_GROUP0? ?W90X900_IRQ(2)
?#defineIRQ_GROUP1? ?W90X900_IRQ(3)arch/arm/mach-w90x900/include/mach/irqs.h +0
-0@@ -83,4 +85,46 @@?#define ? ? ? ?IRQ_GROUP1_IRQ6
0x00000040
?#define ? ? ? ?IRQ_GROUP1_IRQ70x00000080arch/arm/mach-w90x900/include/mach/irqs.h +42
-0+#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*/arch/arm/mach-w90x900/include/mach/map.h +0
-0@@ -16,142 +16,73 @@?#ifndef
__ASM_ARCH_MAP_H
?#define__ASM_ARCH_MAP_Harch/arm/mach-w90x900/include/mach/map.h +2
-2-#ifndef __ASSEMBLY__ -#define W90X900_ADDR (x) ? ? ? ? ? ? ? ?((void __iomem *)(0xF0000000 + (x))) +#ifdef CONFIG_CPU_NUC932 +#include "reg_932.h" ?#else
arch/arm/mach-w90x900/include/mach/map.h +1
-1-#define W90X900_ADDR (x) ? ? ? ? ? ? ? ?(0xF0000000 + (x)) +#include "reg_900.h" ?#endif
arch/arm/mach-w90x900/include/mach/map.h +0
-6-#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 ?*/
?#defineW90X900_VA_IRQ? ? ? ?W90X900_ADDR(0x00000000)-#defineW90X900_PA_IRQ? ? ? ? (0xB8002000) ?#defineW90X900_SZ_IRQ? ? ? ?SZ_4Karch/arm/mach-w90x900/include/mach/map.h +2
-2-#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_4Karch/arm/mach-w90x900/include/mach/map.h +0
-5-/* 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 */
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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 */
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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 */
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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 */
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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 */
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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_4Karch/arm/mach-w90x900/include/mach/map.h +0
-9-/* 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 */
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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_4Karch/arm/mach-w90x900/include/mach/map.h +0
-10-/* 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*/
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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*/
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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_4Karch/arm/mach-w90x900/include/mach/map.h +0
-5-/* ATAPI */ -#define W90X900_VA_ATAPI ? ? ? W90X900_ADDR(0x0000A000) -#define W90X900_PA_ATAPI ? ? ? (0xB000A000) -#define W90X900_SZ_ATAPI ? ? ? SZ_4K -?/* ADC */
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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_4Karch/arm/mach-w90x900/include/mach/map.h +0
-5-/* PS2 Interface*/ -#define W90X900_VA_PS2 ? ? ? ? W90X900_ADDR(0x08009000) -#define W90X900_PA_PS2 ? ? ? ? (0xB8009000) -#define W90X900_SZ_PS2 ? ? ? ? SZ_4K -?/* RTC */
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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 */
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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 */
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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_4Karch/arm/mach-w90x900/include/mach/map.h +0
-10-/* 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 */
arch/arm/mach-w90x900/include/mach/map.h +1
-2-#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_4Karch/arm/mach-w90x900/include/mach/map.h +0
-5-/* 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*/arch/arm/mach-w90x900/include/mach/reg_900.h new file +93
-0@@ -0,0 +1,93 @@ +/* +* arch/arm/mach-w90x900/include/mach/reg_900.h +* +* Copyright (c) 2008 Nuvoton technology corporation. +* +* Wan ZongShun <[email protected]> +* +* 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 */ arch/arm/mach-w90x900/include/mach/reg_932.h new file +57
-0@@ -0,0 +1,57 @@ +/* +* arch/arm/mach-w90x900/include/mach/reg_932.h +* +* Copyright (c) 2008 Nuvoton technology corporation. +* +* Wan ZongShun <[email protected]> +* +* 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 */ arch/arm/mach-w90x900/irq.c +0
-0@@ -27,70 +27,7 @@?#include <
mach/hardware.h>
?#include <mach/regs-irq.h>arch/arm/mach-w90x900/irq.c +1
-64- -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)
?{arch/arm/mach-w90x900/irq.c +1
-36@@ -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); ?}?/*
arch/arm/mach-w90x900/irq.c +1
-36@@ -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 = {arch/arm/mach-w90x900/mach-nuc932evb.c new file +42
-0@@ -0,0 +1,42 @@ +/* + * linux/arch/arm/mach-w90x900/mach-nuc932evb.c + * + * Copyright (C) 2009 Nuvoton technology corporation. + * + * Wan ZongShun <[email protected]> + * + * 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_ENDarch/arm/mach-w90x900/nuc910.c +0
-0@@ -19,7 +19,6 @@?#include <
asm/mach/map.h>
?#include <mach/hardware.h>
?#include "cpu.h"
-#include "clock.h"?/* define specific CPU platform device */
arch/arm/mach-w90x900/nuc910.c +1
-1@@ -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*/
arch/arm/mach-w90x900/nuc932.c new file +54
-0@@ -0,0 +1,54 @@ +/* +* linux/arch/arm/mach-w90x900/nuc932.c +* +* Copyright (c) 2009 Nuvoton technology corporation. +* +* Wan ZongShun <[email protected]> +* +* 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) +{ +} +arch/arm/mach-w90x900/nuc932.h new file +28
-0@@ -0,0 +1,28 @@ +/* +* arch/arm/mach-w90x900/nuc932.h +* +* Copyright (c) 2008 Nuvoton corporation +* +* Header file for NUC900 CPU support +* +* Wan ZongShun <[email protected]> +* +* 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 );arch/arm/mach-w90x900/nuc950.c +1
-1@@ -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*/
arch/arm/mach-w90x900/nuc960.c +1
-1@@ -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*/
arch/arm/mach-w90x900/time.c +0
-0@@ -33,16 +33,7 @@?#include <
mach/map.h>
?#include <mach/regs-timer.h>arch/arm/mach-w90x900/time.c +1
-10-#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)arch/arm/mach-w90x900/time.c +4
-54@@ -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, -};arch/arm/mach-w90x900/time.h new file +33
-0@@ -0,0 +1,33 @@ +/* +* arch/arm/mach-w90x900/time.h +* +* Copyright (c) 2008 Nuvoton technology corporation +* All rights reserved. +* +* Wan ZongShun <[email protected]> +* +* 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); +arch/arm/mach-w90x900/time_900.c new file +90
-0@@ -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 <[email protected]> +* +* 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, +};arch/arm/mach-w90x900/time_932.c new file +59
-1@@ -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 <[email protected]> +* +* 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
Signature · 3 lines
linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel