diff options
592 files changed, 3087 insertions, 5513 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 0e7a80aefa0..5a70c1809b7 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1124,13 +1124,6 @@ S:	Supported  F:	arch/arm/mach-shmobile/  F:	drivers/sh/ -ARM/TELECHIPS ARM ARCHITECTURE -M:	"Hans J. Koch" <hjk@hansjkoch.de> -L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) -S:	Maintained -F:	arch/arm/plat-tcc/ -F:	arch/arm/mach-tcc8k/ -  ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT  M:	Lennert Buytenhek <kernel@wantstofly.org>  L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index afcb76ecea5..444822526a0 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -877,16 +877,6 @@ config ARCH_SHARK  	  Support for the StrongARM based Digital DNARD machine, also known  	  as "Shark" (<http://www.shark-linux.de/shark.html>). -config ARCH_TCC_926 -	bool "Telechips TCC ARM926-based systems" -	select CLKSRC_MMIO -	select CPU_ARM926T -	select HAVE_CLK -	select CLKDEV_LOOKUP -	select GENERIC_CLOCKEVENTS -	help -	  Support for Telechips TCC ARM926-based systems. -  config ARCH_U300  	bool "ST-Ericsson U300 Series"  	depends on MMU @@ -1073,8 +1063,6 @@ source "arch/arm/plat-s5p/Kconfig"  source "arch/arm/plat-spear/Kconfig" -source "arch/arm/plat-tcc/Kconfig" -  if ARCH_S3C2410  source "arch/arm/mach-s3c2410/Kconfig"  source "arch/arm/mach-s3c2412/Kconfig" diff --git a/arch/arm/Makefile b/arch/arm/Makefile index dfcf3b033e1..40319d91bb7 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -184,7 +184,6 @@ machine-$(CONFIG_ARCH_EXYNOS4)		:= exynos  machine-$(CONFIG_ARCH_SA1100)		:= sa1100  machine-$(CONFIG_ARCH_SHARK)		:= shark  machine-$(CONFIG_ARCH_SHMOBILE) 	:= shmobile -machine-$(CONFIG_ARCH_TCC8K)		:= tcc8k  machine-$(CONFIG_ARCH_TEGRA)		:= tegra  machine-$(CONFIG_ARCH_U300)		:= u300  machine-$(CONFIG_ARCH_U8500)		:= ux500 @@ -204,7 +203,6 @@ machine-$(CONFIG_ARCH_ZYNQ)		:= zynq  plat-$(CONFIG_ARCH_MXC)		:= mxc  plat-$(CONFIG_ARCH_OMAP)	:= omap  plat-$(CONFIG_ARCH_S3C64XX)	:= samsung -plat-$(CONFIG_ARCH_TCC_926)	:= tcc  plat-$(CONFIG_ARCH_ZYNQ)	:= versatile  plat-$(CONFIG_PLAT_IOP)		:= iop  plat-$(CONFIG_PLAT_NOMADIK)	:= nomadik diff --git a/arch/arm/include/asm/hardware/iop3xx.h b/arch/arm/include/asm/hardware/iop3xx.h index 5daea2961d4..077c32326c6 100644 --- a/arch/arm/include/asm/hardware/iop3xx.h +++ b/arch/arm/include/asm/hardware/iop3xx.h @@ -234,6 +234,7 @@ extern int iop3xx_get_init_atu(void);  void iop3xx_map_io(void);  void iop_init_cp6_handler(void);  void iop_init_time(unsigned long tickrate); +void iop3xx_restart(char, const char *);  static inline u32 read_tmr0(void)  { diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 53785828744..e4c96cc6ec0 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h @@ -108,7 +108,6 @@ extern void __show_regs(struct pt_regs *);  extern int __pure cpu_architecture(void);  extern void cpu_init(void); -void arm_machine_restart(char mode, const char *cmd);  void soft_restart(unsigned long);  extern void (*arm_pm_restart)(char str, const char *cmd); diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 423bb201945..b29776aa658 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -147,14 +147,8 @@ void soft_restart(unsigned long addr)  	BUG();  } -void arm_machine_restart(char mode, const char *cmd) +static void null_restart(char mode, const char *cmd)  { -	/* Disable interrupts first */ -	local_irq_disable(); -	local_fiq_disable(); - -	/* Call the architecture specific reboot code. */ -	arch_reset(mode, cmd);  }  /* @@ -163,7 +157,7 @@ void arm_machine_restart(char mode, const char *cmd)  void (*pm_power_off)(void);  EXPORT_SYMBOL(pm_power_off); -void (*arm_pm_restart)(char str, const char *cmd) = arm_machine_restart; +void (*arm_pm_restart)(char str, const char *cmd) = null_restart;  EXPORT_SYMBOL_GPL(arm_pm_restart);  static void do_nothing(void *unused) diff --git a/arch/arm/mach-at91/at91cap9.c b/arch/arm/mach-at91/at91cap9.c index ecdd54dd68c..29373397d2d 100644 --- a/arch/arm/mach-at91/at91cap9.c +++ b/arch/arm/mach-at91/at91cap9.c @@ -313,7 +313,7 @@ static struct at91_gpio_bank at91cap9_gpio[] = {  	}  }; -static void at91cap9_reset(void) +static void at91cap9_restart(char mode, const char *cmd)  {  	at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);  } @@ -335,7 +335,7 @@ static void __init at91cap9_map_io(void)  static void __init at91cap9_initialize(void)  { -	at91_arch_reset = at91cap9_reset; +	arm_pm_restart = at91cap9_restart;  	pm_power_off = at91cap9_poweroff;  	at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1); diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index 713d3bdbd28..430a9fdc3db 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c @@ -288,7 +288,7 @@ static struct at91_gpio_bank at91rm9200_gpio[] = {  	}  }; -static void at91rm9200_reset(void) +static void at91rm9200_restart(char mode, const char *cmd)  {  	/*  	 * Perform a hardware reset with the use of the Watchdog timer. @@ -309,7 +309,7 @@ static void __init at91rm9200_map_io(void)  static void __init at91rm9200_initialize(void)  { -	at91_arch_reset = at91rm9200_reset; +	arm_pm_restart = at91rm9200_restart;  	at91_extern_irq = (1 << AT91RM9200_ID_IRQ0) | (1 << AT91RM9200_ID_IRQ1)  			| (1 << AT91RM9200_ID_IRQ2) | (1 << AT91RM9200_ID_IRQ3)  			| (1 << AT91RM9200_ID_IRQ4) | (1 << AT91RM9200_ID_IRQ5) diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index 0d20677fbef..e76cd49ebc9 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c @@ -327,7 +327,7 @@ static void __init at91sam9260_map_io(void)  static void __init at91sam9260_initialize(void)  { -	at91_arch_reset = at91sam9_alt_reset; +	arm_pm_restart = at91sam9_alt_restart;  	pm_power_off = at91sam9260_poweroff;  	at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1)  			| (1 << AT91SAM9260_ID_IRQ2); diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index 658a5185abf..19ac7c0729a 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c @@ -287,7 +287,7 @@ static void __init at91sam9261_map_io(void)  static void __init at91sam9261_initialize(void)  { -	at91_arch_reset = at91sam9_alt_reset; +	arm_pm_restart = at91sam9_alt_restart;  	pm_power_off = at91sam9261_poweroff;  	at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1)  			| (1 << AT91SAM9261_ID_IRQ2); diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index f83fbb0ee0c..50d01631003 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c @@ -305,7 +305,7 @@ static void __init at91sam9263_map_io(void)  static void __init at91sam9263_initialize(void)  { -	at91_arch_reset = at91sam9_alt_reset; +	arm_pm_restart = at91sam9_alt_restart;  	pm_power_off = at91sam9263_poweroff;  	at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1); diff --git a/arch/arm/mach-at91/at91sam9_alt_reset.S b/arch/arm/mach-at91/at91sam9_alt_reset.S index e0256deb91f..d3f931c5942 100644 --- a/arch/arm/mach-at91/at91sam9_alt_reset.S +++ b/arch/arm/mach-at91/at91sam9_alt_reset.S @@ -14,20 +14,15 @@   */  #include <linux/linkage.h> -#include <asm/system.h>  #include <mach/hardware.h>  #include <mach/at91sam9_sdramc.h>  #include <mach/at91_rstc.h>  			.arm -			.globl	at91sam9_alt_reset +			.globl	at91sam9_alt_restart -at91sam9_alt_reset:	mrc	p15, 0, r0, c1, c0, 0 -			orr	r0, r0, #CR_I -			mcr	p15, 0, r0, c1, c0, 0		@ enable I-cache - -			ldr	r0, .at91_va_base_sdramc	@ preload constants +at91sam9_alt_restart:	ldr	r0, .at91_va_base_sdramc	@ preload constants  			ldr	r1, .at91_va_base_rstc_cr  			mov	r2, #1 diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 318b0407ea0..ff21f7a60c6 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c @@ -317,7 +317,7 @@ static struct at91_gpio_bank at91sam9g45_gpio[] = {  	}  }; -static void at91sam9g45_reset(void) +static void at91sam9g45_restart(char mode, const char *cmd)  {  	at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);  } @@ -340,7 +340,7 @@ static void __init at91sam9g45_map_io(void)  static void __init at91sam9g45_initialize(void)  { -	at91_arch_reset = at91sam9g45_reset; +	arm_pm_restart = at91sam9g45_restart;  	pm_power_off = at91sam9g45_poweroff;  	at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0); diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index a238105d2c1..61cbb46f5b0 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c @@ -292,7 +292,7 @@ static void __init at91sam9rl_map_io(void)  static void __init at91sam9rl_initialize(void)  { -	at91_arch_reset = at91sam9_alt_reset; +	arm_pm_restart = at91sam9_alt_restart;  	pm_power_off = at91sam9rl_poweroff;  	at91_extern_irq = (1 << AT91SAM9RL_ID_IRQ0); diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index 938b34f5774..7f4503bc4cb 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h @@ -57,7 +57,7 @@ extern void at91_irq_suspend(void);  extern void at91_irq_resume(void);  /* reset */ -extern void at91sam9_alt_reset(void); +extern void at91sam9_alt_restart(char, const char *);   /* GPIO */  #define AT91RM9200_PQFP		3	/* AT91RM9200 PQFP package has 3 banks */ @@ -71,5 +71,4 @@ struct at91_gpio_bank {  extern void __init at91_gpio_init(struct at91_gpio_bank *, int nr_banks);  extern void __init at91_gpio_irq_setup(void); -extern void (*at91_arch_reset)(void);  extern int at91_extern_irq; diff --git a/arch/arm/mach-at91/include/mach/system.h b/arch/arm/mach-at91/include/mach/system.h index 36af14bc13b..cbd64f3bcec 100644 --- a/arch/arm/mach-at91/include/mach/system.h +++ b/arch/arm/mach-at91/include/mach/system.h @@ -47,13 +47,4 @@ static inline void arch_idle(void)  #endif  } -void (*at91_arch_reset)(void); - -static inline void arch_reset(char mode, const char *cmd) -{ -	/* call the CPU-specific reset function */ -	if (at91_arch_reset) -		(at91_arch_reset)(); -} -  #endif diff --git a/arch/arm/mach-bcmring/arch.c b/arch/arm/mach-bcmring/arch.c index 31a143592c8..9e5e7552498 100644 --- a/arch/arm/mach-bcmring/arch.c +++ b/arch/arm/mach-bcmring/arch.c @@ -49,7 +49,29 @@ HW_DECLARE_SPINLOCK(gpio)  #endif  /* sysctl */ -int bcmring_arch_warm_reboot;	/* do a warm reboot on hard reset */ +static int bcmring_arch_warm_reboot;	/* do a warm reboot on hard reset */ + +static void bcmring_restart(char mode, const char *cmd) +{ +	printk("arch_reset:%c %x\n", mode, bcmring_arch_warm_reboot); + +	if (mode == 'h') { +		/* Reboot configured in proc entry */ +		if (bcmring_arch_warm_reboot) { +			printk("warm reset\n"); +			/* Issue Warm reset (do not reset ethernet switch, keep alive) */ +			chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_WARM); +		} else { +			/* Force reset of everything */ +			printk("force reset\n"); +			chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_SOFT); +		} +	} else { +		/* Force reset of everything */ +		printk("force reset\n"); +		chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_SOFT); +	} +}  static struct ctl_table_header *bcmring_sysctl_header; @@ -173,4 +195,5 @@ MACHINE_START(BCMRING, "BCMRING")  	.init_irq = bcmring_init_irq,  	.timer = &bcmring_timer,  	.init_machine = bcmring_init_machine +	.restart = bcmring_restart,  MACHINE_END diff --git a/arch/arm/mach-bcmring/include/mach/system.h b/arch/arm/mach-bcmring/include/mach/system.h index 38b37060d42..cb78250db64 100644 --- a/arch/arm/mach-bcmring/include/mach/system.h +++ b/arch/arm/mach-bcmring/include/mach/system.h @@ -20,35 +20,9 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <mach/csp/chipcHw_inline.h> - -extern int bcmring_arch_warm_reboot; -  static inline void arch_idle(void)  {  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	printk("arch_reset:%c %x\n", mode, bcmring_arch_warm_reboot); - -	if (mode == 'h') { -		/* Reboot configured in proc entry */ -		if (bcmring_arch_warm_reboot) { -			printk("warm reset\n"); -			/* Issue Warm reset (do not reset ethernet switch, keep alive) */ -			chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_WARM); -		} else { -			/* Force reset of everything */ -			printk("force reset\n"); -			chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_SOFT); -		} -	} else { -		/* Force reset of everything */ -		printk("force reset\n"); -		chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_SOFT); -	} -} -  #endif diff --git a/arch/arm/mach-clps711x/autcpu12.c b/arch/arm/mach-clps711x/autcpu12.c index 0276091b7f8..3fb79a1d0bd 100644 --- a/arch/arm/mach-clps711x/autcpu12.c +++ b/arch/arm/mach-clps711x/autcpu12.c @@ -68,5 +68,6 @@ MACHINE_START(AUTCPU12, "autronix autcpu12")  	.map_io		= autcpu12_map_io,  	.init_irq	= clps711x_init_irq,  	.timer		= &clps711x_timer, +	.restart	= clps711x_restart,  MACHINE_END diff --git a/arch/arm/mach-clps711x/cdb89712.c b/arch/arm/mach-clps711x/cdb89712.c index 25b3bfd0e85..c314f49d6ef 100644 --- a/arch/arm/mach-clps711x/cdb89712.c +++ b/arch/arm/mach-clps711x/cdb89712.c @@ -59,4 +59,5 @@ MACHINE_START(CDB89712, "Cirrus-CDB89712")  	.map_io		= cdb89712_map_io,  	.init_irq	= clps711x_init_irq,  	.timer		= &clps711x_timer, +	.restart	= clps711x_restart,  MACHINE_END diff --git a/arch/arm/mach-clps711x/ceiva.c b/arch/arm/mach-clps711x/ceiva.c index 1df9ec67aa9..a70147e347a 100644 --- a/arch/arm/mach-clps711x/ceiva.c +++ b/arch/arm/mach-clps711x/ceiva.c @@ -60,4 +60,5 @@ MACHINE_START(CEIVA, "CEIVA/Polaroid Photo MAX Digital Picture Frame")  	.map_io		= ceiva_map_io,  	.init_irq	= clps711x_init_irq,  	.timer		= &clps711x_timer, +	.restart	= clps711x_restart,  MACHINE_END diff --git a/arch/arm/mach-clps711x/clep7312.c b/arch/arm/mach-clps711x/clep7312.c index 80496c09ac5..dbc7842639d 100644 --- a/arch/arm/mach-clps711x/clep7312.c +++ b/arch/arm/mach-clps711x/clep7312.c @@ -41,5 +41,6 @@ MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312")  	.map_io		= clps711x_map_io,  	.init_irq	= clps711x_init_irq,  	.timer		= &clps711x_timer, +	.restart	= clps711x_restart,  MACHINE_END diff --git a/arch/arm/mach-clps711x/common.c b/arch/arm/mach-clps711x/common.c index ced2a4e406f..ab1711b9b4d 100644 --- a/arch/arm/mach-clps711x/common.c +++ b/arch/arm/mach-clps711x/common.c @@ -220,3 +220,8 @@ struct sys_timer clps711x_timer = {  	.init		= clps711x_timer_init,  	.offset		= clps711x_gettimeoffset,  }; + +void clps711x_restart(char mode, const char *cmd) +{ +	soft_restart(0); +} diff --git a/arch/arm/mach-clps711x/common.h b/arch/arm/mach-clps711x/common.h index 2b8b801f1dc..fc0f0650dcb 100644 --- a/arch/arm/mach-clps711x/common.h +++ b/arch/arm/mach-clps711x/common.h @@ -9,3 +9,4 @@ struct sys_timer;  extern void clps711x_map_io(void);  extern void clps711x_init_irq(void);  extern struct sys_timer clps711x_timer; +extern void clps711x_restart(char mode, const char *cmd); diff --git a/arch/arm/mach-clps711x/edb7211-arch.c b/arch/arm/mach-clps711x/edb7211-arch.c index 9721f6111dc..5fad0b4f40a 100644 --- a/arch/arm/mach-clps711x/edb7211-arch.c +++ b/arch/arm/mach-clps711x/edb7211-arch.c @@ -62,4 +62,5 @@ MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)")  	.reserve	= edb7211_reserve,  	.init_irq	= clps711x_init_irq,  	.timer		= &clps711x_timer, +	.restart	= clps711x_restart,  MACHINE_END diff --git a/arch/arm/mach-clps711x/fortunet.c b/arch/arm/mach-clps711x/fortunet.c index d9925668729..3a3f0b702cb 100644 --- a/arch/arm/mach-clps711x/fortunet.c +++ b/arch/arm/mach-clps711x/fortunet.c @@ -78,4 +78,5 @@ MACHINE_START(FORTUNET, "ARM-FortuNet")  	.map_io		= clps711x_map_io,  	.init_irq	= clps711x_init_irq,  	.timer		= &clps711x_timer, +	.restart	= clps711x_restart,  MACHINE_END diff --git a/arch/arm/mach-clps711x/include/mach/system.h b/arch/arm/mach-clps711x/include/mach/system.h index 6c119937d39..23d6ef8c84d 100644 --- a/arch/arm/mach-clps711x/include/mach/system.h +++ b/arch/arm/mach-clps711x/include/mach/system.h @@ -32,9 +32,4 @@ static inline void arch_idle(void)  	mov	r0, r0");  } -static inline void arch_reset(char mode, const char *cmd) -{ -	soft_restart(0); -} -  #endif diff --git a/arch/arm/mach-clps711x/p720t.c b/arch/arm/mach-clps711x/p720t.c index 6ecea95f38b..42ee8f33eaf 100644 --- a/arch/arm/mach-clps711x/p720t.c +++ b/arch/arm/mach-clps711x/p720t.c @@ -93,6 +93,7 @@ MACHINE_START(P720T, "ARM-Prospector720T")  	.map_io		= p720t_map_io,  	.init_irq	= clps711x_init_irq,  	.timer		= &clps711x_timer, +	.restart	= clps711x_restart,  MACHINE_END  static int p720t_hw_init(void) diff --git a/arch/arm/mach-cns3xxx/cns3420vb.c b/arch/arm/mach-cns3xxx/cns3420vb.c index 594852fe24c..2c5fb4c7e50 100644 --- a/arch/arm/mach-cns3xxx/cns3420vb.c +++ b/arch/arm/mach-cns3xxx/cns3420vb.c @@ -204,4 +204,5 @@ MACHINE_START(CNS3420VB, "Cavium Networks CNS3420 Validation Board")  	.timer		= &cns3xxx_timer,  	.handle_irq	= gic_handle_irq,  	.init_machine	= cns3420_init, +	.restart	= cns3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-cns3xxx/core.h b/arch/arm/mach-cns3xxx/core.h index fcd225343c6..4894b8c1715 100644 --- a/arch/arm/mach-cns3xxx/core.h +++ b/arch/arm/mach-cns3xxx/core.h @@ -22,5 +22,6 @@ static inline void cns3xxx_l2x0_init(void) {}  void __init cns3xxx_map_io(void);  void __init cns3xxx_init_irq(void);  void cns3xxx_power_off(void); +void cns3xxx_restart(char, const char *);  #endif /* __CNS3XXX_CORE_H */ diff --git a/arch/arm/mach-cns3xxx/include/mach/system.h b/arch/arm/mach-cns3xxx/include/mach/system.h index 4f16c9b79f7..9e56b7dc133 100644 --- a/arch/arm/mach-cns3xxx/include/mach/system.h +++ b/arch/arm/mach-cns3xxx/include/mach/system.h @@ -11,7 +11,6 @@  #ifndef __MACH_SYSTEM_H  #define __MACH_SYSTEM_H -#include <linux/io.h>  #include <asm/proc-fns.h>  static inline void arch_idle(void) @@ -23,6 +22,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -void arch_reset(char mode, const char *cmd); -  #endif diff --git a/arch/arm/mach-cns3xxx/pm.c b/arch/arm/mach-cns3xxx/pm.c index 0c04678615c..36458080332 100644 --- a/arch/arm/mach-cns3xxx/pm.c +++ b/arch/arm/mach-cns3xxx/pm.c @@ -11,9 +11,9 @@  #include <linux/io.h>  #include <linux/delay.h>  #include <linux/atomic.h> -#include <mach/system.h>  #include <mach/cns3xxx.h>  #include <mach/pm.h> +#include "core.h"  void cns3xxx_pwr_clk_en(unsigned int block)  { @@ -89,7 +89,7 @@ void cns3xxx_pwr_soft_rst(unsigned int block)  }  EXPORT_SYMBOL(cns3xxx_pwr_soft_rst); -void arch_reset(char mode, const char *cmd) +void cns3xxx_restart(char mode, const char *cmd)  {  	/*  	 * To reset, we hit the on-board reset register diff --git a/arch/arm/mach-davinci/board-da830-evm.c b/arch/arm/mach-davinci/board-da830-evm.c index 11c3db98528..dc1afe5be20 100644 --- a/arch/arm/mach-davinci/board-da830-evm.c +++ b/arch/arm/mach-davinci/board-da830-evm.c @@ -682,4 +682,5 @@ MACHINE_START(DAVINCI_DA830_EVM, "DaVinci DA830/OMAP-L137/AM17x EVM")  	.timer		= &davinci_timer,  	.init_machine	= da830_evm_init,  	.dma_zone_size	= SZ_128M, +	.restart	= da8xx_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index 6659a90dbca..f8a682f60a4 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c @@ -1411,4 +1411,5 @@ MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138/AM18x EVM")  	.timer		= &davinci_timer,  	.init_machine	= da850_evm_init,  	.dma_zone_size	= SZ_128M, +	.restart	= da8xx_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c index 4e0e707c313..275341f159f 100644 --- a/arch/arm/mach-davinci/board-dm355-evm.c +++ b/arch/arm/mach-davinci/board-dm355-evm.c @@ -357,4 +357,5 @@ MACHINE_START(DAVINCI_DM355_EVM, "DaVinci DM355 EVM")  	.timer	      = &davinci_timer,  	.init_machine = dm355_evm_init,  	.dma_zone_size	= SZ_128M, +	.restart	= davinci_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/board-dm355-leopard.c b/arch/arm/mach-davinci/board-dm355-leopard.c index ff2d2413279..e99db28181a 100644 --- a/arch/arm/mach-davinci/board-dm355-leopard.c +++ b/arch/arm/mach-davinci/board-dm355-leopard.c @@ -276,4 +276,5 @@ MACHINE_START(DM355_LEOPARD, "DaVinci DM355 leopard")  	.timer	      = &davinci_timer,  	.init_machine = dm355_leopard_init,  	.dma_zone_size	= SZ_128M, +	.restart	= davinci_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c index 46e1f4173b9..346e1de2f5a 100644 --- a/arch/arm/mach-davinci/board-dm365-evm.c +++ b/arch/arm/mach-davinci/board-dm365-evm.c @@ -618,5 +618,6 @@ MACHINE_START(DAVINCI_DM365_EVM, "DaVinci DM365 EVM")  	.timer		= &davinci_timer,  	.init_machine	= dm365_evm_init,  	.dma_zone_size	= SZ_128M, +	.restart	= davinci_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index 0cf8abf78d3..a64b49cfedc 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c @@ -719,4 +719,5 @@ MACHINE_START(DAVINCI_EVM, "DaVinci DM644x EVM")  	.timer	      = &davinci_timer,  	.init_machine = davinci_evm_init,  	.dma_zone_size	= SZ_128M, +	.restart	= davinci_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c index 635bf774015..64017558860 100644 --- a/arch/arm/mach-davinci/board-dm646x-evm.c +++ b/arch/arm/mach-davinci/board-dm646x-evm.c @@ -799,6 +799,7 @@ MACHINE_START(DAVINCI_DM6467_EVM, "DaVinci DM646x EVM")  	.timer        = &davinci_timer,  	.init_machine = evm_init,  	.dma_zone_size	= SZ_128M, +	.restart	= davinci_restart,  MACHINE_END  MACHINE_START(DAVINCI_DM6467TEVM, "DaVinci DM6467T EVM") @@ -808,5 +809,6 @@ MACHINE_START(DAVINCI_DM6467TEVM, "DaVinci DM6467T EVM")  	.timer        = &davinci_timer,  	.init_machine = evm_init,  	.dma_zone_size	= SZ_128M, +	.restart	= davinci_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/board-mityomapl138.c b/arch/arm/mach-davinci/board-mityomapl138.c index 3cfff555e8f..672d820e2aa 100644 --- a/arch/arm/mach-davinci/board-mityomapl138.c +++ b/arch/arm/mach-davinci/board-mityomapl138.c @@ -573,4 +573,5 @@ MACHINE_START(MITYOMAPL138, "MityDSP-L138/MityARM-1808")  	.timer		= &davinci_timer,  	.init_machine	= mityomapl138_init,  	.dma_zone_size	= SZ_128M, +	.restart	= da8xx_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/board-neuros-osd2.c b/arch/arm/mach-davinci/board-neuros-osd2.c index e5f231aefee..6c4a16415d4 100644 --- a/arch/arm/mach-davinci/board-neuros-osd2.c +++ b/arch/arm/mach-davinci/board-neuros-osd2.c @@ -278,4 +278,5 @@ MACHINE_START(NEUROS_OSD2, "Neuros OSD2")  	.timer		= &davinci_timer,  	.init_machine = davinci_ntosd2_init,  	.dma_zone_size	= SZ_128M, +	.restart	= davinci_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/board-omapl138-hawk.c b/arch/arm/mach-davinci/board-omapl138-hawk.c index c6701e4a795..e7c0c7c5349 100644 --- a/arch/arm/mach-davinci/board-omapl138-hawk.c +++ b/arch/arm/mach-davinci/board-omapl138-hawk.c @@ -344,4 +344,5 @@ MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 Hawkboard")  	.timer		= &davinci_timer,  	.init_machine	= omapl138_hawk_init,  	.dma_zone_size	= SZ_128M, +	.restart	= da8xx_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c index 5dd4da9d230..0b136a831c5 100644 --- a/arch/arm/mach-davinci/board-sffsdr.c +++ b/arch/arm/mach-davinci/board-sffsdr.c @@ -157,4 +157,5 @@ MACHINE_START(SFFSDR, "Lyrtech SFFSDR")  	.timer	      = &davinci_timer,  	.init_machine = davinci_sffsdr_init,  	.dma_zone_size	= SZ_128M, +	.restart	= davinci_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/board-tnetv107x-evm.c b/arch/arm/mach-davinci/board-tnetv107x-evm.c index f69e40a29e0..5f14e30b00d 100644 --- a/arch/arm/mach-davinci/board-tnetv107x-evm.c +++ b/arch/arm/mach-davinci/board-tnetv107x-evm.c @@ -283,4 +283,5 @@ MACHINE_START(TNETV107X, "TNETV107X EVM")  	.timer		= &davinci_timer,  	.init_machine	= tnetv107x_evm_board_init,  	.dma_zone_size	= SZ_128M, +	.restart	= tnetv107x_restart,  MACHINE_END diff --git a/arch/arm/mach-davinci/common.c b/arch/arm/mach-davinci/common.c index 865ffe5899a..cb9b2e47510 100644 --- a/arch/arm/mach-davinci/common.c +++ b/arch/arm/mach-davinci/common.c @@ -97,9 +97,6 @@ void __init davinci_common_init(struct davinci_soc_info *soc_info)  	local_flush_tlb_all();  	flush_cache_all(); -	if (!davinci_soc_info.reset) -		davinci_soc_info.reset = davinci_watchdog_reset; -  	/*  	 * We want to check CPU revision early for cpu_is_xxxx() macros.  	 * IO space mapping must be initialized before we can do that. diff --git a/arch/arm/mach-davinci/da830.c b/arch/arm/mach-davinci/da830.c index a6bf5dcaef1..deee5c2da75 100644 --- a/arch/arm/mach-davinci/da830.c +++ b/arch/arm/mach-davinci/da830.c @@ -1201,7 +1201,6 @@ static struct davinci_soc_info davinci_soc_info_da830 = {  	.gpio_irq		= IRQ_DA8XX_GPIO0,  	.serial_dev		= &da8xx_serial_device,  	.emac_pdata		= &da8xx_emac_pdata, -	.reset_device		= &da8xx_wdt_device,  };  void __init da830_init(void) diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c index b047f870227..0ed7fdb64ef 100644 --- a/arch/arm/mach-davinci/da850.c +++ b/arch/arm/mach-davinci/da850.c @@ -1121,7 +1121,6 @@ static struct davinci_soc_info davinci_soc_info_da850 = {  	.emac_pdata		= &da8xx_emac_pdata,  	.sram_dma		= DA8XX_ARM_RAM_BASE,  	.sram_len		= SZ_8K, -	.reset_device		= &da8xx_wdt_device,  };  void __init da850_init(void) diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c index 68def718886..42dbf3dc11a 100644 --- a/arch/arm/mach-davinci/devices-da8xx.c +++ b/arch/arm/mach-davinci/devices-da8xx.c @@ -363,6 +363,11 @@ struct platform_device da8xx_wdt_device = {  	.resource	= da8xx_watchdog_resources,  }; +void da8xx_restart(char mode, const char *cmd) +{ +	davinci_watchdog_reset(&da8xx_wdt_device); +} +  int __init da8xx_register_watchdog(void)  {  	return platform_device_register(&da8xx_wdt_device); diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c index 806a2f02b98..50c0156b426 100644 --- a/arch/arm/mach-davinci/devices.c +++ b/arch/arm/mach-davinci/devices.c @@ -291,6 +291,11 @@ struct platform_device davinci_wdt_device = {  	.resource	= wdt_resources,  }; +void davinci_restart(char mode, const char *cmd) +{ +	davinci_watchdog_reset(&davinci_wdt_device); +} +  static void davinci_init_wdt(void)  {  	platform_device_register(&davinci_wdt_device); diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index fe520d4167a..19667cfc5de 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c @@ -853,7 +853,6 @@ static struct davinci_soc_info davinci_soc_info_dm355 = {  	.serial_dev		= &dm355_serial_device,  	.sram_dma		= 0x00010000,  	.sram_len		= SZ_32K, -	.reset_device		= &davinci_wdt_device,  };  void __init dm355_init_asp1(u32 evt_enable, struct snd_platform_data *pdata) diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c index 679e168dce3..f15b435cc65 100644 --- a/arch/arm/mach-davinci/dm365.c +++ b/arch/arm/mach-davinci/dm365.c @@ -1083,7 +1083,6 @@ static struct davinci_soc_info davinci_soc_info_dm365 = {  	.emac_pdata		= &dm365_emac_pdata,  	.sram_dma		= 0x00010000,  	.sram_len		= SZ_32K, -	.reset_device		= &davinci_wdt_device,  };  void __init dm365_init_asp(struct snd_platform_data *pdata) diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index 3470983aa34..0800f9cf33b 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c @@ -767,7 +767,6 @@ static struct davinci_soc_info davinci_soc_info_dm644x = {  	.emac_pdata		= &dm644x_emac_pdata,  	.sram_dma		= 0x00008000,  	.sram_len		= SZ_16K, -	.reset_device		= &davinci_wdt_device,  };  void __init dm644x_init_asp(struct snd_platform_data *pdata) diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c index af27c130595..00f774394b1 100644 --- a/arch/arm/mach-davinci/dm646x.c +++ b/arch/arm/mach-davinci/dm646x.c @@ -854,7 +854,6 @@ static struct davinci_soc_info davinci_soc_info_dm646x = {  	.emac_pdata		= &dm646x_emac_pdata,  	.sram_dma		= 0x10010000,  	.sram_len		= SZ_32K, -	.reset_device		= &davinci_wdt_device,  };  void __init dm646x_init_mcasp0(struct snd_platform_data *pdata) diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h index a57cba21e21..5cd39a4e0c9 100644 --- a/arch/arm/mach-davinci/include/mach/common.h +++ b/arch/arm/mach-davinci/include/mach/common.h @@ -77,14 +77,13 @@ struct davinci_soc_info {  	struct emac_platform_data	*emac_pdata;  	dma_addr_t			sram_dma;  	unsigned			sram_len; -	struct platform_device		*reset_device; -	void				(*reset)(struct platform_device *);  };  extern struct davinci_soc_info davinci_soc_info;  extern void davinci_common_init(struct davinci_soc_info *soc_info);  extern void davinci_init_ide(void); +void davinci_restart(char mode, const char *cmd);  /* standard place to map on-chip SRAMs; they *may* support DMA */  #define SRAM_VIRT	0xfffe0000 diff --git a/arch/arm/mach-davinci/include/mach/da8xx.h b/arch/arm/mach-davinci/include/mach/da8xx.h index eaca7d8b9d6..ee3461d7ec1 100644 --- a/arch/arm/mach-davinci/include/mach/da8xx.h +++ b/arch/arm/mach-davinci/include/mach/da8xx.h @@ -91,6 +91,7 @@ int da8xx_register_cpuidle(void);  void __iomem * __init da8xx_get_mem_ctlr(void);  int da850_register_pm(struct platform_device *pdev);  int __init da850_register_sata(unsigned long refclkpn); +void da8xx_restart(char mode, const char *cmd);  extern struct platform_device da8xx_serial_device;  extern struct emac_platform_data da8xx_emac_pdata; diff --git a/arch/arm/mach-davinci/include/mach/system.h b/arch/arm/mach-davinci/include/mach/system.h index e65629c2076..fcb7a015aba 100644 --- a/arch/arm/mach-davinci/include/mach/system.h +++ b/arch/arm/mach-davinci/include/mach/system.h @@ -18,10 +18,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	if (davinci_soc_info.reset) -		davinci_soc_info.reset(davinci_soc_info.reset_device); -} -  #endif /* __ASM_ARCH_SYSTEM_H */ diff --git a/arch/arm/mach-davinci/include/mach/tnetv107x.h b/arch/arm/mach-davinci/include/mach/tnetv107x.h index 89c1fdc63c0..83e5926f3c4 100644 --- a/arch/arm/mach-davinci/include/mach/tnetv107x.h +++ b/arch/arm/mach-davinci/include/mach/tnetv107x.h @@ -54,6 +54,7 @@ extern struct platform_device tnetv107x_serial_device;  extern void __init tnetv107x_init(void);  extern void __init tnetv107x_devices_init(struct tnetv107x_device_info *);  extern void __init tnetv107x_irq_init(void); +void tnetv107x_restart(char mode, const char *cmd);  #endif diff --git a/arch/arm/mach-davinci/tnetv107x.c b/arch/arm/mach-davinci/tnetv107x.c index 409bb869c7c..dc1a209b9b6 100644 --- a/arch/arm/mach-davinci/tnetv107x.c +++ b/arch/arm/mach-davinci/tnetv107x.c @@ -730,6 +730,11 @@ static void tnetv107x_watchdog_reset(struct platform_device *pdev)  	__raw_writel(1, ®s->kick);  } +void tnetv107x_restart(char mode, const char *cmd) +{ +	tnetv107x_watchdog_reset(&tnetv107x_wdt_device); +} +  static struct davinci_soc_info tnetv107x_soc_info = {  	.io_desc		= io_desc,  	.io_desc_num		= ARRAY_SIZE(io_desc), @@ -752,8 +757,6 @@ static struct davinci_soc_info tnetv107x_soc_info = {  	.gpio_num		= TNETV107X_N_GPIO,  	.timer_info		= &timer_info,  	.serial_dev		= &tnetv107x_serial_device, -	.reset			= tnetv107x_watchdog_reset, -	.reset_device		= &tnetv107x_wdt_device,  };  void __init tnetv107x_init(void) diff --git a/arch/arm/mach-dove/cm-a510.c b/arch/arm/mach-dove/cm-a510.c index c8a406f7e94..792b4e2e24f 100644 --- a/arch/arm/mach-dove/cm-a510.c +++ b/arch/arm/mach-dove/cm-a510.c @@ -93,4 +93,5 @@ MACHINE_START(CM_A510, "Compulab CM-A510 Board")  	.init_early	= dove_init_early,  	.init_irq	= dove_init_irq,  	.timer		= &dove_timer, +	.restart	= dove_restart,  MACHINE_END diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index a9e0dae86a2..13bb236cd0c 100644 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c @@ -292,3 +292,19 @@ void __init dove_init(void)  	dove_xor0_init();  	dove_xor1_init();  } + +void dove_restart(char mode, const char *cmd) +{ +	/* +	 * Enable soft reset to assert RSTOUTn. +	 */ +	writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); + +	/* +	 * Assert soft reset. +	 */ +	writel(SOFT_RESET, SYSTEM_SOFT_RESET); + +	while (1) +		; +} diff --git a/arch/arm/mach-dove/common.h b/arch/arm/mach-dove/common.h index 6a2046e4470..42027305c10 100644 --- a/arch/arm/mach-dove/common.h +++ b/arch/arm/mach-dove/common.h @@ -39,5 +39,6 @@ void dove_spi1_init(void);  void dove_i2c_init(void);  void dove_sdio0_init(void);  void dove_sdio1_init(void); +void dove_restart(char, const char *);  #endif diff --git a/arch/arm/mach-dove/dove-db-setup.c b/arch/arm/mach-dove/dove-db-setup.c index 11ea34e4fc7..ea77ae430b2 100644 --- a/arch/arm/mach-dove/dove-db-setup.c +++ b/arch/arm/mach-dove/dove-db-setup.c @@ -100,4 +100,5 @@ MACHINE_START(DOVE_DB, "Marvell DB-MV88AP510-BP Development Board")  	.init_early	= dove_init_early,  	.init_irq	= dove_init_irq,  	.timer		= &dove_timer, +	.restart	= dove_restart,  MACHINE_END diff --git a/arch/arm/mach-dove/include/mach/system.h b/arch/arm/mach-dove/include/mach/system.h index 356afda5685..3027954f616 100644 --- a/arch/arm/mach-dove/include/mach/system.h +++ b/arch/arm/mach-dove/include/mach/system.h @@ -9,28 +9,9 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <mach/bridge-regs.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	/* -	 * Enable soft reset to assert RSTOUTn. -	 */ -	writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); - -	/* -	 * Assert soft reset. -	 */ -	writel(SOFT_RESET, SYSTEM_SOFT_RESET); - -	while (1) -		; -} - -  #endif diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c index ce3ed244c4b..294aad07f7a 100644 --- a/arch/arm/mach-ebsa110/core.c +++ b/arch/arm/mach-ebsa110/core.c @@ -278,6 +278,11 @@ static int __init ebsa110_init(void)  arch_initcall(ebsa110_init); +static void ebsa110_restart(char mode, const char *cmd) +{ +	soft_restart(0x80000000); +} +  MACHINE_START(EBSA110, "EBSA110")  	/* Maintainer: Russell King */  	.atag_offset	= 0x400, @@ -287,4 +292,5 @@ MACHINE_START(EBSA110, "EBSA110")  	.map_io		= ebsa110_map_io,  	.init_irq	= ebsa110_init_irq,  	.timer		= &ebsa110_timer, +	.restart	= ebsa110_restart,  MACHINE_END diff --git a/arch/arm/mach-ebsa110/include/mach/system.h b/arch/arm/mach-ebsa110/include/mach/system.h index 0d5df72a03f..2e4af65edb6 100644 --- a/arch/arm/mach-ebsa110/include/mach/system.h +++ b/arch/arm/mach-ebsa110/include/mach/system.h @@ -34,6 +34,4 @@ static inline void arch_idle(void)  	asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc");  } -#define arch_reset(mode, cmd)	soft_restart(0x80000000) -  #endif diff --git a/arch/arm/mach-ep93xx/adssphere.c b/arch/arm/mach-ep93xx/adssphere.c index d9b0ea2ba4d..681e939407d 100644 --- a/arch/arm/mach-ep93xx/adssphere.c +++ b/arch/arm/mach-ep93xx/adssphere.c @@ -40,4 +40,5 @@ MACHINE_START(ADSSPHERE, "ADS Sphere board")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= adssphere_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index 2432a6b7dca..24203f9a679 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c @@ -906,3 +906,15 @@ void __init ep93xx_init_devices(void)  	platform_device_register(&ep93xx_ohci_device);  	platform_device_register(&ep93xx_leds);  } + +void ep93xx_restart(char mode, const char *cmd) +{ +	/* +	 * Set then clear the SWRST bit to initiate a software reset +	 */ +	ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_SWRST); +	ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_SWRST); + +	while (1) +		; +} diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c index 9bbae0835f2..d115653edca 100644 --- a/arch/arm/mach-ep93xx/edb93xx.c +++ b/arch/arm/mach-ep93xx/edb93xx.c @@ -254,6 +254,7 @@ MACHINE_START(EDB9301, "Cirrus Logic EDB9301 Evaluation Board")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= edb93xx_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif @@ -266,6 +267,7 @@ MACHINE_START(EDB9302, "Cirrus Logic EDB9302 Evaluation Board")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= edb93xx_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif @@ -278,6 +280,7 @@ MACHINE_START(EDB9302A, "Cirrus Logic EDB9302A Evaluation Board")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= edb93xx_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif @@ -290,6 +293,7 @@ MACHINE_START(EDB9307, "Cirrus Logic EDB9307 Evaluation Board")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= edb93xx_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif @@ -302,6 +306,7 @@ MACHINE_START(EDB9307A, "Cirrus Logic EDB9307A Evaluation Board")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= edb93xx_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif @@ -314,6 +319,7 @@ MACHINE_START(EDB9312, "Cirrus Logic EDB9312 Evaluation Board")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= edb93xx_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif @@ -326,6 +332,7 @@ MACHINE_START(EDB9315, "Cirrus Logic EDB9315 Evaluation Board")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= edb93xx_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif @@ -338,5 +345,6 @@ MACHINE_START(EDB9315A, "Cirrus Logic EDB9315A Evaluation Board")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= edb93xx_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-ep93xx/gesbc9312.c b/arch/arm/mach-ep93xx/gesbc9312.c index 1dd32a7c5f1..af46970dc58 100644 --- a/arch/arm/mach-ep93xx/gesbc9312.c +++ b/arch/arm/mach-ep93xx/gesbc9312.c @@ -40,4 +40,5 @@ MACHINE_START(GESBC9312, "Glomation GESBC-9312-sx")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= gesbc9312_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h index 50660455b1d..d4c934931f9 100644 --- a/arch/arm/mach-ep93xx/include/mach/platform.h +++ b/arch/arm/mach-ep93xx/include/mach/platform.h @@ -66,4 +66,6 @@ void ep93xx_register_ac97(void);  void ep93xx_init_devices(void);  extern struct sys_timer ep93xx_timer; +void ep93xx_restart(char, const char *); +  #endif diff --git a/arch/arm/mach-ep93xx/include/mach/system.h b/arch/arm/mach-ep93xx/include/mach/system.h index bdf6c4f1fee..b5bec7cb9b5 100644 --- a/arch/arm/mach-ep93xx/include/mach/system.h +++ b/arch/arm/mach-ep93xx/include/mach/system.h @@ -1,22 +1,7 @@  /*   * arch/arm/mach-ep93xx/include/mach/system.h   */ - -#include <mach/hardware.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } - -static inline void arch_reset(char mode, const char *cmd) -{ -	/* -	 * Set then clear the SWRST bit to initiate a software reset -	 */ -	ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_SWRST); -	ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_SWRST); - -	while (1) -		; -} diff --git a/arch/arm/mach-ep93xx/micro9.c b/arch/arm/mach-ep93xx/micro9.c index a6dae6c2e3c..7b98084f0c9 100644 --- a/arch/arm/mach-ep93xx/micro9.c +++ b/arch/arm/mach-ep93xx/micro9.c @@ -84,6 +84,7 @@ MACHINE_START(MICRO9, "Contec Micro9-High")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= micro9_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif @@ -96,6 +97,7 @@ MACHINE_START(MICRO9M, "Contec Micro9-Mid")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= micro9_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif @@ -108,6 +110,7 @@ MACHINE_START(MICRO9L, "Contec Micro9-Lite")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= micro9_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif @@ -120,5 +123,6 @@ MACHINE_START(MICRO9S, "Contec Micro9-Slim")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= micro9_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-ep93xx/simone.c b/arch/arm/mach-ep93xx/simone.c index 40121ba8e71..f4e553eca21 100644 --- a/arch/arm/mach-ep93xx/simone.c +++ b/arch/arm/mach-ep93xx/simone.c @@ -84,4 +84,5 @@ MACHINE_START(SIM_ONE, "Simplemachines Sim.One Board")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= simone_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ep93xx/snappercl15.c b/arch/arm/mach-ep93xx/snappercl15.c index ec7c63ff01e..fd846331ddf 100644 --- a/arch/arm/mach-ep93xx/snappercl15.c +++ b/arch/arm/mach-ep93xx/snappercl15.c @@ -181,4 +181,5 @@ MACHINE_START(SNAPPER_CL15, "Bluewater Systems Snapper CL15")  	.handle_irq	= vic_handle_irq,  	.timer 		= &ep93xx_timer,  	.init_machine	= snappercl15_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c index 760384e6407..79f8ecf07a1 100644 --- a/arch/arm/mach-ep93xx/ts72xx.c +++ b/arch/arm/mach-ep93xx/ts72xx.c @@ -251,4 +251,5 @@ MACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC")  	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= ts72xx_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c index d96e4dbec6a..03dd4012043 100644 --- a/arch/arm/mach-ep93xx/vision_ep9307.c +++ b/arch/arm/mach-ep93xx/vision_ep9307.c @@ -361,4 +361,5 @@ MACHINE_START(VISION_EP9307, "Vision Engraving Systems EP9307")  	.init_irq	= ep93xx_init_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= vision_init_machine, +	.restart	= ep93xx_restart,  MACHINE_END diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile index 59069a35e40..bcb9efc576e 100644 --- a/arch/arm/mach-exynos/Makefile +++ b/arch/arm/mach-exynos/Makefile @@ -10,15 +10,17 @@ obj-m				:=  obj-n				:=  obj-				:= -# Core support for EXYNOS4 system +# Core -obj-$(CONFIG_ARCH_EXYNOS4)	+= cpu.o init.o clock.o irq-combiner.o setup-i2c0.o -obj-$(CONFIG_ARCH_EXYNOS4)	+= irq-eint.o dma.o pmu.o +obj-$(CONFIG_ARCH_EXYNOS4)	+= common.o clock.o  obj-$(CONFIG_CPU_EXYNOS4210)	+= clock-exynos4210.o  obj-$(CONFIG_SOC_EXYNOS4212)	+= clock-exynos4212.o +  obj-$(CONFIG_PM)		+= pm.o  obj-$(CONFIG_CPU_IDLE)		+= cpuidle.o +obj-$(CONFIG_ARCH_EXYNOS4)	+= dma.o pmu.o +  obj-$(CONFIG_SMP)		+= platsmp.o headsmp.o  obj-$(CONFIG_EXYNOS4_MCT)	+= mct.o @@ -45,6 +47,7 @@ obj-$(CONFIG_EXYNOS4_DEV_PD)		+= dev-pd.o  obj-$(CONFIG_EXYNOS4_DEV_SYSMMU)	+= dev-sysmmu.o  obj-$(CONFIG_EXYNOS4_DEV_DWMCI)		+= dev-dwmci.o +obj-$(CONFIG_ARCH_EXYNOS4)		+= setup-i2c0.o  obj-$(CONFIG_EXYNOS4_SETUP_FIMC)	+= setup-fimc.o  obj-$(CONFIG_EXYNOS4_SETUP_FIMD0)	+= setup-fimd0.o  obj-$(CONFIG_EXYNOS4_SETUP_I2C1)	+= setup-i2c1.o diff --git a/arch/arm/mach-exynos/clock-exynos4210.c b/arch/arm/mach-exynos/clock-exynos4210.c index b9d5ef670eb..a5823a7f249 100644 --- a/arch/arm/mach-exynos/clock-exynos4210.c +++ b/arch/arm/mach-exynos/clock-exynos4210.c @@ -23,7 +23,6 @@  #include <plat/pll.h>  #include <plat/s5p-clock.h>  #include <plat/clock-clksrc.h> -#include <plat/exynos4.h>  #include <plat/pm.h>  #include <mach/hardware.h> @@ -31,6 +30,8 @@  #include <mach/regs-clock.h>  #include <mach/exynos4-clock.h> +#include "common.h" +  static struct sleep_save exynos4210_clock_save[] = {  	SAVE_ITEM(S5P_CLKSRC_IMAGE),  	SAVE_ITEM(S5P_CLKSRC_LCD1), diff --git a/arch/arm/mach-exynos/clock-exynos4212.c b/arch/arm/mach-exynos/clock-exynos4212.c index 77d5decb34f..26a668b0d10 100644 --- a/arch/arm/mach-exynos/clock-exynos4212.c +++ b/arch/arm/mach-exynos/clock-exynos4212.c @@ -23,7 +23,6 @@  #include <plat/pll.h>  #include <plat/s5p-clock.h>  #include <plat/clock-clksrc.h> -#include <plat/exynos4.h>  #include <plat/pm.h>  #include <mach/hardware.h> @@ -31,6 +30,8 @@  #include <mach/regs-clock.h>  #include <mach/exynos4-clock.h> +#include "common.h" +  static struct sleep_save exynos4212_clock_save[] = {  	SAVE_ITEM(S5P_CLKSRC_IMAGE),  	SAVE_ITEM(S5P_CLKDIV_IMAGE), diff --git a/arch/arm/mach-exynos/clock.c b/arch/arm/mach-exynos/clock.c index 2894f0adef5..83616a039b1 100644 --- a/arch/arm/mach-exynos/clock.c +++ b/arch/arm/mach-exynos/clock.c @@ -21,7 +21,6 @@  #include <plat/pll.h>  #include <plat/s5p-clock.h>  #include <plat/clock-clksrc.h> -#include <plat/exynos4.h>  #include <plat/pm.h>  #include <mach/map.h> @@ -29,6 +28,8 @@  #include <mach/sysmmu.h>  #include <mach/exynos4-clock.h> +#include "common.h" +  static struct sleep_save exynos4_clock_save[] = {  	SAVE_ITEM(S5P_CLKDIV_LEFTBUS),  	SAVE_ITEM(S5P_CLKGATE_IP_LEFTBUS), diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c new file mode 100644 index 00000000000..d2acb0f948c --- /dev/null +++ b/arch/arm/mach-exynos/common.c @@ -0,0 +1,713 @@ +/* + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. + *		http://www.samsung.com + * + * Common Codes for EXYNOS + * + * 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. + */ + +#include <linux/kernel.h> +#include <linux/interrupt.h> +#include <linux/irq.h> +#include <linux/io.h> +#include <linux/sysdev.h> +#include <linux/gpio.h> +#include <linux/sched.h> +#include <linux/serial_core.h> + +#include <asm/proc-fns.h> +#include <asm/hardware/cache-l2x0.h> +#include <asm/hardware/gic.h> +#include <asm/mach/map.h> +#include <asm/mach/irq.h> + +#include <mach/regs-irq.h> +#include <mach/regs-pmu.h> +#include <mach/regs-gpio.h> + +#include <plat/cpu.h> +#include <plat/clock.h> +#include <plat/devs.h> +#include <plat/pm.h> +#include <plat/sdhci.h> +#include <plat/gpio-cfg.h> +#include <plat/adc-core.h> +#include <plat/fb-core.h> +#include <plat/fimc-core.h> +#include <plat/iic-core.h> +#include <plat/tv-core.h> +#include <plat/regs-serial.h> + +#include "common.h" + +unsigned int gic_bank_offset __read_mostly; + +static const char name_exynos4210[] = "EXYNOS4210"; +static const char name_exynos4212[] = "EXYNOS4212"; +static const char name_exynos4412[] = "EXYNOS4412"; + +static struct cpu_table cpu_ids[] __initdata = { +	{ +		.idcode		= EXYNOS4210_CPU_ID, +		.idmask		= EXYNOS4_CPU_MASK, +		.map_io		= exynos4_map_io, +		.init_clocks	= exynos4_init_clocks, +		.init_uarts	= exynos4_init_uarts, +		.init		= exynos_init, +		.name		= name_exynos4210, +	}, { +		.idcode		= EXYNOS4212_CPU_ID, +		.idmask		= EXYNOS4_CPU_MASK, +		.map_io		= exynos4_map_io, +		.init_clocks	= exynos4_init_clocks, +		.init_uarts	= exynos4_init_uarts, +		.init		= exynos_init, +		.name		= name_exynos4212, +	}, { +		.idcode		= EXYNOS4412_CPU_ID, +		.idmask		= EXYNOS4_CPU_MASK, +		.map_io		= exynos4_map_io, +		.init_clocks	= exynos4_init_clocks, +		.init_uarts	= exynos4_init_uarts, +		.init		= exynos_init, +		.name		= name_exynos4412, +	}, +}; + +/* Initial IO mappings */ + +static struct map_desc exynos_iodesc[] __initdata = { +	{ +		.virtual	= (unsigned long)S5P_VA_CHIPID, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_CHIPID), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_SYS, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSCON), +		.length		= SZ_64K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_TIMER, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_TIMER), +		.length		= SZ_16K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_WATCHDOG, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_WATCHDOG), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_SROMC, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_SROMC), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_SYSTIMER, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSTIMER), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_PMU, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_PMU), +		.length		= SZ_64K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_COMBINER_BASE, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_COMBINER), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_GIC_CPU, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_GIC_CPU), +		.length		= SZ_64K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_GIC_DIST, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_GIC_DIST), +		.length		= SZ_64K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_UART, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_UART), +		.length		= SZ_512K, +		.type		= MT_DEVICE, +	}, +}; + +static struct map_desc exynos4_iodesc[] __initdata = { +	{ +		.virtual	= (unsigned long)S5P_VA_CMU, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_CMU), +		.length		= SZ_128K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_COREPERI_BASE, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_COREPERI), +		.length		= SZ_8K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_L2CC, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_L2CC), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_GPIO1, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_GPIO1), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_GPIO2, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_GPIO2), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_GPIO3, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_GPIO3), +		.length		= SZ_256, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_DMC0, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_DMC0), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_USB_HSPHY, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_HSPHY), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, +}; + +static struct map_desc exynos4_iodesc0[] __initdata = { +	{ +		.virtual	= (unsigned long)S5P_VA_SYSRAM, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSRAM0), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, +}; + +static struct map_desc exynos4_iodesc1[] __initdata = { +	{ +		.virtual	= (unsigned long)S5P_VA_SYSRAM, +		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSRAM1), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, +}; + +static void exynos_idle(void) +{ +	if (!need_resched()) +		cpu_do_idle(); + +	local_irq_enable(); +} + +void exynos4_restart(char mode, const char *cmd) +{ +	__raw_writel(0x1, S5P_SWRESET); +} + +/* + * exynos_map_io + * + * register the standard cpu IO areas + */ + +void __init exynos_init_io(struct map_desc *mach_desc, int size) +{ +	/* initialize the io descriptors we need for initialization */ +	iotable_init(exynos_iodesc, ARRAY_SIZE(exynos_iodesc)); +	if (mach_desc) +		iotable_init(mach_desc, size); + +	/* detect cpu id and rev. */ +	s5p_init_cpu(S5P_VA_CHIPID); + +	s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); +} + +void __init exynos4_map_io(void) +{ +	iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc)); + +	if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_0) +		iotable_init(exynos4_iodesc0, ARRAY_SIZE(exynos4_iodesc0)); +	else +		iotable_init(exynos4_iodesc1, ARRAY_SIZE(exynos4_iodesc1)); + +	/* initialize device information early */ +	exynos4_default_sdhci0(); +	exynos4_default_sdhci1(); +	exynos4_default_sdhci2(); +	exynos4_default_sdhci3(); + +	s3c_adc_setname("samsung-adc-v3"); + +	s3c_fimc_setname(0, "exynos4-fimc"); +	s3c_fimc_setname(1, "exynos4-fimc"); +	s3c_fimc_setname(2, "exynos4-fimc"); +	s3c_fimc_setname(3, "exynos4-fimc"); + +	/* The I2C bus controllers are directly compatible with s3c2440 */ +	s3c_i2c0_setname("s3c2440-i2c"); +	s3c_i2c1_setname("s3c2440-i2c"); +	s3c_i2c2_setname("s3c2440-i2c"); + +	s5p_fb_setname(0, "exynos4-fb"); +	s5p_hdmi_setname("exynos4-hdmi"); +} + +void __init exynos4_init_clocks(int xtal) +{ +	printk(KERN_DEBUG "%s: initializing clocks\n", __func__); + +	s3c24xx_register_baseclocks(xtal); +	s5p_register_clocks(xtal); + +	if (soc_is_exynos4210()) +		exynos4210_register_clocks(); +	else if (soc_is_exynos4212() || soc_is_exynos4412()) +		exynos4212_register_clocks(); + +	exynos4_register_clocks(); +	exynos4_setup_clocks(); +} + +#define COMBINER_ENABLE_SET	0x0 +#define COMBINER_ENABLE_CLEAR	0x4 +#define COMBINER_INT_STATUS	0xC + +static DEFINE_SPINLOCK(irq_controller_lock); + +struct combiner_chip_data { +	unsigned int irq_offset; +	unsigned int irq_mask; +	void __iomem *base; +}; + +static struct combiner_chip_data combiner_data[MAX_COMBINER_NR]; + +static inline void __iomem *combiner_base(struct irq_data *data) +{ +	struct combiner_chip_data *combiner_data = +		irq_data_get_irq_chip_data(data); + +	return combiner_data->base; +} + +static void combiner_mask_irq(struct irq_data *data) +{ +	u32 mask = 1 << (data->irq % 32); + +	__raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_CLEAR); +} + +static void combiner_unmask_irq(struct irq_data *data) +{ +	u32 mask = 1 << (data->irq % 32); + +	__raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_SET); +} + +static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) +{ +	struct combiner_chip_data *chip_data = irq_get_handler_data(irq); +	struct irq_chip *chip = irq_get_chip(irq); +	unsigned int cascade_irq, combiner_irq; +	unsigned long status; + +	chained_irq_enter(chip, desc); + +	spin_lock(&irq_controller_lock); +	status = __raw_readl(chip_data->base + COMBINER_INT_STATUS); +	spin_unlock(&irq_controller_lock); +	status &= chip_data->irq_mask; + +	if (status == 0) +		goto out; + +	combiner_irq = __ffs(status); + +	cascade_irq = combiner_irq + (chip_data->irq_offset & ~31); +	if (unlikely(cascade_irq >= NR_IRQS)) +		do_bad_IRQ(cascade_irq, desc); +	else +		generic_handle_irq(cascade_irq); + + out: +	chained_irq_exit(chip, desc); +} + +static struct irq_chip combiner_chip = { +	.name		= "COMBINER", +	.irq_mask	= combiner_mask_irq, +	.irq_unmask	= combiner_unmask_irq, +}; + +static void __init combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq) +{ +	if (combiner_nr >= MAX_COMBINER_NR) +		BUG(); +	if (irq_set_handler_data(irq, &combiner_data[combiner_nr]) != 0) +		BUG(); +	irq_set_chained_handler(irq, combiner_handle_cascade_irq); +} + +static void __init combiner_init(unsigned int combiner_nr, void __iomem *base, +			  unsigned int irq_start) +{ +	unsigned int i; + +	if (combiner_nr >= MAX_COMBINER_NR) +		BUG(); + +	combiner_data[combiner_nr].base = base; +	combiner_data[combiner_nr].irq_offset = irq_start; +	combiner_data[combiner_nr].irq_mask = 0xff << ((combiner_nr % 4) << 3); + +	/* Disable all interrupts */ + +	__raw_writel(combiner_data[combiner_nr].irq_mask, +		     base + COMBINER_ENABLE_CLEAR); + +	/* Setup the Linux IRQ subsystem */ + +	for (i = irq_start; i < combiner_data[combiner_nr].irq_offset +				+ MAX_IRQ_IN_COMBINER; i++) { +		irq_set_chip_and_handler(i, &combiner_chip, handle_level_irq); +		irq_set_chip_data(i, &combiner_data[combiner_nr]); +		set_irq_flags(i, IRQF_VALID | IRQF_PROBE); +	} +} + +static void exynos4_gic_irq_fix_base(struct irq_data *d) +{ +	struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); + +	gic_data->cpu_base = S5P_VA_GIC_CPU + +			    (gic_bank_offset * smp_processor_id()); + +	gic_data->dist_base = S5P_VA_GIC_DIST + +			    (gic_bank_offset * smp_processor_id()); +} + +void __init exynos4_init_irq(void) +{ +	int irq; + +	gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000; + +	gic_init(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU); +	gic_arch_extn.irq_eoi = exynos4_gic_irq_fix_base; +	gic_arch_extn.irq_unmask = exynos4_gic_irq_fix_base; +	gic_arch_extn.irq_mask = exynos4_gic_irq_fix_base; + +	for (irq = 0; irq < MAX_COMBINER_NR; irq++) { + +		combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq), +				COMBINER_IRQ(irq, 0)); +		combiner_cascade_irq(irq, IRQ_SPI(irq)); +	} + +	/* +	 * The parameters of s5p_init_irq() are for VIC init. +	 * Theses parameters should be NULL and 0 because EXYNOS4 +	 * uses GIC instead of VIC. +	 */ +	s5p_init_irq(NULL, 0); +} + +struct sysdev_class exynos4_sysclass = { +	.name	= "exynos4-core", +}; + +static struct sys_device exynos4_sysdev = { +	.cls	= &exynos4_sysclass, +}; + +static int __init exynos4_core_init(void) +{ +	return sysdev_class_register(&exynos4_sysclass); +} +core_initcall(exynos4_core_init); + +#ifdef CONFIG_CACHE_L2X0 +static int __init exynos4_l2x0_cache_init(void) +{ +	/* TAG, Data Latency Control: 2cycle */ +	__raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL); + +	if (soc_is_exynos4210()) +		__raw_writel(0x110, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL); +	else if (soc_is_exynos4212() || soc_is_exynos4412()) +		__raw_writel(0x120, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL); + +	/* L2X0 Prefetch Control */ +	__raw_writel(0x30000007, S5P_VA_L2CC + L2X0_PREFETCH_CTRL); + +	/* L2X0 Power Control */ +	__raw_writel(L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN, +		     S5P_VA_L2CC + L2X0_POWER_CTRL); + +	l2x0_init(S5P_VA_L2CC, 0x7C470001, 0xC200ffff); + +	return 0; +} + +early_initcall(exynos4_l2x0_cache_init); +#endif + +int __init exynos_init(void) +{ +	printk(KERN_INFO "EXYNOS: Initializing architecture\n"); + +	/* set idle function */ +	pm_idle = exynos_idle; + +	return sysdev_register(&exynos4_sysdev); +} + +static struct s3c24xx_uart_clksrc exynos4_serial_clocks[] = { +	[0] = { +		.name		= "uclk1", +		.divisor	= 1, +		.min_baud	= 0, +		.max_baud	= 0, +	}, +}; + +/* uart registration process */ + +void __init exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no) +{ +	struct s3c2410_uartcfg *tcfg = cfg; +	u32 ucnt; + +	for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { +		if (!tcfg->clocks) { +			tcfg->has_fracval = 1; +			tcfg->clocks = exynos4_serial_clocks; +			tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks); +		} +		tcfg->flags |= NO_NEED_CHECK_CLKSRC; +	} + +	s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); +} + +static DEFINE_SPINLOCK(eint_lock); + +static unsigned int eint0_15_data[16]; + +static unsigned int exynos4_get_irq_nr(unsigned int number) +{ +	u32 ret = 0; + +	switch (number) { +	case 0 ... 3: +		ret = (number + IRQ_EINT0); +		break; +	case 4 ... 7: +		ret = (number + (IRQ_EINT4 - 4)); +		break; +	case 8 ... 15: +		ret = (number + (IRQ_EINT8 - 8)); +		break; +	default: +		printk(KERN_ERR "number available : %d\n", number); +	} + +	return ret; +} + +static inline void exynos4_irq_eint_mask(struct irq_data *data) +{ +	u32 mask; + +	spin_lock(&eint_lock); +	mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq))); +	mask |= eint_irq_to_bit(data->irq); +	__raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq))); +	spin_unlock(&eint_lock); +} + +static void exynos4_irq_eint_unmask(struct irq_data *data) +{ +	u32 mask; + +	spin_lock(&eint_lock); +	mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq))); +	mask &= ~(eint_irq_to_bit(data->irq)); +	__raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq))); +	spin_unlock(&eint_lock); +} + +static inline void exynos4_irq_eint_ack(struct irq_data *data) +{ +	__raw_writel(eint_irq_to_bit(data->irq), +		     S5P_EINT_PEND(EINT_REG_NR(data->irq))); +} + +static void exynos4_irq_eint_maskack(struct irq_data *data) +{ +	exynos4_irq_eint_mask(data); +	exynos4_irq_eint_ack(data); +} + +static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type) +{ +	int offs = EINT_OFFSET(data->irq); +	int shift; +	u32 ctrl, mask; +	u32 newvalue = 0; + +	switch (type) { +	case IRQ_TYPE_EDGE_RISING: +		newvalue = S5P_IRQ_TYPE_EDGE_RISING; +		break; + +	case IRQ_TYPE_EDGE_FALLING: +		newvalue = S5P_IRQ_TYPE_EDGE_FALLING; +		break; + +	case IRQ_TYPE_EDGE_BOTH: +		newvalue = S5P_IRQ_TYPE_EDGE_BOTH; +		break; + +	case IRQ_TYPE_LEVEL_LOW: +		newvalue = S5P_IRQ_TYPE_LEVEL_LOW; +		break; + +	case IRQ_TYPE_LEVEL_HIGH: +		newvalue = S5P_IRQ_TYPE_LEVEL_HIGH; +		break; + +	default: +		printk(KERN_ERR "No such irq type %d", type); +		return -EINVAL; +	} + +	shift = (offs & 0x7) * 4; +	mask = 0x7 << shift; + +	spin_lock(&eint_lock); +	ctrl = __raw_readl(S5P_EINT_CON(EINT_REG_NR(data->irq))); +	ctrl &= ~mask; +	ctrl |= newvalue << shift; +	__raw_writel(ctrl, S5P_EINT_CON(EINT_REG_NR(data->irq))); +	spin_unlock(&eint_lock); + +	switch (offs) { +	case 0 ... 7: +		s3c_gpio_cfgpin(EINT_GPIO_0(offs & 0x7), EINT_MODE); +		break; +	case 8 ... 15: +		s3c_gpio_cfgpin(EINT_GPIO_1(offs & 0x7), EINT_MODE); +		break; +	case 16 ... 23: +		s3c_gpio_cfgpin(EINT_GPIO_2(offs & 0x7), EINT_MODE); +		break; +	case 24 ... 31: +		s3c_gpio_cfgpin(EINT_GPIO_3(offs & 0x7), EINT_MODE); +		break; +	default: +		printk(KERN_ERR "No such irq number %d", offs); +	} + +	return 0; +} + +static struct irq_chip exynos4_irq_eint = { +	.name		= "exynos4-eint", +	.irq_mask	= exynos4_irq_eint_mask, +	.irq_unmask	= exynos4_irq_eint_unmask, +	.irq_mask_ack	= exynos4_irq_eint_maskack, +	.irq_ack	= exynos4_irq_eint_ack, +	.irq_set_type	= exynos4_irq_eint_set_type, +#ifdef CONFIG_PM +	.irq_set_wake	= s3c_irqext_wake, +#endif +}; + +/* + * exynos4_irq_demux_eint + * + * This function demuxes the IRQ from from EINTs 16 to 31. + * It is designed to be inlined into the specific handler + * s5p_irq_demux_eintX_Y. + * + * Each EINT pend/mask registers handle eight of them. + */ +static inline void exynos4_irq_demux_eint(unsigned int start) +{ +	unsigned int irq; + +	u32 status = __raw_readl(S5P_EINT_PEND(EINT_REG_NR(start))); +	u32 mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(start))); + +	status &= ~mask; +	status &= 0xff; + +	while (status) { +		irq = fls(status) - 1; +		generic_handle_irq(irq + start); +		status &= ~(1 << irq); +	} +} + +static void exynos4_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc) +{ +	struct irq_chip *chip = irq_get_chip(irq); +	chained_irq_enter(chip, desc); +	exynos4_irq_demux_eint(IRQ_EINT(16)); +	exynos4_irq_demux_eint(IRQ_EINT(24)); +	chained_irq_exit(chip, desc); +} + +static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) +{ +	u32 *irq_data = irq_get_handler_data(irq); +	struct irq_chip *chip = irq_get_chip(irq); + +	chained_irq_enter(chip, desc); +	chip->irq_mask(&desc->irq_data); + +	if (chip->irq_ack) +		chip->irq_ack(&desc->irq_data); + +	generic_handle_irq(*irq_data); + +	chip->irq_unmask(&desc->irq_data); +	chained_irq_exit(chip, desc); +} + +int __init exynos4_init_irq_eint(void) +{ +	int irq; + +	for (irq = 0 ; irq <= 31 ; irq++) { +		irq_set_chip_and_handler(IRQ_EINT(irq), &exynos4_irq_eint, +					 handle_level_irq); +		set_irq_flags(IRQ_EINT(irq), IRQF_VALID); +	} + +	irq_set_chained_handler(IRQ_EINT16_31, exynos4_irq_demux_eint16_31); + +	for (irq = 0 ; irq <= 15 ; irq++) { +		eint0_15_data[irq] = IRQ_EINT(irq); + +		irq_set_handler_data(exynos4_get_irq_nr(irq), +				     &eint0_15_data[irq]); +		irq_set_chained_handler(exynos4_get_irq_nr(irq), +					exynos4_irq_eint0_15); +	} + +	return 0; +} +arch_initcall(exynos4_init_irq_eint); diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h new file mode 100644 index 00000000000..1ac49de0f39 --- /dev/null +++ b/arch/arm/mach-exynos/common.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + *		http://www.samsung.com + * + * Common Header for EXYNOS machines + * + * 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. + */ + +#ifndef __ARCH_ARM_MACH_EXYNOS_COMMON_H +#define __ARCH_ARM_MACH_EXYNOS_COMMON_H + +void exynos_init_io(struct map_desc *mach_desc, int size); +void exynos4_init_irq(void); + +void exynos4_register_clocks(void); +void exynos4_setup_clocks(void); + +void exynos4210_register_clocks(void); +void exynos4212_register_clocks(void); + +void exynos4_restart(char mode, const char *cmd); + +extern struct sys_timer exynos4_timer; + +#ifdef CONFIG_ARCH_EXYNOS +extern  int exynos_init(void); +extern void exynos4_map_io(void); +extern void exynos4_init_clocks(int xtal); +extern void exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no); + +#else +#define exynos4_init_clocks NULL +#define exynos4_init_uarts NULL +#define exynos4_map_io NULL +#define exynos_init NULL +#endif + +#endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */ diff --git a/arch/arm/mach-exynos/cpu.c b/arch/arm/mach-exynos/cpu.c deleted file mode 100644 index 699774cbf11..00000000000 --- a/arch/arm/mach-exynos/cpu.c +++ /dev/null @@ -1,279 +0,0 @@ -/* linux/arch/arm/mach-exynos/cpu.c - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. - *		http://www.samsung.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. -*/ - -#include <linux/sched.h> -#include <linux/sysdev.h> - -#include <asm/mach/map.h> -#include <asm/mach/irq.h> - -#include <asm/proc-fns.h> -#include <asm/exception.h> -#include <asm/hardware/cache-l2x0.h> -#include <asm/hardware/gic.h> - -#include <plat/cpu.h> -#include <plat/clock.h> -#include <plat/devs.h> -#include <plat/exynos4.h> -#include <plat/adc-core.h> -#include <plat/sdhci.h> -#include <plat/fb-core.h> -#include <plat/fimc-core.h> -#include <plat/iic-core.h> -#include <plat/reset.h> -#include <plat/tv-core.h> - -#include <mach/regs-irq.h> -#include <mach/regs-pmu.h> - -extern int combiner_init(unsigned int combiner_nr, void __iomem *base, -			 unsigned int irq_start); -extern void combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq); - -/* Initial IO mappings */ -static struct map_desc exynos_iodesc[] __initdata = { -	{ -		.virtual	= (unsigned long)S5P_VA_SYSTIMER, -		.pfn		= __phys_to_pfn(EXYNOS_PA_SYSTIMER), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S5P_VA_PMU, -		.pfn		= __phys_to_pfn(EXYNOS_PA_PMU), -		.length		= SZ_64K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S5P_VA_COMBINER_BASE, -		.pfn		= __phys_to_pfn(EXYNOS_PA_COMBINER), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S5P_VA_GIC_CPU, -		.pfn		= __phys_to_pfn(EXYNOS_PA_GIC_CPU), -		.length		= SZ_64K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S5P_VA_GIC_DIST, -		.pfn		= __phys_to_pfn(EXYNOS_PA_GIC_DIST), -		.length		= SZ_64K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C_VA_UART, -		.pfn		= __phys_to_pfn(S3C_PA_UART), -		.length		= SZ_512K, -		.type		= MT_DEVICE, -	}, -}; - -static struct map_desc exynos4_iodesc[] __initdata = { -	{ -		.virtual	= (unsigned long)S5P_VA_CMU, -		.pfn		= __phys_to_pfn(EXYNOS4_PA_CMU), -		.length		= SZ_128K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S5P_VA_COREPERI_BASE, -		.pfn		= __phys_to_pfn(EXYNOS4_PA_COREPERI), -		.length		= SZ_8K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S5P_VA_L2CC, -		.pfn		= __phys_to_pfn(EXYNOS4_PA_L2CC), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S5P_VA_GPIO1, -		.pfn		= __phys_to_pfn(EXYNOS4_PA_GPIO1), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S5P_VA_GPIO2, -		.pfn		= __phys_to_pfn(EXYNOS4_PA_GPIO2), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S5P_VA_GPIO3, -		.pfn		= __phys_to_pfn(EXYNOS4_PA_GPIO3), -		.length		= SZ_256, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S5P_VA_DMC0, -		.pfn		= __phys_to_pfn(EXYNOS4_PA_DMC0), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C_VA_USB_HSPHY, -		.pfn		= __phys_to_pfn(EXYNOS4_PA_HSPHY), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, -}; - -static struct map_desc exynos4_iodesc0[] __initdata = { -	{ -		.virtual	= (unsigned long)S5P_VA_SYSRAM, -		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSRAM0), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, -}; - -static struct map_desc exynos4_iodesc1[] __initdata = { -	{ -		.virtual	= (unsigned long)S5P_VA_SYSRAM, -		.pfn		= __phys_to_pfn(EXYNOS4_PA_SYSRAM1), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, -}; - -static void exynos_idle(void) -{ -	if (!need_resched()) -		cpu_do_idle(); - -	local_irq_enable(); -} - -static void exynos4_sw_reset(void) -{ -	__raw_writel(0x1, S5P_SWRESET); -} - -/* - * exynos_map_io - * - * register the standard cpu IO areas - */ -void __init exynos4_map_io(void) -{ -	iotable_init(exynos_iodesc, ARRAY_SIZE(exynos_iodesc)); -	iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc)); - -	if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_0) -		iotable_init(exynos4_iodesc0, ARRAY_SIZE(exynos4_iodesc0)); -	else -		iotable_init(exynos4_iodesc1, ARRAY_SIZE(exynos4_iodesc1)); - -	/* initialize device information early */ -	exynos4_default_sdhci0(); -	exynos4_default_sdhci1(); -	exynos4_default_sdhci2(); -	exynos4_default_sdhci3(); - -	s3c_adc_setname("samsung-adc-v3"); - -	s3c_fimc_setname(0, "exynos4-fimc"); -	s3c_fimc_setname(1, "exynos4-fimc"); -	s3c_fimc_setname(2, "exynos4-fimc"); -	s3c_fimc_setname(3, "exynos4-fimc"); - -	/* The I2C bus controllers are directly compatible with s3c2440 */ -	s3c_i2c0_setname("s3c2440-i2c"); -	s3c_i2c1_setname("s3c2440-i2c"); -	s3c_i2c2_setname("s3c2440-i2c"); - -	s5p_fb_setname(0, "exynos4-fb"); -	s5p_hdmi_setname("exynos4-hdmi"); -} - -void __init exynos4_init_clocks(int xtal) -{ -	printk(KERN_DEBUG "%s: initializing clocks\n", __func__); - -	s3c24xx_register_baseclocks(xtal); -	s5p_register_clocks(xtal); - -	if (soc_is_exynos4210()) -		exynos4210_register_clocks(); -	else if (soc_is_exynos4212() || soc_is_exynos4412()) -		exynos4212_register_clocks(); - -	exynos4_register_clocks(); -	exynos4_setup_clocks(); -} - -void __init exynos4_init_irq(void) -{ -	int irq; -	unsigned int gic_bank_offset; - -	gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000; - -	gic_init_bases(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU, gic_bank_offset); - -	for (irq = 0; irq < MAX_COMBINER_NR; irq++) { - -		combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq), -				COMBINER_IRQ(irq, 0)); -		combiner_cascade_irq(irq, IRQ_SPI(irq)); -	} - -	/* The parameters of s5p_init_irq() are for VIC init. -	 * Theses parameters should be NULL and 0 because EXYNOS4 -	 * uses GIC instead of VIC. -	 */ -	s5p_init_irq(NULL, 0); -} - -struct sysdev_class exynos4_sysclass = { -	.name	= "exynos4-core", -}; - -static struct sys_device exynos4_sysdev = { -	.cls	= &exynos4_sysclass, -}; - -static int __init exynos4_core_init(void) -{ -	return sysdev_class_register(&exynos4_sysclass); -} -core_initcall(exynos4_core_init); - -#ifdef CONFIG_CACHE_L2X0 -static int __init exynos4_l2x0_cache_init(void) -{ -	/* TAG, Data Latency Control: 2cycle */ -	__raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL); - -	if (soc_is_exynos4210()) -		__raw_writel(0x110, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL); -	else if (soc_is_exynos4212() || soc_is_exynos4412()) -		__raw_writel(0x120, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL); - -	/* L2X0 Prefetch Control */ -	__raw_writel(0x30000007, S5P_VA_L2CC + L2X0_PREFETCH_CTRL); - -	/* L2X0 Power Control */ -	__raw_writel(L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN, -		     S5P_VA_L2CC + L2X0_POWER_CTRL); - -	l2x0_init(S5P_VA_L2CC, 0x7C470001, 0xC200ffff); - -	return 0; -} - -early_initcall(exynos4_l2x0_cache_init); -#endif - -int __init exynos_init(void) -{ -	printk(KERN_INFO "EXYNOS: Initializing architecture\n"); - -	/* set idle function */ -	pm_idle = exynos_idle; - -	/* set sw_reset function */ -	if (soc_is_exynos4210() || soc_is_exynos4212() || soc_is_exynos4412()) -		s5p_reset_hook = exynos4_sw_reset; - -	return sysdev_register(&exynos4_sysdev); -} diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h index 058541d45af..d1829860a0e 100644 --- a/arch/arm/mach-exynos/include/mach/map.h +++ b/arch/arm/mach-exynos/include/mach/map.h @@ -149,7 +149,6 @@  #define S3C_PA_WDT			EXYNOS4_PA_WATCHDOG  #define S3C_PA_UART			EXYNOS4_PA_UART -#define S5P_PA_CHIPID			EXYNOS4_PA_CHIPID  #define S5P_PA_EHCI			EXYNOS4_PA_EHCI  #define S5P_PA_FIMC0			EXYNOS4_PA_FIMC0  #define S5P_PA_FIMC1			EXYNOS4_PA_FIMC1 @@ -166,26 +165,17 @@  #define S5P_PA_ONENAND_DMA		EXYNOS4_PA_ONENAND_DMA  #define S5P_PA_SDO			EXYNOS4_PA_SDO  #define S5P_PA_SDRAM			EXYNOS4_PA_SDRAM -#define S5P_PA_SROMC			EXYNOS4_PA_SROMC -#define S5P_PA_SYSCON			EXYNOS4_PA_SYSCON -#define S5P_PA_TIMER			EXYNOS4_PA_TIMER  #define S5P_PA_VP			EXYNOS4_PA_VP  #define SAMSUNG_PA_ADC			EXYNOS4_PA_ADC  #define SAMSUNG_PA_ADC1			EXYNOS4_PA_ADC1  #define SAMSUNG_PA_KEYPAD		EXYNOS4_PA_KEYPAD -#define EXYNOS_PA_COMBINER		EXYNOS4_PA_COMBINER -#define EXYNOS_PA_GIC_CPU		EXYNOS4_PA_GIC_CPU -#define EXYNOS_PA_GIC_DIST		EXYNOS4_PA_GIC_DIST -#define EXYNOS_PA_PMU			EXYNOS4_PA_PMU -#define EXYNOS_PA_SYSTIMER		EXYNOS4_PA_SYSTIMER -  /* Compatibility UART */  #define S3C_VA_UARTx(x)			(S3C_VA_UART + ((x) * S3C_UART_OFFSET)) -#define S5P_PA_UART(x)			(S3C_PA_UART + ((x) * S3C_UART_OFFSET)) +#define S5P_PA_UART(x)			(EXYNOS4_PA_UART + ((x) * S3C_UART_OFFSET))  #define S5P_PA_UART0			S5P_PA_UART(0)  #define S5P_PA_UART1			S5P_PA_UART(1)  #define S5P_PA_UART2			S5P_PA_UART(2) diff --git a/arch/arm/mach-exynos/include/mach/system.h b/arch/arm/mach-exynos/include/mach/system.h index 5e3220c18fc..0063a6de3dc 100644 --- a/arch/arm/mach-exynos/include/mach/system.h +++ b/arch/arm/mach-exynos/include/mach/system.h @@ -13,8 +13,6 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H __FILE__ -#include <plat/system-reset.h> -  static void arch_idle(void)  {  	/* nothing here yet */ diff --git a/arch/arm/mach-exynos/init.c b/arch/arm/mach-exynos/init.c deleted file mode 100644 index a8a83e3881a..00000000000 --- a/arch/arm/mach-exynos/init.c +++ /dev/null @@ -1,42 +0,0 @@ -/* linux/arch/arm/mach-exynos4/init.c - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.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. -*/ - -#include <linux/serial_core.h> - -#include <plat/cpu.h> -#include <plat/devs.h> -#include <plat/regs-serial.h> - -static struct s3c24xx_uart_clksrc exynos4_serial_clocks[] = { -	[0] = { -		.name		= "uclk1", -		.divisor	= 1, -		.min_baud	= 0, -		.max_baud	= 0, -	}, -}; - -/* uart registration process */ -void __init exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) -{ -	struct s3c2410_uartcfg *tcfg = cfg; -	u32 ucnt; - -	for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { -		if (!tcfg->clocks) { -			tcfg->has_fracval = 1; -			tcfg->clocks = exynos4_serial_clocks; -			tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks); -		} -		tcfg->flags |= NO_NEED_CHECK_CLKSRC; -	} - -	s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); -} diff --git a/arch/arm/mach-exynos/irq-combiner.c b/arch/arm/mach-exynos/irq-combiner.c deleted file mode 100644 index 5a2758ab055..00000000000 --- a/arch/arm/mach-exynos/irq-combiner.c +++ /dev/null @@ -1,124 +0,0 @@ -/* linux/arch/arm/mach-exynos4/irq-combiner.c - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * Based on arch/arm/common/gic.c - * - * IRQ COMBINER support - * - * 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. -*/ - -#include <linux/io.h> - -#include <asm/mach/irq.h> - -#define COMBINER_ENABLE_SET	0x0 -#define COMBINER_ENABLE_CLEAR	0x4 -#define COMBINER_INT_STATUS	0xC - -static DEFINE_SPINLOCK(irq_controller_lock); - -struct combiner_chip_data { -	unsigned int irq_offset; -	unsigned int irq_mask; -	void __iomem *base; -}; - -static struct combiner_chip_data combiner_data[MAX_COMBINER_NR]; - -static inline void __iomem *combiner_base(struct irq_data *data) -{ -	struct combiner_chip_data *combiner_data = -		irq_data_get_irq_chip_data(data); - -	return combiner_data->base; -} - -static void combiner_mask_irq(struct irq_data *data) -{ -	u32 mask = 1 << (data->irq % 32); - -	__raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_CLEAR); -} - -static void combiner_unmask_irq(struct irq_data *data) -{ -	u32 mask = 1 << (data->irq % 32); - -	__raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_SET); -} - -static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) -{ -	struct combiner_chip_data *chip_data = irq_get_handler_data(irq); -	struct irq_chip *chip = irq_get_chip(irq); -	unsigned int cascade_irq, combiner_irq; -	unsigned long status; - -	chained_irq_enter(chip, desc); - -	spin_lock(&irq_controller_lock); -	status = __raw_readl(chip_data->base + COMBINER_INT_STATUS); -	spin_unlock(&irq_controller_lock); -	status &= chip_data->irq_mask; - -	if (status == 0) -		goto out; - -	combiner_irq = __ffs(status); - -	cascade_irq = combiner_irq + (chip_data->irq_offset & ~31); -	if (unlikely(cascade_irq >= NR_IRQS)) -		do_bad_IRQ(cascade_irq, desc); -	else -		generic_handle_irq(cascade_irq); - - out: -	chained_irq_exit(chip, desc); -} - -static struct irq_chip combiner_chip = { -	.name		= "COMBINER", -	.irq_mask	= combiner_mask_irq, -	.irq_unmask	= combiner_unmask_irq, -}; - -void __init combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq) -{ -	if (combiner_nr >= MAX_COMBINER_NR) -		BUG(); -	if (irq_set_handler_data(irq, &combiner_data[combiner_nr]) != 0) -		BUG(); -	irq_set_chained_handler(irq, combiner_handle_cascade_irq); -} - -void __init combiner_init(unsigned int combiner_nr, void __iomem *base, -			  unsigned int irq_start) -{ -	unsigned int i; - -	if (combiner_nr >= MAX_COMBINER_NR) -		BUG(); - -	combiner_data[combiner_nr].base = base; -	combiner_data[combiner_nr].irq_offset = irq_start; -	combiner_data[combiner_nr].irq_mask = 0xff << ((combiner_nr % 4) << 3); - -	/* Disable all interrupts */ - -	__raw_writel(combiner_data[combiner_nr].irq_mask, -		     base + COMBINER_ENABLE_CLEAR); - -	/* Setup the Linux IRQ subsystem */ - -	for (i = irq_start; i < combiner_data[combiner_nr].irq_offset -				+ MAX_IRQ_IN_COMBINER; i++) { -		irq_set_chip_and_handler(i, &combiner_chip, handle_level_irq); -		irq_set_chip_data(i, &combiner_data[combiner_nr]); -		set_irq_flags(i, IRQF_VALID | IRQF_PROBE); -	} -} diff --git a/arch/arm/mach-exynos/irq-eint.c b/arch/arm/mach-exynos/irq-eint.c deleted file mode 100644 index badb8c66fc9..00000000000 --- a/arch/arm/mach-exynos/irq-eint.c +++ /dev/null @@ -1,237 +0,0 @@ -/* linux/arch/arm/mach-exynos4/irq-eint.c - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * EXYNOS4 - IRQ EINT support - * - * 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. -*/ - -#include <linux/kernel.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/io.h> -#include <linux/sysdev.h> -#include <linux/gpio.h> - -#include <plat/pm.h> -#include <plat/cpu.h> -#include <plat/gpio-cfg.h> - -#include <mach/regs-gpio.h> - -#include <asm/mach/irq.h> - -static DEFINE_SPINLOCK(eint_lock); - -static unsigned int eint0_15_data[16]; - -static unsigned int exynos4_get_irq_nr(unsigned int number) -{ -	u32 ret = 0; - -	switch (number) { -	case 0 ... 3: -		ret = (number + IRQ_EINT0); -		break; -	case 4 ... 7: -		ret = (number + (IRQ_EINT4 - 4)); -		break; -	case 8 ... 15: -		ret = (number + (IRQ_EINT8 - 8)); -		break; -	default: -		printk(KERN_ERR "number available : %d\n", number); -	} - -	return ret; -} - -static inline void exynos4_irq_eint_mask(struct irq_data *data) -{ -	u32 mask; - -	spin_lock(&eint_lock); -	mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq))); -	mask |= eint_irq_to_bit(data->irq); -	__raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq))); -	spin_unlock(&eint_lock); -} - -static void exynos4_irq_eint_unmask(struct irq_data *data) -{ -	u32 mask; - -	spin_lock(&eint_lock); -	mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq))); -	mask &= ~(eint_irq_to_bit(data->irq)); -	__raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq))); -	spin_unlock(&eint_lock); -} - -static inline void exynos4_irq_eint_ack(struct irq_data *data) -{ -	__raw_writel(eint_irq_to_bit(data->irq), -		     S5P_EINT_PEND(EINT_REG_NR(data->irq))); -} - -static void exynos4_irq_eint_maskack(struct irq_data *data) -{ -	exynos4_irq_eint_mask(data); -	exynos4_irq_eint_ack(data); -} - -static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type) -{ -	int offs = EINT_OFFSET(data->irq); -	int shift; -	u32 ctrl, mask; -	u32 newvalue = 0; - -	switch (type) { -	case IRQ_TYPE_EDGE_RISING: -		newvalue = S5P_IRQ_TYPE_EDGE_RISING; -		break; - -	case IRQ_TYPE_EDGE_FALLING: -		newvalue = S5P_IRQ_TYPE_EDGE_FALLING; -		break; - -	case IRQ_TYPE_EDGE_BOTH: -		newvalue = S5P_IRQ_TYPE_EDGE_BOTH; -		break; - -	case IRQ_TYPE_LEVEL_LOW: -		newvalue = S5P_IRQ_TYPE_LEVEL_LOW; -		break; - -	case IRQ_TYPE_LEVEL_HIGH: -		newvalue = S5P_IRQ_TYPE_LEVEL_HIGH; -		break; - -	default: -		printk(KERN_ERR "No such irq type %d", type); -		return -EINVAL; -	} - -	shift = (offs & 0x7) * 4; -	mask = 0x7 << shift; - -	spin_lock(&eint_lock); -	ctrl = __raw_readl(S5P_EINT_CON(EINT_REG_NR(data->irq))); -	ctrl &= ~mask; -	ctrl |= newvalue << shift; -	__raw_writel(ctrl, S5P_EINT_CON(EINT_REG_NR(data->irq))); -	spin_unlock(&eint_lock); - -	switch (offs) { -	case 0 ... 7: -		s3c_gpio_cfgpin(EINT_GPIO_0(offs & 0x7), EINT_MODE); -		break; -	case 8 ... 15: -		s3c_gpio_cfgpin(EINT_GPIO_1(offs & 0x7), EINT_MODE); -		break; -	case 16 ... 23: -		s3c_gpio_cfgpin(EINT_GPIO_2(offs & 0x7), EINT_MODE); -		break; -	case 24 ... 31: -		s3c_gpio_cfgpin(EINT_GPIO_3(offs & 0x7), EINT_MODE); -		break; -	default: -		printk(KERN_ERR "No such irq number %d", offs); -	} - -	return 0; -} - -static struct irq_chip exynos4_irq_eint = { -	.name		= "exynos4-eint", -	.irq_mask	= exynos4_irq_eint_mask, -	.irq_unmask	= exynos4_irq_eint_unmask, -	.irq_mask_ack	= exynos4_irq_eint_maskack, -	.irq_ack	= exynos4_irq_eint_ack, -	.irq_set_type	= exynos4_irq_eint_set_type, -#ifdef CONFIG_PM -	.irq_set_wake	= s3c_irqext_wake, -#endif -}; - -/* exynos4_irq_demux_eint - * - * This function demuxes the IRQ from from EINTs 16 to 31. - * It is designed to be inlined into the specific handler - * s5p_irq_demux_eintX_Y. - * - * Each EINT pend/mask registers handle eight of them. - */ -static inline void exynos4_irq_demux_eint(unsigned int start) -{ -	unsigned int irq; - -	u32 status = __raw_readl(S5P_EINT_PEND(EINT_REG_NR(start))); -	u32 mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(start))); - -	status &= ~mask; -	status &= 0xff; - -	while (status) { -		irq = fls(status) - 1; -		generic_handle_irq(irq + start); -		status &= ~(1 << irq); -	} -} - -static void exynos4_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc) -{ -	struct irq_chip *chip = irq_get_chip(irq); -	chained_irq_enter(chip, desc); -	exynos4_irq_demux_eint(IRQ_EINT(16)); -	exynos4_irq_demux_eint(IRQ_EINT(24)); -	chained_irq_exit(chip, desc); -} - -static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) -{ -	u32 *irq_data = irq_get_handler_data(irq); -	struct irq_chip *chip = irq_get_chip(irq); - -	chained_irq_enter(chip, desc); -	chip->irq_mask(&desc->irq_data); - -	if (chip->irq_ack) -		chip->irq_ack(&desc->irq_data); - -	generic_handle_irq(*irq_data); - -	chip->irq_unmask(&desc->irq_data); -	chained_irq_exit(chip, desc); -} - -int __init exynos4_init_irq_eint(void) -{ -	int irq; - -	for (irq = 0 ; irq <= 31 ; irq++) { -		irq_set_chip_and_handler(IRQ_EINT(irq), &exynos4_irq_eint, -					 handle_level_irq); -		set_irq_flags(IRQ_EINT(irq), IRQF_VALID); -	} - -	irq_set_chained_handler(IRQ_EINT16_31, exynos4_irq_demux_eint16_31); - -	for (irq = 0 ; irq <= 15 ; irq++) { -		eint0_15_data[irq] = IRQ_EINT(irq); - -		irq_set_handler_data(exynos4_get_irq_nr(irq), -				     &eint0_15_data[irq]); -		irq_set_chained_handler(exynos4_get_irq_nr(irq), -					exynos4_irq_eint0_15); -	} - -	return 0; -} - -arch_initcall(exynos4_init_irq_eint); diff --git a/arch/arm/mach-exynos/mach-armlex4210.c b/arch/arm/mach-exynos/mach-armlex4210.c index 49da3089249..d726fcd3acf 100644 --- a/arch/arm/mach-exynos/mach-armlex4210.c +++ b/arch/arm/mach-exynos/mach-armlex4210.c @@ -21,7 +21,6 @@  #include <plat/cpu.h>  #include <plat/devs.h> -#include <plat/exynos4.h>  #include <plat/gpio-cfg.h>  #include <plat/regs-serial.h>  #include <plat/regs-srom.h> @@ -29,6 +28,8 @@  #include <mach/map.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define ARMLEX4210_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -188,7 +189,7 @@ static void __init armlex4210_smsc911x_init(void)  static void __init armlex4210_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	exynos_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  	s3c24xx_init_uarts(armlex4210_uartcfgs,  			   ARRAY_SIZE(armlex4210_uartcfgs)); @@ -214,4 +215,5 @@ MACHINE_START(ARMLEX4210, "ARMLEX4210")  	.handle_irq	= gic_handle_irq,  	.init_machine	= armlex4210_machine_init,  	.timer		= &exynos4_timer, +	.restart	= exynos4_restart,  MACHINE_END diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c index 5acec11821a..635fb97e31a 100644 --- a/arch/arm/mach-exynos/mach-nuri.c +++ b/arch/arm/mach-exynos/mach-nuri.c @@ -38,7 +38,6 @@  #include <plat/adc.h>  #include <plat/regs-fb-v4.h>  #include <plat/regs-serial.h> -#include <plat/exynos4.h>  #include <plat/cpu.h>  #include <plat/devs.h>  #include <plat/fb.h> @@ -55,6 +54,8 @@  #include <mach/map.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define NURI_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -1284,7 +1285,7 @@ static struct platform_device *nuri_devices[] __initdata = {  static void __init nuri_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	exynos_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  	s3c24xx_init_uarts(nuri_uartcfgs, ARRAY_SIZE(nuri_uartcfgs));  } @@ -1338,4 +1339,5 @@ MACHINE_START(NURI, "NURI")  	.init_machine	= nuri_machine_init,  	.timer		= &exynos4_timer,  	.reserve        = &nuri_reserve, +	.restart	= exynos4_restart,  MACHINE_END diff --git a/arch/arm/mach-exynos/mach-origen.c b/arch/arm/mach-exynos/mach-origen.c index 5561b06c38e..586eb995aa9 100644 --- a/arch/arm/mach-exynos/mach-origen.c +++ b/arch/arm/mach-exynos/mach-origen.c @@ -29,7 +29,6 @@  #include <plat/regs-serial.h>  #include <plat/regs-fb-v4.h> -#include <plat/exynos4.h>  #include <plat/cpu.h>  #include <plat/devs.h>  #include <plat/sdhci.h> @@ -44,6 +43,8 @@  #include <mach/map.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define ORIGEN_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -639,7 +640,7 @@ static void s5p_tv_setup(void)  static void __init origen_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	exynos_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  	s3c24xx_init_uarts(origen_uartcfgs, ARRAY_SIZE(origen_uartcfgs));  } @@ -699,4 +700,5 @@ MACHINE_START(ORIGEN, "ORIGEN")  	.init_machine	= origen_machine_init,  	.timer		= &exynos4_timer,  	.reserve	= &origen_reserve, +	.restart	= exynos4_restart,  MACHINE_END diff --git a/arch/arm/mach-exynos/mach-smdk4x12.c b/arch/arm/mach-exynos/mach-smdk4x12.c index 722d82d7f21..d00e4f016a6 100644 --- a/arch/arm/mach-exynos/mach-smdk4x12.c +++ b/arch/arm/mach-exynos/mach-smdk4x12.c @@ -28,7 +28,6 @@  #include <plat/clock.h>  #include <plat/cpu.h>  #include <plat/devs.h> -#include <plat/exynos4.h>  #include <plat/gpio-cfg.h>  #include <plat/iic.h>  #include <plat/keypad.h> @@ -37,6 +36,8 @@  #include <mach/map.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define SMDK4X12_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -250,7 +251,7 @@ static void __init smdk4x12_map_io(void)  {  	clk_xusbxti.rate = 24000000; -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	exynos_init_io(NULL, 0);  	s3c24xx_init_clocks(clk_xusbxti.rate);  	s3c24xx_init_uarts(smdk4x12_uartcfgs, ARRAY_SIZE(smdk4x12_uartcfgs));  } @@ -291,6 +292,7 @@ MACHINE_START(SMDK4212, "SMDK4212")  	.handle_irq	= gic_handle_irq,  	.init_machine	= smdk4x12_machine_init,  	.timer		= &exynos4_timer, +	.restart	= exynos4_restart,  MACHINE_END  MACHINE_START(SMDK4412, "SMDK4412") @@ -302,4 +304,5 @@ MACHINE_START(SMDK4412, "SMDK4412")  	.handle_irq	= gic_handle_irq,  	.init_machine	= smdk4x12_machine_init,  	.timer		= &exynos4_timer, +	.restart	= exynos4_restart,  MACHINE_END diff --git a/arch/arm/mach-exynos/mach-smdkv310.c b/arch/arm/mach-exynos/mach-smdkv310.c index edc60b6108e..5b365613b47 100644 --- a/arch/arm/mach-exynos/mach-smdkv310.c +++ b/arch/arm/mach-exynos/mach-smdkv310.c @@ -28,7 +28,6 @@  #include <plat/regs-serial.h>  #include <plat/regs-srom.h>  #include <plat/regs-fb-v4.h> -#include <plat/exynos4.h>  #include <plat/cpu.h>  #include <plat/devs.h>  #include <plat/fb.h> @@ -44,6 +43,8 @@  #include <mach/map.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define SMDKV310_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -333,7 +334,7 @@ static void s5p_tv_setup(void)  static void __init smdkv310_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	exynos_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  	s3c24xx_init_uarts(smdkv310_uartcfgs, ARRAY_SIZE(smdkv310_uartcfgs));  } @@ -380,6 +381,7 @@ MACHINE_START(SMDKV310, "SMDKV310")  	.init_machine	= smdkv310_machine_init,  	.timer		= &exynos4_timer,  	.reserve	= &smdkv310_reserve, +	.restart	= exynos4_restart,  MACHINE_END  MACHINE_START(SMDKC210, "SMDKC210") @@ -390,4 +392,5 @@ MACHINE_START(SMDKC210, "SMDKC210")  	.handle_irq	= gic_handle_irq,  	.init_machine	= smdkv310_machine_init,  	.timer		= &exynos4_timer, +	.restart	= exynos4_restart,  MACHINE_END diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index cfc7d5076f5..52aea972746 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c @@ -28,7 +28,6 @@  #include <asm/mach-types.h>  #include <plat/regs-serial.h> -#include <plat/exynos4.h>  #include <plat/cpu.h>  #include <plat/devs.h>  #include <plat/iic.h> @@ -48,6 +47,8 @@  #include <media/s5p_fimc.h>  #include <media/m5mols.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define UNIVERSAL_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -993,7 +994,7 @@ static struct platform_device *universal_devices[] __initdata = {  static void __init universal_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	exynos_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  	s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs));  } @@ -1063,4 +1064,5 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210")  	.init_machine	= universal_machine_init,  	.timer		= &exynos4_timer,  	.reserve        = &universal_reserve, +	.restart	= exynos4_restart,  MACHINE_END diff --git a/arch/arm/mach-footbridge/cats-hw.c b/arch/arm/mach-footbridge/cats-hw.c index 60b6774e1ea..25b453601ac 100644 --- a/arch/arm/mach-footbridge/cats-hw.c +++ b/arch/arm/mach-footbridge/cats-hw.c @@ -91,4 +91,5 @@ MACHINE_START(CATS, "Chalice-CATS")  	.map_io		= footbridge_map_io,  	.init_irq	= footbridge_init_irq,  	.timer		= &isa_timer, +	.restart	= footbridge_restart,  MACHINE_END diff --git a/arch/arm/mach-footbridge/common.c b/arch/arm/mach-footbridge/common.c index 38a44f9b9da..41978ee4f9d 100644 --- a/arch/arm/mach-footbridge/common.c +++ b/arch/arm/mach-footbridge/common.c @@ -199,6 +199,33 @@ void __init footbridge_map_io(void)  		iotable_init(ebsa285_host_io_desc, ARRAY_SIZE(ebsa285_host_io_desc));  } +void footbridge_restart(char mode, const char *cmd) +{ +	if (mode == 's') { +		/* Jump into the ROM */ +		soft_restart(0x41000000); +	} else { +		/* +		 * Force the watchdog to do a CPU reset. +		 * +		 * After making sure that the watchdog is disabled +		 * (so we can change the timer registers) we first +		 * enable the timer to autoreload itself.  Next, the +		 * timer interval is set really short and any +		 * current interrupt request is cleared (so we can +		 * see an edge transition).  Finally, TIMER4 is +		 * enabled as the watchdog. +		 */ +		*CSR_SA110_CNTL &= ~(1 << 13); +		*CSR_TIMER4_CNTL = TIMER_CNTL_ENABLE | +				   TIMER_CNTL_AUTORELOAD | +				   TIMER_CNTL_DIV16; +		*CSR_TIMER4_LOAD = 0x2; +		*CSR_TIMER4_CLR  = 0; +		*CSR_SA110_CNTL |= (1 << 13); +	} +} +  #ifdef CONFIG_FOOTBRIDGE_ADDIN  static inline unsigned long fb_bus_sdram_offset(void) diff --git a/arch/arm/mach-footbridge/common.h b/arch/arm/mach-footbridge/common.h index b05e662d21a..c9767b892cb 100644 --- a/arch/arm/mach-footbridge/common.h +++ b/arch/arm/mach-footbridge/common.h @@ -8,3 +8,4 @@ extern void footbridge_map_io(void);  extern void footbridge_init_irq(void);  extern void isa_init_irq(unsigned int irq); +extern void footbridge_restart(char, const char *); diff --git a/arch/arm/mach-footbridge/ebsa285.c b/arch/arm/mach-footbridge/ebsa285.c index 012210cf7d1..27716a7e5fc 100644 --- a/arch/arm/mach-footbridge/ebsa285.c +++ b/arch/arm/mach-footbridge/ebsa285.c @@ -21,5 +21,6 @@ MACHINE_START(EBSA285, "EBSA285")  	.map_io		= footbridge_map_io,  	.init_irq	= footbridge_init_irq,  	.timer		= &footbridge_timer, +	.restart	= footbridge_restart,  MACHINE_END diff --git a/arch/arm/mach-footbridge/include/mach/system.h b/arch/arm/mach-footbridge/include/mach/system.h index 249f895910f..a174a5841bc 100644 --- a/arch/arm/mach-footbridge/include/mach/system.h +++ b/arch/arm/mach-footbridge/include/mach/system.h @@ -7,63 +7,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -#include <linux/io.h> -#include <asm/hardware/dec21285.h> -#include <mach/hardware.h> -#include <asm/leds.h> -#include <asm/mach-types.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } - -static inline void arch_reset(char mode, const char *cmd) -{ -	if (mode == 's') { -		/* -		 * Jump into the ROM -		 */ -		soft_restart(0x41000000); -	} else { -		if (machine_is_netwinder()) { -			/* open up the SuperIO chip -			 */ -			outb(0x87, 0x370); -			outb(0x87, 0x370); - -			/* aux function group 1 (logical device 7) -			 */ -			outb(0x07, 0x370); -			outb(0x07, 0x371); - -			/* set GP16 for WD-TIMER output -			 */ -			outb(0xe6, 0x370); -			outb(0x00, 0x371); - -			/* set a RED LED and toggle WD_TIMER for rebooting -			 */ -			outb(0xc4, 0x338); -		} else { -			/*  -			 * Force the watchdog to do a CPU reset. -			 * -			 * After making sure that the watchdog is disabled -			 * (so we can change the timer registers) we first -			 * enable the timer to autoreload itself.  Next, the -			 * timer interval is set really short and any -			 * current interrupt request is cleared (so we can -			 * see an edge transition).  Finally, TIMER4 is -			 * enabled as the watchdog. -			 */ -			*CSR_SA110_CNTL &= ~(1 << 13); -			*CSR_TIMER4_CNTL = TIMER_CNTL_ENABLE | -					   TIMER_CNTL_AUTORELOAD | -					   TIMER_CNTL_DIV16; -			*CSR_TIMER4_LOAD = 0x2; -			*CSR_TIMER4_CLR  = 0; -			*CSR_SA110_CNTL |= (1 << 13); -		} -	} -} diff --git a/arch/arm/mach-footbridge/netwinder-hw.c b/arch/arm/mach-footbridge/netwinder-hw.c index 0d3846f3b60..80a1c5cc907 100644 --- a/arch/arm/mach-footbridge/netwinder-hw.c +++ b/arch/arm/mach-footbridge/netwinder-hw.c @@ -645,6 +645,32 @@ fixup_netwinder(struct tag *tags, char **cmdline, struct meminfo *mi)  #endif  } +static void netwinder_restart(char mode, const char *cmd) +{ +	if (mode == 's') { +		/* Jump into the ROM */ +		soft_restart(0x41000000); +	} else { +		local_irq_disable(); +		local_fiq_disable(); + +		/* open up the SuperIO chip */ +		outb(0x87, 0x370); +		outb(0x87, 0x370); + +		/* aux function group 1 (logical device 7) */ +		outb(0x07, 0x370); +		outb(0x07, 0x371); + +		/* set GP16 for WD-TIMER output */ +		outb(0xe6, 0x370); +		outb(0x00, 0x371); + +		/* set a RED LED and toggle WD_TIMER for rebooting */ +		outb(0xc4, 0x338); +	} +} +  MACHINE_START(NETWINDER, "Rebel-NetWinder")  	/* Maintainer: Russell King/Rebel.com */  	.atag_offset	= 0x100, @@ -656,4 +682,5 @@ MACHINE_START(NETWINDER, "Rebel-NetWinder")  	.map_io		= footbridge_map_io,  	.init_irq	= footbridge_init_irq,  	.timer		= &isa_timer, +	.restart	= netwinder_restart,  MACHINE_END diff --git a/arch/arm/mach-footbridge/personal.c b/arch/arm/mach-footbridge/personal.c index f41dba39b32..e1e9990fa95 100644 --- a/arch/arm/mach-footbridge/personal.c +++ b/arch/arm/mach-footbridge/personal.c @@ -19,5 +19,6 @@ MACHINE_START(PERSONAL_SERVER, "Compaq-PersonalServer")  	.map_io		= footbridge_map_io,  	.init_irq	= footbridge_init_irq,  	.timer		= &footbridge_timer, +	.restart	= footbridge_restart,  MACHINE_END diff --git a/arch/arm/mach-h720x/common.c b/arch/arm/mach-h720x/common.c index 51d4e44ab97..f8a2f6bb548 100644 --- a/arch/arm/mach-h720x/common.c +++ b/arch/arm/mach-h720x/common.c @@ -242,3 +242,8 @@ void __init h720x_map_io(void)  {  	iotable_init(h720x_io_desc,ARRAY_SIZE(h720x_io_desc));  } + +void h720x_restart(char mode, const char *cmd) +{ +	CPU_REG (PMU_BASE, PMU_STAT) |= PMU_WARMRESET; +} diff --git a/arch/arm/mach-h720x/common.h b/arch/arm/mach-h720x/common.h index 7dd5fa604ef..2489537d33d 100644 --- a/arch/arm/mach-h720x/common.h +++ b/arch/arm/mach-h720x/common.h @@ -16,6 +16,7 @@  extern unsigned long h720x_gettimeoffset(void);  extern void __init h720x_init_irq(void);  extern void __init h720x_map_io(void); +extern void h720x_restart(char, const char *);  #ifdef CONFIG_ARCH_H7202  extern struct sys_timer h7202_timer; diff --git a/arch/arm/mach-h720x/h7201-eval.c b/arch/arm/mach-h720x/h7201-eval.c index 9886f19805f..5fdb20c855e 100644 --- a/arch/arm/mach-h720x/h7201-eval.c +++ b/arch/arm/mach-h720x/h7201-eval.c @@ -34,4 +34,5 @@ MACHINE_START(H7201, "Hynix GMS30C7201")  	.init_irq	= h720x_init_irq,  	.timer		= &h7201_timer,  	.dma_zone_size	= SZ_256M, +	.restart	= h720x_restart,  MACHINE_END diff --git a/arch/arm/mach-h720x/h7202-eval.c b/arch/arm/mach-h720x/h7202-eval.c index 284a134819e..169673036c5 100644 --- a/arch/arm/mach-h720x/h7202-eval.c +++ b/arch/arm/mach-h720x/h7202-eval.c @@ -77,4 +77,5 @@ MACHINE_START(H7202, "Hynix HMS30C7202")  	.timer		= &h7202_timer,  	.init_machine	= init_eval_h7202,  	.dma_zone_size	= SZ_256M, +	.restart	= h720x_restart,  MACHINE_END diff --git a/arch/arm/mach-h720x/include/mach/system.h b/arch/arm/mach-h720x/include/mach/system.h index a708d24ee46..16ac46e239a 100644 --- a/arch/arm/mach-h720x/include/mach/system.h +++ b/arch/arm/mach-h720x/include/mach/system.h @@ -24,10 +24,4 @@ static void arch_idle(void)  	nop();  } - -static __inline__ void arch_reset(char mode, const char *cmd) -{ -	CPU_REG (PMU_BASE, PMU_STAT) |= PMU_WARMRESET; -} -  #endif diff --git a/arch/arm/mach-highbank/core.h b/arch/arm/mach-highbank/core.h index 7e33fc94cd1..d8e2d0be64a 100644 --- a/arch/arm/mach-highbank/core.h +++ b/arch/arm/mach-highbank/core.h @@ -1,5 +1,6 @@  extern void highbank_set_cpu_jump(int cpu, void *jump_addr);  extern void highbank_clocks_init(void); +extern void highbank_restart(char, const char *);  extern void __iomem *scu_base_addr;  #ifdef CONFIG_DEBUG_HIGHBANK_UART  extern void highbank_lluart_map_io(void); diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index 7266dd510f1..804c4a55f80 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c @@ -147,4 +147,5 @@ DT_MACHINE_START(HIGHBANK, "Highbank")  	.handle_irq	= gic_handle_irq,  	.init_machine	= highbank_init,  	.dt_compat	= highbank_match, +	.restart	= highbank_restart,  MACHINE_END diff --git a/arch/arm/mach-highbank/include/mach/system.h b/arch/arm/mach-highbank/include/mach/system.h index 7e8192296ca..b1d8b5fbe37 100644 --- a/arch/arm/mach-highbank/include/mach/system.h +++ b/arch/arm/mach-highbank/include/mach/system.h @@ -21,6 +21,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -extern void arch_reset(char mode, const char *cmd); -  #endif diff --git a/arch/arm/mach-highbank/system.c b/arch/arm/mach-highbank/system.c index 53f0c4c5ef1..82c27230d4a 100644 --- a/arch/arm/mach-highbank/system.c +++ b/arch/arm/mach-highbank/system.c @@ -20,7 +20,7 @@  #include "core.h"  #include "sysregs.h" -void arch_reset(char mode, const char *cmd) +void highbank_restart(char mode, const char *cmd)  {  	if (mode == 'h')  		hignbank_set_pwr_hard_reset(); diff --git a/arch/arm/mach-imx/clock-imx6q.c b/arch/arm/mach-imx/clock-imx6q.c index 039a7abb165..9273c2a24b5 100644 --- a/arch/arm/mach-imx/clock-imx6q.c +++ b/arch/arm/mach-imx/clock-imx6q.c @@ -1931,14 +1931,12 @@ int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode)  		val |= 0x1 << BP_CLPCR_LPM;  		val &= ~BM_CLPCR_VSTBY;  		val &= ~BM_CLPCR_SBYOS; -		val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS;  		break;  	case STOP_POWER_OFF:  		val |= 0x2 << BP_CLPCR_LPM;  		val |= 0x3 << BP_CLPCR_STBY_COUNT;  		val |= BM_CLPCR_VSTBY;  		val |= BM_CLPCR_SBYOS; -		val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS;  		break;  	default:  		return -EINVAL; diff --git a/arch/arm/mach-imx/mach-apf9328.c b/arch/arm/mach-imx/mach-apf9328.c index 1e486e67dab..146a4f07346 100644 --- a/arch/arm/mach-imx/mach-apf9328.c +++ b/arch/arm/mach-imx/mach-apf9328.c @@ -139,4 +139,5 @@ MACHINE_START(APF9328, "Armadeus APF9328")  	.handle_irq   = imx1_handle_irq,  	.timer        = &apf9328_timer,  	.init_machine = apf9328_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-armadillo5x0.c b/arch/arm/mach-imx/mach-armadillo5x0.c index c9a9cf67755..e4f426a0989 100644 --- a/arch/arm/mach-imx/mach-armadillo5x0.c +++ b/arch/arm/mach-imx/mach-armadillo5x0.c @@ -561,4 +561,5 @@ MACHINE_START(ARMADILLO5X0, "Armadillo-500")  	.handle_irq = imx31_handle_irq,  	.timer = &armadillo5x0_timer,  	.init_machine = armadillo5x0_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-bug.c b/arch/arm/mach-imx/mach-bug.c index 313f62ddc1e..9a9897749dd 100644 --- a/arch/arm/mach-imx/mach-bug.c +++ b/arch/arm/mach-imx/mach-bug.c @@ -65,4 +65,5 @@ MACHINE_START(BUG, "BugLabs BUGBase")  	.handle_irq = imx31_handle_irq,  	.timer = &bug_timer,  	.init_machine = bug_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-cpuimx27.c b/arch/arm/mach-imx/mach-cpuimx27.c index edb37305257..d085aea0870 100644 --- a/arch/arm/mach-imx/mach-cpuimx27.c +++ b/arch/arm/mach-imx/mach-cpuimx27.c @@ -318,4 +318,5 @@ MACHINE_START(EUKREA_CPUIMX27, "EUKREA CPUIMX27")  	.handle_irq = imx27_handle_irq,  	.timer = &eukrea_cpuimx27_timer,  	.init_machine = eukrea_cpuimx27_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-cpuimx35.c b/arch/arm/mach-imx/mach-cpuimx35.c index 362aae78060..8ecc872b254 100644 --- a/arch/arm/mach-imx/mach-cpuimx35.c +++ b/arch/arm/mach-imx/mach-cpuimx35.c @@ -207,4 +207,5 @@ MACHINE_START(EUKREA_CPUIMX35SD, "Eukrea CPUIMX35")  	.handle_irq = imx35_handle_irq,  	.timer = &eukrea_cpuimx35_timer,  	.init_machine = eukrea_cpuimx35_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-eukrea_cpuimx25.c b/arch/arm/mach-imx/mach-eukrea_cpuimx25.c index ab8fbcc472b..76a97a598b9 100644 --- a/arch/arm/mach-imx/mach-eukrea_cpuimx25.c +++ b/arch/arm/mach-imx/mach-eukrea_cpuimx25.c @@ -170,4 +170,5 @@ MACHINE_START(EUKREA_CPUIMX25SD, "Eukrea CPUIMX25")  	.handle_irq = imx25_handle_irq,  	.timer = &eukrea_cpuimx25_timer,  	.init_machine = eukrea_cpuimx25_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c index 38eb9e45110..c2766ae02b4 100644 --- a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c +++ b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c @@ -282,4 +282,5 @@ MACHINE_START(IMX27_VISSTRIM_M10, "Vista Silicon Visstrim_M10")  	.handle_irq = imx27_handle_irq,  	.timer = &visstrim_m10_timer,  	.init_machine = visstrim_m10_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-imx27ipcam.c b/arch/arm/mach-imx/mach-imx27ipcam.c index 7052155d055..c9d350c5dcc 100644 --- a/arch/arm/mach-imx/mach-imx27ipcam.c +++ b/arch/arm/mach-imx/mach-imx27ipcam.c @@ -78,4 +78,5 @@ MACHINE_START(IMX27IPCAM, "Freescale IMX27IPCAM")  	.handle_irq = imx27_handle_irq,  	.timer = &mx27ipcam_timer,  	.init_machine = mx27ipcam_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-imx27lite.c b/arch/arm/mach-imx/mach-imx27lite.c index 8d6a63521f1..1f45b918922 100644 --- a/arch/arm/mach-imx/mach-imx27lite.c +++ b/arch/arm/mach-imx/mach-imx27lite.c @@ -84,4 +84,5 @@ MACHINE_START(IMX27LITE, "LogicPD i.MX27LITE")  	.handle_irq = imx27_handle_irq,  	.timer = &mx27lite_timer,  	.init_machine = mx27lite_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 8deb012189b..05b49bb5d67 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c @@ -10,10 +10,13 @@   * http://www.gnu.org/copyleft/gpl.html   */ +#include <linux/delay.h>  #include <linux/init.h> +#include <linux/io.h>  #include <linux/irq.h>  #include <linux/irqdomain.h>  #include <linux/of.h> +#include <linux/of_address.h>  #include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <asm/hardware/cache-l2x0.h> @@ -23,6 +26,36 @@  #include <mach/common.h>  #include <mach/hardware.h> +void imx6q_restart(char mode, const char *cmd) +{ +	struct device_node *np; +	void __iomem *wdog_base; + +	np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-wdt"); +	wdog_base = of_iomap(np, 0); +	if (!wdog_base) +		goto soft; + +	imx_src_prepare_restart(); + +	/* enable wdog */ +	writew_relaxed(1 << 2, wdog_base); +	/* write twice to ensure the request will not get ignored */ +	writew_relaxed(1 << 2, wdog_base); + +	/* wait for reset to assert ... */ +	mdelay(500); + +	pr_err("Watchdog reset failed to assert reset\n"); + +	/* delay to allow the serial port to show the message */ +	mdelay(50); + +soft: +	/* we'll take a jump through zero as a poor second */ +	soft_restart(0); +} +  static void __init imx6q_init_machine(void)  {  	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); @@ -83,4 +116,5 @@ DT_MACHINE_START(IMX6Q, "Freescale i.MX6 Quad (Device Tree)")  	.timer		= &imx6q_timer,  	.init_machine	= imx6q_init_machine,  	.dt_compat	= imx6q_dt_compat, +	.restart	= imx6q_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-kzm_arm11_01.c b/arch/arm/mach-imx/mach-kzm_arm11_01.c index 5f37f89e40f..fc78e8071cd 100644 --- a/arch/arm/mach-imx/mach-kzm_arm11_01.c +++ b/arch/arm/mach-imx/mach-kzm_arm11_01.c @@ -279,4 +279,5 @@ MACHINE_START(KZM_ARM11_01, "Kyoto Microcomputer Co., Ltd. KZM-ARM11-01")  	.handle_irq = imx31_handle_irq,  	.timer = &kzm_timer,  	.init_machine = kzm_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx1ads.c b/arch/arm/mach-imx/mach-mx1ads.c index fc49785e734..97046088ff1 100644 --- a/arch/arm/mach-imx/mach-mx1ads.c +++ b/arch/arm/mach-imx/mach-mx1ads.c @@ -147,6 +147,7 @@ MACHINE_START(MX1ADS, "Freescale MX1ADS")  	.handle_irq = imx1_handle_irq,  	.timer = &mx1ads_timer,  	.init_machine = mx1ads_init, +	.restart	= mxc_restart,  MACHINE_END  MACHINE_START(MXLADS, "Freescale MXLADS") @@ -157,4 +158,5 @@ MACHINE_START(MXLADS, "Freescale MXLADS")  	.handle_irq = imx1_handle_irq,  	.timer = &mx1ads_timer,  	.init_machine = mx1ads_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx21ads.c b/arch/arm/mach-imx/mach-mx21ads.c index 25f84028d05..8d9f95514b1 100644 --- a/arch/arm/mach-imx/mach-mx21ads.c +++ b/arch/arm/mach-imx/mach-mx21ads.c @@ -312,4 +312,5 @@ MACHINE_START(MX21ADS, "Freescale i.MX21ADS")  	.handle_irq = imx21_handle_irq,  	.timer = &mx21ads_timer,  	.init_machine = mx21ads_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx25_3ds.c b/arch/arm/mach-imx/mach-mx25_3ds.c index 88dccf12224..f26734298aa 100644 --- a/arch/arm/mach-imx/mach-mx25_3ds.c +++ b/arch/arm/mach-imx/mach-mx25_3ds.c @@ -270,4 +270,5 @@ MACHINE_START(MX25_3DS, "Freescale MX25PDK (3DS)")  	.handle_irq = imx25_handle_irq,  	.timer = &mx25pdk_timer,  	.init_machine = mx25pdk_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx27_3ds.c b/arch/arm/mach-imx/mach-mx27_3ds.c index ba232d79fa8..18f35816706 100644 --- a/arch/arm/mach-imx/mach-mx27_3ds.c +++ b/arch/arm/mach-imx/mach-mx27_3ds.c @@ -425,4 +425,5 @@ MACHINE_START(MX27_3DS, "Freescale MX27PDK")  	.handle_irq = imx27_handle_irq,  	.timer = &mx27pdk_timer,  	.init_machine = mx27pdk_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx27ads.c b/arch/arm/mach-imx/mach-mx27ads.c index 74dd5731eb6..0228d2e07fe 100644 --- a/arch/arm/mach-imx/mach-mx27ads.c +++ b/arch/arm/mach-imx/mach-mx27ads.c @@ -351,4 +351,5 @@ MACHINE_START(MX27ADS, "Freescale i.MX27ADS")  	.handle_irq = imx27_handle_irq,  	.timer = &mx27ads_timer,  	.init_machine = mx27ads_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx31_3ds.c b/arch/arm/mach-imx/mach-mx31_3ds.c index b8c54b84018..2b565c38134 100644 --- a/arch/arm/mach-imx/mach-mx31_3ds.c +++ b/arch/arm/mach-imx/mach-mx31_3ds.c @@ -770,4 +770,5 @@ MACHINE_START(MX31_3DS, "Freescale MX31PDK (3DS)")  	.timer = &mx31_3ds_timer,  	.init_machine = mx31_3ds_init,  	.reserve = mx31_3ds_reserve, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx31ads.c b/arch/arm/mach-imx/mach-mx31ads.c index 9cc1a49053b..4917aab0e25 100644 --- a/arch/arm/mach-imx/mach-mx31ads.c +++ b/arch/arm/mach-imx/mach-mx31ads.c @@ -542,4 +542,5 @@ MACHINE_START(MX31ADS, "Freescale MX31ADS")  	.handle_irq = imx31_handle_irq,  	.timer = &mx31ads_timer,  	.init_machine = mx31ads_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx31lilly.c b/arch/arm/mach-imx/mach-mx31lilly.c index 102ec99357c..02401bbd6d5 100644 --- a/arch/arm/mach-imx/mach-mx31lilly.c +++ b/arch/arm/mach-imx/mach-mx31lilly.c @@ -303,4 +303,5 @@ MACHINE_START(LILLY1131, "INCO startec LILLY-1131")  	.handle_irq = imx31_handle_irq,  	.timer = &mx31lilly_timer,  	.init_machine = mx31lilly_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx31lite.c b/arch/arm/mach-imx/mach-mx31lite.c index 5366d2de18f..ef80751712e 100644 --- a/arch/arm/mach-imx/mach-mx31lite.c +++ b/arch/arm/mach-imx/mach-mx31lite.c @@ -287,4 +287,5 @@ MACHINE_START(MX31LITE, "LogicPD i.MX31 SOM")  	.handle_irq = imx31_handle_irq,  	.timer = &mx31lite_timer,  	.init_machine = mx31lite_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx31moboard.c b/arch/arm/mach-imx/mach-mx31moboard.c index 93269150309..b95981dacb2 100644 --- a/arch/arm/mach-imx/mach-mx31moboard.c +++ b/arch/arm/mach-imx/mach-mx31moboard.c @@ -600,4 +600,5 @@ MACHINE_START(MX31MOBOARD, "EPFL Mobots mx31moboard")  	.handle_irq = imx31_handle_irq,  	.timer = &mx31moboard_timer,  	.init_machine = mx31moboard_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx35_3ds.c b/arch/arm/mach-imx/mach-mx35_3ds.c index 7a462025a0f..0af6c9c5b3f 100644 --- a/arch/arm/mach-imx/mach-mx35_3ds.c +++ b/arch/arm/mach-imx/mach-mx35_3ds.c @@ -224,4 +224,5 @@ MACHINE_START(MX35_3DS, "Freescale MX35PDK")  	.handle_irq = imx35_handle_irq,  	.timer = &mx35pdk_timer,  	.init_machine = mx35_3ds_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-mxt_td60.c b/arch/arm/mach-imx/mach-mxt_td60.c index 125c19643b0..8b3d3f07d89 100644 --- a/arch/arm/mach-imx/mach-mxt_td60.c +++ b/arch/arm/mach-imx/mach-mxt_td60.c @@ -274,4 +274,5 @@ MACHINE_START(MXT_TD60, "Maxtrack i-MXT TD60")  	.handle_irq = imx27_handle_irq,  	.timer = &mxt_td60_timer,  	.init_machine = mxt_td60_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-pca100.c b/arch/arm/mach-imx/mach-pca100.c index 26072f4b02e..d3b9c6b5edd 100644 --- a/arch/arm/mach-imx/mach-pca100.c +++ b/arch/arm/mach-imx/mach-pca100.c @@ -442,4 +442,5 @@ MACHINE_START(PCA100, "phyCARD-i.MX27")  	.handle_irq = imx27_handle_irq,  	.init_machine = pca100_init,  	.timer = &pca100_timer, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-pcm037.c b/arch/arm/mach-imx/mach-pcm037.c index efd6b536ef6..d7e151669ed 100644 --- a/arch/arm/mach-imx/mach-pcm037.c +++ b/arch/arm/mach-imx/mach-pcm037.c @@ -696,4 +696,5 @@ MACHINE_START(PCM037, "Phytec Phycore pcm037")  	.handle_irq = imx31_handle_irq,  	.timer = &pcm037_timer,  	.init_machine = pcm037_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-pcm038.c b/arch/arm/mach-imx/mach-pcm038.c index a17e9c7dfca..16f126da9f8 100644 --- a/arch/arm/mach-imx/mach-pcm038.c +++ b/arch/arm/mach-imx/mach-pcm038.c @@ -357,4 +357,5 @@ MACHINE_START(PCM038, "phyCORE-i.MX27")  	.handle_irq = imx27_handle_irq,  	.timer = &pcm038_timer,  	.init_machine = pcm038_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-pcm043.c b/arch/arm/mach-imx/mach-pcm043.c index 7366c2ae3ea..06dc106519a 100644 --- a/arch/arm/mach-imx/mach-pcm043.c +++ b/arch/arm/mach-imx/mach-pcm043.c @@ -425,4 +425,5 @@ MACHINE_START(PCM043, "Phytec Phycore pcm043")  	.handle_irq = imx35_handle_irq,  	.timer = &pcm043_timer,  	.init_machine = pcm043_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-qong.c b/arch/arm/mach-imx/mach-qong.c index 4ff5faf102a..260621055b6 100644 --- a/arch/arm/mach-imx/mach-qong.c +++ b/arch/arm/mach-imx/mach-qong.c @@ -273,4 +273,5 @@ MACHINE_START(QONG, "Dave/DENX QongEVB-LITE")  	.handle_irq = imx31_handle_irq,  	.timer = &qong_timer,  	.init_machine = qong_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-scb9328.c b/arch/arm/mach-imx/mach-scb9328.c index bb6e5b25d8d..cb9ceae2f64 100644 --- a/arch/arm/mach-imx/mach-scb9328.c +++ b/arch/arm/mach-imx/mach-scb9328.c @@ -144,4 +144,5 @@ MACHINE_START(SCB9328, "Synertronixx scb9328")  	.handle_irq = imx1_handle_irq,  	.timer = &scb9328_timer,  	.init_machine = scb9328_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/mach-vpr200.c b/arch/arm/mach-imx/mach-vpr200.c index 69092458f2d..033257e553e 100644 --- a/arch/arm/mach-imx/mach-vpr200.c +++ b/arch/arm/mach-imx/mach-vpr200.c @@ -322,4 +322,5 @@ MACHINE_START(VPR200, "VPR200")  	.handle_irq = imx35_handle_irq,  	.timer = &vpr200_timer,  	.init_machine = vpr200_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/src.c b/arch/arm/mach-imx/src.c index a8e33681b73..4bde04f99e3 100644 --- a/arch/arm/mach-imx/src.c +++ b/arch/arm/mach-imx/src.c @@ -19,6 +19,7 @@  #define SRC_SCR				0x000  #define SRC_GPR1			0x020 +#define BP_SRC_SCR_WARM_RESET_ENABLE	0  #define BP_SRC_SCR_CORE1_RST		14  #define BP_SRC_SCR_CORE1_ENABLE		22 @@ -46,11 +47,33 @@ void imx_set_cpu_jump(int cpu, void *jump_addr)  		       src_base + SRC_GPR1 + cpu * 8);  } +void imx_src_prepare_restart(void) +{ +	u32 val; + +	/* clear enable bits of secondary cores */ +	val = readl_relaxed(src_base + SRC_SCR); +	val &= ~(0x7 << BP_SRC_SCR_CORE1_ENABLE); +	writel_relaxed(val, src_base + SRC_SCR); + +	/* clear persistent entry register of primary core */ +	writel_relaxed(0, src_base + SRC_GPR1); +} +  void __init imx_src_init(void)  {  	struct device_node *np; +	u32 val;  	np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-src");  	src_base = of_iomap(np, 0);  	WARN_ON(!src_base); + +	/* +	 * force warm reset sources to generate cold reset +	 * for a more reliable restart +	 */ +	val = readl_relaxed(src_base + SRC_SCR); +	val &= ~(1 << BP_SRC_SCR_WARM_RESET_ENABLE); +	writel_relaxed(val, src_base + SRC_SCR);  } diff --git a/arch/arm/mach-integrator/common.h b/arch/arm/mach-integrator/common.h index a08f9b0299d..899561d8db2 100644 --- a/arch/arm/mach-integrator/common.h +++ b/arch/arm/mach-integrator/common.h @@ -1,2 +1,3 @@  void integrator_init_early(void);  void integrator_reserve(void); +void integrator_restart(char, const char *); diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index 18584beda53..019f0ab08f6 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c @@ -247,3 +247,11 @@ void __init integrator_reserve(void)  {  	memblock_reserve(PHYS_OFFSET, __pa(swapper_pg_dir) - PHYS_OFFSET);  } + +/* + * To reset, we hit the on-board reset register in the system FPGA + */ +void integrator_restart(char mode, const char *cmd) +{ +	cm_control(CM_CTRL_RESET, CM_CTRL_RESET); +} diff --git a/arch/arm/mach-integrator/include/mach/system.h b/arch/arm/mach-integrator/include/mach/system.h index e1551b8dab7..901514eba4a 100644 --- a/arch/arm/mach-integrator/include/mach/system.h +++ b/arch/arm/mach-integrator/include/mach/system.h @@ -21,8 +21,6 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <mach/cm.h> -  static inline void arch_idle(void)  {  	/* @@ -32,13 +30,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	/* -	 * To reset, we hit the on-board reset register -	 * in the system FPGA -	 */ -	cm_control(CM_CTRL_RESET, CM_CTRL_RESET); -} -  #endif diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index a1769f35a86..21a1d6cbef4 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c @@ -472,4 +472,5 @@ MACHINE_START(INTEGRATOR, "ARM-Integrator")  	.init_irq	= ap_init_irq,  	.timer		= &ap_timer,  	.init_machine	= ap_init, +	.restart	= integrator_restart,  MACHINE_END diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c index 5de49c33e4d..3a730d447c9 100644 --- a/arch/arm/mach-integrator/integrator_cp.c +++ b/arch/arm/mach-integrator/integrator_cp.c @@ -499,4 +499,5 @@ MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP")  	.init_irq	= intcp_init_irq,  	.timer		= &cp_timer,  	.init_machine	= intcp_init, +	.restart	= integrator_restart,  MACHINE_END diff --git a/arch/arm/mach-iop13xx/include/mach/iop13xx.h b/arch/arm/mach-iop13xx/include/mach/iop13xx.h index 52b7fab7ef6..07e9ff7adaf 100644 --- a/arch/arm/mach-iop13xx/include/mach/iop13xx.h +++ b/arch/arm/mach-iop13xx/include/mach/iop13xx.h @@ -10,6 +10,7 @@ void iop13xx_map_io(void);  void iop13xx_platform_init(void);  void iop13xx_add_tpmi_devices(void);  void iop13xx_init_irq(void); +void iop13xx_restart(char, const char *);  /* CPUID CP6 R0 Page 0 */  static inline int iop13xx_cpu_id(void) diff --git a/arch/arm/mach-iop13xx/include/mach/system.h b/arch/arm/mach-iop13xx/include/mach/system.h index d0c66ef450a..1f31ed3f8ae 100644 --- a/arch/arm/mach-iop13xx/include/mach/system.h +++ b/arch/arm/mach-iop13xx/include/mach/system.h @@ -7,21 +7,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -#include <mach/iop13xx.h>  static inline void arch_idle(void)  {  	cpu_do_idle();  } - -static inline void arch_reset(char mode, const char *cmd) -{ -	/* -	 * Reset the internal bus (warning both cores are reset) -	 */ -	write_wdtcr(IOP_WDTCR_EN_ARM); -	write_wdtcr(IOP_WDTCR_EN); -	write_wdtsr(IOP13XX_WDTSR_WRITE_EN | IOP13XX_WDTCR_IB_RESET); -	write_wdtcr(0x1000); - -	for(;;); -} diff --git a/arch/arm/mach-iop13xx/iq81340mc.c b/arch/arm/mach-iop13xx/iq81340mc.c index 4cf2cc477ea..abaee883358 100644 --- a/arch/arm/mach-iop13xx/iq81340mc.c +++ b/arch/arm/mach-iop13xx/iq81340mc.c @@ -96,4 +96,5 @@ MACHINE_START(IQ81340MC, "Intel IQ81340MC")  	.init_irq       = iop13xx_init_irq,  	.timer          = &iq81340mc_timer,  	.init_machine   = iq81340mc_init, +	.restart	= iop13xx_restart,  MACHINE_END diff --git a/arch/arm/mach-iop13xx/iq81340sc.c b/arch/arm/mach-iop13xx/iq81340sc.c index cd9e27499a1..690916a09dc 100644 --- a/arch/arm/mach-iop13xx/iq81340sc.c +++ b/arch/arm/mach-iop13xx/iq81340sc.c @@ -98,4 +98,5 @@ MACHINE_START(IQ81340SC, "Intel IQ81340SC")  	.init_irq       = iop13xx_init_irq,  	.timer          = &iq81340sc_timer,  	.init_machine   = iq81340sc_init, +	.restart	= iop13xx_restart,  MACHINE_END diff --git a/arch/arm/mach-iop13xx/setup.c b/arch/arm/mach-iop13xx/setup.c index a5b989728b9..daabb1fa6c2 100644 --- a/arch/arm/mach-iop13xx/setup.c +++ b/arch/arm/mach-iop13xx/setup.c @@ -606,3 +606,14 @@ static int __init iop13xx_init_adma_setup(char *str)  __setup("iop13xx_init_adma", iop13xx_init_adma_setup);  __setup("iop13xx_init_uart", iop13xx_init_uart_setup);  __setup("iop13xx_init_i2c", iop13xx_init_i2c_setup); + +void iop13xx_restart(char mode, const char *cmd) +{ +	/* +	 * Reset the internal bus (warning both cores are reset) +	 */ +	write_wdtcr(IOP_WDTCR_EN_ARM); +	write_wdtcr(IOP_WDTCR_EN); +	write_wdtsr(IOP13XX_WDTSR_WRITE_EN | IOP13XX_WDTCR_IB_RESET); +	write_wdtcr(0x1000); +} diff --git a/arch/arm/mach-iop32x/em7210.c b/arch/arm/mach-iop32x/em7210.c index 4325055d4e1..24069e03fdc 100644 --- a/arch/arm/mach-iop32x/em7210.c +++ b/arch/arm/mach-iop32x/em7210.c @@ -208,4 +208,5 @@ MACHINE_START(EM7210, "Lanner EM7210")  	.init_irq	= iop32x_init_irq,  	.timer		= &em7210_timer,  	.init_machine	= em7210_init_machine, +	.restart	= iop3xx_restart,  MACHINE_END diff --git a/arch/arm/mach-iop32x/glantank.c b/arch/arm/mach-iop32x/glantank.c index 0edc8802057..204e1d1cd76 100644 --- a/arch/arm/mach-iop32x/glantank.c +++ b/arch/arm/mach-iop32x/glantank.c @@ -212,4 +212,5 @@ MACHINE_START(GLANTANK, "GLAN Tank")  	.init_irq	= iop32x_init_irq,  	.timer		= &glantank_timer,  	.init_machine	= glantank_init_machine, +	.restart	= iop3xx_restart,  MACHINE_END diff --git a/arch/arm/mach-iop32x/include/mach/system.h b/arch/arm/mach-iop32x/include/mach/system.h index b4f83e5973b..4a88727bca9 100644 --- a/arch/arm/mach-iop32x/include/mach/system.h +++ b/arch/arm/mach-iop32x/include/mach/system.h @@ -7,26 +7,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -#include <asm/mach-types.h> -#include <asm/hardware/iop3xx.h> -#include <mach/n2100.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } - -static inline void arch_reset(char mode, const char *cmd) -{ -	if (machine_is_n2100()) { -		gpio_line_set(N2100_HARDWARE_RESET, GPIO_LOW); -		gpio_line_config(N2100_HARDWARE_RESET, GPIO_OUT); -		while (1) -			; -	} - -	*IOP3XX_PCSR = 0x30; - -	/* Jump into ROM at address 0 */ -	soft_restart(0); -} diff --git a/arch/arm/mach-iop32x/iq31244.c b/arch/arm/mach-iop32x/iq31244.c index 9e7aaccfeba..3eb642af1cd 100644 --- a/arch/arm/mach-iop32x/iq31244.c +++ b/arch/arm/mach-iop32x/iq31244.c @@ -318,6 +318,7 @@ MACHINE_START(IQ31244, "Intel IQ31244")  	.init_irq	= iop32x_init_irq,  	.timer		= &iq31244_timer,  	.init_machine	= iq31244_init_machine, +	.restart	= iop3xx_restart,  MACHINE_END  /* There should have been an ep80219 machine identifier from the beginning. @@ -332,4 +333,5 @@ MACHINE_START(EP80219, "Intel EP80219")  	.init_irq	= iop32x_init_irq,  	.timer		= &iq31244_timer,  	.init_machine	= iq31244_init_machine, +	.restart	= iop3xx_restart,  MACHINE_END diff --git a/arch/arm/mach-iop32x/iq80321.c b/arch/arm/mach-iop32x/iq80321.c index 53ea86f649d..2ec724b58a2 100644 --- a/arch/arm/mach-iop32x/iq80321.c +++ b/arch/arm/mach-iop32x/iq80321.c @@ -191,4 +191,5 @@ MACHINE_START(IQ80321, "Intel IQ80321")  	.init_irq	= iop32x_init_irq,  	.timer		= &iq80321_timer,  	.init_machine	= iq80321_init_machine, +	.restart	= iop3xx_restart,  MACHINE_END diff --git a/arch/arm/mach-iop32x/n2100.c b/arch/arm/mach-iop32x/n2100.c index d7269279968..6b6d5591244 100644 --- a/arch/arm/mach-iop32x/n2100.c +++ b/arch/arm/mach-iop32x/n2100.c @@ -291,6 +291,14 @@ static void n2100_power_off(void)  		;  } +static void n2100_restart(char mode, const char *cmd) +{ +	gpio_line_set(N2100_HARDWARE_RESET, GPIO_LOW); +	gpio_line_config(N2100_HARDWARE_RESET, GPIO_OUT); +	while (1) +		; +} +  static struct timer_list power_button_poll_timer; @@ -332,4 +340,5 @@ MACHINE_START(N2100, "Thecus N2100")  	.init_irq	= iop32x_init_irq,  	.timer		= &n2100_timer,  	.init_machine	= n2100_init_machine, +	.restart	= n2100_restart,  MACHINE_END diff --git a/arch/arm/mach-iop33x/include/mach/system.h b/arch/arm/mach-iop33x/include/mach/system.h index 86d1b20dd69..4f98e765397 100644 --- a/arch/arm/mach-iop33x/include/mach/system.h +++ b/arch/arm/mach-iop33x/include/mach/system.h @@ -7,17 +7,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -#include <asm/hardware/iop3xx.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } - -static inline void arch_reset(char mode, const char *cmd) -{ -	*IOP3XX_PCSR = 0x30; - -	/* Jump into ROM at address 0 */ -	soft_restart(0); -} diff --git a/arch/arm/mach-iop33x/iq80331.c b/arch/arm/mach-iop33x/iq80331.c index 9e14ccc56f8..abce934f381 100644 --- a/arch/arm/mach-iop33x/iq80331.c +++ b/arch/arm/mach-iop33x/iq80331.c @@ -146,4 +146,5 @@ MACHINE_START(IQ80331, "Intel IQ80331")  	.init_irq	= iop33x_init_irq,  	.timer		= &iq80331_timer,  	.init_machine	= iq80331_init_machine, +	.restart	= iop3xx_restart,  MACHINE_END diff --git a/arch/arm/mach-iop33x/iq80332.c b/arch/arm/mach-iop33x/iq80332.c index 09c899a2523..7513559e25b 100644 --- a/arch/arm/mach-iop33x/iq80332.c +++ b/arch/arm/mach-iop33x/iq80332.c @@ -146,4 +146,5 @@ MACHINE_START(IQ80332, "Intel IQ80332")  	.init_irq	= iop33x_init_irq,  	.timer		= &iq80332_timer,  	.init_machine	= iq80332_init_machine, +	.restart	= iop3xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c index 24f0fe35f4a..81c45370a4e 100644 --- a/arch/arm/mach-ixp2000/core.c +++ b/arch/arm/mach-ixp2000/core.c @@ -515,3 +515,7 @@ void __init ixp2000_init_irq(void)  	}  } +void ixp2000_restart(char mode, const char *cmd) +{ +	ixp2000_reg_wrb(IXP2000_RESET0, RSTALL); +} diff --git a/arch/arm/mach-ixp2000/enp2611.c b/arch/arm/mach-ixp2000/enp2611.c index af9994537e0..ee525416f0d 100644 --- a/arch/arm/mach-ixp2000/enp2611.c +++ b/arch/arm/mach-ixp2000/enp2611.c @@ -259,6 +259,7 @@ MACHINE_START(ENP2611, "Radisys ENP-2611 PCI network processor board")  	.init_irq	= ixp2000_init_irq,  	.timer		= &enp2611_timer,  	.init_machine	= enp2611_init_machine, +	.restart	= ixp2000_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp2000/include/mach/platform.h b/arch/arm/mach-ixp2000/include/mach/platform.h index 42182c79ed9..bb0f8dcf9ee 100644 --- a/arch/arm/mach-ixp2000/include/mach/platform.h +++ b/arch/arm/mach-ixp2000/include/mach/platform.h @@ -122,6 +122,7 @@ void ixp2000_map_io(void);  void ixp2000_uart_init(void);  void ixp2000_init_irq(void);  void ixp2000_init_time(unsigned long); +void ixp2000_restart(char, const char *);  unsigned long ixp2000_gettimeoffset(void);  struct pci_sys_data; diff --git a/arch/arm/mach-ixp2000/include/mach/system.h b/arch/arm/mach-ixp2000/include/mach/system.h index 810df7b9398..a7fb08b2b8e 100644 --- a/arch/arm/mach-ixp2000/include/mach/system.h +++ b/arch/arm/mach-ixp2000/include/mach/system.h @@ -8,40 +8,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - -#include <mach/hardware.h> -#include <asm/mach-types.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } - -static inline void arch_reset(char mode, const char *cmd) -{ -	/* -	 * Reset flash banking register so that we are pointing at -	 * RedBoot bank. -	 */ -	if (machine_is_ixdp2401()) { -		ixp2000_reg_write(IXDP2X01_CPLD_FLASH_REG, -					((0 >> IXDP2X01_FLASH_WINDOW_BITS) -						| IXDP2X01_CPLD_FLASH_INTERN)); -		ixp2000_reg_wrb(IXDP2X01_CPLD_RESET_REG, 0xffffffff); -	} - -	/* -	 * On IXDP2801 we need to write this magic sequence to the CPLD -	 * to cause a complete reset of the CPU and all external devices -	 * and move the flash bank register back to 0. -	 */ -	if (machine_is_ixdp2801() || machine_is_ixdp28x5()) { -		unsigned long reset_reg = *IXDP2X01_CPLD_RESET_REG; - -		reset_reg = 0x55AA0000 | (reset_reg & 0x0000FFFF); -		ixp2000_reg_write(IXDP2X01_CPLD_RESET_REG, reset_reg); -		ixp2000_reg_wrb(IXDP2X01_CPLD_RESET_REG, 0x80000000); -	} - -	ixp2000_reg_wrb(IXP2000_RESET0, RSTALL); -} diff --git a/arch/arm/mach-ixp2000/ixdp2400.c b/arch/arm/mach-ixp2000/ixdp2400.c index f7dfd970014..f53e911ec94 100644 --- a/arch/arm/mach-ixp2000/ixdp2400.c +++ b/arch/arm/mach-ixp2000/ixdp2400.c @@ -176,5 +176,6 @@ MACHINE_START(IXDP2400, "Intel IXDP2400 Development Platform")  	.init_irq	= ixdp2400_init_irq,  	.timer		= &ixdp2400_timer,  	.init_machine	= ixdp2x00_init_machine, +	.restart	= ixp2000_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp2000/ixdp2800.c b/arch/arm/mach-ixp2000/ixdp2800.c index d33bcac1ec9..a2e7c393e74 100644 --- a/arch/arm/mach-ixp2000/ixdp2800.c +++ b/arch/arm/mach-ixp2000/ixdp2800.c @@ -291,5 +291,6 @@ MACHINE_START(IXDP2800, "Intel IXDP2800 Development Platform")  	.init_irq	= ixdp2800_init_irq,  	.timer		= &ixdp2800_timer,  	.init_machine	= ixdp2x00_init_machine, +	.restart	= ixp2000_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp2000/ixdp2x01.c b/arch/arm/mach-ixp2000/ixdp2x01.c index 61a28676b5b..7632beadabf 100644 --- a/arch/arm/mach-ixp2000/ixdp2x01.c +++ b/arch/arm/mach-ixp2000/ixdp2x01.c @@ -413,6 +413,35 @@ static void __init ixdp2x01_init_machine(void)  	ixdp2x01_uart_init();  } +static void ixdp2401_restart(char mode, const char *cmd) +{ +	/* +	 * Reset flash banking register so that we are pointing at +	 * RedBoot bank. +	 */ +	ixp2000_reg_write(IXDP2X01_CPLD_FLASH_REG, +				((0 >> IXDP2X01_FLASH_WINDOW_BITS) +					| IXDP2X01_CPLD_FLASH_INTERN)); +	ixp2000_reg_wrb(IXDP2X01_CPLD_RESET_REG, 0xffffffff); + +	ixp2000_restart(mode, cmd); +} + +static void ixdp280x_restart(char mode, const char *cmd) +{ +	/* +	 * On IXDP2801 we need to write this magic sequence to the CPLD +	 * to cause a complete reset of the CPU and all external devices +	 * and move the flash bank register back to 0. +	 */ +	unsigned long reset_reg = *IXDP2X01_CPLD_RESET_REG; + +	reset_reg = 0x55AA0000 | (reset_reg & 0x0000FFFF); +	ixp2000_reg_write(IXDP2X01_CPLD_RESET_REG, reset_reg); +	ixp2000_reg_wrb(IXDP2X01_CPLD_RESET_REG, 0x80000000); + +	ixp2000_restart(mode, cmd); +}  #ifdef CONFIG_ARCH_IXDP2401  MACHINE_START(IXDP2401, "Intel IXDP2401 Development Platform") @@ -422,6 +451,7 @@ MACHINE_START(IXDP2401, "Intel IXDP2401 Development Platform")  	.init_irq	= ixdp2x01_init_irq,  	.timer		= &ixdp2x01_timer,  	.init_machine	= ixdp2x01_init_machine, +	.restart	= ixdp2401_restart,  MACHINE_END  #endif @@ -433,6 +463,7 @@ MACHINE_START(IXDP2801, "Intel IXDP2801 Development Platform")  	.init_irq	= ixdp2x01_init_irq,  	.timer		= &ixdp2x01_timer,  	.init_machine	= ixdp2x01_init_machine, +	.restart	= ixdp280x_restart,  MACHINE_END  /* @@ -446,6 +477,7 @@ MACHINE_START(IXDP28X5, "Intel IXDP2805/2855 Development Platform")  	.init_irq	= ixdp2x01_init_irq,  	.timer		= &ixdp2x01_timer,  	.init_machine	= ixdp2x01_init_machine, +	.restart	= ixdp280x_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-ixp23xx/core.c b/arch/arm/mach-ixp23xx/core.c index a1bee33d183..0923bb905cc 100644 --- a/arch/arm/mach-ixp23xx/core.c +++ b/arch/arm/mach-ixp23xx/core.c @@ -444,3 +444,9 @@ void __init ixp23xx_sys_init(void)  	*IXP23XX_EXP_UNIT_FUSE |= 0xf;  	platform_add_devices(ixp23xx_devices, ARRAY_SIZE(ixp23xx_devices));  } + +void ixp23xx_restart(char mode, const char *cmd) +{ +	/* Use on-chip reset capability */ +	*IXP23XX_RESET0 |= IXP23XX_RST_ALL; +} diff --git a/arch/arm/mach-ixp23xx/espresso.c b/arch/arm/mach-ixp23xx/espresso.c index 30dd31652e9..8f2487e1fc4 100644 --- a/arch/arm/mach-ixp23xx/espresso.c +++ b/arch/arm/mach-ixp23xx/espresso.c @@ -90,4 +90,5 @@ MACHINE_START(ESPRESSO, "IP Fabrics Double Espresso")  	.timer		= &ixp23xx_timer,  	.atag_offset	= 0x100,  	.init_machine	= espresso_init, +	.restart	= ixp23xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp23xx/include/mach/platform.h b/arch/arm/mach-ixp23xx/include/mach/platform.h index db9d9416e5e..50de558e722 100644 --- a/arch/arm/mach-ixp23xx/include/mach/platform.h +++ b/arch/arm/mach-ixp23xx/include/mach/platform.h @@ -34,6 +34,7 @@ struct pci_sys_data;  void ixp23xx_map_io(void);  void ixp23xx_init_irq(void);  void ixp23xx_sys_init(void); +void ixp23xx_restart(char, const char *);  int ixp23xx_pci_setup(int, struct pci_sys_data *);  void ixp23xx_pci_preinit(void);  struct pci_bus *ixp23xx_pci_scan_bus(int, struct pci_sys_data*); diff --git a/arch/arm/mach-ixp23xx/include/mach/system.h b/arch/arm/mach-ixp23xx/include/mach/system.h index 8920ff2dff1..277dda7334b 100644 --- a/arch/arm/mach-ixp23xx/include/mach/system.h +++ b/arch/arm/mach-ixp23xx/include/mach/system.h @@ -7,10 +7,6 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - -#include <mach/hardware.h> -#include <asm/mach-types.h> -  static inline void arch_idle(void)  {  #if 0 @@ -18,16 +14,3 @@ static inline void arch_idle(void)  		cpu_do_idle();  #endif  } - -static inline void arch_reset(char mode, const char *cmd) -{ -	/* First try machine specific support */ -	if (machine_is_ixdp2351()) { -		*IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_MAGIC; -		(void) *IXDP2351_CPLD_RESET1_REG; -		*IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_ENABLE; -	} - -	/* Use on-chip reset capability */ -	*IXP23XX_RESET0 |= IXP23XX_RST_ALL; -} diff --git a/arch/arm/mach-ixp23xx/ixdp2351.c b/arch/arm/mach-ixp23xx/ixdp2351.c index b3a57e0f341..5d5dd3e8d06 100644 --- a/arch/arm/mach-ixp23xx/ixdp2351.c +++ b/arch/arm/mach-ixp23xx/ixdp2351.c @@ -326,6 +326,17 @@ static void __init ixdp2351_init(void)  	ixp23xx_sys_init();  } +static void ixdp2351_restart(char mode, const char *cmd) +{ +	/* First try machine specific support */ + +	*IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_MAGIC; +	(void) *IXDP2351_CPLD_RESET1_REG; +	*IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_ENABLE; + +	ixp23xx_restart(mode, cmd); +} +  MACHINE_START(IXDP2351, "Intel IXDP2351 Development Platform")  	/* Maintainer: MontaVista Software, Inc. */  	.map_io		= ixdp2351_map_io, @@ -333,4 +344,5 @@ MACHINE_START(IXDP2351, "Intel IXDP2351 Development Platform")  	.timer		= &ixp23xx_timer,  	.atag_offset	= 0x100,  	.init_machine	= ixdp2351_init, +	.restart	= ixdp2351_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp23xx/roadrunner.c b/arch/arm/mach-ixp23xx/roadrunner.c index 8f4dcbba902..377283fc658 100644 --- a/arch/arm/mach-ixp23xx/roadrunner.c +++ b/arch/arm/mach-ixp23xx/roadrunner.c @@ -177,4 +177,5 @@ MACHINE_START(ROADRUNNER, "ADI Engineering RoadRunner Development Platform")  	.timer		= &ixp23xx_timer,  	.atag_offset	= 0x100,  	.init_machine	= roadrunner_init, +	.restart	= ixp23xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp4xx/avila-setup.c b/arch/arm/mach-ixp4xx/avila-setup.c index 37609a22c45..a7277ad470a 100644 --- a/arch/arm/mach-ixp4xx/avila-setup.c +++ b/arch/arm/mach-ixp4xx/avila-setup.c @@ -172,6 +172,7 @@ MACHINE_START(AVILA, "Gateworks Avila Network Platform")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END   /* @@ -190,6 +191,7 @@ MACHINE_START(LOFT, "Giant Shoulder Inc Loft board")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index c1b12f945fc..3841ab4146b 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c @@ -491,3 +491,23 @@ static void __init ixp4xx_clockevent_init(void)  	clockevents_register_device(&clockevent_ixp4xx);  } + +void ixp4xx_restart(char mode, const char *cmd) +{ +	if ( 1 && mode == 's') { +		/* Jump into ROM at address 0 */ +		soft_restart(0); +	} else { +		/* Use on-chip reset capability */ + +		/* set the "key" register to enable access to +		 * "timer" and "enable" registers +		 */ +		*IXP4XX_OSWK = IXP4XX_WDT_KEY; + +		/* write 0 to the timer register for an immediate reset */ +		*IXP4XX_OSWT = 0; + +		*IXP4XX_OSWE = IXP4XX_WDT_RESET_ENABLE | IXP4XX_WDT_COUNT_ENABLE; +	} +} diff --git a/arch/arm/mach-ixp4xx/coyote-setup.c b/arch/arm/mach-ixp4xx/coyote-setup.c index 81dfec31842..a74f86ce8bc 100644 --- a/arch/arm/mach-ixp4xx/coyote-setup.c +++ b/arch/arm/mach-ixp4xx/coyote-setup.c @@ -117,6 +117,7 @@ MACHINE_START(ADI_COYOTE, "ADI Engineering Coyote")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END  #endif @@ -132,6 +133,7 @@ MACHINE_START(IXDPG425, "Intel IXDPG425")  	.timer		= &ixp4xx_timer,  	.atag_offset	= 0x100,  	.init_machine	= coyote_init, +	.restart	= ixp4xx_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-ixp4xx/dsmg600-setup.c b/arch/arm/mach-ixp4xx/dsmg600-setup.c index 8837fbca27c..67be177b336 100644 --- a/arch/arm/mach-ixp4xx/dsmg600-setup.c +++ b/arch/arm/mach-ixp4xx/dsmg600-setup.c @@ -286,4 +286,5 @@ MACHINE_START(DSMG600, "D-Link DSM-G600 RevA")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp4xx/fsg-setup.c b/arch/arm/mach-ixp4xx/fsg-setup.c index 2887c3578c1..6d5818285af 100644 --- a/arch/arm/mach-ixp4xx/fsg-setup.c +++ b/arch/arm/mach-ixp4xx/fsg-setup.c @@ -277,5 +277,6 @@ MACHINE_START(FSG, "Freecom FSG-3")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp4xx/gateway7001-setup.c b/arch/arm/mach-ixp4xx/gateway7001-setup.c index d69d1b053bb..7ecf9b28f1c 100644 --- a/arch/arm/mach-ixp4xx/gateway7001-setup.c +++ b/arch/arm/mach-ixp4xx/gateway7001-setup.c @@ -104,5 +104,6 @@ MACHINE_START(GATEWAY7001, "Gateway 7001 AP")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-ixp4xx/goramo_mlr.c b/arch/arm/mach-ixp4xx/goramo_mlr.c index bf6678d1a92..c0e3d69a8ae 100644 --- a/arch/arm/mach-ixp4xx/goramo_mlr.c +++ b/arch/arm/mach-ixp4xx/goramo_mlr.c @@ -504,4 +504,5 @@ MACHINE_START(GORAMO_MLR, "MultiLink")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp4xx/gtwx5715-setup.c b/arch/arm/mach-ixp4xx/gtwx5715-setup.c index aa029fc1914..a23f8939145 100644 --- a/arch/arm/mach-ixp4xx/gtwx5715-setup.c +++ b/arch/arm/mach-ixp4xx/gtwx5715-setup.c @@ -172,6 +172,7 @@ MACHINE_START(GTWX5715, "Gemtek GTWX5715 (Linksys WRV54G)")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp4xx/include/mach/platform.h b/arch/arm/mach-ixp4xx/include/mach/platform.h index e824c02c825..df9250bbf13 100644 --- a/arch/arm/mach-ixp4xx/include/mach/platform.h +++ b/arch/arm/mach-ixp4xx/include/mach/platform.h @@ -125,6 +125,7 @@ extern void ixp4xx_init_irq(void);  extern void ixp4xx_sys_init(void);  extern void ixp4xx_timer_init(void);  extern struct sys_timer ixp4xx_timer; +extern void ixp4xx_restart(char, const char *);  extern void ixp4xx_pci_preinit(void);  struct pci_sys_data;  extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); diff --git a/arch/arm/mach-ixp4xx/include/mach/system.h b/arch/arm/mach-ixp4xx/include/mach/system.h index 24337d9d275..140a9bef446 100644 --- a/arch/arm/mach-ixp4xx/include/mach/system.h +++ b/arch/arm/mach-ixp4xx/include/mach/system.h @@ -8,9 +8,6 @@   * published by the Free Software Foundation.   *   */ - -#include <mach/hardware.h> -  static inline void arch_idle(void)  {  	/* ixp4xx does not implement the XScale PWRMODE register, @@ -20,25 +17,3 @@ static inline void arch_idle(void)  	cpu_do_idle();  #endif  } - - -static inline void arch_reset(char mode, const char *cmd) -{ -	if ( 1 && mode == 's') { -		/* Jump into ROM at address 0 */ -		soft_restart(0); -	} else { -		/* Use on-chip reset capability */ - -		/* set the "key" register to enable access to -		 * "timer" and "enable" registers -		 */ -		*IXP4XX_OSWK = IXP4XX_WDT_KEY; - -		/* write 0 to the timer register for an immediate reset */ -		*IXP4XX_OSWT = 0; - -		*IXP4XX_OSWE = IXP4XX_WDT_RESET_ENABLE | IXP4XX_WDT_COUNT_ENABLE; -	} -} - diff --git a/arch/arm/mach-ixp4xx/ixdp425-setup.c b/arch/arm/mach-ixp4xx/ixdp425-setup.c index f235f829dfa..8a38b39999f 100644 --- a/arch/arm/mach-ixp4xx/ixdp425-setup.c +++ b/arch/arm/mach-ixp4xx/ixdp425-setup.c @@ -261,6 +261,7 @@ MACHINE_START(IXDP425, "Intel IXDP425 Development Platform")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-ixp4xx/nas100d-setup.c b/arch/arm/mach-ixp4xx/nas100d-setup.c index de716fa1aab..1010eb7b008 100644 --- a/arch/arm/mach-ixp4xx/nas100d-setup.c +++ b/arch/arm/mach-ixp4xx/nas100d-setup.c @@ -321,4 +321,5 @@ MACHINE_START(NAS100D, "Iomega NAS 100d")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp4xx/nslu2-setup.c b/arch/arm/mach-ixp4xx/nslu2-setup.c index ac81ccb26bf..aa355c360d5 100644 --- a/arch/arm/mach-ixp4xx/nslu2-setup.c +++ b/arch/arm/mach-ixp4xx/nslu2-setup.c @@ -307,4 +307,5 @@ MACHINE_START(NSLU2, "Linksys NSLU2")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp4xx/omixp-setup.c b/arch/arm/mach-ixp4xx/omixp-setup.c index 3b6a81a696f..0940869fcfd 100644 --- a/arch/arm/mach-ixp4xx/omixp-setup.c +++ b/arch/arm/mach-ixp4xx/omixp-setup.c @@ -246,6 +246,7 @@ MACHINE_START(DEVIXP, "Omicron DEVIXP")  	.init_irq	= ixp4xx_init_irq,  	.timer          = &ixp4xx_timer,  	.init_machine	= omixp_init, +	.restart	= ixp4xx_restart,  MACHINE_END  #endif @@ -259,6 +260,7 @@ MACHINE_START(MICCPT, "Omicron MICCPT")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END  #endif @@ -269,5 +271,6 @@ MACHINE_START(MIC256, "Omicron MIC256")  	.init_irq	= ixp4xx_init_irq,  	.timer          = &ixp4xx_timer,  	.init_machine	= omixp_init, +	.restart	= ixp4xx_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-ixp4xx/vulcan-setup.c b/arch/arm/mach-ixp4xx/vulcan-setup.c index 27e469ef452..9dec2068329 100644 --- a/arch/arm/mach-ixp4xx/vulcan-setup.c +++ b/arch/arm/mach-ixp4xx/vulcan-setup.c @@ -244,4 +244,5 @@ MACHINE_START(ARCOM_VULCAN, "Arcom/Eurotech Vulcan")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END diff --git a/arch/arm/mach-ixp4xx/wg302v2-setup.c b/arch/arm/mach-ixp4xx/wg302v2-setup.c index b14144b967a..5ac0f0a0fd8 100644 --- a/arch/arm/mach-ixp4xx/wg302v2-setup.c +++ b/arch/arm/mach-ixp4xx/wg302v2-setup.c @@ -105,5 +105,6 @@ MACHINE_START(WG302V2, "Netgear WG302 v2 / WAG302 v2")  #if defined(CONFIG_PCI)  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= ixp4xx_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index f3248cfbe51..0bff4a91623 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c @@ -534,3 +534,19 @@ static int __init kirkwood_clock_gate(void)  	return 0;  }  late_initcall(kirkwood_clock_gate); + +void kirkwood_restart(char mode, const char *cmd) +{ +	/* +	 * Enable soft reset to assert RSTOUTn. +	 */ +	writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); + +	/* +	 * Assert soft reset. +	 */ +	writel(SOFT_RESET, SYSTEM_SOFT_RESET); + +	while (1) +		; +} diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h index b9b0f0968a3..1529280246d 100644 --- a/arch/arm/mach-kirkwood/common.h +++ b/arch/arm/mach-kirkwood/common.h @@ -50,6 +50,7 @@ void kirkwood_uart1_init(void);  void kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, int delay);  void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts, int (*dev_ready)(struct mtd_info *));  void kirkwood_audio_init(void); +void kirkwood_restart(char, const char *);  extern int kirkwood_tclk;  extern struct sys_timer kirkwood_timer; diff --git a/arch/arm/mach-kirkwood/d2net_v2-setup.c b/arch/arm/mach-kirkwood/d2net_v2-setup.c index f457e07a65f..6e1bac929ab 100644 --- a/arch/arm/mach-kirkwood/d2net_v2-setup.c +++ b/arch/arm/mach-kirkwood/d2net_v2-setup.c @@ -227,4 +227,5 @@ MACHINE_START(D2NET_V2, "LaCie d2 Network v2")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END diff --git a/arch/arm/mach-kirkwood/db88f6281-bp-setup.c b/arch/arm/mach-kirkwood/db88f6281-bp-setup.c index ff4c21c1f92..d9335937959 100644 --- a/arch/arm/mach-kirkwood/db88f6281-bp-setup.c +++ b/arch/arm/mach-kirkwood/db88f6281-bp-setup.c @@ -103,4 +103,5 @@ MACHINE_START(DB88F6281_BP, "Marvell DB-88F6281-BP Development Board")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END diff --git a/arch/arm/mach-kirkwood/dockstar-setup.c b/arch/arm/mach-kirkwood/dockstar-setup.c index e4d199b2b1e..61d9a552a05 100644 --- a/arch/arm/mach-kirkwood/dockstar-setup.c +++ b/arch/arm/mach-kirkwood/dockstar-setup.c @@ -108,4 +108,5 @@ MACHINE_START(DOCKSTAR, "Seagate FreeAgent DockStar")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END diff --git a/arch/arm/mach-kirkwood/guruplug-setup.c b/arch/arm/mach-kirkwood/guruplug-setup.c index 6c40f784b51..bdaed3867d1 100644 --- a/arch/arm/mach-kirkwood/guruplug-setup.c +++ b/arch/arm/mach-kirkwood/guruplug-setup.c @@ -127,4 +127,5 @@ MACHINE_START(GURUPLUG, "Marvell GuruPlug Reference Board")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END diff --git a/arch/arm/mach-kirkwood/include/mach/system.h b/arch/arm/mach-kirkwood/include/mach/system.h index 7568e95d279..5fddde002b5 100644 --- a/arch/arm/mach-kirkwood/include/mach/system.h +++ b/arch/arm/mach-kirkwood/include/mach/system.h @@ -9,28 +9,9 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <mach/bridge-regs.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	/* -	 * Enable soft reset to assert RSTOUTn. -	 */ -	writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); - -	/* -	 * Assert soft reset. -	 */ -	writel(SOFT_RESET, SYSTEM_SOFT_RESET); - -	while (1) -		; -} - -  #endif diff --git a/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c b/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c index 9a1e917352f..85f6169c248 100644 --- a/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c +++ b/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c @@ -169,4 +169,5 @@ MACHINE_START(MV88F6281GTW_GE, "Marvell 88F6281 GTW GE Board")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END diff --git a/arch/arm/mach-kirkwood/netspace_v2-setup.c b/arch/arm/mach-kirkwood/netspace_v2-setup.c index 8849bcc7328..e6bba01bae3 100644 --- a/arch/arm/mach-kirkwood/netspace_v2-setup.c +++ b/arch/arm/mach-kirkwood/netspace_v2-setup.c @@ -264,6 +264,7 @@ MACHINE_START(NETSPACE_V2, "LaCie Network Space v2")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END  #endif @@ -275,6 +276,7 @@ MACHINE_START(INETSPACE_V2, "LaCie Internet Space v2")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END  #endif @@ -286,5 +288,6 @@ MACHINE_START(NETSPACE_MAX_V2, "LaCie Network Space Max v2")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-kirkwood/netxbig_v2-setup.c b/arch/arm/mach-kirkwood/netxbig_v2-setup.c index 1ba12c4dff8..31ae8de34e9 100644 --- a/arch/arm/mach-kirkwood/netxbig_v2-setup.c +++ b/arch/arm/mach-kirkwood/netxbig_v2-setup.c @@ -405,6 +405,7 @@ MACHINE_START(NET2BIG_V2, "LaCie 2Big Network v2")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END  #endif @@ -416,5 +417,6 @@ MACHINE_START(NET5BIG_V2, "LaCie 5Big Network v2")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-kirkwood/openrd-setup.c b/arch/arm/mach-kirkwood/openrd-setup.c index 5660ca6c3d8..01f8c899288 100644 --- a/arch/arm/mach-kirkwood/openrd-setup.c +++ b/arch/arm/mach-kirkwood/openrd-setup.c @@ -220,6 +220,7 @@ MACHINE_START(OPENRD_BASE, "Marvell OpenRD Base Board")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END  #endif @@ -232,6 +233,7 @@ MACHINE_START(OPENRD_CLIENT, "Marvell OpenRD Client Board")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END  #endif @@ -244,5 +246,6 @@ MACHINE_START(OPENRD_ULTIMATE, "Marvell OpenRD Ultimate Board")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c index 6663869773a..fd2c9c8b683 100644 --- a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c @@ -85,4 +85,5 @@ MACHINE_START(RD88F6192_NAS, "Marvell RD-88F6192-NAS Development Board")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END diff --git a/arch/arm/mach-kirkwood/rd88f6281-setup.c b/arch/arm/mach-kirkwood/rd88f6281-setup.c index 66b3c05e37a..ef922079348 100644 --- a/arch/arm/mach-kirkwood/rd88f6281-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6281-setup.c @@ -121,4 +121,5 @@ MACHINE_START(RD88F6281, "Marvell RD-88F6281 Reference Board")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END diff --git a/arch/arm/mach-kirkwood/sheevaplug-setup.c b/arch/arm/mach-kirkwood/sheevaplug-setup.c index 046eeb6b9f5..4ea70e5f713 100644 --- a/arch/arm/mach-kirkwood/sheevaplug-setup.c +++ b/arch/arm/mach-kirkwood/sheevaplug-setup.c @@ -144,6 +144,7 @@ MACHINE_START(SHEEVAPLUG, "Marvell SheevaPlug Reference Board")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END  #endif @@ -155,5 +156,6 @@ MACHINE_START(ESATA_SHEEVAPLUG, "Marvell eSATA SheevaPlug Reference Board")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-kirkwood/t5325-setup.c b/arch/arm/mach-kirkwood/t5325-setup.c index ea104fb5ec3..966b2b3bb81 100644 --- a/arch/arm/mach-kirkwood/t5325-setup.c +++ b/arch/arm/mach-kirkwood/t5325-setup.c @@ -207,4 +207,5 @@ MACHINE_START(T5325, "HP t5325 Thin Client")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END diff --git a/arch/arm/mach-kirkwood/ts219-setup.c b/arch/arm/mach-kirkwood/ts219-setup.c index 262c034836d..73e2b6ca956 100644 --- a/arch/arm/mach-kirkwood/ts219-setup.c +++ b/arch/arm/mach-kirkwood/ts219-setup.c @@ -138,4 +138,5 @@ MACHINE_START(TS219, "QNAP TS-119/TS-219")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END diff --git a/arch/arm/mach-kirkwood/ts41x-setup.c b/arch/arm/mach-kirkwood/ts41x-setup.c index b68f5b4a9ec..5bbca268044 100644 --- a/arch/arm/mach-kirkwood/ts41x-setup.c +++ b/arch/arm/mach-kirkwood/ts41x-setup.c @@ -182,4 +182,5 @@ MACHINE_START(TS41X, "QNAP TS-41x")  	.init_early	= kirkwood_init_early,  	.init_irq	= kirkwood_init_irq,  	.timer		= &kirkwood_timer, +	.restart	= kirkwood_restart,  MACHINE_END diff --git a/arch/arm/mach-ks8695/board-acs5k.c b/arch/arm/mach-ks8695/board-acs5k.c index a91f99d265a..255502ddd87 100644 --- a/arch/arm/mach-ks8695/board-acs5k.c +++ b/arch/arm/mach-ks8695/board-acs5k.c @@ -228,4 +228,5 @@ MACHINE_START(ACS5K, "Brivo Systems LLC ACS-5000 Master board")  	.init_irq	= ks8695_init_irq,  	.init_machine	= acs5k_init,  	.timer		= &ks8695_timer, +	.restart	= ks8695_restart,  MACHINE_END diff --git a/arch/arm/mach-ks8695/board-dsm320.c b/arch/arm/mach-ks8695/board-dsm320.c index d24bcef2e2d..e0d36cef2c5 100644 --- a/arch/arm/mach-ks8695/board-dsm320.c +++ b/arch/arm/mach-ks8695/board-dsm320.c @@ -126,4 +126,5 @@ MACHINE_START(DSM320, "D-Link DSM-320 Wireless Media Player")  	.init_irq	= ks8695_init_irq,  	.init_machine	= dsm320_init,  	.timer		= &ks8695_timer, +	.restart	= ks8695_restart,  MACHINE_END diff --git a/arch/arm/mach-ks8695/board-micrel.c b/arch/arm/mach-ks8695/board-micrel.c index 16c95657f8f..a8270725b76 100644 --- a/arch/arm/mach-ks8695/board-micrel.c +++ b/arch/arm/mach-ks8695/board-micrel.c @@ -58,4 +58,5 @@ MACHINE_START(KS8695, "KS8695 Centaur Development Board")  	.init_irq	= ks8695_init_irq,  	.init_machine	= micrel_init,  	.timer		= &ks8695_timer, +	.restart	= ks8695_restart,  MACHINE_END diff --git a/arch/arm/mach-ks8695/generic.h b/arch/arm/mach-ks8695/generic.h index 2fbfab8d5fa..f8bdb11a9c3 100644 --- a/arch/arm/mach-ks8695/generic.h +++ b/arch/arm/mach-ks8695/generic.h @@ -12,4 +12,5 @@  extern __init void ks8695_map_io(void);  extern __init void ks8695_init_irq(void); +extern void ks8695_restart(char, const char *);  extern struct sys_timer ks8695_timer; diff --git a/arch/arm/mach-ks8695/include/mach/system.h b/arch/arm/mach-ks8695/include/mach/system.h index ceb19c90aa5..59fe992395b 100644 --- a/arch/arm/mach-ks8695/include/mach/system.h +++ b/arch/arm/mach-ks8695/include/mach/system.h @@ -14,9 +14,6 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <linux/io.h> -#include <mach/regs-timer.h> -  static void arch_idle(void)  {  	/* @@ -27,22 +24,4 @@ static void arch_idle(void)  } -static void arch_reset(char mode, const char *cmd) -{ -	unsigned int reg; - -	if (mode == 's') -		soft_restart(0); - -	/* disable timer0 */ -	reg = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); -	__raw_writel(reg & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); - -	/* enable watchdog mode */ -	__raw_writel((10 << 8) | T0TC_WATCHDOG, KS8695_TMR_VA + KS8695_T0TC); - -	/* re-enable timer0 */ -	__raw_writel(reg | TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); -} -  #endif diff --git a/arch/arm/mach-ks8695/time.c b/arch/arm/mach-ks8695/time.c index 69c072c2c0f..37dfcd5bd2a 100644 --- a/arch/arm/mach-ks8695/time.c +++ b/arch/arm/mach-ks8695/time.c @@ -109,3 +109,21 @@ struct sys_timer ks8695_timer = {  	.offset		= ks8695_gettimeoffset,  	.resume		= ks8695_timer_setup,  }; + +void ks8695_restart(char mode, const char *cmd) +{ +	unsigned int reg; + +	if (mode == 's') +		soft_restart(0); + +	/* disable timer0 */ +	reg = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); +	__raw_writel(reg & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); + +	/* enable watchdog mode */ +	__raw_writel((10 << 8) | T0TC_WATCHDOG, KS8695_TMR_VA + KS8695_T0TC); + +	/* re-enable timer0 */ +	__raw_writel(reg | TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); +} diff --git a/arch/arm/mach-lpc32xx/common.c b/arch/arm/mach-lpc32xx/common.c index 205b2dbb565..369b152896c 100644 --- a/arch/arm/mach-lpc32xx/common.c +++ b/arch/arm/mach-lpc32xx/common.c @@ -164,7 +164,7 @@ int clk_is_sysclk_mainosc(void)  /*   * System reset via the watchdog timer   */ -void lpc32xx_watchdog_reset(void) +static void lpc32xx_watchdog_reset(void)  {  	/* Make sure WDT clocks are enabled */  	__raw_writel(LPC32XX_CLKPWR_PWMCLK_WDOG_EN, @@ -311,3 +311,21 @@ void __init lpc32xx_map_io(void)  {  	iotable_init(lpc32xx_io_desc, ARRAY_SIZE(lpc32xx_io_desc));  } + +void lpc23xx_restart(char mode, const char *cmd) +{ +	switch (mode) { +	case 's': +	case 'h': +		lpc32xx_watchdog_reset(); +		break; + +	default: +		/* Do nothing */ +		break; +	} + +	/* Wait for watchdog to reset system */ +	while (1) +		; +} diff --git a/arch/arm/mach-lpc32xx/common.h b/arch/arm/mach-lpc32xx/common.h index 5583f52662b..4b4e700343c 100644 --- a/arch/arm/mach-lpc32xx/common.h +++ b/arch/arm/mach-lpc32xx/common.h @@ -39,6 +39,8 @@ extern void __init lpc32xx_init_irq(void);  extern void __init lpc32xx_map_io(void);  extern void __init lpc32xx_serial_init(void);  extern void __init lpc32xx_gpio_init(void); +extern void lpc23xx_restart(char, const char *); +  /*   * Structure used for setting up and querying the PLLS diff --git a/arch/arm/mach-lpc32xx/include/mach/system.h b/arch/arm/mach-lpc32xx/include/mach/system.h index d47f3b1c24b..bf176c99152 100644 --- a/arch/arm/mach-lpc32xx/include/mach/system.h +++ b/arch/arm/mach-lpc32xx/include/mach/system.h @@ -24,26 +24,4 @@ static void arch_idle(void)  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	extern void lpc32xx_watchdog_reset(void); - -	switch (mode) { -	case 's': -	case 'h': -		printk(KERN_CRIT "RESET: Rebooting system\n"); - -		lpc32xx_watchdog_reset(); -		break; - -	default: -		/* Do nothing */ -		break; -	} - -	/* Wait for watchdog to reset system */ -	while (1) -		; -} -  #endif diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c index 6d2f0d1b937..ecb94114c81 100644 --- a/arch/arm/mach-lpc32xx/phy3250.c +++ b/arch/arm/mach-lpc32xx/phy3250.c @@ -388,4 +388,5 @@ MACHINE_START(PHY3250, "Phytec 3250 board with the LPC3250 Microcontroller")  	.init_irq	= lpc32xx_init_irq,  	.timer		= &lpc32xx_timer,  	.init_machine	= phy3250_board_init, +	.restart	= lpc23xx_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c index 7a60bbbce7a..3e6dfab59ef 100644 --- a/arch/arm/mach-mmp/aspenite.c +++ b/arch/arm/mach-mmp/aspenite.c @@ -243,6 +243,7 @@ MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform")  	.init_irq       = pxa168_init_irq,  	.timer          = &pxa168_timer,  	.init_machine   = common_init, +	.restart	= pxa168_restart,  MACHINE_END  MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform") @@ -251,4 +252,5 @@ MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform")  	.init_irq       = pxa168_init_irq,  	.timer          = &pxa168_timer,  	.init_machine   = common_init, +	.restart	= pxa168_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/avengers_lite.c b/arch/arm/mach-mmp/avengers_lite.c index 39f0878d64a..8de3dc6131a 100644 --- a/arch/arm/mach-mmp/avengers_lite.c +++ b/arch/arm/mach-mmp/avengers_lite.c @@ -45,4 +45,5 @@ MACHINE_START(AVENGERS_LITE, "PXA168 Avengers lite Development Platform")  	.init_irq       = pxa168_init_irq,  	.timer          = &pxa168_timer,  	.init_machine   = avengers_lite_init, +	.restart	= pxa168_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.c index 983cfb15fbd..e16f04b39b1 100644 --- a/arch/arm/mach-mmp/brownstone.c +++ b/arch/arm/mach-mmp/brownstone.c @@ -219,4 +219,5 @@ MACHINE_START(BROWNSTONE, "Brownstone Development Platform")  	.init_irq	= mmp2_init_irq,  	.timer		= &mmp2_timer,  	.init_machine	= brownstone_init, +	.restart	= mmp_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/common.c b/arch/arm/mach-mmp/common.c index 5720674739f..062b5b93c50 100644 --- a/arch/arm/mach-mmp/common.c +++ b/arch/arm/mach-mmp/common.c @@ -45,3 +45,8 @@ void __init mmp_map_io(void)  	/* this is early, initialize mmp_chip_id here */  	mmp_chip_id = __raw_readl(MMP_CHIPID);  } + +void mmp_restart(char mode, const char *cmd) +{ +	soft_restart(0); +} diff --git a/arch/arm/mach-mmp/common.h b/arch/arm/mach-mmp/common.h index ec8d65ded25..1c9d6c1ea97 100644 --- a/arch/arm/mach-mmp/common.h +++ b/arch/arm/mach-mmp/common.h @@ -6,3 +6,4 @@ extern void timer_init(int irq);  extern void __init icu_init_irq(void);  extern void __init mmp_map_io(void); +extern void mmp_restart(char, const char *); diff --git a/arch/arm/mach-mmp/flint.c b/arch/arm/mach-mmp/flint.c index c4fd806b15b..5a6a27a6cfd 100644 --- a/arch/arm/mach-mmp/flint.c +++ b/arch/arm/mach-mmp/flint.c @@ -121,4 +121,5 @@ MACHINE_START(FLINT, "Flint Development Platform")  	.init_irq       = mmp2_init_irq,  	.timer          = &mmp2_timer,  	.init_machine   = flint_init, +	.restart	= mmp_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/gplugd.c b/arch/arm/mach-mmp/gplugd.c index 4665767a4f7..1e3abbe37ca 100644 --- a/arch/arm/mach-mmp/gplugd.c +++ b/arch/arm/mach-mmp/gplugd.c @@ -194,4 +194,5 @@ MACHINE_START(GPLUGD, "PXA168-based GuruPlug Display (gplugD) Platform")  	.init_irq       = pxa168_init_irq,  	.timer          = &pxa168_timer,  	.init_machine   = gplugd_init, +	.restart	= pxa168_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h b/arch/arm/mach-mmp/include/mach/pxa168.h index 7fb568d2845..a677aa732c2 100644 --- a/arch/arm/mach-mmp/include/mach/pxa168.h +++ b/arch/arm/mach-mmp/include/mach/pxa168.h @@ -5,6 +5,7 @@ struct sys_timer;  extern struct sys_timer pxa168_timer;  extern void __init pxa168_init_irq(void); +extern void pxa168_restart(char, const char *);  extern void pxa168_clear_keypad_wakeup(void);  #include <linux/i2c.h> diff --git a/arch/arm/mach-mmp/include/mach/system.h b/arch/arm/mach-mmp/include/mach/system.h index cb0637933a8..1d001eab81e 100644 --- a/arch/arm/mach-mmp/include/mach/system.h +++ b/arch/arm/mach-mmp/include/mach/system.h @@ -9,18 +9,8 @@  #ifndef __ASM_MACH_SYSTEM_H  #define __ASM_MACH_SYSTEM_H -#include <mach/cputype.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } - -static inline void arch_reset(char mode, const char *cmd) -{ -	if (cpu_is_pxa168()) -		soft_restart(0xffff0000); -	else -		soft_restart(0); -}  #endif /* __ASM_MACH_SYSTEM_H */ diff --git a/arch/arm/mach-mmp/jasper.c b/arch/arm/mach-mmp/jasper.c index 8bfac661262..96cf5c8fe47 100644 --- a/arch/arm/mach-mmp/jasper.c +++ b/arch/arm/mach-mmp/jasper.c @@ -175,4 +175,5 @@ MACHINE_START(MARVELL_JASPER, "Jasper Development Platform")  	.init_irq       = mmp2_init_irq,  	.timer          = &mmp2_timer,  	.init_machine   = jasper_init, +	.restart	= mmp_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c index 76ca15c00e4..13f23867a86 100644 --- a/arch/arm/mach-mmp/pxa168.c +++ b/arch/arm/mach-mmp/pxa168.c @@ -214,3 +214,8 @@ int __init pxa168_add_usb_host(struct pxa168_usb_pdata *pdata)  	pxa168_device_usb_host.dev.platform_data = pdata;  	return platform_device_register(&pxa168_device_usb_host);  } + +void pxa168_restart(char mode, const char *cmd) +{ +	soft_restart(0xffff0000); +} diff --git a/arch/arm/mach-mmp/tavorevb.c b/arch/arm/mach-mmp/tavorevb.c index eb5be879fd8..257a21283ec 100644 --- a/arch/arm/mach-mmp/tavorevb.c +++ b/arch/arm/mach-mmp/tavorevb.c @@ -103,4 +103,5 @@ MACHINE_START(TAVOREVB, "PXA910 Evaluation Board (aka TavorEVB)")  	.init_irq       = pxa910_init_irq,  	.timer          = &pxa910_timer,  	.init_machine   = tavorevb_init, +	.restart	= mmp_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/teton_bga.c b/arch/arm/mach-mmp/teton_bga.c index bbe4727b96c..8ac22a62bf1 100644 --- a/arch/arm/mach-mmp/teton_bga.c +++ b/arch/arm/mach-mmp/teton_bga.c @@ -86,4 +86,5 @@ MACHINE_START(TETON_BGA, "PXA168-based Teton BGA Development Platform")  	.init_irq       = pxa168_init_irq,  	.timer          = &pxa168_timer,  	.init_machine   = teton_bga_init, +	.restart	= pxa168_restart,  MACHINE_END diff --git a/arch/arm/mach-mmp/ttc_dkb.c b/arch/arm/mach-mmp/ttc_dkb.c index 176515a7698..f0265882557 100644 --- a/arch/arm/mach-mmp/ttc_dkb.c +++ b/arch/arm/mach-mmp/ttc_dkb.c @@ -159,4 +159,5 @@ MACHINE_START(TTC_DKB, "PXA910-based TTC_DKB Development Platform")  	.init_irq       = pxa910_init_irq,  	.timer          = &pxa910_timer,  	.init_machine   = ttc_dkb_init, +	.restart	= mmp_restart,  MACHINE_END diff --git a/arch/arm/mach-msm/include/mach/system.h b/arch/arm/mach-msm/include/mach/system.h index d2e83f42ba1..311db2b35da 100644 --- a/arch/arm/mach-msm/include/mach/system.h +++ b/arch/arm/mach-msm/include/mach/system.h @@ -12,16 +12,8 @@   * GNU General Public License for more details.   *   */ - -#include <mach/hardware.h> -  void arch_idle(void); -static inline void arch_reset(char mode, const char *cmd) -{ -	for (;;) ;  /* depends on IPC w/ other core */ -} -  /* low level hardware reset hook -- for example, hitting the   * PSHOLD line on the PMIC to hard reset the system   */ diff --git a/arch/arm/mach-mv78xx0/buffalo-wxl-setup.c b/arch/arm/mach-mv78xx0/buffalo-wxl-setup.c index 0e94268d6e6..ee74ec97c14 100644 --- a/arch/arm/mach-mv78xx0/buffalo-wxl-setup.c +++ b/arch/arm/mach-mv78xx0/buffalo-wxl-setup.c @@ -151,4 +151,5 @@ MACHINE_START(TERASTATION_WXL, "Buffalo Nas WXL")  	.init_early	= mv78xx0_init_early,  	.init_irq	= mv78xx0_init_irq,  	.timer		= &mv78xx0_timer, +	.restart	= mv78xx0_restart,  MACHINE_END diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index 23d3980ef59..5b9632b0116 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c @@ -401,3 +401,19 @@ void __init mv78xx0_init(void)  	feroceon_l2_init(is_l2_writethrough());  #endif  } + +void mv78xx0_restart(char mode, const char *cmd) +{ +	/* +	 * Enable soft reset to assert RSTOUTn. +	 */ +	writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); + +	/* +	 * Assert soft reset. +	 */ +	writel(SOFT_RESET, SYSTEM_SOFT_RESET); + +	while (1) +		; +} diff --git a/arch/arm/mach-mv78xx0/common.h b/arch/arm/mach-mv78xx0/common.h index 632e63d65e7..07d5f8f6be7 100644 --- a/arch/arm/mach-mv78xx0/common.h +++ b/arch/arm/mach-mv78xx0/common.h @@ -46,6 +46,7 @@ void mv78xx0_uart1_init(void);  void mv78xx0_uart2_init(void);  void mv78xx0_uart3_init(void);  void mv78xx0_i2c_init(void); +void mv78xx0_restart(char, const char *);  extern struct sys_timer mv78xx0_timer; diff --git a/arch/arm/mach-mv78xx0/db78x00-bp-setup.c b/arch/arm/mach-mv78xx0/db78x00-bp-setup.c index 50b85ae2da5..4d6d48bf51e 100644 --- a/arch/arm/mach-mv78xx0/db78x00-bp-setup.c +++ b/arch/arm/mach-mv78xx0/db78x00-bp-setup.c @@ -99,4 +99,5 @@ MACHINE_START(DB78X00_BP, "Marvell DB-78x00-BP Development Board")  	.init_early	= mv78xx0_init_early,  	.init_irq	= mv78xx0_init_irq,  	.timer		= &mv78xx0_timer, +	.restart	= mv78xx0_restart,  MACHINE_END diff --git a/arch/arm/mach-mv78xx0/include/mach/system.h b/arch/arm/mach-mv78xx0/include/mach/system.h index 66e7ce4e90b..8c3a5387cec 100644 --- a/arch/arm/mach-mv78xx0/include/mach/system.h +++ b/arch/arm/mach-mv78xx0/include/mach/system.h @@ -9,28 +9,9 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <mach/bridge-regs.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	/* -	 * Enable soft reset to assert RSTOUTn. -	 */ -	writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); - -	/* -	 * Assert soft reset. -	 */ -	writel(SOFT_RESET, SYSTEM_SOFT_RESET); - -	while (1) -		; -} - -  #endif diff --git a/arch/arm/mach-mv78xx0/rd78x00-masa-setup.c b/arch/arm/mach-mv78xx0/rd78x00-masa-setup.c index e85222e5357..9a882706e13 100644 --- a/arch/arm/mach-mv78xx0/rd78x00-masa-setup.c +++ b/arch/arm/mach-mv78xx0/rd78x00-masa-setup.c @@ -84,4 +84,5 @@ MACHINE_START(RD78X00_MASA, "Marvell RD-78x00-MASA Development Board")  	.init_early	= mv78xx0_init_early,  	.init_irq	= mv78xx0_init_irq,  	.timer		= &mv78xx0_timer, +	.restart	= mv78xx0_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/board-cpuimx51.c b/arch/arm/mach-mx5/board-cpuimx51.c index 1fc11034804..944025da833 100644 --- a/arch/arm/mach-mx5/board-cpuimx51.c +++ b/arch/arm/mach-mx5/board-cpuimx51.c @@ -297,4 +297,5 @@ MACHINE_START(EUKREA_CPUIMX51, "Eukrea CPUIMX51 Module")  	.handle_irq = imx51_handle_irq,  	.timer = &mxc_timer,  	.init_machine = eukrea_cpuimx51_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/board-cpuimx51sd.c b/arch/arm/mach-mx5/board-cpuimx51sd.c index 52a11c1898e..9fbe923c8b0 100644 --- a/arch/arm/mach-mx5/board-cpuimx51sd.c +++ b/arch/arm/mach-mx5/board-cpuimx51sd.c @@ -335,4 +335,5 @@ MACHINE_START(EUKREA_CPUIMX51SD, "Eukrea CPUIMX51SD")  	.handle_irq = imx51_handle_irq,  	.timer = &mxc_timer,  	.init_machine = eukrea_cpuimx51sd_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/board-mx50_rdp.c b/arch/arm/mach-mx5/board-mx50_rdp.c index fc3621d90bd..42b66e8d961 100644 --- a/arch/arm/mach-mx5/board-mx50_rdp.c +++ b/arch/arm/mach-mx5/board-mx50_rdp.c @@ -222,4 +222,5 @@ MACHINE_START(MX50_RDP, "Freescale MX50 Reference Design Platform")  	.handle_irq = imx50_handle_irq,  	.timer = &mx50_rdp_timer,  	.init_machine = mx50_rdp_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/board-mx51_3ds.c b/arch/arm/mach-mx5/board-mx51_3ds.c index 05783906db2..83eab4176ca 100644 --- a/arch/arm/mach-mx5/board-mx51_3ds.c +++ b/arch/arm/mach-mx5/board-mx51_3ds.c @@ -175,4 +175,5 @@ MACHINE_START(MX51_3DS, "Freescale MX51 3-Stack Board")  	.handle_irq = imx51_handle_irq,  	.timer = &mx51_3ds_timer,  	.init_machine = mx51_3ds_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/board-mx51_babbage.c b/arch/arm/mach-mx5/board-mx51_babbage.c index 24994bb5214..e4b822e9f71 100644 --- a/arch/arm/mach-mx5/board-mx51_babbage.c +++ b/arch/arm/mach-mx5/board-mx51_babbage.c @@ -426,4 +426,5 @@ MACHINE_START(MX51_BABBAGE, "Freescale MX51 Babbage Board")  	.handle_irq = imx51_handle_irq,  	.timer = &mx51_babbage_timer,  	.init_machine = mx51_babbage_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/board-mx51_efikamx.c b/arch/arm/mach-mx5/board-mx51_efikamx.c index a9e48662cf7..3a5ed2dd885 100644 --- a/arch/arm/mach-mx5/board-mx51_efikamx.c +++ b/arch/arm/mach-mx5/board-mx51_efikamx.c @@ -182,7 +182,7 @@ static const struct gpio_keys_platform_data mx51_efikamx_powerkey_data __initcon  	.nbuttons = ARRAY_SIZE(mx51_efikamx_powerkey),  }; -void mx51_efikamx_reset(void) +static void mx51_efikamx_restart(char mode, const char *cmd)  {  	if (system_rev == 0x11)  		gpio_direction_output(EFIKAMX_RESET1_1, 0); @@ -292,4 +292,5 @@ MACHINE_START(MX51_EFIKAMX, "Genesi EfikaMX nettop")  	.handle_irq = imx51_handle_irq,  	.timer = &mx51_efikamx_timer,  	.init_machine = mx51_efikamx_init, +	.restart = mx51_efikamx_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/board-mx51_efikasb.c b/arch/arm/mach-mx5/board-mx51_efikasb.c index 38c4a3e28d3..ea5f65b0381 100644 --- a/arch/arm/mach-mx5/board-mx51_efikasb.c +++ b/arch/arm/mach-mx5/board-mx51_efikasb.c @@ -287,4 +287,5 @@ MACHINE_START(MX51_EFIKASB, "Genesi Efika Smartbook")  	.handle_irq = imx51_handle_irq,  	.init_machine =  efikasb_board_init,  	.timer = &mx51_efikasb_timer, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/board-mx53_ard.c b/arch/arm/mach-mx5/board-mx53_ard.c index 0d7f0fffb23..5f224f1c3eb 100644 --- a/arch/arm/mach-mx5/board-mx53_ard.c +++ b/arch/arm/mach-mx5/board-mx53_ard.c @@ -257,4 +257,5 @@ MACHINE_START(MX53_ARD, "Freescale MX53 ARD Board")  	.handle_irq = imx53_handle_irq,  	.timer = &mx53_ard_timer,  	.init_machine = mx53_ard_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/board-mx53_evk.c b/arch/arm/mach-mx5/board-mx53_evk.c index 64bbfcea6f3..d6ce137896d 100644 --- a/arch/arm/mach-mx5/board-mx53_evk.c +++ b/arch/arm/mach-mx5/board-mx53_evk.c @@ -175,4 +175,5 @@ MACHINE_START(MX53_EVK, "Freescale MX53 EVK Board")  	.handle_irq = imx53_handle_irq,  	.timer = &mx53_evk_timer,  	.init_machine = mx53_evk_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-mx5/board-mx53_loco.c index 237bdecd933..fd8b524e1c5 100644 --- a/arch/arm/mach-mx5/board-mx53_loco.c +++ b/arch/arm/mach-mx5/board-mx53_loco.c @@ -317,4 +317,5 @@ MACHINE_START(MX53_LOCO, "Freescale MX53 LOCO Board")  	.handle_irq = imx53_handle_irq,  	.timer = &mx53_loco_timer,  	.init_machine = mx53_loco_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/board-mx53_smd.c b/arch/arm/mach-mx5/board-mx53_smd.c index d42132a80e8..22c53c9b18a 100644 --- a/arch/arm/mach-mx5/board-mx53_smd.c +++ b/arch/arm/mach-mx5/board-mx53_smd.c @@ -164,4 +164,5 @@ MACHINE_START(MX53_SMD, "Freescale MX53 SMD Board")  	.handle_irq = imx53_handle_irq,  	.timer = &mx53_smd_timer,  	.init_machine = mx53_smd_board_init, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/imx51-dt.c b/arch/arm/mach-mx5/imx51-dt.c index 596edd967db..e6bad17b908 100644 --- a/arch/arm/mach-mx5/imx51-dt.c +++ b/arch/arm/mach-mx5/imx51-dt.c @@ -115,4 +115,5 @@ DT_MACHINE_START(IMX51_DT, "Freescale i.MX51 (Device Tree Support)")  	.timer		= &imx51_timer,  	.init_machine	= imx51_dt_init,  	.dt_compat	= imx51_dt_board_compat, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mx5/imx53-dt.c b/arch/arm/mach-mx5/imx53-dt.c index 85bfd5ff21b..05ebb3e6867 100644 --- a/arch/arm/mach-mx5/imx53-dt.c +++ b/arch/arm/mach-mx5/imx53-dt.c @@ -125,4 +125,5 @@ DT_MACHINE_START(IMX53_DT, "Freescale i.MX53 (Device Tree Support)")  	.timer		= &imx53_timer,  	.init_machine	= imx53_dt_init,  	.dt_compat	= imx53_dt_board_compat, +	.restart	= mxc_restart,  MACHINE_END diff --git a/arch/arm/mach-mxs/include/mach/common.h b/arch/arm/mach-mxs/include/mach/common.h index 635bb5d9a20..1388485414c 100644 --- a/arch/arm/mach-mxs/include/mach/common.h +++ b/arch/arm/mach-mxs/include/mach/common.h @@ -16,6 +16,7 @@ struct clk;  extern const u32 *mxs_get_ocotp(void);  extern int mxs_reset_block(void __iomem *);  extern void mxs_timer_init(struct clk *, int); +extern void mxs_restart(char, const char *);  extern int mx23_register_gpios(void);  extern int mx23_clocks_init(void); diff --git a/arch/arm/mach-mxs/include/mach/system.h b/arch/arm/mach-mxs/include/mach/system.h index 0e428239b43..e7ad1bb2942 100644 --- a/arch/arm/mach-mxs/include/mach/system.h +++ b/arch/arm/mach-mxs/include/mach/system.h @@ -22,6 +22,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -void arch_reset(char mode, const char *cmd); -  #endif /* __MACH_MXS_SYSTEM_H__ */ diff --git a/arch/arm/mach-mxs/mach-m28evk.c b/arch/arm/mach-mxs/mach-m28evk.c index 6b00577b702..2f2758230ed 100644 --- a/arch/arm/mach-mxs/mach-m28evk.c +++ b/arch/arm/mach-mxs/mach-m28evk.c @@ -363,4 +363,5 @@ MACHINE_START(M28EVK, "DENX M28 EVK")  	.init_irq	= mx28_init_irq,  	.timer		= &m28evk_timer,  	.init_machine	= m28evk_init, +	.restart	= mxs_restart,  MACHINE_END diff --git a/arch/arm/mach-mxs/mach-mx23evk.c b/arch/arm/mach-mxs/mach-mx23evk.c index c325fbe4e4c..5ea1c57d260 100644 --- a/arch/arm/mach-mxs/mach-mx23evk.c +++ b/arch/arm/mach-mxs/mach-mx23evk.c @@ -184,4 +184,5 @@ MACHINE_START(MX23EVK, "Freescale MX23 EVK")  	.init_irq	= mx23_init_irq,  	.timer		= &mx23evk_timer,  	.init_machine	= mx23evk_init, +	.restart	= mxs_restart,  MACHINE_END diff --git a/arch/arm/mach-mxs/mach-mx28evk.c b/arch/arm/mach-mxs/mach-mx28evk.c index 064ec5abaa5..d0cc37fd23a 100644 --- a/arch/arm/mach-mxs/mach-mx28evk.c +++ b/arch/arm/mach-mxs/mach-mx28evk.c @@ -501,4 +501,5 @@ MACHINE_START(MX28EVK, "Freescale MX28 EVK")  	.init_irq	= mx28_init_irq,  	.timer		= &mx28evk_timer,  	.init_machine	= mx28evk_init, +	.restart	= mxs_restart,  MACHINE_END diff --git a/arch/arm/mach-mxs/mach-stmp378x_devb.c b/arch/arm/mach-mxs/mach-stmp378x_devb.c index 6834dea38c0..a626c07b871 100644 --- a/arch/arm/mach-mxs/mach-stmp378x_devb.c +++ b/arch/arm/mach-mxs/mach-stmp378x_devb.c @@ -117,4 +117,5 @@ MACHINE_START(STMP378X, "STMP378X")  	.init_irq	= mx23_init_irq,  	.timer		= &stmp378x_dvb_timer,  	.init_machine	= stmp378x_dvb_init, +	.restart	= mxs_restart,  MACHINE_END diff --git a/arch/arm/mach-mxs/mach-tx28.c b/arch/arm/mach-mxs/mach-tx28.c index 9a1f0e7a338..2c0862e655e 100644 --- a/arch/arm/mach-mxs/mach-tx28.c +++ b/arch/arm/mach-mxs/mach-tx28.c @@ -178,4 +178,5 @@ MACHINE_START(TX28, "Ka-Ro electronics TX28 module")  	.init_irq = mx28_init_irq,  	.timer = &tx28_timer,  	.init_machine = tx28_stk5v3_init, +	.restart	= mxs_restart,  MACHINE_END diff --git a/arch/arm/mach-mxs/system.c b/arch/arm/mach-mxs/system.c index cab88364e7c..b936633b768 100644 --- a/arch/arm/mach-mxs/system.c +++ b/arch/arm/mach-mxs/system.c @@ -42,7 +42,7 @@ static void __iomem *mxs_clkctrl_reset_addr;  /*   * Reset the system. It is called by machine_restart().   */ -void arch_reset(char mode, const char *cmd) +void mxs_restart(char mode, const char *cmd)  {  	/* reset the chip */  	__mxs_setl(MXS_CLKCTRL_RESET_CHIP, mxs_clkctrl_reset_addr); diff --git a/arch/arm/mach-netx/generic.c b/arch/arm/mach-netx/generic.c index 00023b5cf12..59e67979f19 100644 --- a/arch/arm/mach-netx/generic.c +++ b/arch/arm/mach-netx/generic.c @@ -187,3 +187,8 @@ static int __init netx_init(void)  subsys_initcall(netx_init); +void netx_restart(char mode, const char *cmd) +{ +	writel(NETX_SYSTEM_RES_CR_FIRMW_RES_EN | NETX_SYSTEM_RES_CR_FIRMW_RES, +	       NETX_SYSTEM_RES_CR); +} diff --git a/arch/arm/mach-netx/generic.h b/arch/arm/mach-netx/generic.h index ede2d35341c..9b915119b8d 100644 --- a/arch/arm/mach-netx/generic.h +++ b/arch/arm/mach-netx/generic.h @@ -19,6 +19,7 @@  extern void __init netx_map_io(void);  extern void __init netx_init_irq(void); +extern void netx_restart(char, const char *);  struct sys_timer;  extern struct sys_timer netx_timer; diff --git a/arch/arm/mach-netx/include/mach/system.h b/arch/arm/mach-netx/include/mach/system.h index dc7b4bc003c..b38fa36d58c 100644 --- a/arch/arm/mach-netx/include/mach/system.h +++ b/arch/arm/mach-netx/include/mach/system.h @@ -19,20 +19,10 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <linux/io.h> -#include <mach/hardware.h> -#include "netx-regs.h" -  static inline void arch_idle(void)  {  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	writel(NETX_SYSTEM_RES_CR_FIRMW_RES_EN | NETX_SYSTEM_RES_CR_FIRMW_RES, -	       NETX_SYSTEM_RES_CR); -} -  #endif diff --git a/arch/arm/mach-netx/nxdb500.c b/arch/arm/mach-netx/nxdb500.c index ef8cf3574a0..180ea899a48 100644 --- a/arch/arm/mach-netx/nxdb500.c +++ b/arch/arm/mach-netx/nxdb500.c @@ -207,4 +207,5 @@ MACHINE_START(NXDB500, "Hilscher nxdb500")  	.handle_irq	= vic_handle_irq,  	.timer		= &netx_timer,  	.init_machine	= nxdb500_init, +	.restart	= netx_restart,  MACHINE_END diff --git a/arch/arm/mach-netx/nxdkn.c b/arch/arm/mach-netx/nxdkn.c index 588558bdd80..58009e29b20 100644 --- a/arch/arm/mach-netx/nxdkn.c +++ b/arch/arm/mach-netx/nxdkn.c @@ -100,4 +100,5 @@ MACHINE_START(NXDKN, "Hilscher nxdkn")  	.handle_irq	= vic_handle_irq,  	.timer		= &netx_timer,  	.init_machine	= nxdkn_init, +	.restart	= netx_restart,  MACHINE_END diff --git a/arch/arm/mach-netx/nxeb500hmi.c b/arch/arm/mach-netx/nxeb500hmi.c index cfcbb503864..122e99826ef 100644 --- a/arch/arm/mach-netx/nxeb500hmi.c +++ b/arch/arm/mach-netx/nxeb500hmi.c @@ -184,4 +184,5 @@ MACHINE_START(NXEB500HMI, "Hilscher nxeb500hmi")  	.handle_irq	= vic_handle_irq,  	.timer		= &netx_timer,  	.init_machine	= nxeb500hmi_init, +	.restart	= netx_restart,  MACHINE_END diff --git a/arch/arm/mach-nomadik/board-nhk8815.c b/arch/arm/mach-nomadik/board-nhk8815.c index f98259c050e..7c878bf0034 100644 --- a/arch/arm/mach-nomadik/board-nhk8815.c +++ b/arch/arm/mach-nomadik/board-nhk8815.c @@ -35,6 +35,8 @@  #include <mach/nand.h>  #include <mach/fsmc.h> +#include "cpu-8815.h" +  /* Initial value for SRC control register: all timers use MXTAL/8 source */  #define SRC_CR_INIT_MASK	0x00007fff  #define SRC_CR_INIT_VAL		0x2aaa8000 @@ -284,4 +286,5 @@ MACHINE_START(NOMADIK, "NHK8815")  	.handle_irq	= vic_handle_irq,  	.timer		= &nomadik_timer,  	.init_machine	= nhk8815_platform_init, +	.restart	= cpu8815_restart,  MACHINE_END diff --git a/arch/arm/mach-nomadik/cpu-8815.c b/arch/arm/mach-nomadik/cpu-8815.c index dc67717db6f..65df7b4fdd3 100644 --- a/arch/arm/mach-nomadik/cpu-8815.c +++ b/arch/arm/mach-nomadik/cpu-8815.c @@ -21,6 +21,7 @@  #include <linux/device.h>  #include <linux/amba/bus.h>  #include <linux/platform_device.h> +#include <linux/io.h>  #include <plat/gpio-nomadik.h>  #include <mach/hardware.h> @@ -32,6 +33,7 @@  #include <asm/hardware/cache-l2x0.h>  #include "clock.h" +#include "cpu-8815.h"  #define __MEM_4K_RESOURCE(x) \  	.res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM} @@ -164,3 +166,13 @@ void __init cpu8815_init_irq(void)  #endif  	 return;  } + +void cpu8815_restart(char mode, const char *cmd) +{ +	void __iomem *src_rstsr = io_p2v(NOMADIK_SRC_BASE + 0x18); + +	/* FIXME: use egpio when implemented */ + +	/* Write anything to Reset status register */ +	writel(1, src_rstsr); +} diff --git a/arch/arm/mach-nomadik/cpu-8815.h b/arch/arm/mach-nomadik/cpu-8815.h new file mode 100644 index 00000000000..71c21e8a11d --- /dev/null +++ b/arch/arm/mach-nomadik/cpu-8815.h @@ -0,0 +1,4 @@ +extern void cpu8815_map_io(void); +extern void cpu8815_platform_init(void); +extern void cpu8815_init_irq(void); +extern void cpu8815_restart(char, const char *); diff --git a/arch/arm/mach-nomadik/include/mach/setup.h b/arch/arm/mach-nomadik/include/mach/setup.h index b7897edf1f3..bcaeaf41c05 100644 --- a/arch/arm/mach-nomadik/include/mach/setup.h +++ b/arch/arm/mach-nomadik/include/mach/setup.h @@ -12,9 +12,6 @@  #ifdef CONFIG_NOMADIK_8815 -extern void cpu8815_map_io(void); -extern void cpu8815_platform_init(void); -extern void cpu8815_init_irq(void);  extern void nmdk_timer_init(void);  #endif /* NOMADIK_8815 */ diff --git a/arch/arm/mach-nomadik/include/mach/system.h b/arch/arm/mach-nomadik/include/mach/system.h index 7119f688116..25e198b8976 100644 --- a/arch/arm/mach-nomadik/include/mach/system.h +++ b/arch/arm/mach-nomadik/include/mach/system.h @@ -20,9 +20,6 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <linux/io.h> -#include <mach/hardware.h> -  static inline void arch_idle(void)  {  	/* @@ -32,14 +29,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	void __iomem *src_rstsr = io_p2v(NOMADIK_SRC_BASE + 0x18); - -	/* FIXME: use egpio when implemented */ - -	/* Write anything to Reset status register */ -	writel(1, src_rstsr); -} -  #endif diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index af7911963c0..88909cc0b25 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c @@ -386,6 +386,7 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")  	.init_irq	= omap1_init_irq,  	.init_machine	= ams_delta_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END  EXPORT_SYMBOL(ams_delta_latch1_write); diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c index b9c4c0f933e..0b9464b4121 100644 --- a/arch/arm/mach-omap1/board-fsample.c +++ b/arch/arm/mach-omap1/board-fsample.c @@ -390,4 +390,5 @@ MACHINE_START(OMAP_FSAMPLE, "OMAP730 F-Sample")  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_fsample_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index 7f41d7a504a..9a5fe581bc1 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c @@ -89,4 +89,5 @@ MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_generic_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 7933b97698f..00ad6b22d60 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c @@ -456,4 +456,5 @@ MACHINE_START(OMAP_H2, "TI-H2")  	.init_irq	= omap1_init_irq,  	.init_machine	= h2_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 04be2f83ca0..4a7f2514970 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c @@ -444,4 +444,5 @@ MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")  	.init_irq	= omap1_init_irq,  	.init_machine	= h3_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-htcherald.c b/arch/arm/mach-omap1/board-htcherald.c index 46fcfeb1f11..731cc3db7ab 100644 --- a/arch/arm/mach-omap1/board-htcherald.c +++ b/arch/arm/mach-omap1/board-htcherald.c @@ -610,4 +610,5 @@ MACHINE_START(HERALD, "HTC Herald")  	.init_irq       = omap1_init_irq,  	.init_machine   = htcherald_init,  	.timer          = &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index f99d11de153..309369ea697 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c @@ -460,4 +460,5 @@ MACHINE_START(OMAP_INNOVATOR, "TI-Innovator")  	.init_irq	= omap1_init_irq,  	.init_machine	= innovator_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index c64342388ec..f9efc036ba9 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c @@ -259,4 +259,5 @@ MACHINE_START(NOKIA770, "Nokia 770")  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_nokia770_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index a409dfcc5b1..675de06557a 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c @@ -578,4 +578,5 @@ MACHINE_START(OMAP_OSK, "TI-OSK")  	.init_irq	= omap1_init_irq,  	.init_machine	= osk_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index 105292d3948..81fa27f8836 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c @@ -270,4 +270,5 @@ MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_palmte_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-palmtt.c b/arch/arm/mach-omap1/board-palmtt.c index 387a9006358..81cb8217838 100644 --- a/arch/arm/mach-omap1/board-palmtt.c +++ b/arch/arm/mach-omap1/board-palmtt.c @@ -317,4 +317,5 @@ MACHINE_START(OMAP_PALMTT, "OMAP1510 based Palm Tungsten|T")  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_palmtt_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c index df6d15e68aa..e881945ce8e 100644 --- a/arch/arm/mach-omap1/board-palmz71.c +++ b/arch/arm/mach-omap1/board-palmz71.c @@ -334,4 +334,5 @@ MACHINE_START(OMAP_PALMZ71, "OMAP310 based Palm Zire71")  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_palmz71_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index 57ecd7e0983..c000bed7627 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c @@ -352,4 +352,5 @@ MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2")  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_perseus2_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c index 774ae39fd63..7bcd82ab0fd 100644 --- a/arch/arm/mach-omap1/board-sx1.c +++ b/arch/arm/mach-omap1/board-sx1.c @@ -416,4 +416,5 @@ MACHINE_START(SX1, "OMAP310 based Siemens SX1")  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_sx1_init,  	.timer		= &omap1_timer, +	.restart	= omap1_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index 7721c146d8d..f83a502dc93 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c @@ -28,7 +28,6 @@  #include <linux/export.h>  #include <mach/hardware.h> -#include <mach/system.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> @@ -221,7 +220,7 @@ void voiceblue_wdt_ping(void)  	gpio_set_value(0, wdt_gpio_state);  } -static void voiceblue_reset(char mode, const char *cmd) +static void voiceblue_restart(char mode, const char *cmd)  {  	/*  	 * Workaround for 5912/1611b bug mentioned in sprz209d.pdf p. 28 @@ -285,8 +284,6 @@ static void __init voiceblue_init(void)  	 * (it is connected through invertor) */  	omap_writeb(0x00, OMAP_LPG1_LCR);  	omap_writeb(0x00, OMAP_LPG1_PMR);	/* Disable clock */ - -	arch_reset = voiceblue_reset;  }  MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910") @@ -298,4 +295,5 @@ MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910")  	.init_irq	= omap1_init_irq,  	.init_machine	= voiceblue_init,  	.timer		= &omap1_timer, +	.restart	= voiceblue_restart,  MACHINE_END diff --git a/arch/arm/mach-omap1/common.h b/arch/arm/mach-omap1/common.h index 52c4eda97fa..a9a5146dd2d 100644 --- a/arch/arm/mach-omap1/common.h +++ b/arch/arm/mach-omap1/common.h @@ -54,6 +54,7 @@ static inline void omap16xx_map_io(void)  void omap1_init_early(void);  void omap1_init_irq(void); +void omap1_restart(char, const char *);  extern struct sys_timer omap1_timer;  extern bool omap_32k_timer_init(void); diff --git a/arch/arm/mach-omap1/reset.c b/arch/arm/mach-omap1/reset.c index ad951ee6920..91d199b6497 100644 --- a/arch/arm/mach-omap1/reset.c +++ b/arch/arm/mach-omap1/reset.c @@ -5,10 +5,9 @@  #include <linux/io.h>  #include <mach/hardware.h> -#include <mach/system.h>  #include <plat/prcm.h> -void omap1_arch_reset(char mode, const char *cmd) +void omap1_restart(char mode, const char *cmd)  {  	/*  	 * Workaround for 5912/1611b bug mentioned in sprz209d.pdf p. 28 @@ -21,5 +20,3 @@ void omap1_arch_reset(char mode, const char *cmd)  	omap_writew(1, ARM_RSTCT1);  } - -void (*arch_reset)(char, const char *) = omap1_arch_reset; diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index d88143faca5..7370983f809 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c @@ -304,4 +304,5 @@ MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board")  	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= omap_2430sdp_init,  	.timer		= &omap2_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 83126368ed9..9996334cb68 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c @@ -731,4 +731,5 @@ MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap_3430sdp_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-3630sdp.c b/arch/arm/mach-omap2/board-3630sdp.c index 7969dd904bd..6ef350d1ae4 100644 --- a/arch/arm/mach-omap2/board-3630sdp.c +++ b/arch/arm/mach-omap2/board-3630sdp.c @@ -218,4 +218,5 @@ MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap_sdp_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index ef2bbc09428..bad5d5a5ef7 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c @@ -987,4 +987,5 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board")  	.handle_irq	= gic_handle_irq,  	.init_machine	= omap_4430sdp_init,  	.timer		= &omap4_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c index 7e90f93263d..c3851e8de28 100644 --- a/arch/arm/mach-omap2/board-am3517crane.c +++ b/arch/arm/mach-omap2/board-am3517crane.c @@ -101,4 +101,5 @@ MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= am3517_crane_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c index 551cae8d9b8..f5a3a3f1173 100644 --- a/arch/arm/mach-omap2/board-am3517evm.c +++ b/arch/arm/mach-omap2/board-am3517evm.c @@ -494,4 +494,5 @@ MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= am3517_evm_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index 5a66480feed..ac773829941 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c @@ -357,4 +357,5 @@ MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon")  	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= omap_apollon_init,  	.timer		= &omap2_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index 510b6a2ff0f..1545102d1f9 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c @@ -637,6 +637,7 @@ MACHINE_START(CM_T35, "Compulab CM-T35")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= cm_t35_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END  MACHINE_START(CM_T3730, "Compulab CM-T3730") @@ -648,4 +649,5 @@ MACHINE_START(CM_T3730, "Compulab CM-T3730")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine   = cm_t3730_init,  	.timer          = &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index efc5cedb1fb..f36d694d215 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c @@ -302,4 +302,5 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= cm_t3517_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index d81ea7fa75e..e873063f4fd 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c @@ -663,4 +663,5 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= devkit8000_init,  	.timer		= &omap3_secure_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 63b54163b99..f8c5b2cc7c9 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -106,6 +106,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)")  	.init_machine	= omap_generic_init,  	.timer		= &omap2_timer,  	.dt_compat	= omap242x_boards_compat, +	.restart	= omap_prcm_restart,  MACHINE_END  #endif @@ -125,6 +126,7 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)")  	.init_machine	= omap_generic_init,  	.timer		= &omap2_timer,  	.dt_compat	= omap243x_boards_compat, +	.restart	= omap_prcm_restart,  MACHINE_END  #endif @@ -143,6 +145,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")  	.init_machine	= omap3_init,  	.timer		= &omap3_timer,  	.dt_compat	= omap3_boards_compat, +	.restart	= omap_prcm_restart,  MACHINE_END  #endif @@ -161,5 +164,6 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)")  	.init_machine	= omap4_init,  	.timer		= &omap4_timer,  	.dt_compat	= omap4_boards_compat, +	.restart	= omap_prcm_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index ec4018362e8..54af800d143 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c @@ -399,4 +399,5 @@ MACHINE_START(OMAP_H4, "OMAP2420 H4 board")  	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= omap_h4_init,  	.timer		= &omap2_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 5949f6ae3ed..a59ace0ed56 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c @@ -675,6 +675,7 @@ MACHINE_START(IGEP0020, "IGEP v2 board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= igep_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END  MACHINE_START(IGEP0030, "IGEP OMAP3 module") @@ -686,4 +687,5 @@ MACHINE_START(IGEP0030, "IGEP OMAP3 module")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= igep_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index 13bde0e6693..2d2a61f7dcb 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c @@ -437,4 +437,5 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap_ldp_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index bebd3d84365..cef2cf1c0b8 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c @@ -692,6 +692,7 @@ MACHINE_START(NOKIA_N800, "Nokia N800")  	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= n8x0_init_machine,  	.timer		= &omap2_timer, +	.restart	= omap_prcm_restart,  MACHINE_END  MACHINE_START(NOKIA_N810, "Nokia N810") @@ -703,6 +704,7 @@ MACHINE_START(NOKIA_N810, "Nokia N810")  	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= n8x0_init_machine,  	.timer		= &omap2_timer, +	.restart	= omap_prcm_restart,  MACHINE_END  MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") @@ -714,4 +716,5 @@ MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX")  	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= n8x0_init_machine,  	.timer		= &omap2_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index c34f5658828..7ffcd2839e7 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c @@ -562,4 +562,5 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap3_beagle_init,  	.timer		= &omap3_secure_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index f11bc444e7b..003fe34c934 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c @@ -684,4 +684,5 @@ MACHINE_START(OMAP3EVM, "OMAP3 EVM")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap3_evm_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index 5fa6bad9574..4198dd017d8 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c @@ -211,6 +211,7 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap3logic_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END  MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") @@ -221,4 +222,5 @@ MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap3logic_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index ef315c585b7..1644b73017f 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c @@ -609,4 +609,5 @@ MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap3pandora_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index b21d70a2e4a..cb089a46f62 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c @@ -457,4 +457,5 @@ MACHINE_START(SBC3530, "OMAP3 STALKER")  	.handle_irq		= omap3_intc_handle_irq,  	.init_machine		= omap3_stalker_init,  	.timer			= &omap3_secure_timer, +	.restart		= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index 18cd340f9b7..a0b851aafcc 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c @@ -384,4 +384,5 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap3_touchbook_init,  	.timer		= &omap3_secure_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index b6f114436db..8b06c6a60d0 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c @@ -580,4 +580,5 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")  	.handle_irq	= gic_handle_irq,  	.init_machine	= omap4_panda_init,  	.timer		= &omap4_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index 60a61ea759b..52c0cef7716 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c @@ -565,4 +565,5 @@ MACHINE_START(OVERO, "Gumstix Overo")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= overo_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index a79d49e3fe0..8678b386c6a 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c @@ -152,4 +152,5 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= rm680_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index 4e3c0965edf..27f01f051df 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c @@ -130,4 +130,5 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= rx51_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c index 8402b39b284..74713e3993e 100644 --- a/arch/arm/mach-omap2/board-ti8168evm.c +++ b/arch/arm/mach-omap2/board-ti8168evm.c @@ -48,4 +48,5 @@ MACHINE_START(TI8168EVM, "ti8168evm")  	.init_irq	= ti816x_init_irq,  	.timer		= &omap3_timer,  	.init_machine	= ti8168_evm_init, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-zoom.c b/arch/arm/mach-omap2/board-zoom.c index 70e5b54a211..5c20bcc57f2 100644 --- a/arch/arm/mach-omap2/board-zoom.c +++ b/arch/arm/mach-omap2/board-zoom.c @@ -138,6 +138,7 @@ MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap_zoom_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END  MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") @@ -149,4 +150,5 @@ MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board")  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap_zoom_init,  	.timer		= &omap3_timer, +	.restart	= omap_prcm_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 012bac7d56a..cda888a2e63 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h @@ -84,6 +84,7 @@ void omap3_init_early(void);	/* Do not use this one */  void am35xx_init_early(void);  void ti816x_init_early(void);  void omap4430_init_early(void); +void omap_prcm_restart(char, const char *);  /*   * IO bases for various OMAP processors diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index c35e5cea9f8..626acfad719 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c @@ -25,7 +25,6 @@  #include <linux/delay.h>  #include <linux/export.h> -#include <mach/system.h>  #include "common.h"  #include <plat/prcm.h>  #include <plat/irqs.h> @@ -59,7 +58,7 @@ u32 omap_prcm_get_reset_sources(void)  EXPORT_SYMBOL(omap_prcm_get_reset_sources);  /* Resets clock rates and reboots the system. Only called from system.h */ -static void omap_prcm_arch_reset(char mode, const char *cmd) +void omap_prcm_restart(char mode, const char *cmd)  {  	s16 prcm_offs = 0; @@ -110,8 +109,6 @@ static void omap_prcm_arch_reset(char mode, const char *cmd)  	omap2_prm_read_mod_reg(prcm_offs, OMAP2_RM_RSTCTRL); /* OCP barrier */  } -void (*arch_reset)(char, const char *) = omap_prcm_arch_reset; -  /**   * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness   * @reg: physical address of module IDLEST register diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 22ace0bf2f9..41127e80cc1 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c @@ -18,6 +18,7 @@  #include <linux/mbus.h>  #include <linux/mv643xx_i2c.h>  #include <linux/ata_platform.h> +#include <linux/delay.h>  #include <net/dsa.h>  #include <asm/page.h>  #include <asm/setup.h> @@ -304,6 +305,17 @@ void __init orion5x_init(void)  	orion5x_wdt_init();  } +void orion5x_restart(char mode, const char *cmd) +{ +	/* +	 * Enable and issue soft reset +	 */ +	orion5x_setbits(RSTOUTn_MASK, (1 << 2)); +	orion5x_setbits(CPU_SOFT_RESET, 1); +	mdelay(200); +	orion5x_clrbits(CPU_SOFT_RESET, 1); +} +  /*   * Many orion-based systems have buggy bootloader implementations.   * This is a common fixup for bogus memory tags. diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h index 909489f4d23..37ef18de61b 100644 --- a/arch/arm/mach-orion5x/common.h +++ b/arch/arm/mach-orion5x/common.h @@ -39,6 +39,7 @@ void orion5x_spi_init(void);  void orion5x_uart0_init(void);  void orion5x_uart1_init(void);  void orion5x_xor_init(void); +void orion5x_restart(char, const char *);  /*   * PCIe/PCI functions. diff --git a/arch/arm/mach-orion5x/d2net-setup.c b/arch/arm/mach-orion5x/d2net-setup.c index 8c8300951f4..d75dcfa0f01 100644 --- a/arch/arm/mach-orion5x/d2net-setup.c +++ b/arch/arm/mach-orion5x/d2net-setup.c @@ -343,6 +343,7 @@ MACHINE_START(D2NET, "LaCie d2 Network")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END  #endif @@ -355,6 +356,7 @@ MACHINE_START(BIGDISK, "LaCie Big Disk Network")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-orion5x/db88f5281-setup.c b/arch/arm/mach-orion5x/db88f5281-setup.c index 4b79a80d5e1..a104d5a80e1 100644 --- a/arch/arm/mach-orion5x/db88f5281-setup.c +++ b/arch/arm/mach-orion5x/db88f5281-setup.c @@ -364,4 +364,5 @@ MACHINE_START(DB88F5281, "Marvell Orion-2 Development Board")  	.init_early	= orion5x_init_early,  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/dns323-setup.c b/arch/arm/mach-orion5x/dns323-setup.c index 343f60e9639..91b0f478859 100644 --- a/arch/arm/mach-orion5x/dns323-setup.c +++ b/arch/arm/mach-orion5x/dns323-setup.c @@ -736,4 +736,5 @@ MACHINE_START(DNS323, "D-Link DNS-323")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/edmini_v2-setup.c b/arch/arm/mach-orion5x/edmini_v2-setup.c index 70a4e9265f0..355e962137c 100644 --- a/arch/arm/mach-orion5x/edmini_v2-setup.c +++ b/arch/arm/mach-orion5x/edmini_v2-setup.c @@ -258,4 +258,5 @@ MACHINE_START(EDMINI_V2, "LaCie Ethernet Disk mini V2")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/include/mach/system.h b/arch/arm/mach-orion5x/include/mach/system.h index a1d6e46ab03..825a2650cef 100644 --- a/arch/arm/mach-orion5x/include/mach/system.h +++ b/arch/arm/mach-orion5x/include/mach/system.h @@ -11,23 +11,9 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <mach/bridge-regs.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	/* -	 * Enable and issue soft reset -	 */ -	orion5x_setbits(RSTOUTn_MASK, (1 << 2)); -	orion5x_setbits(CPU_SOFT_RESET, 1); -	mdelay(200); -	orion5x_clrbits(CPU_SOFT_RESET, 1); -} - -  #endif diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c index d3cd3f63258..47587b83284 100644 --- a/arch/arm/mach-orion5x/kurobox_pro-setup.c +++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c @@ -386,6 +386,7 @@ MACHINE_START(KUROBOX_PRO, "Buffalo/Revogear Kurobox Pro")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END  #endif @@ -399,5 +400,6 @@ MACHINE_START(LINKSTATION_PRO, "Buffalo Linkstation Pro/Live")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-orion5x/ls-chl-setup.c b/arch/arm/mach-orion5x/ls-chl-setup.c index 9503fff404e..527213169db 100644 --- a/arch/arm/mach-orion5x/ls-chl-setup.c +++ b/arch/arm/mach-orion5x/ls-chl-setup.c @@ -140,7 +140,7 @@ static struct mv_sata_platform_data lschl_sata_data = {  static void lschl_power_off(void)  { -	arm_machine_restart('h', NULL); +	orion5x_restart('h', NULL);  }  /***************************************************************************** @@ -325,4 +325,5 @@ MACHINE_START(LINKSTATION_LSCHL, "Buffalo Linkstation LiveV3 (LS-CHL)")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/ls_hgl-setup.c b/arch/arm/mach-orion5x/ls_hgl-setup.c index ed6d772f4a2..9a8697b97dd 100644 --- a/arch/arm/mach-orion5x/ls_hgl-setup.c +++ b/arch/arm/mach-orion5x/ls_hgl-setup.c @@ -186,7 +186,7 @@ static struct mv_sata_platform_data ls_hgl_sata_data = {  static void ls_hgl_power_off(void)  { -	arm_machine_restart('h', NULL); +	orion5x_restart('h', NULL);  } @@ -272,4 +272,5 @@ MACHINE_START(LINKSTATION_LS_HGL, "Buffalo Linkstation LS-HGL")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/lsmini-setup.c b/arch/arm/mach-orion5x/lsmini-setup.c index 743f7f1db18..09c73659f46 100644 --- a/arch/arm/mach-orion5x/lsmini-setup.c +++ b/arch/arm/mach-orion5x/lsmini-setup.c @@ -186,7 +186,7 @@ static struct mv_sata_platform_data lsmini_sata_data = {  static void lsmini_power_off(void)  { -	arm_machine_restart('h', NULL); +	orion5x_restart('h', NULL);  } @@ -274,5 +274,6 @@ MACHINE_START(LINKSTATION_MINI, "Buffalo Linkstation Mini")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-orion5x/mss2-setup.c b/arch/arm/mach-orion5x/mss2-setup.c index 6020e26b1c7..65faaa34de6 100644 --- a/arch/arm/mach-orion5x/mss2-setup.c +++ b/arch/arm/mach-orion5x/mss2-setup.c @@ -267,5 +267,6 @@ MACHINE_START(MSS2, "Maxtor Shared Storage II")  	.init_early	= orion5x_init_early,  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer, -	.fixup		= tag_fixup_mem32 +	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/mv2120-setup.c b/arch/arm/mach-orion5x/mv2120-setup.c index 201ae367628..c87fde4deec 100644 --- a/arch/arm/mach-orion5x/mv2120-setup.c +++ b/arch/arm/mach-orion5x/mv2120-setup.c @@ -234,5 +234,6 @@ MACHINE_START(MV2120, "HP Media Vault mv2120")  	.init_early	= orion5x_init_early,  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer, -	.fixup		= tag_fixup_mem32 +	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/net2big-setup.c b/arch/arm/mach-orion5x/net2big-setup.c index 6197c79a2ec..0180c393c71 100644 --- a/arch/arm/mach-orion5x/net2big-setup.c +++ b/arch/arm/mach-orion5x/net2big-setup.c @@ -426,5 +426,6 @@ MACHINE_START(NET2BIG, "LaCie 2Big Network")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c b/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c index ebd6767d8e8..292038fc59f 100644 --- a/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c +++ b/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c @@ -175,4 +175,5 @@ MACHINE_START(RD88F5181L_FXO, "Marvell Orion-VoIP FXO Reference Design")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c b/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c index 05db2d336b0..c44eabaabc1 100644 --- a/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c +++ b/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c @@ -187,4 +187,5 @@ MACHINE_START(RD88F5181L_GE, "Marvell Orion-VoIP GE Reference Design")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/rd88f5182-setup.c b/arch/arm/mach-orion5x/rd88f5182-setup.c index e47fa0578ae..96438b6b202 100644 --- a/arch/arm/mach-orion5x/rd88f5182-setup.c +++ b/arch/arm/mach-orion5x/rd88f5182-setup.c @@ -311,4 +311,5 @@ MACHINE_START(RD88F5182, "Marvell Orion-NAS Reference Design")  	.init_early	= orion5x_init_early,  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c index 64317251ec0..2c5fab00d20 100644 --- a/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c +++ b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c @@ -128,4 +128,5 @@ MACHINE_START(RD88F6183AP_GE, "Marvell Orion-1-90 AP GE Reference Design")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/terastation_pro2-setup.c b/arch/arm/mach-orion5x/terastation_pro2-setup.c index 29f1526f7b7..632a861ef82 100644 --- a/arch/arm/mach-orion5x/terastation_pro2-setup.c +++ b/arch/arm/mach-orion5x/terastation_pro2-setup.c @@ -364,4 +364,5 @@ MACHINE_START(TERASTATION_PRO2, "Buffalo Terastation Pro II/Live")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c index fbf66ea8c77..5d640874558 100644 --- a/arch/arm/mach-orion5x/ts209-setup.c +++ b/arch/arm/mach-orion5x/ts209-setup.c @@ -329,4 +329,5 @@ MACHINE_START(TS209, "QNAP TS-109/TS-209")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/ts409-setup.c b/arch/arm/mach-orion5x/ts409-setup.c index 0fbcc14e09d..4e6ff759cd3 100644 --- a/arch/arm/mach-orion5x/ts409-setup.c +++ b/arch/arm/mach-orion5x/ts409-setup.c @@ -318,4 +318,5 @@ MACHINE_START(TS409, "QNAP TS-409")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/ts78xx-setup.c b/arch/arm/mach-orion5x/ts78xx-setup.c index b35e2005a34..c96f37472ed 100644 --- a/arch/arm/mach-orion5x/ts78xx-setup.c +++ b/arch/arm/mach-orion5x/ts78xx-setup.c @@ -627,4 +627,5 @@ MACHINE_START(TS78XX, "Technologic Systems TS-78xx SBC")  	.init_early	= orion5x_init_early,  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/wnr854t-setup.c b/arch/arm/mach-orion5x/wnr854t-setup.c index b8be7d8d0cf..078c03f7cd5 100644 --- a/arch/arm/mach-orion5x/wnr854t-setup.c +++ b/arch/arm/mach-orion5x/wnr854t-setup.c @@ -179,4 +179,5 @@ MACHINE_START(WNR854T, "Netgear WNR854T")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-orion5x/wrt350n-v2-setup.c b/arch/arm/mach-orion5x/wrt350n-v2-setup.c index faf81a03936..46a9778171c 100644 --- a/arch/arm/mach-orion5x/wrt350n-v2-setup.c +++ b/arch/arm/mach-orion5x/wrt350n-v2-setup.c @@ -267,4 +267,5 @@ MACHINE_START(WRT350N_V2, "Linksys WRT350N v2")  	.init_irq	= orion5x_init_irq,  	.timer		= &orion5x_timer,  	.fixup		= tag_fixup_mem32, +	.restart	= orion5x_restart,  MACHINE_END diff --git a/arch/arm/mach-picoxcell/include/mach/system.h b/arch/arm/mach-picoxcell/include/mach/system.h index 67c589b0c1b..1a5d8cb57df 100644 --- a/arch/arm/mach-picoxcell/include/mach/system.h +++ b/arch/arm/mach-picoxcell/include/mach/system.h @@ -23,9 +23,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -static inline void arch_reset(int mode, const char *cmd) -{ -	/* Watchdog reset to go here. */ -} -  #endif /* __ASM_ARCH_SYSTEM_H */ diff --git a/arch/arm/mach-pnx4008/core.c b/arch/arm/mach-pnx4008/core.c index cdb95e726f5..4cfb40b2ec1 100644 --- a/arch/arm/mach-pnx4008/core.c +++ b/arch/arm/mach-pnx4008/core.c @@ -260,6 +260,11 @@ void __init pnx4008_map_io(void)  	iotable_init(pnx4008_io_desc, ARRAY_SIZE(pnx4008_io_desc));  } +static void pnx4008_restart(char mode, const char *cmd) +{ +	soft_restart(0); +} +  extern struct sys_timer pnx4008_timer;  MACHINE_START(PNX4008, "Philips PNX4008") @@ -269,4 +274,5 @@ MACHINE_START(PNX4008, "Philips PNX4008")  	.init_irq 		= pnx4008_init_irq,  	.init_machine 		= pnx4008_init,  	.timer 			= &pnx4008_timer, +	.restart		= pnx4008_restart,  MACHINE_END diff --git a/arch/arm/mach-pnx4008/include/mach/system.h b/arch/arm/mach-pnx4008/include/mach/system.h index 5d6384a6128..60cfe718809 100644 --- a/arch/arm/mach-pnx4008/include/mach/system.h +++ b/arch/arm/mach-pnx4008/include/mach/system.h @@ -21,18 +21,9 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <linux/io.h> -#include <mach/hardware.h> -#include <mach/platform.h> -  static void arch_idle(void)  {  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	soft_restart(0); -} -  #endif diff --git a/arch/arm/mach-prima2/common.h b/arch/arm/mach-prima2/common.h index 83e5d212811..b28a930d4f8 100644 --- a/arch/arm/mach-prima2/common.h +++ b/arch/arm/mach-prima2/common.h @@ -16,6 +16,7 @@ extern struct sys_timer sirfsoc_timer;  extern void __init sirfsoc_of_irq_init(void);  extern void __init sirfsoc_of_clk_init(void); +extern void sirfsoc_restart(char, const char *);  #ifndef CONFIG_DEBUG_LL  static inline void sirfsoc_map_lluart(void)  {} diff --git a/arch/arm/mach-prima2/include/mach/system.h b/arch/arm/mach-prima2/include/mach/system.h index 0dbd257ad16..2c7d2a9d0c9 100644 --- a/arch/arm/mach-prima2/include/mach/system.h +++ b/arch/arm/mach-prima2/include/mach/system.h @@ -9,21 +9,9 @@  #ifndef __MACH_SYSTEM_H__  #define __MACH_SYSTEM_H__ -#include <linux/bitops.h> -#include <mach/hardware.h> - -#define SIRFSOC_SYS_RST_BIT  BIT(31) - -extern void __iomem *sirfsoc_rstc_base; -  static inline void arch_idle(void)  {  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	writel(SIRFSOC_SYS_RST_BIT, sirfsoc_rstc_base); -} -  #endif diff --git a/arch/arm/mach-prima2/prima2.c b/arch/arm/mach-prima2/prima2.c index a12b689a870..02b9c05ff99 100644 --- a/arch/arm/mach-prima2/prima2.c +++ b/arch/arm/mach-prima2/prima2.c @@ -40,4 +40,5 @@ MACHINE_START(PRIMA2_EVB, "prima2cb")  	.dma_zone_size	= SZ_256M,  	.init_machine	= sirfsoc_mach_init,  	.dt_compat      = prima2cb_dt_match, +	.restart	= sirfsoc_restart,  MACHINE_END diff --git a/arch/arm/mach-prima2/rstc.c b/arch/arm/mach-prima2/rstc.c index 492cfa8d261..762adb73ab7 100644 --- a/arch/arm/mach-prima2/rstc.c +++ b/arch/arm/mach-prima2/rstc.c @@ -68,3 +68,10 @@ int sirfsoc_reset_device(struct device *dev)  	return 0;  } + +#define SIRFSOC_SYS_RST_BIT  BIT(31) + +void sirfsoc_restart(char mode, const char *cmd) +{ +	writel(SIRFSOC_SYS_RST_BIT, sirfsoc_rstc_base); +} diff --git a/arch/arm/mach-pxa/balloon3.c b/arch/arm/mach-pxa/balloon3.c index 4b81f59a4cb..82514f5c38f 100644 --- a/arch/arm/mach-pxa/balloon3.c +++ b/arch/arm/mach-pxa/balloon3.c @@ -829,4 +829,5 @@ MACHINE_START(BALLOON3, "Balloon3")  	.timer		= &pxa_timer,  	.init_machine	= balloon3_init,  	.atag_offset	= 0x100, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/capc7117.c b/arch/arm/mach-pxa/capc7117.c index 4efc16d39c7..c2f0be040d2 100644 --- a/arch/arm/mach-pxa/capc7117.c +++ b/arch/arm/mach-pxa/capc7117.c @@ -153,5 +153,6 @@ MACHINE_START(CAPC7117,  	.init_irq = pxa3xx_init_irq,  	.handle_irq = pxa3xx_handle_irq,  	.timer = &pxa_timer, -	.init_machine = capc7117_init +	.init_machine = capc7117_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/cm-x2xx.c b/arch/arm/mach-pxa/cm-x2xx.c index f2e4190080c..ec170a552c2 100644 --- a/arch/arm/mach-pxa/cm-x2xx.c +++ b/arch/arm/mach-pxa/cm-x2xx.c @@ -524,4 +524,5 @@ MACHINE_START(ARMCORE, "Compulab CM-X2XX")  #ifdef CONFIG_PCI  	.dma_zone_size	= SZ_64M,  #endif +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c index e096bba8fd5..7236974da0b 100644 --- a/arch/arm/mach-pxa/cm-x300.c +++ b/arch/arm/mach-pxa/cm-x300.c @@ -858,4 +858,5 @@ MACHINE_START(CM_X300, "CM-X300 module")  	.timer		= &pxa_timer,  	.init_machine	= cm_x300_init,  	.fixup		= cm_x300_fixup, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/colibri-pxa270.c b/arch/arm/mach-pxa/colibri-pxa270.c index 05bfa1b1c00..6a685165c9f 100644 --- a/arch/arm/mach-pxa/colibri-pxa270.c +++ b/arch/arm/mach-pxa/colibri-pxa270.c @@ -313,6 +313,7 @@ MACHINE_START(COLIBRI, "Toradex Colibri PXA270")  	.init_irq	= pxa27x_init_irq,  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END  MACHINE_START(INCOME, "Income s.r.o. SH-Dmaster PXA270 SBC") @@ -322,5 +323,6 @@ MACHINE_START(INCOME, "Income s.r.o. SH-Dmaster PXA270 SBC")  	.init_irq	= pxa27x_init_irq,  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/colibri-pxa300.c b/arch/arm/mach-pxa/colibri-pxa300.c index c825e8bf2db..c01059a61f3 100644 --- a/arch/arm/mach-pxa/colibri-pxa300.c +++ b/arch/arm/mach-pxa/colibri-pxa300.c @@ -189,5 +189,6 @@ MACHINE_START(COLIBRI300, "Toradex Colibri PXA300")  	.init_irq	= pxa3xx_init_irq,  	.handle_irq	= pxa3xx_handle_irq,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/colibri-pxa320.c b/arch/arm/mach-pxa/colibri-pxa320.c index d23b92b8048..5028f2300d5 100644 --- a/arch/arm/mach-pxa/colibri-pxa320.c +++ b/arch/arm/mach-pxa/colibri-pxa320.c @@ -259,5 +259,6 @@ MACHINE_START(COLIBRI320, "Toradex Colibri PXA320")  	.init_irq	= pxa3xx_init_irq,  	.handle_irq	= pxa3xx_handle_irq,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c index 549468d088b..9d4dc5970b9 100644 --- a/arch/arm/mach-pxa/corgi.c +++ b/arch/arm/mach-pxa/corgi.c @@ -655,7 +655,7 @@ static void corgi_poweroff(void)  		/* Green LED off tells the bootloader to halt */  		gpio_set_value(CORGI_GPIO_LED_GREEN, 0); -	arm_machine_restart('h', NULL); +	pxa_restart('h', NULL);  }  static void corgi_restart(char mode, const char *cmd) @@ -664,13 +664,12 @@ static void corgi_restart(char mode, const char *cmd)  		/* Green LED on tells the bootloader to reboot */  		gpio_set_value(CORGI_GPIO_LED_GREEN, 1); -	arm_machine_restart('h', cmd); +	pxa_restart('h', cmd);  }  static void __init corgi_init(void)  {  	pm_power_off = corgi_poweroff; -	arm_pm_restart = corgi_restart;  	/* Stop 3.6MHz and drive HIGH to PCMCIA and CS */  	PCFR |= PCFR_OPDE; @@ -726,6 +725,7 @@ MACHINE_START(CORGI, "SHARP Corgi")  	.handle_irq	= pxa25x_handle_irq,  	.init_machine	= corgi_init,  	.timer		= &pxa_timer, +	.restart	= corgi_restart,  MACHINE_END  #endif @@ -737,6 +737,7 @@ MACHINE_START(SHEPHERD, "SHARP Shepherd")  	.handle_irq	= pxa25x_handle_irq,  	.init_machine	= corgi_init,  	.timer		= &pxa_timer, +	.restart	= corgi_restart,  MACHINE_END  #endif @@ -748,6 +749,7 @@ MACHINE_START(HUSKY, "SHARP Husky")  	.handle_irq	= pxa25x_handle_irq,  	.init_machine	= corgi_init,  	.timer		= &pxa_timer, +	.restart	= corgi_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-pxa/csb726.c b/arch/arm/mach-pxa/csb726.c index 5e2cf39e9e4..fb5a51d834e 100644 --- a/arch/arm/mach-pxa/csb726.c +++ b/arch/arm/mach-pxa/csb726.c @@ -278,4 +278,5 @@ MACHINE_START(CSB726, "Cogent CSB726")  	.handle_irq       = pxa27x_handle_irq,  	.init_machine   = csb726_init,  	.timer          = &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c index 94acc0b01dd..bd396ba67af 100644 --- a/arch/arm/mach-pxa/em-x270.c +++ b/arch/arm/mach-pxa/em-x270.c @@ -1305,6 +1305,7 @@ MACHINE_START(EM_X270, "Compulab EM-X270")  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= em_x270_init, +	.restart	= pxa_restart,  MACHINE_END  MACHINE_START(EXEDA, "Compulab eXeda") @@ -1314,4 +1315,5 @@ MACHINE_START(EXEDA, "Compulab eXeda")  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= em_x270_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/eseries.c b/arch/arm/mach-pxa/eseries.c index d82b7aa3c09..69473db9775 100644 --- a/arch/arm/mach-pxa/eseries.c +++ b/arch/arm/mach-pxa/eseries.c @@ -196,6 +196,7 @@ MACHINE_START(E330, "Toshiba e330")  	.fixup		= eseries_fixup,  	.init_machine	= e330_init,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -246,6 +247,7 @@ MACHINE_START(E350, "Toshiba e350")  	.fixup		= eseries_fixup,  	.init_machine	= e350_init,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -369,6 +371,7 @@ MACHINE_START(E400, "Toshiba e400")  	.fixup		= eseries_fixup,  	.init_machine	= e400_init,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -558,6 +561,7 @@ MACHINE_START(E740, "Toshiba e740")  	.fixup		= eseries_fixup,  	.init_machine	= e740_init,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -750,6 +754,7 @@ MACHINE_START(E750, "Toshiba e750")  	.fixup		= eseries_fixup,  	.init_machine	= e750_init,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -955,5 +960,6 @@ MACHINE_START(E800, "Toshiba e800")  	.fixup		= eseries_fixup,  	.init_machine	= e800_init,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c index 8308eee5a92..15ab2533667 100644 --- a/arch/arm/mach-pxa/ezx.c +++ b/arch/arm/mach-pxa/ezx.c @@ -804,6 +804,7 @@ MACHINE_START(EZX_A780, "Motorola EZX A780")  	.handle_irq       = pxa27x_handle_irq,  	.timer          = &pxa_timer,  	.init_machine   = a780_init, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -870,6 +871,7 @@ MACHINE_START(EZX_E680, "Motorola EZX E680")  	.handle_irq       = pxa27x_handle_irq,  	.timer          = &pxa_timer,  	.init_machine   = e680_init, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -936,6 +938,7 @@ MACHINE_START(EZX_A1200, "Motorola EZX A1200")  	.handle_irq       = pxa27x_handle_irq,  	.timer          = &pxa_timer,  	.init_machine   = a1200_init, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -1127,6 +1130,7 @@ MACHINE_START(EZX_A910, "Motorola EZX A910")  	.handle_irq       = pxa27x_handle_irq,  	.timer          = &pxa_timer,  	.init_machine   = a910_init, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -1193,6 +1197,7 @@ MACHINE_START(EZX_E6, "Motorola EZX E6")  	.handle_irq       = pxa27x_handle_irq,  	.timer          = &pxa_timer,  	.init_machine   = e6_init, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -1233,5 +1238,6 @@ MACHINE_START(EZX_E2, "Motorola EZX E2")  	.handle_irq       = pxa27x_handle_irq,  	.timer          = &pxa_timer,  	.init_machine   = e2_init, +	.restart	= pxa_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-pxa/generic.h b/arch/arm/mach-pxa/generic.h index 92a2e85ab02..0d729e6619d 100644 --- a/arch/arm/mach-pxa/generic.h +++ b/arch/arm/mach-pxa/generic.h @@ -57,3 +57,5 @@ void __init pxa_set_ffuart_info(void *info);  void __init pxa_set_btuart_info(void *info);  void __init pxa_set_stuart_info(void *info);  void __init pxa_set_hwuart_info(void *info); + +void pxa_restart(char, const char *); diff --git a/arch/arm/mach-pxa/gumstix.c b/arch/arm/mach-pxa/gumstix.c index ffdd70dad32..ac3b1cef475 100644 --- a/arch/arm/mach-pxa/gumstix.c +++ b/arch/arm/mach-pxa/gumstix.c @@ -239,4 +239,5 @@ MACHINE_START(GUMSTIX, "Gumstix")  	.handle_irq	= pxa25x_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= gumstix_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/h5000.c b/arch/arm/mach-pxa/h5000.c index 4b5e110640b..fde6b4c873c 100644 --- a/arch/arm/mach-pxa/h5000.c +++ b/arch/arm/mach-pxa/h5000.c @@ -209,4 +209,5 @@ MACHINE_START(H5400, "HP iPAQ H5000")  	.handle_irq = pxa25x_handle_irq,  	.timer = &pxa_timer,  	.init_machine = h5000_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/himalaya.c b/arch/arm/mach-pxa/himalaya.c index f2c32457084..26d069a9f90 100644 --- a/arch/arm/mach-pxa/himalaya.c +++ b/arch/arm/mach-pxa/himalaya.c @@ -164,4 +164,5 @@ MACHINE_START(HIMALAYA, "HTC Himalaya")  	.handle_irq = pxa25x_handle_irq,  	.init_machine = himalaya_init,  	.timer = &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c index 6f6368ece9b..ce16bdae96d 100644 --- a/arch/arm/mach-pxa/hx4700.c +++ b/arch/arm/mach-pxa/hx4700.c @@ -845,4 +845,5 @@ MACHINE_START(H4700, "HP iPAQ HX4700")  	.handle_irq     = pxa27x_handle_irq,  	.init_machine = hx4700_init,  	.timer        = &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/icontrol.c b/arch/arm/mach-pxa/icontrol.c index f78d5db758d..e239b82c99d 100644 --- a/arch/arm/mach-pxa/icontrol.c +++ b/arch/arm/mach-pxa/icontrol.c @@ -196,5 +196,6 @@ MACHINE_START(ICONTROL, "iControl/SafeTcam boards using Embedian MXM-8x10 CoM")  	.init_irq	= pxa3xx_init_irq,  	.handle_irq	= pxa3xx_handle_irq,  	.timer		= &pxa_timer, -	.init_machine	= icontrol_init +	.init_machine	= icontrol_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/idp.c b/arch/arm/mach-pxa/idp.c index ddf20e5c376..fbabd84e110 100644 --- a/arch/arm/mach-pxa/idp.c +++ b/arch/arm/mach-pxa/idp.c @@ -199,4 +199,5 @@ MACHINE_START(PXA_IDP, "Vibren PXA255 IDP")  	.handle_irq	= pxa25x_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= idp_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/include/mach/system.h b/arch/arm/mach-pxa/include/mach/system.h index d1fce8b6d10..c5afacd3cc0 100644 --- a/arch/arm/mach-pxa/include/mach/system.h +++ b/arch/arm/mach-pxa/include/mach/system.h @@ -9,15 +9,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - -#include <asm/proc-fns.h> -#include "hardware.h" -#include "pxa2xx-regs.h" -  static inline void arch_idle(void)  {  	cpu_do_idle();  } - - -void arch_reset(char mode, const char *cmd); diff --git a/arch/arm/mach-pxa/littleton.c b/arch/arm/mach-pxa/littleton.c index 7b324ec6449..c337c7eed51 100644 --- a/arch/arm/mach-pxa/littleton.c +++ b/arch/arm/mach-pxa/littleton.c @@ -445,4 +445,5 @@ MACHINE_START(LITTLETON, "Marvell Form Factor Development Platform (aka Littleto  	.handle_irq	= pxa3xx_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= littleton_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/lpd270.c b/arch/arm/mach-pxa/lpd270.c index 1dd530279e0..6119c015f39 100644 --- a/arch/arm/mach-pxa/lpd270.c +++ b/arch/arm/mach-pxa/lpd270.c @@ -505,4 +505,5 @@ MACHINE_START(LOGICPD_PXA270, "LogicPD PXA270 Card Engine")  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= lpd270_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c index c48ce6da918..4b7a5287165 100644 --- a/arch/arm/mach-pxa/lubbock.c +++ b/arch/arm/mach-pxa/lubbock.c @@ -556,4 +556,5 @@ MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform (aka Lubbock)")  	.handle_irq	= pxa25x_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= lubbock_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c index 4b796c37af3..4e6774fff42 100644 --- a/arch/arm/mach-pxa/magician.c +++ b/arch/arm/mach-pxa/magician.c @@ -760,4 +760,5 @@ MACHINE_START(MAGICIAN, "HTC Magician")  	.handle_irq = pxa27x_handle_irq,  	.init_machine = magician_init,  	.timer = &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c index 0567d3965fd..ca14555d5e1 100644 --- a/arch/arm/mach-pxa/mainstone.c +++ b/arch/arm/mach-pxa/mainstone.c @@ -622,4 +622,5 @@ MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= mainstone_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c index 4f47a760398..924a3b5f8da 100644 --- a/arch/arm/mach-pxa/mioa701.c +++ b/arch/arm/mach-pxa/mioa701.c @@ -696,13 +696,13 @@ static void mioa701_machine_exit(void);  static void mioa701_poweroff(void)  {  	mioa701_machine_exit(); -	arm_machine_restart('s', NULL); +	pxa_restart('s', NULL);  }  static void mioa701_restart(char c, const char *cmd)  {  	mioa701_machine_exit(); -	arm_machine_restart('s', cmd); +	pxa_restart('s', cmd);  }  static struct gpio global_gpios[] = { @@ -734,7 +734,6 @@ static void __init mioa701_machine_init(void)  	pxa_set_udc_info(&mioa701_udc_info);  	pxa_set_ac97_info(&mioa701_ac97_info);  	pm_power_off = mioa701_poweroff; -	arm_pm_restart = mioa701_restart;  	platform_add_devices(devices, ARRAY_SIZE(devices));  	gsm_init(); @@ -758,4 +757,5 @@ MACHINE_START(MIOA701, "MIO A701")  	.handle_irq	= &pxa27x_handle_irq,  	.init_machine	= mioa701_machine_init,  	.timer		= &pxa_timer, +	.restart	= mioa701_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/mp900.c b/arch/arm/mach-pxa/mp900.c index 4af5d513c38..169bf8f97af 100644 --- a/arch/arm/mach-pxa/mp900.c +++ b/arch/arm/mach-pxa/mp900.c @@ -98,5 +98,6 @@ MACHINE_START(NEC_MP900, "MobilePro900/C")  	.init_irq	= pxa25x_init_irq,  	.handle_irq	= pxa25x_handle_irq,  	.init_machine	= mp900c_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/palmld.c b/arch/arm/mach-pxa/palmld.c index 3d4a2819cae..1fa80f4f80c 100644 --- a/arch/arm/mach-pxa/palmld.c +++ b/arch/arm/mach-pxa/palmld.c @@ -347,5 +347,6 @@ MACHINE_START(PALMLD, "Palm LifeDrive")  	.init_irq	= pxa27x_init_irq,  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer, -	.init_machine	= palmld_init +	.init_machine	= palmld_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/palmt5.c b/arch/arm/mach-pxa/palmt5.c index 99d6bcf1f97..5ba14316bd9 100644 --- a/arch/arm/mach-pxa/palmt5.c +++ b/arch/arm/mach-pxa/palmt5.c @@ -208,5 +208,6 @@ MACHINE_START(PALMT5, "Palm Tungsten|T5")  	.init_irq	= pxa27x_init_irq,  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer, -	.init_machine	= palmt5_init +	.init_machine	= palmt5_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/palmtc.c b/arch/arm/mach-pxa/palmtc.c index 2c24c67fd92..29b51b40f09 100644 --- a/arch/arm/mach-pxa/palmtc.c +++ b/arch/arm/mach-pxa/palmtc.c @@ -542,5 +542,6 @@ MACHINE_START(PALMTC, "Palm Tungsten|C")  	.init_irq	= pxa25x_init_irq,  	.handle_irq	= pxa25x_handle_irq,  	.timer		= &pxa_timer, -	.init_machine	= palmtc_init +	.init_machine	= palmtc_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/palmte2.c b/arch/arm/mach-pxa/palmte2.c index 9376da06404..5ebf49acb82 100644 --- a/arch/arm/mach-pxa/palmte2.c +++ b/arch/arm/mach-pxa/palmte2.c @@ -361,5 +361,6 @@ MACHINE_START(PALMTE2, "Palm Tungsten|E2")  	.init_irq	= pxa25x_init_irq,  	.handle_irq	= pxa25x_handle_irq,  	.timer		= &pxa_timer, -	.init_machine	= palmte2_init +	.init_machine	= palmte2_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/palmtreo.c b/arch/arm/mach-pxa/palmtreo.c index 94e9708b349..ec8249156c0 100644 --- a/arch/arm/mach-pxa/palmtreo.c +++ b/arch/arm/mach-pxa/palmtreo.c @@ -452,6 +452,7 @@ MACHINE_START(TREO680, "Palm Treo 680")  	.handle_irq       = pxa27x_handle_irq,  	.timer          = &pxa_timer,  	.init_machine   = treo680_init, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -464,5 +465,6 @@ MACHINE_START(CENTRO, "Palm Centro 685")  	.handle_irq       = pxa27x_handle_irq,  	.timer          = &pxa_timer,  	.init_machine	= centro_init, +	.restart	= pxa_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c index 4e3e45927e9..6170d76dfba 100644 --- a/arch/arm/mach-pxa/palmtx.c +++ b/arch/arm/mach-pxa/palmtx.c @@ -369,5 +369,6 @@ MACHINE_START(PALMTX, "Palm T|X")  	.init_irq	= pxa27x_init_irq,  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer, -	.init_machine	= palmtx_init +	.init_machine	= palmtx_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/palmz72.c b/arch/arm/mach-pxa/palmz72.c index 68e18baf8e0..b2dff9d415e 100644 --- a/arch/arm/mach-pxa/palmz72.c +++ b/arch/arm/mach-pxa/palmz72.c @@ -404,5 +404,6 @@ MACHINE_START(PALMZ72, "Palm Zire72")  	.init_irq	= pxa27x_init_irq,  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer, -	.init_machine	= palmz72_init +	.init_machine	= palmz72_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/pcm027.c b/arch/arm/mach-pxa/pcm027.c index 0b825a35353..fe9054435b6 100644 --- a/arch/arm/mach-pxa/pcm027.c +++ b/arch/arm/mach-pxa/pcm027.c @@ -265,4 +265,5 @@ MACHINE_START(PCM027, "Phytec Messtechnik GmbH phyCORE-PXA270")  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= pcm027_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c index afcb48a5792..b260ce872d2 100644 --- a/arch/arm/mach-pxa/poodle.c +++ b/arch/arm/mach-pxa/poodle.c @@ -417,7 +417,7 @@ static struct i2c_board_info __initdata poodle_i2c_devices[] = {  static void poodle_poweroff(void)  { -	arm_machine_restart('h', NULL); +	pxa_restart('h', NULL);  }  static void __init poodle_init(void) @@ -466,4 +466,5 @@ MACHINE_START(POODLE, "SHARP Poodle")  	.handle_irq	= pxa25x_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= poodle_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/raumfeld.c b/arch/arm/mach-pxa/raumfeld.c index f0c05f4d12e..4962b167662 100644 --- a/arch/arm/mach-pxa/raumfeld.c +++ b/arch/arm/mach-pxa/raumfeld.c @@ -1093,6 +1093,7 @@ MACHINE_START(RAUMFELD_RC, "Raumfeld Controller")  	.init_irq	= pxa3xx_init_irq,  	.handle_irq	= pxa3xx_handle_irq,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -1104,6 +1105,7 @@ MACHINE_START(RAUMFELD_CONNECTOR, "Raumfeld Connector")  	.init_irq	= pxa3xx_init_irq,  	.handle_irq	= pxa3xx_handle_irq,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -1115,5 +1117,6 @@ MACHINE_START(RAUMFELD_SPEAKER, "Raumfeld Speaker")  	.init_irq	= pxa3xx_init_irq,  	.handle_irq	= pxa3xx_handle_irq,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c index b8bcda15da8..c8497b00cdf 100644 --- a/arch/arm/mach-pxa/reset.c +++ b/arch/arm/mach-pxa/reset.c @@ -81,8 +81,11 @@ static void do_hw_reset(void)  	OSMR3 = OSCR + 368640;	/* ... in 100 ms */  } -void arch_reset(char mode, const char *cmd) +void pxa_restart(char mode, const char *cmd)  { +	local_irq_disable(); +	local_fiq_disable(); +  	clear_reset_status(RESET_STATUS_ALL);  	switch (mode) { diff --git a/arch/arm/mach-pxa/saar.c b/arch/arm/mach-pxa/saar.c index fc2c1e05af9..878707056e6 100644 --- a/arch/arm/mach-pxa/saar.c +++ b/arch/arm/mach-pxa/saar.c @@ -602,4 +602,5 @@ MACHINE_START(SAAR, "PXA930 Handheld Platform (aka SAAR)")  	.handle_irq       = pxa3xx_handle_irq,  	.timer          = &pxa_timer,  	.init_machine   = saar_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/saarb.c b/arch/arm/mach-pxa/saarb.c index 3e999e308a2..b6dbaca460c 100644 --- a/arch/arm/mach-pxa/saarb.c +++ b/arch/arm/mach-pxa/saarb.c @@ -111,5 +111,6 @@ MACHINE_START(SAARB, "PXA955 Handheld Platform (aka SAARB)")  	.handle_irq	= pxa3xx_handle_irq,  	.timer          = &pxa_timer,  	.init_machine   = saarb_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 2f57d94de72..a7f81a3fd13 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c @@ -926,7 +926,7 @@ static inline void spitz_i2c_init(void) {}   ******************************************************************************/  static void spitz_poweroff(void)  { -	arm_machine_restart('g', NULL); +	pxa_restart('g', NULL);  }  static void spitz_restart(char mode, const char *cmd) @@ -943,7 +943,6 @@ static void __init spitz_init(void)  {  	init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0);  	pm_power_off = spitz_poweroff; -	arm_pm_restart = spitz_restart;  	PMCR = 0x00; @@ -989,6 +988,7 @@ MACHINE_START(SPITZ, "SHARP Spitz")  	.handle_irq	= pxa27x_handle_irq,  	.init_machine	= spitz_init,  	.timer		= &pxa_timer, +	.restart	= spitz_restart,  MACHINE_END  #endif @@ -1001,6 +1001,7 @@ MACHINE_START(BORZOI, "SHARP Borzoi")  	.handle_irq	= pxa27x_handle_irq,  	.init_machine	= spitz_init,  	.timer		= &pxa_timer, +	.restart	= spitz_restart,  MACHINE_END  #endif @@ -1013,5 +1014,6 @@ MACHINE_START(AKITA, "SHARP Akita")  	.handle_irq	= pxa27x_handle_irq,  	.init_machine	= spitz_init,  	.timer		= &pxa_timer, +	.restart	= spitz_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-pxa/stargate2.c b/arch/arm/mach-pxa/stargate2.c index 4c9a48bef56..80d7f23ad0f 100644 --- a/arch/arm/mach-pxa/stargate2.c +++ b/arch/arm/mach-pxa/stargate2.c @@ -1005,6 +1005,7 @@ MACHINE_START(INTELMOTE2, "IMOTE 2")  	.timer		= &pxa_timer,  	.init_machine	= imote2_init,  	.atag_offset	= 0x100, +	.restart	= pxa_restart,  MACHINE_END  #endif @@ -1017,5 +1018,6 @@ MACHINE_START(STARGATE2, "Stargate 2")  	.timer = &pxa_timer,  	.init_machine = stargate2_init,  	.atag_offset = 0x100, +	.restart	= pxa_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-pxa/tavorevb.c b/arch/arm/mach-pxa/tavorevb.c index ad47bb98f30..4fa36a3e383 100644 --- a/arch/arm/mach-pxa/tavorevb.c +++ b/arch/arm/mach-pxa/tavorevb.c @@ -495,4 +495,5 @@ MACHINE_START(TAVOREVB, "PXA930 Evaluation Board (aka TavorEVB)")  	.handle_irq       = pxa3xx_handle_irq,  	.timer          = &pxa_timer,  	.init_machine   = tavorevb_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/tavorevb3.c b/arch/arm/mach-pxa/tavorevb3.c index fd569167302..8a22879f0bb 100644 --- a/arch/arm/mach-pxa/tavorevb3.c +++ b/arch/arm/mach-pxa/tavorevb3.c @@ -132,4 +132,5 @@ MACHINE_START(TAVOREVB3, "PXA950 Evaluation Board (aka TavorEVB3)")  	.handle_irq       = pxa3xx_handle_irq,  	.timer          = &pxa_timer,  	.init_machine   = evb3_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index ef6453041cf..dfe40f8705a 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c @@ -905,7 +905,7 @@ static struct platform_device *devices[] __initdata = {  static void tosa_poweroff(void)  { -	arm_machine_restart('g', NULL); +	pxa_restart('g', NULL);  }  static void tosa_restart(char mode, const char *cmd) @@ -935,7 +935,6 @@ static void __init tosa_init(void)  	init_gpio_reset(TOSA_GPIO_ON_RESET, 0, 0);  	pm_power_off = tosa_poweroff; -	arm_pm_restart = tosa_restart;  	PCFR |= PCFR_OPDE; @@ -978,4 +977,5 @@ MACHINE_START(TOSA, "SHARP Tosa")  	.handle_irq       = pxa25x_handle_irq,  	.init_machine   = tosa_init,  	.timer          = &pxa_timer, +	.restart	= tosa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/trizeps4.c b/arch/arm/mach-pxa/trizeps4.c index 1aaed2b17e1..0f30af617d8 100644 --- a/arch/arm/mach-pxa/trizeps4.c +++ b/arch/arm/mach-pxa/trizeps4.c @@ -561,6 +561,7 @@ MACHINE_START(TRIZEPS4, "Keith und Koep Trizeps IV module")  	.init_irq	= pxa27x_init_irq,  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END  MACHINE_START(TRIZEPS4WL, "Keith und Koep Trizeps IV-WL module") @@ -571,4 +572,5 @@ MACHINE_START(TRIZEPS4WL, "Keith und Koep Trizeps IV-WL module")  	.init_irq	= pxa27x_init_irq,  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/viper.c b/arch/arm/mach-pxa/viper.c index 242ddae332d..afe2b749552 100644 --- a/arch/arm/mach-pxa/viper.c +++ b/arch/arm/mach-pxa/viper.c @@ -998,4 +998,5 @@ MACHINE_START(VIPER, "Arcom/Eurotech VIPER SBC")  	.handle_irq	= pxa25x_handle_irq,  	.timer          = &pxa_timer,  	.init_machine	= viper_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/vpac270.c b/arch/arm/mach-pxa/vpac270.c index ca0c6615028..fed5fb08871 100644 --- a/arch/arm/mach-pxa/vpac270.c +++ b/arch/arm/mach-pxa/vpac270.c @@ -721,5 +721,6 @@ MACHINE_START(VPAC270, "Voipac PXA270")  	.init_irq	= pxa27x_init_irq,  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer, -	.init_machine	= vpac270_init +	.init_machine	= vpac270_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/xcep.c b/arch/arm/mach-pxa/xcep.c index 70e1730ef28..4bbe9a36fe7 100644 --- a/arch/arm/mach-pxa/xcep.c +++ b/arch/arm/mach-pxa/xcep.c @@ -185,5 +185,6 @@ MACHINE_START(XCEP, "Iskratel XCEP")  	.init_irq	= pxa25x_init_irq,  	.handle_irq	= pxa25x_handle_irq,  	.timer		= &pxa_timer, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/z2.c b/arch/arm/mach-pxa/z2.c index ead32c90fec..d75f66ab8c3 100644 --- a/arch/arm/mach-pxa/z2.c +++ b/arch/arm/mach-pxa/z2.c @@ -725,4 +725,5 @@ MACHINE_START(ZIPIT2, "Zipit Z2")  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= z2_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c index 498b83b089f..9db35a7fcfc 100644 --- a/arch/arm/mach-pxa/zeus.c +++ b/arch/arm/mach-pxa/zeus.c @@ -911,5 +911,6 @@ MACHINE_START(ARCOM_ZEUS, "Arcom/Eurotech ZEUS")  	.handle_irq	= pxa27x_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= zeus_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-pxa/zylonite.c b/arch/arm/mach-pxa/zylonite.c index 6c39c332841..7678b1bf790 100644 --- a/arch/arm/mach-pxa/zylonite.c +++ b/arch/arm/mach-pxa/zylonite.c @@ -430,4 +430,5 @@ MACHINE_START(ZYLONITE, "PXA3xx Platform Development Kit (aka Zylonite)")  	.handle_irq	= pxa3xx_handle_irq,  	.timer		= &pxa_timer,  	.init_machine	= zylonite_init, +	.restart	= pxa_restart,  MACHINE_END diff --git a/arch/arm/mach-realview/core.h b/arch/arm/mach-realview/core.h index 47259c89a75..735b57aaf2d 100644 --- a/arch/arm/mach-realview/core.h +++ b/arch/arm/mach-realview/core.h @@ -65,6 +65,5 @@ extern int realview_usb_register(struct resource *res);  extern void realview_init_early(void);  extern void realview_fixup(struct tag *tags, char **from,  			   struct meminfo *meminfo); -extern void (*realview_reset)(char);  #endif diff --git a/arch/arm/mach-realview/include/mach/system.h b/arch/arm/mach-realview/include/mach/system.h index 6657ff23116..471b671159c 100644 --- a/arch/arm/mach-realview/include/mach/system.h +++ b/arch/arm/mach-realview/include/mach/system.h @@ -21,12 +21,6 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <linux/io.h> -#include <mach/hardware.h> -#include <mach/platform.h> - -void (*realview_reset)(char mode); -  static inline void arch_idle(void)  {  	/* @@ -36,15 +30,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	/* -	 * To reset, we hit the on-board reset register -	 * in the system FPGA -	 */ -	if (realview_reset) -		realview_reset(mode); -	dsb(); -} -  #endif diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index 1ca944aea7f..f92a920cf50 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c @@ -415,7 +415,7 @@ static struct sys_timer realview_eb_timer = {  	.init		= realview_eb_timer_init,  }; -static void realview_eb_reset(char mode) +static void realview_eb_restart(char mode, const char *cmd)  {  	void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);  	void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); @@ -427,6 +427,7 @@ static void realview_eb_reset(char mode)  	__raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);  	if (core_tile_eb11mp())  		__raw_writel(0x0008, reset_ctrl); +	dsb();  }  static void __init realview_eb_init(void) @@ -458,7 +459,6 @@ static void __init realview_eb_init(void)  #ifdef CONFIG_LEDS  	leds_event = realview_leds_event;  #endif -	realview_reset = realview_eb_reset;  }  MACHINE_START(REALVIEW_EB, "ARM-RealView EB") @@ -474,4 +474,5 @@ MACHINE_START(REALVIEW_EB, "ARM-RealView EB")  #ifdef CONFIG_ZONE_DMA  	.dma_zone_size	= SZ_256M,  #endif +	.restart	= realview_eb_restart,  MACHINE_END diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c index bd8fec8b20d..8ec37b29e0f 100644 --- a/arch/arm/mach-realview/realview_pb1176.c +++ b/arch/arm/mach-realview/realview_pb1176.c @@ -336,12 +336,13 @@ static struct sys_timer realview_pb1176_timer = {  	.init		= realview_pb1176_timer_init,  }; -static void realview_pb1176_reset(char mode) +static void realview_pb1176_restart(char mode, const char *cmd)  {  	void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);  	void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK);  	__raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);  	__raw_writel(REALVIEW_PB1176_SYS_SOFT_RESET, reset_ctrl); +	dsb();  }  static void realview_pb1176_fixup(struct tag *tags, char **from, @@ -381,7 +382,6 @@ static void __init realview_pb1176_init(void)  #ifdef CONFIG_LEDS  	leds_event = realview_leds_event;  #endif -	realview_reset = realview_pb1176_reset;  }  MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") @@ -397,4 +397,5 @@ MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176")  #ifdef CONFIG_ZONE_DMA  	.dma_zone_size	= SZ_256M,  #endif +	.restart	= realview_pb1176_restart,  MACHINE_END diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index fa73ba81a44..f035fda8b61 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c @@ -315,7 +315,7 @@ static struct sys_timer realview_pb11mp_timer = {  	.init		= realview_pb11mp_timer_init,  }; -static void realview_pb11mp_reset(char mode) +static void realview_pb11mp_restart(char mode, const char *cmd)  {  	void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);  	void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); @@ -327,6 +327,7 @@ static void realview_pb11mp_reset(char mode)  	__raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);  	__raw_writel(0x0000, reset_ctrl);  	__raw_writel(0x0004, reset_ctrl); +	dsb();  }  static void __init realview_pb11mp_init(void) @@ -355,7 +356,6 @@ static void __init realview_pb11mp_init(void)  #ifdef CONFIG_LEDS  	leds_event = realview_leds_event;  #endif -	realview_reset = realview_pb11mp_reset;  }  MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") @@ -371,4 +371,5 @@ MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore")  #ifdef CONFIG_ZONE_DMA  	.dma_zone_size	= SZ_256M,  #endif +	.restart	= realview_pb11mp_restart,  MACHINE_END diff --git a/arch/arm/mach-realview/realview_pba8.c b/arch/arm/mach-realview/realview_pba8.c index 6e5f2b9ddb7..0109c8b440c 100644 --- a/arch/arm/mach-realview/realview_pba8.c +++ b/arch/arm/mach-realview/realview_pba8.c @@ -271,7 +271,7 @@ static struct sys_timer realview_pba8_timer = {  	.init		= realview_pba8_timer_init,  }; -static void realview_pba8_reset(char mode) +static void realview_pba8_restart(char mode, const char *cmd)  {  	void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);  	void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); @@ -283,6 +283,7 @@ static void realview_pba8_reset(char mode)  	__raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);  	__raw_writel(0x0000, reset_ctrl);  	__raw_writel(0x0004, reset_ctrl); +	dsb();  }  static void __init realview_pba8_init(void) @@ -305,7 +306,6 @@ static void __init realview_pba8_init(void)  #ifdef CONFIG_LEDS  	leds_event = realview_leds_event;  #endif -	realview_reset = realview_pba8_reset;  }  MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8") @@ -321,4 +321,5 @@ MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8")  #ifdef CONFIG_ZONE_DMA  	.dma_zone_size	= SZ_256M,  #endif +	.restart	= realview_pba8_restart,  MACHINE_END diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c index 7aabc21af01..0194b3e26dc 100644 --- a/arch/arm/mach-realview/realview_pbx.c +++ b/arch/arm/mach-realview/realview_pbx.c @@ -339,7 +339,7 @@ static void realview_pbx_fixup(struct tag *tags, char **from,  #endif  } -static void realview_pbx_reset(char mode) +static void realview_pbx_restart(char mode, const char *cmd)  {  	void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);  	void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); @@ -351,6 +351,7 @@ static void realview_pbx_reset(char mode)  	__raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);  	__raw_writel(0x00F0, reset_ctrl);  	__raw_writel(0x00F4, reset_ctrl); +	dsb();  }  static void __init realview_pbx_init(void) @@ -388,7 +389,6 @@ static void __init realview_pbx_init(void)  #ifdef CONFIG_LEDS  	leds_event = realview_leds_event;  #endif -	realview_reset = realview_pbx_reset;  }  MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX") @@ -404,4 +404,5 @@ MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX")  #ifdef CONFIG_ZONE_DMA  	.dma_zone_size	= SZ_256M,  #endif +	.restart	= realview_pbx_restart,  MACHINE_END diff --git a/arch/arm/mach-rpc/include/mach/system.h b/arch/arm/mach-rpc/include/mach/system.h index a354f4d092c..359bab94b6a 100644 --- a/arch/arm/mach-rpc/include/mach/system.h +++ b/arch/arm/mach-rpc/include/mach/system.h @@ -7,21 +7,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -#include <linux/io.h> -#include <mach/hardware.h> -#include <asm/hardware/iomd.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } - -static inline void arch_reset(char mode, const char *cmd) -{ -	iomd_writeb(0, IOMD_ROMCR0); - -	/* -	 * Jump into the ROM -	 */ -	soft_restart(0); -} diff --git a/arch/arm/mach-rpc/riscpc.c b/arch/arm/mach-rpc/riscpc.c index 8559598ab76..3d44a59fc0d 100644 --- a/arch/arm/mach-rpc/riscpc.c +++ b/arch/arm/mach-rpc/riscpc.c @@ -24,6 +24,7 @@  #include <asm/elf.h>  #include <asm/mach-types.h>  #include <mach/hardware.h> +#include <asm/hardware/iomd.h>  #include <asm/page.h>  #include <asm/domain.h>  #include <asm/setup.h> @@ -214,6 +215,16 @@ static int __init rpc_init(void)  arch_initcall(rpc_init); +static void rpc_restart(char mode, const char *cmd) +{ +	iomd_writeb(0, IOMD_ROMCR0); + +	/* +	 * Jump into the ROM +	 */ +	soft_restart(0); +} +  extern struct sys_timer ioc_timer;  MACHINE_START(RISCPC, "Acorn-RiscPC") @@ -224,4 +235,5 @@ MACHINE_START(RISCPC, "Acorn-RiscPC")  	.map_io		= rpc_map_io,  	.init_irq	= rpc_init_irq,  	.timer		= &ioc_timer, +	.restart	= rpc_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2410/common.h b/arch/arm/mach-s3c2410/common.h new file mode 100644 index 00000000000..f65dc806296 --- /dev/null +++ b/arch/arm/mach-s3c2410/common.h @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + *		http://www.samsung.com + * + * Common Header for S3C2410 machines + * + * 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. + */ + +#ifndef __ARCH_ARM_MACH_S3C2410_COMMON_H +#define __ARCH_ARM_MACH_S3C2410_COMMON_H + +void s3c2410_restart(char mode, const char *cmd); + +#endif /* __ARCH_ARM_MACH_S3C2410_COMMON_H */ diff --git a/arch/arm/mach-s3c2410/include/mach/reset.h b/arch/arm/mach-s3c2410/include/mach/reset.h deleted file mode 100644 index f8c9387b049..00000000000 --- a/arch/arm/mach-s3c2410/include/mach/reset.h +++ /dev/null @@ -1,22 +0,0 @@ -/* arch/arm/mach-s3c2410/include/mach/reset.h - * - * Copyright (c) 2007 Simtec Electronics - *	Ben Dooks <ben@simtec.co.uk> - *	http://armlinux.simtec.co.uk/ - * - * 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. - * - * S3C2410 CPU reset controls -*/ - -#ifndef __ASM_ARCH_RESET_H -#define __ASM_ARCH_RESET_H __FILE__ - -/* This allows the over-ride of the default reset code -*/ - -extern void (*s3c24xx_reset_hook)(void); - -#endif /* __ASM_ARCH_RESET_H */ diff --git a/arch/arm/mach-s3c2410/include/mach/system-reset.h b/arch/arm/mach-s3c2410/include/mach/system-reset.h deleted file mode 100644 index 913893d4465..00000000000 --- a/arch/arm/mach-s3c2410/include/mach/system-reset.h +++ /dev/null @@ -1,32 +0,0 @@ -/* arch/arm/mach-s3c2410/include/mach/system-reset.h - * - * Copyright (c) 2008 Simtec Electronics - *	Ben Dooks <ben@simtec.co.uk> - * - * S3C2410 - System define for arch_reset() function - * - * 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. -*/ - -#include <mach/hardware.h> -#include <plat/watchdog-reset.h> - -extern void (*s3c24xx_reset_hook)(void); - -static void -arch_reset(char mode, const char *cmd) -{ -	if (mode == 's') { -		soft_restart(0); -	} - -	if (s3c24xx_reset_hook) -		s3c24xx_reset_hook(); - -	arch_wdt_reset(); - -	/* we'll take a jump through zero as a poor second */ -	soft_restart(0); -} diff --git a/arch/arm/mach-s3c2410/include/mach/system.h b/arch/arm/mach-s3c2410/include/mach/system.h index a8cbca6701e..5e215c1a5c8 100644 --- a/arch/arm/mach-s3c2410/include/mach/system.h +++ b/arch/arm/mach-s3c2410/include/mach/system.h @@ -15,12 +15,10 @@  #include <mach/map.h>  #include <mach/idle.h> -#include <mach/reset.h>  #include <mach/regs-clock.h>  void (*s3c24xx_idle)(void); -void (*s3c24xx_reset_hook)(void);  void s3c24xx_default_idle(void)  { @@ -54,5 +52,3 @@ static void arch_idle(void)  	else  		s3c24xx_default_idle();  } - -#include <mach/system-reset.h> diff --git a/arch/arm/mach-s3c2410/mach-amlm5900.c b/arch/arm/mach-s3c2410/mach-amlm5900.c index 79838942b0a..4220cc60de3 100644 --- a/arch/arm/mach-s3c2410/mach-amlm5900.c +++ b/arch/arm/mach-s3c2410/mach-amlm5900.c @@ -63,6 +63,8 @@  #include <linux/mtd/map.h>  #include <linux/mtd/physmap.h> +#include "common.h" +  static struct resource amlm5900_nor_resource = {  		.start = 0x00000000,  		.end   = 0x01000000 - 1, @@ -241,4 +243,5 @@ MACHINE_START(AML_M5900, "AML_M5900")  	.init_irq	= s3c24xx_init_irq,  	.init_machine	= amlm5900_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2410_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c index a20ae1ad406..c6133c6ec18 100644 --- a/arch/arm/mach-s3c2410/mach-bast.c +++ b/arch/arm/mach-s3c2410/mach-bast.c @@ -66,6 +66,7 @@  #include "usb-simtec.h"  #include "nor-simtec.h" +#include "common.h"  #define COPYRIGHT ", Copyright 2004-2008 Simtec Electronics" @@ -662,4 +663,5 @@ MACHINE_START(BAST, "Simtec-BAST")  	.init_irq	= s3c24xx_init_irq,  	.init_machine	= bast_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2410_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2410/mach-h1940.c b/arch/arm/mach-s3c2410/mach-h1940.c index 05a7d16e59f..ad9d865651d 100644 --- a/arch/arm/mach-s3c2410/mach-h1940.c +++ b/arch/arm/mach-s3c2410/mach-h1940.c @@ -70,6 +70,8 @@  #include <sound/uda1380.h> +#include "common.h" +  #define H1940_LATCH		((void __force __iomem *)0xF8000000)  #define H1940_PA_LATCH		S3C2410_CS2 @@ -751,4 +753,5 @@ MACHINE_START(H1940, "IPAQ-H1940")  	.init_irq	= h1940_init_irq,  	.init_machine	= h1940_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2410_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c index 1dc3e323441..383d00ca8f6 100644 --- a/arch/arm/mach-s3c2410/mach-n30.c +++ b/arch/arm/mach-s3c2410/mach-n30.c @@ -51,6 +51,8 @@  #include <plat/s3c2410.h>  #include <plat/udc.h> +#include "common.h" +  static struct map_desc n30_iodesc[] __initdata = {  	/* nothing here yet */  }; @@ -591,6 +593,7 @@ MACHINE_START(N30, "Acer-N30")  	.init_machine	= n30_init,  	.init_irq	= s3c24xx_init_irq,  	.map_io		= n30_map_io, +	.restart	= s3c2410_restart,  MACHINE_END  MACHINE_START(N35, "Acer-N35") @@ -601,4 +604,5 @@ MACHINE_START(N35, "Acer-N35")  	.init_machine	= n30_init,  	.init_irq	= s3c24xx_init_irq,  	.map_io		= n30_map_io, +	.restart	= s3c2410_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2410/mach-otom.c b/arch/arm/mach-s3c2410/mach-otom.c index f03f3fd9cec..5f1e0eeb38a 100644 --- a/arch/arm/mach-s3c2410/mach-otom.c +++ b/arch/arm/mach-s3c2410/mach-otom.c @@ -38,6 +38,8 @@  #include <plat/iic.h>  #include <plat/cpu.h> +#include "common.h" +  static struct map_desc otom11_iodesc[] __initdata = {    /* Device area */  	{ (u32)OTOM_VA_CS8900A_BASE, OTOM_PA_CS8900A_BASE, SZ_16M, MT_DEVICE }, @@ -121,4 +123,5 @@ MACHINE_START(OTOM, "Nex Vision - Otom 1.1")  	.init_machine	= otom11_init,  	.init_irq	= s3c24xx_init_irq,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2410_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2410/mach-qt2410.c b/arch/arm/mach-s3c2410/mach-qt2410.c index 45185215625..58f2c17b9f0 100644 --- a/arch/arm/mach-s3c2410/mach-qt2410.c +++ b/arch/arm/mach-s3c2410/mach-qt2410.c @@ -62,6 +62,8 @@  #include <plat/cpu.h>  #include <plat/pm.h> +#include "common.h" +  static struct map_desc qt2410_iodesc[] __initdata = {  	{ 0xe0000000, __phys_to_pfn(S3C2410_CS3+0x01000000), SZ_1M, MT_DEVICE }  }; @@ -350,6 +352,5 @@ MACHINE_START(QT2410, "QT2410")  	.init_irq	= s3c24xx_init_irq,  	.init_machine	= qt2410_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2410_restart,  MACHINE_END - - diff --git a/arch/arm/mach-s3c2410/mach-smdk2410.c b/arch/arm/mach-s3c2410/mach-smdk2410.c index 99c9dfdb71c..bdc27e77287 100644 --- a/arch/arm/mach-s3c2410/mach-smdk2410.c +++ b/arch/arm/mach-s3c2410/mach-smdk2410.c @@ -54,6 +54,8 @@  #include <plat/common-smdk.h> +#include "common.h" +  static struct map_desc smdk2410_iodesc[] __initdata = {    /* nothing here yet */  }; @@ -116,6 +118,5 @@ MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switc  	.init_irq	= s3c24xx_init_irq,  	.init_machine	= smdk2410_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2410_restart,  MACHINE_END - - diff --git a/arch/arm/mach-s3c2410/mach-tct_hammer.c b/arch/arm/mach-s3c2410/mach-tct_hammer.c index e0d0b6fb280..1114666f0ef 100644 --- a/arch/arm/mach-s3c2410/mach-tct_hammer.c +++ b/arch/arm/mach-s3c2410/mach-tct_hammer.c @@ -54,6 +54,8 @@  #include <linux/mtd/map.h>  #include <linux/mtd/physmap.h> +#include "common.h" +  static struct resource tct_hammer_nor_resource = {  		.start = 0x00000000,  		.end   = 0x01000000 - 1, @@ -151,4 +153,5 @@ MACHINE_START(TCT_HAMMER, "TCT_HAMMER")  	.init_irq	= s3c24xx_init_irq,  	.init_machine	= tct_hammer_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2410_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2410/mach-vr1000.c b/arch/arm/mach-s3c2410/mach-vr1000.c index df47e8e9006..cc7032b5c65 100644 --- a/arch/arm/mach-s3c2410/mach-vr1000.c +++ b/arch/arm/mach-s3c2410/mach-vr1000.c @@ -53,6 +53,7 @@  #include "usb-simtec.h"  #include "nor-simtec.h" +#include "common.h"  /* macros for virtual address mods for the io space entries */  #define VA_C5(item) ((unsigned long)(item) + BAST_VAM_CS5) @@ -405,4 +406,5 @@ MACHINE_START(VR1000, "Thorcom-VR1000")  	.init_machine	= vr1000_init,  	.init_irq	= s3c24xx_init_irq,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2410_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2410/s3c2410.c b/arch/arm/mach-s3c2410/s3c2410.c index 3d7ebc557a7..489c826e92a 100644 --- a/arch/arm/mach-s3c2410/s3c2410.c +++ b/arch/arm/mach-s3c2410/s3c2410.c @@ -42,6 +42,7 @@  #include <plat/clock.h>  #include <plat/pll.h>  #include <plat/pm.h> +#include <plat/watchdog-reset.h>  #include <plat/gpio-core.h>  #include <plat/gpio-cfg.h> @@ -183,3 +184,15 @@ int __init s3c2410a_init(void)  	s3c2410_sysdev.cls = &s3c2410a_sysclass;  	return s3c2410_init();  } + +void s3c2410_restart(char mode, const char *cmd) +{ +	if (mode == 's') { +		soft_restart(0); +	} + +	arch_wdt_reset(); + +	/* we'll take a jump through zero as a poor second */ +	soft_restart(0); +} diff --git a/arch/arm/mach-s3c2412/mach-jive.c b/arch/arm/mach-s3c2412/mach-jive.c index 286ef1738c6..ae73ba34ecc 100644 --- a/arch/arm/mach-s3c2412/mach-jive.c +++ b/arch/arm/mach-s3c2412/mach-jive.c @@ -48,6 +48,7 @@  #include <linux/mtd/nand_ecc.h>  #include <linux/mtd/partitions.h> +#include <plat/s3c2412.h>  #include <plat/gpio-cfg.h>  #include <plat/clock.h>  #include <plat/devs.h> @@ -661,4 +662,5 @@ MACHINE_START(JIVE, "JIVE")  	.map_io		= jive_map_io,  	.init_machine	= jive_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2412_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2412/mach-smdk2413.c b/arch/arm/mach-s3c2412/mach-smdk2413.c index f1eec1b5493..b11451b853d 100644 --- a/arch/arm/mach-s3c2412/mach-smdk2413.c +++ b/arch/arm/mach-s3c2412/mach-smdk2413.c @@ -134,6 +134,7 @@ MACHINE_START(S3C2413, "S3C2413")  	.map_io		= smdk2413_map_io,  	.init_machine	= smdk2413_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2412_restart,  MACHINE_END  MACHINE_START(SMDK2412, "SMDK2412") @@ -145,6 +146,7 @@ MACHINE_START(SMDK2412, "SMDK2412")  	.map_io		= smdk2413_map_io,  	.init_machine	= smdk2413_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2412_restart,  MACHINE_END  MACHINE_START(SMDK2413, "SMDK2413") @@ -156,4 +158,5 @@ MACHINE_START(SMDK2413, "SMDK2413")  	.map_io		= smdk2413_map_io,  	.init_machine	= smdk2413_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2412_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2412/mach-vstms.c b/arch/arm/mach-s3c2412/mach-vstms.c index 1bbb1ef5f4f..94bfaa1fb14 100644 --- a/arch/arm/mach-s3c2412/mach-vstms.c +++ b/arch/arm/mach-s3c2412/mach-vstms.c @@ -162,4 +162,5 @@ MACHINE_START(VSTMS, "VSTMS")  	.init_machine	= vstms_init,  	.map_io		= vstms_map_io,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2412_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2412/s3c2412.c b/arch/arm/mach-s3c2412/s3c2412.c index 57a1e01e4e5..867ce2e269f 100644 --- a/arch/arm/mach-s3c2412/s3c2412.c +++ b/arch/arm/mach-s3c2412/s3c2412.c @@ -32,7 +32,6 @@  #include <asm/proc-fns.h>  #include <asm/irq.h> -#include <mach/reset.h>  #include <mach/idle.h>  #include <plat/cpu-freq.h> @@ -131,8 +130,11 @@ static void s3c2412_idle(void)  	cpu_do_idle();  } -static void s3c2412_hard_reset(void) +void s3c2412_restart(char mode, const char *cmd)  { +	if (mode == 's') +		soft_restart(0); +  	/* errata "Watch-dog/Software Reset Problem" specifies that  	 * this reset must be done with the SYSCLK sourced from  	 * EXTCLK instead of FOUT to avoid a glitch in the reset @@ -164,10 +166,6 @@ void __init s3c2412_map_io(void)  	s3c24xx_idle = s3c2412_idle; -	/* set custom reset hook */ - -	s3c24xx_reset_hook = s3c2412_hard_reset; -  	/* register our io-tables */  	iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc)); diff --git a/arch/arm/mach-s3c2416/mach-smdk2416.c b/arch/arm/mach-s3c2416/mach-smdk2416.c index a9eee531ca7..66b71736609 100644 --- a/arch/arm/mach-s3c2416/mach-smdk2416.c +++ b/arch/arm/mach-s3c2416/mach-smdk2416.c @@ -251,4 +251,5 @@ MACHINE_START(SMDK2416, "SMDK2416")  	.map_io		= smdk2416_map_io,  	.init_machine	= smdk2416_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2416_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2416/s3c2416.c b/arch/arm/mach-s3c2416/s3c2416.c index ee214bc83c8..46062232bbc 100644 --- a/arch/arm/mach-s3c2416/s3c2416.c +++ b/arch/arm/mach-s3c2416/s3c2416.c @@ -44,7 +44,6 @@  #include <asm/proc-fns.h>  #include <asm/irq.h> -#include <mach/reset.h>  #include <mach/idle.h>  #include <mach/regs-s3c2443-clock.h> @@ -76,8 +75,11 @@ static struct sys_device s3c2416_sysdev = {  	.cls		= &s3c2416_sysclass,  }; -static void s3c2416_hard_reset(void) +void s3c2416_restart(char mode, const char *cmd)  { +	if (mode == 's') +		soft_restart(0); +  	__raw_writel(S3C2443_SWRST_RESET, S3C2443_SWRST);  } @@ -85,7 +87,6 @@ int __init s3c2416_init(void)  {  	printk(KERN_INFO "S3C2416: Initializing architecture\n"); -	s3c24xx_reset_hook = s3c2416_hard_reset;  	/* s3c24xx_idle = s3c2416_idle;	*/  	/* change WDT IRQ number */ diff --git a/arch/arm/mach-s3c2440/common.h b/arch/arm/mach-s3c2440/common.h new file mode 100644 index 00000000000..db8a98ac68c --- /dev/null +++ b/arch/arm/mach-s3c2440/common.h @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + *		http://www.samsung.com + * + * Common Header for S3C2440 machines + * + * 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. + */ + +#ifndef __ARCH_ARM_MACH_S3C2440_COMMON_H +#define __ARCH_ARM_MACH_S3C2440_COMMON_H + +void s3c2440_restart(char mode, const char *cmd); + +#endif /* __ARCH_ARM_MACH_S3C2440_COMMON_H */ diff --git a/arch/arm/mach-s3c2440/mach-anubis.c b/arch/arm/mach-s3c2440/mach-anubis.c index 74f92fc3fd0..121ff8d2c88 100644 --- a/arch/arm/mach-s3c2440/mach-anubis.c +++ b/arch/arm/mach-s3c2440/mach-anubis.c @@ -55,6 +55,8 @@  #include <plat/cpu.h>  #include <plat/audio-simtec.h> +#include "common.h" +  #define COPYRIGHT ", Copyright 2005-2009 Simtec Electronics"  static struct map_desc anubis_iodesc[] __initdata = { @@ -503,4 +505,5 @@ MACHINE_START(ANUBIS, "Simtec-Anubis")  	.init_machine	= anubis_init,  	.init_irq	= s3c24xx_init_irq,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2440_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-at2440evb.c b/arch/arm/mach-s3c2440/mach-at2440evb.c index 38887ee0c78..b7e334f07da 100644 --- a/arch/arm/mach-s3c2440/mach-at2440evb.c +++ b/arch/arm/mach-s3c2440/mach-at2440evb.c @@ -49,6 +49,8 @@  #include <plat/cpu.h>  #include <plat/mci.h> +#include "common.h" +  static struct map_desc at2440evb_iodesc[] __initdata = {  	/* Nothing here */  }; @@ -238,4 +240,5 @@ MACHINE_START(AT2440EVB, "AT2440EVB")  	.init_machine	= at2440evb_init,  	.init_irq	= s3c24xx_init_irq,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2440_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c index de1e0ff46ce..5859e609d28 100644 --- a/arch/arm/mach-s3c2440/mach-gta02.c +++ b/arch/arm/mach-s3c2440/mach-gta02.c @@ -90,6 +90,7 @@  #include <plat/iic.h>  #include <plat/ts.h> +#include "common.h"  static struct pcf50633 *gta02_pcf; @@ -600,4 +601,5 @@ MACHINE_START(NEO1973_GTA02, "GTA02")  	.init_irq	= s3c24xx_init_irq,  	.init_machine	= gta02_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2440_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-mini2440.c b/arch/arm/mach-s3c2440/mach-mini2440.c index 91fe0b4c95f..437322ffd88 100644 --- a/arch/arm/mach-s3c2440/mach-mini2440.c +++ b/arch/arm/mach-s3c2440/mach-mini2440.c @@ -60,6 +60,8 @@  #include <sound/s3c24xx_uda134x.h> +#include "common.h" +  #define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)  static struct map_desc mini2440_iodesc[] __initdata = { @@ -681,4 +683,5 @@ MACHINE_START(MINI2440, "MINI2440")  	.init_machine	= mini2440_init,  	.init_irq	= s3c24xx_init_irq,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2440_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-nexcoder.c b/arch/arm/mach-s3c2440/mach-nexcoder.c index 61c0bf14816..40eaf844bc1 100644 --- a/arch/arm/mach-s3c2440/mach-nexcoder.c +++ b/arch/arm/mach-s3c2440/mach-nexcoder.c @@ -47,6 +47,8 @@  #include <plat/devs.h>  #include <plat/cpu.h> +#include "common.h" +  static struct map_desc nexcoder_iodesc[] __initdata = {  	/* nothing here yet */  }; @@ -156,4 +158,5 @@ MACHINE_START(NEXCODER_2440, "NexVision - Nexcoder 2440")  	.init_machine	= nexcoder_init,  	.init_irq	= s3c24xx_init_irq,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2440_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-osiris.c b/arch/arm/mach-s3c2440/mach-osiris.c index dc142ebf8cb..e795715fba3 100644 --- a/arch/arm/mach-s3c2440/mach-osiris.c +++ b/arch/arm/mach-s3c2440/mach-osiris.c @@ -54,6 +54,8 @@  #include <plat/devs.h>  #include <plat/cpu.h> +#include "common.h" +  /* onboard perihperal map */  static struct map_desc osiris_iodesc[] __initdata = { @@ -452,4 +454,5 @@ MACHINE_START(OSIRIS, "Simtec-OSIRIS")  	.init_irq	= s3c24xx_init_irq,  	.init_machine	= osiris_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2440_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-rx1950.c b/arch/arm/mach-s3c2440/mach-rx1950.c index 0d3453bf567..1c50d3e0917 100644 --- a/arch/arm/mach-s3c2440/mach-rx1950.c +++ b/arch/arm/mach-s3c2440/mach-rx1950.c @@ -62,6 +62,8 @@  #include <sound/uda1380.h> +#include "common.h" +  #define LCD_PWM_PERIOD 192960  #define LCD_PWM_DUTY 127353 @@ -832,4 +834,5 @@ MACHINE_START(RX1950, "HP iPAQ RX1950")  	.init_irq = s3c24xx_init_irq,  	.init_machine = rx1950_init_machine,  	.timer = &s3c24xx_timer, +	.restart	= s3c2440_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-rx3715.c b/arch/arm/mach-s3c2440/mach-rx3715.c index e19499c2f90..4d20a016b85 100644 --- a/arch/arm/mach-s3c2440/mach-rx3715.c +++ b/arch/arm/mach-s3c2440/mach-rx3715.c @@ -51,6 +51,8 @@  #include <plat/cpu.h>  #include <plat/pm.h> +#include "common.h" +  static struct map_desc rx3715_iodesc[] __initdata = {  	/* dump ISA space somewhere unused */ @@ -224,4 +226,5 @@ MACHINE_START(RX3715, "IPAQ-RX3715")  	.init_irq	= rx3715_init_irq,  	.init_machine	= rx3715_init_machine,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2440_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-smdk2440.c b/arch/arm/mach-s3c2440/mach-smdk2440.c index 36eeb4197a8..1deb60d12a6 100644 --- a/arch/arm/mach-s3c2440/mach-smdk2440.c +++ b/arch/arm/mach-s3c2440/mach-smdk2440.c @@ -47,6 +47,8 @@  #include <plat/common-smdk.h> +#include "common.h" +  static struct map_desc smdk2440_iodesc[] __initdata = {  	/* ISA IO Space map (memory space selected by A24) */ @@ -181,4 +183,5 @@ MACHINE_START(S3C2440, "SMDK2440")  	.map_io		= smdk2440_map_io,  	.init_machine	= smdk2440_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2440_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/s3c2440.c b/arch/arm/mach-s3c2440/s3c2440.c index 37f8cc6aabd..42d73f1e0ce 100644 --- a/arch/arm/mach-s3c2440/s3c2440.c +++ b/arch/arm/mach-s3c2440/s3c2440.c @@ -35,6 +35,7 @@  #include <plat/cpu.h>  #include <plat/s3c244x.h>  #include <plat/pm.h> +#include <plat/watchdog-reset.h>  #include <plat/gpio-core.h>  #include <plat/gpio-cfg.h> @@ -73,3 +74,15 @@ void __init s3c2440_map_io(void)  	s3c24xx_gpiocfg_default.set_pull = s3c24xx_gpio_setpull_1up;  	s3c24xx_gpiocfg_default.get_pull = s3c24xx_gpio_getpull_1up;  } + +void s3c2440_restart(char mode, const char *cmd) +{ +	if (mode == 's') { +		soft_restart(0); +	} + +	arch_wdt_reset(); + +	/* we'll take a jump through zero as a poor second */ +	soft_restart(0); +} diff --git a/arch/arm/mach-s3c2443/mach-smdk2443.c b/arch/arm/mach-s3c2443/mach-smdk2443.c index bec107e0044..20923695622 100644 --- a/arch/arm/mach-s3c2443/mach-smdk2443.c +++ b/arch/arm/mach-s3c2443/mach-smdk2443.c @@ -145,4 +145,5 @@ MACHINE_START(SMDK2443, "SMDK2443")  	.map_io		= smdk2443_map_io,  	.init_machine	= smdk2443_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c2443_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2443/s3c2443.c b/arch/arm/mach-s3c2443/s3c2443.c index a22b771b0f3..4568ded338d 100644 --- a/arch/arm/mach-s3c2443/s3c2443.c +++ b/arch/arm/mach-s3c2443/s3c2443.c @@ -31,7 +31,6 @@  #include <asm/irq.h>  #include <mach/regs-s3c2443-clock.h> -#include <mach/reset.h>  #include <plat/gpio-core.h>  #include <plat/gpio-cfg.h> @@ -57,8 +56,11 @@ static struct sys_device s3c2443_sysdev = {  	.cls		= &s3c2443_sysclass,  }; -static void s3c2443_hard_reset(void) +void s3c2443_restart(char mode, const char *cmd)  { +	if (mode == 's') +		soft_restart(0); +  	__raw_writel(S3C2443_SWRST_RESET, S3C2443_SWRST);  } @@ -66,8 +68,6 @@ int __init s3c2443_init(void)  {  	printk("S3C2443: Initialising architecture\n"); -	s3c24xx_reset_hook = s3c2443_hard_reset; -  	s3c_nand_setname("s3c2412-nand");  	s3c_fb_setname("s3c2443-fb"); diff --git a/arch/arm/mach-s3c64xx/Makefile b/arch/arm/mach-s3c64xx/Makefile index cfc0b994180..f37016cebbe 100644 --- a/arch/arm/mach-s3c64xx/Makefile +++ b/arch/arm/mach-s3c64xx/Makefile @@ -10,54 +10,49 @@ obj-m				:=  obj-n				:=  obj-				:= -# Core files -obj-y				+= cpu.o -obj-y				+= clock.o +# Core -# Core support for S3C6400 system +obj-y				+= common.o clock.o + +# Core support  obj-$(CONFIG_CPU_S3C6400)	+= s3c6400.o  obj-$(CONFIG_CPU_S3C6410)	+= s3c6410.o -obj-y				+= irq.o -obj-y				+= irq-eint.o +# PM + +obj-$(CONFIG_PM)		+= pm.o irq-pm.o sleep.o  # DMA support  obj-$(CONFIG_S3C64XX_DMA)	+= dma.o -# Device setup +# Device support -obj-$(CONFIG_S3C64XX_SETUP_I2C0) += setup-i2c0.o -obj-$(CONFIG_S3C64XX_SETUP_I2C1) += setup-i2c1.o -obj-$(CONFIG_S3C64XX_SETUP_IDE) += setup-ide.o -obj-$(CONFIG_S3C64XX_SETUP_KEYPAD) += setup-keypad.o -obj-$(CONFIG_S3C64XX_SETUP_SDHCI) += setup-sdhci.o -obj-$(CONFIG_S3C64XX_SETUP_FB_24BPP) += setup-fb-24bpp.o -obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o +obj-y				+= dev-uart.o +obj-y				+= dev-audio.o +obj-$(CONFIG_S3C64XX_DEV_SPI)	+= dev-spi.o -# PM +# Device setup -obj-$(CONFIG_PM)		+= pm.o -obj-$(CONFIG_PM)		+= sleep.o -obj-$(CONFIG_PM)		+= irq-pm.o +obj-$(CONFIG_S3C64XX_SETUP_FB_24BPP)	+= setup-fb-24bpp.o +obj-$(CONFIG_S3C64XX_SETUP_I2C0)	+= setup-i2c0.o +obj-$(CONFIG_S3C64XX_SETUP_I2C1)	+= setup-i2c1.o +obj-$(CONFIG_S3C64XX_SETUP_IDE)		+= setup-ide.o +obj-$(CONFIG_S3C64XX_SETUP_KEYPAD)	+= setup-keypad.o +obj-$(CONFIG_S3C64XX_SETUP_SDHCI)	+= setup-sdhci.o +obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO)	+= setup-sdhci-gpio.o  # Machine support -obj-$(CONFIG_MACH_ANW6410)	+= mach-anw6410.o -obj-$(CONFIG_MACH_SMDK6400)	+= mach-smdk6400.o -obj-$(CONFIG_MACH_SMDK6410)	+= mach-smdk6410.o -obj-$(CONFIG_MACH_REAL6410)     += mach-real6410.o -obj-$(CONFIG_MACH_MINI6410)     += mach-mini6410.o -obj-$(CONFIG_MACH_NCP)		+= mach-ncp.o -obj-$(CONFIG_MACH_HMT)		+= mach-hmt.o -obj-$(CONFIG_MACH_SMARTQ)	+= mach-smartq.o -obj-$(CONFIG_MACH_SMARTQ5)	+= mach-smartq5.o -obj-$(CONFIG_MACH_SMARTQ7)	+= mach-smartq7.o -obj-$(CONFIG_MACH_WLF_CRAGG_6410) += mach-crag6410.o mach-crag6410-module.o - -# device support - -obj-y				+= dev-uart.o -obj-y				+= dev-audio.o -obj-$(CONFIG_S3C64XX_DEV_SPI)	+= dev-spi.o +obj-$(CONFIG_MACH_ANW6410)		+= mach-anw6410.o +obj-$(CONFIG_MACH_HMT)			+= mach-hmt.o +obj-$(CONFIG_MACH_MINI6410)		+= mach-mini6410.o +obj-$(CONFIG_MACH_NCP)			+= mach-ncp.o +obj-$(CONFIG_MACH_REAL6410)		+= mach-real6410.o +obj-$(CONFIG_MACH_SMARTQ)		+= mach-smartq.o +obj-$(CONFIG_MACH_SMARTQ5)		+= mach-smartq5.o +obj-$(CONFIG_MACH_SMARTQ7)		+= mach-smartq7.o +obj-$(CONFIG_MACH_SMDK6400)		+= mach-smdk6400.o +obj-$(CONFIG_MACH_SMDK6410)		+= mach-smdk6410.o +obj-$(CONFIG_MACH_WLF_CRAGG_6410)	+= mach-crag6410.o mach-crag6410-module.o diff --git a/arch/arm/mach-s3c64xx/clock.c b/arch/arm/mach-s3c64xx/clock.c index 39c238d7a3d..625219b9cef 100644 --- a/arch/arm/mach-s3c64xx/clock.c +++ b/arch/arm/mach-s3c64xx/clock.c @@ -705,7 +705,7 @@ static struct clksrc_clk *init_parents[] = {  #define GET_DIV(clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1) -void __init_or_cpufreq s3c6400_setup_clocks(void) +void __init_or_cpufreq s3c64xx_setup_clocks(void)  {  	struct clk *xtal_clk;  	unsigned long xtal; @@ -804,7 +804,7 @@ static struct clk *clks[] __initdata = {   * as ARMCLK as well as the necessary parent clocks.   *   * This call does not setup the clocks, which is left to the - * s3c6400_setup_clocks() call which may be needed by the cpufreq + * s3c64xx_setup_clocks() call which may be needed by the cpufreq   * or resume code to re-set the clocks if the bootloader has changed   * them.   */ diff --git a/arch/arm/mach-s3c64xx/irq-eint.c b/arch/arm/mach-s3c64xx/common.c index 4d203be1f4c..35182ba049d 100644 --- a/arch/arm/mach-s3c64xx/irq-eint.c +++ b/arch/arm/mach-s3c64xx/common.c @@ -1,11 +1,13 @@ -/* arch/arm/plat-s3c64xx/irq-eint.c +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + *		http://www.samsung.com   *   * Copyright 2008 Openmoko, Inc.   * Copyright 2008 Simtec Electronics - *      Ben Dooks <ben@simtec.co.uk> - *      http://armlinux.simtec.co.uk/ + *	Ben Dooks <ben@simtec.co.uk> + *	http://armlinux.simtec.co.uk/   * - * S3C64XX - Interrupt handling for IRQ_EINT(x) + * Common Codes for S3C64XX machines   *   * 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 @@ -13,21 +15,183 @@   */  #include <linux/kernel.h> +#include <linux/init.h> +#include <linux/module.h>  #include <linux/interrupt.h> +#include <linux/ioport.h>  #include <linux/sysdev.h> -#include <linux/gpio.h> -#include <linux/irq.h> +#include <linux/serial_core.h> +#include <linux/platform_device.h>  #include <linux/io.h> +#include <linux/dma-mapping.h> +#include <linux/irq.h> +#include <linux/gpio.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h>  #include <asm/hardware/vic.h> -#include <plat/regs-irqtype.h> +#include <mach/map.h> +#include <mach/hardware.h>  #include <mach/regs-gpio.h> -#include <plat/gpio-cfg.h> -#include <mach/map.h>  #include <plat/cpu.h> +#include <plat/clock.h> +#include <plat/devs.h>  #include <plat/pm.h> +#include <plat/gpio-cfg.h> +#include <plat/irq-uart.h> +#include <plat/irq-vic-timer.h> +#include <plat/regs-irqtype.h> +#include <plat/regs-serial.h> +#include <plat/watchdog-reset.h> + +#include "common.h" + +/* uart registration process */ + +void __init s3c64xx_init_uarts(struct s3c2410_uartcfg *cfg, int no) +{ +	s3c24xx_init_uartdevs("s3c6400-uart", s3c64xx_uart_resources, cfg, no); +} + +/* table of supported CPUs */ + +static const char name_s3c6400[] = "S3C6400"; +static const char name_s3c6410[] = "S3C6410"; + +static struct cpu_table cpu_ids[] __initdata = { +	{ +		.idcode		= S3C6400_CPU_ID, +		.idmask		= S3C64XX_CPU_MASK, +		.map_io		= s3c6400_map_io, +		.init_clocks	= s3c6400_init_clocks, +		.init_uarts	= s3c64xx_init_uarts, +		.init		= s3c6400_init, +		.name		= name_s3c6400, +	}, { +		.idcode		= S3C6410_CPU_ID, +		.idmask		= S3C64XX_CPU_MASK, +		.map_io		= s3c6410_map_io, +		.init_clocks	= s3c6410_init_clocks, +		.init_uarts	= s3c64xx_init_uarts, +		.init		= s3c6410_init, +		.name		= name_s3c6410, +	}, +}; + +/* minimal IO mapping */ + +/* see notes on uart map in arch/arm/mach-s3c64xx/include/mach/debug-macro.S */ +#define UART_OFFS (S3C_PA_UART & 0xfffff) + +static struct map_desc s3c_iodesc[] __initdata = { +	{ +		.virtual	= (unsigned long)S3C_VA_SYS, +		.pfn		= __phys_to_pfn(S3C64XX_PA_SYSCON), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_MEM, +		.pfn		= __phys_to_pfn(S3C64XX_PA_SROM), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)(S3C_VA_UART + UART_OFFS), +		.pfn		= __phys_to_pfn(S3C_PA_UART), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)VA_VIC0, +		.pfn		= __phys_to_pfn(S3C64XX_PA_VIC0), +		.length		= SZ_16K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)VA_VIC1, +		.pfn		= __phys_to_pfn(S3C64XX_PA_VIC1), +		.length		= SZ_16K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_TIMER, +		.pfn		= __phys_to_pfn(S3C_PA_TIMER), +		.length		= SZ_16K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C64XX_VA_GPIO, +		.pfn		= __phys_to_pfn(S3C64XX_PA_GPIO), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C64XX_VA_MODEM, +		.pfn		= __phys_to_pfn(S3C64XX_PA_MODEM), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_WATCHDOG, +		.pfn		= __phys_to_pfn(S3C64XX_PA_WATCHDOG), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_USB_HSPHY, +		.pfn		= __phys_to_pfn(S3C64XX_PA_USB_HSPHY), +		.length		= SZ_1K, +		.type		= MT_DEVICE, +	}, +}; + +struct sysdev_class s3c64xx_sysclass = { +	.name	= "s3c64xx-core", +}; + +static struct sys_device s3c64xx_sysdev = { +	.cls	= &s3c64xx_sysclass, +}; + +/* read cpu identification code */ + +void __init s3c64xx_init_io(struct map_desc *mach_desc, int size) +{ +	/* initialise the io descriptors we need for initialisation */ +	iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc)); +	iotable_init(mach_desc, size); +	init_consistent_dma_size(SZ_8M); + +	/* detect cpu id */ +	s3c64xx_init_cpu(); + +	s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); +} + +static __init int s3c64xx_sysdev_init(void) +{ +	sysdev_class_register(&s3c64xx_sysclass); +	return sysdev_register(&s3c64xx_sysdev); +} +core_initcall(s3c64xx_sysdev_init); + +/* + * setup the sources the vic should advertise resume + * for, even though it is not doing the wake + * (set_irq_wake needs to be valid) + */ +#define IRQ_VIC0_RESUME (1 << (IRQ_RTC_TIC - IRQ_VIC0_BASE)) +#define IRQ_VIC1_RESUME (1 << (IRQ_RTC_ALARM - IRQ_VIC1_BASE) |	\ +			 1 << (IRQ_PENDN - IRQ_VIC1_BASE) |	\ +			 1 << (IRQ_HSMMC0 - IRQ_VIC1_BASE) |	\ +			 1 << (IRQ_HSMMC1 - IRQ_VIC1_BASE) |	\ +			 1 << (IRQ_HSMMC2 - IRQ_VIC1_BASE)) + +void __init s3c64xx_init_irq(u32 vic0_valid, u32 vic1_valid) +{ +	printk(KERN_DEBUG "%s: initialising interrupts\n", __func__); + +	/* initialise the pair of VICs */ +	vic_init(VA_VIC0, IRQ_VIC0_BASE, vic0_valid, IRQ_VIC0_RESUME); +	vic_init(VA_VIC1, IRQ_VIC1_BASE, vic1_valid, IRQ_VIC1_RESUME); + +	/* add the timer sub-irqs */ +	s3c_init_vic_timer_irq(5, IRQ_TIMER0); +}  #define eint_offset(irq)	((irq) - IRQ_EINT(0))  #define eint_irq_to_bit(irq)	((u32)(1 << eint_offset(irq))) @@ -209,5 +373,13 @@ static int __init s3c64xx_init_irq_eint(void)  	return 0;  } -  arch_initcall(s3c64xx_init_irq_eint); + +void s3c64xx_restart(char mode, const char *cmd) +{ +	if (mode != 's') +		arch_wdt_reset(); + +	/* if all else fails, or mode was for soft, jump to 0 */ +	soft_restart(0); +} diff --git a/arch/arm/mach-s3c64xx/common.h b/arch/arm/mach-s3c64xx/common.h new file mode 100644 index 00000000000..8dc8ab6d8d6 --- /dev/null +++ b/arch/arm/mach-s3c64xx/common.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + *		http://www.samsung.com + * + * Copyright 2008 Openmoko, Inc. + * Copyright 2008 Simtec Electronics + *	Ben Dooks <ben@simtec.co.uk> + *	http://armlinux.simtec.co.uk/ + * + * Common Header for S3C64XX machines + * + * 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. + */ + +#ifndef __ARCH_ARM_MACH_S3C64XX_COMMON_H +#define __ARCH_ARM_MACH_S3C64XX_COMMON_H + +void s3c64xx_init_irq(u32 vic0, u32 vic1); +void s3c64xx_init_io(struct map_desc *mach_desc, int size); + +void s3c64xx_register_clocks(unsigned long xtal, unsigned armclk_limit); +void s3c64xx_setup_clocks(void); + +void s3c64xx_restart(char mode, const char *cmd); + +extern struct syscore_ops s3c64xx_irq_syscore_ops; +extern struct sysdev_class s3c64xx_sysclass; + +#ifdef CONFIG_CPU_S3C6400 + +extern  int s3c6400_init(void); +extern void s3c6400_init_irq(void); +extern void s3c6400_map_io(void); +extern void s3c6400_init_clocks(int xtal); + +#else +#define s3c6400_init_clocks NULL +#define s3c6400_map_io NULL +#define s3c6400_init NULL +#endif + +#ifdef CONFIG_CPU_S3C6410 + +extern  int s3c6410_init(void); +extern void s3c6410_init_irq(void); +extern void s3c6410_map_io(void); +extern void s3c6410_init_clocks(int xtal); + +#else +#define s3c6410_init_clocks NULL +#define s3c6410_map_io NULL +#define s3c6410_init NULL +#endif + +#endif /* __ARCH_ARM_MACH_S3C64XX_COMMON_H */ diff --git a/arch/arm/mach-s3c64xx/cpu.c b/arch/arm/mach-s3c64xx/cpu.c deleted file mode 100644 index de085b798aa..00000000000 --- a/arch/arm/mach-s3c64xx/cpu.c +++ /dev/null @@ -1,161 +0,0 @@ -/* linux/arch/arm/plat-s3c64xx/cpu.c - * - * Copyright 2008 Openmoko, Inc. - * Copyright 2008 Simtec Electronics - *	Ben Dooks <ben@simtec.co.uk> - *	http://armlinux.simtec.co.uk/ - * - * S3C64XX CPU Support - * - * 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. -*/ - -#include <linux/init.h> -#include <linux/module.h> -#include <linux/interrupt.h> -#include <linux/ioport.h> -#include <linux/sysdev.h> -#include <linux/serial_core.h> -#include <linux/platform_device.h> -#include <linux/io.h> -#include <linux/dma-mapping.h> - -#include <mach/hardware.h> -#include <mach/map.h> - -#include <asm/mach/arch.h> -#include <asm/mach/map.h> - -#include <plat/regs-serial.h> - -#include <plat/cpu.h> -#include <plat/devs.h> -#include <plat/clock.h> - -#include <plat/s3c6400.h> -#include <plat/s3c6410.h> - -/* table of supported CPUs */ - -static const char name_s3c6400[] = "S3C6400"; -static const char name_s3c6410[] = "S3C6410"; - -static struct cpu_table cpu_ids[] __initdata = { -	{ -		.idcode		= S3C6400_CPU_ID, -		.idmask		= S3C64XX_CPU_MASK, -		.map_io		= s3c6400_map_io, -		.init_clocks	= s3c6400_init_clocks, -		.init_uarts	= s3c6400_init_uarts, -		.init		= s3c6400_init, -		.name		= name_s3c6400, -	}, { -		.idcode		= S3C6410_CPU_ID, -		.idmask		= S3C64XX_CPU_MASK, -		.map_io		= s3c6410_map_io, -		.init_clocks	= s3c6410_init_clocks, -		.init_uarts	= s3c6410_init_uarts, -		.init		= s3c6410_init, -		.name		= name_s3c6410, -	}, -}; - -/* minimal IO mapping */ - -/* see notes on uart map in arch/arm/mach-s3c6400/include/mach/debug-macro.S */ -#define UART_OFFS (S3C_PA_UART & 0xfffff) - -static struct map_desc s3c_iodesc[] __initdata = { -	{ -		.virtual	= (unsigned long)S3C_VA_SYS, -		.pfn		= __phys_to_pfn(S3C64XX_PA_SYSCON), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C_VA_MEM, -		.pfn		= __phys_to_pfn(S3C64XX_PA_SROM), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)(S3C_VA_UART + UART_OFFS), -		.pfn		= __phys_to_pfn(S3C_PA_UART), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)VA_VIC0, -		.pfn		= __phys_to_pfn(S3C64XX_PA_VIC0), -		.length		= SZ_16K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)VA_VIC1, -		.pfn		= __phys_to_pfn(S3C64XX_PA_VIC1), -		.length		= SZ_16K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C_VA_TIMER, -		.pfn		= __phys_to_pfn(S3C_PA_TIMER), -		.length		= SZ_16K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C64XX_VA_GPIO, -		.pfn		= __phys_to_pfn(S3C64XX_PA_GPIO), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C64XX_VA_MODEM, -		.pfn		= __phys_to_pfn(S3C64XX_PA_MODEM), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C_VA_WATCHDOG, -		.pfn		= __phys_to_pfn(S3C64XX_PA_WATCHDOG), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C_VA_USB_HSPHY, -		.pfn		= __phys_to_pfn(S3C64XX_PA_USB_HSPHY), -		.length		= SZ_1K, -		.type		= MT_DEVICE, -	}, -}; - - -struct sysdev_class s3c64xx_sysclass = { -	.name	= "s3c64xx-core", -}; - -static struct sys_device s3c64xx_sysdev = { -	.cls	= &s3c64xx_sysclass, -}; - -/* uart registration process */ - -void __init s3c6400_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) -{ -	s3c24xx_init_uartdevs("s3c6400-uart", s3c64xx_uart_resources, cfg, no); -} - -/* read cpu identification code */ - -void __init s3c64xx_init_io(struct map_desc *mach_desc, int size) -{ -	/* initialise the io descriptors we need for initialisation */ -	iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc)); -	iotable_init(mach_desc, size); -	init_consistent_dma_size(SZ_8M); - -	/* detect cpu id */ -	s3c64xx_init_cpu(); - -	s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); -} - -static __init int s3c64xx_sysdev_init(void) -{ -	sysdev_class_register(&s3c64xx_sysclass); -	return sysdev_register(&s3c64xx_sysdev); -} - -core_initcall(s3c64xx_sysdev_init); diff --git a/arch/arm/mach-s3c64xx/include/mach/system.h b/arch/arm/mach-s3c64xx/include/mach/system.h index d8ca5786ba2..353ed4389ae 100644 --- a/arch/arm/mach-s3c64xx/include/mach/system.h +++ b/arch/arm/mach-s3c64xx/include/mach/system.h @@ -11,20 +11,9 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H __FILE__ -#include <plat/watchdog-reset.h> -  static void arch_idle(void)  {  	/* nothing here yet */  } -static void arch_reset(char mode, const char *cmd) -{ -	if (mode != 's') -		arch_wdt_reset(); - -	/* if all else fails, or mode was for soft, jump to 0 */ -	soft_restart(0); -} -  #endif /* __ASM_ARCH_IRQ_H */ diff --git a/arch/arm/mach-s3c64xx/irq.c b/arch/arm/mach-s3c64xx/irq.c deleted file mode 100644 index b07357e9495..00000000000 --- a/arch/arm/mach-s3c64xx/irq.c +++ /dev/null @@ -1,47 +0,0 @@ -/* arch/arm/plat-s3c64xx/irq.c - * - * Copyright 2008 Openmoko, Inc. - * Copyright 2008 Simtec Electronics - *      Ben Dooks <ben@simtec.co.uk> - *      http://armlinux.simtec.co.uk/ - * - * S3C64XX - Interrupt handling - * - * 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. - */ - -#include <linux/kernel.h> -#include <linux/interrupt.h> -#include <linux/serial_core.h> -#include <linux/irq.h> -#include <linux/io.h> - -#include <asm/hardware/vic.h> - -#include <mach/map.h> -#include <plat/irq-vic-timer.h> -#include <plat/irq-uart.h> -#include <plat/cpu.h> - -/* setup the sources the vic should advertise resume for, even though it - * is not doing the wake (set_irq_wake needs to be valid) */ -#define IRQ_VIC0_RESUME (1 << (IRQ_RTC_TIC - IRQ_VIC0_BASE)) -#define IRQ_VIC1_RESUME (1 << (IRQ_RTC_ALARM - IRQ_VIC1_BASE) |	\ -			 1 << (IRQ_PENDN - IRQ_VIC1_BASE) |	\ -			 1 << (IRQ_HSMMC0 - IRQ_VIC1_BASE) |	\ -			 1 << (IRQ_HSMMC1 - IRQ_VIC1_BASE) |	\ -			 1 << (IRQ_HSMMC2 - IRQ_VIC1_BASE)) - -void __init s3c64xx_init_irq(u32 vic0_valid, u32 vic1_valid) -{ -	printk(KERN_DEBUG "%s: initialising interrupts\n", __func__); - -	/* initialise the pair of VICs */ -	vic_init(VA_VIC0, IRQ_VIC0_BASE, vic0_valid, IRQ_VIC0_RESUME); -	vic_init(VA_VIC1, IRQ_VIC1_BASE, vic1_valid, IRQ_VIC1_RESUME); - -	/* add the timer sub-irqs */ -	s3c_init_vic_timer_irq(5, IRQ_TIMER0); -} diff --git a/arch/arm/mach-s3c64xx/mach-anw6410.c b/arch/arm/mach-s3c64xx/mach-anw6410.c index 2bbc14d9342..b86f2779e4e 100644 --- a/arch/arm/mach-s3c64xx/mach-anw6410.c +++ b/arch/arm/mach-s3c64xx/mach-anw6410.c @@ -46,13 +46,14 @@  #include <plat/fb.h>  #include <plat/regs-fb-v4.h> -#include <plat/s3c6410.h>  #include <plat/clock.h>  #include <plat/devs.h>  #include <plat/cpu.h>  #include <mach/regs-gpio.h>  #include <mach/regs-modem.h> +#include "common.h" +  /* DM9000 */  #define ANW6410_PA_DM9000	(0x18000000) @@ -241,4 +242,5 @@ MACHINE_START(ANW6410, "A&W6410")  	.map_io		= anw6410_map_io,  	.init_machine	= anw6410_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c64xx_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index 988ac2e48f0..f1c848aa4a1 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c @@ -51,7 +51,6 @@  #include <mach/regs-gpio-memport.h> -#include <plat/s3c6410.h>  #include <plat/regs-serial.h>  #include <plat/regs-fb-v4.h>  #include <plat/fb.h> @@ -67,6 +66,8 @@  #include <plat/iic.h>  #include <plat/pm.h> +#include "common.h" +  /* serial port setup */  #define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK) @@ -716,4 +717,5 @@ MACHINE_START(WLF_CRAGG_6410, "Wolfson Cragganmore 6410")  	.map_io		= crag6410_map_io,  	.init_machine	= crag6410_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c64xx_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c index c5955f30170..521e07b8501 100644 --- a/arch/arm/mach-s3c64xx/mach-hmt.c +++ b/arch/arm/mach-s3c64xx/mach-hmt.c @@ -38,12 +38,13 @@  #include <plat/fb.h>  #include <plat/nand.h> -#include <plat/s3c6410.h>  #include <plat/clock.h>  #include <plat/devs.h>  #include <plat/cpu.h>  #include <plat/regs-fb-v4.h> +#include "common.h" +  #define UCON S3C2410_UCON_DEFAULT  #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE)  #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) @@ -272,4 +273,5 @@ MACHINE_START(HMT, "Airgoo-HMT")  	.map_io		= hmt_map_io,  	.init_machine	= hmt_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c64xx_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c64xx/mach-mini6410.c b/arch/arm/mach-s3c64xx/mach-mini6410.c index 4415c85e3f6..c34c2ab22ea 100644 --- a/arch/arm/mach-s3c64xx/mach-mini6410.c +++ b/arch/arm/mach-s3c64xx/mach-mini6410.c @@ -34,7 +34,6 @@  #include <mach/regs-modem.h>  #include <mach/regs-srom.h> -#include <plat/s3c6410.h>  #include <plat/adc.h>  #include <plat/cpu.h>  #include <plat/devs.h> @@ -46,6 +45,8 @@  #include <video/platform_lcd.h> +#include "common.h" +  #define UCON S3C2410_UCON_DEFAULT  #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB)  #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) @@ -350,4 +351,5 @@ MACHINE_START(MINI6410, "MINI6410")  	.map_io		= mini6410_map_io,  	.init_machine	= mini6410_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c64xx_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c64xx/mach-ncp.c b/arch/arm/mach-s3c64xx/mach-ncp.c index 9b2c610eac2..0efa2ba783b 100644 --- a/arch/arm/mach-s3c64xx/mach-ncp.c +++ b/arch/arm/mach-s3c64xx/mach-ncp.c @@ -40,12 +40,13 @@  #include <plat/iic.h>  #include <plat/fb.h> -#include <plat/s3c6410.h>  #include <plat/clock.h>  #include <plat/devs.h>  #include <plat/cpu.h>  #include <plat/regs-fb-v4.h> +#include "common.h" +  #define UCON S3C2410_UCON_DEFAULT  #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE  #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE @@ -104,4 +105,5 @@ MACHINE_START(NCP, "NCP")  	.map_io		= ncp_map_io,  	.init_machine	= ncp_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c64xx_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c64xx/mach-real6410.c b/arch/arm/mach-s3c64xx/mach-real6410.c index dbab49f2713..be2a9a22ab7 100644 --- a/arch/arm/mach-s3c64xx/mach-real6410.c +++ b/arch/arm/mach-s3c64xx/mach-real6410.c @@ -35,7 +35,6 @@  #include <mach/regs-modem.h>  #include <mach/regs-srom.h> -#include <plat/s3c6410.h>  #include <plat/adc.h>  #include <plat/cpu.h>  #include <plat/devs.h> @@ -47,6 +46,8 @@  #include <video/platform_lcd.h> +#include "common.h" +  #define UCON S3C2410_UCON_DEFAULT  #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB)  #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) @@ -331,4 +332,5 @@ MACHINE_START(REAL6410, "REAL6410")  	.map_io		= real6410_map_io,  	.init_machine	= real6410_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c64xx_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c64xx/mach-smartq.c b/arch/arm/mach-s3c64xx/mach-smartq.c index cb1ebeb0876..ce31db13623 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq.c +++ b/arch/arm/mach-s3c64xx/mach-smartq.c @@ -40,6 +40,8 @@  #include <video/platform_lcd.h> +#include "common.h" +  #define UCON S3C2410_UCON_DEFAULT  #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE)  #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) diff --git a/arch/arm/mach-s3c64xx/mach-smartq5.c b/arch/arm/mach-s3c64xx/mach-smartq5.c index 05394528265..3f42431d4dd 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq5.c +++ b/arch/arm/mach-s3c64xx/mach-smartq5.c @@ -24,13 +24,13 @@  #include <mach/map.h>  #include <mach/regs-gpio.h> -#include <plat/s3c6410.h>  #include <plat/cpu.h>  #include <plat/devs.h>  #include <plat/fb.h>  #include <plat/gpio-cfg.h>  #include <plat/regs-fb-v4.h> +#include "common.h"  #include "mach-smartq.h"  static struct gpio_led smartq5_leds[] = { @@ -153,4 +153,5 @@ MACHINE_START(SMARTQ5, "SmartQ 5")  	.map_io		= smartq_map_io,  	.init_machine	= smartq5_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c64xx_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c64xx/mach-smartq7.c b/arch/arm/mach-s3c64xx/mach-smartq7.c index a58d1ba5cba..e5c09b6db96 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq7.c +++ b/arch/arm/mach-s3c64xx/mach-smartq7.c @@ -24,13 +24,13 @@  #include <mach/map.h>  #include <mach/regs-gpio.h> -#include <plat/s3c6410.h>  #include <plat/cpu.h>  #include <plat/devs.h>  #include <plat/fb.h>  #include <plat/gpio-cfg.h>  #include <plat/regs-fb-v4.h> +#include "common.h"  #include "mach-smartq.h"  static struct gpio_led smartq7_leds[] = { @@ -169,4 +169,5 @@ MACHINE_START(SMARTQ7, "SmartQ 7")  	.map_io		= smartq_map_io,  	.init_machine	= smartq7_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c64xx_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c64xx/mach-smdk6400.c b/arch/arm/mach-s3c64xx/mach-smdk6400.c index be28a59e3f5..5f096534f4c 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6400.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6400.c @@ -32,12 +32,13 @@  #include <plat/regs-serial.h> -#include <plat/s3c6400.h>  #include <plat/clock.h>  #include <plat/devs.h>  #include <plat/cpu.h>  #include <plat/iic.h> +#include "common.h" +  #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK  #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB  #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE @@ -93,4 +94,5 @@ MACHINE_START(SMDK6400, "SMDK6400")  	.map_io		= smdk6400_map_io,  	.init_machine	= smdk6400_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c64xx_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index 08309155d08..ca6fc204f0e 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c @@ -64,7 +64,6 @@  #include <plat/fb.h>  #include <plat/gpio-cfg.h> -#include <plat/s3c6410.h>  #include <plat/clock.h>  #include <plat/devs.h>  #include <plat/cpu.h> @@ -74,6 +73,8 @@  #include <plat/backlight.h>  #include <plat/regs-fb-v4.h> +#include "common.h" +  #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK  #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB  #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE @@ -705,4 +706,5 @@ MACHINE_START(SMDK6410, "SMDK6410")  	.map_io		= smdk6410_map_io,  	.init_machine	= smdk6410_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s3c64xx_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c64xx/s3c6400.c b/arch/arm/mach-s3c64xx/s3c6400.c index 51c00f2453c..b1e1571f2f6 100644 --- a/arch/arm/mach-s3c64xx/s3c6400.c +++ b/arch/arm/mach-s3c64xx/s3c6400.c @@ -38,7 +38,8 @@  #include <plat/sdhci.h>  #include <plat/iic-core.h>  #include <plat/onenand-core.h> -#include <plat/s3c6400.h> + +#include "common.h"  void __init s3c6400_map_io(void)  { @@ -60,7 +61,7 @@ void __init s3c6400_map_io(void)  void __init s3c6400_init_clocks(int xtal)  {  	s3c64xx_register_clocks(xtal, S3C6400_CLKDIV0_ARM_MASK); -	s3c6400_setup_clocks(); +	s3c64xx_setup_clocks();  }  void __init s3c6400_init_irq(void) diff --git a/arch/arm/mach-s3c64xx/s3c6410.c b/arch/arm/mach-s3c64xx/s3c6410.c index 4117003464a..fba71bd991c 100644 --- a/arch/arm/mach-s3c64xx/s3c6410.c +++ b/arch/arm/mach-s3c64xx/s3c6410.c @@ -41,8 +41,8 @@  #include <plat/adc-core.h>  #include <plat/iic-core.h>  #include <plat/onenand-core.h> -#include <plat/s3c6400.h> -#include <plat/s3c6410.h> + +#include "common.h"  void __init s3c6410_map_io(void)  { @@ -66,7 +66,7 @@ void __init s3c6410_init_clocks(int xtal)  {  	printk(KERN_DEBUG "%s: initialising clocks\n", __func__);  	s3c64xx_register_clocks(xtal, S3C6410_CLKDIV0_ARM_MASK); -	s3c6400_setup_clocks(); +	s3c64xx_setup_clocks();  }  void __init s3c6410_init_irq(void) diff --git a/arch/arm/mach-s5p64x0/Makefile b/arch/arm/mach-s5p64x0/Makefile index a1324d8dc4e..d3f7409999f 100644 --- a/arch/arm/mach-s5p64x0/Makefile +++ b/arch/arm/mach-s5p64x0/Makefile @@ -10,14 +10,16 @@ obj-m				:=  obj-n				:=  obj-				:= -# Core support for S5P64X0 system +# Core -obj-$(CONFIG_ARCH_S5P64X0)	+= cpu.o init.o clock.o dma.o -obj-$(CONFIG_ARCH_S5P64X0)	+= setup-i2c0.o irq-eint.o +obj-y				+= common.o clock.o  obj-$(CONFIG_CPU_S5P6440)	+= clock-s5p6440.o  obj-$(CONFIG_CPU_S5P6450)	+= clock-s5p6450.o +  obj-$(CONFIG_PM)		+= pm.o irq-pm.o +obj-y				+= dma.o +  # machine support  obj-$(CONFIG_MACH_SMDK6440)	+= mach-smdk6440.o @@ -28,5 +30,6 @@ obj-$(CONFIG_MACH_SMDK6450)	+= mach-smdk6450.o  obj-y				+= dev-audio.o  obj-$(CONFIG_S3C64XX_DEV_SPI)	+= dev-spi.o +obj-y					+= setup-i2c0.o  obj-$(CONFIG_S5P64X0_SETUP_I2C1)	+= setup-i2c1.o  obj-$(CONFIG_S5P64X0_SETUP_FB_24BPP)	+= setup-fb-24bpp.o diff --git a/arch/arm/mach-s5p64x0/clock-s5p6440.c b/arch/arm/mach-s5p64x0/clock-s5p6440.c index c54c65d511f..dd2b8daef0c 100644 --- a/arch/arm/mach-s5p64x0/clock-s5p6440.c +++ b/arch/arm/mach-s5p64x0/clock-s5p6440.c @@ -31,7 +31,8 @@  #include <plat/pll.h>  #include <plat/s5p-clock.h>  #include <plat/clock-clksrc.h> -#include <plat/s5p6440.h> + +#include "common.h"  static u32 epll_div[][5] = {  	{ 36000000,	0,	48, 1, 4 }, diff --git a/arch/arm/mach-s5p64x0/clock-s5p6450.c b/arch/arm/mach-s5p64x0/clock-s5p6450.c index 2d04abfba12..328a224f007 100644 --- a/arch/arm/mach-s5p64x0/clock-s5p6450.c +++ b/arch/arm/mach-s5p64x0/clock-s5p6450.c @@ -31,7 +31,8 @@  #include <plat/pll.h>  #include <plat/s5p-clock.h>  #include <plat/clock-clksrc.h> -#include <plat/s5p6450.h> + +#include "common.h"  static struct clksrc_clk clk_mout_dpll = {  	.clk	= { diff --git a/arch/arm/mach-s5p64x0/clock.c b/arch/arm/mach-s5p64x0/clock.c index b52c6e2f37a..b289b726a7d 100644 --- a/arch/arm/mach-s5p64x0/clock.c +++ b/arch/arm/mach-s5p64x0/clock.c @@ -30,8 +30,8 @@  #include <plat/pll.h>  #include <plat/s5p-clock.h>  #include <plat/clock-clksrc.h> -#include <plat/s5p6440.h> -#include <plat/s5p6450.h> + +#include "common.h"  struct clksrc_clk clk_mout_apll = {  	.clk	= { diff --git a/arch/arm/mach-s5p64x0/common.c b/arch/arm/mach-s5p64x0/common.c new file mode 100644 index 00000000000..b7555a0fb0f --- /dev/null +++ b/arch/arm/mach-s5p64x0/common.c @@ -0,0 +1,468 @@ +/* + * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd. + *		http://www.samsung.com + * + * Common Codes for S5P64X0 machines + * + * 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. + */ + +#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/clk.h> +#include <linux/io.h> +#include <linux/sysdev.h> +#include <linux/serial_core.h> +#include <linux/platform_device.h> +#include <linux/sched.h> +#include <linux/dma-mapping.h> +#include <linux/gpio.h> +#include <linux/irq.h> + +#include <asm/irq.h> +#include <asm/proc-fns.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <asm/mach/irq.h> + +#include <mach/map.h> +#include <mach/hardware.h> +#include <mach/regs-clock.h> +#include <mach/regs-gpio.h> + +#include <plat/cpu.h> +#include <plat/clock.h> +#include <plat/devs.h> +#include <plat/pm.h> +#include <plat/adc-core.h> +#include <plat/fb-core.h> +#include <plat/gpio-cfg.h> +#include <plat/regs-irqtype.h> +#include <plat/regs-serial.h> +#include <plat/watchdog-reset.h> + +#include "common.h" + +static const char name_s5p6440[] = "S5P6440"; +static const char name_s5p6450[] = "S5P6450"; + +static struct cpu_table cpu_ids[] __initdata = { +	{ +		.idcode		= S5P6440_CPU_ID, +		.idmask		= S5P64XX_CPU_MASK, +		.map_io		= s5p6440_map_io, +		.init_clocks	= s5p6440_init_clocks, +		.init_uarts	= s5p6440_init_uarts, +		.init		= s5p64x0_init, +		.name		= name_s5p6440, +	}, { +		.idcode		= S5P6450_CPU_ID, +		.idmask		= S5P64XX_CPU_MASK, +		.map_io		= s5p6450_map_io, +		.init_clocks	= s5p6450_init_clocks, +		.init_uarts	= s5p6450_init_uarts, +		.init		= s5p64x0_init, +		.name		= name_s5p6450, +	}, +}; + +/* Initial IO mappings */ + +static struct map_desc s5p64x0_iodesc[] __initdata = { +	{ +		.virtual	= (unsigned long)S5P_VA_CHIPID, +		.pfn		= __phys_to_pfn(S5P64X0_PA_CHIPID), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_SYS, +		.pfn		= __phys_to_pfn(S5P64X0_PA_SYSCON), +		.length		= SZ_64K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_TIMER, +		.pfn		= __phys_to_pfn(S5P64X0_PA_TIMER), +		.length		= SZ_16K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_WATCHDOG, +		.pfn		= __phys_to_pfn(S5P64X0_PA_WDT), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_SROMC, +		.pfn		= __phys_to_pfn(S5P64X0_PA_SROMC), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_GPIO, +		.pfn		= __phys_to_pfn(S5P64X0_PA_GPIO), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)VA_VIC0, +		.pfn		= __phys_to_pfn(S5P64X0_PA_VIC0), +		.length		= SZ_16K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)VA_VIC1, +		.pfn		= __phys_to_pfn(S5P64X0_PA_VIC1), +		.length		= SZ_16K, +		.type		= MT_DEVICE, +	}, +}; + +static struct map_desc s5p6440_iodesc[] __initdata = { +	{ +		.virtual	= (unsigned long)S3C_VA_UART, +		.pfn		= __phys_to_pfn(S5P6440_PA_UART(0)), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, +}; + +static struct map_desc s5p6450_iodesc[] __initdata = { +	{ +		.virtual	= (unsigned long)S3C_VA_UART, +		.pfn		= __phys_to_pfn(S5P6450_PA_UART(0)), +		.length		= SZ_512K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_UART + SZ_512K, +		.pfn		= __phys_to_pfn(S5P6450_PA_UART(5)), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, +}; + +static void s5p64x0_idle(void) +{ +	unsigned long val; + +	if (!need_resched()) { +		val = __raw_readl(S5P64X0_PWR_CFG); +		val &= ~(0x3 << 5); +		val |= (0x1 << 5); +		__raw_writel(val, S5P64X0_PWR_CFG); + +		cpu_do_idle(); +	} +	local_irq_enable(); +} + +/* + * s5p64x0_map_io + * + * register the standard CPU IO areas + */ + +void __init s5p64x0_init_io(struct map_desc *mach_desc, int size) +{ +	/* initialize the io descriptors we need for initialization */ +	iotable_init(s5p64x0_iodesc, ARRAY_SIZE(s5p64x0_iodesc)); +	if (mach_desc) +		iotable_init(mach_desc, size); + +	/* detect cpu id and rev. */ +	s5p_init_cpu(S5P64X0_SYS_ID); + +	s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); +} + +void __init s5p6440_map_io(void) +{ +	/* initialize any device information early */ +	s3c_adc_setname("s3c64xx-adc"); +	s3c_fb_setname("s5p64x0-fb"); + +	iotable_init(s5p6440_iodesc, ARRAY_SIZE(s5p6440_iodesc)); +	init_consistent_dma_size(SZ_8M); +} + +void __init s5p6450_map_io(void) +{ +	/* initialize any device information early */ +	s3c_adc_setname("s3c64xx-adc"); +	s3c_fb_setname("s5p64x0-fb"); + +	iotable_init(s5p6450_iodesc, ARRAY_SIZE(s5p6450_iodesc)); +	init_consistent_dma_size(SZ_8M); +} + +/* + * s5p64x0_init_clocks + * + * register and setup the CPU clocks + */ + +void __init s5p6440_init_clocks(int xtal) +{ +	printk(KERN_DEBUG "%s: initializing clocks\n", __func__); + +	s3c24xx_register_baseclocks(xtal); +	s5p_register_clocks(xtal); +	s5p6440_register_clocks(); +	s5p6440_setup_clocks(); +} + +void __init s5p6450_init_clocks(int xtal) +{ +	printk(KERN_DEBUG "%s: initializing clocks\n", __func__); + +	s3c24xx_register_baseclocks(xtal); +	s5p_register_clocks(xtal); +	s5p6450_register_clocks(); +	s5p6450_setup_clocks(); +} + +/* + * s5p64x0_init_irq + * + * register the CPU interrupts + */ + +void __init s5p6440_init_irq(void) +{ +	/* S5P6440 supports 2 VIC */ +	u32 vic[2]; + +	/* +	 * VIC0 is missing IRQ_VIC0[3, 4, 8, 10, (12-22)] +	 * VIC1 is missing IRQ VIC1[1, 3, 4, 10, 11, 12, 14, 15, 22] +	 */ +	vic[0] = 0xff800ae7; +	vic[1] = 0xffbf23e5; + +	s5p_init_irq(vic, ARRAY_SIZE(vic)); +} + +void __init s5p6450_init_irq(void) +{ +	/* S5P6450 supports only 2 VIC */ +	u32 vic[2]; + +	/* +	 * VIC0 is missing IRQ_VIC0[(13-15), (21-22)] +	 * VIC1 is missing IRQ VIC1[12, 14, 23] +	 */ +	vic[0] = 0xff9f1fff; +	vic[1] = 0xff7fafff; + +	s5p_init_irq(vic, ARRAY_SIZE(vic)); +} + +struct sysdev_class s5p64x0_sysclass = { +	.name	= "s5p64x0-core", +}; + +static struct sys_device s5p64x0_sysdev = { +	.cls	= &s5p64x0_sysclass, +}; + +static int __init s5p64x0_core_init(void) +{ +	return sysdev_class_register(&s5p64x0_sysclass); +} +core_initcall(s5p64x0_core_init); + +int __init s5p64x0_init(void) +{ +	printk(KERN_INFO "S5P64X0(S5P6440/S5P6450): Initializing architecture\n"); + +	/* set idle function */ +	pm_idle = s5p64x0_idle; + +	return sysdev_register(&s5p64x0_sysdev); +} + +static struct s3c24xx_uart_clksrc s5p64x0_serial_clocks[] = { +	[0] = { +		.name		= "pclk_low", +		.divisor	= 1, +		.min_baud	= 0, +		.max_baud	= 0, +	}, +	[1] = { +		.name		= "uclk1", +		.divisor	= 1, +		.min_baud	= 0, +		.max_baud	= 0, +	}, +}; + +/* uart registration process */ + +void __init s5p64x0_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) +{ +	struct s3c2410_uartcfg *tcfg = cfg; +	u32 ucnt; + +	for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { +		if (!tcfg->clocks) { +			tcfg->clocks = s5p64x0_serial_clocks; +			tcfg->clocks_size = ARRAY_SIZE(s5p64x0_serial_clocks); +		} +	} +} + +void __init s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no) +{ +	int uart; + +	for (uart = 0; uart < no; uart++) { +		s5p_uart_resources[uart].resources->start = S5P6440_PA_UART(uart); +		s5p_uart_resources[uart].resources->end = S5P6440_PA_UART(uart) + S5P_SZ_UART; +	} + +	s5p64x0_common_init_uarts(cfg, no); +	s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); +} + +void __init s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no) +{ +	s5p64x0_common_init_uarts(cfg, no); +	s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); +} + +#define eint_offset(irq)	((irq) - IRQ_EINT(0)) + +static int s5p64x0_irq_eint_set_type(struct irq_data *data, unsigned int type) +{ +	int offs = eint_offset(data->irq); +	int shift; +	u32 ctrl, mask; +	u32 newvalue = 0; + +	if (offs > 15) +		return -EINVAL; + +	switch (type) { +	case IRQ_TYPE_NONE: +		printk(KERN_WARNING "No edge setting!\n"); +		break; +	case IRQ_TYPE_EDGE_RISING: +		newvalue = S3C2410_EXTINT_RISEEDGE; +		break; +	case IRQ_TYPE_EDGE_FALLING: +		newvalue = S3C2410_EXTINT_FALLEDGE; +		break; +	case IRQ_TYPE_EDGE_BOTH: +		newvalue = S3C2410_EXTINT_BOTHEDGE; +		break; +	case IRQ_TYPE_LEVEL_LOW: +		newvalue = S3C2410_EXTINT_LOWLEV; +		break; +	case IRQ_TYPE_LEVEL_HIGH: +		newvalue = S3C2410_EXTINT_HILEV; +		break; +	default: +		printk(KERN_ERR "No such irq type %d", type); +		return -EINVAL; +	} + +	shift = (offs / 2) * 4; +	mask = 0x7 << shift; + +	ctrl = __raw_readl(S5P64X0_EINT0CON0) & ~mask; +	ctrl |= newvalue << shift; +	__raw_writel(ctrl, S5P64X0_EINT0CON0); + +	/* Configure the GPIO pin for 6450 or 6440 based on CPU ID */ +	if (soc_is_s5p6450()) +		s3c_gpio_cfgpin(S5P6450_GPN(offs), S3C_GPIO_SFN(2)); +	else +		s3c_gpio_cfgpin(S5P6440_GPN(offs), S3C_GPIO_SFN(2)); + +	return 0; +} + +/* + * s5p64x0_irq_demux_eint + * + * This function demuxes the IRQ from the group0 external interrupts, + * from IRQ_EINT(0) to IRQ_EINT(15). It is designed to be inlined into + * the specific handlers s5p64x0_irq_demux_eintX_Y. + */ +static inline void s5p64x0_irq_demux_eint(unsigned int start, unsigned int end) +{ +	u32 status = __raw_readl(S5P64X0_EINT0PEND); +	u32 mask = __raw_readl(S5P64X0_EINT0MASK); +	unsigned int irq; + +	status &= ~mask; +	status >>= start; +	status &= (1 << (end - start + 1)) - 1; + +	for (irq = IRQ_EINT(start); irq <= IRQ_EINT(end); irq++) { +		if (status & 1) +			generic_handle_irq(irq); +		status >>= 1; +	} +} + +static void s5p64x0_irq_demux_eint0_3(unsigned int irq, struct irq_desc *desc) +{ +	s5p64x0_irq_demux_eint(0, 3); +} + +static void s5p64x0_irq_demux_eint4_11(unsigned int irq, struct irq_desc *desc) +{ +	s5p64x0_irq_demux_eint(4, 11); +} + +static void s5p64x0_irq_demux_eint12_15(unsigned int irq, +					struct irq_desc *desc) +{ +	s5p64x0_irq_demux_eint(12, 15); +} + +static int s5p64x0_alloc_gc(void) +{ +	struct irq_chip_generic *gc; +	struct irq_chip_type *ct; + +	gc = irq_alloc_generic_chip("s5p64x0-eint", 1, S5P_IRQ_EINT_BASE, +				    S5P_VA_GPIO, handle_level_irq); +	if (!gc) { +		printk(KERN_ERR "%s: irq_alloc_generic_chip for group 0" +			"external interrupts failed\n", __func__); +		return -EINVAL; +	} + +	ct = gc->chip_types; +	ct->chip.irq_ack = irq_gc_ack_set_bit; +	ct->chip.irq_mask = irq_gc_mask_set_bit; +	ct->chip.irq_unmask = irq_gc_mask_clr_bit; +	ct->chip.irq_set_type = s5p64x0_irq_eint_set_type; +	ct->chip.irq_set_wake = s3c_irqext_wake; +	ct->regs.ack = EINT0PEND_OFFSET; +	ct->regs.mask = EINT0MASK_OFFSET; +	irq_setup_generic_chip(gc, IRQ_MSK(16), IRQ_GC_INIT_MASK_CACHE, +			       IRQ_NOREQUEST | IRQ_NOPROBE, 0); +	return 0; +} + +static int __init s5p64x0_init_irq_eint(void) +{ +	int ret = s5p64x0_alloc_gc(); +	irq_set_chained_handler(IRQ_EINT0_3, s5p64x0_irq_demux_eint0_3); +	irq_set_chained_handler(IRQ_EINT4_11, s5p64x0_irq_demux_eint4_11); +	irq_set_chained_handler(IRQ_EINT12_15, s5p64x0_irq_demux_eint12_15); + +	return ret; +} +arch_initcall(s5p64x0_init_irq_eint); + +void s5p64x0_restart(char mode, const char *cmd) +{ +	if (mode != 's') +		arch_wdt_reset(); + +	soft_restart(0); +} diff --git a/arch/arm/mach-s5p64x0/common.h b/arch/arm/mach-s5p64x0/common.h new file mode 100644 index 00000000000..f8a60fdc588 --- /dev/null +++ b/arch/arm/mach-s5p64x0/common.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + *		http://www.samsung.com + * + * Common Header for S5P64X0 machines + * + * 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. + */ + +#ifndef __ARCH_ARM_MACH_S5P64X0_COMMON_H +#define __ARCH_ARM_MACH_S5P64X0_COMMON_H + +void s5p6440_init_irq(void); +void s5p6450_init_irq(void); +void s5p64x0_init_io(struct map_desc *mach_desc, int size); + +void s5p6440_register_clocks(void); +void s5p6440_setup_clocks(void); + +void s5p6450_register_clocks(void); +void s5p6450_setup_clocks(void); + +void s5p64x0_restart(char mode, const char *cmd); + +#ifdef CONFIG_CPU_S5P6440 + +extern  int s5p64x0_init(void); +extern void s5p6440_map_io(void); +extern void s5p6440_init_clocks(int xtal); + +extern void s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no); + +#else +#define s5p6440_init_clocks NULL +#define s5p6440_init_uarts NULL +#define s5p6440_map_io NULL +#define s5p64x0_init NULL +#endif + +#ifdef CONFIG_CPU_S5P6450 + +extern  int s5p64x0_init(void); +extern void s5p6450_map_io(void); +extern void s5p6450_init_clocks(int xtal); + +extern void s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no); + +#else +#define s5p6450_init_clocks NULL +#define s5p6450_init_uarts NULL +#define s5p6450_map_io NULL +#define s5p64x0_init NULL +#endif + +#endif /* __ARCH_ARM_MACH_S5P64X0_COMMON_H */ diff --git a/arch/arm/mach-s5p64x0/cpu.c b/arch/arm/mach-s5p64x0/cpu.c deleted file mode 100644 index ecab40cf19a..00000000000 --- a/arch/arm/mach-s5p64x0/cpu.c +++ /dev/null @@ -1,215 +0,0 @@ -/* linux/arch/arm/mach-s5p64x0/cpu.c - * - * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.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. -*/ - -#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/clk.h> -#include <linux/io.h> -#include <linux/sysdev.h> -#include <linux/serial_core.h> -#include <linux/platform_device.h> -#include <linux/sched.h> -#include <linux/dma-mapping.h> - -#include <asm/mach/arch.h> -#include <asm/mach/map.h> -#include <asm/mach/irq.h> -#include <asm/proc-fns.h> -#include <asm/irq.h> - -#include <mach/hardware.h> -#include <mach/map.h> -#include <mach/regs-clock.h> - -#include <plat/regs-serial.h> -#include <plat/cpu.h> -#include <plat/devs.h> -#include <plat/clock.h> -#include <plat/s5p6440.h> -#include <plat/s5p6450.h> -#include <plat/adc-core.h> -#include <plat/fb-core.h> - -/* Initial IO mappings */ - -static struct map_desc s5p64x0_iodesc[] __initdata = { -	{ -		.virtual	= (unsigned long)S5P_VA_GPIO, -		.pfn		= __phys_to_pfn(S5P64X0_PA_GPIO), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)VA_VIC0, -		.pfn		= __phys_to_pfn(S5P64X0_PA_VIC0), -		.length		= SZ_16K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)VA_VIC1, -		.pfn		= __phys_to_pfn(S5P64X0_PA_VIC1), -		.length		= SZ_16K, -		.type		= MT_DEVICE, -	}, -}; - -static struct map_desc s5p6440_iodesc[] __initdata = { -	{ -		.virtual	= (unsigned long)S3C_VA_UART, -		.pfn		= __phys_to_pfn(S5P6440_PA_UART(0)), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, -}; - -static struct map_desc s5p6450_iodesc[] __initdata = { -	{ -		.virtual	= (unsigned long)S3C_VA_UART, -		.pfn		= __phys_to_pfn(S5P6450_PA_UART(0)), -		.length		= SZ_512K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C_VA_UART + SZ_512K, -		.pfn		= __phys_to_pfn(S5P6450_PA_UART(5)), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, -}; - -static void s5p64x0_idle(void) -{ -	unsigned long val; - -	if (!need_resched()) { -		val = __raw_readl(S5P64X0_PWR_CFG); -		val &= ~(0x3 << 5); -		val |= (0x1 << 5); -		__raw_writel(val, S5P64X0_PWR_CFG); - -		cpu_do_idle(); -	} -	local_irq_enable(); -} - -/* - * s5p64x0_map_io - * - * register the standard CPU IO areas - */ - -void __init s5p6440_map_io(void) -{ -	/* initialize any device information early */ -	s3c_adc_setname("s3c64xx-adc"); -	s3c_fb_setname("s5p64x0-fb"); - -	iotable_init(s5p64x0_iodesc, ARRAY_SIZE(s5p64x0_iodesc)); -	iotable_init(s5p6440_iodesc, ARRAY_SIZE(s5p6440_iodesc)); -	init_consistent_dma_size(SZ_8M); -} - -void __init s5p6450_map_io(void) -{ -	/* initialize any device information early */ -	s3c_adc_setname("s3c64xx-adc"); -	s3c_fb_setname("s5p64x0-fb"); - -	iotable_init(s5p64x0_iodesc, ARRAY_SIZE(s5p64x0_iodesc)); -	iotable_init(s5p6450_iodesc, ARRAY_SIZE(s5p6450_iodesc)); -	init_consistent_dma_size(SZ_8M); -} - -/* - * s5p64x0_init_clocks - * - * register and setup the CPU clocks - */ - -void __init s5p6440_init_clocks(int xtal) -{ -	printk(KERN_DEBUG "%s: initializing clocks\n", __func__); - -	s3c24xx_register_baseclocks(xtal); -	s5p_register_clocks(xtal); -	s5p6440_register_clocks(); -	s5p6440_setup_clocks(); -} - -void __init s5p6450_init_clocks(int xtal) -{ -	printk(KERN_DEBUG "%s: initializing clocks\n", __func__); - -	s3c24xx_register_baseclocks(xtal); -	s5p_register_clocks(xtal); -	s5p6450_register_clocks(); -	s5p6450_setup_clocks(); -} - -/* - * s5p64x0_init_irq - * - * register the CPU interrupts - */ - -void __init s5p6440_init_irq(void) -{ -	/* S5P6440 supports 2 VIC */ -	u32 vic[2]; - -	/* -	 * VIC0 is missing IRQ_VIC0[3, 4, 8, 10, (12-22)] -	 * VIC1 is missing IRQ VIC1[1, 3, 4, 10, 11, 12, 14, 15, 22] -	 */ -	vic[0] = 0xff800ae7; -	vic[1] = 0xffbf23e5; - -	s5p_init_irq(vic, ARRAY_SIZE(vic)); -} - -void __init s5p6450_init_irq(void) -{ -	/* S5P6450 supports only 2 VIC */ -	u32 vic[2]; - -	/* -	 * VIC0 is missing IRQ_VIC0[(13-15), (21-22)] -	 * VIC1 is missing IRQ VIC1[12, 14, 23] -	 */ -	vic[0] = 0xff9f1fff; -	vic[1] = 0xff7fafff; - -	s5p_init_irq(vic, ARRAY_SIZE(vic)); -} - -struct sysdev_class s5p64x0_sysclass = { -	.name	= "s5p64x0-core", -}; - -static struct sys_device s5p64x0_sysdev = { -	.cls	= &s5p64x0_sysclass, -}; - -static int __init s5p64x0_core_init(void) -{ -	return sysdev_class_register(&s5p64x0_sysclass); -} -core_initcall(s5p64x0_core_init); - -int __init s5p64x0_init(void) -{ -	printk(KERN_INFO "S5P64X0(S5P6440/S5P6450): Initializing architecture\n"); - -	/* set idle function */ -	pm_idle = s5p64x0_idle; - -	return sysdev_register(&s5p64x0_sysdev); -} diff --git a/arch/arm/mach-s5p64x0/include/mach/system.h b/arch/arm/mach-s5p64x0/include/mach/system.h index 60f57532c97..cf26e0954a2 100644 --- a/arch/arm/mach-s5p64x0/include/mach/system.h +++ b/arch/arm/mach-s5p64x0/include/mach/system.h @@ -13,8 +13,6 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H __FILE__ -#include <plat/system-reset.h> -  static void arch_idle(void)  {  	/* nothing here yet */ diff --git a/arch/arm/mach-s5p64x0/init.c b/arch/arm/mach-s5p64x0/init.c deleted file mode 100644 index 79833caf816..00000000000 --- a/arch/arm/mach-s5p64x0/init.c +++ /dev/null @@ -1,73 +0,0 @@ -/* linux/arch/arm/mach-s5p64x0/init.c - * - * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * S5P64X0 - Init support - * - * 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. -*/ - -#include <linux/kernel.h> -#include <linux/types.h> -#include <linux/init.h> -#include <linux/serial_core.h> - -#include <mach/map.h> - -#include <plat/cpu.h> -#include <plat/devs.h> -#include <plat/s5p6440.h> -#include <plat/s5p6450.h> -#include <plat/regs-serial.h> - -static struct s3c24xx_uart_clksrc s5p64x0_serial_clocks[] = { -	[0] = { -		.name		= "pclk_low", -		.divisor	= 1, -		.min_baud	= 0, -		.max_baud	= 0, -	}, -	[1] = { -		.name		= "uclk1", -		.divisor	= 1, -		.min_baud	= 0, -		.max_baud	= 0, -	}, -}; - -/* uart registration process */ - -void __init s5p64x0_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) -{ -	struct s3c2410_uartcfg *tcfg = cfg; -	u32 ucnt; - -	for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { -		if (!tcfg->clocks) { -			tcfg->clocks = s5p64x0_serial_clocks; -			tcfg->clocks_size = ARRAY_SIZE(s5p64x0_serial_clocks); -		} -	} -} - -void __init s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no) -{ -	int uart; - -	for (uart = 0; uart < no; uart++) { -		s5p_uart_resources[uart].resources->start = S5P6440_PA_UART(uart); -		s5p_uart_resources[uart].resources->end = S5P6440_PA_UART(uart) + S5P_SZ_UART; -	} - -	s5p64x0_common_init_uarts(cfg, no); -	s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); -} - -void __init s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no) -{ -	s5p64x0_common_init_uarts(cfg, no); -	s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); -} diff --git a/arch/arm/mach-s5p64x0/irq-eint.c b/arch/arm/mach-s5p64x0/irq-eint.c deleted file mode 100644 index 275dc74f4a7..00000000000 --- a/arch/arm/mach-s5p64x0/irq-eint.c +++ /dev/null @@ -1,155 +0,0 @@ -/* arch/arm/mach-s5p64x0/irq-eint.c - * - * Copyright (c) 2011 Samsung Electronics Co., Ltd - *		http://www.samsung.com/ - * - * Based on linux/arch/arm/mach-s3c64xx/irq-eint.c - * - * S5P64X0 - Interrupt handling for External Interrupts. - * - * 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. - */ - -#include <linux/kernel.h> -#include <linux/gpio.h> -#include <linux/irq.h> -#include <linux/io.h> - -#include <plat/cpu.h> -#include <plat/regs-irqtype.h> -#include <plat/gpio-cfg.h> -#include <plat/pm.h> - -#include <mach/regs-gpio.h> -#include <mach/regs-clock.h> - -#define eint_offset(irq)	((irq) - IRQ_EINT(0)) - -static int s5p64x0_irq_eint_set_type(struct irq_data *data, unsigned int type) -{ -	int offs = eint_offset(data->irq); -	int shift; -	u32 ctrl, mask; -	u32 newvalue = 0; - -	if (offs > 15) -		return -EINVAL; - -	switch (type) { -	case IRQ_TYPE_NONE: -		printk(KERN_WARNING "No edge setting!\n"); -		break; -	case IRQ_TYPE_EDGE_RISING: -		newvalue = S3C2410_EXTINT_RISEEDGE; -		break; -	case IRQ_TYPE_EDGE_FALLING: -		newvalue = S3C2410_EXTINT_FALLEDGE; -		break; -	case IRQ_TYPE_EDGE_BOTH: -		newvalue = S3C2410_EXTINT_BOTHEDGE; -		break; -	case IRQ_TYPE_LEVEL_LOW: -		newvalue = S3C2410_EXTINT_LOWLEV; -		break; -	case IRQ_TYPE_LEVEL_HIGH: -		newvalue = S3C2410_EXTINT_HILEV; -		break; -	default: -		printk(KERN_ERR "No such irq type %d", type); -		return -EINVAL; -	} - -	shift = (offs / 2) * 4; -	mask = 0x7 << shift; - -	ctrl = __raw_readl(S5P64X0_EINT0CON0) & ~mask; -	ctrl |= newvalue << shift; -	__raw_writel(ctrl, S5P64X0_EINT0CON0); - -	/* Configure the GPIO pin for 6450 or 6440 based on CPU ID */ -	if (soc_is_s5p6450()) -		s3c_gpio_cfgpin(S5P6450_GPN(offs), S3C_GPIO_SFN(2)); -	else -		s3c_gpio_cfgpin(S5P6440_GPN(offs), S3C_GPIO_SFN(2)); - -	return 0; -} - -/* - * s5p64x0_irq_demux_eint - * - * This function demuxes the IRQ from the group0 external interrupts, - * from IRQ_EINT(0) to IRQ_EINT(15). It is designed to be inlined into - * the specific handlers s5p64x0_irq_demux_eintX_Y. - */ -static inline void s5p64x0_irq_demux_eint(unsigned int start, unsigned int end) -{ -	u32 status = __raw_readl(S5P64X0_EINT0PEND); -	u32 mask = __raw_readl(S5P64X0_EINT0MASK); -	unsigned int irq; - -	status &= ~mask; -	status >>= start; -	status &= (1 << (end - start + 1)) - 1; - -	for (irq = IRQ_EINT(start); irq <= IRQ_EINT(end); irq++) { -		if (status & 1) -			generic_handle_irq(irq); -		status >>= 1; -	} -} - -static void s5p64x0_irq_demux_eint0_3(unsigned int irq, struct irq_desc *desc) -{ -	s5p64x0_irq_demux_eint(0, 3); -} - -static void s5p64x0_irq_demux_eint4_11(unsigned int irq, struct irq_desc *desc) -{ -	s5p64x0_irq_demux_eint(4, 11); -} - -static void s5p64x0_irq_demux_eint12_15(unsigned int irq, -					struct irq_desc *desc) -{ -	s5p64x0_irq_demux_eint(12, 15); -} - -static int s5p64x0_alloc_gc(void) -{ -	struct irq_chip_generic *gc; -	struct irq_chip_type *ct; - -	gc = irq_alloc_generic_chip("s5p64x0-eint", 1, S5P_IRQ_EINT_BASE, -				    S5P_VA_GPIO, handle_level_irq); -	if (!gc) { -		printk(KERN_ERR "%s: irq_alloc_generic_chip for group 0" -			"external interrupts failed\n", __func__); -		return -EINVAL; -	} - -	ct = gc->chip_types; -	ct->chip.irq_ack = irq_gc_ack_set_bit; -	ct->chip.irq_mask = irq_gc_mask_set_bit; -	ct->chip.irq_unmask = irq_gc_mask_clr_bit; -	ct->chip.irq_set_type = s5p64x0_irq_eint_set_type; -	ct->chip.irq_set_wake = s3c_irqext_wake; -	ct->regs.ack = EINT0PEND_OFFSET; -	ct->regs.mask = EINT0MASK_OFFSET; -	irq_setup_generic_chip(gc, IRQ_MSK(16), IRQ_GC_INIT_MASK_CACHE, -			       IRQ_NOREQUEST | IRQ_NOPROBE, 0); -	return 0; -} - -static int __init s5p64x0_init_irq_eint(void) -{ -	int ret = s5p64x0_alloc_gc(); -	irq_set_chained_handler(IRQ_EINT0_3, s5p64x0_irq_demux_eint0_3); -	irq_set_chained_handler(IRQ_EINT4_11, s5p64x0_irq_demux_eint4_11); -	irq_set_chained_handler(IRQ_EINT12_15, s5p64x0_irq_demux_eint12_15); - -	return ret; -} -arch_initcall(s5p64x0_init_irq_eint); diff --git a/arch/arm/mach-s5p64x0/mach-smdk6440.c b/arch/arm/mach-s5p64x0/mach-smdk6440.c index c272c3f7d6d..34d98a1dae5 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6440.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6440.c @@ -41,7 +41,6 @@  #include <plat/regs-serial.h>  #include <plat/gpio-cfg.h> -#include <plat/s5p6440.h>  #include <plat/clock.h>  #include <plat/devs.h>  #include <plat/cpu.h> @@ -54,6 +53,8 @@  #include <plat/fb.h>  #include <plat/regs-fb.h> +#include "common.h" +  #define SMDK6440_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				S3C2410_UCON_RXILEVEL |		\  				S3C2410_UCON_TXIRQMODE |	\ @@ -202,7 +203,7 @@ static struct platform_pwm_backlight_data smdk6440_bl_data = {  static void __init smdk6440_map_io(void)  { -	s5p_init_io(NULL, 0, S5P64X0_SYS_ID); +	s5p64x0_init_io(NULL, 0);  	s3c24xx_init_clocks(12000000);  	s3c24xx_init_uarts(smdk6440_uartcfgs, ARRAY_SIZE(smdk6440_uartcfgs));  	s5p_set_timer_source(S5P_PWM3, S5P_PWM4); @@ -247,4 +248,5 @@ MACHINE_START(SMDK6440, "SMDK6440")  	.map_io		= smdk6440_map_io,  	.init_machine	= smdk6440_machine_init,  	.timer		= &s5p_timer, +	.restart	= s5p64x0_restart,  MACHINE_END diff --git a/arch/arm/mach-s5p64x0/mach-smdk6450.c b/arch/arm/mach-s5p64x0/mach-smdk6450.c index 7a470095961..135cf5d8473 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6450.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6450.c @@ -41,7 +41,6 @@  #include <plat/regs-serial.h>  #include <plat/gpio-cfg.h> -#include <plat/s5p6450.h>  #include <plat/clock.h>  #include <plat/devs.h>  #include <plat/cpu.h> @@ -54,6 +53,8 @@  #include <plat/fb.h>  #include <plat/regs-fb.h> +#include "common.h" +  #define SMDK6450_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				S3C2410_UCON_RXILEVEL |		\  				S3C2410_UCON_TXIRQMODE |	\ @@ -222,7 +223,7 @@ static struct platform_pwm_backlight_data smdk6450_bl_data = {  static void __init smdk6450_map_io(void)  { -	s5p_init_io(NULL, 0, S5P64X0_SYS_ID); +	s5p64x0_init_io(NULL, 0);  	s3c24xx_init_clocks(19200000);  	s3c24xx_init_uarts(smdk6450_uartcfgs, ARRAY_SIZE(smdk6450_uartcfgs));  	s5p_set_timer_source(S5P_PWM3, S5P_PWM4); @@ -267,4 +268,5 @@ MACHINE_START(SMDK6450, "SMDK6450")  	.map_io		= smdk6450_map_io,  	.init_machine	= smdk6450_machine_init,  	.timer		= &s5p_timer, +	.restart	= s5p64x0_restart,  MACHINE_END diff --git a/arch/arm/mach-s5pc100/Makefile b/arch/arm/mach-s5pc100/Makefile index a5e6e608b49..c3166c4d2ac 100644 --- a/arch/arm/mach-s5pc100/Makefile +++ b/arch/arm/mach-s5pc100/Makefile @@ -9,28 +9,25 @@ obj-m				:=  obj-n				:=  obj-				:= -# Core support for S5PC100 system +# Core -obj-$(CONFIG_CPU_S5PC100)	+= cpu.o init.o clock.o -obj-$(CONFIG_CPU_S5PC100)	+= setup-i2c0.o -obj-$(CONFIG_CPU_S5PC100)	+= dma.o +obj-y				+= common.o clock.o -# Helper and device support - -obj-$(CONFIG_S5PC100_SETUP_FB_24BPP)	+= setup-fb-24bpp.o -obj-$(CONFIG_S5PC100_SETUP_I2C1)	+= setup-i2c1.o -obj-$(CONFIG_S5PC100_SETUP_IDE)		+= setup-ide.o -obj-$(CONFIG_S5PC100_SETUP_KEYPAD)	+= setup-keypad.o -obj-$(CONFIG_S5PC100_SETUP_SDHCI)	+= setup-sdhci.o -obj-$(CONFIG_S5PC100_SETUP_SDHCI_GPIO)	+= setup-sdhci-gpio.o - -# device support -obj-y				+= dev-audio.o -obj-$(CONFIG_S3C64XX_DEV_SPI)	+= dev-spi.o +obj-y				+= dma.o  # machine support  obj-$(CONFIG_MACH_SMDKC100)	+= mach-smdkc100.o  # device support +  obj-y				+= dev-audio.o +obj-$(CONFIG_S3C64XX_DEV_SPI)	+= dev-spi.o + +obj-y					+= setup-i2c0.o +obj-$(CONFIG_S5PC100_SETUP_FB_24BPP)	+= setup-fb-24bpp.o +obj-$(CONFIG_S5PC100_SETUP_I2C1)	+= setup-i2c1.o +obj-$(CONFIG_S5PC100_SETUP_IDE)		+= setup-ide.o +obj-$(CONFIG_S5PC100_SETUP_KEYPAD)	+= setup-keypad.o +obj-$(CONFIG_S5PC100_SETUP_SDHCI)	+= setup-sdhci.o +obj-$(CONFIG_S5PC100_SETUP_SDHCI_GPIO)	+= setup-sdhci-gpio.o diff --git a/arch/arm/mach-s5pc100/clock.c b/arch/arm/mach-s5pc100/clock.c index 8d47709da71..c4c74893f53 100644 --- a/arch/arm/mach-s5pc100/clock.c +++ b/arch/arm/mach-s5pc100/clock.c @@ -27,7 +27,8 @@  #include <plat/pll.h>  #include <plat/s5p-clock.h>  #include <plat/clock-clksrc.h> -#include <plat/s5pc100.h> + +#include "common.h"  static struct clk s5p_clk_otgphy = {  	.name		= "otg_phy", diff --git a/arch/arm/mach-s5pc100/cpu.c b/arch/arm/mach-s5pc100/common.c index fd2708e7d8a..73594a2fcf2 100644 --- a/arch/arm/mach-s5pc100/cpu.c +++ b/arch/arm/mach-s5pc100/common.c @@ -1,17 +1,16 @@ -/* linux/arch/arm/mach-s5pc100/cpu.c - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. +/* + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.   *		http://www.samsung.com   *   * Copyright 2009 Samsung Electronics Co.   *	Byungho Min <bhmin@samsung.com>   * - * Based on mach-s3c6410/cpu.c + * Common Codes for S5PC100   *   * 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. -*/ + */  #include <linux/kernel.h>  #include <linux/types.h> @@ -26,35 +25,73 @@  #include <linux/platform_device.h>  #include <linux/sched.h> +#include <asm/irq.h> +#include <asm/proc-fns.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <asm/proc-fns.h> - -#include <mach/hardware.h>  #include <mach/map.h> -#include <asm/irq.h> - -#include <plat/regs-serial.h> +#include <mach/hardware.h>  #include <mach/regs-clock.h>  #include <plat/cpu.h>  #include <plat/devs.h>  #include <plat/clock.h> -#include <plat/ata-core.h> -#include <plat/iic-core.h>  #include <plat/sdhci.h>  #include <plat/adc-core.h> -#include <plat/onenand-core.h> +#include <plat/ata-core.h>  #include <plat/fb-core.h> +#include <plat/iic-core.h> +#include <plat/onenand-core.h> +#include <plat/regs-serial.h> +#include <plat/watchdog-reset.h> + +#include "common.h" + +static const char name_s5pc100[] = "S5PC100"; -#include <plat/s5pc100.h> +static struct cpu_table cpu_ids[] __initdata = { +	{ +		.idcode		= S5PC100_CPU_ID, +		.idmask		= S5PC100_CPU_MASK, +		.map_io		= s5pc100_map_io, +		.init_clocks	= s5pc100_init_clocks, +		.init_uarts	= s5pc100_init_uarts, +		.init		= s5pc100_init, +		.name		= name_s5pc100, +	}, +};  /* Initial IO mappings */  static struct map_desc s5pc100_iodesc[] __initdata = {  	{ +		.virtual	= (unsigned long)S5P_VA_CHIPID, +		.pfn		= __phys_to_pfn(S5PC100_PA_CHIPID), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_SYS, +		.pfn		= __phys_to_pfn(S5PC100_PA_SYSCON), +		.length		= SZ_64K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_TIMER, +		.pfn		= __phys_to_pfn(S5PC100_PA_TIMER), +		.length		= SZ_16K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_WATCHDOG, +		.pfn		= __phys_to_pfn(S5PC100_PA_WATCHDOG), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_SROMC, +		.pfn		= __phys_to_pfn(S5PC100_PA_SROMC), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, {  		.virtual	= (unsigned long)S5P_VA_SYSTIMER,  		.pfn		= __phys_to_pfn(S5PC100_PA_SYSTIMER),  		.length		= SZ_16K, @@ -100,15 +137,27 @@ static void s5pc100_idle(void)  	local_irq_enable();  } -/* s5pc100_map_io +/* + * s5pc100_map_io   * - * register the standard cpu IO areas -*/ + * register the standard CPU IO areas + */ -void __init s5pc100_map_io(void) +void __init s5pc100_init_io(struct map_desc *mach_desc, int size)  { +	/* initialize the io descriptors we need for initialization */  	iotable_init(s5pc100_iodesc, ARRAY_SIZE(s5pc100_iodesc)); +	if (mach_desc) +		iotable_init(mach_desc, size); + +	/* detect cpu id and rev. */ +	s5p_init_cpu(S5P_VA_CHIPID); +	s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); +} + +void __init s5pc100_map_io(void) +{  	/* initialise device information early */  	s5pc100_default_sdhci0();  	s5pc100_default_sdhci1(); @@ -155,7 +204,6 @@ static int __init s5pc100_core_init(void)  {  	return sysdev_class_register(&s5pc100_sysclass);  } -  core_initcall(s5pc100_core_init);  int __init s5pc100_init(void) @@ -167,3 +215,18 @@ int __init s5pc100_init(void)  	return sysdev_register(&s5pc100_sysdev);  } + +/* uart registration process */ + +void __init s5pc100_init_uarts(struct s3c2410_uartcfg *cfg, int no) +{ +	s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); +} + +void s5pc100_restart(char mode, const char *cmd) +{ +	if (mode != 's') +		arch_wdt_reset(); + +	soft_restart(0); +} diff --git a/arch/arm/mach-s5pc100/common.h b/arch/arm/mach-s5pc100/common.h new file mode 100644 index 00000000000..9fbd3ae2b40 --- /dev/null +++ b/arch/arm/mach-s5pc100/common.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + *		http://www.samsung.com + * + * Common Header for S5PC100 machines + * + * 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. + */ + +#ifndef __ARCH_ARM_MACH_S5PC100_COMMON_H +#define __ARCH_ARM_MACH_S5PC100_COMMON_H + +void s5pc100_init_io(struct map_desc *mach_desc, int size); +void s5pc100_init_irq(void); + +void s5pc100_register_clocks(void); +void s5pc100_setup_clocks(void); + +void s5pc100_restart(char mode, const char *cmd); + +#ifdef CONFIG_CPU_S5PC100 + +extern  int s5pc100_init(void); +extern void s5pc100_map_io(void); +extern void s5pc100_init_clocks(int xtal); +extern void s5pc100_init_uarts(struct s3c2410_uartcfg *cfg, int no); + +#else +#define s5pc100_init_clocks NULL +#define s5pc100_init_uarts NULL +#define s5pc100_map_io NULL +#define s5pc100_init NULL +#endif + +#endif /* __ARCH_ARM_MACH_S5PC100_COMMON_H */ diff --git a/arch/arm/mach-s5pc100/include/mach/system.h b/arch/arm/mach-s5pc100/include/mach/system.h index a9ea57c0660..afc96c29851 100644 --- a/arch/arm/mach-s5pc100/include/mach/system.h +++ b/arch/arm/mach-s5pc100/include/mach/system.h @@ -11,8 +11,6 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H __FILE__ -#include <plat/system-reset.h> -  static void arch_idle(void)  {  	/* nothing here yet */ diff --git a/arch/arm/mach-s5pc100/init.c b/arch/arm/mach-s5pc100/init.c deleted file mode 100644 index 19d7b523c13..00000000000 --- a/arch/arm/mach-s5pc100/init.c +++ /dev/null @@ -1,24 +0,0 @@ -/* linux/arch/arm/plat-s5pc100/s5pc100-init.c - * - * Copyright 2009 Samsung Electronics Co. - *      Byungho Min <bhmin@samsung.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. - */ - -#include <linux/kernel.h> -#include <linux/types.h> -#include <linux/init.h> - -#include <plat/cpu.h> -#include <plat/devs.h> -#include <plat/s5pc100.h> - -/* uart registration process */ -void __init s5pc100_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) -{ -	s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); -} diff --git a/arch/arm/mach-s5pc100/mach-smdkc100.c b/arch/arm/mach-s5pc100/mach-smdkc100.c index 93ebe3a92d1..674d22992f3 100644 --- a/arch/arm/mach-s5pc100/mach-smdkc100.c +++ b/arch/arm/mach-s5pc100/mach-smdkc100.c @@ -43,7 +43,6 @@  #include <plat/clock.h>  #include <plat/devs.h>  #include <plat/cpu.h> -#include <plat/s5pc100.h>  #include <plat/fb.h>  #include <plat/iic.h>  #include <plat/ata.h> @@ -54,6 +53,8 @@  #include <plat/backlight.h>  #include <plat/regs-fb-v4.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define SMDKC100_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -216,7 +217,7 @@ static struct platform_pwm_backlight_data smdkc100_bl_data = {  static void __init smdkc100_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	s5pc100_init_io(NULL, 0);  	s3c24xx_init_clocks(12000000);  	s3c24xx_init_uarts(smdkc100_uartcfgs, ARRAY_SIZE(smdkc100_uartcfgs));  } @@ -255,4 +256,5 @@ MACHINE_START(SMDKC100, "SMDKC100")  	.map_io		= smdkc100_map_io,  	.init_machine	= smdkc100_machine_init,  	.timer		= &s3c24xx_timer, +	.restart	= s5pc100_restart,  MACHINE_END diff --git a/arch/arm/mach-s5pv210/Makefile b/arch/arm/mach-s5pv210/Makefile index 009fbe53df9..4c59186de95 100644 --- a/arch/arm/mach-s5pv210/Makefile +++ b/arch/arm/mach-s5pv210/Makefile @@ -10,18 +10,20 @@ obj-m				:=  obj-n				:=  obj-				:= -# Core support for S5PV210 system +# Core + +obj-y				+= common.o clock.o -obj-$(CONFIG_CPU_S5PV210)	+= cpu.o init.o clock.o dma.o -obj-$(CONFIG_CPU_S5PV210)	+= setup-i2c0.o  obj-$(CONFIG_PM)		+= pm.o +obj-y				+= dma.o +  # machine support  obj-$(CONFIG_MACH_AQUILA)	+= mach-aquila.o -obj-$(CONFIG_MACH_SMDKV210)	+= mach-smdkv210.o -obj-$(CONFIG_MACH_SMDKC110)	+= mach-smdkc110.o  obj-$(CONFIG_MACH_GONI)		+= mach-goni.o +obj-$(CONFIG_MACH_SMDKC110)	+= mach-smdkc110.o +obj-$(CONFIG_MACH_SMDKV210)	+= mach-smdkv210.o  obj-$(CONFIG_MACH_TORBRECK)	+= mach-torbreck.o  # device support @@ -29,11 +31,12 @@ obj-$(CONFIG_MACH_TORBRECK)	+= mach-torbreck.o  obj-y				+= dev-audio.o  obj-$(CONFIG_S3C64XX_DEV_SPI)	+= dev-spi.o +obj-y					+= setup-i2c0.o  obj-$(CONFIG_S5PV210_SETUP_FB_24BPP)	+= setup-fb-24bpp.o  obj-$(CONFIG_S5PV210_SETUP_FIMC)	+= setup-fimc.o -obj-$(CONFIG_S5PV210_SETUP_I2C1) 	+= setup-i2c1.o -obj-$(CONFIG_S5PV210_SETUP_I2C2) 	+= setup-i2c2.o +obj-$(CONFIG_S5PV210_SETUP_I2C1)	+= setup-i2c1.o +obj-$(CONFIG_S5PV210_SETUP_I2C2)	+= setup-i2c2.o  obj-$(CONFIG_S5PV210_SETUP_IDE)		+= setup-ide.o  obj-$(CONFIG_S5PV210_SETUP_KEYPAD)	+= setup-keypad.o -obj-$(CONFIG_S5PV210_SETUP_SDHCI)       += setup-sdhci.o +obj-$(CONFIG_S5PV210_SETUP_SDHCI)	+= setup-sdhci.o  obj-$(CONFIG_S5PV210_SETUP_SDHCI_GPIO)	+= setup-sdhci-gpio.o diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c index 4c5ac7a69e9..f2dbf5f75a2 100644 --- a/arch/arm/mach-s5pv210/clock.c +++ b/arch/arm/mach-s5pv210/clock.c @@ -29,7 +29,8 @@  #include <plat/pll.h>  #include <plat/s5p-clock.h>  #include <plat/clock-clksrc.h> -#include <plat/s5pv210.h> + +#include "common.h"  static unsigned long xtal; diff --git a/arch/arm/mach-s5pv210/cpu.c b/arch/arm/mach-s5pv210/common.c index 84ec7463323..a4921bc9f1d 100644 --- a/arch/arm/mach-s5pv210/cpu.c +++ b/arch/arm/mach-s5pv210/common.c @@ -1,12 +1,13 @@ -/* linux/arch/arm/mach-s5pv210/cpu.c - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. +/* + * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd.   *		http://www.samsung.com   * + * Common Codes for S5PV210 + *   * 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. -*/ + */  #include <linux/kernel.h>  #include <linux/types.h> @@ -21,33 +22,74 @@  #include <linux/platform_device.h>  #include <linux/sched.h>  #include <linux/dma-mapping.h> +#include <linux/serial_core.h> +#include <asm/proc-fns.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <asm/proc-fns.h>  #include <mach/map.h>  #include <mach/regs-clock.h>  #include <plat/cpu.h> -#include <plat/devs.h>  #include <plat/clock.h> -#include <plat/fb-core.h> -#include <plat/s5pv210.h> +#include <plat/devs.h> +#include <plat/sdhci.h>  #include <plat/adc-core.h>  #include <plat/ata-core.h> +#include <plat/fb-core.h>  #include <plat/fimc-core.h>  #include <plat/iic-core.h>  #include <plat/keypad-core.h> -#include <plat/sdhci.h> -#include <plat/reset.h>  #include <plat/tv-core.h> +#include <plat/regs-serial.h> + +#include "common.h" + +static const char name_s5pv210[] = "S5PV210/S5PC110"; + +static struct cpu_table cpu_ids[] __initdata = { +	{ +		.idcode		= S5PV210_CPU_ID, +		.idmask		= S5PV210_CPU_MASK, +		.map_io		= s5pv210_map_io, +		.init_clocks	= s5pv210_init_clocks, +		.init_uarts	= s5pv210_init_uarts, +		.init		= s5pv210_init, +		.name		= name_s5pv210, +	}, +};  /* Initial IO mappings */  static struct map_desc s5pv210_iodesc[] __initdata = {  	{ +		.virtual	= (unsigned long)S5P_VA_CHIPID, +		.pfn		= __phys_to_pfn(S5PV210_PA_CHIPID), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_SYS, +		.pfn		= __phys_to_pfn(S5PV210_PA_SYSCON), +		.length		= SZ_64K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_TIMER, +		.pfn		= __phys_to_pfn(S5PV210_PA_TIMER), +		.length		= SZ_16K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S3C_VA_WATCHDOG, +		.pfn		= __phys_to_pfn(S5PV210_PA_WATCHDOG), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, { +		.virtual	= (unsigned long)S5P_VA_SROMC, +		.pfn		= __phys_to_pfn(S5PV210_PA_SROMC), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, {  		.virtual	= (unsigned long)S5P_VA_SYSTIMER,  		.pfn		= __phys_to_pfn(S5PV210_PA_SYSTIMER),  		.length		= SZ_4K, @@ -108,19 +150,32 @@ static void s5pv210_idle(void)  	local_irq_enable();  } -static void s5pv210_sw_reset(void) +void s5pv210_restart(char mode, const char *cmd)  {  	__raw_writel(0x1, S5P_SWRESET);  } -/* s5pv210_map_io +/* + * s5pv210_map_io   *   * register the standard cpu IO areas -*/ + */ -void __init s5pv210_map_io(void) +void __init s5pv210_init_io(struct map_desc *mach_desc, int size)  { +	/* initialize the io descriptors we need for initialization */  	iotable_init(s5pv210_iodesc, ARRAY_SIZE(s5pv210_iodesc)); +	if (mach_desc) +		iotable_init(mach_desc, size); + +	/* detect cpu id and rev. */ +	s5p_init_cpu(S5P_VA_CHIPID); + +	s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); +} + +void __init s5pv210_map_io(void) +{  	init_consistent_dma_size(14 << 20);  	/* initialise device information early */ @@ -186,7 +241,6 @@ static int __init s5pv210_core_init(void)  {  	return sysdev_class_register(&s5pv210_sysclass);  } -  core_initcall(s5pv210_core_init);  int __init s5pv210_init(void) @@ -196,8 +250,31 @@ int __init s5pv210_init(void)  	/* set idle function */  	pm_idle = s5pv210_idle; -	/* set sw_reset function */ -	s5p_reset_hook = s5pv210_sw_reset; -  	return sysdev_register(&s5pv210_sysdev);  } + +static struct s3c24xx_uart_clksrc s5pv210_serial_clocks[] = { +	[0] = { +		.name		= "pclk", +		.divisor	= 1, +		.min_baud	= 0, +		.max_baud	= 0, +	}, +}; + +/* uart registration process */ + +void __init s5pv210_init_uarts(struct s3c2410_uartcfg *cfg, int no) +{ +	struct s3c2410_uartcfg *tcfg = cfg; +	u32 ucnt; + +	for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { +		if (!tcfg->clocks) { +			tcfg->clocks = s5pv210_serial_clocks; +			tcfg->clocks_size = ARRAY_SIZE(s5pv210_serial_clocks); +		} +	} + +	s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); +} diff --git a/arch/arm/mach-s5pv210/common.h b/arch/arm/mach-s5pv210/common.h new file mode 100644 index 00000000000..6ed2af5c751 --- /dev/null +++ b/arch/arm/mach-s5pv210/common.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + *		http://www.samsung.com + * + * Common Header for S5PV210 machines + * + * 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. + */ + +#ifndef __ARCH_ARM_MACH_S5PV210_COMMON_H +#define __ARCH_ARM_MACH_S5PV210_COMMON_H + +void s5pv210_init_io(struct map_desc *mach_desc, int size); +void s5pv210_init_irq(void); + +void s5pv210_register_clocks(void); +void s5pv210_setup_clocks(void); + +void s5pv210_restart(char mode, const char *cmd); + +#ifdef CONFIG_CPU_S5PV210 + +extern  int s5pv210_init(void); +extern void s5pv210_map_io(void); +extern void s5pv210_init_clocks(int xtal); +extern void s5pv210_init_uarts(struct s3c2410_uartcfg *cfg, int no); + +#else +#define s5pv210_init_clocks NULL +#define s5pv210_init_uarts NULL +#define s5pv210_map_io NULL +#define s5pv210_init NULL +#endif + +#endif /* __ARCH_ARM_MACH_S5PV210_COMMON_H */ diff --git a/arch/arm/mach-s5pv210/include/mach/system.h b/arch/arm/mach-s5pv210/include/mach/system.h index af8a200b213..bf288ced860 100644 --- a/arch/arm/mach-s5pv210/include/mach/system.h +++ b/arch/arm/mach-s5pv210/include/mach/system.h @@ -13,8 +13,6 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H __FILE__ -#include <plat/system-reset.h> -  static void arch_idle(void)  {  	/* nothing here yet */ diff --git a/arch/arm/mach-s5pv210/init.c b/arch/arm/mach-s5pv210/init.c deleted file mode 100644 index 4865ae2c475..00000000000 --- a/arch/arm/mach-s5pv210/init.c +++ /dev/null @@ -1,44 +0,0 @@ -/* linux/arch/arm/mach-s5pv210/init.c - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.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. -*/ - -#include <linux/kernel.h> -#include <linux/types.h> -#include <linux/init.h> -#include <linux/serial_core.h> - -#include <plat/cpu.h> -#include <plat/devs.h> -#include <plat/s5pv210.h> -#include <plat/regs-serial.h> - -static struct s3c24xx_uart_clksrc s5pv210_serial_clocks[] = { -	[0] = { -		.name		= "pclk", -		.divisor	= 1, -		.min_baud	= 0, -		.max_baud	= 0, -	}, -}; - -/* uart registration process */ -void __init s5pv210_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) -{ -	struct s3c2410_uartcfg *tcfg = cfg; -	u32 ucnt; - -	for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { -		if (!tcfg->clocks) { -			tcfg->clocks = s5pv210_serial_clocks; -			tcfg->clocks_size = ARRAY_SIZE(s5pv210_serial_clocks); -		} -	} - -	s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); -} diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c index 71ca95604d6..6f7dfe993c1 100644 --- a/arch/arm/mach-s5pv210/mach-aquila.c +++ b/arch/arm/mach-s5pv210/mach-aquila.c @@ -33,7 +33,6 @@  #include <plat/gpio-cfg.h>  #include <plat/regs-serial.h> -#include <plat/s5pv210.h>  #include <plat/devs.h>  #include <plat/cpu.h>  #include <plat/fb.h> @@ -42,6 +41,8 @@  #include <plat/s5p-time.h>  #include <plat/regs-fb-v4.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define AQUILA_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -645,7 +646,7 @@ static void __init aquila_sound_init(void)  static void __init aquila_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	s5pv210_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  	s3c24xx_init_uarts(aquila_uartcfgs, ARRAY_SIZE(aquila_uartcfgs));  	s5p_set_timer_source(S5P_PWM3, S5P_PWM4); @@ -685,4 +686,5 @@ MACHINE_START(AQUILA, "Aquila")  	.map_io		= aquila_map_io,  	.init_machine	= aquila_machine_init,  	.timer		= &s5p_timer, +	.restart	= s5pv210_restart,  MACHINE_END diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c index 448fd9ea96f..12c69371739 100644 --- a/arch/arm/mach-s5pv210/mach-goni.c +++ b/arch/arm/mach-s5pv210/mach-goni.c @@ -38,7 +38,6 @@  #include <plat/gpio-cfg.h>  #include <plat/regs-serial.h> -#include <plat/s5pv210.h>  #include <plat/devs.h>  #include <plat/cpu.h>  #include <plat/fb.h> @@ -55,6 +54,8 @@  #include <media/s5p_fimc.h>  #include <media/noon010pc30.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define GONI_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -891,7 +892,7 @@ static void __init goni_sound_init(void)  static void __init goni_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	s5pv210_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  	s3c24xx_init_uarts(goni_uartcfgs, ARRAY_SIZE(goni_uartcfgs));  	s5p_set_timer_source(S5P_PWM3, S5P_PWM4); @@ -962,4 +963,5 @@ MACHINE_START(GONI, "GONI")  	.init_machine	= goni_machine_init,  	.timer		= &s5p_timer,  	.reserve	= &goni_reserve, +	.restart	= s5pv210_restart,  MACHINE_END diff --git a/arch/arm/mach-s5pv210/mach-smdkc110.c b/arch/arm/mach-s5pv210/mach-smdkc110.c index c2531ffc720..9405da4ae3a 100644 --- a/arch/arm/mach-s5pv210/mach-smdkc110.c +++ b/arch/arm/mach-s5pv210/mach-smdkc110.c @@ -25,7 +25,6 @@  #include <mach/regs-clock.h>  #include <plat/regs-serial.h> -#include <plat/s5pv210.h>  #include <plat/devs.h>  #include <plat/cpu.h>  #include <plat/ata.h> @@ -33,6 +32,8 @@  #include <plat/pm.h>  #include <plat/s5p-time.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define SMDKC110_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -110,7 +111,7 @@ static struct i2c_board_info smdkc110_i2c_devs2[] __initdata = {  static void __init smdkc110_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	s5pv210_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  	s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs));  	s5p_set_timer_source(S5P_PWM3, S5P_PWM4); @@ -143,4 +144,5 @@ MACHINE_START(SMDKC110, "SMDKC110")  	.map_io		= smdkc110_map_io,  	.init_machine	= smdkc110_machine_init,  	.timer		= &s5p_timer, +	.restart	= s5pv210_restart,  MACHINE_END diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c index 3ac9e57d970..cf4da739382 100644 --- a/arch/arm/mach-s5pv210/mach-smdkv210.c +++ b/arch/arm/mach-s5pv210/mach-smdkv210.c @@ -34,7 +34,6 @@  #include <plat/regs-serial.h>  #include <plat/regs-srom.h>  #include <plat/gpio-cfg.h> -#include <plat/s5pv210.h>  #include <plat/devs.h>  #include <plat/cpu.h>  #include <plat/adc.h> @@ -48,6 +47,8 @@  #include <plat/backlight.h>  #include <plat/regs-fb-v4.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define SMDKV210_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -279,7 +280,7 @@ static struct platform_pwm_backlight_data smdkv210_bl_data = {  static void __init smdkv210_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	s5pv210_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  	s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs));  	s5p_set_timer_source(S5P_PWM2, S5P_PWM4); @@ -321,4 +322,5 @@ MACHINE_START(SMDKV210, "SMDKV210")  	.map_io		= smdkv210_map_io,  	.init_machine	= smdkv210_machine_init,  	.timer		= &s5p_timer, +	.restart	= s5pv210_restart,  MACHINE_END diff --git a/arch/arm/mach-s5pv210/mach-torbreck.c b/arch/arm/mach-s5pv210/mach-torbreck.c index df70fcb3451..74e99bc0dc9 100644 --- a/arch/arm/mach-s5pv210/mach-torbreck.c +++ b/arch/arm/mach-s5pv210/mach-torbreck.c @@ -24,12 +24,13 @@  #include <mach/regs-clock.h>  #include <plat/regs-serial.h> -#include <plat/s5pv210.h>  #include <plat/devs.h>  #include <plat/cpu.h>  #include <plat/iic.h>  #include <plat/s5p-time.h> +#include "common.h" +  /* Following are default values for UCON, ULCON and UFCON UART registers */  #define TORBRECK_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\  				 S3C2410_UCON_RXILEVEL |	\ @@ -103,7 +104,7 @@ static struct i2c_board_info torbreck_i2c_devs2[] __initdata = {  static void __init torbreck_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	s5pv210_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  	s3c24xx_init_uarts(torbreck_uartcfgs, ARRAY_SIZE(torbreck_uartcfgs));  	s5p_set_timer_source(S5P_PWM3, S5P_PWM4); @@ -132,4 +133,5 @@ MACHINE_START(TORBRECK, "TORBRECK")  	.map_io		= torbreck_map_io,  	.init_machine	= torbreck_machine_init,  	.timer		= &s5p_timer, +	.restart	= s5pv210_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index 3dd133f1841..6b93e200bca 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c @@ -455,4 +455,5 @@ MACHINE_START(ASSABET, "Intel-Assabet")  #ifdef CONFIG_SA1111  	.dma_zone_size	= SZ_1M,  #endif +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/badge4.c b/arch/arm/mach-sa1100/badge4.c index bda83e1ab07..b07a2c024cb 100644 --- a/arch/arm/mach-sa1100/badge4.c +++ b/arch/arm/mach-sa1100/badge4.c @@ -309,4 +309,5 @@ MACHINE_START(BADGE4, "Hewlett-Packard Laboratories BadgePAD 4")  #ifdef CONFIG_SA1111  	.dma_zone_size	= SZ_1M,  #endif +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c index 7f3da4b11ec..11bb6d0b9be 100644 --- a/arch/arm/mach-sa1100/cerf.c +++ b/arch/arm/mach-sa1100/cerf.c @@ -139,4 +139,5 @@ MACHINE_START(CERF, "Intrinsyc CerfBoard/CerfCube")  	.init_irq	= cerf_init_irq,  	.timer		= &sa1100_timer,  	.init_machine	= cerf_init, +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index 2965cc9d424..b9060e236de 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c @@ -387,4 +387,5 @@ MACHINE_START(COLLIE, "Sharp-Collie")  	.init_irq	= sa1100_init_irq,  	.timer		= &sa1100_timer,  	.init_machine	= collie_init, +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index 5fa5ae1f39e..bb10ee2cb89 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c @@ -126,6 +126,17 @@ static void sa1100_power_off(void)  	PMCR = PMCR_SF;  } +void sa11x0_restart(char mode, const char *cmd) +{ +	if (mode == 's') { +		/* Jump into ROM at address 0 */ +		soft_restart(0); +	} else { +		/* Use on-chip reset capability */ +		RSRR = RSRR_SWR; +	} +} +  static void sa11x0_register_device(struct platform_device *dev, void *data)  {  	int err; diff --git a/arch/arm/mach-sa1100/generic.h b/arch/arm/mach-sa1100/generic.h index b7a9a601c2d..33268cf6be3 100644 --- a/arch/arm/mach-sa1100/generic.h +++ b/arch/arm/mach-sa1100/generic.h @@ -10,6 +10,7 @@ extern struct sys_timer sa1100_timer;  extern void __init sa1100_map_io(void);  extern void __init sa1100_init_irq(void);  extern void __init sa1100_init_gpio(void); +extern void sa11x0_restart(char, const char *);  #define SET_BANK(__nr,__start,__size) \  	mi->bank[__nr].start = (__start), \ diff --git a/arch/arm/mach-sa1100/h3100.c b/arch/arm/mach-sa1100/h3100.c index b30733a2b82..1e6b3c105ba 100644 --- a/arch/arm/mach-sa1100/h3100.c +++ b/arch/arm/mach-sa1100/h3100.c @@ -89,5 +89,6 @@ MACHINE_START(H3100, "Compaq iPAQ H3100")  	.init_irq	= sa1100_init_irq,  	.timer		= &sa1100_timer,  	.init_machine	= h3100_mach_init, +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/h3600.c b/arch/arm/mach-sa1100/h3600.c index 6fd324d9238..6b58e7460ec 100644 --- a/arch/arm/mach-sa1100/h3600.c +++ b/arch/arm/mach-sa1100/h3600.c @@ -130,5 +130,6 @@ MACHINE_START(H3600, "Compaq iPAQ H3600")  	.init_irq	= sa1100_init_irq,  	.timer		= &sa1100_timer,  	.init_machine	= h3600_mach_init, +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/hackkit.c b/arch/arm/mach-sa1100/hackkit.c index 30f4a551b8e..c01bb36db94 100644 --- a/arch/arm/mach-sa1100/hackkit.c +++ b/arch/arm/mach-sa1100/hackkit.c @@ -200,4 +200,5 @@ MACHINE_START(HACKKIT, "HackKit Cpu Board")  	.init_irq	= sa1100_init_irq,  	.timer		= &sa1100_timer,  	.init_machine	= hackkit_init, +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/include/mach/system.h b/arch/arm/mach-sa1100/include/mach/system.h index 345d35b7450..e17b208f76d 100644 --- a/arch/arm/mach-sa1100/include/mach/system.h +++ b/arch/arm/mach-sa1100/include/mach/system.h @@ -3,20 +3,7 @@   *   * Copyright (c) 1999 Nicolas Pitre <nico@fluxnic.net>   */ -#include <mach/hardware.h> -  static inline void arch_idle(void)  {  	cpu_do_idle();  } - -static inline void arch_reset(char mode, const char *cmd) -{ -	if (mode == 's') { -		/* Jump into ROM at address 0 */ -		soft_restart(0); -	} else { -		/* Use on-chip reset capability */ -		RSRR = RSRR_SWR; -	} -} diff --git a/arch/arm/mach-sa1100/jornada720.c b/arch/arm/mach-sa1100/jornada720.c index 77198fe02bc..ee121d6f048 100644 --- a/arch/arm/mach-sa1100/jornada720.c +++ b/arch/arm/mach-sa1100/jornada720.c @@ -373,4 +373,5 @@ MACHINE_START(JORNADA720, "HP Jornada 720")  #ifdef CONFIG_SA1111  	.dma_zone_size	= SZ_1M,  #endif +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/lart.c b/arch/arm/mach-sa1100/lart.c index 5bc59d0947b..af4e2761f3d 100644 --- a/arch/arm/mach-sa1100/lart.c +++ b/arch/arm/mach-sa1100/lart.c @@ -66,4 +66,5 @@ MACHINE_START(LART, "LART")  	.init_irq	= sa1100_init_irq,  	.init_machine	= lart_init,  	.timer		= &sa1100_timer, +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/nanoengine.c b/arch/arm/mach-sa1100/nanoengine.c index d480438579d..85f6ee67222 100644 --- a/arch/arm/mach-sa1100/nanoengine.c +++ b/arch/arm/mach-sa1100/nanoengine.c @@ -117,4 +117,5 @@ MACHINE_START(NANOENGINE, "BSE nanoEngine")  	.init_irq	= sa1100_init_irq,  	.timer		= &sa1100_timer,  	.init_machine	= nanoengine_init, +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/pleb.c b/arch/arm/mach-sa1100/pleb.c index 65161f2bea2..9307df05353 100644 --- a/arch/arm/mach-sa1100/pleb.c +++ b/arch/arm/mach-sa1100/pleb.c @@ -150,4 +150,5 @@ MACHINE_START(PLEB, "PLEB")  	.init_irq	= sa1100_init_irq,  	.timer		= &sa1100_timer,  	.init_machine   = pleb_init, +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c index 1cccbf5b9e9..318b2b766a0 100644 --- a/arch/arm/mach-sa1100/shannon.c +++ b/arch/arm/mach-sa1100/shannon.c @@ -87,4 +87,5 @@ MACHINE_START(SHANNON, "Shannon (AKA: Tuxscreen)")  	.init_irq	= sa1100_init_irq,  	.timer		= &sa1100_timer,  	.init_machine	= shannon_init, +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c index 4790f3f3d00..e17c04d6e32 100644 --- a/arch/arm/mach-sa1100/simpad.c +++ b/arch/arm/mach-sa1100/simpad.c @@ -396,4 +396,5 @@ MACHINE_START(SIMPAD, "Simpad")  	.map_io		= simpad_map_io,  	.init_irq	= sa1100_init_irq,  	.timer		= &sa1100_timer, +	.restart	= sa11x0_restart,  MACHINE_END diff --git a/arch/arm/mach-shark/core.c b/arch/arm/mach-shark/core.c index f4b25d875f3..a851c254ad6 100644 --- a/arch/arm/mach-shark/core.c +++ b/arch/arm/mach-shark/core.c @@ -26,7 +26,7 @@  #define ROMCARD_SIZE            0x08000000  #define ROMCARD_START           0x10000000 -void arch_reset(char mode, const char *cmd) +static void shark_restart(char mode, const char *cmd)  {          short temp;          /* Reset the Machine via pc[3] of the sequoia chipset */ @@ -156,4 +156,5 @@ MACHINE_START(SHARK, "Shark")  	.init_irq	= shark_init_irq,  	.timer		= &shark_timer,  	.dma_zone_size	= SZ_4M, +	.restart	= shark_restart,  MACHINE_END diff --git a/arch/arm/mach-shark/include/mach/system.h b/arch/arm/mach-shark/include/mach/system.h index 21c373b30bb..1b2f2c5050a 100644 --- a/arch/arm/mach-shark/include/mach/system.h +++ b/arch/arm/mach-shark/include/mach/system.h @@ -6,9 +6,6 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -/* Found in arch/mach-shark/core.c */ -extern void arch_reset(char mode, const char *cmd); -  static inline void arch_idle(void)  {  } diff --git a/arch/arm/mach-spear3xx/include/mach/generic.h b/arch/arm/mach-spear3xx/include/mach/generic.h index b8f31c3935f..14276e5a98d 100644 --- a/arch/arm/mach-spear3xx/include/mach/generic.h +++ b/arch/arm/mach-spear3xx/include/mach/generic.h @@ -42,6 +42,8 @@ void __init spear3xx_map_io(void);  void __init spear3xx_init_irq(void);  void __init spear3xx_init(void); +void spear_restart(char, const char *); +  /* pad mux declarations */  #define PMX_FIRDA_MASK		(1 << 14)  #define PMX_I2C_MASK		(1 << 13) diff --git a/arch/arm/mach-spear3xx/spear300_evb.c b/arch/arm/mach-spear3xx/spear300_evb.c index 61068ba6792..3462ab9d612 100644 --- a/arch/arm/mach-spear3xx/spear300_evb.c +++ b/arch/arm/mach-spear3xx/spear300_evb.c @@ -71,4 +71,5 @@ MACHINE_START(SPEAR300, "ST-SPEAR300-EVB")  	.handle_irq	=	vic_handle_irq,  	.timer		=	&spear3xx_timer,  	.init_machine	=	spear300_evb_init, +	.restart	=	spear_restart,  MACHINE_END diff --git a/arch/arm/mach-spear3xx/spear310_evb.c b/arch/arm/mach-spear3xx/spear310_evb.c index 7903abe92bf..f92c4993f65 100644 --- a/arch/arm/mach-spear3xx/spear310_evb.c +++ b/arch/arm/mach-spear3xx/spear310_evb.c @@ -77,4 +77,5 @@ MACHINE_START(SPEAR310, "ST-SPEAR310-EVB")  	.handle_irq	=	vic_handle_irq,  	.timer		=	&spear3xx_timer,  	.init_machine	=	spear310_evb_init, +	.restart	=	spear_restart,  MACHINE_END diff --git a/arch/arm/mach-spear3xx/spear320_evb.c b/arch/arm/mach-spear3xx/spear320_evb.c index e9751f97093..105334ab702 100644 --- a/arch/arm/mach-spear3xx/spear320_evb.c +++ b/arch/arm/mach-spear3xx/spear320_evb.c @@ -75,4 +75,5 @@ MACHINE_START(SPEAR320, "ST-SPEAR320-EVB")  	.handle_irq	=	vic_handle_irq,  	.timer		=	&spear3xx_timer,  	.init_machine	=	spear320_evb_init, +	.restart	=	spear_restart,  MACHINE_END diff --git a/arch/arm/mach-spear6xx/include/mach/generic.h b/arch/arm/mach-spear6xx/include/mach/generic.h index 183f0238c5e..116b99301cf 100644 --- a/arch/arm/mach-spear6xx/include/mach/generic.h +++ b/arch/arm/mach-spear6xx/include/mach/generic.h @@ -41,6 +41,8 @@ void __init spear6xx_init(void);  void __init spear600_init(void);  void __init spear6xx_clk_init(void); +void spear_restart(char, const char *); +  /* Add spear600 machine device structure declarations here */  #endif /* __MACH_GENERIC_H */ diff --git a/arch/arm/mach-spear6xx/spear600_evb.c b/arch/arm/mach-spear6xx/spear600_evb.c index ff139ed0a61..c6e4254741c 100644 --- a/arch/arm/mach-spear6xx/spear600_evb.c +++ b/arch/arm/mach-spear6xx/spear600_evb.c @@ -50,4 +50,5 @@ MACHINE_START(SPEAR600, "ST-SPEAR600-EVB")  	.handle_irq	=	vic_handle_irq,  	.timer		=	&spear6xx_timer,  	.init_machine	=	spear600_evb_init, +	.restart	=	spear_restart,  MACHINE_END diff --git a/arch/arm/mach-tcc8k/Kconfig b/arch/arm/mach-tcc8k/Kconfig deleted file mode 100644 index ad86415d157..00000000000 --- a/arch/arm/mach-tcc8k/Kconfig +++ /dev/null @@ -1,11 +0,0 @@ -if ARCH_TCC8K - -comment "TCC8000 systems:" - -config MACH_TCC8000_SDK -	bool "Telechips TCC8000-SDK development kit" -	default y -	help -	  Support for the Telechips TCC8000-SDK board. - -endif diff --git a/arch/arm/mach-tcc8k/Makefile b/arch/arm/mach-tcc8k/Makefile deleted file mode 100644 index 9bacf31e49b..00000000000 --- a/arch/arm/mach-tcc8k/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# -# Makefile for TCC8K boards and common files. -# - -# Common support -obj-y += clock.o irq.o time.o io.o devices.o - -# Board specific support -obj-$(CONFIG_MACH_TCC8000_SDK) += board-tcc8000-sdk.o diff --git a/arch/arm/mach-tcc8k/Makefile.boot b/arch/arm/mach-tcc8k/Makefile.boot deleted file mode 100644 index 5e02d4156b0..00000000000 --- a/arch/arm/mach-tcc8k/Makefile.boot +++ /dev/null @@ -1,3 +0,0 @@ -   zreladdr-y		+= 0x20008000 -params_phys-y		:= 0x20000100 -initrd_phys-y		:= 0x20800000 diff --git a/arch/arm/mach-tcc8k/board-tcc8000-sdk.c b/arch/arm/mach-tcc8k/board-tcc8000-sdk.c deleted file mode 100644 index 777a5bb9eed..00000000000 --- a/arch/arm/mach-tcc8k/board-tcc8000-sdk.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2009 Hans J. Koch <hjk@linutronix.de> - * - * 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. - */ - -#include <linux/delay.h> -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/platform_device.h> - -#include <asm/mach-types.h> - -#include <asm/mach/arch.h> -#include <asm/mach/map.h> -#include <asm/mach/time.h> - -#include <mach/clock.h> -#include <mach/tcc-nand.h> -#include <mach/tcc8k-regs.h> - -#include "common.h" - -#define XI_FREQUENCY	12000000 -#define XTI_FREQUENCY	32768 - -#ifdef CONFIG_MTD_NAND_TCC -/* NAND */ -static struct tcc_nand_platform_data tcc8k_sdk_nand_data = { -	.width = 1, -	.hw_ecc = 0, -}; -#endif - -static void __init tcc8k_init(void) -{ -#ifdef CONFIG_MTD_NAND_TCC -	tcc_nand_device.dev.platform_data = &tcc8k_sdk_nand_data; -	platform_device_register(&tcc_nand_device); -#endif -} - -static void __init tcc8k_init_timer(void) -{ -	tcc_clocks_init(XI_FREQUENCY, XTI_FREQUENCY); -} - -static struct sys_timer tcc8k_timer = { -	.init	= tcc8k_init_timer, -}; - -static void __init tcc8k_map_io(void) -{ -	tcc8k_map_common_io(); - -	/* set PLL0 clock to 96MHz, adapt UART0 divisor */ -	__raw_writel(0x00026003, CKC_BASE + PLL0CFG_OFFS); -	__raw_writel(0x10000001, CKC_BASE + ACLKUART0_OFFS); - -	/* set PLL1 clock to 192MHz */ -	__raw_writel(0x00016003, CKC_BASE + PLL1CFG_OFFS); - -	/* set PLL2 clock to 48MHz */ -	__raw_writel(0x00036003, CKC_BASE + PLL2CFG_OFFS); - -	/* with CPU freq higher than 150 MHz, need extra DTCM wait */ -	__raw_writel(0x00000001, SCFG_BASE + DTCMWAIT_OFFS); - -	/* PLL locking time as specified */ -	udelay(300); -} - -MACHINE_START(TCC8000_SDK, "Telechips TCC8000-SDK Demo Board") -	.atag_offset	= 0x100, -	.map_io		= tcc8k_map_io, -	.init_irq	= tcc8k_init_irq, -	.init_machine	= tcc8k_init, -	.timer		= &tcc8k_timer, -MACHINE_END diff --git a/arch/arm/mach-tcc8k/clock.c b/arch/arm/mach-tcc8k/clock.c deleted file mode 100644 index e7cdae5c77a..00000000000 --- a/arch/arm/mach-tcc8k/clock.c +++ /dev/null @@ -1,580 +0,0 @@ -/* - * Lowlevel clock handling for Telechips TCC8xxx SoCs - * - * Copyright (C) 2010 by Hans J. Koch <hjk@linutronix.de> - * - * Licensed under the terms of the GPL v2 - */ - -#include <linux/clk.h> -#include <linux/delay.h> -#include <linux/err.h> -#include <linux/io.h> -#include <linux/module.h> -#include <linux/spinlock.h> -#include <linux/clkdev.h> - -#include <mach/clock.h> -#include <mach/irqs.h> -#include <mach/tcc8k-regs.h> - -#include "common.h" - -#define BCLKCTR0	(CKC_BASE + BCLKCTR0_OFFS) -#define BCLKCTR1	(CKC_BASE + BCLKCTR1_OFFS) - -#define ACLKREF		(CKC_BASE + ACLKREF_OFFS) -#define ACLKUART0	(CKC_BASE + ACLKUART0_OFFS) -#define ACLKUART1	(CKC_BASE + ACLKUART1_OFFS) -#define ACLKUART2	(CKC_BASE + ACLKUART2_OFFS) -#define ACLKUART3	(CKC_BASE + ACLKUART3_OFFS) -#define ACLKUART4	(CKC_BASE + ACLKUART4_OFFS) -#define ACLKI2C		(CKC_BASE + ACLKI2C_OFFS) -#define ACLKADC		(CKC_BASE + ACLKADC_OFFS) -#define ACLKUSBH	(CKC_BASE + ACLKUSBH_OFFS) -#define ACLKLCD		(CKC_BASE + ACLKLCD_OFFS) -#define ACLKSDH0	(CKC_BASE + ACLKSDH0_OFFS) -#define ACLKSDH1	(CKC_BASE + ACLKSDH1_OFFS) -#define ACLKSPI0	(CKC_BASE + ACLKSPI0_OFFS) -#define ACLKSPI1	(CKC_BASE + ACLKSPI1_OFFS) -#define ACLKSPDIF	(CKC_BASE + ACLKSPDIF_OFFS) -#define ACLKC3DEC	(CKC_BASE + ACLKC3DEC_OFFS) -#define ACLKCAN0	(CKC_BASE + ACLKCAN0_OFFS) -#define ACLKCAN1	(CKC_BASE + ACLKCAN1_OFFS) -#define ACLKGSB0	(CKC_BASE + ACLKGSB0_OFFS) -#define ACLKGSB1	(CKC_BASE + ACLKGSB1_OFFS) -#define ACLKGSB2	(CKC_BASE + ACLKGSB2_OFFS) -#define ACLKGSB3	(CKC_BASE + ACLKGSB3_OFFS) -#define ACLKTCT		(CKC_BASE + ACLKTCT_OFFS) -#define ACLKTCX		(CKC_BASE + ACLKTCX_OFFS) -#define ACLKTCZ		(CKC_BASE + ACLKTCZ_OFFS) - -#define ACLK_MAX_DIV	(0xfff + 1) - -/* Crystal frequencies */ -static unsigned long xi_rate, xti_rate; - -static void __iomem *pll_cfg_addr(int pll) -{ -	switch (pll) { -	case 0: return (CKC_BASE + PLL0CFG_OFFS); -	case 1: return (CKC_BASE + PLL1CFG_OFFS); -	case 2: return (CKC_BASE + PLL2CFG_OFFS); -	default: -		BUG(); -	} -} - -static int pll_enable(int pll, int enable) -{ -	u32 reg; -	void __iomem *addr = pll_cfg_addr(pll); - -	reg = __raw_readl(addr); -	if (enable) -		reg &= ~PLLxCFG_PD; -	else -		reg |= PLLxCFG_PD; - -	__raw_writel(reg, addr); -	return 0; -} - -static int xi_enable(int enable) -{ -	u32 reg; - -	reg = __raw_readl(CKC_BASE + CLKCTRL_OFFS); -	if (enable) -		reg |= CLKCTRL_XE; -	else -		reg &= ~CLKCTRL_XE; - -	__raw_writel(reg, CKC_BASE + CLKCTRL_OFFS); -	return 0; -} - -static int root_clk_enable(enum root_clks src) -{ -	switch (src) { -	case CLK_SRC_PLL0: return pll_enable(0, 1); -	case CLK_SRC_PLL1: return pll_enable(1, 1); -	case CLK_SRC_PLL2: return pll_enable(2, 1); -	case CLK_SRC_XI: return xi_enable(1); -	default: -		BUG(); -	} -	return 0; -} - -static int root_clk_disable(enum root_clks src) -{ -	switch (src) { -	case CLK_SRC_PLL0: return pll_enable(0, 0); -	case CLK_SRC_PLL1: return pll_enable(1, 0); -	case CLK_SRC_PLL2: return pll_enable(2, 0); -	case CLK_SRC_XI: return xi_enable(0); -	default: -		BUG(); -	} -	return 0; -} - -static int enable_clk(struct clk *clk) -{ -	u32 reg; - -	if (clk->root_id != CLK_SRC_NOROOT) -		return root_clk_enable(clk->root_id); - -	if (clk->aclkreg) { -		reg = __raw_readl(clk->aclkreg); -		reg |= ACLK_EN; -		__raw_writel(reg, clk->aclkreg); -	} -	if (clk->bclkctr) { -		reg = __raw_readl(clk->bclkctr); -		reg |= 1 << clk->bclk_shift; -		__raw_writel(reg, clk->bclkctr); -	} -	return 0; -} - -static void disable_clk(struct clk *clk) -{ -	u32 reg; - -	if (clk->root_id != CLK_SRC_NOROOT) { -		root_clk_disable(clk->root_id); -		return; -	} - -	if (clk->bclkctr) { -		reg = __raw_readl(clk->bclkctr); -		reg &= ~(1 << clk->bclk_shift); -		__raw_writel(reg, clk->bclkctr); -	} -	if (clk->aclkreg) { -		reg = __raw_readl(clk->aclkreg); -		reg &= ~ACLK_EN; -		__raw_writel(reg, clk->aclkreg); -	} -} - -static unsigned long get_rate_pll(int pll) -{ -	u32 reg; -	unsigned long s, m, p; -	void __iomem *addr = pll_cfg_addr(pll); - -	reg = __raw_readl(addr); -	s = (reg >> 16) & 0x07; -	m = (reg >> 8) & 0xff; -	p = reg & 0x3f; - -	return (m * xi_rate) / (p * (1 << s)); -} - -static unsigned long get_rate_pll_div(int pll) -{ -	u32 reg; -	unsigned long div = 0; -	void __iomem *addr; - -	switch (pll) { -	case 0: -		addr = CKC_BASE + CLKDIVC0_OFFS; -		reg = __raw_readl(addr); -		if (reg & CLKDIVC0_P0E) -			div = (reg >> 24) & 0x3f; -		break; -	case 1: -		addr = CKC_BASE + CLKDIVC0_OFFS; -		reg = __raw_readl(addr); -		if (reg & CLKDIVC0_P1E) -			div = (reg >> 16) & 0x3f; -		break; -	case 2: -		addr = CKC_BASE + CLKDIVC1_OFFS; -		reg = __raw_readl(addr); -		if (reg & CLKDIVC1_P2E) -			div = reg & 0x3f; -		break; -	} -	return get_rate_pll(pll) / (div + 1); -} - -static unsigned long get_rate_xi_div(void) -{ -	unsigned long div = 0; -	u32 reg = __raw_readl(CKC_BASE + CLKDIVC0_OFFS); - -	if (reg & CLKDIVC0_XE) -		div = (reg >> 8) & 0x3f; - -	return xi_rate / (div + 1); -} - -static unsigned long get_rate_xti_div(void) -{ -	unsigned long div = 0; -	u32 reg = __raw_readl(CKC_BASE + CLKDIVC0_OFFS); - -	if (reg & CLKDIVC0_XTE) -		div = reg & 0x3f; - -	return xti_rate / (div + 1); -} - -static unsigned long root_clk_get_rate(enum root_clks src) -{ -	switch (src) { -	case CLK_SRC_PLL0: return get_rate_pll(0); -	case CLK_SRC_PLL1: return get_rate_pll(1); -	case CLK_SRC_PLL2: return get_rate_pll(2); -	case CLK_SRC_PLL0DIV: return get_rate_pll_div(0); -	case CLK_SRC_PLL1DIV: return get_rate_pll_div(1); -	case CLK_SRC_PLL2DIV: return get_rate_pll_div(2); -	case CLK_SRC_XI: return xi_rate; -	case CLK_SRC_XTI: return xti_rate; -	case CLK_SRC_XIDIV: return get_rate_xi_div(); -	case CLK_SRC_XTIDIV: return get_rate_xti_div(); -	default: return 0; -	} -} - -static unsigned long aclk_get_rate(struct clk *clk) -{ -	u32 reg; -	unsigned long div; -	unsigned int src; - -	reg = __raw_readl(clk->aclkreg); -	div = reg & 0x0fff; -	src = (reg >> ACLK_SEL_SHIFT) & CLK_SRC_MASK; -	return root_clk_get_rate(src) / (div + 1); -} - -static unsigned long aclk_best_div(struct clk *clk, unsigned long rate) -{ -	unsigned long div, src, freq, r1, r2; - -	if (!rate) -		return ACLK_MAX_DIV; - -	src = __raw_readl(clk->aclkreg) >> ACLK_SEL_SHIFT; -	src &= CLK_SRC_MASK; -	freq = root_clk_get_rate(src); -	div = freq / rate; -	if (!div) -		return 1; -	if (div >= ACLK_MAX_DIV) -		return ACLK_MAX_DIV; -	r1 = freq / div; -	r2 = freq / (div + 1); -	if ((rate - r2) < (r1 - rate)) -		return div + 1; - -	return div; -} - -static unsigned long aclk_round_rate(struct clk *clk, unsigned long rate) -{ -	unsigned int src; - -	src = __raw_readl(clk->aclkreg) >> ACLK_SEL_SHIFT; -	src &= CLK_SRC_MASK; - -	return root_clk_get_rate(src) / aclk_best_div(clk, rate); -} - -static int aclk_set_rate(struct clk *clk, unsigned long rate) -{ -	u32 reg; - -	reg = __raw_readl(clk->aclkreg) & ~ACLK_DIV_MASK; -	reg |= aclk_best_div(clk, rate) - 1; -	__raw_writel(reg, clk->aclkreg); -	return 0; -} - -static unsigned long get_rate_sys(struct clk *clk) -{ -	unsigned int src; - -	src = __raw_readl(CKC_BASE + CLKCTRL_OFFS) & CLK_SRC_MASK; -	return root_clk_get_rate(src); -} - -static unsigned long get_rate_bus(struct clk *clk) -{ -	unsigned int reg, sdiv, bdiv, rate; - -	reg = __raw_readl(CKC_BASE + CLKCTRL_OFFS); -	rate = get_rate_sys(clk); -	sdiv = (reg >> 20) & 3; -	if (sdiv) -		rate /= sdiv + 1; -	bdiv = (reg >> 4) & 0xff; -	if (bdiv) -		rate /= bdiv + 1; -	return rate; -} - -static unsigned long get_rate_cpu(struct clk *clk) -{ -	unsigned int reg, div, fsys, fbus; - -	fbus = get_rate_bus(clk); -	reg = __raw_readl(CKC_BASE + CLKCTRL_OFFS); -	if (reg & (1 << 29)) -		return fbus; -	fsys = get_rate_sys(clk); -	div = (reg >> 16) & 0x0f; -	return fbus + ((fsys - fbus) * (div + 1)) / 16; -} - -static unsigned long get_rate_root(struct clk *clk) -{ -	return root_clk_get_rate(clk->root_id); -} - -static int aclk_set_parent(struct clk *clock, struct clk *parent) -{ -	u32 reg; - -	if (clock->parent == parent) -		return 0; - -	clock->parent = parent; - -	if (!parent) -		return 0; - -	if (parent->root_id == CLK_SRC_NOROOT) -		return 0; -	reg = __raw_readl(clock->aclkreg); -	reg &= ~ACLK_SEL_MASK; -	reg |= (parent->root_id << ACLK_SEL_SHIFT) & ACLK_SEL_MASK; -	__raw_writel(reg, clock->aclkreg); - -	return 0; -} - -#define DEFINE_ROOT_CLOCK(name, ri, p)	\ -	static struct clk name = {		\ -		.root_id = ri,			\ -		.get_rate = get_rate_root,			\ -		.enable = enable_clk,		\ -		.disable = disable_clk,		\ -		.parent = p,			\ -	}; - -#define DEFINE_SPECIAL_CLOCK(name, gr, p)	\ -	static struct clk name = {		\ -		.root_id = CLK_SRC_NOROOT,	\ -		.get_rate = gr,			\ -		.parent = p,			\ -	}; - -#define DEFINE_ACLOCK(name, bc, bs, ar)		\ -	static struct clk name = {		\ -		.root_id = CLK_SRC_NOROOT,	\ -		.bclkctr = bc,			\ -		.bclk_shift = bs,		\ -		.aclkreg = ar,			\ -		.get_rate = aclk_get_rate,	\ -		.set_rate = aclk_set_rate,	\ -		.round_rate = aclk_round_rate,	\ -		.enable = enable_clk,		\ -		.disable = disable_clk,		\ -		.set_parent = aclk_set_parent,	\ -	}; - -#define DEFINE_BCLOCK(name, bc, bs, gr, p)	\ -	static struct clk name = {		\ -		.root_id = CLK_SRC_NOROOT,	\ -		.bclkctr = bc,			\ -		.bclk_shift = bs,		\ -		.get_rate = gr,			\ -		.enable = enable_clk,		\ -		.disable = disable_clk,		\ -		.parent = p,			\ -	}; - -DEFINE_ROOT_CLOCK(xi, CLK_SRC_XI, NULL) -DEFINE_ROOT_CLOCK(xti, CLK_SRC_XTI, NULL) -DEFINE_ROOT_CLOCK(xidiv, CLK_SRC_XIDIV, &xi) -DEFINE_ROOT_CLOCK(xtidiv, CLK_SRC_XTIDIV, &xti) -DEFINE_ROOT_CLOCK(pll0, CLK_SRC_PLL0, &xi) -DEFINE_ROOT_CLOCK(pll1, CLK_SRC_PLL1, &xi) -DEFINE_ROOT_CLOCK(pll2, CLK_SRC_PLL2, &xi) -DEFINE_ROOT_CLOCK(pll0div, CLK_SRC_PLL0DIV, &pll0) -DEFINE_ROOT_CLOCK(pll1div, CLK_SRC_PLL1DIV, &pll1) -DEFINE_ROOT_CLOCK(pll2div, CLK_SRC_PLL2DIV, &pll2) - -/* The following 3 clocks are special and are initialized explicitly later */ -DEFINE_SPECIAL_CLOCK(sys, get_rate_sys, NULL) -DEFINE_SPECIAL_CLOCK(bus, get_rate_bus, &sys) -DEFINE_SPECIAL_CLOCK(cpu, get_rate_cpu, &sys) - -DEFINE_ACLOCK(tct, NULL, 0, ACLKTCT) -DEFINE_ACLOCK(tcx, NULL, 0, ACLKTCX) -DEFINE_ACLOCK(tcz, NULL, 0, ACLKTCZ) -DEFINE_ACLOCK(ref, NULL, 0, ACLKREF) -DEFINE_ACLOCK(uart0, BCLKCTR0, 5, ACLKUART0) -DEFINE_ACLOCK(uart1, BCLKCTR0, 23, ACLKUART1) -DEFINE_ACLOCK(uart2, BCLKCTR0, 6, ACLKUART2) -DEFINE_ACLOCK(uart3, BCLKCTR0, 8, ACLKUART3) -DEFINE_ACLOCK(uart4, BCLKCTR1, 6, ACLKUART4) -DEFINE_ACLOCK(i2c, BCLKCTR0, 7, ACLKI2C) -DEFINE_ACLOCK(adc, BCLKCTR0, 10, ACLKADC) -DEFINE_ACLOCK(usbh0, BCLKCTR0, 11, ACLKUSBH) -DEFINE_ACLOCK(lcd, BCLKCTR0, 13, ACLKLCD) -DEFINE_ACLOCK(sd0, BCLKCTR0, 17, ACLKSDH0) -DEFINE_ACLOCK(sd1, BCLKCTR1, 5, ACLKSDH1) -DEFINE_ACLOCK(spi0, BCLKCTR0, 24, ACLKSPI0) -DEFINE_ACLOCK(spi1, BCLKCTR0, 30, ACLKSPI1) -DEFINE_ACLOCK(spdif, BCLKCTR1, 2, ACLKSPDIF) -DEFINE_ACLOCK(c3dec, BCLKCTR1, 9, ACLKC3DEC) -DEFINE_ACLOCK(can0, BCLKCTR1, 10, ACLKCAN0) -DEFINE_ACLOCK(can1, BCLKCTR1, 11, ACLKCAN1) -DEFINE_ACLOCK(gsb0, BCLKCTR1, 13, ACLKGSB0) -DEFINE_ACLOCK(gsb1, BCLKCTR1, 14, ACLKGSB1) -DEFINE_ACLOCK(gsb2, BCLKCTR1, 15, ACLKGSB2) -DEFINE_ACLOCK(gsb3, BCLKCTR1, 16, ACLKGSB3) -DEFINE_ACLOCK(usbh1, BCLKCTR1, 20, ACLKUSBH) - -DEFINE_BCLOCK(dai0, BCLKCTR0, 0, NULL, NULL) -DEFINE_BCLOCK(pic, BCLKCTR0, 1, NULL, NULL) -DEFINE_BCLOCK(tc, BCLKCTR0, 2, NULL, NULL) -DEFINE_BCLOCK(gpio, BCLKCTR0, 3, NULL, NULL) -DEFINE_BCLOCK(usbd, BCLKCTR0, 4, NULL, NULL) -DEFINE_BCLOCK(ecc, BCLKCTR0, 9, NULL, NULL) -DEFINE_BCLOCK(gdma0, BCLKCTR0, 12, NULL, NULL) -DEFINE_BCLOCK(rtc, BCLKCTR0, 15, NULL, NULL) -DEFINE_BCLOCK(nfc, BCLKCTR0, 16, NULL, NULL) -DEFINE_BCLOCK(g2d, BCLKCTR0, 18, NULL, NULL) -DEFINE_BCLOCK(gdma1, BCLKCTR0, 22, NULL, NULL) -DEFINE_BCLOCK(mscl, BCLKCTR0, 25, NULL, NULL) -DEFINE_BCLOCK(bdma, BCLKCTR1, 0, NULL, NULL) -DEFINE_BCLOCK(adma0, BCLKCTR1, 1, NULL, NULL) -DEFINE_BCLOCK(scfg, BCLKCTR1, 3, NULL, NULL) -DEFINE_BCLOCK(cid, BCLKCTR1, 4, NULL, NULL) -DEFINE_BCLOCK(dai1, BCLKCTR1, 7, NULL, NULL) -DEFINE_BCLOCK(adma1, BCLKCTR1, 8, NULL, NULL) -DEFINE_BCLOCK(gps, BCLKCTR1, 12, NULL, NULL) -DEFINE_BCLOCK(gdma2, BCLKCTR1, 17, NULL, NULL) -DEFINE_BCLOCK(gdma3, BCLKCTR1, 18, NULL, NULL) -DEFINE_BCLOCK(ddrc, BCLKCTR1, 19, NULL, NULL) - -#define _REGISTER_CLOCK(d, n, c) \ -	{ \ -		.dev_id = d, \ -		.con_id = n, \ -		.clk = &c, \ -	}, - -static struct clk_lookup lookups[] = { -	_REGISTER_CLOCK(NULL, "bus", bus) -	_REGISTER_CLOCK(NULL, "cpu", cpu) -	_REGISTER_CLOCK(NULL, "tct", tct) -	_REGISTER_CLOCK(NULL, "tcx", tcx) -	_REGISTER_CLOCK(NULL, "tcz", tcz) -	_REGISTER_CLOCK(NULL, "ref", ref) -	_REGISTER_CLOCK(NULL, "dai0", dai0) -	_REGISTER_CLOCK(NULL, "pic", pic) -	_REGISTER_CLOCK(NULL, "tc", tc) -	_REGISTER_CLOCK(NULL, "gpio", gpio) -	_REGISTER_CLOCK(NULL, "usbd", usbd) -	_REGISTER_CLOCK("tcc-uart.0", NULL, uart0) -	_REGISTER_CLOCK("tcc-uart.2", NULL, uart2) -	_REGISTER_CLOCK("tcc-i2c", NULL, i2c) -	_REGISTER_CLOCK("tcc-uart.3", NULL, uart3) -	_REGISTER_CLOCK(NULL, "ecc", ecc) -	_REGISTER_CLOCK(NULL, "adc", adc) -	_REGISTER_CLOCK("tcc-usbh.0", "usb", usbh0) -	_REGISTER_CLOCK(NULL, "gdma0", gdma0) -	_REGISTER_CLOCK(NULL, "lcd", lcd) -	_REGISTER_CLOCK(NULL, "rtc", rtc) -	_REGISTER_CLOCK(NULL, "nfc", nfc) -	_REGISTER_CLOCK("tcc-mmc.0", NULL, sd0) -	_REGISTER_CLOCK(NULL, "g2d", g2d) -	_REGISTER_CLOCK(NULL, "gdma1", gdma1) -	_REGISTER_CLOCK("tcc-uart.1", NULL, uart1) -	_REGISTER_CLOCK("tcc-spi.0", NULL, spi0) -	_REGISTER_CLOCK(NULL, "mscl", mscl) -	_REGISTER_CLOCK("tcc-spi.1", NULL, spi1) -	_REGISTER_CLOCK(NULL, "bdma", bdma) -	_REGISTER_CLOCK(NULL, "adma0", adma0) -	_REGISTER_CLOCK(NULL, "spdif", spdif) -	_REGISTER_CLOCK(NULL, "scfg", scfg) -	_REGISTER_CLOCK(NULL, "cid", cid) -	_REGISTER_CLOCK("tcc-mmc.1", NULL, sd1) -	_REGISTER_CLOCK("tcc-uart.4", NULL, uart4) -	_REGISTER_CLOCK(NULL, "dai1", dai1) -	_REGISTER_CLOCK(NULL, "adma1", adma1) -	_REGISTER_CLOCK(NULL, "c3dec", c3dec) -	_REGISTER_CLOCK("tcc-can.0", NULL, can0) -	_REGISTER_CLOCK("tcc-can.1", NULL, can1) -	_REGISTER_CLOCK(NULL, "gps", gps) -	_REGISTER_CLOCK("tcc-gsb.0", NULL, gsb0) -	_REGISTER_CLOCK("tcc-gsb.1", NULL, gsb1) -	_REGISTER_CLOCK("tcc-gsb.2", NULL, gsb2) -	_REGISTER_CLOCK("tcc-gsb.3", NULL, gsb3) -	_REGISTER_CLOCK(NULL, "gdma2", gdma2) -	_REGISTER_CLOCK(NULL, "gdma3", gdma3) -	_REGISTER_CLOCK(NULL, "ddrc", ddrc) -	_REGISTER_CLOCK("tcc-usbh.1", "usb", usbh1) -}; - -static struct clk *root_clk_by_index(enum root_clks src) -{ -	switch (src) { -	case CLK_SRC_PLL0: return &pll0; -	case CLK_SRC_PLL1: return &pll1; -	case CLK_SRC_PLL2: return &pll2; -	case CLK_SRC_PLL0DIV: return &pll0div; -	case CLK_SRC_PLL1DIV: return &pll1div; -	case CLK_SRC_PLL2DIV: return &pll2div; -	case CLK_SRC_XI: return ξ -	case CLK_SRC_XTI: return &xti; -	case CLK_SRC_XIDIV: return &xidiv; -	case CLK_SRC_XTIDIV: return &xtidiv; -	default: return NULL; -	} -} - -static void find_aclk_parent(struct clk *clk) -{ -	unsigned int src; -	struct clk *clock; - -	if (!clk->aclkreg) -		return; - -	src = __raw_readl(clk->aclkreg) >> ACLK_SEL_SHIFT; -	src &= CLK_SRC_MASK; - -	clock = root_clk_by_index(src); -	if (!clock) -		return; - -	clk->parent = clock; -	clk->set_parent = aclk_set_parent; -} - -void __init tcc_clocks_init(unsigned long xi_freq, unsigned long xti_freq) -{ -	int i; - -	xi_rate = xi_freq; -	xti_rate = xti_freq; - -	/* fixup parents and add the clock */ -	for (i = 0; i < ARRAY_SIZE(lookups); i++) { -		find_aclk_parent(lookups[i].clk); -		clkdev_add(&lookups[i]); -	} -	tcc8k_timer_init(&tcz, (void __iomem *)TIMER_BASE, INT_TC32); -} diff --git a/arch/arm/mach-tcc8k/common.h b/arch/arm/mach-tcc8k/common.h deleted file mode 100644 index 705690add39..00000000000 --- a/arch/arm/mach-tcc8k/common.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef MACH_TCC8K_COMMON_H -#define MACH_TCC8K_COMMON_H - -#include <linux/platform_device.h> - -extern struct platform_device tcc_nand_device; - -struct clk; - -extern void tcc_clocks_init(unsigned long xi_freq, unsigned long xti_freq); -extern void tcc8k_timer_init(struct clk *clock, void __iomem *base, int irq); -extern void tcc8k_init_irq(void); -extern void tcc8k_map_common_io(void); - -#endif diff --git a/arch/arm/mach-tcc8k/devices.c b/arch/arm/mach-tcc8k/devices.c deleted file mode 100644 index 6722ad7c283..00000000000 --- a/arch/arm/mach-tcc8k/devices.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - * linux/arch/arm/mach-tcc8k/devices.c - * - * Copyright (C) Telechips, Inc. - * Copyright (C) 2009 Hans J. Koch <hjk@linutronix.de> - * - * Licensed under the terms of GPL v2. - * - */ - -#include <linux/dma-mapping.h> -#include <linux/init.h> -#include <linux/io.h> -#include <linux/kernel.h> -#include <linux/module.h> - -#include <asm/mach/map.h> - -#include <mach/tcc8k-regs.h> -#include <mach/irqs.h> - -#include "common.h" - -static u64 tcc8k_dmamask = DMA_BIT_MASK(32); - -#ifdef CONFIG_MTD_NAND_TCC -/* NAND controller */ -static struct resource tcc_nand_resources[] = { -	{ -		.start	= (resource_size_t)NFC_BASE, -		.end	= (resource_size_t)NFC_BASE + 0x7f, -		.flags	= IORESOURCE_MEM, -	}, { -		.start	= INT_NFC, -		.end	= INT_NFC, -		.flags	= IORESOURCE_IRQ, -	}, -}; - -struct platform_device tcc_nand_device = { -	.name = "tcc_nand", -	.id = 0, -	.num_resources = ARRAY_SIZE(tcc_nand_resources), -	.resource = tcc_nand_resources, -}; -#endif - -#ifdef CONFIG_MMC_TCC8K -/* MMC controller */ -static struct resource tcc8k_mmc0_resource[] = { -	{ -		.start = INT_SD0, -		.end   = INT_SD0, -		.flags = IORESOURCE_IRQ, -	}, -}; - -static struct resource tcc8k_mmc1_resource[] = { -	{ -		.start = INT_SD1, -		.end   = INT_SD1, -		.flags = IORESOURCE_IRQ, -	}, -}; - -struct platform_device tcc8k_mmc0_device = { -	.name		= "tcc-mmc", -	.id		= 0, -	.num_resources	= ARRAY_SIZE(tcc8k_mmc0_resource), -	.resource	= tcc8k_mmc0_resource, -	.dev		= { -		.dma_mask		= &tcc8k_dmamask, -		.coherent_dma_mask	= DMA_BIT_MASK(32), -	} -}; - -struct platform_device tcc8k_mmc1_device = { -	.name		= "tcc-mmc", -	.id		= 1, -	.num_resources	= ARRAY_SIZE(tcc8k_mmc1_resource), -	.resource	= tcc8k_mmc1_resource, -	.dev		= { -		.dma_mask		= &tcc8k_dmamask, -		.coherent_dma_mask	= DMA_BIT_MASK(32), -	} -}; - -static inline void tcc8k_init_mmc(void) -{ -	u32 reg = __raw_readl(GPIOPS_BASE + GPIOPS_FS1_OFFS); - -	reg |= GPIOPS_FS1_SDH0_BITS | GPIOPS_FS1_SDH1_BITS; -	__raw_writel(reg, GPIOPS_BASE + GPIOPS_FS1_OFFS); - -	platform_device_register(&tcc8k_mmc0_device); -	platform_device_register(&tcc8k_mmc1_device); -} -#else -static inline void tcc8k_init_mmc(void) { } -#endif - -#ifdef CONFIG_USB_OHCI_HCD -static int tcc8k_ohci_init(struct device *dev) -{ -	u32 reg; - -	/* Use GPIO PK19 as VBUS control output */ -	reg = __raw_readl(GPIOPK_BASE + GPIOPK_FS0_OFFS); -	reg &= ~(1 << 19); -	__raw_writel(reg, GPIOPK_BASE + GPIOPK_FS0_OFFS); -	reg = __raw_readl(GPIOPK_BASE + GPIOPK_FS1_OFFS); -	reg &= ~(1 << 19); -	__raw_writel(reg, GPIOPK_BASE + GPIOPK_FS1_OFFS); - -	reg = __raw_readl(GPIOPK_BASE + GPIOPK_DOE_OFFS); -	reg |= (1 << 19); -	__raw_writel(reg, GPIOPK_BASE + GPIOPK_DOE_OFFS); -	/* Turn on VBUS */ -	reg = __raw_readl(GPIOPK_BASE + GPIOPK_DAT_OFFS); -	reg |= (1 << 19); -	__raw_writel(reg, GPIOPK_BASE + GPIOPK_DAT_OFFS); - -	return 0; -} - -static struct resource tcc8k_ohci0_resources[] = { -	[0] = { -		.start = (resource_size_t)USBH0_BASE, -		.end   = (resource_size_t)USBH0_BASE + 0x5c, -		.flags = IORESOURCE_MEM, -	}, -	[1] = { -		.start = INT_USBH0, -		.end   = INT_USBH0, -		.flags = IORESOURCE_IRQ, -	} -}; - -static struct resource tcc8k_ohci1_resources[] = { -	[0] = { -		.start = (resource_size_t)USBH1_BASE, -		.end   = (resource_size_t)USBH1_BASE + 0x5c, -		.flags = IORESOURCE_MEM, -	}, -	[1] = { -		.start = INT_USBH1, -		.end   = INT_USBH1, -		.flags = IORESOURCE_IRQ, -	} -}; - -static struct tccohci_platform_data tcc8k_ohci0_platform_data = { -	.controller	= 0, -	.port_mode	= PMM_PERPORT_MODE, -	.init		= tcc8k_ohci_init, -}; - -static struct tccohci_platform_data tcc8k_ohci1_platform_data = { -	.controller	= 1, -	.port_mode	= PMM_PERPORT_MODE, -	.init		= tcc8k_ohci_init, -}; - -static struct platform_device ohci0_device = { -	.name = "tcc-ohci", -	.id = 0, -	.dev = { -		.dma_mask = &tcc8k_dmamask, -		.coherent_dma_mask = DMA_BIT_MASK(32), -		.platform_data = &tcc8k_ohci0_platform_data, -	}, -	.num_resources  = ARRAY_SIZE(tcc8k_ohci0_resources), -	.resource       = tcc8k_ohci0_resources, -}; - -static struct platform_device ohci1_device = { -	.name = "tcc-ohci", -	.id = 1, -	.dev = { -		.dma_mask = &tcc8k_dmamask, -		.coherent_dma_mask = DMA_BIT_MASK(32), -		.platform_data = &tcc8k_ohci1_platform_data, -	}, -	.num_resources  = ARRAY_SIZE(tcc8k_ohci1_resources), -	.resource       = tcc8k_ohci1_resources, -}; - -static void __init tcc8k_init_usbhost(void) -{ -	platform_device_register(&ohci0_device); -	platform_device_register(&ohci1_device); -} -#else -static void __init tcc8k_init_usbhost(void) { } -#endif - -/* USB device controller*/ -#ifdef CONFIG_USB_GADGET_TCC8K -static struct resource udc_resources[] = { -	[0] = { -		.start = INT_USBD, -		.end   = INT_USBD, -		.flags = IORESOURCE_IRQ, -	}, -	[1] = { -		.start = INT_UDMA, -		.end   = INT_UDMA, -		.flags = IORESOURCE_IRQ, -	}, -}; - -static struct platform_device tcc8k_udc_device = { -	.name = "tcc-udc", -	.id = 0, -	.resource = udc_resources, -	.num_resources = ARRAY_SIZE(udc_resources), -	.dev = { -		 .dma_mask = &tcc8k_dmamask, -		 .coherent_dma_mask = DMA_BIT_MASK(32), -	}, -}; - -static void __init tcc8k_init_usb_gadget(void) -{ -	platform_device_register(&tcc8k_udc_device); -} -#else -static void __init tcc8k_init_usb_gadget(void) { } -#endif	/* CONFIG_USB_GADGET_TCC83X */ - -static int __init tcc8k_init_devices(void) -{ -	tcc8k_init_mmc(); -	tcc8k_init_usbhost(); -	tcc8k_init_usb_gadget(); -	return 0; -} - -arch_initcall(tcc8k_init_devices); diff --git a/arch/arm/mach-tcc8k/io.c b/arch/arm/mach-tcc8k/io.c deleted file mode 100644 index 9b39d7fa658..00000000000 --- a/arch/arm/mach-tcc8k/io.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * linux/arch/arm/mach-tcc8k/io.c - * - * (C) 2009 Hans J. Koch <hjk@linutronix.de> - * - * derived from TCC83xx io.c - * Copyright (C) Telechips, Inc. - * - * 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. - */ - -#include <linux/init.h> -#include <linux/io.h> -#include <linux/kernel.h> - -#include <asm/mach/map.h> - -#include <mach/tcc8k-regs.h> - -/* - * The machine specific code may provide the extra mapping besides the - * default mapping provided here. - */ -static struct map_desc tcc8k_io_desc[] __initdata = { -	{ -		.virtual	= (unsigned long)CS1_BASE_VIRT, -		.pfn		= __phys_to_pfn(CS1_BASE), -		.length		= CS1_SIZE, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)AHB_PERI_BASE_VIRT, -		.pfn		= __phys_to_pfn(AHB_PERI_BASE), -		.length		= AHB_PERI_SIZE, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)APB0_PERI_BASE_VIRT, -		.pfn		= __phys_to_pfn(APB0_PERI_BASE), -		.length		= APB0_PERI_SIZE, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)APB1_PERI_BASE_VIRT, -		.pfn		= __phys_to_pfn(APB1_PERI_BASE), -		.length		= APB1_PERI_SIZE, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)EXT_MEM_CTRL_BASE_VIRT, -		.pfn		= __phys_to_pfn(EXT_MEM_CTRL_BASE), -		.length		= EXT_MEM_CTRL_SIZE, -		.type		= MT_DEVICE, -	}, -}; - -/* - * Maps common IO regions for tcc8k. - * - */ -void __init tcc8k_map_common_io(void) -{ -	iotable_init(tcc8k_io_desc, ARRAY_SIZE(tcc8k_io_desc)); -} diff --git a/arch/arm/mach-tcc8k/irq.c b/arch/arm/mach-tcc8k/irq.c deleted file mode 100644 index 209fa5c65d4..00000000000 --- a/arch/arm/mach-tcc8k/irq.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) Telechips, Inc. - * Copyright (C) 2009-2010 Hans J. Koch <hjk@linutronix.de> - * - * Licensed under the terms of the GNU GPL version 2. - */ - -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/io.h> - -#include <asm/irq.h> -#include <asm/mach/irq.h> - -#include <mach/tcc8k-regs.h> -#include <mach/irqs.h> - -#include "common.h" - -/* Disable IRQ */ -static void tcc8000_mask_ack_irq0(struct irq_data *d) -{ -	PIC0_IEN &= ~(1 << d->irq); -	PIC0_CREQ |=  (1 << d->irq); -} - -static void tcc8000_mask_ack_irq1(struct irq_data *d) -{ -	PIC1_IEN &= ~(1 << (d->irq - 32)); -	PIC1_CREQ |= (1 << (d->irq - 32)); -} - -static void tcc8000_mask_irq0(struct irq_data *d) -{ -	PIC0_IEN &= ~(1 << d->irq); -} - -static void tcc8000_mask_irq1(struct irq_data *d) -{ -	PIC1_IEN &= ~(1 << (d->irq - 32)); -} - -static void tcc8000_ack_irq0(struct irq_data *d) -{ -	PIC0_CREQ |=  (1 << d->irq); -} - -static void tcc8000_ack_irq1(struct irq_data *d) -{ -	PIC1_CREQ |= (1 << (d->irq - 32)); -} - -/* Enable IRQ */ -static void tcc8000_unmask_irq0(struct irq_data *d) -{ -	PIC0_IEN |= (1 << d->irq); -	PIC0_INTOEN |= (1 << d->irq); -} - -static void tcc8000_unmask_irq1(struct irq_data *d) -{ -	PIC1_IEN |= (1 << (d->irq - 32)); -	PIC1_INTOEN |= (1 << (d->irq - 32)); -} - -static struct irq_chip tcc8000_irq_chip0 = { -	.name		= "tcc_irq0", -	.irq_mask	= tcc8000_mask_irq0, -	.irq_ack	= tcc8000_ack_irq0, -	.irq_mask_ack	= tcc8000_mask_ack_irq0, -	.irq_unmask	= tcc8000_unmask_irq0, -}; - -static struct irq_chip tcc8000_irq_chip1 = { -	.name		= "tcc_irq1", -	.irq_mask	= tcc8000_mask_irq1, -	.irq_ack	= tcc8000_ack_irq1, -	.irq_mask_ack	= tcc8000_mask_ack_irq1, -	.irq_unmask	= tcc8000_unmask_irq1, -}; - -void __init tcc8k_init_irq(void) -{ -	int irqno; - -	/* Mask and clear all interrupts */ -	PIC0_IEN = 0x00000000; -	PIC0_CREQ = 0xffffffff; -	PIC1_IEN = 0x00000000; -	PIC1_CREQ = 0xffffffff; - -	PIC0_MEN0 = 0x00000003; -	PIC1_MEN1 = 0x00000003; -	PIC1_MEN = 0x00000003; - -	/* let all IRQs be level triggered */ -	PIC0_TMODE = 0xffffffff; -	PIC1_TMODE = 0xffffffff; -	/* all IRQs are IRQs (not FIQs) */ -	PIC0_IRQSEL = 0xffffffff; -	PIC1_IRQSEL = 0xffffffff; - -	for (irqno = 0; irqno < NR_IRQS; irqno++) { -		if (irqno < 32) -			irq_set_chip(irqno, &tcc8000_irq_chip0); -		else -			irq_set_chip(irqno, &tcc8000_irq_chip1); -		irq_set_handler(irqno, handle_level_irq); -		set_irq_flags(irqno, IRQF_VALID); -	} -} diff --git a/arch/arm/mach-tcc8k/time.c b/arch/arm/mach-tcc8k/time.c deleted file mode 100644 index a96babe8377..00000000000 --- a/arch/arm/mach-tcc8k/time.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - * TCC8000 system timer setup - * - * (C) 2009 Hans J. Koch <hjk@linutronix.de> - * - * Licensed under the terms of the GPL version 2. - * - */ - -#include <linux/clk.h> -#include <linux/clockchips.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/io.h> -#include <linux/irq.h> -#include <linux/kernel.h> -#include <linux/spinlock.h> - -#include <asm/mach/time.h> - -#include <mach/tcc8k-regs.h> -#include <mach/irqs.h> - -#include "common.h" - -static void __iomem *timer_base; - -static int tcc_set_next_event(unsigned long evt, -			      struct clock_event_device *unused) -{ -	unsigned long reg = __raw_readl(timer_base + TC32MCNT_OFFS); - -	__raw_writel(reg + evt, timer_base + TC32CMP0_OFFS); -	return 0; -} - -static void tcc_set_mode(enum clock_event_mode mode, -				struct clock_event_device *evt) -{ -	unsigned long tc32irq; - -	switch (mode) { -	case CLOCK_EVT_MODE_ONESHOT: -		tc32irq = __raw_readl(timer_base + TC32IRQ_OFFS); -		tc32irq |= TC32IRQ_IRQEN0; -		__raw_writel(tc32irq, timer_base + TC32IRQ_OFFS); -		break; -	case CLOCK_EVT_MODE_SHUTDOWN: -	case CLOCK_EVT_MODE_UNUSED: -		tc32irq = __raw_readl(timer_base + TC32IRQ_OFFS); -		tc32irq &= ~TC32IRQ_IRQEN0; -		__raw_writel(tc32irq, timer_base + TC32IRQ_OFFS); -		break; -	case CLOCK_EVT_MODE_PERIODIC: -	case CLOCK_EVT_MODE_RESUME: -		break; -	} -} - -static irqreturn_t tcc8k_timer_interrupt(int irq, void *dev_id) -{ -	struct clock_event_device *evt = dev_id; - -	/* Acknowledge TC32 interrupt by reading TC32IRQ */ -	__raw_readl(timer_base + TC32IRQ_OFFS); - -	evt->event_handler(evt); - -	return IRQ_HANDLED; -} - -static struct clock_event_device clockevent_tcc = { -	.name		= "tcc_timer1", -	.features	= CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 32, -	.set_mode	= tcc_set_mode, -	.set_next_event	= tcc_set_next_event, -	.rating		= 200, -}; - -static struct irqaction tcc8k_timer_irq = { -	.name		= "TC32_timer", -	.flags		= IRQF_DISABLED | IRQF_TIMER, -	.handler	= tcc8k_timer_interrupt, -	.dev_id		= &clockevent_tcc, -}; - -static int __init tcc_clockevent_init(struct clk *clock) -{ -	unsigned int c = clk_get_rate(clock); - -	clocksource_mmio_init(timer_base + TC32MCNT_OFFS, "tcc_tc32", c, -		200, 32, clocksource_mmio_readl_up); - -	clockevent_tcc.mult = div_sc(c, NSEC_PER_SEC, -					clockevent_tcc.shift); -	clockevent_tcc.max_delta_ns = -			clockevent_delta2ns(0xfffffffe, &clockevent_tcc); -	clockevent_tcc.min_delta_ns = -			clockevent_delta2ns(0xff, &clockevent_tcc); - -	clockevent_tcc.cpumask = cpumask_of(0); - -	clockevents_register_device(&clockevent_tcc); - -	return 0; -} - -void __init tcc8k_timer_init(struct clk *clock, void __iomem *base, int irq) -{ -	u32 reg; - -	timer_base = base; -	tcc8k_timer_irq.irq = irq; - -	/* Enable clocks */ -	clk_enable(clock); - -	/* Initialize 32-bit timer */ -	reg = __raw_readl(timer_base + TC32EN_OFFS); -	reg &= ~TC32EN_ENABLE; /* Disable timer */ -	__raw_writel(reg, timer_base + TC32EN_OFFS); -	/* Free running timer, counting from 0 to 0xffffffff */ -	__raw_writel(0, timer_base + TC32EN_OFFS); -	__raw_writel(0, timer_base + TC32LDV_OFFS); -	reg = __raw_readl(timer_base + TC32IRQ_OFFS); -	reg |= TC32IRQ_IRQEN0; /* irq at match with CMP0 */ -	__raw_writel(reg, timer_base + TC32IRQ_OFFS); - -	__raw_writel(TC32EN_ENABLE, timer_base + TC32EN_OFFS); - -	tcc_clockevent_init(clock); -	setup_irq(irq, &tcc8k_timer_irq); -} diff --git a/arch/arm/mach-tegra/board-dt.c b/arch/arm/mach-tegra/board-dt.c index f6f03ce340f..e417a8383db 100644 --- a/arch/arm/mach-tegra/board-dt.c +++ b/arch/arm/mach-tegra/board-dt.c @@ -134,5 +134,6 @@ DT_MACHINE_START(TEGRA_DT, "nVidia Tegra (Flattened Device Tree)")  	.handle_irq	= gic_handle_irq,  	.timer		= &tegra_timer,  	.init_machine	= tegra_dt_init, +	.restart	= tegra_assert_system_reset,  	.dt_compat	= tegra_dt_board_compat,  MACHINE_END diff --git a/arch/arm/mach-tegra/board-harmony.c b/arch/arm/mach-tegra/board-harmony.c index fd190a8dc66..70ee674131f 100644 --- a/arch/arm/mach-tegra/board-harmony.c +++ b/arch/arm/mach-tegra/board-harmony.c @@ -191,4 +191,5 @@ MACHINE_START(HARMONY, "harmony")  	.handle_irq	= gic_handle_irq,  	.timer          = &tegra_timer,  	.init_machine   = tegra_harmony_init, +	.restart	= tegra_assert_system_reset,  MACHINE_END diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c index 0b7e1cfee70..33d6205ad30 100644 --- a/arch/arm/mach-tegra/board-paz00.c +++ b/arch/arm/mach-tegra/board-paz00.c @@ -194,4 +194,5 @@ MACHINE_START(PAZ00, "Toshiba AC100 / Dynabook AZ")  	.handle_irq	= gic_handle_irq,  	.timer          = &tegra_timer,  	.init_machine   = tegra_paz00_init, +	.restart	= tegra_assert_system_reset,  MACHINE_END diff --git a/arch/arm/mach-tegra/board-seaboard.c b/arch/arm/mach-tegra/board-seaboard.c index 7328379b135..c1599eb8e0c 100644 --- a/arch/arm/mach-tegra/board-seaboard.c +++ b/arch/arm/mach-tegra/board-seaboard.c @@ -288,6 +288,7 @@ MACHINE_START(SEABOARD, "seaboard")  	.handle_irq	= gic_handle_irq,  	.timer          = &tegra_timer,  	.init_machine   = tegra_seaboard_init, +	.restart	= tegra_assert_system_reset,  MACHINE_END  MACHINE_START(KAEN, "kaen") @@ -298,6 +299,7 @@ MACHINE_START(KAEN, "kaen")  	.handle_irq	= gic_handle_irq,  	.timer          = &tegra_timer,  	.init_machine   = tegra_kaen_init, +	.restart	= tegra_assert_system_reset,  MACHINE_END  MACHINE_START(WARIO, "wario") @@ -308,4 +310,5 @@ MACHINE_START(WARIO, "wario")  	.handle_irq	= gic_handle_irq,  	.timer          = &tegra_timer,  	.init_machine   = tegra_wario_init, +	.restart	= tegra_assert_system_reset,  MACHINE_END diff --git a/arch/arm/mach-tegra/board-trimslice.c b/arch/arm/mach-tegra/board-trimslice.c index 60a36a2e0be..c242314a1db 100644 --- a/arch/arm/mach-tegra/board-trimslice.c +++ b/arch/arm/mach-tegra/board-trimslice.c @@ -180,4 +180,5 @@ MACHINE_START(TRIMSLICE, "trimslice")  	.handle_irq	= gic_handle_irq,  	.timer          = &tegra_timer,  	.init_machine   = tegra_trimslice_init, +	.restart	= tegra_assert_system_reset,  MACHINE_END diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 690b888be50..20f396d740f 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c @@ -31,8 +31,6 @@  #include "clock.h"  #include "fuse.h" -void (*arch_reset)(char mode, const char *cmd) = tegra_assert_system_reset; -  void tegra_assert_system_reset(char mode, const char *cmd)  {  	void __iomem *reset = IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x04); diff --git a/arch/arm/mach-tegra/include/mach/system.h b/arch/arm/mach-tegra/include/mach/system.h index 027c4215d31..a312988bf6f 100644 --- a/arch/arm/mach-tegra/include/mach/system.h +++ b/arch/arm/mach-tegra/include/mach/system.h @@ -21,10 +21,6 @@  #ifndef __MACH_TEGRA_SYSTEM_H  #define __MACH_TEGRA_SYSTEM_H -#include <mach/iomap.h> - -extern void (*arch_reset)(char mode, const char *cmd); -  static inline void arch_idle(void)  {  } diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c index ac0791e924b..697930761b3 100644 --- a/arch/arm/mach-u300/core.c +++ b/arch/arm/mach-u300/core.c @@ -1888,3 +1888,23 @@ static int core_module_init(void)  	return mmc_init(&mmcsd_device);  }  module_init(core_module_init); + +/* Forward declare this function from the watchdog */ +void coh901327_watchdog_reset(void); + +void u300_restart(char mode, const char *cmd) +{ +	switch (mode) { +	case 's': +	case 'h': +#ifdef CONFIG_COH901327_WATCHDOG +		coh901327_watchdog_reset(); +#endif +		break; +	default: +		/* Do nothing */ +		break; +	} +	/* Wait for system do die/reset. */ +	while (1); +} diff --git a/arch/arm/mach-u300/include/mach/platform.h b/arch/arm/mach-u300/include/mach/platform.h index 77d9210a82e..096333f32fc 100644 --- a/arch/arm/mach-u300/include/mach/platform.h +++ b/arch/arm/mach-u300/include/mach/platform.h @@ -14,6 +14,7 @@  void u300_map_io(void);  void u300_init_irq(void);  void u300_init_devices(void); +void u300_restart(char, const char *);  extern struct sys_timer u300_timer;  #endif diff --git a/arch/arm/mach-u300/include/mach/system.h b/arch/arm/mach-u300/include/mach/system.h index 6b6fef7a438..574d46e3829 100644 --- a/arch/arm/mach-u300/include/mach/system.h +++ b/arch/arm/mach-u300/include/mach/system.h @@ -8,33 +8,7 @@   * System shutdown and reset functions.   * Author: Linus Walleij <linus.walleij@stericsson.com>   */ -#include <mach/hardware.h> -#include <asm/io.h> -#include <asm/hardware/vic.h> -#include <asm/irq.h> - -/* Forward declare this function from the watchdog */ -void coh901327_watchdog_reset(void); -  static inline void arch_idle(void)  {  	cpu_do_idle();  } - -static void arch_reset(char mode, const char *cmd) -{ -	switch (mode) { -	case 's': -	case 'h': -		printk(KERN_CRIT "RESET: shutting down/rebooting system\n"); -#ifdef CONFIG_COH901327_WATCHDOG -		coh901327_watchdog_reset(); -#endif -		break; -	default: -		/* Do nothing */ -		break; -	} -	/* Wait for system do die/reset. */ -	while (1); -} diff --git a/arch/arm/mach-u300/u300.c b/arch/arm/mach-u300/u300.c index 4a4fd334eb6..def45bda293 100644 --- a/arch/arm/mach-u300/u300.c +++ b/arch/arm/mach-u300/u300.c @@ -53,4 +53,5 @@ MACHINE_START(U300, MACH_U300_STRING)  	.handle_irq	= vic_handle_irq,  	.timer		= &u300_timer,  	.init_machine	= u300_init_machine, +	.restart	= u300_restart,  MACHINE_END diff --git a/arch/arm/mach-ux500/include/mach/system.h b/arch/arm/mach-ux500/include/mach/system.h index c0cd8006f1a..258e5c919c2 100644 --- a/arch/arm/mach-ux500/include/mach/system.h +++ b/arch/arm/mach-ux500/include/mach/system.h @@ -17,9 +17,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	/* yet to be implemented - TODO */ -} -  #endif diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index 4d8dfc15f3e..cbcda61162d 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c @@ -740,6 +740,19 @@ static void versatile_leds_event(led_event_t ledevt)  }  #endif	/* CONFIG_LEDS */ +void versatile_restart(char mode, const char *cmd) +{ +	void __iomem *sys = __io_address(VERSATILE_SYS_BASE); +	u32 val; + +	val = __raw_readl(sys + VERSATILE_SYS_RESETCTL_OFFSET); +	val |= 0x105; + +	__raw_writel(0xa05f, sys + VERSATILE_SYS_LOCK_OFFSET); +	__raw_writel(val, sys + VERSATILE_SYS_RESETCTL_OFFSET); +	__raw_writel(0, sys + VERSATILE_SYS_LOCK_OFFSET); +} +  /* Early initializations */  void __init versatile_init_early(void)  { diff --git a/arch/arm/mach-versatile/core.h b/arch/arm/mach-versatile/core.h index e01422700eb..2ef2f555f31 100644 --- a/arch/arm/mach-versatile/core.h +++ b/arch/arm/mach-versatile/core.h @@ -30,6 +30,7 @@ extern void __init versatile_init_early(void);  extern void __init versatile_init_irq(void);  extern void __init versatile_map_io(void);  extern struct sys_timer versatile_timer; +extern void versatile_restart(char, const char *);  extern unsigned int mmc_status(struct device *dev);  #ifdef CONFIG_OF  extern struct of_dev_auxdata versatile_auxdata_lookup[]; diff --git a/arch/arm/mach-versatile/include/mach/system.h b/arch/arm/mach-versatile/include/mach/system.h index 8ffc12a7cb2..f3fa347895f 100644 --- a/arch/arm/mach-versatile/include/mach/system.h +++ b/arch/arm/mach-versatile/include/mach/system.h @@ -21,10 +21,6 @@  #ifndef __ASM_ARCH_SYSTEM_H  #define __ASM_ARCH_SYSTEM_H -#include <linux/io.h> -#include <mach/hardware.h> -#include <mach/platform.h> -  static inline void arch_idle(void)  {  	/* @@ -34,16 +30,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	u32 val; - -	val = __raw_readl(IO_ADDRESS(VERSATILE_SYS_RESETCTL)) & ~0x7; -	val |= 0x105; - -	__raw_writel(0xa05f, IO_ADDRESS(VERSATILE_SYS_LOCK)); -	__raw_writel(val, IO_ADDRESS(VERSATILE_SYS_RESETCTL)); -	__raw_writel(0, IO_ADDRESS(VERSATILE_SYS_LOCK)); -} -  #endif diff --git a/arch/arm/mach-versatile/versatile_ab.c b/arch/arm/mach-versatile/versatile_ab.c index c83a1f379f7..63b8dd2b9f4 100644 --- a/arch/arm/mach-versatile/versatile_ab.c +++ b/arch/arm/mach-versatile/versatile_ab.c @@ -43,4 +43,5 @@ MACHINE_START(VERSATILE_AB, "ARM-Versatile AB")  	.handle_irq	= vic_handle_irq,  	.timer		= &versatile_timer,  	.init_machine	= versatile_init, +	.restart	= versatile_restart,  MACHINE_END diff --git a/arch/arm/mach-versatile/versatile_dt.c b/arch/arm/mach-versatile/versatile_dt.c index f4d1e0f072c..ae5ad3c8f3d 100644 --- a/arch/arm/mach-versatile/versatile_dt.c +++ b/arch/arm/mach-versatile/versatile_dt.c @@ -50,4 +50,5 @@ DT_MACHINE_START(VERSATILE_PB, "ARM-Versatile (Device Tree Support)")  	.timer		= &versatile_timer,  	.init_machine	= versatile_dt_init,  	.dt_compat	= versatile_dt_match, +	.restart	= versatile_restart,  MACHINE_END diff --git a/arch/arm/mach-versatile/versatile_pb.c b/arch/arm/mach-versatile/versatile_pb.c index 4d31eeb6c10..7aab79b665e 100644 --- a/arch/arm/mach-versatile/versatile_pb.c +++ b/arch/arm/mach-versatile/versatile_pb.c @@ -111,4 +111,5 @@ MACHINE_START(VERSATILE_PB, "ARM-Versatile PB")  	.handle_irq	= vic_handle_irq,  	.timer		= &versatile_timer,  	.init_machine	= versatile_pb_init, +	.restart	= versatile_restart,  MACHINE_END diff --git a/arch/arm/mach-vexpress/include/mach/system.h b/arch/arm/mach-vexpress/include/mach/system.h index 899a4e628a4..f653a8e265b 100644 --- a/arch/arm/mach-vexpress/include/mach/system.h +++ b/arch/arm/mach-vexpress/include/mach/system.h @@ -30,8 +30,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -} -  #endif diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 7aa07a8ce23..6dd10e320ef 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c @@ -438,7 +438,6 @@ static void __init v2m_init(void)  		amba_device_register(v2m_amba_devs[i], &iomem_resource);  	pm_power_off = v2m_power_off; -	arm_pm_restart = v2m_restart;  	ct_desc->init_tile();  } @@ -451,4 +450,5 @@ MACHINE_START(VEXPRESS, "ARM-Versatile Express")  	.timer		= &v2m_timer,  	.handle_irq	= gic_handle_irq,  	.init_machine	= v2m_init, +	.restart	= v2m_restart,  MACHINE_END diff --git a/arch/arm/mach-w90x900/cpu.c b/arch/arm/mach-w90x900/cpu.c index 0a235e50233..604e1db266e 100644 --- a/arch/arm/mach-w90x900/cpu.c +++ b/arch/arm/mach-w90x900/cpu.c @@ -33,9 +33,11 @@  #include <mach/regs-serial.h>  #include <mach/regs-clock.h>  #include <mach/regs-ebi.h> +#include <mach/regs-timer.h>  #include "cpu.h"  #include "clock.h" +#include "nuc9xx.h"  /* Initial IO mappings */ @@ -222,3 +224,17 @@ void __init nuc900_init_clocks(void)  	clkdev_add_table(nuc900_clkregs, ARRAY_SIZE(nuc900_clkregs));  } +#define	WTCR	(TMR_BA + 0x1C) +#define	WTCLK	(1 << 10) +#define	WTE	(1 << 7) +#define	WTRE	(1 << 1) + +void nuc9xx_restart(char mode, const char *cmd) +{ +	if (mode == 's') { +		/* Jump into ROM at address 0 */ +		soft_restart(0); +	} else { +		__raw_writel(WTE | WTRE | WTCLK, WTCR); +	} +} diff --git a/arch/arm/mach-w90x900/include/mach/system.h b/arch/arm/mach-w90x900/include/mach/system.h index 68875a1c16b..2aaeb931161 100644 --- a/arch/arm/mach-w90x900/include/mach/system.h +++ b/arch/arm/mach-w90x900/include/mach/system.h @@ -14,28 +14,6 @@   * (at your option) any later version.   *   */ - -#include <linux/io.h> -#include <asm/proc-fns.h> -#include <mach/map.h> -#include <mach/regs-timer.h> - -#define	WTCR	(TMR_BA + 0x1C) -#define	WTCLK	(1 << 10) -#define	WTE	(1 << 7) -#define	WTRE	(1 << 1) -  static void arch_idle(void)  {  } - -static void arch_reset(char mode, const char *cmd) -{ -	if (mode == 's') { -		/* Jump into ROM at address 0 */ -		soft_restart(0); -	} else { -		__raw_writel(WTE | WTRE | WTCLK, WTCR); -	} -} - diff --git a/arch/arm/mach-w90x900/mach-nuc910evb.c b/arch/arm/mach-w90x900/mach-nuc910evb.c index 31c10901822..b4243e4f156 100644 --- a/arch/arm/mach-w90x900/mach-nuc910evb.c +++ b/arch/arm/mach-w90x900/mach-nuc910evb.c @@ -38,4 +38,5 @@ MACHINE_START(W90P910EVB, "W90P910EVB")  	.init_irq	= nuc900_init_irq,  	.init_machine	= nuc910evb_init,  	.timer		= &nuc900_timer, +	.restart	= nuc9xx_restart,  MACHINE_END diff --git a/arch/arm/mach-w90x900/mach-nuc950evb.c b/arch/arm/mach-w90x900/mach-nuc950evb.c index 4062e55a57d..067d8f9166d 100644 --- a/arch/arm/mach-w90x900/mach-nuc950evb.c +++ b/arch/arm/mach-w90x900/mach-nuc950evb.c @@ -41,4 +41,5 @@ MACHINE_START(W90P950EVB, "W90P950EVB")  	.init_irq	= nuc900_init_irq,  	.init_machine	= nuc950evb_init,  	.timer		= &nuc900_timer, +	.restart	= nuc9xx_restart,  MACHINE_END diff --git a/arch/arm/mach-w90x900/mach-nuc960evb.c b/arch/arm/mach-w90x900/mach-nuc960evb.c index 0ab9995d5b5..cbb3adc3db1 100644 --- a/arch/arm/mach-w90x900/mach-nuc960evb.c +++ b/arch/arm/mach-w90x900/mach-nuc960evb.c @@ -38,4 +38,5 @@ MACHINE_START(W90N960EVB, "W90N960EVB")  	.init_irq	= nuc900_init_irq,  	.init_machine	= nuc960evb_init,  	.timer		= &nuc900_timer, +	.restart	= nuc9xx_restart,  MACHINE_END diff --git a/arch/arm/mach-w90x900/nuc9xx.h b/arch/arm/mach-w90x900/nuc9xx.h index 847c4f3e044..91acb404779 100644 --- a/arch/arm/mach-w90x900/nuc9xx.h +++ b/arch/arm/mach-w90x900/nuc9xx.h @@ -21,3 +21,4 @@ struct sys_timer;  extern void nuc900_init_irq(void);  extern struct sys_timer nuc900_timer; +extern void nuc9xx_restart(char, const char *); diff --git a/arch/arm/mach-zynq/include/mach/system.h b/arch/arm/mach-zynq/include/mach/system.h index 1b84d705c67..8e88e0b8d2b 100644 --- a/arch/arm/mach-zynq/include/mach/system.h +++ b/arch/arm/mach-zynq/include/mach/system.h @@ -20,9 +20,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	/* Add architecture specific reset processing here */ -} -  #endif diff --git a/arch/arm/plat-iop/Makefile b/arch/arm/plat-iop/Makefile index 90f7153a8d7..a99dc15a70f 100644 --- a/arch/arm/plat-iop/Makefile +++ b/arch/arm/plat-iop/Makefile @@ -13,6 +13,7 @@ obj-$(CONFIG_ARCH_IOP32X) += time.o  obj-$(CONFIG_ARCH_IOP32X) += cp6.o  obj-$(CONFIG_ARCH_IOP32X) += adma.o  obj-$(CONFIG_ARCH_IOP32X) += pmu.o +obj-$(CONFIG_ARCH_IOP32X) += restart.o  # IOP33X  obj-$(CONFIG_ARCH_IOP33X) += gpio.o @@ -23,6 +24,7 @@ obj-$(CONFIG_ARCH_IOP33X) += time.o  obj-$(CONFIG_ARCH_IOP33X) += cp6.o  obj-$(CONFIG_ARCH_IOP33X) += adma.o  obj-$(CONFIG_ARCH_IOP33X) += pmu.o +obj-$(CONFIG_ARCH_IOP33X) += restart.o  # IOP13XX  obj-$(CONFIG_ARCH_IOP13XX) += cp6.o diff --git a/arch/arm/plat-iop/restart.c b/arch/arm/plat-iop/restart.c new file mode 100644 index 00000000000..6a85a0c502e --- /dev/null +++ b/arch/arm/plat-iop/restart.c @@ -0,0 +1,19 @@ +/* + * restart.c + * + * Copyright (C) 2001 MontaVista Software, Inc. + * + * 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. + */ +#include <asm/hardware/iop3xx.h> +#include <mach/hardware.h> + +void iop3xx_restart(char mode, const char *cmd) +{ +	*IOP3XX_PCSR = 0x30; + +	/* Jump into ROM at address 0 */ +	soft_restart(0); +} diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index 6698cae942f..83cca9bcfc9 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h @@ -71,8 +71,8 @@ extern int mx6q_clocks_init(void);  extern struct platform_device *mxc_register_gpio(char *name, int id,  	resource_size_t iobase, resource_size_t iosize, int irq, int irq_high);  extern void mxc_set_cpu_type(unsigned int type); +extern void mxc_restart(char, const char *);  extern void mxc_arch_reset_init(void __iomem *); -extern void mx51_efikamx_reset(void);  extern int mx53_revision(void);  extern int mx53_display_revision(void); @@ -121,6 +121,7 @@ static inline void imx_smp_prepare(void) {}  extern void imx_enable_cpu(int cpu, bool enable);  extern void imx_set_cpu_jump(int cpu, void *jump_addr);  extern void imx_src_init(void); +extern void imx_src_prepare_restart(void);  extern void imx_gpc_init(void);  extern void imx_gpc_pre_suspend(void);  extern void imx_gpc_post_resume(void); diff --git a/arch/arm/plat-mxc/include/mach/system.h b/arch/arm/plat-mxc/include/mach/system.h index b9895d25016..13ad0df2e86 100644 --- a/arch/arm/plat-mxc/include/mach/system.h +++ b/arch/arm/plat-mxc/include/mach/system.h @@ -22,6 +22,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -void arch_reset(char mode, const char *cmd); -  #endif /* __ASM_ARCH_MXC_SYSTEM_H__ */ diff --git a/arch/arm/plat-mxc/system.c b/arch/arm/plat-mxc/system.c index 7e5c76ea446..3599bf2cfd4 100644 --- a/arch/arm/plat-mxc/system.c +++ b/arch/arm/plat-mxc/system.c @@ -37,17 +37,10 @@ static void __iomem *wdog_base;  /*   * Reset the system. It is called by machine_restart().   */ -void arch_reset(char mode, const char *cmd) +void mxc_restart(char mode, const char *cmd)  {  	unsigned int wcr_enable; -#ifdef CONFIG_MACH_MX51_EFIKAMX -	if (machine_is_mx51_efikamx()) { -		mx51_efikamx_reset(); -		return; -	} -#endif -  	if (cpu_is_mx1()) {  		wcr_enable = (1 << 0);  	} else { diff --git a/arch/arm/plat-omap/include/plat/system.h b/arch/arm/plat-omap/include/plat/system.h index c5fa9e92900..8e5ebd74b12 100644 --- a/arch/arm/plat-omap/include/plat/system.h +++ b/arch/arm/plat-omap/include/plat/system.h @@ -12,6 +12,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -extern void (*arch_reset)(char, const char *); -  #endif diff --git a/arch/arm/plat-s3c24xx/cpu.c b/arch/arm/plat-s3c24xx/cpu.c index 3c6335307fb..1121df13e15 100644 --- a/arch/arm/plat-s3c24xx/cpu.c +++ b/arch/arm/plat-s3c24xx/cpu.c @@ -192,27 +192,6 @@ static unsigned long s3c24xx_read_idcode_v4(void)  	return __raw_readl(S3C2410_GSTATUS1);  } -/* Hook for arm_pm_restart to ensure we execute the reset code - * with the caches enabled. It seems at least the S3C2440 has a problem - * resetting if there is bus activity interrupted by the reset. - */ -static void s3c24xx_pm_restart(char mode, const char *cmd) -{ -	if (mode != 's') { -		unsigned long flags; - -		local_irq_save(flags); -		__cpuc_flush_kern_all(); -		__cpuc_flush_user_all(); - -		arch_reset(mode, cmd); -		local_irq_restore(flags); -	} - -	/* fallback, or unhandled */ -	arm_machine_restart(mode, cmd); -} -  void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)  {  	/* initialise the io descriptors we need for initialisation */ @@ -226,7 +205,5 @@ void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)  	}  	s3c24xx_init_cpu(); -	arm_pm_restart = s3c24xx_pm_restart; -  	s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));  } diff --git a/arch/arm/plat-s5p/Makefile b/arch/arm/plat-s5p/Makefile index 876344038b8..30d8c3016e6 100644 --- a/arch/arm/plat-s5p/Makefile +++ b/arch/arm/plat-s5p/Makefile @@ -13,7 +13,6 @@ obj-				:=  # Core files  obj-y				+= dev-uart.o -obj-y				+= cpu.o  obj-y				+= clock.o  obj-y				+= irq.o  obj-$(CONFIG_S5P_EXT_INT)	+= irq-eint.o diff --git a/arch/arm/plat-s5p/cpu.c b/arch/arm/plat-s5p/cpu.c deleted file mode 100644 index a56959e8351..00000000000 --- a/arch/arm/plat-s5p/cpu.c +++ /dev/null @@ -1,144 +0,0 @@ -/* linux/arch/arm/plat-s5p/cpu.c - * - * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * S5P CPU Support - * - * 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. -*/ - -#include <linux/init.h> -#include <linux/module.h> - -#include <asm/mach/arch.h> -#include <asm/mach/map.h> - -#include <mach/map.h> -#include <mach/regs-clock.h> - -#include <plat/cpu.h> -#include <plat/s5p6440.h> -#include <plat/s5p6450.h> -#include <plat/s5pc100.h> -#include <plat/s5pv210.h> -#include <plat/exynos4.h> - -/* table of supported CPUs */ - -static const char name_s5p6440[] = "S5P6440"; -static const char name_s5p6450[] = "S5P6450"; -static const char name_s5pc100[] = "S5PC100"; -static const char name_s5pv210[] = "S5PV210/S5PC110"; -static const char name_exynos4210[] = "EXYNOS4210"; -static const char name_exynos4212[] = "EXYNOS4212"; -static const char name_exynos4412[] = "EXYNOS4412"; - -static struct cpu_table cpu_ids[] __initdata = { -	{ -		.idcode		= S5P6440_CPU_ID, -		.idmask		= S5P64XX_CPU_MASK, -		.map_io		= s5p6440_map_io, -		.init_clocks	= s5p6440_init_clocks, -		.init_uarts	= s5p6440_init_uarts, -		.init		= s5p64x0_init, -		.name		= name_s5p6440, -	}, { -		.idcode		= S5P6450_CPU_ID, -		.idmask		= S5P64XX_CPU_MASK, -		.map_io		= s5p6450_map_io, -		.init_clocks	= s5p6450_init_clocks, -		.init_uarts	= s5p6450_init_uarts, -		.init		= s5p64x0_init, -		.name		= name_s5p6450, -	}, { -		.idcode		= S5PC100_CPU_ID, -		.idmask		= S5PC100_CPU_MASK, -		.map_io		= s5pc100_map_io, -		.init_clocks	= s5pc100_init_clocks, -		.init_uarts	= s5pc100_init_uarts, -		.init		= s5pc100_init, -		.name		= name_s5pc100, -	}, { -		.idcode		= S5PV210_CPU_ID, -		.idmask		= S5PV210_CPU_MASK, -		.map_io		= s5pv210_map_io, -		.init_clocks	= s5pv210_init_clocks, -		.init_uarts	= s5pv210_init_uarts, -		.init		= s5pv210_init, -		.name		= name_s5pv210, -	}, { -		.idcode		= EXYNOS4210_CPU_ID, -		.idmask		= EXYNOS4_CPU_MASK, -		.map_io		= exynos4_map_io, -		.init_clocks	= exynos4_init_clocks, -		.init_uarts	= exynos4_init_uarts, -		.init		= exynos_init, -		.name		= name_exynos4210, -	}, { -		.idcode		= EXYNOS4212_CPU_ID, -		.idmask		= EXYNOS4_CPU_MASK, -		.map_io		= exynos4_map_io, -		.init_clocks	= exynos4_init_clocks, -		.init_uarts	= exynos4_init_uarts, -		.init		= exynos_init, -		.name		= name_exynos4212, -	}, { -		.idcode		= EXYNOS4412_CPU_ID, -		.idmask		= EXYNOS4_CPU_MASK, -		.map_io		= exynos4_map_io, -		.init_clocks	= exynos4_init_clocks, -		.init_uarts	= exynos4_init_uarts, -		.init		= exynos_init, -		.name		= name_exynos4412, -	}, -}; - -/* minimal IO mapping */ - -static struct map_desc s5p_iodesc[] __initdata = { -	{ -		.virtual	= (unsigned long)S5P_VA_CHIPID, -		.pfn		= __phys_to_pfn(S5P_PA_CHIPID), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C_VA_SYS, -		.pfn		= __phys_to_pfn(S5P_PA_SYSCON), -		.length		= SZ_64K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C_VA_TIMER, -		.pfn		= __phys_to_pfn(S5P_PA_TIMER), -		.length		= SZ_16K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S3C_VA_WATCHDOG, -		.pfn		= __phys_to_pfn(S3C_PA_WDT), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= (unsigned long)S5P_VA_SROMC, -		.pfn		= __phys_to_pfn(S5P_PA_SROMC), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, -}; - -/* read cpu identification code */ - -void __init s5p_init_io(struct map_desc *mach_desc, -			int size, void __iomem *cpuid_addr) -{ -	/* initialize the io descriptors we need for initialization */ -	iotable_init(s5p_iodesc, ARRAY_SIZE(s5p_iodesc)); -	if (mach_desc) -		iotable_init(mach_desc, size); - -	/* detect cpu id and rev. */ -	s5p_init_cpu(cpuid_addr); - -	s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); -} diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h index 40fd7b6b5e6..258d9d8a94f 100644 --- a/arch/arm/plat-samsung/include/plat/cpu.h +++ b/arch/arm/plat-samsung/include/plat/cpu.h @@ -152,13 +152,9 @@ extern void s3c_init_cpu(unsigned long idcode,  /* core initialisation functions */  extern void s3c24xx_init_irq(void); -extern void s3c64xx_init_irq(u32 vic0, u32 vic1);  extern void s5p_init_irq(u32 *vic, u32 num_vic);  extern void s3c24xx_init_io(struct map_desc *mach_desc, int size); -extern void s3c64xx_init_io(struct map_desc *mach_desc, int size); -extern void s5p_init_io(struct map_desc *mach_desc, -			int size, void __iomem *cpuid_addr);  extern void s3c24xx_init_cpu(void);  extern void s3c64xx_init_cpu(void); @@ -183,7 +179,6 @@ extern struct syscore_ops s3c2410_pm_syscore_ops;  extern struct syscore_ops s3c2412_pm_syscore_ops;  extern struct syscore_ops s3c2416_pm_syscore_ops;  extern struct syscore_ops s3c244x_pm_syscore_ops; -extern struct syscore_ops s3c64xx_irq_syscore_ops;  /* system device classes */ @@ -195,7 +190,6 @@ extern struct sysdev_class s3c2440_sysclass;  extern struct sysdev_class s3c2442_sysclass;  extern struct sysdev_class s3c2443_sysclass;  extern struct sysdev_class s3c6410_sysclass; -extern struct sysdev_class s3c64xx_sysclass;  extern struct sysdev_class s5p64x0_sysclass;  extern struct sysdev_class s5pv210_sysclass;  extern struct sysdev_class exynos4_sysclass; diff --git a/arch/arm/plat-samsung/include/plat/exynos4.h b/arch/arm/plat-samsung/include/plat/exynos4.h deleted file mode 100644 index f546e88ebc9..00000000000 --- a/arch/arm/plat-samsung/include/plat/exynos4.h +++ /dev/null @@ -1,35 +0,0 @@ -/* linux/arch/arm/plat-samsung/include/plat/exynos4.h - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * Header file for exynos4 cpu support - * - * 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. -*/ - -/* Common init code for EXYNOS4 related SoCs */ - -extern void exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no); -extern void exynos4_register_clocks(void); -extern void exynos4210_register_clocks(void); -extern void exynos4212_register_clocks(void); -extern void exynos4_setup_clocks(void); - -#ifdef CONFIG_ARCH_EXYNOS -extern  int exynos_init(void); -extern void exynos4_init_irq(void); -extern void exynos4_map_io(void); -extern void exynos4_init_clocks(int xtal); -extern struct sys_timer exynos4_timer; - -#define exynos4_init_uarts exynos4_common_init_uarts - -#else -#define exynos4_init_clocks NULL -#define exynos4_init_uarts NULL -#define exynos4_map_io NULL -#define exynos_init NULL -#endif diff --git a/arch/arm/plat-samsung/include/plat/reset.h b/arch/arm/plat-samsung/include/plat/reset.h deleted file mode 100644 index 32ca5179c6e..00000000000 --- a/arch/arm/plat-samsung/include/plat/reset.h +++ /dev/null @@ -1,16 +0,0 @@ -/* linux/arch/arm/plat-samsung/include/plat/reset.h - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.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. -*/ - -#ifndef __PLAT_SAMSUNG_RESET_H -#define __PLAT_SAMSUNG_RESET_H __FILE__ - -extern void (*s5p_reset_hook)(void); - -#endif /* __PLAT_SAMSUNG_RESET_H */ diff --git a/arch/arm/plat-samsung/include/plat/s3c2412.h b/arch/arm/plat-samsung/include/plat/s3c2412.h index 5bcfd143ba1..cbae50ddacc 100644 --- a/arch/arm/plat-samsung/include/plat/s3c2412.h +++ b/arch/arm/plat-samsung/include/plat/s3c2412.h @@ -21,9 +21,12 @@ extern void s3c2412_init_uarts(struct s3c2410_uartcfg *cfg, int no);  extern void s3c2412_init_clocks(int xtal);  extern  int s3c2412_baseclk_add(void); + +extern void s3c2412_restart(char mode, const char *cmd);  #else  #define s3c2412_init_clocks NULL  #define s3c2412_init_uarts NULL  #define s3c2412_map_io NULL  #define s3c2412_init NULL +#define s3c2412_restart NULL  #endif diff --git a/arch/arm/plat-samsung/include/plat/s3c2416.h b/arch/arm/plat-samsung/include/plat/s3c2416.h index a764f8503f5..de2b5bdc5eb 100644 --- a/arch/arm/plat-samsung/include/plat/s3c2416.h +++ b/arch/arm/plat-samsung/include/plat/s3c2416.h @@ -23,9 +23,11 @@ extern void s3c2416_init_clocks(int xtal);  extern  int s3c2416_baseclk_add(void); +extern void s3c2416_restart(char mode, const char *cmd);  #else  #define s3c2416_init_clocks NULL  #define s3c2416_init_uarts NULL  #define s3c2416_map_io NULL  #define s3c2416_init NULL +#define s3c2416_restart NULL  #endif diff --git a/arch/arm/plat-samsung/include/plat/s3c2443.h b/arch/arm/plat-samsung/include/plat/s3c2443.h index 7fae1a05069..dce05b43d51 100644 --- a/arch/arm/plat-samsung/include/plat/s3c2443.h +++ b/arch/arm/plat-samsung/include/plat/s3c2443.h @@ -24,11 +24,13 @@ extern void s3c2443_init_clocks(int xtal);  extern  int s3c2443_baseclk_add(void); +extern void s3c2443_restart(char mode, const char *cmd);  #else  #define s3c2443_init_clocks NULL  #define s3c2443_init_uarts NULL  #define s3c2443_map_io NULL  #define s3c2443_init NULL +#define s3c2443_restart NULL  #endif  /* common code used by s3c2443 and others. diff --git a/arch/arm/plat-samsung/include/plat/s3c6400.h b/arch/arm/plat-samsung/include/plat/s3c6400.h deleted file mode 100644 index 37d428aaaeb..00000000000 --- a/arch/arm/plat-samsung/include/plat/s3c6400.h +++ /dev/null @@ -1,36 +0,0 @@ -/* linux/arch/arm/plat-samsung/include/plat/s3c6400.h - * - * Copyright 2008 Openmoko, Inc. - * Copyright 2008 Simtec Electronics - *	Ben Dooks <ben@simtec.co.uk> - *	http://armlinux.simtec.co.uk/ - * - * Header file for s3c6400 cpu support - * - * 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. -*/ - -/* Common init code for S3C6400 related SoCs */ - -extern void s3c6400_common_init_uarts(struct s3c2410_uartcfg *cfg, int no); -extern void s3c6400_setup_clocks(void); - -extern void s3c64xx_register_clocks(unsigned long xtal, unsigned armclk_limit); - -#ifdef CONFIG_CPU_S3C6400 - -extern  int s3c6400_init(void); -extern void s3c6400_init_irq(void); -extern void s3c6400_map_io(void); -extern void s3c6400_init_clocks(int xtal); - -#define s3c6400_init_uarts s3c6400_common_init_uarts - -#else -#define s3c6400_init_clocks NULL -#define s3c6400_init_uarts NULL -#define s3c6400_map_io NULL -#define s3c6400_init NULL -#endif diff --git a/arch/arm/plat-samsung/include/plat/s3c6410.h b/arch/arm/plat-samsung/include/plat/s3c6410.h deleted file mode 100644 index 20a6675b9d1..00000000000 --- a/arch/arm/plat-samsung/include/plat/s3c6410.h +++ /dev/null @@ -1,29 +0,0 @@ -/* linux/arch/arm/plat-samsung/include/plat/s3c6410.h - * - * Copyright 2008 Openmoko,  Inc. - * Copyright 2008 Simtec Electronics - *	Ben Dooks <ben@simtec.co.uk> - *	http://armlinux.simtec.co.uk/ - * - * Header file for s3c6410 cpu support - * - * 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. -*/ - -#ifdef CONFIG_CPU_S3C6410 - -extern  int s3c6410_init(void); -extern void s3c6410_init_irq(void); -extern void s3c6410_map_io(void); -extern void s3c6410_init_clocks(int xtal); - -#define s3c6410_init_uarts s3c6400_common_init_uarts - -#else -#define s3c6410_init_clocks NULL -#define s3c6410_init_uarts NULL -#define s3c6410_map_io NULL -#define s3c6410_init NULL -#endif diff --git a/arch/arm/plat-samsung/include/plat/s5p6440.h b/arch/arm/plat-samsung/include/plat/s5p6440.h deleted file mode 100644 index bf85ebbb4fb..00000000000 --- a/arch/arm/plat-samsung/include/plat/s5p6440.h +++ /dev/null @@ -1,36 +0,0 @@ -/* linux/arch/arm/plat-samsung/include/plat/s5p6440.h - * - * Copyright (c) 2009 Samsung Electronics Co., Ltd. - *		http://www.samsung.com/ - * - * Header file for s5p6440 cpu support - * - * 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. -*/ - - /* Common init code for S5P6440 related SoCs */ - -extern void s5p6440_register_clocks(void); -extern void s5p6440_setup_clocks(void); - -#ifdef CONFIG_CPU_S5P6440 - -extern  int s5p64x0_init(void); -extern void s5p6440_init_irq(void); -extern void s5p6440_map_io(void); -extern void s5p6440_init_clocks(int xtal); - -extern void s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no); - -#else -#define s5p6440_init_clocks NULL -#define s5p6440_init_uarts NULL -#define s5p6440_map_io NULL -#define s5p64x0_init NULL -#endif - -/* S5P6440 timer */ - -extern struct sys_timer s5p6440_timer; diff --git a/arch/arm/plat-samsung/include/plat/s5p6450.h b/arch/arm/plat-samsung/include/plat/s5p6450.h deleted file mode 100644 index da25f9a1c54..00000000000 --- a/arch/arm/plat-samsung/include/plat/s5p6450.h +++ /dev/null @@ -1,36 +0,0 @@ -/* linux/arch/arm/plat-samsung/include/plat/s5p6450.h - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * Header file for s5p6450 cpu support - * - * 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. -*/ - -/* Common init code for S5P6450 related SoCs */ - -extern void s5p6450_register_clocks(void); -extern void s5p6450_setup_clocks(void); - -#ifdef CONFIG_CPU_S5P6450 - -extern  int s5p64x0_init(void); -extern void s5p6450_init_irq(void); -extern void s5p6450_map_io(void); -extern void s5p6450_init_clocks(int xtal); - -extern void s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no); - -#else -#define s5p6450_init_clocks NULL -#define s5p6450_init_uarts NULL -#define s5p6450_map_io NULL -#define s5p64x0_init NULL -#endif - -/* S5P6450 timer */ - -extern struct sys_timer s5p6450_timer; diff --git a/arch/arm/plat-samsung/include/plat/s5pc100.h b/arch/arm/plat-samsung/include/plat/s5pc100.h deleted file mode 100644 index 9a21aeaaf45..00000000000 --- a/arch/arm/plat-samsung/include/plat/s5pc100.h +++ /dev/null @@ -1,33 +0,0 @@ -/* linux/arch/arm/plat-samsung/include/plat/s5pc100.h - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.com/ - * - * Header file for s5pc100 cpu support - * - * 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. -*/ - -/* Common init code for S5PC100 related SoCs */ - -extern void s5pc100_common_init_uarts(struct s3c2410_uartcfg *cfg, int no); -extern void s5pc100_register_clocks(void); -extern void s5pc100_setup_clocks(void); - -#ifdef CONFIG_CPU_S5PC100 - -extern  int s5pc100_init(void); -extern void s5pc100_init_irq(void); -extern void s5pc100_map_io(void); -extern void s5pc100_init_clocks(int xtal); - -#define s5pc100_init_uarts s5pc100_common_init_uarts - -#else -#define s5pc100_init_clocks NULL -#define s5pc100_init_uarts NULL -#define s5pc100_map_io NULL -#define s5pc100_init NULL -#endif diff --git a/arch/arm/plat-samsung/include/plat/s5pv210.h b/arch/arm/plat-samsung/include/plat/s5pv210.h deleted file mode 100644 index b4bc6be7707..00000000000 --- a/arch/arm/plat-samsung/include/plat/s5pv210.h +++ /dev/null @@ -1,33 +0,0 @@ -/* linux/arch/arm/plat-samsung/include/plat/s5pv210.h - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.com/ - * - * Header file for s5pv210 cpu support - * - * 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. -*/ - -/* Common init code for S5PV210 related SoCs */ - -extern void s5pv210_common_init_uarts(struct s3c2410_uartcfg *cfg, int no); -extern void s5pv210_register_clocks(void); -extern void s5pv210_setup_clocks(void); - -#ifdef CONFIG_CPU_S5PV210 - -extern  int s5pv210_init(void); -extern void s5pv210_init_irq(void); -extern void s5pv210_map_io(void); -extern void s5pv210_init_clocks(int xtal); - -#define s5pv210_init_uarts s5pv210_common_init_uarts - -#else -#define s5pv210_init_clocks NULL -#define s5pv210_init_uarts NULL -#define s5pv210_map_io NULL -#define s5pv210_init NULL -#endif diff --git a/arch/arm/plat-samsung/include/plat/system-reset.h b/arch/arm/plat-samsung/include/plat/system-reset.h deleted file mode 100644 index a448e990964..00000000000 --- a/arch/arm/plat-samsung/include/plat/system-reset.h +++ /dev/null @@ -1,31 +0,0 @@ -/* linux/arch/arm/plat-samsung/include/plat/system-reset.h - * - * Copyright (c) 2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * Based on arch/arm/mach-s3c2410/include/mach/system-reset.h - * - * S5P - System define for arch_reset() - * - * 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. -*/ - -#include <plat/watchdog-reset.h> - -void (*s5p_reset_hook)(void); - -static void arch_reset(char mode, const char *cmd) -{ -	/* SWRESET support in s5p_reset_hook() */ - -	if (s5p_reset_hook) -		s5p_reset_hook(); - -	/* Perform reset using Watchdog reset -	 * if there is no s5p_reset_hook() -	 */ - -	arch_wdt_reset(); -} diff --git a/arch/arm/plat-samsung/include/plat/watchdog-reset.h b/arch/arm/plat-samsung/include/plat/watchdog-reset.h index 40dbb2b0ae2..f19aff19205 100644 --- a/arch/arm/plat-samsung/include/plat/watchdog-reset.h +++ b/arch/arm/plat-samsung/include/plat/watchdog-reset.h @@ -17,6 +17,7 @@  #include <linux/clk.h>  #include <linux/err.h>  #include <linux/io.h> +#include <linux/delay.h>  static inline void arch_wdt_reset(void)  { diff --git a/arch/arm/plat-spear/Makefile b/arch/arm/plat-spear/Makefile index b4f340b8f1f..e0f2e5b9530 100644 --- a/arch/arm/plat-spear/Makefile +++ b/arch/arm/plat-spear/Makefile @@ -3,6 +3,6 @@  #  # Common support -obj-y	:= clock.o time.o +obj-y	:= clock.o restart.o time.o  obj-$(CONFIG_ARCH_SPEAR3XX)	+= shirq.o padmux.o diff --git a/arch/arm/plat-spear/include/plat/system.h b/arch/arm/plat-spear/include/plat/system.h index 1171f228d71..86c6f83b44c 100644 --- a/arch/arm/plat-spear/include/plat/system.h +++ b/arch/arm/plat-spear/include/plat/system.h @@ -14,10 +14,6 @@  #ifndef __PLAT_SYSTEM_H  #define __PLAT_SYSTEM_H -#include <linux/io.h> -#include <asm/hardware/sp810.h> -#include <mach/hardware.h> -  static inline void arch_idle(void)  {  	/* @@ -27,15 +23,4 @@ static inline void arch_idle(void)  	cpu_do_idle();  } -static inline void arch_reset(char mode, const char *cmd) -{ -	if (mode == 's') { -		/* software reset, Jump into ROM at address 0 */ -		soft_restart(0); -	} else { -		/* hardware reset, Use on-chip reset capability */ -		sysctl_soft_reset((void __iomem *)VA_SPEAR_SYS_CTRL_BASE); -	} -} -  #endif /* __PLAT_SYSTEM_H */ diff --git a/arch/arm/plat-spear/restart.c b/arch/arm/plat-spear/restart.c new file mode 100644 index 00000000000..2b4e3d82957 --- /dev/null +++ b/arch/arm/plat-spear/restart.c @@ -0,0 +1,27 @@ +/* + * arch/arm/plat-spear/restart.c + * + * SPEAr platform specific restart functions + * + * Copyright (C) 2009 ST Microelectronics + * Viresh Kumar<viresh.kumar@st.com> + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ +#include <linux/io.h> +#include <asm/hardware/sp810.h> +#include <mach/hardware.h> +#include <mach/generic.h> + +void spear_restart(char mode, const char *cmd) +{ +	if (mode == 's') { +		/* software reset, Jump into ROM at address 0 */ +		soft_restart(0); +	} else { +		/* hardware reset, Use on-chip reset capability */ +		sysctl_soft_reset((void __iomem *)VA_SPEAR_SYS_CTRL_BASE); +	} +} diff --git a/arch/arm/plat-tcc/Kconfig b/arch/arm/plat-tcc/Kconfig deleted file mode 100644 index 1bf499570f4..00000000000 --- a/arch/arm/plat-tcc/Kconfig +++ /dev/null @@ -1,20 +0,0 @@ -if ARCH_TCC_926 - -menu "Telechips ARM926-based CPUs" - -choice -	prompt "Telechips CPU type:" -	default ARCH_TCC8K - -config ARCH_TCC8K -	bool TCC8000 -	select USB_ARCH_HAS_OHCI -	help -	  Support for Telechips TCC8000 systems - -endchoice - -source "arch/arm/mach-tcc8k/Kconfig" - -endmenu -endif diff --git a/arch/arm/plat-tcc/Makefile b/arch/arm/plat-tcc/Makefile deleted file mode 100644 index eceabc869b8..00000000000 --- a/arch/arm/plat-tcc/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -# "Telechips Platform Common Modules" - -obj-y := clock.o system.o diff --git a/arch/arm/plat-tcc/clock.c b/arch/arm/plat-tcc/clock.c deleted file mode 100644 index f3ced10d527..00000000000 --- a/arch/arm/plat-tcc/clock.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Clock framework for Telechips SoCs - * Based on arch/arm/plat-mxc/clock.c - * - * Copyright (C) 2004 - 2005 Nokia corporation - * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com> - * Modified for omap shared clock framework by Tony Lindgren <tony@atomide.com> - * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved. - * Copyright 2008 Juergen Beisert, kernel@pengutronix.de - * Copyright 2010 Hans J. Koch, hjk@linutronix.de - * - * Licensed under the terms of the GPL v2. - */ - -#include <linux/clk.h> -#include <linux/err.h> -#include <linux/errno.h> -#include <linux/module.h> -#include <linux/mutex.h> -#include <linux/string.h> - -#include <mach/clock.h> -#include <mach/hardware.h> - -static DEFINE_MUTEX(clocks_mutex); - -/*------------------------------------------------------------------------- - * Standard clock functions defined in include/linux/clk.h - *-------------------------------------------------------------------------*/ - -static void __clk_disable(struct clk *clk) -{ -	BUG_ON(clk->refcount == 0); - -	if (!(--clk->refcount) && clk->disable) { -		/* Unconditionally disable the clock in hardware */ -		clk->disable(clk); -		/* recursively disable parents */ -		if (clk->parent) -			__clk_disable(clk->parent); -	} -} - -static int __clk_enable(struct clk *clk) -{ -	int ret = 0; - -	if (clk->refcount++ == 0 && clk->enable) { -		if (clk->parent) -			ret = __clk_enable(clk->parent); -		if (ret) -			return ret; -		else -			return clk->enable(clk); -	} - -	return 0; -} - -/* This function increments the reference count on the clock and enables the - * clock if not already enabled. The parent clock tree is recursively enabled - */ -int clk_enable(struct clk *clk) -{ -	int ret = 0; - -	if (!clk) -		return -EINVAL; - -	mutex_lock(&clocks_mutex); -	ret = __clk_enable(clk); -	mutex_unlock(&clocks_mutex); - -	return ret; -} -EXPORT_SYMBOL_GPL(clk_enable); - -/* This function decrements the reference count on the clock and disables - * the clock when reference count is 0. The parent clock tree is - * recursively disabled - */ -void clk_disable(struct clk *clk) -{ -	if (!clk) -		return; - -	mutex_lock(&clocks_mutex); -	__clk_disable(clk); -	mutex_unlock(&clocks_mutex); -} -EXPORT_SYMBOL_GPL(clk_disable); - -/* Retrieve the *current* clock rate. If the clock itself - * does not provide a special calculation routine, ask - * its parent and so on, until one is able to return - * a valid clock rate - */ -unsigned long clk_get_rate(struct clk *clk) -{ -	if (!clk) -		return 0UL; - -	if (clk->get_rate) -		return clk->get_rate(clk); - -	return clk_get_rate(clk->parent); -} -EXPORT_SYMBOL_GPL(clk_get_rate); - -/* Round the requested clock rate to the nearest supported - * rate that is less than or equal to the requested rate. - * This is dependent on the clock's current parent. - */ -long clk_round_rate(struct clk *clk, unsigned long rate) -{ -	if (!clk) -		return 0; -	if (!clk->round_rate) -		return 0; - -	return clk->round_rate(clk, rate); -} -EXPORT_SYMBOL_GPL(clk_round_rate); - -/* Set the clock to the requested clock rate. The rate must - * match a supported rate exactly based on what clk_round_rate returns - */ -int clk_set_rate(struct clk *clk, unsigned long rate) -{ -	int ret = -EINVAL; - -	if (!clk) -		return ret; -	if (!clk->set_rate || !rate) -		return ret; - -	mutex_lock(&clocks_mutex); -	ret = clk->set_rate(clk, rate); -	mutex_unlock(&clocks_mutex); - -	return ret; -} -EXPORT_SYMBOL_GPL(clk_set_rate); - -/* Set the clock's parent to another clock source */ -int clk_set_parent(struct clk *clk, struct clk *parent) -{ -	struct clk *old; -	int ret = -EINVAL; - -	if (!clk) -		return ret; -	if (!clk->set_parent || !parent) -		return ret; - -	mutex_lock(&clocks_mutex); -	old = clk->parent; -	if (clk->refcount) -		__clk_enable(parent); -	ret = clk->set_parent(clk, parent); -	if (ret) -		old = parent; -	if (clk->refcount) -		__clk_disable(old); -	mutex_unlock(&clocks_mutex); - -	return ret; -} -EXPORT_SYMBOL_GPL(clk_set_parent); - -/* Retrieve the clock's parent clock source */ -struct clk *clk_get_parent(struct clk *clk) -{ -	if (!clk) -		return NULL; - -	return clk->parent; -} -EXPORT_SYMBOL_GPL(clk_get_parent); diff --git a/arch/arm/plat-tcc/include/mach/clock.h b/arch/arm/plat-tcc/include/mach/clock.h deleted file mode 100644 index a12f58ad71a..00000000000 --- a/arch/arm/plat-tcc/include/mach/clock.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Low level clock header file for Telechips TCC architecture - * (C) 2010 Hans J. Koch <hjk@linutronix.de> - * - * Licensed under the GPL v2. - */ - -#ifndef __ASM_ARCH_TCC_CLOCK_H__ -#define __ASM_ARCH_TCC_CLOCK_H__ - -#ifndef __ASSEMBLY__ - -struct clk { -	struct clk *parent; -	/* id number of a root clock, 0 for normal clocks */ -	int root_id; -	/* Reference count of clock enable/disable */ -	int refcount; -	/* Address of associated BCLKCTRx register. Must be set. */ -	void __iomem *bclkctr; -	/* Bit position for BCLKCTRx. Must be set. */ -	int bclk_shift; -	/* Address of ACLKxxx register, if any. */ -	void __iomem *aclkreg; -	/* get the current clock rate (always a fresh value) */ -	unsigned long (*get_rate) (struct clk *); -	/* Function ptr to set the clock to a new rate. The rate must match a -	   supported rate returned from round_rate. Leave blank if clock is not -	   programmable */ -	int (*set_rate) (struct clk *, unsigned long); -	/* Function ptr to round the requested clock rate to the nearest -	   supported rate that is less than or equal to the requested rate. */ -	unsigned long (*round_rate) (struct clk *, unsigned long); -	/* Function ptr to enable the clock. Leave blank if clock can not -	   be gated. */ -	int (*enable) (struct clk *); -	/* Function ptr to disable the clock. Leave blank if clock can not -	   be gated. */ -	void (*disable) (struct clk *); -	/* Function ptr to set the parent clock of the clock. */ -	int (*set_parent) (struct clk *, struct clk *); -}; - -int clk_register(struct clk *clk); -void clk_unregister(struct clk *clk); - -#endif /* __ASSEMBLY__ */ -#endif /* __ASM_ARCH_MXC_CLOCK_H__ */ diff --git a/arch/arm/plat-tcc/include/mach/debug-macro.S b/arch/arm/plat-tcc/include/mach/debug-macro.S deleted file mode 100644 index cf17d04ec30..00000000000 --- a/arch/arm/plat-tcc/include/mach/debug-macro.S +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 1994-1999 Russell King - * Copyright (C) 2008-2009 Telechips - * Copyright (C) 2009 Hans J. Koch <hjk@linutronix.de> - * - * 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. - * - */ - -		.macro	addruart, rp, rv, tmp -		moveq	\rp, #0x90000000	@ physical base address -		movne	\rv, #0xF1000000	@ virtual base -		orr	\rp, \rp, #0x00007000	@ UART0 -		orr	\rv, \rv, #0x00007000	@ UART0 -		.endm - -		.macro	senduart,rd,rx -		strb	\rd, [\rx, #0x44] -		.endm - -		.macro	waituart,rd,rx -		.endm - -		.macro	busyuart,rd,rx -1001: -		ldr \rd, [\rx, #0x14] -		tst \rd, #0x20 - -		beq 1001b -		.endm diff --git a/arch/arm/plat-tcc/include/mach/entry-macro.S b/arch/arm/plat-tcc/include/mach/entry-macro.S deleted file mode 100644 index 748f401e4b6..00000000000 --- a/arch/arm/plat-tcc/include/mach/entry-macro.S +++ /dev/null @@ -1,68 +0,0 @@ -/* - * include/asm-arm/arch-tcc83x/entry-macro.S - * - * Author : <linux@telechips.com> - * Created: June 10, 2008 - * Description: Low-level IRQ helper macros for Telechips-based platforms - * - * Copyright (C) 2008-2009 Telechips - * - * This file is licensed under  the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ - -#include <mach/hardware.h> -#include <mach/irqs.h> - -	.macro	disable_fiq -	.endm - -	.macro  get_irqnr_preamble, base, tmp -	.endm - -	.macro  arch_ret_to_user, tmp1, tmp2 -	.endm - -	.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp - -		ldr	\base, =0xF2003000 @ base address of PIC registers - -		@@ read MREQ register of PIC0 - -		mov	\irqnr, #0 -		ldr	\irqstat, [\base, #0x00000014 ]	@ lower 32 interrupts -		cmp	\irqstat, #0 -		bne	1001f - -		@@ read MREQ register of PIC1 - -		ldr	\irqstat, [\base, #0x00000094]	@ upper 32 interrupts -		cmp	\irqstat, #0 -		beq	1002f -		mov	\irqnr, #0x20 - -1001: -		movs	\tmp, \irqstat, lsl #16 -		movne	\irqstat, \tmp -		addeq	\irqnr, \irqnr, #16 - -		movs	\tmp, \irqstat, lsl #8 -		movne	\irqstat, \tmp -		addeq	\irqnr, \irqnr, #8 - -		movs	\tmp, \irqstat, lsl #4 -		movne	\irqstat, \tmp -		addeq	\irqnr, \irqnr, #4 - -		movs	\tmp, \irqstat, lsl #2 -		movne	\irqstat, \tmp -		addeq	\irqnr, \irqnr, #2 - -		movs	\tmp, \irqstat, lsl #1 -		addeq	\irqnr, \irqnr, #1 -		orrs	\base, \base, #1 -1002: -		@@ exit here, Z flag unset if IRQ - -	.endm diff --git a/arch/arm/plat-tcc/include/mach/hardware.h b/arch/arm/plat-tcc/include/mach/hardware.h deleted file mode 100644 index e70d126ccaf..00000000000 --- a/arch/arm/plat-tcc/include/mach/hardware.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Author: RidgeRun, Inc. Greg Lonnon <glonnon@ridgerun.com> - * Reorganized for Linux-2.6 by Tony Lindgren <tony@atomide.com> - *                          and Dirk Behme <dirk.behme@de.bosch.com> - * Rewritten by:    <linux@telechips.com> - * Description: Hardware definitions for TCC8300 processors and boards - * - * Copyright (C) 2001 RidgeRun, Inc. - * Copyright (C) 2008-2009 Telechips - * - * Modifications for mainline (C) 2009 Hans J. Koch <hjk@linutronix.de> - * - * Licensed under the terms of the GNU Pulic License version 2. - */ - -#ifndef __ASM_ARCH_TCC_HARDWARE_H -#define __ASM_ARCH_TCC_HARDWARE_H - -#include <asm/sizes.h> -#ifndef __ASSEMBLER__ -#include <asm/types.h> -#endif -#include <mach/io.h> - -/* - * ---------------------------------------------------------------------------- - * Clocks - * ---------------------------------------------------------------------------- - */ -#define CLKGEN_REG_BASE		0xfffece00 -#define ARM_CKCTL		(CLKGEN_REG_BASE + 0x0) -#define ARM_IDLECT1		(CLKGEN_REG_BASE + 0x4) -#define ARM_IDLECT2		(CLKGEN_REG_BASE + 0x8) -#define ARM_EWUPCT		(CLKGEN_REG_BASE + 0xC) -#define ARM_RSTCT1		(CLKGEN_REG_BASE + 0x10) -#define ARM_RSTCT2		(CLKGEN_REG_BASE + 0x14) -#define ARM_SYSST		(CLKGEN_REG_BASE + 0x18) -#define ARM_IDLECT3		(CLKGEN_REG_BASE + 0x24) - -/* DPLL control registers */ -#define DPLL_CTL		0xfffecf00 - -#endif	/* __ASM_ARCH_TCC_HARDWARE_H */ diff --git a/arch/arm/plat-tcc/include/mach/io.h b/arch/arm/plat-tcc/include/mach/io.h deleted file mode 100644 index 3e911d3ea0f..00000000000 --- a/arch/arm/plat-tcc/include/mach/io.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * IO definitions for TCC8000 processors and boards - * - * Copyright (C) 1997-1999 Russell King - * Copyright (C) 2008-2009 Telechips - * Copyright (C) 2010 Hans J. Koch <hjk@linutronix.de> - * - * Licensed under the terms of the GNU Public License version 2. - */ - -#ifndef __ASM_ARM_ARCH_IO_H -#define __ASM_ARM_ARCH_IO_H - -#define IO_SPACE_LIMIT 0xffffffff - -/* - * We don't actually have real ISA nor PCI buses, but there is so many - * drivers out there that might just work if we fake them... - */ -#define __io(a)			__typesafe_io(a) -#define __mem_pci(a)		(a) - -#endif diff --git a/arch/arm/plat-tcc/include/mach/irqs.h b/arch/arm/plat-tcc/include/mach/irqs.h deleted file mode 100644 index da863894d49..00000000000 --- a/arch/arm/plat-tcc/include/mach/irqs.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * IRQ definitions for TCC8xxx - * - * Copyright (C) 2008-2009 Telechips - * Copyright (C) 2009 Hans J. Koch <hjk@linutronix.de> - * - * Licensed under the terms of the GPL v2. - * - */ - -#ifndef __ASM_ARCH_TCC_IRQS_H -#define __ASM_ARCH_TCC_IRQS_H - -#define NR_IRQS 64 - -/* PIC0 interrupts */ -#define INT_ADMA1	0 -#define INT_BDMA	1 -#define INT_ADMA0	2 -#define INT_GDMA1	3 -#define INT_I2S0RX	4 -#define INT_I2S0TX	5 -#define INT_TC		6 -#define INT_UART0	7 -#define INT_USBD	8 -#define INT_SPI0TX	9 -#define INT_UDMA	10 -#define INT_LIRQ	11 -#define INT_GDMA2	12 -#define INT_GDMA0	13 -#define INT_TC32	14 -#define INT_LCD		15 -#define INT_ADC		16 -#define INT_I2C		17 -#define INT_RTCP	18 -#define INT_RTCA	19 -#define INT_NFC		20 -#define INT_SD0		21 -#define INT_GSB0	22 -#define INT_PK		23 -#define INT_USBH0	24 -#define INT_USBH1	25 -#define INT_G2D		26 -#define INT_ECC		27 -#define INT_SPI0RX	28 -#define INT_UART1	29 -#define INT_MSCL	30 -#define INT_GSB1	31 -/* PIC1 interrupts */ -#define INT_E0		32 -#define INT_E1		33 -#define INT_E2		34 -#define INT_E3		35 -#define INT_E4		36 -#define INT_E5		37 -#define INT_E6		38 -#define INT_E7		39 -#define INT_UART2	40 -#define INT_UART3	41 -#define INT_SPI1TX	42 -#define INT_SPI1RX	43 -#define INT_GSB2	44 -#define INT_SPDIF	45 -#define INT_CDIF	46 -#define INT_VBON	47 -#define INT_VBOFF	48 -#define INT_SD1		49 -#define INT_UART4	50 -#define INT_GDMA3	51 -#define INT_I2S1RX	52 -#define INT_I2S1TX	53 -#define INT_CAN0	54 -#define INT_CAN1	55 -#define INT_GSB3	56 -#define INT_KRST	57 -#define INT_UNUSED	58 -#define INT_SD0D3	59 -#define INT_SD1D3	60 -#define INT_GPS0	61 -#define INT_GPS1	62 -#define INT_GPS2	63 - -#endif  /* ASM_ARCH_TCC_IRQS_H */ diff --git a/arch/arm/plat-tcc/include/mach/system.h b/arch/arm/plat-tcc/include/mach/system.h deleted file mode 100644 index 909e6035d84..00000000000 --- a/arch/arm/plat-tcc/include/mach/system.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Author: <linux@telechips.com> - * Created: June 10, 2008 - * Description: LINUX SYSTEM FUNCTIONS for TCC83x - * - * Copyright (C) 2008-2009 Telechips - * - * Licensed under the terms of the GPL v2. - * - */ - -#ifndef __ASM_ARCH_SYSTEM_H -#define __ASM_ARCH_SYSTEM_H -#include <linux/clk.h> - -#include <asm/mach-types.h> -#include <mach/hardware.h> - -extern void plat_tcc_reboot(void); - -static inline void arch_idle(void) -{ -	cpu_do_idle(); -} - -static inline void arch_reset(char mode, const char *cmd) -{ -	plat_tcc_reboot(); -} - -#endif diff --git a/arch/arm/plat-tcc/include/mach/tcc8k-regs.h b/arch/arm/plat-tcc/include/mach/tcc8k-regs.h deleted file mode 100644 index 1d942829533..00000000000 --- a/arch/arm/plat-tcc/include/mach/tcc8k-regs.h +++ /dev/null @@ -1,807 +0,0 @@ -/* - * Telechips TCC8000 register definitions - * - * (C) 2009 Hans J. Koch <hjk@linutronix.de> - * - * Licensed under the terms of the GPLv2. - */ - -#ifndef TCC8K_REGS_H -#define TCC8K_REGS_H - -#include <linux/types.h> - -#define EXT_SDRAM_BASE		0x20000000 -#define INT_SRAM_BASE		0x30000000 -#define INT_SRAM_SIZE		SZ_32K -#define CS0_BASE		0x40000000 -#define CS1_BASE		0x50000000 -#define CS1_SIZE		SZ_64K -#define CS2_BASE		0x60000000 -#define CS3_BASE		0x70000000 -#define AHB_PERI_BASE		0x80000000 -#define AHB_PERI_SIZE		SZ_64K -#define APB0_PERI_BASE		0x90000000 -#define APB0_PERI_SIZE		SZ_128K -#define APB1_PERI_BASE		0x98000000 -#define APB1_PERI_SIZE		SZ_128K -#define DATA_TCM_BASE		0xa0000000 -#define DATA_TCM_SIZE		SZ_8K -#define EXT_MEM_CTRL_BASE	0xf0000000 -#define EXT_MEM_CTRL_SIZE	SZ_4K - -#define CS1_BASE_VIRT		(void __iomem *)0xf7000000 -#define AHB_PERI_BASE_VIRT	(void __iomem *)0xf4000000 -#define APB0_PERI_BASE_VIRT	(void __iomem *)0xf1000000 -#define APB1_PERI_BASE_VIRT	(void __iomem *)0xf2000000 -#define EXT_MEM_CTRL_BASE_VIRT	(void __iomem *)0xf3000000 -#define INT_SRAM_BASE_VIRT	(void __iomem *)0xf5000000 -#define DATA_TCM_BASE_VIRT	(void __iomem *)0xf6000000 - -#define __REG(x)     (*((volatile u32 *)(x))) - -/* USB Device Controller Registers */ -#define UDC_BASE	(AHB_PERI_BASE_VIRT + 0x8000) -#define UDC_BASE_PHYS	(AHB_PERI_BASE + 0x8000) - -#define UDC_IR_OFFS		0x00 -#define UDC_EIR_OFFS		0x04 -#define UDC_EIER_OFFS		0x08 -#define UDC_FAR_OFFS		0x0c -#define UDC_FNR_OFFS		0x10 -#define UDC_EDR_OFFS		0x14 -#define UDC_RT_OFFS		0x18 -#define UDC_SSR_OFFS		0x1c -#define UDC_SCR_OFFS		0x20 -#define UDC_EP0SR_OFFS		0x24 -#define UDC_EP0CR_OFFS		0x28 - -#define UDC_ESR_OFFS		0x2c -#define UDC_ECR_OFFS		0x30 -#define UDC_BRCR_OFFS		0x34 -#define UDC_BWCR_OFFS		0x38 -#define UDC_MPR_OFFS		0x3c -#define UDC_DCR_OFFS		0x40 -#define UDC_DTCR_OFFS		0x44 -#define UDC_DFCR_OFFS		0x48 -#define UDC_DTTCR1_OFFS		0x4c -#define UDC_DTTCR2_OFFS		0x50 -#define UDC_ESR2_OFFS		0x54 - -#define UDC_SCR2_OFFS		0x58 -#define UDC_EP0BUF_OFFS		0x60 -#define UDC_EP1BUF_OFFS		0x64 -#define UDC_EP2BUF_OFFS		0x68 -#define UDC_EP3BUF_OFFS		0x6c -#define UDC_PLICR_OFFS		0xa0 -#define UDC_PCR_OFFS		0xa4 - -#define UDC_UPCR0_OFFS		0xc8 -#define UDC_UPCR1_OFFS		0xcc -#define UDC_UPCR2_OFFS		0xd0 -#define UDC_UPCR3_OFFS		0xd4 - -/* Bits in UDC_EIR */ -#define UDC_EIR_EP0I		(1 << 0) -#define UDC_EIR_EP1I		(1 << 1) -#define UDC_EIR_EP2I		(1 << 2) -#define UDC_EIR_EP3I		(1 << 3) -#define UDC_EIR_EPI_MASK	0x0f - -/* Bits in UDC_EIER */ -#define UDC_EIER_EP0IE		(1 << 0) -#define UDC_EIER_EP1IE		(1 << 1) -#define UDC_EIER_EP2IE		(1 << 2) -#define UDC_EIER_EP3IE		(1 << 3) - -/* Bits in UDC_FNR */ -#define UDC_FNR_FN_MASK		0x7ff -#define UDC_FNR_SM		(1 << 13) -#define UDC_FNR_FTL		(1 << 14) - -/* Bits in UDC_SSR */ -#define UDC_SSR_HFRES		(1 << 0) -#define UDC_SSR_HFSUSP		(1 << 1) -#define UDC_SSR_HFRM		(1 << 2) -#define UDC_SSR_SDE		(1 << 3) -#define UDC_SSR_HSP		(1 << 4) -#define UDC_SSR_DM		(1 << 5) -#define UDC_SSR_DP		(1 << 6) -#define UDC_SSR_TBM		(1 << 7) -#define UDC_SSR_VBON		(1 << 8) -#define UDC_SSR_VBOFF		(1 << 9) -#define UDC_SSR_EOERR		(1 << 10) -#define UDC_SSR_DCERR		(1 << 11) -#define UDC_SSR_TCERR		(1 << 12) -#define UDC_SSR_BSERR		(1 << 13) -#define UDC_SSR_TMERR		(1 << 14) -#define UDC_SSR_BAERR		(1 << 15) - -/* Bits in UDC_SCR */ -#define UDC_SCR_HRESE		(1 << 0) -#define UDC_SCR_HSSPE		(1 << 1) -#define UDC_SCR_RRDE		(1 << 5) -#define UDC_SCR_SPDEN		(1 << 6) -#define UDC_SCR_DIEN		(1 << 12) - -/* Bits in UDC_EP0SR */ -#define UDC_EP0SR_RSR		(1 << 0) -#define UDC_EP0SR_TST		(1 << 1) -#define UDC_EP0SR_SHT		(1 << 4) -#define UDC_EP0SR_LWO		(1 << 6) - -/* Bits in UDC_EP0CR */ -#define UDC_EP0CR_ESS		(1 << 1) - -/* Bits in UDC_ESR */ -#define UDC_ESR_RPS		(1 << 0) -#define UDC_ESR_TPS		(1 << 1) -#define UDC_ESR_LWO		(1 << 4) -#define UDC_ESR_FFS		(1 << 6) - -/* Bits in UDC_ECR */ -#define UDC_ECR_ESS		(1 << 1) -#define UDC_ECR_CDP		(1 << 2) - -#define UDC_ECR_FLUSH		(1 << 6) -#define UDC_ECR_DUEN		(1 << 7) - -/* Bits in UDC_UPCR0 */ -#define UDC_UPCR0_VBD		(1 << 1) -#define UDC_UPCR0_VBDS		(1 << 6) -#define UDC_UPCR0_RCD_12	(0x0 << 9) -#define UDC_UPCR0_RCD_24	(0x1 << 9) -#define UDC_UPCR0_RCD_48	(0x2 << 9) -#define UDC_UPCR0_RCS_EXT	(0x1 << 11) -#define UDC_UPCR0_RCS_XTAL	(0x0 << 11) - -/* Bits in UDC_UPCR1 */ -#define UDC_UPCR1_CDT(x)	((x) << 0) -#define UDC_UPCR1_OTGT(x)	((x) << 3) -#define UDC_UPCR1_SQRXT(x)	((x) << 8) -#define UDC_UPCR1_TXFSLST(x)	((x) << 12) - -/* Bits in UDC_UPCR2 */ -#define UDC_UPCR2_TP		(1 << 0) -#define UDC_UPCR2_TXRT(x)	((x) << 2) -#define UDC_UPCR2_TXVRT(x)	((x) << 5) -#define UDC_UPCR2_OPMODE(x)	((x) << 9) -#define UDC_UPCR2_XCVRSEL(x)	((x) << 12) -#define UDC_UPCR2_TM		(1 << 14) - -/* USB Host Controller registers */ -#define USBH0_BASE	(AHB_PERI_BASE_VIRT + 0xb000) -#define USBH1_BASE	(AHB_PERI_BASE_VIRT + 0xb800) - -#define OHCI_INT_ENABLE_OFFS	0x10 - -#define RH_DESCRIPTOR_A_OFFS	0x48 -#define RH_DESCRIPTOR_B_OFFS	0x4c - -#define USBHTCFG0_OFFS		0x100 -#define USBHHCFG0_OFFS		0x104 -#define USBHHCFG1_OFFS		0x104 - -/* DMA controller registers */ -#define DMAC0_BASE	(AHB_PERI_BASE + 0x4000) -#define DMAC1_BASE	(AHB_PERI_BASE + 0xa000) -#define DMAC2_BASE	(AHB_PERI_BASE + 0x4800) -#define DMAC3_BASE	(AHB_PERI_BASE + 0xa800) - -#define DMAC_CH_OFFSET(ch)	(ch * 0x30) - -#define ST_SADR_OFFS		0x00 -#define SPARAM_OFFS		0x04 -#define C_SADR_OFFS		0x0c -#define ST_DADR_OFFS		0x10 -#define DPARAM_OFFS		0x14 -#define C_DADR_OFFS		0x1c -#define HCOUNT_OFFS		0x20 -#define CHCTRL_OFFS		0x24 -#define RPTCTRL_OFFS		0x28 -#define EXTREQ_A_OFFS		0x2c - -/* Bits in CHCTRL register */ -#define CHCTRL_EN		(1 << 0) - -#define CHCTRL_IEN		(1 << 2) -#define CHCTRL_FLAG		(1 << 3) -#define CHCTRL_WSIZE8		(0 << 4) -#define CHCTRL_WSIZE16		(1 << 4) -#define CHCTRL_WSIZE32		(2 << 4) - -#define CHCTRL_BSIZE1		(0 << 6) -#define CHCTRL_BSIZE2		(1 << 6) -#define CHCTRL_BSIZE4		(2 << 6) -#define CHCTRL_BSIZE8		(3 << 6) - -#define CHCTRL_TYPE_SINGLE_E	(0 << 8) -#define CHCTRL_TYPE_HW		(1 << 8) -#define CHCTRL_TYPE_SW		(2 << 8) -#define CHCTRL_TYPE_SINGLE_L	(3 << 8) - -#define CHCTRL_BST		(1 << 10) - -/* Use DMA controller 0, channel 2 for USB */ -#define USB_DMA_BASE		(DMAC0_BASE + DMAC_CH_OFFSET(2)) - -/* NAND flash controller registers */ -#define NFC_BASE	(AHB_PERI_BASE_VIRT + 0xd000) -#define NFC_BASE_PHYS	(AHB_PERI_BASE + 0xd000) - -#define NFC_CMD_OFFS		0x00 -#define NFC_LADDR_OFFS		0x04 -#define NFC_BADDR_OFFS		0x08 -#define NFC_SADDR_OFFS		0x0c -#define NFC_WDATA_OFFS		0x10 -#define NFC_LDATA_OFFS		0x20 -#define NFC_SDATA_OFFS		0x40 -#define NFC_CTRL_OFFS		0x50 -#define NFC_PSTART_OFFS		0x54 -#define NFC_RSTART_OFFS		0x58 -#define NFC_DSIZE_OFFS		0x5c -#define NFC_IREQ_OFFS		0x60 -#define NFC_RST_OFFS		0x64 -#define NFC_CTRL1_OFFS		0x68 -#define NFC_MDATA_OFFS		0x70 - -#define NFC_WDATA_PHYS_ADDR	(NFC_BASE_PHYS + NFC_WDATA_OFFS) - -/* Bits in NFC_CTRL */ -#define NFC_CTRL_BHLD_MASK	(0xf << 0) -#define NFC_CTRL_BPW_MASK	(0xf << 4) -#define NFC_CTRL_BSTP_MASK	(0xf << 8) -#define NFC_CTRL_CADDR_MASK	(0x7 << 12) -#define NFC_CTRL_CADDR_1	(0x0 << 12) -#define NFC_CTRL_CADDR_2	(0x1 << 12) -#define NFC_CTRL_CADDR_3	(0x2 << 12) -#define NFC_CTRL_CADDR_4	(0x3 << 12) -#define NFC_CTRL_CADDR_5	(0x4 << 12) -#define NFC_CTRL_MSK		(1 << 15) -#define NFC_CTRL_PSIZE256	(0 << 16) -#define NFC_CTRL_PSIZE512	(1 << 16) -#define NFC_CTRL_PSIZE1024	(2 << 16) -#define NFC_CTRL_PSIZE2048	(3 << 16) -#define NFC_CTRL_PSIZE4096	(4 << 16) -#define NFC_CTRL_PSIZE_MASK	(7 << 16) -#define NFC_CTRL_BSIZE1		(0 << 19) -#define NFC_CTRL_BSIZE2		(1 << 19) -#define NFC_CTRL_BSIZE4		(2 << 19) -#define NFC_CTRL_BSIZE8		(3 << 19) -#define NFC_CTRL_BSIZE_MASK	(3 << 19) -#define NFC_CTRL_RDY		(1 << 21) -#define NFC_CTRL_CS0SEL		(1 << 22) -#define NFC_CTRL_CS1SEL		(1 << 23) -#define NFC_CTRL_CS2SEL		(1 << 24) -#define NFC_CTRL_CS3SEL		(1 << 25) -#define NFC_CTRL_CSMASK		(0xf << 22) -#define NFC_CTRL_BW		(1 << 26) -#define NFC_CTRL_FS		(1 << 27) -#define NFC_CTRL_DEN		(1 << 28) -#define NFC_CTRL_READ_IEN	(1 << 29) -#define NFC_CTRL_PROG_IEN	(1 << 30) -#define NFC_CTRL_RDY_IEN	(1 << 31) - -/* Bits in NFC_IREQ */ -#define NFC_IREQ_IRQ0		(1 << 0) -#define NFC_IREQ_IRQ1		(1 << 1) -#define NFC_IREQ_IRQ2		(1 << 2) - -#define NFC_IREQ_FLAG0		(1 << 4) -#define NFC_IREQ_FLAG1		(1 << 5) -#define NFC_IREQ_FLAG2		(1 << 6) - -/* MMC controller registers */ -#define MMC0_BASE	(AHB_PERI_BASE_VIRT + 0xe000) -#define MMC1_BASE	(AHB_PERI_BASE_VIRT + 0xe800) - -/* UART base addresses */ - -#define UART0_BASE	(APB0_PERI_BASE_VIRT + 0x07000) -#define UART0_BASE_PHYS	(APB0_PERI_BASE + 0x07000) -#define UART1_BASE	(APB0_PERI_BASE_VIRT + 0x08000) -#define UART1_BASE_PHYS	(APB0_PERI_BASE + 0x08000) -#define UART2_BASE	(APB0_PERI_BASE_VIRT + 0x09000) -#define UART2_BASE_PHYS	(APB0_PERI_BASE + 0x09000) -#define UART3_BASE	(APB0_PERI_BASE_VIRT + 0x0a000) -#define UART3_BASE_PHYS	(APB0_PERI_BASE + 0x0a000) -#define UART4_BASE	(APB0_PERI_BASE_VIRT + 0x15000) -#define UART4_BASE_PHYS	(APB0_PERI_BASE + 0x15000) - -#define UART_BASE	UART0_BASE -#define UART_BASE_PHYS	UART0_BASE_PHYS - -/* ECC controller */ -#define ECC_CTR_BASE	(APB0_PERI_BASE_VIRT + 0xd000) - -#define ECC_CTRL_OFFS		0x00 -#define ECC_BASE_OFFS		0x04 -#define ECC_MASK_OFFS		0x08 -#define ECC_CLEAR_OFFS		0x0c -#define ECC4_0_OFFS		0x10 -#define ECC4_1_OFFS		0x14 - -#define ECC_EADDR0_OFFS		0x50 - -#define ECC_ERRNUM_OFFS		0x90 -#define ECC_IREQ_OFFS		0x94 - -/* Bits in ECC_CTRL */ -#define ECC_CTRL_ECC4_DIEN	(1 << 28) -#define ECC_CTRL_ECC8_DIEN	(1 << 29) -#define ECC_CTRL_ECC12_DIEN	(1 << 30) -#define ECC_CTRL_ECC_DISABLE	0x0 -#define ECC_CTRL_ECC_SLC_ENC	0x8 -#define ECC_CTRL_ECC_SLC_DEC	0x9 -#define ECC_CTRL_ECC4_ENC	0xa -#define ECC_CTRL_ECC4_DEC	0xb -#define ECC_CTRL_ECC8_ENC	0xc -#define ECC_CTRL_ECC8_DEC	0xd -#define ECC_CTRL_ECC12_ENC	0xe -#define ECC_CTRL_ECC12_DEC	0xf - -/* Bits in ECC_IREQ */ -#define ECC_IREQ_E4DI		(1 << 4) - -#define ECC_IREQ_E4DF		(1 << 20) -#define ECC_IREQ_E4EF		(1 << 21) - -/* Interrupt controller */ - -#define PIC0_BASE	(APB1_PERI_BASE_VIRT + 0x3000) -#define PIC0_BASE_PHYS	(APB1_PERI_BASE + 0x3000) - -#define PIC0_IEN_OFFS		0x00 -#define PIC0_CREQ_OFFS		0x04 -#define PIC0_IREQ_OFFS		0x08 -#define PIC0_IRQSEL_OFFS	0x0c -#define PIC0_SRC_OFFS		0x10 -#define PIC0_MREQ_OFFS		0x14 -#define PIC0_TSTREQ_OFFS	0x18 -#define PIC0_POL_OFFS		0x1c -#define PIC0_IRQ_OFFS		0x20 -#define PIC0_FIQ_OFFS		0x24 -#define PIC0_MIRQ_OFFS		0x28 -#define PIC0_MFIQ_OFFS		0x2c -#define PIC0_TMODE_OFFS		0x30 -#define PIC0_SYNC_OFFS		0x34 -#define PIC0_WKUP_OFFS		0x38 -#define PIC0_TMODEA_OFFS	0x3c -#define PIC0_INTOEN_OFFS	0x40 -#define PIC0_MEN0_OFFS		0x44 -#define PIC0_MEN_OFFS		0x48 - -#define PIC0_IEN		__REG(PIC0_BASE + PIC0_IEN_OFFS) -#define PIC0_IEN_PHYS		__REG(PIC0_BASE_PHYS + PIC0_IEN_OFFS) -#define PIC0_CREQ		__REG(PIC0_BASE + PIC0_CREQ_OFFS) -#define PIC0_CREQ_PHYS		__REG(PIC0_BASE_PHYS + PIC0_CREQ_OFFS) -#define PIC0_IREQ		__REG(PIC0_BASE + PIC0_IREQ_OFFS) -#define PIC0_IRQSEL		__REG(PIC0_BASE + PIC0_IRQSEL_OFFS) -#define PIC0_IRQSEL_PHYS	__REG(PIC0_BASE_PHYS + PIC0_IRQSEL_OFFS) -#define PIC0_SRC		__REG(PIC0_BASE + PIC0_SRC_OFFS) -#define PIC0_MREQ		__REG(PIC0_BASE + PIC0_MREQ_OFFS) -#define PIC0_TSTREQ		__REG(PIC0_BASE + PIC0_TSTREQ_OFFS) -#define PIC0_POL		__REG(PIC0_BASE + PIC0_POL_OFFS) -#define PIC0_IRQ		__REG(PIC0_BASE + PIC0_IRQ_OFFS) -#define PIC0_FIQ		__REG(PIC0_BASE + PIC0_FIQ_OFFS) -#define PIC0_MIRQ		__REG(PIC0_BASE + PIC0_MIRQ_OFFS) -#define PIC0_MFIQ		__REG(PIC0_BASE + PIC0_MFIQ_OFFS) -#define PIC0_TMODE		__REG(PIC0_BASE + PIC0_TMODE_OFFS) -#define PIC0_TMODE_PHYS		__REG(PIC0_BASE_PHYS + PIC0_TMODE_OFFS) -#define PIC0_SYNC		__REG(PIC0_BASE + PIC0_SYNC_OFFS) -#define PIC0_WKUP		__REG(PIC0_BASE + PIC0_WKUP_OFFS) -#define PIC0_TMODEA		__REG(PIC0_BASE + PIC0_TMODEA_OFFS) -#define PIC0_INTOEN		__REG(PIC0_BASE + PIC0_INTOEN_OFFS) -#define PIC0_MEN0		__REG(PIC0_BASE + PIC0_MEN0_OFFS) -#define PIC0_MEN		__REG(PIC0_BASE + PIC0_MEN_OFFS) - -#define PIC1_BASE	(APB1_PERI_BASE_VIRT + 0x3080) - -#define PIC1_IEN_OFFS		0x00 -#define PIC1_CREQ_OFFS		0x04 -#define PIC1_IREQ_OFFS		0x08 -#define PIC1_IRQSEL_OFFS	0x0c -#define PIC1_SRC_OFFS		0x10 -#define PIC1_MREQ_OFFS		0x14 -#define PIC1_TSTREQ_OFFS	0x18 -#define PIC1_POL_OFFS		0x1c -#define PIC1_IRQ_OFFS		0x20 -#define PIC1_FIQ_OFFS		0x24 -#define PIC1_MIRQ_OFFS		0x28 -#define PIC1_MFIQ_OFFS		0x2c -#define PIC1_TMODE_OFFS		0x30 -#define PIC1_SYNC_OFFS		0x34 -#define PIC1_WKUP_OFFS		0x38 -#define PIC1_TMODEA_OFFS	0x3c -#define PIC1_INTOEN_OFFS	0x40 -#define PIC1_MEN1_OFFS		0x44 -#define PIC1_MEN_OFFS		0x48 - -#define PIC1_IEN	__REG(PIC1_BASE + PIC1_IEN_OFFS) -#define PIC1_CREQ	__REG(PIC1_BASE + PIC1_CREQ_OFFS) -#define PIC1_IREQ	__REG(PIC1_BASE + PIC1_IREQ_OFFS) -#define PIC1_IRQSEL	__REG(PIC1_BASE + PIC1_IRQSEL_OFFS) -#define PIC1_SRC	__REG(PIC1_BASE + PIC1_SRC_OFFS) -#define PIC1_MREQ	__REG(PIC1_BASE + PIC1_MREQ_OFFS) -#define PIC1_TSTREQ	__REG(PIC1_BASE + PIC1_TSTREQ_OFFS) -#define PIC1_POL	__REG(PIC1_BASE + PIC1_POL_OFFS) -#define PIC1_IRQ	__REG(PIC1_BASE + PIC1_IRQ_OFFS) -#define PIC1_FIQ	__REG(PIC1_BASE + PIC1_FIQ_OFFS) -#define PIC1_MIRQ	__REG(PIC1_BASE + PIC1_MIRQ_OFFS) -#define PIC1_MFIQ	__REG(PIC1_BASE + PIC1_MFIQ_OFFS) -#define PIC1_TMODE	__REG(PIC1_BASE + PIC1_TMODE_OFFS) -#define PIC1_SYNC	__REG(PIC1_BASE + PIC1_SYNC_OFFS) -#define PIC1_WKUP	__REG(PIC1_BASE + PIC1_WKUP_OFFS) -#define PIC1_TMODEA	__REG(PIC1_BASE + PIC1_TMODEA_OFFS) -#define PIC1_INTOEN	__REG(PIC1_BASE + PIC1_INTOEN_OFFS) -#define PIC1_MEN1	__REG(PIC1_BASE + PIC1_MEN1_OFFS) -#define PIC1_MEN	__REG(PIC1_BASE + PIC1_MEN_OFFS) - -/* Timer registers */ -#define TIMER_BASE		(APB1_PERI_BASE_VIRT + 0x4000) -#define TIMER_BASE_PHYS		(APB1_PERI_BASE + 0x4000) - -#define TWDCFG_OFFS		0x70 - -#define TC32EN_OFFS		0x80 -#define TC32LDV_OFFS		0x84 -#define TC32CMP0_OFFS		0x88 -#define TC32CMP1_OFFS		0x8c -#define TC32PCNT_OFFS		0x90 -#define TC32MCNT_OFFS		0x94 -#define TC32IRQ_OFFS		0x98 - -/* Bits in TC32EN */ -#define TC32EN_PRESCALE_MASK	0x00ffffff -#define TC32EN_ENABLE		(1 << 24) -#define TC32EN_LOADZERO		(1 << 25) -#define TC32EN_STOPMODE		(1 << 26) -#define TC32EN_LDM0		(1 << 28) -#define TC32EN_LDM1		(1 << 29) - -/* Bits in TC32IRQ */ -#define TC32IRQ_MSTAT_MASK	0x0000001f -#define TC32IRQ_RSTAT_MASK	(0x1f << 8) -#define TC32IRQ_IRQEN0		(1 << 16) -#define TC32IRQ_IRQEN1		(1 << 17) -#define TC32IRQ_IRQEN2		(1 << 18) -#define TC32IRQ_IRQEN3		(1 << 19) -#define TC32IRQ_IRQEN4		(1 << 20) -#define TC32IRQ_RSYNC		(1 << 30) -#define TC32IRQ_IRQCLR		(1 << 31) - -/* GPIO registers */ -#define GPIOPD_BASE		(APB1_PERI_BASE_VIRT + 0x5000) - -#define GPIOPD_DAT_OFFS		0x00 -#define GPIOPD_DOE_OFFS		0x04 -#define GPIOPD_FS0_OFFS		0x08 -#define GPIOPD_FS1_OFFS		0x0c -#define GPIOPD_FS2_OFFS		0x10 -#define GPIOPD_RPU_OFFS		0x30 -#define GPIOPD_RPD_OFFS		0x34 -#define GPIOPD_DV0_OFFS		0x38 -#define GPIOPD_DV1_OFFS		0x3c - -#define GPIOPS_BASE		(APB1_PERI_BASE_VIRT + 0x5000) - -#define GPIOPS_DAT_OFFS		0x40 -#define GPIOPS_DOE_OFFS		0x44 -#define GPIOPS_FS0_OFFS		0x48 -#define GPIOPS_FS1_OFFS		0x4c -#define GPIOPS_FS2_OFFS		0x50 -#define GPIOPS_FS3_OFFS		0x54 -#define GPIOPS_RPU_OFFS		0x70 -#define GPIOPS_RPD_OFFS		0x74 -#define GPIOPS_DV0_OFFS		0x78 -#define GPIOPS_DV1_OFFS		0x7c - -#define GPIOPS_FS1_SDH0_BITS	0x000000ff -#define GPIOPS_FS1_SDH1_BITS	0x0000ff00 - -#define GPIOPU_BASE		(APB1_PERI_BASE_VIRT + 0x5000) - -#define GPIOPU_DAT_OFFS		0x80 -#define GPIOPU_DOE_OFFS		0x84 -#define GPIOPU_FS0_OFFS		0x88 -#define GPIOPU_FS1_OFFS		0x8c -#define GPIOPU_FS2_OFFS		0x90 -#define GPIOPU_RPU_OFFS		0xb0 -#define GPIOPU_RPD_OFFS		0xb4 -#define GPIOPU_DV0_OFFS		0xb8 -#define GPIOPU_DV1_OFFS		0xbc - -#define GPIOPU_FS0_TXD0		(1 << 0) -#define GPIOPU_FS0_RXD0		(1 << 1) -#define GPIOPU_FS0_CTS0		(1 << 2) -#define GPIOPU_FS0_RTS0		(1 << 3) -#define GPIOPU_FS0_TXD1		(1 << 4) -#define GPIOPU_FS0_RXD1		(1 << 5) -#define GPIOPU_FS0_CTS1		(1 << 6) -#define GPIOPU_FS0_RTS1		(1 << 7) -#define GPIOPU_FS0_TXD2		(1 << 8) -#define GPIOPU_FS0_RXD2		(1 << 9) -#define GPIOPU_FS0_CTS2		(1 << 10) -#define GPIOPU_FS0_RTS2		(1 << 11) -#define GPIOPU_FS0_TXD3		(1 << 12) -#define GPIOPU_FS0_RXD3		(1 << 13) -#define GPIOPU_FS0_CTS3		(1 << 14) -#define GPIOPU_FS0_RTS3		(1 << 15) -#define GPIOPU_FS0_TXD4		(1 << 16) -#define GPIOPU_FS0_RXD4		(1 << 17) -#define GPIOPU_FS0_CTS4		(1 << 18) -#define GPIOPU_FS0_RTS4		(1 << 19) - -#define GPIOFC_BASE		(APB1_PERI_BASE_VIRT + 0x5000) - -#define GPIOFC_DAT_OFFS		0xc0 -#define GPIOFC_DOE_OFFS		0xc4 -#define GPIOFC_FS0_OFFS		0xc8 -#define GPIOFC_FS1_OFFS		0xcc -#define GPIOFC_FS2_OFFS		0xd0 -#define GPIOFC_FS3_OFFS		0xd4 -#define GPIOFC_RPU_OFFS		0xf0 -#define GPIOFC_RPD_OFFS		0xf4 -#define GPIOFC_DV0_OFFS		0xf8 -#define GPIOFC_DV1_OFFS		0xfc - -#define GPIOFD_BASE		(APB1_PERI_BASE_VIRT + 0x5000) - -#define GPIOFD_DAT_OFFS		0x100 -#define GPIOFD_DOE_OFFS		0x104 -#define GPIOFD_FS0_OFFS		0x108 -#define GPIOFD_FS1_OFFS		0x10c -#define GPIOFD_FS2_OFFS		0x110 -#define GPIOFD_RPU_OFFS		0x130 -#define GPIOFD_RPD_OFFS		0x134 -#define GPIOFD_DV0_OFFS		0x138 -#define GPIOFD_DV1_OFFS		0x13c - -#define GPIOLC_BASE		(APB1_PERI_BASE_VIRT + 0x5000) - -#define GPIOLC_DAT_OFFS		0x140 -#define GPIOLC_DOE_OFFS		0x144 -#define GPIOLC_FS0_OFFS		0x148 -#define GPIOLC_FS1_OFFS		0x14c -#define GPIOLC_RPU_OFFS		0x170 -#define GPIOLC_RPD_OFFS		0x174 -#define GPIOLC_DV0_OFFS		0x178 -#define GPIOLC_DV1_OFFS		0x17c - -#define GPIOLD_BASE		(APB1_PERI_BASE_VIRT + 0x5000) - -#define GPIOLD_DAT_OFFS		0x180 -#define GPIOLD_DOE_OFFS		0x184 -#define GPIOLD_FS0_OFFS		0x188 -#define GPIOLD_FS1_OFFS		0x18c -#define GPIOLD_FS2_OFFS		0x190 -#define GPIOLD_RPU_OFFS		0x1b0 -#define GPIOLD_RPD_OFFS		0x1b4 -#define GPIOLD_DV0_OFFS		0x1b8 -#define GPIOLD_DV1_OFFS		0x1bc - -#define GPIOAD_BASE		(APB1_PERI_BASE_VIRT + 0x5000) - -#define GPIOAD_DAT_OFFS		0x1c0 -#define GPIOAD_DOE_OFFS		0x1c4 -#define GPIOAD_FS0_OFFS		0x1c8 -#define GPIOAD_RPU_OFFS		0x1f0 -#define GPIOAD_RPD_OFFS		0x1f4 -#define GPIOAD_DV0_OFFS		0x1f8 -#define GPIOAD_DV1_OFFS		0x1fc - -#define GPIOXC_BASE		(APB1_PERI_BASE_VIRT + 0x5000) - -#define GPIOXC_DAT_OFFS		0x200 -#define GPIOXC_DOE_OFFS		0x204 -#define GPIOXC_FS0_OFFS		0x208 -#define GPIOXC_RPU_OFFS		0x230 -#define GPIOXC_RPD_OFFS		0x234 -#define GPIOXC_DV0_OFFS		0x238 -#define GPIOXC_DV1_OFFS		0x23c - -#define GPIOXC_FS0		__REG(GPIOXC_BASE + GPIOXC_FS0_OFFS) - -#define GPIOXC_FS0_CS0		(1 << 26) -#define GPIOXC_FS0_CS1		(1 << 27) - -#define GPIOXD_BASE		(APB1_PERI_BASE_VIRT + 0x5000) - -#define GPIOXD_DAT_OFFS		0x240 -#define GPIOXD_FS0_OFFS		0x248 -#define GPIOXD_RPU_OFFS		0x270 -#define GPIOXD_RPD_OFFS		0x274 -#define GPIOXD_DV0_OFFS		0x278 -#define GPIOXD_DV1_OFFS		0x27c - -#define GPIOPK_BASE		(APB1_PERI_BASE_VIRT + 0x1c000) - -#define GPIOPK_RST_OFFS		0x008 -#define GPIOPK_DAT_OFFS		0x100 -#define GPIOPK_DOE_OFFS		0x104 -#define GPIOPK_FS0_OFFS		0x108 -#define GPIOPK_FS1_OFFS		0x10c -#define GPIOPK_FS2_OFFS		0x110 -#define GPIOPK_IRQST_OFFS	0x210 -#define GPIOPK_IRQEN_OFFS	0x214 -#define GPIOPK_IRQPOL_OFFS	0x218 -#define GPIOPK_IRQTM0_OFFS	0x21c -#define GPIOPK_IRQTM1_OFFS	0x220 -#define GPIOPK_CTL_OFFS		0x22c - -#define PMGPIO_BASE		(APB1_PERI_BASE_VIRT + 0x10000) -#define BACKUP_RAM_BASE		PMGPIO_BASE - -#define PMGPIO_DAT_OFFS		0x800 -#define PMGPIO_DOE_OFFS		0x804 -#define PMGPIO_FS0_OFFS		0x808 -#define PMGPIO_RPU_OFFS		0x810 -#define PMGPIO_RPD_OFFS		0x814 -#define PMGPIO_DV0_OFFS		0x818 -#define PMGPIO_DV1_OFFS		0x81c -#define PMGPIO_EE0_OFFS		0x820 -#define PMGPIO_EE1_OFFS		0x824 -#define PMGPIO_CTL_OFFS		0x828 -#define PMGPIO_DI_OFFS		0x82c -#define PMGPIO_STR_OFFS		0x830 -#define PMGPIO_STF_OFFS		0x834 -#define PMGPIO_POL_OFFS		0x838 -#define PMGPIO_APB_OFFS		0x800 - -/* Clock controller registers */ -#define CKC_BASE	((void __iomem *)(APB1_PERI_BASE_VIRT + 0x6000)) - -#define CLKCTRL_OFFS		0x00 -#define PLL0CFG_OFFS		0x04 -#define PLL1CFG_OFFS		0x08 -#define CLKDIVC0_OFFS		0x0c - -#define BCLKCTR0_OFFS		0x14 -#define SWRESET0_OFFS		0x18 - -#define BCLKCTR1_OFFS		0x60 -#define SWRESET1_OFFS		0x64 -#define PWDCTL_OFFS		0x68 -#define PLL2CFG_OFFS		0x6c -#define CLKDIVC1_OFFS		0x70 - -#define ACLKREF_OFFS		0x80 -#define ACLKI2C_OFFS		0x84 -#define ACLKSPI0_OFFS		0x88 -#define ACLKSPI1_OFFS		0x8c -#define ACLKUART0_OFFS		0x90 -#define ACLKUART1_OFFS		0x94 -#define ACLKUART2_OFFS		0x98 -#define ACLKUART3_OFFS		0x9c -#define ACLKUART4_OFFS		0xa0 -#define ACLKTCT_OFFS		0xa4 -#define ACLKTCX_OFFS		0xa8 -#define ACLKTCZ_OFFS		0xac -#define ACLKADC_OFFS		0xb0 -#define ACLKDAI0_OFFS		0xb4 -#define ACLKDAI1_OFFS		0xb8 -#define ACLKLCD_OFFS		0xbc -#define ACLKSPDIF_OFFS		0xc0 -#define ACLKUSBH_OFFS		0xc4 -#define ACLKSDH0_OFFS		0xc8 -#define ACLKSDH1_OFFS		0xcc -#define ACLKC3DEC_OFFS		0xd0 -#define ACLKEXT_OFFS		0xd4 -#define ACLKCAN0_OFFS		0xd8 -#define ACLKCAN1_OFFS		0xdc -#define ACLKGSB0_OFFS		0xe0 -#define ACLKGSB1_OFFS		0xe4 -#define ACLKGSB2_OFFS		0xe8 -#define ACLKGSB3_OFFS		0xec - -#define PLLxCFG_PD		(1 << 31) - -/* CLKCTRL bits */ -#define CLKCTRL_XE		(1 << 31) - -/* CLKDIVCx bits */ -#define CLKDIVC0_XTE		(1 << 7) -#define CLKDIVC0_XE		(1 << 15) -#define CLKDIVC0_P1E		(1 << 23) -#define CLKDIVC0_P0E		(1 << 31) - -#define CLKDIVC1_P2E		(1 << 7) - -/* BCLKCTR0 clock bits */ -#define BCLKCTR0_USBD		(1 << 4) -#define BCLKCTR0_ECC		(1 << 9) -#define BCLKCTR0_USBH0		(1 << 11) -#define BCLKCTR0_NFC		(1 << 16) - -/* BCLKCTR1 clock bits */ -#define BCLKCTR1_USBH1		(1 << 20) - -/* SWRESET0 bits */ -#define SWRESET0_USBD		(1 << 4) -#define SWRESET0_USBH0		(1 << 11) - -/* SWRESET1 bits */ -#define SWRESET1_USBH1		(1 << 20) - -/* System clock sources. - * Note: These are the clock sources that serve as parents for - * all other clocks. They have no parents themselves. - * - * These values are used for struct clk->root_id. All clocks - * that are not system clock sources have this value set to - * CLK_SRC_NOROOT. - * The values for system clocks start with CLK_SRC_PLL0 == 0 - * because this gives us exactly the values needed for the lower - * 4 bits of ACLK_* registers. Therefore, CLK_SRC_NOROOT is - * defined as -1 to not disturb the order. - */ -enum root_clks { -	CLK_SRC_NOROOT = -1, -	CLK_SRC_PLL0 = 0, -	CLK_SRC_PLL1, -	CLK_SRC_PLL0DIV, -	CLK_SRC_PLL1DIV, -	CLK_SRC_XI, -	CLK_SRC_XIDIV, -	CLK_SRC_XTI, -	CLK_SRC_XTIDIV, -	CLK_SRC_PLL2, -	CLK_SRC_PLL2DIV, -	CLK_SRC_PK0, -	CLK_SRC_PK1, -	CLK_SRC_PK2, -	CLK_SRC_PK3, -	CLK_SRC_PK4, -	CLK_SRC_48MHZ -}; - -#define CLK_SRC_MASK		0xf - -/* Bits in ACLK* registers */ -#define ACLK_EN		(1 << 28) -#define ACLK_SEL_SHIFT		24 -#define ACLK_SEL_MASK		0x0f000000 -#define ACLK_DIV_MASK		0x00000fff - -/* System configuration registers */ - -#define SCFG_BASE		(APB1_PERI_BASE_VIRT + 0x13000) - -#define	BMI_OFFS		0x00 -#define AHBCON0_OFFS		0x04 -#define APBPWE_OFFS		0x08 -#define DTCMWAIT_OFFS		0x0c -#define ECCSEL_OFFS		0x10 -#define AHBCON1_OFFS		0x14 -#define SDHCFG_OFFS		0x18 -#define REMAP_OFFS		0x20 -#define LCDSIAE_OFFS		0x24 -#define XMCCFG_OFFS		0xe0 -#define IMCCFG_OFFS		0xe4 - -/* Values for ECCSEL */ -#define ECCSEL_EXTMEM		0x0 -#define ECCSEL_DTCM		0x1 -#define ECCSEL_INT_SRAM		0x2 -#define ECCSEL_AHB		0x3 - -/* Bits in XMCCFG */ -#define XMCCFG_NFCE		(1 << 1) -#define XMCCFG_FDXD		(1 << 2) - -/* External memory controller registers */ - -#define EMC_BASE		EXT_MEM_CTRL_BASE - -#define SDCFG_OFFS		0x00 -#define SDFSM_OFFS		0x04 -#define MCFG_OFFS		0x08 - -#define CSCFG0_OFFS		0x10 -#define CSCFG1_OFFS		0x14 -#define CSCFG2_OFFS		0x18 -#define CSCFG3_OFFS		0x1c - -#define MCFG_SDEN		(1 << 4) - -#endif /* TCC8K_REGS_H */ diff --git a/arch/arm/plat-tcc/include/mach/timex.h b/arch/arm/plat-tcc/include/mach/timex.h deleted file mode 100644 index 057acbe651d..00000000000 --- a/arch/arm/plat-tcc/include/mach/timex.h +++ /dev/null @@ -1,5 +0,0 @@ -/* - * A definition needed by arch core code. - * - */ -#define CLOCK_TICK_RATE		(HZ * 100000UL) diff --git a/arch/arm/plat-tcc/include/mach/uncompress.h b/arch/arm/plat-tcc/include/mach/uncompress.h deleted file mode 100644 index 7a3e33a27a3..00000000000 --- a/arch/arm/plat-tcc/include/mach/uncompress.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2009 Hans J. Koch <hjk@linutronix.de> - * - * This file is licensed under the terms of the GPL version 2. - */ - -#include <linux/serial_reg.h> -#include <linux/types.h> - -#include <mach/tcc8k-regs.h> - -unsigned int system_rev; - -#define ID_MASK			0x7fff - -static void putc(int c) -{ -	u32 *uart_lsr = (u32 *)(UART_BASE_PHYS + (UART_LSR << 2)); -	u32 *uart_tx = (u32 *)(UART_BASE_PHYS + (UART_TX << 2)); - -	while (!(*uart_lsr & UART_LSR_THRE)) -		barrier(); -	*uart_tx = c; -} - -static inline void flush(void) -{ -} - -/* - * nothing to do - */ -#define arch_decomp_setup() -#define arch_decomp_wdog() diff --git a/arch/arm/plat-tcc/system.c b/arch/arm/plat-tcc/system.c deleted file mode 100644 index cc208fae3e7..00000000000 --- a/arch/arm/plat-tcc/system.c +++ /dev/null @@ -1,25 +0,0 @@ -/* - * System functions for Telechips TCCxxxx SoCs - * - * Copyright (C) Hans J. Koch <hjk@linutronix.de> - * - * Licensed under the terms of the GPL v2. - * - */ - -#include <linux/io.h> - -#include <mach/tcc8k-regs.h> - -/* System reboot */ -void plat_tcc_reboot(void) -{ -	/* Make sure clocks are on */ -	__raw_writel(0xffffffff, CKC_BASE + BCLKCTR0_OFFS); - -	/* Enable watchdog reset */ -	__raw_writel(0x49, TIMER_BASE + TWDCFG_OFFS); -	/* Wait for reset */ -	while(1) -		; -}  |