diff options
Diffstat (limited to 'arch')
1046 files changed, 15794 insertions, 22388 deletions
diff --git a/arch/Kconfig b/arch/Kconfig index 366ec06a518..34884faf98c 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -300,15 +300,16 @@ config SECCOMP_FILTER  	  See Documentation/prctl/seccomp_filter.txt for details. -config HAVE_RCU_USER_QS +config HAVE_CONTEXT_TRACKING  	bool  	help -	  Provide kernel entry/exit hooks necessary for userspace -	  RCU extended quiescent state. Syscalls need to be wrapped inside -	  rcu_user_exit()-rcu_user_enter() through the slow path using -	  TIF_NOHZ flag. Exceptions handlers must be wrapped as well. Irqs -	  are already protected inside rcu_irq_enter/rcu_irq_exit() but -	  preemption or signal handling on irq exit still need to be protected. +	  Provide kernel/user boundaries probes necessary for subsystems +	  that need it, such as userspace RCU extended quiescent state. +	  Syscalls need to be wrapped inside user_exit()-user_enter() through +	  the slow path using TIF_NOHZ flag. Exceptions handlers must be +	  wrapped as well. Irqs are already protected inside +	  rcu_irq_enter/rcu_irq_exit() but preemption or signal handling on +	  irq exit still need to be protected.  config HAVE_VIRT_CPU_ACCOUNTING  	bool @@ -341,4 +342,18 @@ config MODULES_USE_ELF_REL  	  Modules only use ELF REL relocations.  Modules with ELF RELA  	  relocations will give an error. +# +# ABI hall of shame +# +config CLONE_BACKWARDS +	bool +	help +	  Architecture has tls passed as the 4th argument of clone(2), +	  not the 5th one. + +config CLONE_BACKWARDS2 +	bool +	help +	  Architecture has the first two arguments of clone(2) swapped. +  source "kernel/gcov/Kconfig" diff --git a/arch/alpha/include/asm/Kbuild b/arch/alpha/include/asm/Kbuild index 64ffc9e9e54..dcfabb9f05a 100644 --- a/arch/alpha/include/asm/Kbuild +++ b/arch/alpha/include/asm/Kbuild @@ -11,3 +11,4 @@ header-y += reg.h  header-y += regdef.h  header-y += sysinfo.h  generic-y += exec.h +generic-y += trace_clock.h diff --git a/arch/alpha/include/asm/ioctls.h b/arch/alpha/include/asm/ioctls.h index 80e1cee90f1..92c557be49f 100644 --- a/arch/alpha/include/asm/ioctls.h +++ b/arch/alpha/include/asm/ioctls.h @@ -95,6 +95,9 @@  #define TIOCGDEV	_IOR('T',0x32, unsigned int) /* Get primary device node of /dev/console */  #define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */  #define TIOCVHANGUP	0x5437 +#define TIOCGPKT	_IOR('T', 0x38, int) /* Get packet mode state */ +#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */ +#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */  #define TIOCSERCONFIG	0x5453  #define TIOCSERGWILD	0x5454 diff --git a/arch/alpha/include/asm/mman.h b/arch/alpha/include/asm/mman.h index cbeb3616a28..0086b472bc2 100644 --- a/arch/alpha/include/asm/mman.h +++ b/arch/alpha/include/asm/mman.h @@ -63,4 +63,15 @@  /* compatibility flags */  #define MAP_FILE	0 +/* + * When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size. + * This gives us 6 bits, which is enough until someone invents 128 bit address + * spaces. + * + * Assume these are all power of twos. + * When 0 use the default page size. + */ +#define MAP_HUGE_SHIFT	26 +#define MAP_HUGE_MASK	0x3f +  #endif /* __ALPHA_MMAN_H__ */ diff --git a/arch/alpha/include/asm/ptrace.h b/arch/alpha/include/asm/ptrace.h index b87755a1955..b4c5b2fbb64 100644 --- a/arch/alpha/include/asm/ptrace.h +++ b/arch/alpha/include/asm/ptrace.h @@ -78,6 +78,7 @@ struct switch_stack {  #define current_pt_regs() \    ((struct pt_regs *) ((char *)current_thread_info() + 2*PAGE_SIZE) - 1) +#define signal_pt_regs current_pt_regs  #define force_successful_syscall_return() (current_pt_regs()->r0 = 0) diff --git a/arch/alpha/include/asm/signal.h b/arch/alpha/include/asm/signal.h index a9388300abb..45552862cc1 100644 --- a/arch/alpha/include/asm/signal.h +++ b/arch/alpha/include/asm/signal.h @@ -164,9 +164,6 @@ struct sigstack {  #ifdef __KERNEL__  #include <asm/sigcontext.h> - -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -  #endif  #endif diff --git a/arch/alpha/include/asm/socket.h b/arch/alpha/include/asm/socket.h index 7d2f75be932..0087d053b77 100644 --- a/arch/alpha/include/asm/socket.h +++ b/arch/alpha/include/asm/socket.h @@ -47,6 +47,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER        26  #define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		28  #define SO_TIMESTAMP		29 diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h index 7826e227e4d..eb3a4664ced 100644 --- a/arch/alpha/include/asm/unistd.h +++ b/arch/alpha/include/asm/unistd.h @@ -482,6 +482,9 @@  #define __ARCH_WANT_SYS_SIGPENDING  #define __ARCH_WANT_SYS_RT_SIGSUSPEND  #define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  /* "Conditional" syscalls.  What we want is diff --git a/arch/alpha/kernel/binfmt_loader.c b/arch/alpha/kernel/binfmt_loader.c index d1f474d1d44..9525660c93c 100644 --- a/arch/alpha/kernel/binfmt_loader.c +++ b/arch/alpha/kernel/binfmt_loader.c @@ -5,7 +5,7 @@  #include <linux/binfmts.h>  #include <linux/a.out.h> -static int load_binary(struct linux_binprm *bprm, struct pt_regs *regs) +static int load_binary(struct linux_binprm *bprm)  {  	struct exec *eh = (struct exec *)bprm->buf;  	unsigned long loader; @@ -37,7 +37,7 @@ static int load_binary(struct linux_binprm *bprm, struct pt_regs *regs)  	retval = prepare_binprm(bprm);  	if (retval < 0)  		return retval; -	return search_binary_handler(bprm,regs); +	return search_binary_handler(bprm);  }  static struct linux_binfmt loader_format = { diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index a7607832dd4..f62a994ef12 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S @@ -612,47 +612,24 @@ ret_from_kernel_thread:   * Special system calls.  Most of these are special in that they either   * have to play switch_stack games or in some way use the pt_regs struct.   */ -	.align	4 -	.globl	sys_fork -	.ent	sys_fork -sys_fork: -	.prologue 0 -	mov	$sp, $21 -	bsr	$1, do_switch_stack -	bis	$31, SIGCHLD, $16 -	mov	$31, $17 -	mov	$31, $18 -	mov	$31, $19 -	mov	$31, $20 -	jsr	$26, alpha_clone -	bsr	$1, undo_switch_stack -	ret -.end sys_fork +.macro	fork_like name  	.align	4 -	.globl	sys_clone -	.ent	sys_clone -sys_clone: +	.globl	alpha_\name +	.ent	alpha_\name +alpha_\name:  	.prologue 0 -	mov	$sp, $21  	bsr	$1, do_switch_stack -	/* $16, $17, $18, $19, $20 come from the user.  */ -	jsr	$26, alpha_clone -	bsr	$1, undo_switch_stack +	jsr	$26, sys_\name +	ldq	$26, 56($sp) +	lda	$sp, SWITCH_STACK_SIZE($sp)  	ret -.end sys_clone +.end	alpha_\name +.endm -	.align	4 -	.globl	sys_vfork -	.ent	sys_vfork -sys_vfork: -	.prologue 0 -	mov	$sp, $16 -	bsr	$1, do_switch_stack -	jsr	$26, alpha_vfork -	bsr	$1, undo_switch_stack -	ret -.end sys_vfork +fork_like fork +fork_like vfork +fork_like clone  	.align	4  	.globl	sys_sigreturn @@ -661,8 +638,6 @@ sys_sigreturn:  	.prologue 0  	lda	$9, ret_from_straced  	cmpult	$26, $9, $9 -	mov	$sp, $17 -	lda	$18, -SWITCH_STACK_SIZE($sp)  	lda	$sp, -SWITCH_STACK_SIZE($sp)  	jsr	$26, do_sigreturn  	bne	$9, 1f @@ -678,8 +653,6 @@ sys_rt_sigreturn:  	.prologue 0  	lda	$9, ret_from_straced  	cmpult	$26, $9, $9 -	mov	$sp, $17 -	lda	$18, -SWITCH_STACK_SIZE($sp)  	lda	$sp, -SWITCH_STACK_SIZE($sp)  	jsr	$26, do_rt_sigreturn  	bne	$9, 1f diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index 51987dcf79b..b5d0d092369 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c @@ -235,51 +235,28 @@ release_thread(struct task_struct *dead_task)  }  /* - * "alpha_clone()".. By the time we get here, the - * non-volatile registers have also been saved on the - * stack. We do some ugly pointer stuff here.. (see - * also copy_thread) - * - * Notice that "fork()" is implemented in terms of clone, - * with parameters (SIGCHLD, 0). - */ -int -alpha_clone(unsigned long clone_flags, unsigned long usp, -	    int __user *parent_tid, int __user *child_tid, -	    unsigned long tls_value, struct pt_regs *regs) -{ -	if (!usp) -		usp = rdusp(); - -	return do_fork(clone_flags, usp, regs, 0, parent_tid, child_tid); -} - -int -alpha_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), -		       regs, 0, NULL, NULL); -} - -/*   * Copy an alpha thread..   */  int  copy_thread(unsigned long clone_flags, unsigned long usp,  	    unsigned long arg, -	    struct task_struct * p, struct pt_regs * regs) +	    struct task_struct *p)  {  	extern void ret_from_fork(void);  	extern void ret_from_kernel_thread(void);  	struct thread_info *childti = task_thread_info(p);  	struct pt_regs *childregs = task_pt_regs(p); +	struct pt_regs *regs = current_pt_regs();  	struct switch_stack *childstack, *stack;  	unsigned long settls;  	childstack = ((struct switch_stack *) childregs) - 1; -	if (unlikely(!regs)) { +	childti->pcb.ksp = (unsigned long) childstack; +	childti->pcb.flags = 1;	/* set FEN, clear everything else */ + +	if (unlikely(p->flags & PF_KTHREAD)) {  		/* kernel thread */  		memset(childstack, 0,  			sizeof(struct switch_stack) + sizeof(struct pt_regs)); @@ -288,12 +265,17 @@ copy_thread(unsigned long clone_flags, unsigned long usp,  		childstack->r10 = arg;  		childregs->hae = alpha_mv.hae_cache,  		childti->pcb.usp = 0; -		childti->pcb.ksp = (unsigned long) childstack; -		childti->pcb.flags = 1;	/* set FEN, clear everything else */  		return 0;  	} +	/* Note: if CLONE_SETTLS is not set, then we must inherit the +	   value from the parent, which will have been set by the block +	   copy in dup_task_struct.  This is non-intuitive, but is +	   required for proper operation in the case of a threaded +	   application calling fork.  */ +	if (clone_flags & CLONE_SETTLS) +		childti->pcb.unique = regs->r20; +	childti->pcb.usp = usp ?: rdusp();  	*childregs = *regs; -	settls = regs->r20;  	childregs->r0 = 0;  	childregs->r19 = 0;  	childregs->r20 = 1;	/* OSF/1 has some strange fork() semantics.  */ @@ -301,22 +283,6 @@ copy_thread(unsigned long clone_flags, unsigned long usp,  	stack = ((struct switch_stack *) regs) - 1;  	*childstack = *stack;  	childstack->r26 = (unsigned long) ret_from_fork; -	childti->pcb.usp = usp; -	childti->pcb.ksp = (unsigned long) childstack; -	childti->pcb.flags = 1;	/* set FEN, clear everything else */ - -	/* Set a new TLS for the child thread?  Peek back into the -	   syscall arguments that we saved on syscall entry.  Oops, -	   except we'd have clobbered it with the parent/child set -	   of r20.  Read the saved copy.  */ -	/* Note: if CLONE_SETTLS is not set, then we must inherit the -	   value from the parent, which will have been set by the block -	   copy in dup_task_struct.  This is non-intuitive, but is -	   required for proper operation in the case of a threaded -	   application calling fork.  */ -	if (clone_flags & CLONE_SETTLS) -		childti->pcb.unique = settls; -  	return 0;  } diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 32575f85507..336393c9c11 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c @@ -160,10 +160,10 @@ extern char compile_time_assert  #define INSN_CALLSYS		0x00000083  static long -restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, -		   struct switch_stack *sw) +restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs)  {  	unsigned long usp; +	struct switch_stack *sw = (struct switch_stack *)regs - 1;  	long i, err = __get_user(regs->pc, &sc->sc_pc);  	current_thread_info()->restart_block.fn = do_no_restart_syscall; @@ -215,9 +215,9 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,     registers and transfer control from userland.  */  asmlinkage void -do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs, -	     struct switch_stack *sw) +do_sigreturn(struct sigcontext __user *sc)  { +	struct pt_regs *regs = current_pt_regs();  	sigset_t set;  	/* Verify that it's a good sigcontext before using it */ @@ -228,7 +228,7 @@ do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs,  	set_current_blocked(&set); -	if (restore_sigcontext(sc, regs, sw)) +	if (restore_sigcontext(sc, regs))  		goto give_sigsegv;  	/* Send SIGTRAP if we're single-stepping: */ @@ -249,9 +249,9 @@ give_sigsegv:  }  asmlinkage void -do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs, -		struct switch_stack *sw) +do_rt_sigreturn(struct rt_sigframe __user *frame)  { +	struct pt_regs *regs = current_pt_regs();  	sigset_t set;  	/* Verify that it's a good ucontext_t before using it */ @@ -262,7 +262,7 @@ do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs,  	set_current_blocked(&set); -	if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw)) +	if (restore_sigcontext(&frame->uc.uc_mcontext, regs))  		goto give_sigsegv;  	/* Send SIGTRAP if we're single-stepping: */ diff --git a/arch/alpha/kernel/srmcons.c b/arch/alpha/kernel/srmcons.c index 5d5865204a1..59b7bbad839 100644 --- a/arch/alpha/kernel/srmcons.c +++ b/arch/alpha/kernel/srmcons.c @@ -205,7 +205,6 @@ static const struct tty_operations srmcons_ops = {  static int __init  srmcons_init(void)  { -	tty_port_init(&srmcons_singleton.port);  	setup_timer(&srmcons_singleton.timer, srmcons_receive_chars,  			(unsigned long)&srmcons_singleton);  	if (srm_is_registered_console) { @@ -215,6 +214,9 @@ srmcons_init(void)  		driver = alloc_tty_driver(MAX_SRM_CONSOLE_DEVICES);  		if (!driver)  			return -ENOMEM; + +		tty_port_init(&srmcons_singleton.port); +  		driver->driver_name = "srm";  		driver->name = "srm";  		driver->major = 0; 	/* dynamic */ @@ -227,6 +229,7 @@ srmcons_init(void)  		err = tty_register_driver(driver);  		if (err) {  			put_tty_driver(driver); +			tty_port_destroy(&srmcons_singleton.port);  			return err;  		}  		srmcons_driver = driver; diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S index 2ac6b45c3e0..4284ec798ec 100644 --- a/arch/alpha/kernel/systbls.S +++ b/arch/alpha/kernel/systbls.S @@ -12,7 +12,7 @@  sys_call_table:  	.quad alpha_ni_syscall			/* 0 */  	.quad sys_exit -	.quad sys_fork +	.quad alpha_fork  	.quad sys_read  	.quad sys_write  	.quad alpha_ni_syscall			/* 5 */ @@ -76,7 +76,7 @@ sys_call_table:  	.quad sys_getpgrp  	.quad sys_getpagesize  	.quad alpha_ni_syscall			/* 65 */ -	.quad sys_vfork +	.quad alpha_vfork  	.quad sys_newstat  	.quad sys_newlstat  	.quad alpha_ni_syscall @@ -330,7 +330,7 @@ sys_call_table:  	.quad sys_ni_syscall			/* 309: old get_kernel_syms */  	.quad sys_syslog			/* 310 */  	.quad sys_reboot -	.quad sys_clone +	.quad alpha_clone  	.quad sys_uselib  	.quad sys_mlock  	.quad sys_munlock			/* 315 */ diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index a920f2c422e..2277f9530b0 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -5,8 +5,9 @@ config ARM  	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE  	select ARCH_HAVE_CUSTOM_GPIO_H  	select ARCH_WANT_IPC_PARSE_VERSION +	select BUILDTIME_EXTABLE_SORT if MMU  	select CPU_PM if (SUSPEND || CPU_IDLE) -	select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN +	select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN && MMU  	select GENERIC_ATOMIC64 if (CPU_V6 || !CPU_32v6K || !AEABI)  	select GENERIC_CLOCKEVENTS_BROADCAST if SMP  	select GENERIC_IRQ_PROBE @@ -21,6 +22,7 @@ config ARM  	select HAVE_AOUT  	select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL  	select HAVE_ARCH_KGDB +	select HAVE_ARCH_SECCOMP_FILTER  	select HAVE_ARCH_TRACEHOOK  	select HAVE_BPF_JIT  	select HAVE_C_RECORDMCOUNT @@ -55,6 +57,7 @@ config ARM  	select SYS_SUPPORTS_APM_EMULATION  	select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND  	select MODULES_USE_ELF_REL +	select CLONE_BACKWARDS  	help  	  The ARM series is a line of low-power-consumption RISC chip designs  	  licensed by ARM Ltd and targeted at embedded applications and @@ -284,8 +287,8 @@ config ARCH_INTEGRATOR  	select MULTI_IRQ_HANDLER  	select NEED_MACH_MEMORY_H  	select PLAT_VERSATILE -	select PLAT_VERSATILE_FPGA_IRQ  	select SPARSE_IRQ +	select VERSATILE_FPGA_IRQ  	help  	  Support for ARM's Integrator platform. @@ -318,7 +321,7 @@ config ARCH_VERSATILE  	select PLAT_VERSATILE  	select PLAT_VERSATILE_CLCD  	select PLAT_VERSATILE_CLOCK -	select PLAT_VERSATILE_FPGA_IRQ +	select VERSATILE_FPGA_IRQ  	help  	  This enables support for ARM Ltd Versatile board. @@ -330,13 +333,15 @@ config ARCH_AT91  	select IRQ_DOMAIN  	select NEED_MACH_GPIO_H  	select NEED_MACH_IO_H if PCCARD +	select PINCTRL +	select PINCTRL_AT91 if USE_OF  	help  	  This enables support for systems based on Atmel  	  AT91RM9200 and AT91SAM9* processors.  config ARCH_BCM2835  	bool "Broadcom BCM2835 family" -	select ARCH_WANT_OPTIONAL_GPIOLIB +	select ARCH_REQUIRE_GPIOLIB  	select ARM_AMBA  	select ARM_ERRATA_411920  	select ARM_TIMER_SP804 @@ -344,7 +349,10 @@ config ARCH_BCM2835  	select COMMON_CLK  	select CPU_V6  	select GENERIC_CLOCKEVENTS +	select GENERIC_GPIO  	select MULTI_IRQ_HANDLER +	select PINCTRL +	select PINCTRL_BCM2835  	select SPARSE_IRQ  	select USE_OF  	help @@ -364,11 +372,16 @@ config ARCH_CNS3XXX  config ARCH_CLPS711X  	bool "Cirrus Logic CLPS711x/EP721x/EP731x-based" +	select ARCH_REQUIRE_GPIOLIB  	select ARCH_USES_GETTIMEOFFSET +	select AUTO_ZRELADDR  	select CLKDEV_LOOKUP  	select COMMON_CLK  	select CPU_ARM720T +	select GENERIC_CLOCKEVENTS +	select MULTI_IRQ_HANDLER  	select NEED_MACH_MEMORY_H +	select SPARSE_IRQ  	help  	  Support for Cirrus Logic 711x/721x/731x based boards. @@ -536,6 +549,7 @@ config ARCH_KIRKWOOD  	select CPU_FEROCEON  	select GENERIC_CLOCKEVENTS  	select PCI +	select PCI_QUIRKS  	select PINCTRL  	select PINCTRL_KIRKWOOD  	select PLAT_ORION_LEGACY @@ -577,6 +591,7 @@ config ARCH_MMP  	select GPIO_PXA  	select IRQ_DOMAIN  	select NEED_MACH_GPIO_H +	select PINCTRL  	select PLAT_PXA  	select SPARSE_IRQ  	help @@ -635,6 +650,7 @@ config ARCH_TEGRA  	select HAVE_CLK  	select HAVE_SMP  	select MIGHT_HAVE_CACHE_L2X0 +	select SPARSE_IRQ  	select USE_OF  	help  	  This enables support for NVIDIA Tegra based systems (Tegra APX, @@ -876,6 +892,7 @@ config ARCH_U8500  	select GENERIC_CLOCKEVENTS  	select HAVE_SMP  	select MIGHT_HAVE_CACHE_L2X0 +	select SPARSE_IRQ  	help  	  Support for ST-Ericsson's Ux500 architecture @@ -890,11 +907,13 @@ config ARCH_NOMADIK  	select MIGHT_HAVE_CACHE_L2X0  	select PINCTRL  	select PINCTRL_STN8815 +	select SPARSE_IRQ  	help  	  Support for the Nomadik platform by ST-Ericsson  config PLAT_SPEAR  	bool "ST SPEAr" +	select ARCH_HAS_CPUFREQ  	select ARCH_REQUIRE_GPIOLIB  	select ARM_AMBA  	select CLKDEV_LOOKUP @@ -932,7 +951,7 @@ config ARCH_OMAP  	help  	  Support for TI's OMAP platform (OMAP1/2/3/4). -config ARCH_VT8500 +config ARCH_VT8500_SINGLE  	bool "VIA/WonderMedia 85xx"  	select ARCH_HAS_CPUFREQ  	select ARCH_REQUIRE_GPIOLIB @@ -942,22 +961,12 @@ config ARCH_VT8500  	select GENERIC_CLOCKEVENTS  	select GENERIC_GPIO  	select HAVE_CLK +	select MULTI_IRQ_HANDLER +	select SPARSE_IRQ  	select USE_OF  	help  	  Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip. -config ARCH_ZYNQ -	bool "Xilinx Zynq ARM Cortex A9 Platform" -	select ARM_AMBA -	select ARM_GIC -	select COMMON_CLK -	select CPU_V7 -	select GENERIC_CLOCKEVENTS -	select ICST -	select MIGHT_HAVE_CACHE_L2X0 -	select USE_OF -	help -	  Support for Xilinx Zynq ARM Cortex A9 Platform  endchoice  menu "Multiple platform selection" @@ -1013,6 +1022,8 @@ source "arch/arm/mach-mvebu/Kconfig"  source "arch/arm/mach-at91/Kconfig" +source "arch/arm/mach-bcm/Kconfig" +  source "arch/arm/mach-clps711x/Kconfig"  source "arch/arm/mach-cns3xxx/Kconfig" @@ -1056,7 +1067,6 @@ source "arch/arm/mach-mxs/Kconfig"  source "arch/arm/mach-netx/Kconfig"  source "arch/arm/mach-nomadik/Kconfig" -source "arch/arm/plat-nomadik/Kconfig"  source "arch/arm/plat-omap/Kconfig" @@ -1104,6 +1114,8 @@ source "arch/arm/mach-exynos/Kconfig"  source "arch/arm/mach-shmobile/Kconfig" +source "arch/arm/mach-sunxi/Kconfig" +  source "arch/arm/mach-prima2/Kconfig"  source "arch/arm/mach-tegra/Kconfig" @@ -1117,8 +1129,12 @@ source "arch/arm/mach-versatile/Kconfig"  source "arch/arm/mach-vexpress/Kconfig"  source "arch/arm/plat-versatile/Kconfig" +source "arch/arm/mach-vt8500/Kconfig" +  source "arch/arm/mach-w90x900/Kconfig" +source "arch/arm/mach-zynq/Kconfig" +  # Definitions to make life easier  config ARCH_ACORN  	bool diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index 00e9a53888b..661030d6bc6 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug @@ -347,6 +347,17 @@ choice  		  The uncompressor code port configuration is now handled  		  by CONFIG_S3C_LOWLEVEL_UART_PORT. +	config DEBUG_S3C_UART3 +		depends on PLAT_SAMSUNG && ARCH_EXYNOS +		bool "Use S3C UART 3 for low-level debug" +		help +		  Say Y here if you want the debug print routines to direct +		  their output to UART 3. The port must have been initialised +		  by the boot-loader before use. + +		  The uncompressor code port configuration is now handled +		  by CONFIG_S3C_LOWLEVEL_UART_PORT. +  	config DEBUG_SOCFPGA_UART  		depends on ARCH_SOCFPGA  		bool "Use SOCFPGA UART for low-level debug" @@ -354,6 +365,27 @@ choice  		  Say Y here if you want kernel low-level debugging support  		  on SOCFPGA based platforms. +	config DEBUG_SUNXI_UART0 +		bool "Kernel low-level debugging messages via sunXi UART0" +		depends on ARCH_SUNXI +		help +		  Say Y here if you want kernel low-level debugging support +		  on Allwinner A1X based platforms on the UART0. + +	config DEBUG_SUNXI_UART1 +		bool "Kernel low-level debugging messages via sunXi UART1" +		depends on ARCH_SUNXI +		help +		  Say Y here if you want kernel low-level debugging support +		  on Allwinner A1X based platforms on the UART1. + +	config DEBUG_TEGRA_UART +		depends on ARCH_TEGRA +		bool "Use Tegra UART for low-level debug" +		help +		  Say Y here if you want kernel low-level debugging support +		  on Tegra based platforms. +  	config DEBUG_VEXPRESS_UART0_DETECT  		bool "Autodetect UART0 on Versatile Express Cortex-A core tiles"  		depends on ARCH_VEXPRESS && CPU_CP15_MMU @@ -427,6 +459,36 @@ config DEBUG_IMX6Q_UART_PORT  	  Choose UART port on which kernel low-level debug messages  	  should be output. +choice +	prompt "Low-level debug console UART" +	depends on DEBUG_LL && DEBUG_TEGRA_UART + +	config TEGRA_DEBUG_UART_AUTO_ODMDATA +	bool "Via ODMDATA" +	help +	  Automatically determines which UART to use for low-level debug based +	  on the ODMDATA value. This value is part of the BCT, and is written +	  to the boot memory device using nvflash, or other flashing tool. +	  When bits 19:18 are 3, then bits 17:15 indicate which UART to use; +	  0/1/2/3/4 are UART A/B/C/D/E. + +	config TEGRA_DEBUG_UARTA +		bool "UART A" + +	config TEGRA_DEBUG_UARTB +		bool "UART B" + +	config TEGRA_DEBUG_UARTC +		bool "UART C" + +	config TEGRA_DEBUG_UARTD +		bool "UART D" + +	config TEGRA_DEBUG_UARTE +		bool "UART E" + +endchoice +  config DEBUG_LL_INCLUDE  	string  	default "debug/icedcc.S" if DEBUG_ICEDCC @@ -441,8 +503,11 @@ config DEBUG_LL_INCLUDE  	default "debug/mvebu.S" if DEBUG_MVEBU_UART  	default "debug/picoxcell.S" if DEBUG_PICOXCELL_UART  	default "debug/socfpga.S" if DEBUG_SOCFPGA_UART +	default "debug/sunxi.S" if DEBUG_SUNXI_UART0 || DEBUG_SUNXI_UART1  	default "debug/vexpress.S" if DEBUG_VEXPRESS_UART0_DETECT || \  		DEBUG_VEXPRESS_UART0_CA9 || DEBUG_VEXPRESS_UART0_RS1 +	default "debug/tegra.S" if DEBUG_TEGRA_UART +	default "debug/zynq.S" if DEBUG_ZYNQ_UART0 || DEBUG_ZYNQ_UART1  	default "mach/debug-macro.S"  config EARLY_PRINTK diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 97252d86a70..30c443c406f 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -32,6 +32,7 @@ KBUILD_DEFCONFIG := versatile_defconfig  # defines filename extension depending memory management type.  ifeq ($(CONFIG_MMU),)  MMUEXT		:= -nommu +KBUILD_CFLAGS	+= $(call cc-option,-mno-unaligned-access)  endif  ifeq ($(CONFIG_FRAME_POINTER),y) @@ -137,6 +138,7 @@ textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000  # Machine directory name.  This list is sorted alphanumerically  # by CONFIG_* macro name.  machine-$(CONFIG_ARCH_AT91)		+= at91 +machine-$(CONFIG_ARCH_BCM)		+= bcm  machine-$(CONFIG_ARCH_BCM2835)		+= bcm2835  machine-$(CONFIG_ARCH_CLPS711X)		+= clps711x  machine-$(CONFIG_ARCH_CNS3XXX)		+= cns3xxx @@ -193,13 +195,13 @@ machine-$(CONFIG_ARCH_SPEAR13XX)	+= spear13xx  machine-$(CONFIG_ARCH_SPEAR3XX)		+= spear3xx  machine-$(CONFIG_MACH_SPEAR600)		+= spear6xx  machine-$(CONFIG_ARCH_ZYNQ)		+= zynq +machine-$(CONFIG_ARCH_SUNXI)		+= sunxi  # Platform directory name.  This list is sorted alphanumerically  # by CONFIG_* macro name.  plat-$(CONFIG_ARCH_OMAP)	+= omap  plat-$(CONFIG_ARCH_S3C64XX)	+= samsung  plat-$(CONFIG_PLAT_IOP)		+= iop -plat-$(CONFIG_PLAT_NOMADIK)	+= nomadik  plat-$(CONFIG_PLAT_ORION)	+= orion  plat-$(CONFIG_PLAT_PXA)		+= pxa  plat-$(CONFIG_PLAT_S3C24XX)	+= s3c24xx samsung @@ -290,10 +292,10 @@ zinstall uinstall install: vmlinux  	$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@  %.dtb: scripts -	$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ +	$(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) $(boot)/dts/$@  dtbs: scripts -	$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ +	$(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) dtbs  # We use MRPROPER_FILES and CLEAN_FILES now  archclean: diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile index 9137df539b6..abfce280f57 100644 --- a/arch/arm/boot/Makefile +++ b/arch/arm/boot/Makefile @@ -15,8 +15,6 @@ ifneq ($(MACHINE),)  include $(srctree)/$(MACHINE)/Makefile.boot  endif -include $(srctree)/arch/arm/boot/dts/Makefile -  # Note: the following conditions must always be true:  #   ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)  #   PARAMS_PHYS must be within 4MB of ZRELADDR @@ -59,16 +57,6 @@ $(obj)/zImage:	$(obj)/compressed/vmlinux FORCE  endif -targets += $(dtb-y) - -# Rule to build device tree blobs -$(obj)/%.dtb: $(src)/dts/%.dts FORCE -	$(call if_changed_dep,dtc) - -$(obj)/dtbs: $(addprefix $(obj)/, $(dtb-y)) - -clean-files := *.dtb -  ifneq ($(LOADADDR),)    UIMAGE_LOADADDR=$(LOADADDR)  else diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index 537208f22e5..5cad8a6dadb 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile @@ -45,11 +45,6 @@ ifeq ($(CONFIG_ARCH_SHARK),y)  OBJS		+= head-shark.o ofw-shark.o  endif -ifeq ($(CONFIG_ARCH_P720T),y) -# Borrow this code from SA1100 -OBJS		+= head-sa1100.o -endif -  ifeq ($(CONFIG_ARCH_SA1100),y)  OBJS		+= head-sa1100.o  endif diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 90275f036cd..49ca86e37b8 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S @@ -652,6 +652,15 @@ __setup_mmu:	sub	r3, r4, #16384		@ Page directory size  		mov	pc, lr  ENDPROC(__setup_mmu) +@ Enable unaligned access on v6, to allow better code generation +@ for the decompressor C code: +__armv6_mmu_cache_on: +		mrc	p15, 0, r0, c1, c0, 0	@ read SCTLR +		bic	r0, r0, #2		@ A (no unaligned access fault) +		orr	r0, r0, #1 << 22	@ U (v6 unaligned access model) +		mcr	p15, 0, r0, c1, c0, 0	@ write SCTLR +		b	__armv4_mmu_cache_on +  __arm926ejs_mmu_cache_on:  #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH  		mov	r0, #4			@ put dcache in WT mode @@ -694,6 +703,9 @@ __armv7_mmu_cache_on:  		bic	r0, r0, #1 << 28	@ clear SCTLR.TRE  		orr	r0, r0, #0x5000		@ I-cache enable, RR cache replacement  		orr	r0, r0, #0x003c		@ write buffer +		bic	r0, r0, #2		@ A (no unaligned access fault) +		orr	r0, r0, #1 << 22	@ U (v6 unaligned access model) +						@ (needed for ARM1176)  #ifdef CONFIG_MMU  #ifdef CONFIG_CPU_ENDIAN_BE8  		orr	r0, r0, #1 << 25	@ big-endian page tables @@ -914,7 +926,7 @@ proc_types:  		.word	0x0007b000		@ ARMv6  		.word	0x000ff000 -		W(b)	__armv4_mmu_cache_on +		W(b)	__armv6_mmu_cache_on  		W(b)	__armv4_mmu_cache_off  		W(b)	__armv6_mmu_cache_flush diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index 89dcc14f193..2af359cfe98 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -1,22 +1,39 @@  ifeq ($(CONFIG_OF),y) -dtb-$(CONFIG_ARCH_AT91) += aks-cdu.dtb \ -	at91sam9263ek.dtb \ -	at91sam9g20ek_2mmc.dtb \ -	at91sam9g20ek.dtb \ -	at91sam9g25ek.dtb \ -	at91sam9m10g45ek.dtb \ -	at91sam9n12ek.dtb \ -	ethernut5.dtb \ -	evk-pro3.dtb \ -	kizbox.dtb \ -	tny_a9260.dtb \ -	tny_a9263.dtb \ -	tny_a9g20.dtb \ -	usb_a9260.dtb \ -	usb_a9263.dtb \ -	usb_a9g20.dtb +# Keep at91 dtb files sorted alphabetically for each SoC +# rm9200 +dtb-$(CONFIG_ARCH_AT91) += at91rm9200ek.dtb +# sam9260 +dtb-$(CONFIG_ARCH_AT91) += animeo_ip.dtb +dtb-$(CONFIG_ARCH_AT91) += aks-cdu.dtb +dtb-$(CONFIG_ARCH_AT91) += ethernut5.dtb +dtb-$(CONFIG_ARCH_AT91) += evk-pro3.dtb +dtb-$(CONFIG_ARCH_AT91) += tny_a9260.dtb +dtb-$(CONFIG_ARCH_AT91) += usb_a9260.dtb +# sam9263 +dtb-$(CONFIG_ARCH_AT91) += at91sam9263ek.dtb +dtb-$(CONFIG_ARCH_AT91) += tny_a9263.dtb +dtb-$(CONFIG_ARCH_AT91) += usb_a9263.dtb +# sam9g20 +dtb-$(CONFIG_ARCH_AT91) += at91sam9g20ek.dtb +dtb-$(CONFIG_ARCH_AT91) += at91sam9g20ek_2mmc.dtb +dtb-$(CONFIG_ARCH_AT91) += kizbox.dtb +dtb-$(CONFIG_ARCH_AT91) += tny_a9g20.dtb +dtb-$(CONFIG_ARCH_AT91) += usb_a9g20.dtb +# sam9g45 +dtb-$(CONFIG_ARCH_AT91) += at91sam9m10g45ek.dtb +dtb-$(CONFIG_ARCH_AT91) += pm9g45.dtb +# sam9n12 +dtb-$(CONFIG_ARCH_AT91) += at91sam9n12ek.dtb +# sam9x5 +dtb-$(CONFIG_ARCH_AT91) += at91sam9g15ek.dtb +dtb-$(CONFIG_ARCH_AT91) += at91sam9g25ek.dtb +dtb-$(CONFIG_ARCH_AT91) += at91sam9g35ek.dtb +dtb-$(CONFIG_ARCH_AT91) += at91sam9x25ek.dtb +dtb-$(CONFIG_ARCH_AT91) += at91sam9x35ek.dtb +  dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb +dtb-$(CONFIG_ARCH_BCM) += bcm11351-brt.dtb  dtb-$(CONFIG_ARCH_DAVINCI) += da850-enbw-cmc.dtb \  	da850-evm.dtb  dtb-$(CONFIG_ARCH_DOVE) += dove-cm-a510.dtb \ @@ -25,10 +42,13 @@ dtb-$(CONFIG_ARCH_DOVE) += dove-cm-a510.dtb \  dtb-$(CONFIG_ARCH_EXYNOS) += exynos4210-origen.dtb \  	exynos4210-smdkv310.dtb \  	exynos4210-trats.dtb \ +	exynos5250-smdk5250.dtb \ +	exynos5440-ssdk5440.dtb \  	exynos4412-smdk4412.dtb \  	exynos5250-smdk5250.dtb \  	exynos5250-snow.dtb -dtb-$(CONFIG_ARCH_HIGHBANK) += highbank.dtb +dtb-$(CONFIG_ARCH_HIGHBANK) += highbank.dtb \ +	ecx-2000.dtb  dtb-$(CONFIG_ARCH_INTEGRATOR) += integratorap.dtb \  	integratorcp.dtb  dtb-$(CONFIG_ARCH_LPC32XX) += ea3250.dtb phy3250.dtb @@ -100,13 +120,16 @@ dtb-$(CONFIG_ARCH_U8500) += snowball.dtb \  	ccu9540.dtb  dtb-$(CONFIG_ARCH_SHMOBILE) += emev2-kzm9d.dtb \  	r8a7740-armadillo800eva.dtb \ -	sh73a0-kzm9g.dtb +	sh73a0-kzm9g.dtb \ +	sh7372-mackerel.dtb  dtb-$(CONFIG_ARCH_SPEAR13XX) += spear1310-evb.dtb \  	spear1340-evb.dtb  dtb-$(CONFIG_ARCH_SPEAR3XX)+= spear300-evb.dtb \  	spear310-evb.dtb \  	spear320-evb.dtb  dtb-$(CONFIG_ARCH_SPEAR6XX)+= spear600-evb.dtb +dtb-$(CONFIG_ARCH_SUNXI) += sun4i-cubieboard.dtb \ +	sun5i-olinuxino.dtb  dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \  	tegra20-medcom-wide.dtb \  	tegra20-paz00.dtb \ @@ -128,4 +151,12 @@ dtb-$(CONFIG_ARCH_VT8500) += vt8500-bv07.dtb \  	wm8650-mid.dtb  dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb +targets += dtbs  endif + +# *.dtb used to be generated in the directory above. Clean out the +# old build results so people don't accidentally use them. +dtbs: $(addprefix $(obj)/, $(dtb-y)) +	$(Q)rm -f $(obj)/../*.dtb + +clean-files := *.dtb diff --git a/arch/arm/boot/dts/am335x-bone.dts b/arch/arm/boot/dts/am335x-bone.dts index 2c338889df1..11b240c5d32 100644 --- a/arch/arm/boot/dts/am335x-bone.dts +++ b/arch/arm/boot/dts/am335x-bone.dts @@ -128,3 +128,11 @@  		};  	};  }; + +&cpsw_emac0 { +	phy_id = <&davinci_mdio>, <0>; +}; + +&cpsw_emac1 { +	phy_id = <&davinci_mdio>, <1>; +}; diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts index 9f65f17ebdf..d6496440fce 100644 --- a/arch/arm/boot/dts/am335x-evm.dts +++ b/arch/arm/boot/dts/am335x-evm.dts @@ -236,3 +236,11 @@  		};  	};  }; + +&cpsw_emac0 { +	phy_id = <&davinci_mdio>, <0>; +}; + +&cpsw_emac1 { +	phy_id = <&davinci_mdio>, <1>; +}; diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi index 20a3f29a6bf..c2f14e875eb 100644 --- a/arch/arm/boot/dts/am33xx.dtsi +++ b/arch/arm/boot/dts/am33xx.dtsi @@ -338,5 +338,52 @@  			power = <250>;  			ti,hwmods = "usb_otg_hs";  		}; + +		mac: ethernet@4a100000 { +			compatible = "ti,cpsw"; +			ti,hwmods = "cpgmac0"; +			cpdma_channels = <8>; +			ale_entries = <1024>; +			bd_ram_size = <0x2000>; +			no_bd_ram = <0>; +			rx_descs = <64>; +			mac_control = <0x20>; +			slaves = <2>; +			cpts_active_slave = <0>; +			cpts_clock_mult = <0x80000000>; +			cpts_clock_shift = <29>; +			reg = <0x4a100000 0x800 +			       0x4a101200 0x100>; +			#address-cells = <1>; +			#size-cells = <1>; +			interrupt-parent = <&intc>; +			/* +			 * c0_rx_thresh_pend +			 * c0_rx_pend +			 * c0_tx_pend +			 * c0_misc_pend +			 */ +			interrupts = <40 41 42 43>; +			ranges; + +			davinci_mdio: mdio@4a101000 { +				compatible = "ti,davinci_mdio"; +				#address-cells = <1>; +				#size-cells = <0>; +				ti,hwmods = "davinci_mdio"; +				bus_freq = <1000000>; +				reg = <0x4a101000 0x100>; +			}; + +			cpsw_emac0: slave@4a100200 { +				/* Filled in by U-Boot */ +				mac-address = [ 00 00 00 00 00 00 ]; +			}; + +			cpsw_emac1: slave@4a100300 { +				/* Filled in by U-Boot */ +				mac-address = [ 00 00 00 00 00 00 ]; +			}; +		};  	};  }; diff --git a/arch/arm/boot/dts/animeo_ip.dts b/arch/arm/boot/dts/animeo_ip.dts new file mode 100644 index 00000000000..74d92cd29d8 --- /dev/null +++ b/arch/arm/boot/dts/animeo_ip.dts @@ -0,0 +1,178 @@ +/* + * animeo_ip.dts - Device Tree file for Somfy Animeo IP Boards + * + *  Copyright (C) 2011-2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * Licensed under GPLv2 only. + */ + +/dts-v1/; +/include/ "at91sam9260.dtsi" + +/ { +	model = "Somfy Animeo IP"; +	compatible = "somfy,animeo-ip", "atmel,at91sam9260", "atmel,at91sam9"; + +	aliases { +		serial0 = &usart1; +		serial1 = &usart2; +		serial2 = &usart0; +		serial3 = &dbgu; +		serial4 = &usart3; +		serial5 = &uart0; +		serial6 = &uart1; +	}; + +	chosen { +		linux,stdout-path = &usart2; +	}; + +	memory { +		reg = <0x20000000 0x4000000>; +	}; + +	clocks { +		#address-cells = <1>; +		#size-cells = <1>; +		ranges; + +		main_clock: clock@0 { +			compatible = "atmel,osc", "fixed-clock"; +			clock-frequency = <18432000>; +		}; +	}; + +	ahb { +		apb { +			usart0: serial@fffb0000 { +				pinctrl-0 = <&pinctrl_usart0 &pinctrl_usart0_rts>; +				linux,rs485-enabled-at-boot-time; +				status = "okay"; +			}; + +			usart1: serial@fffb4000 { +				pinctrl-0 = <&pinctrl_usart1 &pinctrl_usart1_rts>; +				linux,rs485-enabled-at-boot-time; +				status = "okay"; +			}; + +			usart2: serial@fffb8000 { +				pinctrl-0 = <&pinctrl_usart2>; +				status = "okay"; +			}; + +			macb0: ethernet@fffc4000 { +				pinctrl-0 = <&pinctrl_macb_rmii &pinctrl_macb_rmii_mii>; +				phy-mode = "mii"; +				status = "okay"; +			}; + +			mmc0: mmc@fffa8000 { +				pinctrl-0 = <&pinctrl_mmc0_clk +					     &pinctrl_mmc0_slot1_cmd_dat0 +					     &pinctrl_mmc0_slot1_dat1_3>; +				status = "okay"; + +				slot@1 { +					reg = <1>; +					bus-width = <4>; +				}; +			}; +		}; + +		nand0: nand@40000000 { +			nand-bus-width = <8>; +			nand-ecc-mode = "soft"; +			nand-on-flash-bbt; +			status = "okay"; + +			at91bootstrap@0 { +				label = "at91bootstrap"; +				reg = <0x0 0x8000>; +			}; + +			barebox@8000 { +				label = "barebox"; +				reg = <0x8000 0x40000>; +			}; + +			bareboxenv@48000 { +				label = "bareboxenv"; +				reg = <0x48000 0x8000>; +			}; + +			user_block@0x50000 { +				label = "user_block"; +				reg = <0x50000 0xb0000>; +			}; + +			kernel@100000 { +				label = "kernel"; +				reg = <0x100000 0x1b0000>; +			}; + +			root@2b0000 { +				label = "root"; +				reg = <0x2b0000 0x1D50000>; +			}; +		}; + +		usb0: ohci@00500000 { +			num-ports = <2>; +			atmel,vbus-gpio = <&pioB 15 1>; +			status = "okay"; +		}; +	}; + +	leds { +		compatible = "gpio-leds"; + +		power_green { +			label = "power_green"; +			gpios = <&pioC 17 0>; +			linux,default-trigger = "heartbeat"; +		}; + +		power_red { +			label = "power_red"; +			gpios = <&pioA 2 0>; +		}; + +		tx_green { +			label = "tx_green"; +			gpios = <&pioC 19 0>; +		}; + +		tx_red { +			label = "tx_red"; +			gpios = <&pioC 18 0>; +		}; +	}; + +	gpio_keys { +		compatible = "gpio-keys"; +		#address-cells = <1>; +		#size-cells = <0>; + +		keyswitch_in { +			label = "keyswitch_in"; +			gpios = <&pioB 1 0>; +			linux,code = <28>; +			gpio-key,wakeup; +		}; + +		error_in { +			label = "error_in"; +			gpios = <&pioB 2 0>; +			linux,code = <29>; +			gpio-key,wakeup; +		}; + +		btn { +			label = "btn"; +			gpios = <&pioC 23 0>; +			linux,code = <31>; +			gpio-key,wakeup; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/at91rm9200.dtsi b/arch/arm/boot/dts/at91rm9200.dtsi new file mode 100644 index 00000000000..e154f242c68 --- /dev/null +++ b/arch/arm/boot/dts/at91rm9200.dtsi @@ -0,0 +1,349 @@ +/* + * at91rm9200.dtsi - Device Tree Include file for AT91RM9200 family SoC + * + *  Copyright (C) 2011 Atmel, + *                2011 Nicolas Ferre <nicolas.ferre@atmel.com>, + *                2012 Joachim Eastwood <manabian@gmail.com> + * + * Based on at91sam9260.dtsi + * + * Licensed under GPLv2 or later. + */ + +/include/ "skeleton.dtsi" + +/ { +	model = "Atmel AT91RM9200 family SoC"; +	compatible = "atmel,at91rm9200"; +	interrupt-parent = <&aic>; + +	aliases { +		serial0 = &dbgu; +		serial1 = &usart0; +		serial2 = &usart1; +		serial3 = &usart2; +		serial4 = &usart3; +		gpio0 = &pioA; +		gpio1 = &pioB; +		gpio2 = &pioC; +		gpio3 = &pioD; +		tcb0 = &tcb0; +		tcb1 = &tcb1; +	}; +	cpus { +		cpu@0 { +			compatible = "arm,arm920t"; +		}; +	}; + +	memory { +		reg = <0x20000000 0x04000000>; +	}; + +	ahb { +		compatible = "simple-bus"; +		#address-cells = <1>; +		#size-cells = <1>; +		ranges; + +		apb { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges; + +			aic: interrupt-controller@fffff000 { +				#interrupt-cells = <3>; +				compatible = "atmel,at91rm9200-aic"; +				interrupt-controller; +				reg = <0xfffff000 0x200>; +				atmel,external-irqs = <25 26 27 28 29 30 31>; +			}; + +			ramc0: ramc@ffffff00 { +				compatible = "atmel,at91rm9200-sdramc"; +				reg = <0xffffff00 0x100>; +			}; + +			pmc: pmc@fffffc00 { +				compatible = "atmel,at91rm9200-pmc"; +				reg = <0xfffffc00 0x100>; +			}; + +			st: timer@fffffd00 { +				compatible = "atmel,at91rm9200-st"; +				reg = <0xfffffd00 0x100>; +				interrupts = <1 4 7>; +			}; + +			tcb0: timer@fffa0000 { +				compatible = "atmel,at91rm9200-tcb"; +				reg = <0xfffa0000 0x100>; +				interrupts = <17 4 0 18 4 0 19 4 0>; +			}; + +			tcb1: timer@fffa4000 { +				compatible = "atmel,at91rm9200-tcb"; +				reg = <0xfffa4000 0x100>; +				interrupts = <20 4 0 21 4 0 22 4 0>; +			}; + +			pinctrl@fffff400 { +				#address-cells = <1>; +				#size-cells = <1>; +				compatible = "atmel,at91rm9200-pinctrl", "simple-bus"; +				ranges = <0xfffff400 0xfffff400 0x800>; + +				atmel,mux-mask = < +					/*    A         B     */ +					 0xffffffff 0xffffffff  /* pioA */ +					 0xffffffff 0x083fffff  /* pioB */ +					 0xffff3fff 0x00000000  /* pioC */ +					 0x03ff87ff 0x0fffff80  /* pioD */ +					>; + +				/* shared pinctrl settings */ +				dbgu { +					pinctrl_dbgu: dbgu-0 { +						atmel,pins = +							<0 30 0x1 0x0	/* PA30 periph A */ +							 0 31 0x1 0x1>;	/* PA31 periph with pullup */ +					}; +				}; + +				uart0 { +					pinctrl_uart0: uart0-0 { +						atmel,pins = +							<0 17 0x1 0x0	/* PA17 periph A */ +							 0 18 0x1 0x0>;	/* PA18 periph A */ +					}; + +					pinctrl_uart0_rts: uart0_rts-0 { +						atmel,pins = +							<0 20 0x1 0x0>;	/* PA20 periph A */ +					}; + +					pinctrl_uart0_cts: uart0_cts-0 { +						atmel,pins = +							<0 21 0x1 0x0>;	/* PA21 periph A */ +					}; +				}; + +				uart1 { +					pinctrl_uart1: uart1-0 { +						atmel,pins = +							<1 20 0x1 0x1	/* PB20 periph A with pullup */ +							 1 21 0x1 0x0>;	/* PB21 periph A */ +					}; + +					pinctrl_uart1_rts: uart1_rts-0 { +						atmel,pins = +							<1 24 0x1 0x0>;	/* PB24 periph A */ +					}; + +					pinctrl_uart1_cts: uart1_cts-0 { +						atmel,pins = +							<1 26 0x1 0x0>;	/* PB26 periph A */ +					}; + +					pinctrl_uart1_dtr_dsr: uart1_dtr_dsr-0 { +						atmel,pins = +							<1 19 0x1 0x0	/* PB19 periph A */ +							 1 25 0x1 0x0>;	/* PB25 periph A */ +					}; + +					pinctrl_uart1_dcd: uart1_dcd-0 { +						atmel,pins = +							<1 23 0x1 0x0>;	/* PB23 periph A */ +					}; + +					pinctrl_uart1_ri: uart1_ri-0 { +						atmel,pins = +							<1 18 0x1 0x0>;	/* PB18 periph A */ +					}; +				}; + +				uart2 { +					pinctrl_uart2: uart2-0 { +						atmel,pins = +							<0 22 0x1 0x0	/* PA22 periph A */ +							 0 23 0x1 0x1>;	/* PA23 periph A with pullup */ +					}; + +					pinctrl_uart2_rts: uart2_rts-0 { +						atmel,pins = +							<0 30 0x2 0x0>;	/* PA30 periph B */ +					}; + +					pinctrl_uart2_cts: uart2_cts-0 { +						atmel,pins = +							<0 31 0x2 0x0>;	/* PA31 periph B */ +					}; +				}; + +				uart3 { +					pinctrl_uart3: uart3-0 { +						atmel,pins = +							<0 5 0x2 0x1	/* PA5 periph B with pullup */ +							 0 6 0x2 0x0>;	/* PA6 periph B */ +					}; + +					pinctrl_uart3_rts: uart3_rts-0 { +						atmel,pins = +							<1 0 0x2 0x0>;	/* PB0 periph B */ +					}; + +					pinctrl_uart3_cts: uart3_cts-0 { +						atmel,pins = +							<1 1 0x2 0x0>;	/* PB1 periph B */ +					}; +				}; + +				nand { +					pinctrl_nand: nand-0 { +						atmel,pins = +							<2 2 0x0 0x1	/* PC2 gpio RDY pin pull_up */ +							 1 1 0x0 0x1>;	/* PB1 gpio CD pin pull_up */ +					}; +				}; + +				pioA: gpio@fffff400 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff400 0x200>; +					interrupts = <2 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioB: gpio@fffff600 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff600 0x200>; +					interrupts = <3 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioC: gpio@fffff800 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff800 0x200>; +					interrupts = <4 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioD: gpio@fffffa00 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffffa00 0x200>; +					interrupts = <5 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; +			}; + +			dbgu: serial@fffff200 { +				compatible = "atmel,at91rm9200-usart"; +				reg = <0xfffff200 0x200>; +				interrupts = <1 4 7>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_dbgu>; +				status = "disabled"; +			}; + +			usart0: serial@fffc0000 { +				compatible = "atmel,at91rm9200-usart"; +				reg = <0xfffc0000 0x200>; +				interrupts = <6 4 5>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_uart0>; +				status = "disabled"; +			}; + +			usart1: serial@fffc4000 { +				compatible = "atmel,at91rm9200-usart"; +				reg = <0xfffc4000 0x200>; +				interrupts = <7 4 5>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_uart1>; +				status = "disabled"; +			}; + +			usart2: serial@fffc8000 { +				compatible = "atmel,at91rm9200-usart"; +				reg = <0xfffc8000 0x200>; +				interrupts = <8 4 5>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_uart2>; +				status = "disabled"; +			}; + +			usart3: serial@fffcc000 { +				compatible = "atmel,at91rm9200-usart"; +				reg = <0xfffcc000 0x200>; +				interrupts = <23 4 5>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_uart3>; +				status = "disabled"; +			}; + +			usb1: gadget@fffb0000 { +				compatible = "atmel,at91rm9200-udc"; +				reg = <0xfffb0000 0x4000>; +				interrupts = <11 4 2>; +				status = "disabled"; +			}; +		}; + +		nand0: nand@40000000 { +			compatible = "atmel,at91rm9200-nand"; +			#address-cells = <1>; +			#size-cells = <1>; +			reg = <0x40000000 0x10000000>; +			atmel,nand-addr-offset = <21>; +			atmel,nand-cmd-offset = <22>; +			pinctrl-names = "default"; +			pinctrl-0 = <&pinctrl_nand>; +			nand-ecc-mode = "soft"; +			gpios = <&pioC 2 0 +				 0 +				 &pioB 1 0 +				>; +			status = "disabled"; +		}; + +		usb0: ohci@00300000 { +			compatible = "atmel,at91rm9200-ohci", "usb-ohci"; +			reg = <0x00300000 0x100000>; +			interrupts = <23 4 2>; +			status = "disabled"; +		}; +	}; + +	i2c@0 { +		compatible = "i2c-gpio"; +		gpios = <&pioA 23 0 /* sda */ +			 &pioA 24 0 /* scl */ +			>; +		i2c-gpio,sda-open-drain; +		i2c-gpio,scl-open-drain; +		i2c-gpio,delay-us = <2>;	/* ~100 kHz */ +		#address-cells = <1>; +		#size-cells = <0>; +		status = "disabled"; +	}; +}; diff --git a/arch/arm/boot/dts/at91rm9200ek.dts b/arch/arm/boot/dts/at91rm9200ek.dts new file mode 100644 index 00000000000..8aa48931e0a --- /dev/null +++ b/arch/arm/boot/dts/at91rm9200ek.dts @@ -0,0 +1,79 @@ +/* + * at91rm9200ek.dts - Device Tree file for Atmel AT91RM9200 evaluation kit + * + *  Copyright (C) 2012 Joachim Eastwood <manabian@gmail.com> + * + * Licensed under GPLv2 only + */ +/dts-v1/; +/include/ "at91rm9200.dtsi" + +/ { +	model = "Atmel AT91RM9200 evaluation kit"; +	compatible = "atmel,at91rm9200ek", "atmel,at91rm9200"; + +	memory { +		reg = <0x20000000 0x4000000>; +	}; + +	clocks { +		#address-cells = <1>; +		#size-cells = <1>; +		ranges; + +		main_clock: clock@0 { +			compatible = "atmel,osc", "fixed-clock"; +			clock-frequency = <18432000>; +		}; +	}; + +	ahb { +		apb { +			dbgu: serial@fffff200 { +				status = "okay"; +			}; + +			usart1: serial@fffc4000 { +				pinctrl-0 = +						<&pinctrl_uart1 +						 &pinctrl_uart1_rts +						 &pinctrl_uart1_cts +						 &pinctrl_uart1_dtr_dsr +						 &pinctrl_uart1_dcd +						 &pinctrl_uart1_ri>; +				status = "okay"; +			}; + +			usb1: gadget@fffb0000 { +				atmel,vbus-gpio = <&pioD 4 0>; +				status = "okay"; +			}; +		}; + +		usb0: ohci@00300000 { +			num-ports = <2>; +			status = "okay"; +		}; +	}; + +	leds { +		compatible = "gpio-leds"; + +		ds2 { +			label = "green"; +			gpios = <&pioB 0 0x1>; +			linux,default-trigger = "mmc0"; +		}; + +		ds4 { +			label = "yellow"; +			gpios = <&pioB 1 0x1>; +			linux,default-trigger = "heartbeat"; +		}; + +		ds6 { +			label = "red"; +			gpios = <&pioB 2 0x1>; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi index bfb5bb6528b..c528b4b429b 100644 --- a/arch/arm/boot/dts/at91sam9260.dtsi +++ b/arch/arm/boot/dts/at91sam9260.dtsi @@ -21,8 +21,8 @@  		serial2 = &usart1;  		serial3 = &usart2;  		serial4 = &usart3; -		serial5 = &usart4; -		serial6 = &usart5; +		serial5 = &uart0; +		serial6 = &uart1;  		gpio0 = &pioA;  		gpio1 = &pioB;  		gpio2 = &pioC; @@ -98,40 +98,250 @@  				interrupts = <26 4 0 27 4 0 28 4 0>;  			}; -			pioA: gpio@fffff400 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffff400 0x100>; -				interrupts = <2 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +			pinctrl@fffff400 { +				#address-cells = <1>; +				#size-cells = <1>; +				compatible = "atmel,at91rm9200-pinctrl", "simple-bus"; +				ranges = <0xfffff400 0xfffff400 0x600>; -			pioB: gpio@fffff600 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffff600 0x100>; -				interrupts = <3 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +				atmel,mux-mask = < +				      /*    A         B     */ +				       0xffffffff 0xffc00c3b  /* pioA */ +				       0xffffffff 0x7fff3ccf  /* pioB */ +				       0xffffffff 0x007fffff  /* pioC */ +				      >; -			pioC: gpio@fffff800 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffff800 0x100>; -				interrupts = <4 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; +				/* shared pinctrl settings */ +				dbgu { +					pinctrl_dbgu: dbgu-0 { +						atmel,pins = +							<1 14 0x1 0x0	/* PB14 periph A */ +							 1 15 0x1 0x1>;	/* PB15 periph with pullup */ +					}; +				}; + +				usart0 { +					pinctrl_usart0: usart0-0 { +						atmel,pins = +							<1 4 0x1 0x0	/* PB4 periph A */ +							 1 5 0x1 0x0>;	/* PB5 periph A */ +					}; + +					pinctrl_usart0_rts: usart0_rts-0 { +						atmel,pins = +							<1 26 0x1 0x0>;	/* PB26 periph A */ +					}; + +					pinctrl_usart0_cts: usart0_cts-0 { +						atmel,pins = +							<1 27 0x1 0x0>;	/* PB27 periph A */ +					}; + +					pinctrl_usart0_dtr_dsr: usart0_dtr_dsr-0 { +						atmel,pins = +							<1 24 0x1 0x0	/* PB24 periph A */ +							 1 22 0x1 0x0>;	/* PB22 periph A */ +					}; + +					pinctrl_usart0_dcd: usart0_dcd-0 { +						atmel,pins = +							<1 23 0x1 0x0>;	/* PB23 periph A */ +					}; + +					pinctrl_usart0_ri: usart0_ri-0 { +						atmel,pins = +							<1 25 0x1 0x0>;	/* PB25 periph A */ +					}; +				}; + +				usart1 { +					pinctrl_usart1: usart1-0 { +						atmel,pins = +							<2 6 0x1 0x1	/* PB6 periph A with pullup */ +							 2 7 0x1 0x0>;	/* PB7 periph A */ +					}; + +					pinctrl_usart1_rts: usart1_rts-0 { +						atmel,pins = +							<1 28 0x1 0x0>;	/* PB28 periph A */ +					}; + +					pinctrl_usart1_cts: usart1_cts-0 { +						atmel,pins = +							<1 29 0x1 0x0>;	/* PB29 periph A */ +					}; +				}; + +				usart2 { +					pinctrl_usart2: usart2-0 { +						atmel,pins = +							<1 8 0x1 0x1	/* PB8 periph A with pullup */ +							 1 9 0x1 0x0>;	/* PB9 periph A */ +					}; + +					pinctrl_usart2_rts: usart2_rts-0 { +						atmel,pins = +							<0 4 0x1 0x0>;	/* PA4 periph A */ +					}; + +					pinctrl_usart2_cts: usart2_cts-0 { +						atmel,pins = +							<0 5 0x1 0x0>;	/* PA5 periph A */ +					}; +				}; + +				usart3 { +					pinctrl_usart3: usart3-0 { +						atmel,pins = +							<2 10 0x1 0x1	/* PB10 periph A with pullup */ +							 2 11 0x1 0x0>;	/* PB11 periph A */ +					}; + +					pinctrl_usart3_rts: usart3_rts-0 { +						atmel,pins = +							<3 8 0x2 0x0>;	/* PB8 periph B */ +					}; + +					pinctrl_usart3_cts: usart3_cts-0 { +						atmel,pins = +							<3 10 0x2 0x0>;	/* PB10 periph B */ +					}; +				}; + +				uart0 { +					pinctrl_uart0: uart0-0 { +						atmel,pins = +							<0 31 0x2 0x1	/* PA31 periph B with pullup */ +							 0 30 0x2 0x0>;	/* PA30 periph B */ +					}; +				}; + +				uart1 { +					pinctrl_uart1: uart1-0 { +						atmel,pins = +							<2 12 0x1 0x1	/* PB12 periph A with pullup */ +							 2 13 0x1 0x0>;	/* PB13 periph A */ +					}; +				}; + +				nand { +					pinctrl_nand: nand-0 { +						atmel,pins = +							<2 13 0x0 0x1	/* PC13 gpio RDY pin pull_up */ +							 2 14 0x0 0x1>;	/* PC14 gpio enable pin pull_up */ +					}; +				}; + +				macb { +					pinctrl_macb_rmii: macb_rmii-0 { +						atmel,pins = +							<0 12 0x1 0x0	/* PA12 periph A */ +							 0 13 0x1 0x0	/* PA13 periph A */ +							 0 14 0x1 0x0	/* PA14 periph A */ +							 0 15 0x1 0x0	/* PA15 periph A */ +							 0 16 0x1 0x0	/* PA16 periph A */ +							 0 17 0x1 0x0	/* PA17 periph A */ +							 0 18 0x1 0x0	/* PA18 periph A */ +							 0 19 0x1 0x0	/* PA19 periph A */ +							 0 20 0x1 0x0	/* PA20 periph A */ +							 0 21 0x1 0x0>;	/* PA21 periph A */ +					}; + +					pinctrl_macb_rmii_mii: macb_rmii_mii-0 { +						atmel,pins = +							<0 22 0x2 0x0	/* PA22 periph B */ +							 0 23 0x2 0x0	/* PA23 periph B */ +							 0 24 0x2 0x0	/* PA24 periph B */ +							 0 25 0x2 0x0	/* PA25 periph B */ +							 0 26 0x2 0x0	/* PA26 periph B */ +							 0 27 0x2 0x0	/* PA27 periph B */ +							 0 28 0x2 0x0	/* PA28 periph B */ +							 0 29 0x2 0x0>;	/* PA29 periph B */ +					}; + +					pinctrl_macb_rmii_mii_alt: macb_rmii_mii-1 { +						atmel,pins = +							<0 10 0x2 0x0	/* PA10 periph B */ +							 0 11 0x2 0x0	/* PA11 periph B */ +							 0 24 0x2 0x0	/* PA24 periph B */ +							 0 25 0x2 0x0	/* PA25 periph B */ +							 0 26 0x2 0x0	/* PA26 periph B */ +							 0 27 0x2 0x0	/* PA27 periph B */ +							 0 28 0x2 0x0	/* PA28 periph B */ +							 0 29 0x2 0x0>;	/* PA29 periph B */ +					}; +				}; + +				mmc0 { +					pinctrl_mmc0_clk: mmc0_clk-0 { +						atmel,pins = +							<0 8 0x1 0x0>;	/* PA8 periph A */ +					}; + +					pinctrl_mmc0_slot0_cmd_dat0: mmc0_slot0_cmd_dat0-0 { +						atmel,pins = +							<0 7 0x1 0x1	/* PA7 periph A with pullup */ +							 0 6 0x1 0x1>;	/* PA6 periph A with pullup */ +					}; + +					pinctrl_mmc0_slot0_dat1_3: mmc0_slot0_dat1_3-0 { +						atmel,pins = +							<0 9 0x1 0x1	/* PA9 periph A with pullup */ +							 0 10 0x1 0x1	/* PA10 periph A with pullup */ +							 0 11 0x1 0x1>;	/* PA11 periph A with pullup */ +					}; + +					pinctrl_mmc0_slot1_cmd_dat0: mmc0_slot1_cmd_dat0-0 { +						atmel,pins = +							<0 1 0x2 0x1	/* PA1 periph B with pullup */ +							 0 0 0x2 0x1>;	/* PA0 periph B with pullup */ +					}; + +					pinctrl_mmc0_slot1_dat1_3: mmc0_slot1_dat1_3-0 { +						atmel,pins = +							<0 5 0x2 0x1	/* PA5 periph B with pullup */ +							 0 4 0x2 0x1	/* PA4 periph B with pullup */ +							 0 3 0x2 0x1>;	/* PA3 periph B with pullup */ +					}; +				}; + +				pioA: gpio@fffff400 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff400 0x200>; +					interrupts = <2 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioB: gpio@fffff600 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff600 0x200>; +					interrupts = <3 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioC: gpio@fffff800 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff800 0x200>; +					interrupts = <4 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				};  			};  			dbgu: serial@fffff200 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffff200 0x200>;  				interrupts = <1 4 7>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_dbgu>;  				status = "disabled";  			}; @@ -141,6 +351,8 @@  				interrupts = <6 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart0>;  				status = "disabled";  			}; @@ -150,6 +362,8 @@  				interrupts = <7 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart1>;  				status = "disabled";  			}; @@ -159,6 +373,8 @@  				interrupts = <8 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart2>;  				status = "disabled";  			}; @@ -168,24 +384,30 @@  				interrupts = <23 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart3>;  				status = "disabled";  			}; -			usart4: serial@fffd4000 { +			uart0: serial@fffd4000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffd4000 0x200>;  				interrupts = <24 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_uart0>;  				status = "disabled";  			}; -			usart5: serial@fffd8000 { +			uart1: serial@fffd8000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffd8000 0x200>;  				interrupts = <25 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_uart1>;  				status = "disabled";  			}; @@ -193,6 +415,8 @@  				compatible = "cdns,at32ap7000-macb", "cdns,macb";  				reg = <0xfffc4000 0x100>;  				interrupts = <21 4 3>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_macb_rmii>;  				status = "disabled";  			}; @@ -212,6 +436,15 @@  				status = "disabled";  			}; +			mmc0: mmc@fffa8000 { +				compatible = "atmel,hsmci"; +				reg = <0xfffa8000 0x600>; +				interrupts = <9 4 0>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled"; +			}; +  			adc0: adc@fffe0000 {  				compatible = "atmel,at91sam9260-adc";  				reg = <0xfffe0000 0x100>; @@ -263,6 +496,8 @@  			      >;  			atmel,nand-addr-offset = <21>;  			atmel,nand-cmd-offset = <22>; +			pinctrl-names = "default"; +			pinctrl-0 = <&pinctrl_nand>;  			gpios = <&pioC 13 0  				 &pioC 14 0  				 0 diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index ff5461278c0..00485e1dff9 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi @@ -89,60 +89,243 @@  				reg = <0xfffffd10 0x10>;  			}; -			pioA: gpio@fffff200 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffff200 0x100>; -				interrupts = <2 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +			pinctrl@fffff200 { +				#address-cells = <1>; +				#size-cells = <1>; +				compatible = "atmel,at91rm9200-pinctrl", "simple-bus"; +				ranges = <0xfffff200 0xfffff200 0xa00>; -			pioB: gpio@fffff400 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffff400 0x100>; -				interrupts = <3 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +				atmel,mux-mask = < +				      /*    A         B     */ +				       0xfffffffb 0xffffe07f  /* pioA */ +				       0x0007ffff 0x39072fff  /* pioB */ +				       0xffffffff 0x3ffffff8  /* pioC */ +				       0xfffffbff 0xffffffff  /* pioD */ +				       0xffe00fff 0xfbfcff00  /* pioE */ +				      >; -			pioC: gpio@fffff600 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffff600 0x100>; -				interrupts = <4 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +				/* shared pinctrl settings */ +				dbgu { +					pinctrl_dbgu: dbgu-0 { +						atmel,pins = +							<2 30 0x1 0x0	/* PC30 periph A */ +							 2 31 0x1 0x1>;	/* PC31 periph with pullup */ +					}; +				}; -			pioD: gpio@fffff800 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffff800 0x100>; -				interrupts = <4 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +				usart0 { +					pinctrl_usart0: usart0-0 { +						atmel,pins = +							<0 26 0x1 0x1	/* PA26 periph A with pullup */ +							 0 27 0x1 0x0>;	/* PA27 periph A */ +					}; -			pioE: gpio@fffffa00 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffffa00 0x100>; -				interrupts = <4 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; +					pinctrl_usart0_rts: usart0_rts-0 { +						atmel,pins = +							<0 28 0x1 0x0>;	/* PA28 periph A */ +					}; + +					pinctrl_usart0_cts: usart0_cts-0 { +						atmel,pins = +							<0 29 0x1 0x0>;	/* PA29 periph A */ +					}; +				}; + +				usart1 { +					pinctrl_usart1: usart1-0 { +						atmel,pins = +							<3 0 0x1 0x1	/* PD0 periph A with pullup */ +							 3 1 0x1 0x0>;	/* PD1 periph A */ +					}; + +					pinctrl_usart1_rts: usart1_rts-0 { +						atmel,pins = +							<3 7 0x2 0x0>;	/* PD7 periph B */ +					}; + +					pinctrl_usart1_cts: usart1_cts-0 { +						atmel,pins = +							<3 8 0x2 0x0>;	/* PD8 periph B */ +					}; +				}; + +				usart2 { +					pinctrl_usart2: usart2-0 { +						atmel,pins = +							<3 2 0x1 0x1	/* PD2 periph A with pullup */ +							 3 3 0x1 0x0>;	/* PD3 periph A */ +					}; + +					pinctrl_usart2_rts: usart2_rts-0 { +						atmel,pins = +							<3 5 0x2 0x0>;	/* PD5 periph B */ +					}; + +					pinctrl_usart2_cts: usart2_cts-0 { +						atmel,pins = +							<4 6 0x2 0x0>;	/* PD6 periph B */ +					}; +				}; + +				nand { +					pinctrl_nand: nand-0 { +						atmel,pins = +							<0 22 0x0 0x1	/* PA22 gpio RDY pin pull_up*/ +							 3 15 0x0 0x1>;	/* PD15 gpio enable pin pull_up */ +					}; +				}; + +				macb { +					pinctrl_macb_rmii: macb_rmii-0 { +						atmel,pins = +							<2 25 0x2 0x0	/* PC25 periph B */ +							 4 21 0x1 0x0	/* PE21 periph A */ +							 4 23 0x1 0x0	/* PE23 periph A */ +							 4 24 0x1 0x0	/* PE24 periph A */ +							 4 25 0x1 0x0	/* PE25 periph A */ +							 4 26 0x1 0x0	/* PE26 periph A */ +							 4 27 0x1 0x0	/* PE27 periph A */ +							 4 28 0x1 0x0	/* PE28 periph A */ +							 4 29 0x1 0x0	/* PE29 periph A */ +							 4 30 0x1 0x0>;	/* PE30 periph A */ +					}; + +					pinctrl_macb_rmii_mii: macb_rmii_mii-0 { +						atmel,pins = +							<2 20 0x2 0x0	/* PC20 periph B */ +							 2 21 0x2 0x0	/* PC21 periph B */ +							 2 22 0x2 0x0	/* PC22 periph B */ +							 2 23 0x2 0x0	/* PC23 periph B */ +							 2 24 0x2 0x0	/* PC24 periph B */ +							 2 25 0x2 0x0	/* PC25 periph B */ +							 2 27 0x2 0x0	/* PC27 periph B */ +							 4 22 0x2 0x0>;	/* PE22 periph B */ +					}; +				}; + +				mmc0 { +					pinctrl_mmc0_clk: mmc0_clk-0 { +						atmel,pins = +							<0 12 0x1 0x0>;	/* PA12 periph A */ +					}; + +					pinctrl_mmc0_slot0_cmd_dat0: mmc0_slot0_cmd_dat0-0 { +						atmel,pins = +							<0 1 0x1 0x1	/* PA1 periph A with pullup */ +							 0 0 0x1 0x1>;	/* PA0 periph A with pullup */ +					}; + +					pinctrl_mmc0_slot0_dat1_3: mmc0_slot0_dat1_3-0 { +						atmel,pins = +							<0 3 0x1 0x1	/* PA3 periph A with pullup */ +							 0 4 0x1 0x1	/* PA4 periph A with pullup */ +							 0 5 0x1 0x1>;	/* PA5 periph A with pullup */ +					}; + +					pinctrl_mmc0_slot1_cmd_dat0: mmc0_slot1_cmd_dat0-0 { +						atmel,pins = +							<0 16 0x1 0x1	/* PA16 periph A with pullup */ +							 0 17 0x1 0x1>;	/* PA17 periph A with pullup */ +					}; + +					pinctrl_mmc0_slot1_dat1_3: mmc0_slot1_dat1_3-0 { +						atmel,pins = +							<0 18 0x1 0x1	/* PA18 periph A with pullup */ +							 0 19 0x1 0x1	/* PA19 periph A with pullup */ +							 0 20 0x1 0x1>;	/* PA20 periph A with pullup */ +					}; +				}; + +				mmc1 { +					pinctrl_mmc1_clk: mmc1_clk-0 { +						atmel,pins = +							<0 6 0x1 0x0>;	/* PA6 periph A */ +					}; + +					pinctrl_mmc1_slot0_cmd_dat0: mmc1_slot0_cmd_dat0-0 { +						atmel,pins = +							<0 7 0x1 0x1	/* PA7 periph A with pullup */ +							 0 8 0x1 0x1>;	/* PA8 periph A with pullup */ +					}; + +					pinctrl_mmc1_slot0_dat1_3: mmc1_slot0_dat1_3-0 { +						atmel,pins = +							<0 9 0x1 0x1	/* PA9 periph A with pullup */ +							 0 10 0x1 0x1	/* PA10 periph A with pullup */ +							 0 11 0x1 0x1>;	/* PA11 periph A with pullup */ +					}; + +					pinctrl_mmc1_slot1_cmd_dat0: mmc1_slot1_cmd_dat0-0 { +						atmel,pins = +							<0 21 0x1 0x1	/* PA21 periph A with pullup */ +							 0 22 0x1 0x1>;	/* PA22 periph A with pullup */ +					}; + +					pinctrl_mmc1_slot1_dat1_3: mmc1_slot1_dat1_3-0 { +						atmel,pins = +							<0 23 0x1 0x1	/* PA23 periph A with pullup */ +							 0 24 0x1 0x1	/* PA24 periph A with pullup */ +							 0 25 0x1 0x1>;	/* PA25 periph A with pullup */ +					}; +				}; + +				pioA: gpio@fffff200 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff200 0x200>; +					interrupts = <2 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioB: gpio@fffff400 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff400 0x200>; +					interrupts = <3 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioC: gpio@fffff600 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff600 0x200>; +					interrupts = <4 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioD: gpio@fffff800 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff800 0x200>; +					interrupts = <4 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioE: gpio@fffffa00 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffffa00 0x200>; +					interrupts = <4 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				};  			};  			dbgu: serial@ffffee00 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xffffee00 0x200>;  				interrupts = <1 4 7>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_dbgu>;  				status = "disabled";  			}; @@ -152,6 +335,8 @@  				interrupts = <7 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart0>;  				status = "disabled";  			}; @@ -161,6 +346,8 @@  				interrupts = <8 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart1>;  				status = "disabled";  			}; @@ -170,6 +357,8 @@  				interrupts = <9 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart2>;  				status = "disabled";  			}; @@ -177,6 +366,8 @@  				compatible = "cdns,at32ap7000-macb", "cdns,macb";  				reg = <0xfffbc000 0x100>;  				interrupts = <21 4 3>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_macb_rmii>;  				status = "disabled";  			}; @@ -196,6 +387,24 @@  				status = "disabled";  			}; +			mmc0: mmc@fff80000 { +				compatible = "atmel,hsmci"; +				reg = <0xfff80000 0x600>; +				interrupts = <10 4 0>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled"; +			}; + +			mmc1: mmc@fff84000 { +				compatible = "atmel,hsmci"; +				reg = <0xfff84000 0x600>; +				interrupts = <11 4 0>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled"; +			}; +  			watchdog@fffffd40 {  				compatible = "atmel,at91sam9260-wdt";  				reg = <0xfffffd40 0x10>; @@ -212,6 +421,8 @@  			      >;  			atmel,nand-addr-offset = <21>;  			atmel,nand-cmd-offset = <22>; +			pinctrl-names = "default"; +			pinctrl-0 = <&pinctrl_nand>;  			gpios = <&pioA 22 0  				 &pioD 15 0  				 0 diff --git a/arch/arm/boot/dts/at91sam9263ek.dts b/arch/arm/boot/dts/at91sam9263ek.dts index f86ac4b609f..1eb08728f52 100644 --- a/arch/arm/boot/dts/at91sam9263ek.dts +++ b/arch/arm/boot/dts/at91sam9263ek.dts @@ -38,6 +38,10 @@  			};  			usart0: serial@fff8c000 { +				pinctrl-0 = < +					&pinctrl_usart0 +					&pinctrl_usart0_rts +					&pinctrl_usart0_cts>;  				status = "okay";  			}; @@ -50,6 +54,31 @@  				atmel,vbus-gpio = <&pioA 25 0>;  				status = "okay";  			}; + +			mmc0: mmc@fff80000 { +				pinctrl-0 = < +					&pinctrl_board_mmc0 +					&pinctrl_mmc0_clk +					&pinctrl_mmc0_slot0_cmd_dat0 +					&pinctrl_mmc0_slot0_dat1_3>; +				status = "okay"; +				slot@0 { +					reg = <0>; +					bus-width = <4>; +					cd-gpios = <&pioE 18 0>; +					wp-gpios = <&pioE 19 0>; +				}; +			}; + +			pinctrl@fffff200 { +				mmc0 { +					pinctrl_board_mmc0: mmc0-board { +						atmel,pins = +							<5 18 0x0 0x5	/* PE18 gpio CD pin pull up and deglitch */ +							 5 19 0x0 0x1>;	/* PE19 gpio WP pin pull up */ +					}; +				}; +			};  		};  		nand0: nand@40000000 { diff --git a/arch/arm/boot/dts/at91sam9g15.dtsi b/arch/arm/boot/dts/at91sam9g15.dtsi new file mode 100644 index 00000000000..fbe7a7089c2 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g15.dtsi @@ -0,0 +1,28 @@ +/* + * at91sam9g15.dtsi - Device Tree Include file for AT91SAM9G15 SoC + * + * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * Licensed under GPLv2. + */ + +/include/ "at91sam9x5.dtsi" + +/ { +	model = "Atmel AT91SAM9G15 SoC"; +	compatible = "atmel, at91sam9g15, atmel,at91sam9x5"; + +	ahb { +		apb { +			pinctrl@fffff400 { +				atmel,mux-mask = < +				      /*    A         B          C     */ +				       0xffffffff 0xffe0399f 0x00000000  /* pioA */ +				       0x00040000 0x00047e3f 0x00000000  /* pioB */ +				       0xfdffffff 0x00000000 0xb83fffff  /* pioC */ +				       0x003fffff 0x003f8000 0x00000000  /* pioD */ +				      >; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/at91sam9g15ek.dts b/arch/arm/boot/dts/at91sam9g15ek.dts new file mode 100644 index 00000000000..86dd3f6d938 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g15ek.dts @@ -0,0 +1,16 @@ +/* + * at91sam9g15ek.dts - Device Tree file for AT91SAM9G15-EK board + * + *  Copyright (C) 2012 Atmel, + *                2012 Nicolas Ferre <nicolas.ferre@atmel.com> + * + * Licensed under GPLv2 or later. + */ +/dts-v1/; +/include/ "at91sam9g15.dtsi" +/include/ "at91sam9x5ek.dtsi" + +/ { +	model = "Atmel AT91SAM9G25-EK"; +	compatible = "atmel,at91sam9g15ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; +}; diff --git a/arch/arm/boot/dts/at91sam9g20ek_2mmc.dts b/arch/arm/boot/dts/at91sam9g20ek_2mmc.dts index f1b2e148ac8..66467b11312 100644 --- a/arch/arm/boot/dts/at91sam9g20ek_2mmc.dts +++ b/arch/arm/boot/dts/at91sam9g20ek_2mmc.dts @@ -12,6 +12,32 @@  	model = "Atmel at91sam9g20ek 2 mmc";  	compatible = "atmel,at91sam9g20ek_2mmc", "atmel,at91sam9g20", "atmel,at91sam9"; +	ahb { +		apb{ +			mmc0: mmc@fffa8000 { +				/* clk already mux wuth slot0 */ +				pinctrl-0 = < +					&pinctrl_board_mmc0_slot0 +					&pinctrl_mmc0_slot0_cmd_dat0 +					&pinctrl_mmc0_slot0_dat1_3>; +				slot@0 { +					reg = <0>; +					bus-width = <4>; +					cd-gpios = <&pioC 2 0>; +				}; +			}; + +			pinctrl@fffff400 { +				mmc0_slot0 { +					pinctrl_board_mmc0_slot0: mmc0_slot0-board { +						atmel,pins = +							<2 2 0x0 0x5>;	/* PC2 gpio CD pin pull up and deglitch */ +					}; +				}; +			}; +		}; +	}; +  	leds {  		compatible = "gpio-leds"; diff --git a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi index e6391a4e664..32a500a0e48 100644 --- a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi +++ b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi @@ -35,6 +35,13 @@  			};  			usart0: serial@fffb0000 { +				pinctrl-0 = +					<&pinctrl_usart0 +					 &pinctrl_usart0_rts +					 &pinctrl_usart0_cts +					 &pinctrl_usart0_dtr_dsr +					 &pinctrl_usart0_dcd +					 &pinctrl_usart0_ri>;  				status = "okay";  			}; @@ -51,6 +58,29 @@  				atmel,vbus-gpio = <&pioC 5 0>;  				status = "okay";  			}; + +			mmc0: mmc@fffa8000 { +				pinctrl-0 = < +					&pinctrl_board_mmc0_slot1 +					&pinctrl_mmc0_clk +					&pinctrl_mmc0_slot1_cmd_dat0 +					&pinctrl_mmc0_slot1_dat1_3>; +				status = "okay"; +				slot@1 { +					reg = <1>; +					bus-width = <4>; +					cd-gpios = <&pioC 9 0>; +				}; +			}; + +			pinctrl@fffff400 { +				mmc0_slot1 { +					pinctrl_board_mmc0_slot1: mmc0_slot1-board { +						atmel,pins = +							<2 9 0x0 0x5>;	/* PC9 gpio CD pin pull up and deglitch */ +					}; +				}; +			};  		};  		nand0: nand@40000000 { diff --git a/arch/arm/boot/dts/at91sam9g25.dtsi b/arch/arm/boot/dts/at91sam9g25.dtsi new file mode 100644 index 00000000000..05a718fb83c --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g25.dtsi @@ -0,0 +1,28 @@ +/* + * at91sam9g25.dtsi - Device Tree Include file for AT91SAM9G25 SoC + * + * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * Licensed under GPLv2. + */ + +/include/ "at91sam9x5.dtsi" + +/ { +	model = "Atmel AT91SAM9G25 SoC"; +	compatible = "atmel, at91sam9g25, atmel,at91sam9x5"; + +	ahb { +		apb { +			pinctrl@fffff400 { +				atmel,mux-mask = < +				      /*    A         B          C     */ +				       0xffffffff 0xffe0399f 0xc000001c  /* pioA */ +				       0x0007ffff 0x8000fe3f 0x00000000  /* pioB */ +				       0x80000000 0x07c0ffff 0xb83fffff  /* pioC */ +				       0x003fffff 0x003f8000 0x00000000  /* pioD */ +				      >; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/at91sam9g25ek.dts b/arch/arm/boot/dts/at91sam9g25ek.dts index 877c08f0676..c5ab16fba05 100644 --- a/arch/arm/boot/dts/at91sam9g25ek.dts +++ b/arch/arm/boot/dts/at91sam9g25ek.dts @@ -7,55 +7,10 @@   * Licensed under GPLv2 or later.   */  /dts-v1/; -/include/ "at91sam9x5.dtsi" -/include/ "at91sam9x5cm.dtsi" +/include/ "at91sam9g25.dtsi" +/include/ "at91sam9x5ek.dtsi"  / {  	model = "Atmel AT91SAM9G25-EK";  	compatible = "atmel,at91sam9g25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; - -	chosen { -		bootargs = "console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; -	}; - -	ahb { -		apb { -			dbgu: serial@fffff200 { -				status = "okay"; -			}; - -			usart0: serial@f801c000 { -				status = "okay"; -			}; - -			macb0: ethernet@f802c000 { -				phy-mode = "rmii"; -				status = "okay"; -			}; - -			i2c0: i2c@f8010000 { -				status = "okay"; -			}; - -			i2c1: i2c@f8014000 { -				status = "okay"; -			}; - -			i2c2: i2c@f8018000 { -				status = "okay"; -			}; -		}; - -		usb0: ohci@00600000 { -			status = "okay"; -			num-ports = <2>; -			atmel,vbus-gpio = <&pioD 19 1 -					   &pioD 20 1 -					  >; -		}; - -		usb1: ehci@00700000 { -			status = "okay"; -		}; -	};  }; diff --git a/arch/arm/boot/dts/at91sam9g35.dtsi b/arch/arm/boot/dts/at91sam9g35.dtsi new file mode 100644 index 00000000000..f9d14a72279 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g35.dtsi @@ -0,0 +1,28 @@ +/* + * at91sam9g35.dtsi - Device Tree Include file for AT91SAM9G35 SoC + * + * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * Licensed under GPLv2. + */ + +/include/ "at91sam9x5.dtsi" + +/ { +	model = "Atmel AT91SAM9G35 SoC"; +	compatible = "atmel, at91sam9g35, atmel,at91sam9x5"; + +	ahb { +		apb { +			pinctrl@fffff400 { +				atmel,mux-mask = < +				      /*    A         B          C     */ +				       0xffffffff 0xffe0399f 0xc000000c  /* pioA */ +				       0x000406ff 0x00047e3f 0x00000000  /* pioB */ +				       0xfdffffff 0x00000000 0xb83fffff  /* pioC */ +				       0x003fffff 0x003f8000 0x00000000  /* pioD */ +				      >; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/at91sam9g35ek.dts b/arch/arm/boot/dts/at91sam9g35ek.dts new file mode 100644 index 00000000000..95944bdd798 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g35ek.dts @@ -0,0 +1,16 @@ +/* + * at91sam9g35ek.dts - Device Tree file for AT91SAM9G35-EK board + * + *  Copyright (C) 2012 Atmel, + *                2012 Nicolas Ferre <nicolas.ferre@atmel.com> + * + * Licensed under GPLv2 or later. + */ +/dts-v1/; +/include/ "at91sam9g35.dtsi" +/include/ "at91sam9x5ek.dtsi" + +/ { +	model = "Atmel AT91SAM9G35-EK"; +	compatible = "atmel,at91sam9g35ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; +}; diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index a98c00a234e..485fc395efc 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi @@ -108,60 +108,243 @@  				interrupts = <21 4 0>;  			}; -			pioA: gpio@fffff200 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffff200 0x100>; -				interrupts = <2 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +			pinctrl@fffff200 { +				#address-cells = <1>; +				#size-cells = <1>; +				compatible = "atmel,at91rm9200-pinctrl", "simple-bus"; +				ranges = <0xfffff200 0xfffff200 0xa00>; -			pioB: gpio@fffff400 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffff400 0x100>; -				interrupts = <3 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +				atmel,mux-mask = < +				      /*    A         B     */ +				       0xffffffff 0xffc003ff  /* pioA */ +				       0xffffffff 0x800f8f00  /* pioB */ +				       0xffffffff 0x00000e00  /* pioC */ +				       0xffffffff 0xff0c1381  /* pioD */ +				       0xffffffff 0x81ffff81  /* pioE */ +				      >; -			pioC: gpio@fffff600 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffff600 0x100>; -				interrupts = <4 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +				/* shared pinctrl settings */ +				dbgu { +					pinctrl_dbgu: dbgu-0 { +						atmel,pins = +							<1 12 0x1 0x0	/* PB12 periph A */ +							 1 13 0x1 0x0>;	/* PB13 periph A */ +					}; +				}; -			pioD: gpio@fffff800 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffff800 0x100>; -				interrupts = <5 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +				usart0 { +					pinctrl_usart0: usart0-0 { +						atmel,pins = +							<1 19 0x1 0x1	/* PB19 periph A with pullup */ +							 1 18 0x1 0x0>;	/* PB18 periph A */ +					}; -			pioE: gpio@fffffa00 { -				compatible = "atmel,at91rm9200-gpio"; -				reg = <0xfffffa00 0x100>; -				interrupts = <5 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; +					pinctrl_usart0_rts: usart0_rts-0 { +						atmel,pins = +							<1 17 0x2 0x0>;	/* PB17 periph B */ +					}; + +					pinctrl_usart0_cts: usart0_cts-0 { +						atmel,pins = +							<1 15 0x2 0x0>;	/* PB15 periph B */ +					}; +				}; + +				uart1 { +					pinctrl_usart1: usart1-0 { +						atmel,pins = +							<1 4 0x1 0x1	/* PB4 periph A with pullup */ +							 1 5 0x1 0x0>;	/* PB5 periph A */ +					}; + +					pinctrl_usart1_rts: usart1_rts-0 { +						atmel,pins = +							<3 16 0x1 0x0>;	/* PD16 periph A */ +					}; + +					pinctrl_usart1_cts: usart1_cts-0 { +						atmel,pins = +							<3 17 0x1 0x0>;	/* PD17 periph A */ +					}; +				}; + +				usart2 { +					pinctrl_usart2: usart2-0 { +						atmel,pins = +							<1 6 0x1 0x1	/* PB6 periph A with pullup */ +							 1 7 0x1 0x0>;	/* PB7 periph A */ +					}; + +					pinctrl_usart2_rts: usart2_rts-0 { +						atmel,pins = +							<2 9 0x2 0x0>;	/* PC9 periph B */ +					}; + +					pinctrl_usart2_cts: usart2_cts-0 { +						atmel,pins = +							<2 11 0x2 0x0>;	/* PC11 periph B */ +					}; +				}; + +				usart3 { +					pinctrl_usart3: usart3-0 { +						atmel,pins = +							<1 8 0x1 0x1	/* PB9 periph A with pullup */ +							 1 9 0x1 0x0>;	/* PB8 periph A */ +					}; + +					pinctrl_usart3_rts: usart3_rts-0 { +						atmel,pins = +							<0 23 0x2 0x0>;	/* PA23 periph B */ +					}; + +					pinctrl_usart3_cts: usart3_cts-0 { +						atmel,pins = +							<0 24 0x2 0x0>;	/* PA24 periph B */ +					}; +				}; + +				nand { +					pinctrl_nand: nand-0 { +						atmel,pins = +							<2 8 0x0 0x1	/* PC8 gpio RDY pin pull_up*/ +							 2 14 0x0 0x1>;	/* PC14 gpio enable pin pull_up */ +					}; +				}; + +				macb { +					pinctrl_macb_rmii: macb_rmii-0 { +						atmel,pins = +							<0 10 0x1 0x0	/* PA10 periph A */ +							 0 11 0x1 0x0	/* PA11 periph A */ +							 0 12 0x1 0x0	/* PA12 periph A */ +							 0 13 0x1 0x0	/* PA13 periph A */ +							 0 14 0x1 0x0	/* PA14 periph A */ +							 0 15 0x1 0x0	/* PA15 periph A */ +							 0 16 0x1 0x0	/* PA16 periph A */ +							 0 17 0x1 0x0	/* PA17 periph A */ +							 0 18 0x1 0x0	/* PA18 periph A */ +							 0 19 0x1 0x0>;	/* PA19 periph A */ +					}; + +					pinctrl_macb_rmii_mii: macb_rmii_mii-0 { +						atmel,pins = +							<0 6 0x2 0x0	/* PA6 periph B */ +							 0 7 0x2 0x0	/* PA7 periph B */ +							 0 8 0x2 0x0	/* PA8 periph B */ +							 0 9 0x2 0x0	/* PA9 periph B */ +							 0 27 0x2 0x0	/* PA27 periph B */ +							 0 28 0x2 0x0	/* PA28 periph B */ +							 0 29 0x2 0x0	/* PA29 periph B */ +							 0 30 0x2 0x0>;	/* PA30 periph B */ +					}; +				}; + +				mmc0 { +					pinctrl_mmc0_slot0_clk_cmd_dat0: mmc0_slot0_clk_cmd_dat0-0 { +						atmel,pins = +							<0 0 0x1 0x0	/* PA0 periph A */ +							 0 1 0x1 0x1	/* PA1 periph A with pullup */ +							 0 2 0x1 0x1>;	/* PA2 periph A with pullup */ +					}; + +					pinctrl_mmc0_slot0_dat1_3: mmc0_slot0_dat1_3-0 { +						atmel,pins = +							<0 3 0x1 0x1	/* PA3 periph A with pullup */ +							 0 4 0x1 0x1	/* PA4 periph A with pullup */ +							 0 5 0x1 0x1>;	/* PA5 periph A with pullup */ +					}; + +					pinctrl_mmc0_slot0_dat4_7: mmc0_slot0_dat4_7-0 { +						atmel,pins = +							<0 6 0x1 0x1	/* PA6 periph A with pullup */ +							 0 7 0x1 0x1	/* PA7 periph A with pullup */ +							 0 8 0x1 0x1	/* PA8 periph A with pullup */ +							 0 9 0x1 0x1>;	/* PA9 periph A with pullup */ +					}; +				}; + +				mmc1 { +					pinctrl_mmc1_slot0_clk_cmd_dat0: mmc1_slot0_clk_cmd_dat0-0 { +						atmel,pins = +							<0 31 0x1 0x0	/* PA31 periph A */ +							 0 22 0x1 0x1	/* PA22 periph A with pullup */ +							 0 23 0x1 0x1>;	/* PA23 periph A with pullup */ +					}; + +					pinctrl_mmc1_slot0_dat1_3: mmc1_slot0_dat1_3-0 { +						atmel,pins = +							<0 24 0x1 0x1	/* PA24 periph A with pullup */ +							 0 25 0x1 0x1	/* PA25 periph A with pullup */ +							 0 26 0x1 0x1>;	/* PA26 periph A with pullup */ +					}; + +					pinctrl_mmc1_slot0_dat4_7: mmc1_slot0_dat4_7-0 { +						atmel,pins = +							<0 27 0x1 0x1	/* PA27 periph A with pullup */ +							 0 28 0x1 0x1	/* PA28 periph A with pullup */ +							 0 29 0x1 0x1	/* PA29 periph A with pullup */ +							 0 20 0x1 0x1>;	/* PA30 periph A with pullup */ +					}; +				}; + +				pioA: gpio@fffff200 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff200 0x200>; +					interrupts = <2 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioB: gpio@fffff400 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff400 0x200>; +					interrupts = <3 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioC: gpio@fffff600 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff600 0x200>; +					interrupts = <4 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioD: gpio@fffff800 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffff800 0x200>; +					interrupts = <5 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioE: gpio@fffffa00 { +					compatible = "atmel,at91rm9200-gpio"; +					reg = <0xfffffa00 0x200>; +					interrupts = <5 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				};  			};  			dbgu: serial@ffffee00 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xffffee00 0x200>;  				interrupts = <1 4 7>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_dbgu>;  				status = "disabled";  			}; @@ -171,6 +354,8 @@  				interrupts = <7 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart0>;  				status = "disabled";  			}; @@ -180,6 +365,8 @@  				interrupts = <8 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart1>;  				status = "disabled";  			}; @@ -189,6 +376,8 @@  				interrupts = <9 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart2>;  				status = "disabled";  			}; @@ -198,6 +387,8 @@  				interrupts = <10 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart3>;  				status = "disabled";  			}; @@ -205,6 +396,8 @@  				compatible = "cdns,at32ap7000-macb", "cdns,macb";  				reg = <0xfffbc000 0x100>;  				interrupts = <25 4 3>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_macb_rmii>;  				status = "disabled";  			}; @@ -263,6 +456,24 @@  				};  			}; +			mmc0: mmc@fff80000 { +				compatible = "atmel,hsmci"; +				reg = <0xfff80000 0x600>; +				interrupts = <11 4 0>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled"; +			}; + +			mmc1: mmc@fffd0000 { +				compatible = "atmel,hsmci"; +				reg = <0xfffd0000 0x600>; +				interrupts = <29 4 0>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled"; +			}; +  			watchdog@fffffd40 {  				compatible = "atmel,at91sam9260-wdt";  				reg = <0xfffffd40 0x10>; @@ -279,6 +490,8 @@  			      >;  			atmel,nand-addr-offset = <21>;  			atmel,nand-cmd-offset = <22>; +			pinctrl-names = "default"; +			pinctrl-0 = <&pinctrl_nand>;  			gpios = <&pioC 8 0  				 &pioC 14 0  				 0 diff --git a/arch/arm/boot/dts/at91sam9m10g45ek.dts b/arch/arm/boot/dts/at91sam9m10g45ek.dts index 15e1dd43f62..20c31913c27 100644 --- a/arch/arm/boot/dts/at91sam9m10g45ek.dts +++ b/arch/arm/boot/dts/at91sam9m10g45ek.dts @@ -39,6 +39,10 @@  			};  			usart1: serial@fff90000 { +				pinctrl-0 = +					<&pinctrl_usart1 +					 &pinctrl_usart1_rts +					 &pinctrl_usart1_cts>;  				status = "okay";  			}; @@ -54,6 +58,50 @@  			i2c1: i2c@fff88000 {  				status = "okay";  			}; + +			mmc0: mmc@fff80000 { +				pinctrl-0 = < +					&pinctrl_board_mmc0 +					&pinctrl_mmc0_slot0_clk_cmd_dat0 +					&pinctrl_mmc0_slot0_dat1_3>; +				status = "okay"; +				slot@0 { +					reg = <0>; +					bus-width = <4>; +					cd-gpios = <&pioD 10 0>; +				}; +			}; + +			mmc1: mmc@fffd0000 { +				pinctrl-0 = < +					&pinctrl_board_mmc1 +					&pinctrl_mmc1_slot0_clk_cmd_dat0 +					&pinctrl_mmc1_slot0_dat1_3>; +				status = "okay"; +				slot@0 { +					reg = <0>; +					bus-width = <4>; +					cd-gpios = <&pioD 11 0>; +					wp-gpios = <&pioD 29 0>; +				}; +			}; + +			pinctrl@fffff200 { +				mmc0 { +					pinctrl_board_mmc0: mmc0-board { +						atmel,pins = +							<3 10 0x0 0x5>;	/* PD10 gpio CD pin pull up and deglitch */ +					}; +				}; + +				mmc1 { +					pinctrl_board_mmc1: mmc1-board { +						atmel,pins = +							<3 11 0x0 0x5	/* PD11 gpio CD pin pull up and deglitch */ +							 3 29 0x0 0x1>;	/* PD29 gpio WP pin pull up */ +					}; +				}; +			};  		};  		nand0: nand@40000000 { diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi index 82508d68aa7..e9efb34f437 100644 --- a/arch/arm/boot/dts/at91sam9n12.dtsi +++ b/arch/arm/boot/dts/at91sam9n12.dtsi @@ -84,6 +84,15 @@  				reg = <0xfffffe10 0x10>;  			}; +			mmc0: mmc@f0008000 { +				compatible = "atmel,hsmci"; +				reg = <0xf0008000 0x600>; +				interrupts = <12 4 0>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled"; +			}; +  			tcb0: timer@f8008000 {  				compatible = "atmel,at91sam9x5-tcb";  				reg = <0xf8008000 0x100>; @@ -102,50 +111,186 @@  				interrupts = <20 4 0>;  			}; -			pioA: gpio@fffff400 { -				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; -				reg = <0xfffff400 0x100>; -				interrupts = <2 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +			pinctrl@fffff400 { +				#address-cells = <1>; +				#size-cells = <1>; +				compatible = "atmel,at91sam9x5-pinctrl", "atmel,at91rm9200-pinctrl", "simple-bus"; +				ranges = <0xfffff400 0xfffff400 0x800>; -			pioB: gpio@fffff600 { -				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; -				reg = <0xfffff600 0x100>; -				interrupts = <2 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +				atmel,mux-mask = < +				      /*    A         B          C     */ +				       0xffffffff 0xffe07983 0x00000000  /* pioA */ +				       0x00040000 0x00047e0f 0x00000000  /* pioB */ +				       0xfdffffff 0x07c00000 0xb83fffff  /* pioC */ +				       0x003fffff 0x003f8000 0x00000000  /* pioD */ +				      >; -			pioC: gpio@fffff800 { -				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; -				reg = <0xfffff800 0x100>; -				interrupts = <3 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +				/* shared pinctrl settings */ +				dbgu { +					pinctrl_dbgu: dbgu-0 { +						atmel,pins = +							<0 9 0x1 0x0	/* PA9 periph A */ +							 0 10 0x1 0x1>;	/* PA10 periph with pullup */ +					}; +				}; -			pioD: gpio@fffffa00 { -				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; -				reg = <0xfffffa00 0x100>; -				interrupts = <3 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; +				usart0 { +					pinctrl_usart0: usart0-0 { +						atmel,pins = +							<0 1 0x1 0x1	/* PA1 periph A with pullup */ +							 0 0 0x1 0x0>;	/* PA0 periph A */ +					}; + +					pinctrl_usart0_rts: usart0_rts-0 { +						atmel,pins = +							<0 2 0x1 0x0>;	/* PA2 periph A */ +					}; + +					pinctrl_usart0_cts: usart0_cts-0 { +						atmel,pins = +							<0 3 0x1 0x0>;	/* PA3 periph A */ +					}; +				}; + +				usart1 { +					pinctrl_usart1: usart1-0 { +						atmel,pins = +							<0 6 0x1 0x1	/* PA6 periph A with pullup */ +							 0 5 0x1 0x0>;	/* PA5 periph A */ +					}; +				}; + +				usart2 { +					pinctrl_usart2: usart2-0 { +						atmel,pins = +							<0 8 0x1 0x1	/* PA8 periph A with pullup */ +							 0 7 0x1 0x0>;	/* PA7 periph A */ +					}; + +					pinctrl_usart2_rts: usart2_rts-0 { +						atmel,pins = +							<1 0 0x2 0x0>;	/* PB0 periph B */ +					}; + +					pinctrl_usart2_cts: usart2_cts-0 { +						atmel,pins = +							<1 1 0x2 0x0>;	/* PB1 periph B */ +					}; +				}; + +				usart3 { +					pinctrl_usart3: usart3-0 { +						atmel,pins = +							<2 23 0x2 0x1	/* PC23 periph B with pullup */ +							 2 22 0x2 0x0>;	/* PC22 periph B */ +					}; + +					pinctrl_usart3_rts: usart3_rts-0 { +						atmel,pins = +							<2 24 0x2 0x0>;	/* PC24 periph B */ +					}; + +					pinctrl_usart3_cts: usart3_cts-0 { +						atmel,pins = +							<2 25 0x2 0x0>;	/* PC25 periph B */ +					}; +				}; + +				uart0 { +					pinctrl_uart0: uart0-0 { +						atmel,pins = +							<2 9 0x3 0x1	/* PC9 periph C with pullup */ +							 2 8 0x3 0x0>;	/* PC8 periph C */ +					}; +				}; + +				uart1 { +					pinctrl_uart1: uart1-0 { +						atmel,pins = +							<2 16 0x3 0x1	/* PC17 periph C with pullup */ +							 2 17 0x3 0x0>;	/* PC16 periph C */ +					}; +				}; + +				nand { +					pinctrl_nand: nand-0 { +						atmel,pins = +							<3 5 0x0 0x1	/* PD5 gpio RDY pin pull_up*/ +							 3 4 0x0 0x1>;	/* PD4 gpio enable pin pull_up */ +					}; +				}; + +				mmc0 { +					pinctrl_mmc0_slot0_clk_cmd_dat0: mmc0_slot0_clk_cmd_dat0-0 { +						atmel,pins = +							<0 17 0x1 0x0	/* PA17 periph A */ +							 0 16 0x1 0x1	/* PA16 periph A with pullup */ +							 0 15 0x1 0x1>;	/* PA15 periph A with pullup */ +					}; + +					pinctrl_mmc0_slot0_dat1_3: mmc0_slot0_dat1_3-0 { +						atmel,pins = +							<0 18 0x1 0x1	/* PA18 periph A with pullup */ +							 0 19 0x1 0x1	/* PA19 periph A with pullup */ +							 0 20 0x1 0x1>;	/* PA20 periph A with pullup */ +					}; + +					pinctrl_mmc0_slot0_dat4_7: mmc0_slot0_dat4_7-0 { +						atmel,pins = +							<0 11 0x2 0x1	/* PA11 periph B with pullup */ +							 0 12 0x2 0x1	/* PA12 periph B with pullup */ +							 0 13 0x2 0x1	/* PA13 periph B with pullup */ +							 0 14 0x2 0x1>;	/* PA14 periph B with pullup */ +					}; +				}; + +				pioA: gpio@fffff400 { +					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; +					reg = <0xfffff400 0x200>; +					interrupts = <2 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioB: gpio@fffff600 { +					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; +					reg = <0xfffff600 0x200>; +					interrupts = <2 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioC: gpio@fffff800 { +					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; +					reg = <0xfffff800 0x200>; +					interrupts = <3 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioD: gpio@fffffa00 { +					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; +					reg = <0xfffffa00 0x200>; +					interrupts = <3 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				};  			};  			dbgu: serial@fffff200 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffff200 0x200>;  				interrupts = <1 4 7>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_dbgu>;  				status = "disabled";  			}; @@ -155,6 +300,8 @@  				interrupts = <5 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart0>;  				status = "disabled";  			}; @@ -164,6 +311,8 @@  				interrupts = <6 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart1>;  				status = "disabled";  			}; @@ -173,6 +322,8 @@  				interrupts = <7 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart2>;  				status = "disabled";  			}; @@ -182,6 +333,8 @@  				interrupts = <8 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart3>;  				status = "disabled";  			}; @@ -215,6 +368,8 @@  			       >;  			atmel,nand-addr-offset = <21>;  			atmel,nand-cmd-offset = <22>; +			pinctrl-names = "default"; +			pinctrl-0 = <&pinctrl_nand>;  			gpios = <&pioD 5 0  				 &pioD 4 0  				 0 diff --git a/arch/arm/boot/dts/at91sam9n12ek.dts b/arch/arm/boot/dts/at91sam9n12ek.dts index 912b2c283d6..0376bf4fd66 100644 --- a/arch/arm/boot/dts/at91sam9n12ek.dts +++ b/arch/arm/boot/dts/at91sam9n12ek.dts @@ -45,6 +45,28 @@  			i2c1: i2c@f8014000 {  				status = "okay";  			}; + +			mmc0: mmc@f0008000 { +				pinctrl-0 = < +					&pinctrl_board_mmc0 +					&pinctrl_mmc0_slot0_clk_cmd_dat0 +					&pinctrl_mmc0_slot0_dat1_3>; +				status = "okay"; +				slot@0 { +					reg = <0>; +					bus-width = <4>; +					cd-gpios = <&pioA 7 0>; +				}; +			}; + +			pinctrl@fffff400 { +				mmc0 { +					pinctrl_board_mmc0: mmc0-board { +						atmel,pins = +							<0 7 0x0 0x5>;	/* PA7 gpio CD pin pull up and deglitch */ +					}; +				}; +			};  		};  		nand0: nand@40000000 { diff --git a/arch/arm/boot/dts/at91sam9x25.dtsi b/arch/arm/boot/dts/at91sam9x25.dtsi new file mode 100644 index 00000000000..54eb33ba6d2 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9x25.dtsi @@ -0,0 +1,49 @@ +/* + * at91sam9x25.dtsi - Device Tree Include file for AT91SAM9X25 SoC + * + * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * Licensed under GPLv2. + */ + +/include/ "at91sam9x5.dtsi" + +/ { +	model = "Atmel AT91SAM9X25 SoC"; +	compatible = "atmel, at91sam9x25, atmel,at91sam9x5"; + +	ahb { +		apb { +			pinctrl@fffff400 { +				atmel,mux-mask = < +				      /*    A         B          C     */ +				       0xffffffff 0xffe03fff 0xc000001c  /* pioA */ +				       0x0007ffff 0x00047e3f 0x00000000  /* pioB */ +				       0x80000000 0xfffd0000 0xb83fffff  /* pioC */ +				       0x003fffff 0x003f8000 0x00000000  /* pioD */ +				      >; + +				macb1 { +					pinctrl_macb1_rmii: macb1_rmii-0 { +						atmel,pins = +							<2 16 0x2 0x0	/* PC16 periph B */ +							 2 18 0x2 0x0	/* PC18 periph B */ +							 2 19 0x2 0x0	/* PC19 periph B */ +							 2 20 0x2 0x0	/* PC20 periph B */ +							 2 21 0x2 0x0	/* PC21 periph B */ +							 2 27 0x2 0x0	/* PC27 periph B */ +							 2 28 0x2 0x0	/* PC28 periph B */ +							 2 29 0x2 0x0	/* PC29 periph B */ +							 2 30 0x2 0x0	/* PC30 periph B */ +							 2 31 0x2 0x0>;	/* PC31 periph B */ +					}; +				}; +			}; + +			macb1: ethernet@f8030000 { +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_macb1_rmii>; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/at91sam9x25ek.dts b/arch/arm/boot/dts/at91sam9x25ek.dts new file mode 100644 index 00000000000..af907eaa1f2 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9x25ek.dts @@ -0,0 +1,16 @@ +/* + * at91sam9x25ek.dts - Device Tree file for AT91SAM9X25-EK board + * + *  Copyright (C) 2012 Atmel, + *                2012 Nicolas Ferre <nicolas.ferre@atmel.com> + * + * Licensed under GPLv2 or later. + */ +/dts-v1/; +/include/ "at91sam9x25.dtsi" +/include/ "at91sam9x5ek.dtsi" + +/ { +	model = "Atmel AT91SAM9G25-EK"; +	compatible = "atmel,at91sam9x25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; +}; diff --git a/arch/arm/boot/dts/at91sam9x35.dtsi b/arch/arm/boot/dts/at91sam9x35.dtsi new file mode 100644 index 00000000000..fb102d6126c --- /dev/null +++ b/arch/arm/boot/dts/at91sam9x35.dtsi @@ -0,0 +1,28 @@ +/* + * at91sam9x35.dtsi - Device Tree Include file for AT91SAM9X35 SoC + * + * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * Licensed under GPLv2. + */ + +/include/ "at91sam9x5.dtsi" + +/ { +	model = "Atmel AT91SAM9X35 SoC"; +	compatible = "atmel, at91sam9x35, atmel,at91sam9x5"; + +	ahb { +		apb { +			pinctrl@fffff400 { +				atmel,mux-mask = < +				      /*    A         B          C     */ +				       0xffffffff 0xffe03fff 0xc000000c  /* pioA */ +				       0x000406ff 0x00047e3f 0x00000000  /* pioB */ +				       0xfdffffff 0x00000000 0xb83fffff  /* pioC */ +				       0x003fffff 0x003f8000 0x00000000  /* pioD */ +				      >; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/at91sam9x35ek.dts b/arch/arm/boot/dts/at91sam9x35ek.dts new file mode 100644 index 00000000000..5ccb607b541 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9x35ek.dts @@ -0,0 +1,16 @@ +/* + * at91sam9x35ek.dts - Device Tree file for AT91SAM9X35-EK board + * + *  Copyright (C) 2012 Atmel, + *                2012 Nicolas Ferre <nicolas.ferre@atmel.com> + * + * Licensed under GPLv2 or later. + */ +/dts-v1/; +/include/ "at91sam9x35.dtsi" +/include/ "at91sam9x5ek.dtsi" + +/ { +	model = "Atmel AT91SAM9X35-EK"; +	compatible = "atmel,at91sam9x35ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; +}; diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index 03fc136421c..7ee49e8daf9 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi @@ -111,50 +111,244 @@  				interrupts = <21 4 0>;  			}; -			pioA: gpio@fffff400 { -				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; -				reg = <0xfffff400 0x100>; -				interrupts = <2 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; -			}; +			pinctrl@fffff400 { +				#address-cells = <1>; +				#size-cells = <1>; +				compatible = "atmel,at91sam9x5-pinctrl", "atmel,at91rm9200-pinctrl", "simple-bus"; +				ranges = <0xfffff400 0xfffff400 0x800>; -			pioB: gpio@fffff600 { -				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; -				reg = <0xfffff600 0x100>; -				interrupts = <2 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; +				/* shared pinctrl settings */ +				dbgu { +					pinctrl_dbgu: dbgu-0 { +						atmel,pins = +							<0 9 0x1 0x0	/* PA9 periph A */ +							 0 10 0x1 0x1>;	/* PA10 periph A with pullup */ +					}; +				}; + +				usart0 { +					pinctrl_usart0: usart0-0 { +						atmel,pins = +							<0 0 0x1 0x1	/* PA0 periph A with pullup */ +							 0 1 0x1 0x0>;	/* PA1 periph A */ +					}; + +					pinctrl_usart0_rts: usart0_rts-0 { +						atmel,pins = +							<0 2 0x1 0x0>;	/* PA2 periph A */ +					}; + +					pinctrl_usart0_cts: usart0_cts-0 { +						atmel,pins = +							<0 3 0x1 0x0>;	/* PA3 periph A */ +					}; +				}; + +				usart1 { +					pinctrl_usart1: usart1-0 { +						atmel,pins = +							<0 5 0x1 0x1	/* PA5 periph A with pullup */ +							 0 6 0x1 0x0>;	/* PA6 periph A */ +					}; + +					pinctrl_usart1_rts: usart1_rts-0 { +						atmel,pins = +							<3 27 0x3 0x0>;	/* PC27 periph C */ +					}; + +					pinctrl_usart1_cts: usart1_cts-0 { +						atmel,pins = +							<3 28 0x3 0x0>;	/* PC28 periph C */ +					}; +				}; + +				usart2 { +					pinctrl_usart2: usart2-0 { +						atmel,pins = +							<0 7 0x1 0x1	/* PA7 periph A with pullup */ +							 0 8 0x1 0x0>;	/* PA8 periph A */ +					}; + +					pinctrl_uart2_rts: uart2_rts-0 { +						atmel,pins = +							<0 0 0x2 0x0>;	/* PB0 periph B */ +					}; + +					pinctrl_uart2_cts: uart2_cts-0 { +						atmel,pins = +							<0 1 0x2 0x0>;	/* PB1 periph B */ +					}; +				}; + +				usart3 { +					pinctrl_uart3: usart3-0 { +						atmel,pins = +							<3 23 0x2 0x1	/* PC22 periph B with pullup */ +							 3 23 0x2 0x0>;	/* PC23 periph B */ +					}; + +					pinctrl_usart3_rts: usart3_rts-0 { +						atmel,pins = +							<3 24 0x2 0x0>;	/* PC24 periph B */ +					}; + +					pinctrl_usart3_cts: usart3_cts-0 { +						atmel,pins = +							<3 25 0x2 0x0>;	/* PC25 periph B */ +					}; +				}; + +				uart0 { +					pinctrl_uart0: uart0-0 { +						atmel,pins = +							<3 8 0x3 0x0	/* PC8 periph C */ +							 3 9 0x3 0x1>;	/* PC9 periph C with pullup */ +					}; +				}; + +				uart1 { +					pinctrl_uart1: uart1-0 { +						atmel,pins = +							<3 16 0x3 0x0	/* PC16 periph C */ +							 3 17 0x3 0x1>;	/* PC17 periph C with pullup */ +					}; +				}; + +				nand { +					pinctrl_nand: nand-0 { +						atmel,pins = +							<3 4 0x0 0x1	/* PD5 gpio RDY pin pull_up */ +							 3 5 0x0 0x1>;	/* PD4 gpio enable pin pull_up */ +					}; +				}; + +				macb0 { +					pinctrl_macb0_rmii: macb0_rmii-0 { +						atmel,pins = +							<1 0 0x1 0x0	/* PB0 periph A */ +							 1 1 0x1 0x0	/* PB1 periph A */ +							 1 2 0x1 0x0	/* PB2 periph A */ +							 1 3 0x1 0x0	/* PB3 periph A */ +							 1 4 0x1 0x0	/* PB4 periph A */ +							 1 5 0x1 0x0	/* PB5 periph A */ +							 1 6 0x1 0x0	/* PB6 periph A */ +							 1 7 0x1 0x0	/* PB7 periph A */ +							 1 9 0x1 0x0	/* PB9 periph A */ +							 1 10 0x1 0x0>;	/* PB10 periph A */ +					}; + +					pinctrl_macb0_rmii_mii: macb0_rmii_mii-0 { +						atmel,pins = +							<1 8 0x1 0x0	/* PA8 periph A */ +							 1 11 0x1 0x0	/* PA11 periph A */ +							 1 12 0x1 0x0	/* PA12 periph A */ +							 1 13 0x1 0x0	/* PA13 periph A */ +							 1 14 0x1 0x0	/* PA14 periph A */ +							 1 15 0x1 0x0	/* PA15 periph A */ +							 1 16 0x1 0x0	/* PA16 periph A */ +							 1 17 0x1 0x0>;	/* PA17 periph A */ +					}; +				}; + +				mmc0 { +					pinctrl_mmc0_slot0_clk_cmd_dat0: mmc0_slot0_clk_cmd_dat0-0 { +						atmel,pins = +							<0 17 0x1 0x0	/* PA17 periph A */ +							 0 16 0x1 0x1	/* PA16 periph A with pullup */ +							 0 15 0x1 0x1>;	/* PA15 periph A with pullup */ +					}; + +					pinctrl_mmc0_slot0_dat1_3: mmc0_slot0_dat1_3-0 { +						atmel,pins = +							<0 18 0x1 0x1	/* PA18 periph A with pullup */ +							 0 19 0x1 0x1	/* PA19 periph A with pullup */ +							 0 20 0x1 0x1>;	/* PA20 periph A with pullup */ +					}; +				}; + +				mmc1 { +					pinctrl_mmc1_slot0_clk_cmd_dat0: mmc1_slot0_clk_cmd_dat0-0 { +						atmel,pins = +							<0 13 0x2 0x0	/* PA13 periph B */ +							 0 12 0x2 0x1	/* PA12 periph B with pullup */ +							 0 11 0x2 0x1>;	/* PA11 periph B with pullup */ +					}; + +					pinctrl_mmc1_slot0_dat1_3: mmc1_slot0_dat1_3-0 { +						atmel,pins = +							<0 2 0x2 0x1	/* PA2 periph B with pullup */ +							 0 3 0x2 0x1	/* PA3 periph B with pullup */ +							 0 4 0x2 0x1>;	/* PA4 periph B with pullup */ +					}; +				}; + +				pioA: gpio@fffff400 { +					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; +					reg = <0xfffff400 0x200>; +					interrupts = <2 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioB: gpio@fffff600 { +					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; +					reg = <0xfffff600 0x200>; +					interrupts = <2 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					#gpio-lines = <19>; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioC: gpio@fffff800 { +					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; +					reg = <0xfffff800 0x200>; +					interrupts = <3 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					interrupt-controller; +					#interrupt-cells = <2>; +				}; + +				pioD: gpio@fffffa00 { +					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; +					reg = <0xfffffa00 0x200>; +					interrupts = <3 4 1>; +					#gpio-cells = <2>; +					gpio-controller; +					#gpio-lines = <22>; +					interrupt-controller; +					#interrupt-cells = <2>; +				};  			}; -			pioC: gpio@fffff800 { -				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; -				reg = <0xfffff800 0x100>; -				interrupts = <3 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; +			mmc0: mmc@f0008000 { +				compatible = "atmel,hsmci"; +				reg = <0xf0008000 0x600>; +				interrupts = <12 4 0>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled";  			}; -			pioD: gpio@fffffa00 { -				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; -				reg = <0xfffffa00 0x100>; -				interrupts = <3 4 1>; -				#gpio-cells = <2>; -				gpio-controller; -				interrupt-controller; -				#interrupt-cells = <2>; +			mmc1: mmc@f000c000 { +				compatible = "atmel,hsmci"; +				reg = <0xf000c000 0x600>; +				interrupts = <26 4 0>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled";  			};  			dbgu: serial@fffff200 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffff200 0x200>;  				interrupts = <1 4 7>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_dbgu>;  				status = "disabled";  			}; @@ -164,6 +358,8 @@  				interrupts = <5 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart0>;  				status = "disabled";  			}; @@ -173,6 +369,8 @@  				interrupts = <6 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart1>;  				status = "disabled";  			}; @@ -182,6 +380,8 @@  				interrupts = <7 4 5>;  				atmel,use-dma-rx;  				atmel,use-dma-tx; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_usart2>;  				status = "disabled";  			}; @@ -189,6 +389,8 @@  				compatible = "cdns,at32ap7000-macb", "cdns,macb";  				reg = <0xf802c000 0x100>;  				interrupts = <24 4 3>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_macb0_rmii>;  				status = "disabled";  			}; @@ -273,6 +475,8 @@  			      >;  			atmel,nand-addr-offset = <21>;  			atmel,nand-cmd-offset = <22>; +			pinctrl-names = "default"; +			pinctrl-0 = <&pinctrl_nand>;  			gpios = <&pioD 5 0  				 &pioD 4 0  				 0 diff --git a/arch/arm/boot/dts/at91sam9x5ek.dtsi b/arch/arm/boot/dts/at91sam9x5ek.dtsi new file mode 100644 index 00000000000..8a7cf1d9cf5 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9x5ek.dtsi @@ -0,0 +1,101 @@ +/* + * at91sam9x5ek.dtsi - Device Tree file for AT91SAM9x5CM Base board + * + *  Copyright (C) 2012 Atmel, + *                2012 Nicolas Ferre <nicolas.ferre@atmel.com> + * + * Licensed under GPLv2 or later. + */ +/include/ "at91sam9x5cm.dtsi" + +/ { +	model = "Atmel AT91SAM9X5-EK"; +	compatible = "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; + +	chosen { +		bootargs = "128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; +	}; + +	ahb { +		apb { +			mmc0: mmc@f0008000 { +				pinctrl-0 = < +					&pinctrl_board_mmc0 +					&pinctrl_mmc0_slot0_clk_cmd_dat0 +					&pinctrl_mmc0_slot0_dat1_3>; +				status = "okay"; +				slot@0 { +					reg = <0>; +					bus-width = <4>; +					cd-gpios = <&pioD 15 0>; +				}; +			}; + +			mmc1: mmc@f000c000 { +				pinctrl-0 = < +					&pinctrl_board_mmc1 +					&pinctrl_mmc1_slot0_clk_cmd_dat0 +					&pinctrl_mmc1_slot0_dat1_3>; +				status = "okay"; +				slot@0 { +					reg = <0>; +					bus-width = <4>; +					cd-gpios = <&pioD 14 0>; +				}; +			}; + +			dbgu: serial@fffff200 { +				status = "okay"; +			}; + +			usart0: serial@f801c000 { +				status = "okay"; +			}; + +			macb0: ethernet@f802c000 { +				phy-mode = "rmii"; +				status = "okay"; +			}; + +			i2c0: i2c@f8010000 { +				status = "okay"; +			}; + +			i2c1: i2c@f8014000 { +				status = "okay"; +			}; + +			i2c2: i2c@f8018000 { +				status = "okay"; +			}; + +			pinctrl@fffff400 { +				mmc0 { +					pinctrl_board_mmc0: mmc0-board { +						atmel,pins = +							<3 15 0x0 0x5>;	/* PD15 gpio CD pin pull up and deglitch */ +					}; +				}; + +				mmc1 { +					pinctrl_board_mmc1: mmc1-board { +						atmel,pins = +							<3 14 0x0 0x5>;	/* PD14 gpio CD pin pull up and deglitch */ +					}; +				}; +			}; +		}; + +		usb0: ohci@00600000 { +			status = "okay"; +			num-ports = <2>; +			atmel,vbus-gpio = <&pioD 19 1 +					   &pioD 20 1 +					  >; +		}; + +		usb1: ehci@00700000 { +			status = "okay"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/bcm11351-brt.dts b/arch/arm/boot/dts/bcm11351-brt.dts new file mode 100644 index 00000000000..248067cf706 --- /dev/null +++ b/arch/arm/boot/dts/bcm11351-brt.dts @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2012 Broadcom Corporation + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +/include/ "bcm11351.dtsi" + +/ { +	model = "BCM11351 BRT board"; +	compatible = "bcm,bcm11351-brt", "bcm,bcm11351"; + +	memory { +		reg = <0x80000000 0x40000000>; /* 1 GB */ +	}; + +	uart@3e000000 { +		status = "okay"; +	}; + +}; diff --git a/arch/arm/boot/dts/bcm11351.dtsi b/arch/arm/boot/dts/bcm11351.dtsi new file mode 100644 index 00000000000..ad135885bd2 --- /dev/null +++ b/arch/arm/boot/dts/bcm11351.dtsi @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2012 Broadcom Corporation + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +/include/ "skeleton.dtsi" + +/ { +	model = "BCM11351 SoC"; +	compatible = "bcm,bcm11351"; +	interrupt-parent = <&gic>; + +	chosen { +		bootargs = "console=ttyS0,115200n8"; +	}; + +	gic: interrupt-controller@3ff00100 { +		compatible = "arm,cortex-a9-gic"; +		#interrupt-cells = <3>; +		#address-cells = <0>; +		interrupt-controller; +		reg = <0x3ff01000 0x1000>, +		      <0x3ff00100 0x100>; +	}; + +	uart@3e000000 { +		compatible = "bcm,bcm11351-dw-apb-uart", "snps,dw-apb-uart"; +		status = "disabled"; +		reg = <0x3e000000 0x1000>; +		clock-frequency = <13000000>; +		interrupts = <0x0 67 0x4>; +		reg-shift = <2>; +		reg-io-width = <4>; +	}; + +	L2: l2-cache { +		    compatible = "arm,pl310-cache"; +		    reg = <0x3ff20000 0x1000>; +		    cache-unified; +		    cache-level = <2>; +	}; +}; diff --git a/arch/arm/boot/dts/bcm2835-rpi-b.dts b/arch/arm/boot/dts/bcm2835-rpi-b.dts index 7dd860f83f9..9b72054a0bc 100644 --- a/arch/arm/boot/dts/bcm2835-rpi-b.dts +++ b/arch/arm/boot/dts/bcm2835-rpi-b.dts @@ -10,3 +10,18 @@  		reg = <0 0x10000000>;  	};  }; + +&gpio { +	pinctrl-names = "default"; +	pinctrl-0 = <&alt0 &alt3>; + +	alt0: alt0 { +		brcm,pins = <0 1 2 3 4 5 6 7 8 9 10 11 14 15 40 45>; +		brcm,function = <4>; /* alt0 */ +	}; + +	alt3: alt3 { +		brcm,pins = <48 49 50 51 52 53>; +		brcm,function = <7>; /* alt3 */ +	}; +}; diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi index 0b619398532..8917550fd1b 100644 --- a/arch/arm/boot/dts/bcm2835.dtsi +++ b/arch/arm/boot/dts/bcm2835.dtsi @@ -29,11 +29,39 @@  			#interrupt-cells = <2>;  		}; +		watchdog { +			compatible = "brcm,bcm2835-pm-wdt"; +			reg = <0x7e100000 0x28>; +		}; +  		uart@20201000 {  			compatible = "brcm,bcm2835-pl011", "arm,pl011", "arm,primecell";  			reg = <0x7e201000 0x1000>;  			interrupts = <2 25>;  			clock-frequency = <3000000>;  		}; + +		gpio: gpio { +			compatible = "brcm,bcm2835-gpio"; +			reg = <0x7e200000 0xb4>; +			/* +			 * The GPIO IP block is designed for 3 banks of GPIOs. +			 * Each bank has a GPIO interrupt for itself. +			 * There is an overall "any bank" interrupt. +			 * In order, these are GIC interrupts 17, 18, 19, 20. +			 * Since the BCM2835 only has 2 banks, the 2nd bank +			 * interrupt output appears to be mirrored onto the +			 * 3rd bank's interrupt signal. +			 * So, a bank0 interrupt shows up on 17, 20, and +			 * a bank1 interrupt shows up on 18, 19, 20! +			 */ +			interrupts = <2 17>, <2 18>, <2 19>, <2 20>; + +			gpio-controller; +			#gpio-cells = <2>; + +			interrupt-controller; +			#interrupt-cells = <2>; +		};  	};  }; diff --git a/arch/arm/boot/dts/dbx5x0.dtsi b/arch/arm/boot/dts/dbx5x0.dtsi index 9f553630242..0d69322f689 100644 --- a/arch/arm/boot/dts/dbx5x0.dtsi +++ b/arch/arm/boot/dts/dbx5x0.dtsi @@ -203,6 +203,14 @@  				reg = <0x80157450 0xC>;  			}; +			thermal@801573c0 { +				compatible = "stericsson,db8500-thermal"; +				reg = <0x801573c0 0x40>; +				interrupts = <21 0x4>, <22 0x4>; +				interrupt-names = "IRQ_HOTMON_LOW", "IRQ_HOTMON_HIGH"; +				status = "disabled"; +			 }; +  			db8500-prcmu-regulators {  				compatible = "stericsson,db8500-prcmu-regulator"; @@ -630,6 +638,11 @@  			status = "disabled";  		}; +		cpufreq-cooling { +			compatible = "stericsson,db8500-cpufreq-cooling"; +			status = "disabled"; +		 }; +  		vmmci: regulator-gpio {  			compatible = "regulator-gpio"; diff --git a/arch/arm/boot/dts/ecx-2000.dts b/arch/arm/boot/dts/ecx-2000.dts new file mode 100644 index 00000000000..46477ac1de9 --- /dev/null +++ b/arch/arm/boot/dts/ecx-2000.dts @@ -0,0 +1,104 @@ +/* + * Copyright 2011-2012 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +/dts-v1/; + +/* First 4KB has pen for secondary cores. */ +/memreserve/ 0x00000000 0x0001000; + +/ { +	model = "Calxeda ECX-2000"; +	compatible = "calxeda,ecx-2000"; +	#address-cells = <2>; +	#size-cells = <2>; +	clock-ranges; + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		cpu@0 { +			compatible = "arm,cortex-a15"; +			reg = <0>; +			clocks = <&a9pll>; +			clock-names = "cpu"; +		}; + +		cpu@1 { +			compatible = "arm,cortex-a15"; +			reg = <1>; +			clocks = <&a9pll>; +			clock-names = "cpu"; +		}; + +		cpu@2 { +			compatible = "arm,cortex-a15"; +			reg = <2>; +			clocks = <&a9pll>; +			clock-names = "cpu"; +		}; + +		cpu@3 { +			compatible = "arm,cortex-a15"; +			reg = <3>; +			clocks = <&a9pll>; +			clock-names = "cpu"; +		}; +	}; + +	memory@0 { +		name = "memory"; +		device_type = "memory"; +		reg = <0x00000000 0x00000000 0x00000000 0xff800000>; +	}; + +	memory@200000000 { +		name = "memory"; +		device_type = "memory"; +		reg = <0x00000002 0x00000000 0x00000003 0x00000000>; +	}; + +	soc { +		ranges = <0x00000000 0x00000000 0x00000000 0xffffffff>; + +		timer { +			compatible = "arm,cortex-a15-timer", "arm,armv7-timer"; 			interrupts = <1 13 0xf08>, +				<1 14 0xf08>, +				<1 11 0xf08>, +				<1 10 0xf08>; +		}; + +		intc: interrupt-controller@fff11000 { +			compatible = "arm,cortex-a15-gic"; +			#interrupt-cells = <3>; +			#size-cells = <0>; +			#address-cells = <1>; +			interrupt-controller; +			interrupts = <1 9 0xf04>; +			reg = <0xfff11000 0x1000>, +			      <0xfff12000 0x1000>, +			      <0xfff14000 0x2000>, +			      <0xfff16000 0x2000>; +		}; + +		pmu { +			compatible = "arm,cortex-a9-pmu"; +			interrupts = <0 76 4  0 75 4  0 74 4  0 73 4>; +		}; +	}; +}; + +/include/ "ecx-common.dtsi" diff --git a/arch/arm/boot/dts/ecx-common.dtsi b/arch/arm/boot/dts/ecx-common.dtsi new file mode 100644 index 00000000000..d61b535f682 --- /dev/null +++ b/arch/arm/boot/dts/ecx-common.dtsi @@ -0,0 +1,237 @@ +/* + * Copyright 2011-2012 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +/ { +	chosen { +		bootargs = "console=ttyAMA0"; +	}; + +	soc { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "simple-bus"; +		interrupt-parent = <&intc>; + +		sata@ffe08000 { +			compatible = "calxeda,hb-ahci"; +			reg = <0xffe08000 0x10000>; +			interrupts = <0 83 4>; +			dma-coherent; +			calxeda,port-phys = <&combophy5 0 &combophy0 0 +					     &combophy0 1 &combophy0 2 +					     &combophy0 3>; +		}; + +		sdhci@ffe0e000 { +			compatible = "calxeda,hb-sdhci"; +			reg = <0xffe0e000 0x1000>; +			interrupts = <0 90 4>; +			clocks = <&eclk>; +			status = "disabled"; +		}; + +		memory-controller@fff00000 { +			compatible = "calxeda,hb-ddr-ctrl"; +			reg = <0xfff00000 0x1000>; +			interrupts = <0 91 4>; +		}; + +		ipc@fff20000 { +			compatible = "arm,pl320", "arm,primecell"; +			reg = <0xfff20000 0x1000>; +			interrupts = <0 7 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk"; +		}; + +		gpioe: gpio@fff30000 { +			#gpio-cells = <2>; +			compatible = "arm,pl061", "arm,primecell"; +			gpio-controller; +			reg = <0xfff30000 0x1000>; +			interrupts = <0 14 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk"; +			status = "disabled"; +		}; + +		gpiof: gpio@fff31000 { +			#gpio-cells = <2>; +			compatible = "arm,pl061", "arm,primecell"; +			gpio-controller; +			reg = <0xfff31000 0x1000>; +			interrupts = <0 15 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk"; +			status = "disabled"; +		}; + +		gpiog: gpio@fff32000 { +			#gpio-cells = <2>; +			compatible = "arm,pl061", "arm,primecell"; +			gpio-controller; +			reg = <0xfff32000 0x1000>; +			interrupts = <0 16 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk"; +			status = "disabled"; +		}; + +		gpioh: gpio@fff33000 { +			#gpio-cells = <2>; +			compatible = "arm,pl061", "arm,primecell"; +			gpio-controller; +			reg = <0xfff33000 0x1000>; +			interrupts = <0 17 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk"; +			status = "disabled"; +		}; + +		timer@fff34000 { +			compatible = "arm,sp804", "arm,primecell"; +			reg = <0xfff34000 0x1000>; +			interrupts = <0 18 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk"; +		}; + +		rtc@fff35000 { +			compatible = "arm,pl031", "arm,primecell"; +			reg = <0xfff35000 0x1000>; +			interrupts = <0 19 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk"; +		}; + +		serial@fff36000 { +			compatible = "arm,pl011", "arm,primecell"; +			reg = <0xfff36000 0x1000>; +			interrupts = <0 20 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk"; +		}; + +		smic@fff3a000 { +			compatible = "ipmi-smic"; +			device_type = "ipmi"; +			reg = <0xfff3a000 0x1000>; +			interrupts = <0 24 4>; +			reg-size = <4>; +			reg-spacing = <4>; +		}; + +		sregs@fff3c000 { +			compatible = "calxeda,hb-sregs"; +			reg = <0xfff3c000 0x1000>; + +			clocks { +				#address-cells = <1>; +				#size-cells = <0>; + +				osc: oscillator { +					#clock-cells = <0>; +					compatible = "fixed-clock"; +					clock-frequency = <33333000>; +				}; + +				ddrpll: ddrpll { +					#clock-cells = <0>; +					compatible = "calxeda,hb-pll-clock"; +					clocks = <&osc>; +					reg = <0x108>; +				}; + +				a9pll: a9pll { +					#clock-cells = <0>; +					compatible = "calxeda,hb-pll-clock"; +					clocks = <&osc>; +					reg = <0x100>; +				}; + +				a9periphclk: a9periphclk { +					#clock-cells = <0>; +					compatible = "calxeda,hb-a9periph-clock"; +					clocks = <&a9pll>; +					reg = <0x104>; +				}; + +				a9bclk: a9bclk { +					#clock-cells = <0>; +					compatible = "calxeda,hb-a9bus-clock"; +					clocks = <&a9pll>; +					reg = <0x104>; +				}; + +				emmcpll: emmcpll { +					#clock-cells = <0>; +					compatible = "calxeda,hb-pll-clock"; +					clocks = <&osc>; +					reg = <0x10C>; +				}; + +				eclk: eclk { +					#clock-cells = <0>; +					compatible = "calxeda,hb-emmc-clock"; +					clocks = <&emmcpll>; +					reg = <0x114>; +				}; + +				pclk: pclk { +					#clock-cells = <0>; +					compatible = "fixed-clock"; +					clock-frequency = <150000000>; +				}; +			}; +		}; + +		dma@fff3d000 { +			compatible = "arm,pl330", "arm,primecell"; +			reg = <0xfff3d000 0x1000>; +			interrupts = <0 92 4>; +			clocks = <&pclk>; +			clock-names = "apb_pclk"; +		}; + +		ethernet@fff50000 { +			compatible = "calxeda,hb-xgmac"; +			reg = <0xfff50000 0x1000>; +			interrupts = <0 77 4  0 78 4  0 79 4>; +			dma-coherent; +		}; + +		ethernet@fff51000 { +			compatible = "calxeda,hb-xgmac"; +			reg = <0xfff51000 0x1000>; +			interrupts = <0 80 4  0 81 4  0 82 4>; +			dma-coherent; +		}; + +		combophy0: combo-phy@fff58000 { +			compatible = "calxeda,hb-combophy"; +			#phy-cells = <1>; +			reg = <0xfff58000 0x1000>; +			phydev = <5>; +		}; + +		combophy5: combo-phy@fff5d000 { +			compatible = "calxeda,hb-combophy"; +			#phy-cells = <1>; +			reg = <0xfff5d000 0x1000>; +			phydev = <31>; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi index 3428f1a94dc..e1347fceb5b 100644 --- a/arch/arm/boot/dts/exynos4.dtsi +++ b/arch/arm/boot/dts/exynos4.dtsi @@ -282,5 +282,11 @@  			reg = <0x12690000 0x1000>;  			interrupts = <0 36 0>;  		}; + +		mdma1: mdma@12850000 { +			compatible = "arm,pl330", "arm,primecell"; +			reg = <0x12850000 0x1000>; +			interrupts = <0 34 0>; +		};  	};  }; diff --git a/arch/arm/boot/dts/exynos5440-ssdk5440.dts b/arch/arm/boot/dts/exynos5440-ssdk5440.dts new file mode 100644 index 00000000000..921c83cf694 --- /dev/null +++ b/arch/arm/boot/dts/exynos5440-ssdk5440.dts @@ -0,0 +1,46 @@ +/* + * SAMSUNG SSDK5440 board device tree source + * + * Copyright (c) 2012 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. +*/ + +/dts-v1/; +/include/ "exynos5440.dtsi" + +/ { +	model = "SAMSUNG SSDK5440 board based on EXYNOS5440"; +	compatible = "samsung,ssdk5440", "samsung,exynos5440"; + +	memory { +		reg = <0x80000000 0x80000000>; +	}; + +	chosen { +		bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x81000000,8M console=ttySAC2,115200 init=/linuxrc"; +	}; + +	spi { +		status = "disabled"; +	}; + +	i2c@F0000 { +		status = "disabled"; +	}; + +	i2c@100000 { +		status = "disabled"; +	}; + +	watchdog { +		status = "disabled"; +	}; + +	rtc { +		status = "disabled"; +	}; +}; diff --git a/arch/arm/boot/dts/exynos5440.dtsi b/arch/arm/boot/dts/exynos5440.dtsi new file mode 100644 index 00000000000..024269de8ee --- /dev/null +++ b/arch/arm/boot/dts/exynos5440.dtsi @@ -0,0 +1,159 @@ +/* + * SAMSUNG EXYNOS5440 SoC device tree source + * + * Copyright (c) 2012 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/ "skeleton.dtsi" + +/ { +	compatible = "samsung,exynos5440"; + +	interrupt-parent = <&gic>; + +	gic:interrupt-controller@2E0000 { +		compatible = "arm,cortex-a15-gic"; +		#interrupt-cells = <3>; +		interrupt-controller; +		reg = <0x2E1000 0x1000>, <0x2E2000 0x1000>; +	}; + +	cpus { +		cpu@0 { +			compatible = "arm,cortex-a15"; +			timer { +				compatible = "arm,armv7-timer"; +				interrupts = <1 13 0xf08>; +				clock-frequency = <1000000>; +			}; +		}; +		cpu@1 { +			compatible = "arm,cortex-a15"; +			timer { +				compatible = "arm,armv7-timer"; +				interrupts = <1 14 0xf08>; +				clock-frequency = <1000000>; +			}; +		}; +		cpu@2 { +			compatible = "arm,cortex-a15"; +			timer { +				compatible = "arm,armv7-timer"; +				interrupts = <1 14 0xf08>; +				clock-frequency = <1000000>; +			}; +		}; +		cpu@3 { +			compatible = "arm,cortex-a15"; +			timer { +				compatible = "arm,armv7-timer"; +				interrupts = <1 14 0xf08>; +				clock-frequency = <1000000>; +			}; +		}; +	}; + +	common { +		compatible = "samsung,exynos5440"; + +	}; + +	serial@B0000 { +		compatible = "samsung,exynos4210-uart"; +		reg = <0xB0000 0x1000>; +		interrupts = <0 2 0>; +	}; + +	serial@C0000 { +		compatible = "samsung,exynos4210-uart"; +		reg = <0xC0000 0x1000>; +		interrupts = <0 3 0>; +	}; + +	spi { +		compatible = "samsung,exynos4210-spi"; +		reg = <0xD0000 0x1000>; +		interrupts = <0 4 0>; +		tx-dma-channel = <&pdma0 5>; /* preliminary */ +		rx-dma-channel = <&pdma0 4>; /* preliminary */ +		#address-cells = <1>; +		#size-cells = <0>; +	}; + +	pinctrl { +		compatible = "samsung,pinctrl-exynos5440"; +		reg = <0xE0000 0x1000>; +		interrupt-controller; +		#interrupt-cells = <2>; +		#gpio-cells = <2>; + +		fan: fan { +			samsung,exynos5440-pin-function = <1>; +		}; + +		hdd_led0: hdd_led0 { +			samsung,exynos5440-pin-function = <2>; +		}; + +		hdd_led1: hdd_led1 { +			samsung,exynos5440-pin-function = <3>; +		}; + +		uart1: uart1 { +			samsung,exynos5440-pin-function = <4>; +		}; +	}; + +	i2c@F0000 { +		compatible = "samsung,s3c2440-i2c"; +		reg = <0xF0000 0x1000>; +		interrupts = <0 5 0>; +		#address-cells = <1>; +		#size-cells = <0>; +	}; + +	i2c@100000 { +		compatible = "samsung,s3c2440-i2c"; +		reg = <0x100000 0x1000>; +		interrupts = <0 6 0>; +		#address-cells = <1>; +		#size-cells = <0>; +	}; + +	watchdog { +		compatible = "samsung,s3c2410-wdt"; +		reg = <0x110000 0x1000>; +		interrupts = <0 1 0>; +	}; + +	amba { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "arm,amba-bus"; +		interrupt-parent = <&gic>; +		ranges; + +		pdma0: pdma@121A0000 { +			compatible = "arm,pl330", "arm,primecell"; +			reg = <0x120000 0x1000>; +			interrupts = <0 34 0>; +		}; + +		pdma1: pdma@121B0000 { +			compatible = "arm,pl330", "arm,primecell"; +			reg = <0x121000 0x1000>; +			interrupts = <0 35 0>; +		}; +	}; + +	rtc { +		compatible = "samsung,s3c6410-rtc"; +		reg = <0x130000 0x1000>; +		interrupts = <0 16 0>, <0 17 0>; +	}; +}; diff --git a/arch/arm/boot/dts/highbank.dts b/arch/arm/boot/dts/highbank.dts index 0c6fc34821f..a9ae5d32e80 100644 --- a/arch/arm/boot/dts/highbank.dts +++ b/arch/arm/boot/dts/highbank.dts @@ -69,16 +69,8 @@  		reg = <0x00000000 0xff900000>;  	}; -	chosen { -		bootargs = "console=ttyAMA0"; -	}; -  	soc { -		#address-cells = <1>; -		#size-cells = <1>; -		compatible = "simple-bus"; -		interrupt-parent = <&intc>; -		ranges; +		ranges = <0x00000000 0x00000000 0xffffffff>;  		timer@fff10600 {  			compatible = "arm,cortex-a9-twd-timer"; @@ -117,173 +109,6 @@  			interrupts = <0 76 4  0 75 4  0 74 4  0 73 4>;  		}; -		sata@ffe08000 { -			compatible = "calxeda,hb-ahci"; -			reg = <0xffe08000 0x10000>; -			interrupts = <0 83 4>; -			calxeda,port-phys = <&combophy5 0 &combophy0 0 -					     &combophy0 1 &combophy0 2 -					     &combophy0 3>; -			dma-coherent; -		}; - -		sdhci@ffe0e000 { -			compatible = "calxeda,hb-sdhci"; -			reg = <0xffe0e000 0x1000>; -			interrupts = <0 90 4>; -			clocks = <&eclk>; -		}; - -		memory-controller@fff00000 { -			compatible = "calxeda,hb-ddr-ctrl"; -			reg = <0xfff00000 0x1000>; -			interrupts = <0 91 4>; -		}; - -		ipc@fff20000 { -			compatible = "arm,pl320", "arm,primecell"; -			reg = <0xfff20000 0x1000>; -			interrupts = <0 7 4>; -			clocks = <&pclk>; -			clock-names = "apb_pclk"; -		}; - -		gpioe: gpio@fff30000 { -			#gpio-cells = <2>; -			compatible = "arm,pl061", "arm,primecell"; -			gpio-controller; -			reg = <0xfff30000 0x1000>; -			interrupts = <0 14 4>; -			clocks = <&pclk>; -			clock-names = "apb_pclk"; -		}; - -		gpiof: gpio@fff31000 { -			#gpio-cells = <2>; -			compatible = "arm,pl061", "arm,primecell"; -			gpio-controller; -			reg = <0xfff31000 0x1000>; -			interrupts = <0 15 4>; -			clocks = <&pclk>; -			clock-names = "apb_pclk"; -		}; - -		gpiog: gpio@fff32000 { -			#gpio-cells = <2>; -			compatible = "arm,pl061", "arm,primecell"; -			gpio-controller; -			reg = <0xfff32000 0x1000>; -			interrupts = <0 16 4>; -			clocks = <&pclk>; -			clock-names = "apb_pclk"; -		}; - -		gpioh: gpio@fff33000 { -			#gpio-cells = <2>; -			compatible = "arm,pl061", "arm,primecell"; -			gpio-controller; -			reg = <0xfff33000 0x1000>; -			interrupts = <0 17 4>; -			clocks = <&pclk>; -			clock-names = "apb_pclk"; -		}; - -		timer { -			compatible = "arm,sp804", "arm,primecell"; -			reg = <0xfff34000 0x1000>; -			interrupts = <0 18 4>; -			clocks = <&pclk>; -			clock-names = "apb_pclk"; -		}; - -		rtc@fff35000 { -			compatible = "arm,pl031", "arm,primecell"; -			reg = <0xfff35000 0x1000>; -			interrupts = <0 19 4>; -			clocks = <&pclk>; -			clock-names = "apb_pclk"; -		}; - -		serial@fff36000 { -			compatible = "arm,pl011", "arm,primecell"; -			reg = <0xfff36000 0x1000>; -			interrupts = <0 20 4>; -			clocks = <&pclk>; -			clock-names = "apb_pclk"; -		}; - -		smic@fff3a000 { -			compatible = "ipmi-smic"; -			device_type = "ipmi"; -			reg = <0xfff3a000 0x1000>; -			interrupts = <0 24 4>; -			reg-size = <4>; -			reg-spacing = <4>; -		}; - -		sregs@fff3c000 { -			compatible = "calxeda,hb-sregs"; -			reg = <0xfff3c000 0x1000>; - -			clocks { -				#address-cells = <1>; -				#size-cells = <0>; - -				osc: oscillator { -					#clock-cells = <0>; -					compatible = "fixed-clock"; -					clock-frequency = <33333000>; -				}; - -				ddrpll: ddrpll { -					#clock-cells = <0>; -					compatible = "calxeda,hb-pll-clock"; -					clocks = <&osc>; -					reg = <0x108>; -				}; - -				a9pll: a9pll { -					#clock-cells = <0>; -					compatible = "calxeda,hb-pll-clock"; -					clocks = <&osc>; -					reg = <0x100>; -				}; - -				a9periphclk: a9periphclk { -					#clock-cells = <0>; -					compatible = "calxeda,hb-a9periph-clock"; -					clocks = <&a9pll>; -					reg = <0x104>; -				}; - -				a9bclk: a9bclk { -					#clock-cells = <0>; -					compatible = "calxeda,hb-a9bus-clock"; -					clocks = <&a9pll>; -					reg = <0x104>; -				}; - -				emmcpll: emmcpll { -					#clock-cells = <0>; -					compatible = "calxeda,hb-pll-clock"; -					clocks = <&osc>; -					reg = <0x10C>; -				}; - -				eclk: eclk { -					#clock-cells = <0>; -					compatible = "calxeda,hb-emmc-clock"; -					clocks = <&emmcpll>; -					reg = <0x114>; -				}; - -				pclk: pclk { -					#clock-cells = <0>; -					compatible = "fixed-clock"; -					clock-frequency = <150000000>; -				}; -			}; -		};  		sregs@fff3c200 {  			compatible = "calxeda,hb-sregs-l2-ecc"; @@ -291,38 +116,7 @@  			interrupts = <0 71 4  0 72 4>;  		}; -		dma@fff3d000 { -			compatible = "arm,pl330", "arm,primecell"; -			reg = <0xfff3d000 0x1000>; -			interrupts = <0 92 4>; -			clocks = <&pclk>; -			clock-names = "apb_pclk"; -		}; - -		ethernet@fff50000 { -			compatible = "calxeda,hb-xgmac"; -			reg = <0xfff50000 0x1000>; -			interrupts = <0 77 4  0 78 4  0 79 4>; -		}; - -		ethernet@fff51000 { -			compatible = "calxeda,hb-xgmac"; -			reg = <0xfff51000 0x1000>; -			interrupts = <0 80 4  0 81 4  0 82 4>; -		}; - -		combophy0: combo-phy@fff58000 { -			compatible = "calxeda,hb-combophy"; -			#phy-cells = <1>; -			reg = <0xfff58000 0x1000>; -			phydev = <5>; -		}; - -		combophy5: combo-phy@fff5d000 { -			compatible = "calxeda,hb-combophy"; -			#phy-cells = <1>; -			reg = <0xfff5d000 0x1000>; -			phydev = <31>; -		};  	};  }; + +/include/ "ecx-common.dtsi" diff --git a/arch/arm/boot/dts/imx27-3ds.dts b/arch/arm/boot/dts/imx27-3ds.dts index 0a8978a40ec..b01c0d745fc 100644 --- a/arch/arm/boot/dts/imx27-3ds.dts +++ b/arch/arm/boot/dts/imx27-3ds.dts @@ -23,10 +23,6 @@  	soc {  		aipi@10000000 { /* aipi */ -			wdog@10002000 { -				status = "okay"; -			}; -  			uart1: serial@1000a000 {  				fsl,uart-has-rtscts;  				status = "okay"; diff --git a/arch/arm/boot/dts/imx28.dtsi b/arch/arm/boot/dts/imx28.dtsi index d7013f73f2e..13b7053d799 100644 --- a/arch/arm/boot/dts/imx28.dtsi +++ b/arch/arm/boot/dts/imx28.dtsi @@ -834,6 +834,7 @@  				compatible = "fsl,imx28-auart", "fsl,imx23-auart";  				reg = <0x8006a000 0x2000>;  				interrupts = <112 70 71>; +				fsl,auart-dma-channel = <8 9>;  				clocks = <&clks 45>;  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts index cbd2b1c7487..567e7ee72f9 100644 --- a/arch/arm/boot/dts/imx51-babbage.dts +++ b/arch/arm/boot/dts/imx51-babbage.dts @@ -22,6 +22,22 @@  	};  	soc { +		display@di0 { +			compatible = "fsl,imx-parallel-display"; +			crtcs = <&ipu 0>; +			interface-pix-fmt = "rgb24"; +			pinctrl-names = "default"; +			pinctrl-0 = <&pinctrl_ipu_disp1_1>; +		}; + +		display@di1 { +			compatible = "fsl,imx-parallel-display"; +			crtcs = <&ipu 1>; +			interface-pix-fmt = "rgb565"; +			pinctrl-names = "default"; +			pinctrl-0 = <&pinctrl_ipu_disp2_1>; +		}; +  		aips@70000000 { /* aips-1 */  			spba@70000000 {  				esdhc@70004000 { /* ESDHC1 */ diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi index 1fdee31b490..1f5d45eff45 100644 --- a/arch/arm/boot/dts/imx51.dtsi +++ b/arch/arm/boot/dts/imx51.dtsi @@ -62,6 +62,13 @@  		interrupt-parent = <&tzic>;  		ranges; +		ipu: ipu@40000000 { +			#crtc-cells = <1>; +			compatible = "fsl,imx51-ipu"; +			reg = <0x40000000 0x20000000>; +			interrupts = <11 10>; +		}; +  		aips@70000000 { /* AIPS1 */  			compatible = "fsl,aips-bus", "simple-bus";  			#address-cells = <1>; @@ -80,6 +87,8 @@  					compatible = "fsl,imx51-esdhc";  					reg = <0x70004000 0x4000>;  					interrupts = <1>; +					clocks = <&clks 44>, <&clks 0>, <&clks 71>; +					clock-names = "ipg", "ahb", "per";  					status = "disabled";  				}; @@ -87,6 +96,8 @@  					compatible = "fsl,imx51-esdhc";  					reg = <0x70008000 0x4000>;  					interrupts = <2>; +					clocks = <&clks 45>, <&clks 0>, <&clks 72>; +					clock-names = "ipg", "ahb", "per";  					bus-width = <4>;  					status = "disabled";  				}; @@ -95,6 +106,8 @@  					compatible = "fsl,imx51-uart", "fsl,imx21-uart";  					reg = <0x7000c000 0x4000>;  					interrupts = <33>; +					clocks = <&clks 32>, <&clks 33>; +					clock-names = "ipg", "per";  					status = "disabled";  				}; @@ -104,6 +117,8 @@  					compatible = "fsl,imx51-ecspi";  					reg = <0x70010000 0x4000>;  					interrupts = <36>; +					clocks = <&clks 51>, <&clks 52>; +					clock-names = "ipg", "per";  					status = "disabled";  				}; @@ -111,6 +126,7 @@  					compatible = "fsl,imx51-ssi", "fsl,imx21-ssi";  					reg = <0x70014000 0x4000>;  					interrupts = <30>; +					clocks = <&clks 49>;  					fsl,fifo-depth = <15>;  					fsl,ssi-dma-events = <25 24 23 22>; /* TX0 RX0 TX1 RX1 */  					status = "disabled"; @@ -120,6 +136,8 @@  					compatible = "fsl,imx51-esdhc";  					reg = <0x70020000 0x4000>;  					interrupts = <3>; +					clocks = <&clks 46>, <&clks 0>, <&clks 73>; +					clock-names = "ipg", "ahb", "per";  					bus-width = <4>;  					status = "disabled";  				}; @@ -128,6 +146,8 @@  					compatible = "fsl,imx51-esdhc";  					reg = <0x70024000 0x4000>;  					interrupts = <4>; +					clocks = <&clks 47>, <&clks 0>, <&clks 74>; +					clock-names = "ipg", "ahb", "per";  					bus-width = <4>;  					status = "disabled";  				}; @@ -205,12 +225,14 @@  				compatible = "fsl,imx51-wdt", "fsl,imx21-wdt";  				reg = <0x73f98000 0x4000>;  				interrupts = <58>; +				clocks = <&clks 0>;  			};  			wdog2: wdog@73f9c000 {  				compatible = "fsl,imx51-wdt", "fsl,imx21-wdt";  				reg = <0x73f9c000 0x4000>;  				interrupts = <59>; +				clocks = <&clks 0>;  				status = "disabled";  			}; @@ -298,6 +320,66 @@  					};  				}; +				ipu_disp1 { +					pinctrl_ipu_disp1_1: ipudisp1grp-1 { +						fsl,pins = < +							528 0x5 /* MX51_PAD_DISP1_DAT0__DISP1_DAT0 */ +							529 0x5 /* MX51_PAD_DISP1_DAT1__DISP1_DAT1 */ +							530 0x5 /* MX51_PAD_DISP1_DAT2__DISP1_DAT2 */ +							531 0x5 /* MX51_PAD_DISP1_DAT3__DISP1_DAT3 */ +							532 0x5 /* MX51_PAD_DISP1_DAT4__DISP1_DAT4 */ +							533 0x5 /* MX51_PAD_DISP1_DAT5__DISP1_DAT5 */ +							535 0x5 /* MX51_PAD_DISP1_DAT6__DISP1_DAT6 */ +							537 0x5 /* MX51_PAD_DISP1_DAT7__DISP1_DAT7 */ +							539 0x5 /* MX51_PAD_DISP1_DAT8__DISP1_DAT8 */ +							541 0x5 /* MX51_PAD_DISP1_DAT9__DISP1_DAT9 */ +							543 0x5 /* MX51_PAD_DISP1_DAT10__DISP1_DAT10 */ +							545 0x5 /* MX51_PAD_DISP1_DAT11__DISP1_DAT11 */ +							547 0x5 /* MX51_PAD_DISP1_DAT12__DISP1_DAT12 */ +							549 0x5 /* MX51_PAD_DISP1_DAT13__DISP1_DAT13 */ +							551 0x5 /* MX51_PAD_DISP1_DAT14__DISP1_DAT14 */ +							553 0x5 /* MX51_PAD_DISP1_DAT15__DISP1_DAT15 */ +							555 0x5 /* MX51_PAD_DISP1_DAT16__DISP1_DAT16 */ +							557 0x5 /* MX51_PAD_DISP1_DAT17__DISP1_DAT17 */ +							559 0x5 /* MX51_PAD_DISP1_DAT18__DISP1_DAT18 */ +							563 0x5 /* MX51_PAD_DISP1_DAT19__DISP1_DAT19 */ +							567 0x5 /* MX51_PAD_DISP1_DAT20__DISP1_DAT20 */ +							571 0x5 /* MX51_PAD_DISP1_DAT21__DISP1_DAT21 */ +							575 0x5 /* MX51_PAD_DISP1_DAT22__DISP1_DAT22 */ +							579 0x5 /* MX51_PAD_DISP1_DAT23__DISP1_DAT23 */ +							584 0x5 /* MX51_PAD_DI1_PIN2__DI1_PIN2 (hsync) */ +							583 0x5 /* MX51_PAD_DI1_PIN3__DI1_PIN3 (vsync) */ +						>; +					}; +				}; + +				ipu_disp2 { +					pinctrl_ipu_disp2_1: ipudisp2grp-1 { +						fsl,pins = < +							603 0x5 /* MX51_PAD_DISP2_DAT0__DISP2_DAT0 */ +							608 0x5 /* MX51_PAD_DISP2_DAT1__DISP2_DAT1 */ +							613 0x5 /* MX51_PAD_DISP2_DAT2__DISP2_DAT2 */ +							614 0x5 /* MX51_PAD_DISP2_DAT3__DISP2_DAT3 */ +							615 0x5 /* MX51_PAD_DISP2_DAT4__DISP2_DAT4 */ +							616 0x5 /* MX51_PAD_DISP2_DAT5__DISP2_DAT5 */ +							617 0x5 /* MX51_PAD_DISP2_DAT6__DISP2_DAT6 */ +							622 0x5 /* MX51_PAD_DISP2_DAT7__DISP2_DAT7 */ +							627 0x5 /* MX51_PAD_DISP2_DAT8__DISP2_DAT8 */ +							633 0x5 /* MX51_PAD_DISP2_DAT9__DISP2_DAT9 */ +							637 0x5 /* MX51_PAD_DISP2_DAT10__DISP2_DAT10 */ +							643 0x5 /* MX51_PAD_DISP2_DAT11__DISP2_DAT11 */ +							648 0x5 /* MX51_PAD_DISP2_DAT12__DISP2_DAT12 */ +							652 0x5 /* MX51_PAD_DISP2_DAT13__DISP2_DAT13 */ +							656 0x5 /* MX51_PAD_DISP2_DAT14__DISP2_DAT14 */ +							661 0x5 /* MX51_PAD_DISP2_DAT15__DISP2_DAT15 */ +							593 0x5 /* MX51_PAD_DI2_PIN2__DI2_PIN2 (hsync) */ +							595 0x5 /* MX51_PAD_DI2_PIN3__DI2_PIN3 (vsync) */ +							597 0x5 /* MX51_PAD_DI2_DISP_CLK__DI2_DISP_CLK */ +							599 0x5 /* MX51_PAD_DI_GP4__DI2_PIN15 */ +						>; +					}; +				}; +  				uart1 {  					pinctrl_uart1_1: uart1grp-1 {  						fsl,pins = < @@ -330,10 +412,30 @@  				};  			}; +			pwm1: pwm@73fb4000 { +				#pwm-cells = <2>; +				compatible = "fsl,imx51-pwm", "fsl,imx27-pwm"; +				reg = <0x73fb4000 0x4000>; +				clocks = <&clks 37>, <&clks 38>; +				clock-names = "ipg", "per"; +				interrupts = <61>; +			}; + +			pwm2: pwm@73fb8000 { +				#pwm-cells = <2>; +				compatible = "fsl,imx51-pwm", "fsl,imx27-pwm"; +				reg = <0x73fb8000 0x4000>; +				clocks = <&clks 39>, <&clks 40>; +				clock-names = "ipg", "per"; +				interrupts = <94>; +			}; +  			uart1: serial@73fbc000 {  				compatible = "fsl,imx51-uart", "fsl,imx21-uart";  				reg = <0x73fbc000 0x4000>;  				interrupts = <31>; +				clocks = <&clks 28>, <&clks 29>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -341,8 +443,17 @@  				compatible = "fsl,imx51-uart", "fsl,imx21-uart";  				reg = <0x73fc0000 0x4000>;  				interrupts = <32>; +				clocks = <&clks 30>, <&clks 31>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; + +			clks: ccm@73fd4000{ +				compatible = "fsl,imx51-ccm"; +				reg = <0x73fd4000 0x4000>; +				interrupts = <0 71 0x04 0 72 0x04>; +				#clock-cells = <1>; +			};  		};  		aips@80000000 {	/* AIPS2 */ @@ -358,6 +469,8 @@  				compatible = "fsl,imx51-ecspi";  				reg = <0x83fac000 0x4000>;  				interrupts = <37>; +				clocks = <&clks 53>, <&clks 54>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -365,6 +478,8 @@  				compatible = "fsl,imx51-sdma", "fsl,imx35-sdma";  				reg = <0x83fb0000 0x4000>;  				interrupts = <6>; +				clocks = <&clks 56>, <&clks 56>; +				clock-names = "ipg", "ahb";  				fsl,sdma-ram-script-name = "imx/sdma/sdma-imx51.bin";  			}; @@ -374,6 +489,8 @@  				compatible = "fsl,imx51-cspi", "fsl,imx35-cspi";  				reg = <0x83fc0000 0x4000>;  				interrupts = <38>; +				clocks = <&clks 55>, <&clks 0>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -383,6 +500,7 @@  				compatible = "fsl,imx51-i2c", "fsl,imx21-i2c";  				reg = <0x83fc4000 0x4000>;  				interrupts = <63>; +				clocks = <&clks 35>;  				status = "disabled";  			}; @@ -392,6 +510,7 @@  				compatible = "fsl,imx51-i2c", "fsl,imx21-i2c";  				reg = <0x83fc8000 0x4000>;  				interrupts = <62>; +				clocks = <&clks 34>;  				status = "disabled";  			}; @@ -399,6 +518,7 @@  				compatible = "fsl,imx51-ssi", "fsl,imx21-ssi";  				reg = <0x83fcc000 0x4000>;  				interrupts = <29>; +				clocks = <&clks 48>;  				fsl,fifo-depth = <15>;  				fsl,ssi-dma-events = <29 28 27 26>; /* TX0 RX0 TX1 RX1 */  				status = "disabled"; @@ -414,6 +534,7 @@  				compatible = "fsl,imx51-nand";  				reg = <0x83fdb000 0x1000 0xcfff0000 0x10000>;  				interrupts = <8>; +				clocks = <&clks 60>;  				status = "disabled";  			}; @@ -421,6 +542,7 @@  				compatible = "fsl,imx51-ssi", "fsl,imx21-ssi";  				reg = <0x83fe8000 0x4000>;  				interrupts = <96>; +				clocks = <&clks 50>;  				fsl,fifo-depth = <15>;  				fsl,ssi-dma-events = <47 46 37 35>; /* TX0 RX0 TX1 RX1 */  				status = "disabled"; @@ -430,6 +552,8 @@  				compatible = "fsl,imx51-fec", "fsl,imx27-fec";  				reg = <0x83fec000 0x4000>;  				interrupts = <87>; +				clocks = <&clks 42>, <&clks 42>, <&clks 42>; +				clock-names = "ipg", "ahb", "ptp";  				status = "disabled";  			};  		}; diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi index f45d4b1e21b..552aed4ff98 100644 --- a/arch/arm/boot/dts/imx53.dtsi +++ b/arch/arm/boot/dts/imx53.dtsi @@ -67,6 +67,13 @@  		interrupt-parent = <&tzic>;  		ranges; +		ipu: ipu@18000000 { +			#crtc-cells = <1>; +			compatible = "fsl,imx53-ipu"; +			reg = <0x18000000 0x080000000>; +			interrupts = <11 10>; +		}; +  		aips@50000000 { /* AIPS1 */  			compatible = "fsl,aips-bus", "simple-bus";  			#address-cells = <1>; @@ -85,6 +92,8 @@  					compatible = "fsl,imx53-esdhc";  					reg = <0x50004000 0x4000>;  					interrupts = <1>; +					clocks = <&clks 44>, <&clks 0>, <&clks 71>; +					clock-names = "ipg", "ahb", "per";  					bus-width = <4>;  					status = "disabled";  				}; @@ -93,6 +102,8 @@  					compatible = "fsl,imx53-esdhc";  					reg = <0x50008000 0x4000>;  					interrupts = <2>; +					clocks = <&clks 45>, <&clks 0>, <&clks 72>; +					clock-names = "ipg", "ahb", "per";  					bus-width = <4>;  					status = "disabled";  				}; @@ -101,6 +112,8 @@  					compatible = "fsl,imx53-uart", "fsl,imx21-uart";  					reg = <0x5000c000 0x4000>;  					interrupts = <33>; +					clocks = <&clks 32>, <&clks 33>; +					clock-names = "ipg", "per";  					status = "disabled";  				}; @@ -110,6 +123,8 @@  					compatible = "fsl,imx53-ecspi", "fsl,imx51-ecspi";  					reg = <0x50010000 0x4000>;  					interrupts = <36>; +					clocks = <&clks 51>, <&clks 52>; +					clock-names = "ipg", "per";  					status = "disabled";  				}; @@ -117,6 +132,7 @@  					compatible = "fsl,imx53-ssi", "fsl,imx21-ssi";  					reg = <0x50014000 0x4000>;  					interrupts = <30>; +					clocks = <&clks 49>;  					fsl,fifo-depth = <15>;  					fsl,ssi-dma-events = <25 24 23 22>; /* TX0 RX0 TX1 RX1 */  					status = "disabled"; @@ -126,6 +142,8 @@  					compatible = "fsl,imx53-esdhc";  					reg = <0x50020000 0x4000>;  					interrupts = <3>; +					clocks = <&clks 46>, <&clks 0>, <&clks 73>; +					clock-names = "ipg", "ahb", "per";  					bus-width = <4>;  					status = "disabled";  				}; @@ -134,6 +152,8 @@  					compatible = "fsl,imx53-esdhc";  					reg = <0x50024000 0x4000>;  					interrupts = <4>; +					clocks = <&clks 47>, <&clks 0>, <&clks 74>; +					clock-names = "ipg", "ahb", "per";  					bus-width = <4>;  					status = "disabled";  				}; @@ -211,12 +231,14 @@  				compatible = "fsl,imx53-wdt", "fsl,imx21-wdt";  				reg = <0x53f98000 0x4000>;  				interrupts = <58>; +				clocks = <&clks 0>;  			};  			wdog2: wdog@53f9c000 {  				compatible = "fsl,imx53-wdt", "fsl,imx21-wdt";  				reg = <0x53f9c000 0x4000>;  				interrupts = <59>; +				clocks = <&clks 0>;  				status = "disabled";  			}; @@ -421,10 +443,30 @@  			}; +			pwm1: pwm@53fb4000 { +				#pwm-cells = <2>; +				compatible = "fsl,imx53-pwm", "fsl,imx27-pwm"; +				reg = <0x53fb4000 0x4000>; +				clocks = <&clks 37>, <&clks 38>; +				clock-names = "ipg", "per"; +				interrupts = <61>; +			}; + +			pwm2: pwm@53fb8000 { +				#pwm-cells = <2>; +				compatible = "fsl,imx53-pwm", "fsl,imx27-pwm"; +				reg = <0x53fb8000 0x4000>; +				clocks = <&clks 39>, <&clks 40>; +				clock-names = "ipg", "per"; +				interrupts = <94>; +			}; +  			uart1: serial@53fbc000 {  				compatible = "fsl,imx53-uart", "fsl,imx21-uart";  				reg = <0x53fbc000 0x4000>;  				interrupts = <31>; +				clocks = <&clks 28>, <&clks 29>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -432,6 +474,8 @@  				compatible = "fsl,imx53-uart", "fsl,imx21-uart";  				reg = <0x53fc0000 0x4000>;  				interrupts = <32>; +				clocks = <&clks 30>, <&clks 31>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -439,6 +483,8 @@  				compatible = "fsl,imx53-flexcan", "fsl,p1010-flexcan";  				reg = <0x53fc8000 0x4000>;  				interrupts = <82>; +				clocks = <&clks 158>, <&clks 157>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -446,9 +492,18 @@  				compatible = "fsl,imx53-flexcan", "fsl,p1010-flexcan";  				reg = <0x53fcc000 0x4000>;  				interrupts = <83>; +				clocks = <&clks 158>, <&clks 157>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; +			clks: ccm@53fd4000{ +				compatible = "fsl,imx53-ccm"; +				reg = <0x53fd4000 0x4000>; +				interrupts = <0 71 0x04 0 72 0x04>; +				#clock-cells = <1>; +			}; +  			gpio5: gpio@53fdc000 {  				compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";  				reg = <0x53fdc000 0x4000>; @@ -485,6 +540,7 @@  				compatible = "fsl,imx53-i2c", "fsl,imx21-i2c";  				reg = <0x53fec000 0x4000>;  				interrupts = <64>; +				clocks = <&clks 88>;  				status = "disabled";  			}; @@ -492,6 +548,8 @@  				compatible = "fsl,imx53-uart", "fsl,imx21-uart";  				reg = <0x53ff0000 0x4000>;  				interrupts = <13>; +				clocks = <&clks 65>, <&clks 66>; +				clock-names = "ipg", "per";  				status = "disabled";  			};  		}; @@ -507,6 +565,8 @@  				compatible = "fsl,imx53-uart", "fsl,imx21-uart";  				reg = <0x63f90000 0x4000>;  				interrupts = <86>; +				clocks = <&clks 67>, <&clks 68>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -516,6 +576,8 @@  				compatible = "fsl,imx53-ecspi", "fsl,imx51-ecspi";  				reg = <0x63fac000 0x4000>;  				interrupts = <37>; +				clocks = <&clks 53>, <&clks 54>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -523,6 +585,8 @@  				compatible = "fsl,imx53-sdma", "fsl,imx35-sdma";  				reg = <0x63fb0000 0x4000>;  				interrupts = <6>; +				clocks = <&clks 56>, <&clks 56>; +				clock-names = "ipg", "ahb";  				fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";  			}; @@ -532,6 +596,8 @@  				compatible = "fsl,imx53-cspi", "fsl,imx35-cspi";  				reg = <0x63fc0000 0x4000>;  				interrupts = <38>; +				clocks = <&clks 55>, <&clks 0>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -541,6 +607,7 @@  				compatible = "fsl,imx53-i2c", "fsl,imx21-i2c";  				reg = <0x63fc4000 0x4000>;  				interrupts = <63>; +				clocks = <&clks 35>;  				status = "disabled";  			}; @@ -550,6 +617,7 @@  				compatible = "fsl,imx53-i2c", "fsl,imx21-i2c";  				reg = <0x63fc8000 0x4000>;  				interrupts = <62>; +				clocks = <&clks 34>;  				status = "disabled";  			}; @@ -557,6 +625,7 @@  				compatible = "fsl,imx53-ssi", "fsl,imx21-ssi";  				reg = <0x63fcc000 0x4000>;  				interrupts = <29>; +				clocks = <&clks 48>;  				fsl,fifo-depth = <15>;  				fsl,ssi-dma-events = <29 28 27 26>; /* TX0 RX0 TX1 RX1 */  				status = "disabled"; @@ -572,6 +641,7 @@  				compatible = "fsl,imx53-nand";  				reg = <0x63fdb000 0x1000 0xf7ff0000 0x10000>;  				interrupts = <8>; +				clocks = <&clks 60>;  				status = "disabled";  			}; @@ -579,6 +649,7 @@  				compatible = "fsl,imx53-ssi", "fsl,imx21-ssi";  				reg = <0x63fe8000 0x4000>;  				interrupts = <96>; +				clocks = <&clks 50>;  				fsl,fifo-depth = <15>;  				fsl,ssi-dma-events = <47 46 45 44>; /* TX0 RX0 TX1 RX1 */  				status = "disabled"; @@ -588,6 +659,8 @@  				compatible = "fsl,imx53-fec", "fsl,imx25-fec";  				reg = <0x63fec000 0x4000>;  				interrupts = <87>; +				clocks = <&clks 42>, <&clks 42>, <&clks 42>; +				clock-names = "ipg", "ahb", "ptp";  				status = "disabled";  			};  		}; diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi index 6dfeaedef30..d6265ca9711 100644 --- a/arch/arm/boot/dts/imx6q.dtsi +++ b/arch/arm/boot/dts/imx6q.dtsi @@ -276,23 +276,39 @@  			};  			pwm1: pwm@02080000 { +				#pwm-cells = <2>; +				compatible = "fsl,imx6q-pwm", "fsl,imx27-pwm";  				reg = <0x02080000 0x4000>;  				interrupts = <0 83 0x04>; +				clocks = <&clks 62>, <&clks 145>; +				clock-names = "ipg", "per";  			};  			pwm2: pwm@02084000 { +				#pwm-cells = <2>; +				compatible = "fsl,imx6q-pwm", "fsl,imx27-pwm";  				reg = <0x02084000 0x4000>;  				interrupts = <0 84 0x04>; +				clocks = <&clks 62>, <&clks 146>; +				clock-names = "ipg", "per";  			};  			pwm3: pwm@02088000 { +				#pwm-cells = <2>; +				compatible = "fsl,imx6q-pwm", "fsl,imx27-pwm";  				reg = <0x02088000 0x4000>;  				interrupts = <0 85 0x04>; +				clocks = <&clks 62>, <&clks 147>; +				clock-names = "ipg", "per";  			};  			pwm4: pwm@0208c000 { +				#pwm-cells = <2>; +				compatible = "fsl,imx6q-pwm", "fsl,imx27-pwm";  				reg = <0x0208c000 0x4000>;  				interrupts = <0 86 0x04>; +				clocks = <&clks 62>, <&clks 148>; +				clock-names = "ipg", "per";  			};  			can1: flexcan@02090000 { @@ -596,6 +612,7 @@  							66  0x1b0b0	/* MX6Q_PAD_RGMII_RD2__ENET_RGMII_RD2 */  							70  0x1b0b0	/* MX6Q_PAD_RGMII_RD3__ENET_RGMII_RD3 */  							48  0x1b0b0	/* MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL */ +							1033 0x4001b0a8	/* MX6Q_PAD_GPIO_16__ENET_ANATOP_ETHERNET_REF_OUT*/  						>;  					}; @@ -849,8 +866,8 @@  				compatible = "fsl,imx6q-fec";  				reg = <0x02188000 0x4000>;  				interrupts = <0 118 0x04 0 119 0x04>; -				clocks = <&clks 117>, <&clks 117>; -				clock-names = "ipg", "ahb"; +				clocks = <&clks 117>, <&clks 117>, <&clks 177>; +				clock-names = "ipg", "ahb", "ptp";  				status = "disabled";  			}; @@ -1021,5 +1038,23 @@  				status = "disabled";  			};  		}; + +		ipu1: ipu@02400000 { +			#crtc-cells = <1>; +			compatible = "fsl,imx6q-ipu"; +			reg = <0x02400000 0x400000>; +			interrupts = <0 6 0x4 0 5 0x4>; +			clocks = <&clks 130>, <&clks 131>, <&clks 132>; +			clock-names = "bus", "di0", "di1"; +		}; + +		ipu2: ipu@02800000 { +			#crtc-cells = <1>; +			compatible = "fsl,imx6q-ipu"; +			reg = <0x02800000 0x400000>; +			interrupts = <0 8 0x4 0 7 0x4>; +			clocks = <&clks 133>, <&clks 134>, <&clks 137>; +			clock-names = "bus", "di0", "di1"; +		};  	};  }; diff --git a/arch/arm/boot/dts/pm9g45.dts b/arch/arm/boot/dts/pm9g45.dts new file mode 100644 index 00000000000..387fedb5898 --- /dev/null +++ b/arch/arm/boot/dts/pm9g45.dts @@ -0,0 +1,165 @@ +/* + * pm9g45.dts - Device Tree file for Ronetix pm9g45 board + * + *  Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * Licensed under GPLv2. + */ +/dts-v1/; +/include/ "at91sam9g45.dtsi" + +/ { +	model = "Ronetix pm9g45"; +	compatible = "ronetix,pm9g45", "atmel,at91sam9g45", "atmel,at91sam9"; + +	chosen { +		bootargs = "console=ttyS0,115200"; +	}; + +	memory { +		reg = <0x70000000 0x8000000>; +	}; + +	clocks { +		#address-cells = <1>; +		#size-cells = <1>; +		ranges; + +		main_clock: clock@0 { +			compatible = "atmel,osc", "fixed-clock"; +			clock-frequency = <12000000>; +		}; +	}; + +	ahb { +		apb { +			dbgu: serial@ffffee00 { +				status = "okay"; +			}; + +			pinctrl@fffff200 { + +				board { +					pinctrl_board_nand: nand0-board { +						atmel,pins = +							<3 3 0x0 0x1	/* PD3 gpio RDY pin pull_up*/ +							 2 14 0x0 0x1>;	/* PC14 gpio enable pin pull_up */ +					}; +				}; + +				mmc { +					pinctrl_board_mmc: mmc0-board { +						atmel,pins = +							<3 6 0x0 0x5>;	/* PD6 gpio CD pin pull_up and deglitch */ +					}; +				}; +			}; + +			mmc0: mmc@fff80000 { +				pinctrl-0 = < +					&pinctrl_board_mmc +					&pinctrl_mmc0_slot0_clk_cmd_dat0 +					&pinctrl_mmc0_slot0_dat1_3>; +				status = "okay"; +				slot@0 { +					reg = <0>; +					bus-width = <4>; +					cd-gpios = <&pioD 6 0>; +				}; +			}; + +			macb0: ethernet@fffbc000 { +				phy-mode = "rmii"; +				status = "okay"; +			}; + +		}; + +		nand0: nand@40000000 { +			nand-bus-width = <8>; +			nand-ecc-mode = "soft"; +			nand-on-flash-bbt; +			pinctrl-0 = <&pinctrl_board_nand>; + +			gpios = <&pioD 3 0 +				 &pioC 14 0 +				 0 +				>; + +			status = "okay"; + +			at91bootstrap@0 { +				label = "at91bootstrap"; +				reg = <0x0 0x20000>; +			}; + +			barebox@20000 { +				label = "barebox"; +				reg = <0x20000 0x40000>; +			}; + +			bareboxenv@60000 { +				label = "bareboxenv"; +				reg = <0x60000 0x1A0000>; +			}; + +			kernel@200000 { +				label = "bareboxenv2"; +				reg = <0x200000 0x300000>; +			}; + +			kernel@500000 { +				label = "root"; +				reg = <0x500000 0x400000>; +			}; + +			data@900000 { +				label = "data"; +				reg = <0x900000 0x8340000>; +			}; +		}; + +		usb0: ohci@00700000 { +			status = "okay"; +			num-ports = <2>; +		}; + +		usb1: ehci@00800000 { +			status = "okay"; +		}; +	}; + +	leds { +		compatible = "gpio-leds"; + +		led0 { +			label = "led0"; +			gpios = <&pioD 0 1>; +			linux,default-trigger = "nand-disk"; +		}; + +		led1 { +			label = "led1"; +			gpios = <&pioD 31 0>; +			linux,default-trigger = "heartbeat"; +		}; +	}; + +	gpio_keys { +		compatible = "gpio-keys"; +		#address-cells = <1>; +		#size-cells = <0>; + +		right { +			label = "SW4"; +			gpios = <&pioE 7 1>; +			linux,code = <106>; +		}; + +		up { +			label = "SW3"; +			gpios = <&pioE 8 1>; +			linux,code = <103>; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/sh7377.dtsi b/arch/arm/boot/dts/sh7372-mackerel.dts index 767ee0796da..286f0caef01 100644 --- a/arch/arm/boot/dts/sh7377.dtsi +++ b/arch/arm/boot/dts/sh7372-mackerel.dts @@ -1,5 +1,5 @@  /* - * Device Tree Source for the sh7377 SoC + * Device Tree Source for the mackerel board   *   * Copyright (C) 2012 Renesas Solutions Corp.   * @@ -8,14 +8,15 @@   * kind, whether express or implied.   */ +/dts-v1/;  /include/ "skeleton.dtsi"  / { -	compatible = "renesas,sh7377"; +	model = "Mackerel (AP4 EVM 2nd)"; +	compatible = "renesas,mackerel"; -	cpus { -		cpu@0 { -			compatible = "arm,cortex-a8"; -		}; +	memory { +		device_type = "memory"; +		reg = <0x40000000 0x10000000>;  	};  }; diff --git a/arch/arm/boot/dts/snowball.dts b/arch/arm/boot/dts/snowball.dts index 9e02a913eb6..27f31a5fa49 100644 --- a/arch/arm/boot/dts/snowball.dts +++ b/arch/arm/boot/dts/snowball.dts @@ -99,6 +99,33 @@  			status = "okay";  		}; +		prcmu@80157000 { +			thermal@801573c0 { +				num-trips = <4>; + +				trip0-temp = <70000>; +				trip0-type = "active"; +				trip0-cdev-num = <1>; +				trip0-cdev-name0 = "thermal-cpufreq-0"; + +				trip1-temp = <75000>; +				trip1-type = "active"; +				trip1-cdev-num = <1>; +				trip1-cdev-name0 = "thermal-cpufreq-0"; + +				trip2-temp = <80000>; +				trip2-type = "active"; +				trip2-cdev-num = <1>; +				trip2-cdev-name0 = "thermal-cpufreq-0"; + +				trip3-temp = <85000>; +				trip3-type = "critical"; +				trip3-cdev-num = <0>; + +				status = "okay"; +			 }; +		}; +  		external-bus@50000000 {  			status = "okay"; @@ -184,6 +211,10 @@  			};  		}; +		cpufreq-cooling { +			status = "okay"; +		}; +  		prcmu@80157000 {  			db8500-prcmu-regulators {  				db8500_vape_reg: db8500_vape { diff --git a/arch/arm/boot/dts/spear1310-evb.dts b/arch/arm/boot/dts/spear1310-evb.dts index dd4358bc26e..2e4c5727468 100644 --- a/arch/arm/boot/dts/spear1310-evb.dts +++ b/arch/arm/boot/dts/spear1310-evb.dts @@ -181,6 +181,10 @@  			       status = "okay";  			}; +			gpio@d8400000 { +			       status = "okay"; +			}; +  			i2c0: i2c@e0280000 {  			       status = "okay";  			}; diff --git a/arch/arm/boot/dts/spear1310.dtsi b/arch/arm/boot/dts/spear1310.dtsi index 419ea7413d2..7cd25eb4f8e 100644 --- a/arch/arm/boot/dts/spear1310.dtsi +++ b/arch/arm/boot/dts/spear1310.dtsi @@ -70,6 +70,12 @@  			status = "disabled";  		}; +		pinmux: pinmux@e0700000 { +			compatible = "st,spear1310-pinmux"; +			reg = <0xe0700000 0x1000>; +			#gpio-range-cells = <2>; +		}; +  		spi1: spi@5d400000 {  			compatible = "arm,pl022", "arm,primecell";  			reg = <0x5d400000 0x1000>; @@ -179,6 +185,27 @@  			thermal@e07008c4 {  				st,thermal-flags = <0x7000>;  			}; + +			gpiopinctrl: gpio@d8400000 { +				compatible = "st,spear-plgpio"; +				reg = <0xd8400000 0x1000>; +				interrupts = <0 100 0x4>; +				#interrupt-cells = <1>; +				interrupt-controller; +				gpio-controller; +				#gpio-cells = <2>; +				gpio-ranges = <&pinmux 0 246>; +				status = "disabled"; + +				st-plgpio,ngpio = <246>; +				st-plgpio,enb-reg = <0xd0>; +				st-plgpio,wdata-reg = <0x90>; +				st-plgpio,dir-reg = <0xb0>; +				st-plgpio,ie-reg = <0x30>; +				st-plgpio,rdata-reg = <0x70>; +				st-plgpio,mis-reg = <0x10>; +				st-plgpio,eit-reg = <0x50>; +			};  		};  	};  }; diff --git a/arch/arm/boot/dts/spear1340-evb.dts b/arch/arm/boot/dts/spear1340-evb.dts index c9a54e06fb6..045f7123ffa 100644 --- a/arch/arm/boot/dts/spear1340-evb.dts +++ b/arch/arm/boot/dts/spear1340-evb.dts @@ -193,6 +193,10 @@  			       status = "okay";  			}; +			gpio@e2800000 { +			       status = "okay"; +			}; +  			i2c0: i2c@e0280000 {  			       status = "okay";  			}; diff --git a/arch/arm/boot/dts/spear1340.dtsi b/arch/arm/boot/dts/spear1340.dtsi index d71fe2a68f0..6c09eb0a1b2 100644 --- a/arch/arm/boot/dts/spear1340.dtsi +++ b/arch/arm/boot/dts/spear1340.dtsi @@ -24,6 +24,12 @@  			status = "disabled";  		}; +		pinmux: pinmux@e0700000 { +			compatible = "st,spear1340-pinmux"; +			reg = <0xe0700000 0x1000>; +			#gpio-range-cells = <2>; +		}; +  		spi1: spi@5d400000 {  			compatible = "arm,pl022", "arm,primecell";  			reg = <0x5d400000 0x1000>; @@ -51,6 +57,26 @@  			thermal@e07008c4 {  				st,thermal-flags = <0x2a00>;  			}; + +			gpiopinctrl: gpio@e2800000 { +				compatible = "st,spear-plgpio"; +				reg = <0xe2800000 0x1000>; +				interrupts = <0 107 0x4>; +				#interrupt-cells = <1>; +				interrupt-controller; +				gpio-controller; +				#gpio-cells = <2>; +				gpio-ranges = <&pinmux 0 252>; +				status = "disabled"; + +				st-plgpio,ngpio = <250>; +				st-plgpio,wdata-reg = <0x40>; +				st-plgpio,dir-reg = <0x00>; +				st-plgpio,ie-reg = <0x80>; +				st-plgpio,rdata-reg = <0x20>; +				st-plgpio,mis-reg = <0xa0>; +				st-plgpio,eit-reg = <0x60>; +			};  		};  	};  }; diff --git a/arch/arm/boot/dts/spear310.dtsi b/arch/arm/boot/dts/spear310.dtsi index 62fc4fb3e5f..930303e48df 100644 --- a/arch/arm/boot/dts/spear310.dtsi +++ b/arch/arm/boot/dts/spear310.dtsi @@ -22,9 +22,10 @@  			  0xb0000000 0xb0000000 0x10000000  			  0xd0000000 0xd0000000 0x30000000>; -		pinmux@b4000000 { +		pinmux: pinmux@b4000000 {  			compatible = "st,spear310-pinmux";  			reg = <0xb4000000 0x1000>; +			#gpio-range-cells = <2>;  		};  		fsmc: flash@44000000 { @@ -75,6 +76,25 @@  				reg = <0xb2200000 0x1000>;  				status = "disabled";  			}; + +			gpiopinctrl: gpio@b4000000 { +				compatible = "st,spear-plgpio"; +				reg = <0xb4000000 0x1000>; +				#interrupt-cells = <1>; +				interrupt-controller; +				gpio-controller; +				#gpio-cells = <2>; +				gpio-ranges = <&pinmux 0 102>; +				status = "disabled"; + +				st-plgpio,ngpio = <102>; +				st-plgpio,enb-reg = <0x10>; +				st-plgpio,wdata-reg = <0x20>; +				st-plgpio,dir-reg = <0x30>; +				st-plgpio,ie-reg = <0x50>; +				st-plgpio,rdata-reg = <0x40>; +				st-plgpio,mis-reg = <0x60>; +			};  		};  	};  }; diff --git a/arch/arm/boot/dts/spear320-evb.dts b/arch/arm/boot/dts/spear320-evb.dts index 082328bd64a..ad4bfc68ee0 100644 --- a/arch/arm/boot/dts/spear320-evb.dts +++ b/arch/arm/boot/dts/spear320-evb.dts @@ -164,6 +164,10 @@  			       status = "okay";  			}; +			gpio@b3000000 { +			       status = "okay"; +			}; +  			i2c0: i2c@d0180000 {  			       status = "okay";  			}; diff --git a/arch/arm/boot/dts/spear320.dtsi b/arch/arm/boot/dts/spear320.dtsi index 1f49d69595a..67d7ada7127 100644 --- a/arch/arm/boot/dts/spear320.dtsi +++ b/arch/arm/boot/dts/spear320.dtsi @@ -21,9 +21,10 @@  		ranges = <0x40000000 0x40000000 0x80000000  			  0xd0000000 0xd0000000 0x30000000>; -		pinmux@b3000000 { +		pinmux: pinmux@b3000000 {  			compatible = "st,spear320-pinmux";  			reg = <0xb3000000 0x1000>; +			#gpio-range-cells = <2>;  		};  		clcd@90000000 { @@ -90,6 +91,26 @@  				reg = <0xa4000000 0x1000>;  				status = "disabled";  			}; + +			gpiopinctrl: gpio@b3000000 { +				compatible = "st,spear-plgpio"; +				reg = <0xb3000000 0x1000>; +				#interrupt-cells = <1>; +				interrupt-controller; +				gpio-controller; +				#gpio-cells = <2>; +				gpio-ranges = <&pinmux 0 102>; +				status = "disabled"; + +				st-plgpio,ngpio = <102>; +				st-plgpio,enb-reg = <0x24>; +				st-plgpio,wdata-reg = <0x34>; +				st-plgpio,dir-reg = <0x44>; +				st-plgpio,ie-reg = <0x64>; +				st-plgpio,rdata-reg = <0x54>; +				st-plgpio,mis-reg = <0x84>; +				st-plgpio,eit-reg = <0x94>; +			};  		};  	};  }; diff --git a/arch/arm/boot/dts/sun4i-cubieboard.dts b/arch/arm/boot/dts/sun4i-cubieboard.dts new file mode 100644 index 00000000000..f4ca126ad99 --- /dev/null +++ b/arch/arm/boot/dts/sun4i-cubieboard.dts @@ -0,0 +1,38 @@ +/* + * Copyright 2012 Stefan Roese + * Stefan Roese <sr@denx.de> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/dts-v1/; +/include/ "sun4i.dtsi" + +/ { +	model = "Cubietech Cubieboard"; +	compatible = "cubietech,cubieboard", "allwinner,sun4i"; + +	aliases { +		serial0 = &uart0; +		serial1 = &uart1; +	}; + +	chosen { +		bootargs = "earlyprintk console=ttyS0,115200"; +	}; + +	soc { +		uart0: uart@01c28000 { +			status = "okay"; +		}; + +		uart1: uart@01c28400 { +			status = "okay"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/sun4i.dtsi b/arch/arm/boot/dts/sun4i.dtsi new file mode 100644 index 00000000000..e61fdd47bd0 --- /dev/null +++ b/arch/arm/boot/dts/sun4i.dtsi @@ -0,0 +1,19 @@ +/* + * Copyright 2012 Stefan Roese + * Stefan Roese <sr@denx.de> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/include/ "sunxi.dtsi" + +/ { +	memory { +		reg = <0x40000000 0x80000000>; +	}; +}; diff --git a/arch/arm/boot/dts/sun5i-olinuxino.dts b/arch/arm/boot/dts/sun5i-olinuxino.dts new file mode 100644 index 00000000000..d6ff889a5d8 --- /dev/null +++ b/arch/arm/boot/dts/sun5i-olinuxino.dts @@ -0,0 +1,30 @@ +/* + * Copyright 2012 Maxime Ripard + * + * Maxime Ripard <maxime.ripard@free-electrons.com> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/dts-v1/; +/include/ "sun5i.dtsi" + +/ { +	model = "Olimex A13-Olinuxino"; +	compatible = "olimex,a13-olinuxino", "allwinner,sun5i"; + +	chosen { +		bootargs = "earlyprintk console=ttyS0,115200"; +	}; + +	soc { +		uart1: uart@01c28400 { +			status = "okay"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/sun5i.dtsi b/arch/arm/boot/dts/sun5i.dtsi new file mode 100644 index 00000000000..59a2d265a98 --- /dev/null +++ b/arch/arm/boot/dts/sun5i.dtsi @@ -0,0 +1,20 @@ +/* + * Copyright 2012 Maxime Ripard + * + * Maxime Ripard <maxime.ripard@free-electrons.com> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/include/ "sunxi.dtsi" + +/ { +	memory { +		reg = <0x40000000 0x20000000>; +	}; +}; diff --git a/arch/arm/boot/dts/sunxi.dtsi b/arch/arm/boot/dts/sunxi.dtsi new file mode 100644 index 00000000000..8bbc2bfef22 --- /dev/null +++ b/arch/arm/boot/dts/sunxi.dtsi @@ -0,0 +1,80 @@ +/* + * Copyright 2012 Maxime Ripard + * + * Maxime Ripard <maxime.ripard@free-electrons.com> + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/include/ "skeleton.dtsi" + +/ { +	interrupt-parent = <&intc>; + +	cpus { +		cpu@0 { +			compatible = "arm,cortex-a8"; +		}; +	}; + +	clocks { +		#address-cells = <1>; +		#size-cells = <0>; + +		osc: oscillator { +			#clock-cells = <0>; +			compatible = "fixed-clock"; +			clock-frequency = <24000000>; +		}; +	}; + +	soc { +		compatible = "simple-bus"; +		#address-cells = <1>; +		#size-cells = <1>; +		reg = <0x01c20000 0x300000>; +		ranges; + +		timer@01c20c00 { +			compatible = "allwinner,sunxi-timer"; +			reg = <0x01c20c00 0x90>; +			interrupts = <22>; +			clocks = <&osc>; +		}; + +		wdt: watchdog@01c20c90 { +			compatible = "allwinner,sunxi-wdt"; +			reg = <0x01c20c90 0x10>; +		}; + +		intc: interrupt-controller@01c20400 { +			compatible = "allwinner,sunxi-ic"; +			reg = <0x01c20400 0x400>; +			interrupt-controller; +			#interrupt-cells = <1>; +		}; + +		uart0: uart@01c28000 { +			compatible = "ns8250"; +			reg = <0x01c28000 0x400>; +			interrupts = <1>; +			reg-shift = <2>; +			clock-frequency = <24000000>; +			status = "disabled"; +		}; + +		uart1: uart@01c28400 { +			compatible = "ns8250"; +			reg = <0x01c28400 0x400>; +			interrupts = <2>; +			reg-shift = <2>; +			clock-frequency = <24000000>; +			status = "disabled"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/tegra20-seaboard.dts b/arch/arm/boot/dts/tegra20-seaboard.dts index eafeca65eb2..420459825b4 100644 --- a/arch/arm/boot/dts/tegra20-seaboard.dts +++ b/arch/arm/boot/dts/tegra20-seaboard.dts @@ -492,12 +492,12 @@  		};  		temperature-sensor@4c { -			compatible = "nct1008"; +			compatible = "onnn,nct1008";  			reg = <0x4c>;  		};  		magnetometer@c { -			compatible = "ak8975"; +			compatible = "ak,ak8975";  			reg = <0xc>;  			interrupt-parent = <&gpio>;  			interrupts = <109 0x04>; /* gpio PN5 */ diff --git a/arch/arm/boot/dts/tegra20.dtsi b/arch/arm/boot/dts/tegra20.dtsi index fba998e3954..b8effa1cbda 100644 --- a/arch/arm/boot/dts/tegra20.dtsi +++ b/arch/arm/boot/dts/tegra20.dtsi @@ -91,6 +91,12 @@  		};  	}; +	timer@50004600 { +		compatible = "arm,cortex-a9-twd-timer"; +		reg = <0x50040600 0x20>; +		interrupts = <1 13 0x304>; +	}; +  	cache-controller@50043000 {  		compatible = "arm,pl310-cache";  		reg = <0x50043000 0x1000>; @@ -108,6 +114,15 @@  		#interrupt-cells = <3>;  	}; +	timer@60005000 { +		compatible = "nvidia,tegra20-timer"; +		reg = <0x60005000 0x60>; +		interrupts = <0 0 0x04 +			      0 1 0x04 +			      0 41 0x04 +			      0 42 0x04>; +	}; +  	apbdma: dma {  		compatible = "nvidia,tegra20-apbdma";  		reg = <0x6000a000 0x1200>; @@ -225,6 +240,12 @@  		#pwm-cells = <2>;  	}; +	rtc { +		compatible = "nvidia,tegra20-rtc"; +		reg = <0x7000e000 0x100>; +		interrupts = <0 2 0x04>; +	}; +  	i2c@7000c000 {  		compatible = "nvidia,tegra20-i2c";  		reg = <0x7000c000 0x100>; diff --git a/arch/arm/boot/dts/tegra30.dtsi b/arch/arm/boot/dts/tegra30.dtsi index efa603d47a6..529fdb82dfd 100644 --- a/arch/arm/boot/dts/tegra30.dtsi +++ b/arch/arm/boot/dts/tegra30.dtsi @@ -91,6 +91,12 @@  		};  	}; +	timer@50004600 { +		compatible = "arm,cortex-a9-twd-timer"; +		reg = <0x50040600 0x20>; +		interrupts = <1 13 0xf04>; +	}; +  	cache-controller@50043000 {  		compatible = "arm,pl310-cache";  		reg = <0x50043000 0x1000>; @@ -108,6 +114,17 @@  		#interrupt-cells = <3>;  	}; +	timer@60005000 { +		compatible = "nvidia,tegra30-timer", "nvidia,tegra20-timer"; +		reg = <0x60005000 0x400>; +		interrupts = <0 0 0x04 +			      0 1 0x04 +			      0 41 0x04 +			      0 42 0x04 +			      0 121 0x04 +			      0 122 0x04>; +	}; +  	apbdma: dma {  		compatible = "nvidia,tegra30-apbdma", "nvidia,tegra20-apbdma";  		reg = <0x6000a000 0x1400>; @@ -219,6 +236,12 @@  		#pwm-cells = <2>;  	}; +	rtc { +		compatible = "nvidia,tegra30-rtc", "nvidia,tegra20-rtc"; +		reg = <0x7000e000 0x100>; +		interrupts = <0 2 0x04>; +	}; +  	i2c@7000c000 {  		compatible =  "nvidia,tegra30-i2c", "nvidia,tegra20-i2c";  		reg = <0x7000c000 0x100>; diff --git a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi index d8a827bd2bf..ac870fb3fa0 100644 --- a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi +++ b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi @@ -17,17 +17,16 @@   * CHANGES TO vexpress-v2m.dtsi!   */ -/ { -	aliases { -		arm,v2m_timer = &v2m_timer01; -	}; -  	motherboard { -		compatible = "simple-bus"; +		model = "V2M-P1"; +		arm,hbi = <0x190>; +		arm,vexpress,site = <0>;  		arm,v2m-memory-map = "rs1"; +		compatible = "arm,vexpress,v2m-p1", "simple-bus";  		#address-cells = <2>; /* SMB chipselect number and offset */  		#size-cells = <1>;  		#interrupt-cells = <1>; +		ranges;  		flash@0,00000000 {  			compatible = "arm,vexpress-flash", "cfi-flash"; @@ -72,14 +71,20 @@  			#size-cells = <1>;  			ranges = <0 3 0 0x200000>; -			sysreg@010000 { +			v2m_sysreg: sysreg@010000 {  				compatible = "arm,vexpress-sysreg";  				reg = <0x010000 0x1000>; +				gpio-controller; +				#gpio-cells = <2>;  			}; -			sysctl@020000 { +			v2m_sysctl: sysctl@020000 {  				compatible = "arm,sp810", "arm,primecell";  				reg = <0x020000 0x1000>; +				clocks = <&v2m_refclk32khz>, <&v2m_refclk1mhz>, <&smbclk>; +				clock-names = "refclk", "timclk", "apb_pclk"; +				#clock-cells = <1>; +				clock-output-names = "timerclken0", "timerclken1", "timerclken2", "timerclken3";  			};  			/* PCI-E I2C bus */ @@ -100,66 +105,92 @@  				compatible = "arm,pl041", "arm,primecell";  				reg = <0x040000 0x1000>;  				interrupts = <11>; +				clocks = <&smbclk>; +				clock-names = "apb_pclk";  			};  			mmci@050000 {  				compatible = "arm,pl180", "arm,primecell";  				reg = <0x050000 0x1000>;  				interrupts = <9 10>; +				cd-gpios = <&v2m_sysreg 0 0>; +				wp-gpios = <&v2m_sysreg 1 0>; +				max-frequency = <12000000>; +				vmmc-supply = <&v2m_fixed_3v3>; +				clocks = <&v2m_clk24mhz>, <&smbclk>; +				clock-names = "mclk", "apb_pclk";  			};  			kmi@060000 {  				compatible = "arm,pl050", "arm,primecell";  				reg = <0x060000 0x1000>;  				interrupts = <12>; +				clocks = <&v2m_clk24mhz>, <&smbclk>; +				clock-names = "KMIREFCLK", "apb_pclk";  			};  			kmi@070000 {  				compatible = "arm,pl050", "arm,primecell";  				reg = <0x070000 0x1000>;  				interrupts = <13>; +				clocks = <&v2m_clk24mhz>, <&smbclk>; +				clock-names = "KMIREFCLK", "apb_pclk";  			};  			v2m_serial0: uart@090000 {  				compatible = "arm,pl011", "arm,primecell";  				reg = <0x090000 0x1000>;  				interrupts = <5>; +				clocks = <&v2m_oscclk2>, <&smbclk>; +				clock-names = "uartclk", "apb_pclk";  			};  			v2m_serial1: uart@0a0000 {  				compatible = "arm,pl011", "arm,primecell";  				reg = <0x0a0000 0x1000>;  				interrupts = <6>; +				clocks = <&v2m_oscclk2>, <&smbclk>; +				clock-names = "uartclk", "apb_pclk";  			};  			v2m_serial2: uart@0b0000 {  				compatible = "arm,pl011", "arm,primecell";  				reg = <0x0b0000 0x1000>;  				interrupts = <7>; +				clocks = <&v2m_oscclk2>, <&smbclk>; +				clock-names = "uartclk", "apb_pclk";  			};  			v2m_serial3: uart@0c0000 {  				compatible = "arm,pl011", "arm,primecell";  				reg = <0x0c0000 0x1000>;  				interrupts = <8>; +				clocks = <&v2m_oscclk2>, <&smbclk>; +				clock-names = "uartclk", "apb_pclk";  			};  			wdt@0f0000 {  				compatible = "arm,sp805", "arm,primecell";  				reg = <0x0f0000 0x1000>;  				interrupts = <0>; +				clocks = <&v2m_refclk32khz>, <&smbclk>; +				clock-names = "wdogclk", "apb_pclk";  			};  			v2m_timer01: timer@110000 {  				compatible = "arm,sp804", "arm,primecell";  				reg = <0x110000 0x1000>;  				interrupts = <2>; +				clocks = <&v2m_sysctl 0>, <&v2m_sysctl 1>, <&smbclk>; +				clock-names = "timclken1", "timclken2", "apb_pclk";  			};  			v2m_timer23: timer@120000 {  				compatible = "arm,sp804", "arm,primecell";  				reg = <0x120000 0x1000>;  				interrupts = <3>; +				clocks = <&v2m_sysctl 2>, <&v2m_sysctl 3>, <&smbclk>; +				clock-names = "timclken1", "timclken2", "apb_pclk";  			};  			/* DVI I2C bus */ @@ -185,6 +216,8 @@  				compatible = "arm,pl031", "arm,primecell";  				reg = <0x170000 0x1000>;  				interrupts = <4>; +				clocks = <&smbclk>; +				clock-names = "apb_pclk";  			};  			compact-flash@1a0000 { @@ -198,6 +231,8 @@  				compatible = "arm,pl111", "arm,primecell";  				reg = <0x1f0000 0x1000>;  				interrupts = <14>; +				clocks = <&v2m_oscclk1>, <&smbclk>; +				clock-names = "clcdclk", "apb_pclk";  			};  		}; @@ -208,5 +243,98 @@  			regulator-max-microvolt = <3300000>;  			regulator-always-on;  		}; + +		v2m_clk24mhz: clk24mhz { +			compatible = "fixed-clock"; +			#clock-cells = <0>; +			clock-frequency = <24000000>; +			clock-output-names = "v2m:clk24mhz"; +		}; + +		v2m_refclk1mhz: refclk1mhz { +			compatible = "fixed-clock"; +			#clock-cells = <0>; +			clock-frequency = <1000000>; +			clock-output-names = "v2m:refclk1mhz"; +		}; + +		v2m_refclk32khz: refclk32khz { +			compatible = "fixed-clock"; +			#clock-cells = <0>; +			clock-frequency = <32768>; +			clock-output-names = "v2m:refclk32khz"; +		}; + +		mcc { +			compatible = "arm,vexpress,config-bus"; +			arm,vexpress,config-bridge = <&v2m_sysreg>; + +			osc@0 { +				/* MCC static memory clock */ +				compatible = "arm,vexpress-osc"; +				arm,vexpress-sysreg,func = <1 0>; +				freq-range = <25000000 60000000>; +				#clock-cells = <0>; +				clock-output-names = "v2m:oscclk0"; +			}; + +			v2m_oscclk1: osc@1 { +				/* CLCD clock */ +				compatible = "arm,vexpress-osc"; +				arm,vexpress-sysreg,func = <1 1>; +				freq-range = <23750000 63500000>; +				#clock-cells = <0>; +				clock-output-names = "v2m:oscclk1"; +			}; + +			v2m_oscclk2: osc@2 { +				/* IO FPGA peripheral clock */ +				compatible = "arm,vexpress-osc"; +				arm,vexpress-sysreg,func = <1 2>; +				freq-range = <24000000 24000000>; +				#clock-cells = <0>; +				clock-output-names = "v2m:oscclk2"; +			}; + +			volt@0 { +				/* Logic level voltage */ +				compatible = "arm,vexpress-volt"; +				arm,vexpress-sysreg,func = <2 0>; +				regulator-name = "VIO"; +				regulator-always-on; +				label = "VIO"; +			}; + +			temp@0 { +				/* MCC internal operating temperature */ +				compatible = "arm,vexpress-temp"; +				arm,vexpress-sysreg,func = <4 0>; +				label = "MCC"; +			}; + +			reset@0 { +				compatible = "arm,vexpress-reset"; +				arm,vexpress-sysreg,func = <5 0>; +			}; + +			muxfpga@0 { +				compatible = "arm,vexpress-muxfpga"; +				arm,vexpress-sysreg,func = <7 0>; +			}; + +			shutdown@0 { +				compatible = "arm,vexpress-shutdown"; +				arm,vexpress-sysreg,func = <8 0>; +			}; + +			reboot@0 { +				compatible = "arm,vexpress-reboot"; +				arm,vexpress-sysreg,func = <9 0>; +			}; + +			dvimode@0 { +				compatible = "arm,vexpress-dvimode"; +				arm,vexpress-sysreg,func = <11 0>; +			}; +		};  	}; -}; diff --git a/arch/arm/boot/dts/vexpress-v2m.dtsi b/arch/arm/boot/dts/vexpress-v2m.dtsi index dba53fd026b..f1420368355 100644 --- a/arch/arm/boot/dts/vexpress-v2m.dtsi +++ b/arch/arm/boot/dts/vexpress-v2m.dtsi @@ -17,16 +17,15 @@   * CHANGES TO vexpress-v2m-rs1.dtsi!   */ -/ { -	aliases { -		arm,v2m_timer = &v2m_timer01; -	}; -  	motherboard { -		compatible = "simple-bus"; +		model = "V2M-P1"; +		arm,hbi = <0x190>; +		arm,vexpress,site = <0>; +		compatible = "arm,vexpress,v2m-p1", "simple-bus";  		#address-cells = <2>; /* SMB chipselect number and offset */  		#size-cells = <1>;  		#interrupt-cells = <1>; +		ranges;  		flash@0,00000000 {  			compatible = "arm,vexpress-flash", "cfi-flash"; @@ -71,14 +70,20 @@  			#size-cells = <1>;  			ranges = <0 7 0 0x20000>; -			sysreg@00000 { +			v2m_sysreg: sysreg@00000 {  				compatible = "arm,vexpress-sysreg";  				reg = <0x00000 0x1000>; +				gpio-controller; +				#gpio-cells = <2>;  			}; -			sysctl@01000 { +			v2m_sysctl: sysctl@01000 {  				compatible = "arm,sp810", "arm,primecell";  				reg = <0x01000 0x1000>; +				clocks = <&v2m_refclk32khz>, <&v2m_refclk1mhz>, <&smbclk>; +				clock-names = "refclk", "timclk", "apb_pclk"; +				#clock-cells = <1>; +				clock-output-names = "timerclken0", "timerclken1", "timerclken2", "timerclken3";  			};  			/* PCI-E I2C bus */ @@ -99,66 +104,92 @@  				compatible = "arm,pl041", "arm,primecell";  				reg = <0x04000 0x1000>;  				interrupts = <11>; +				clocks = <&smbclk>; +				clock-names = "apb_pclk";  			};  			mmci@05000 {  				compatible = "arm,pl180", "arm,primecell";  				reg = <0x05000 0x1000>;  				interrupts = <9 10>; +				cd-gpios = <&v2m_sysreg 0 0>; +				wp-gpios = <&v2m_sysreg 1 0>; +				max-frequency = <12000000>; +				vmmc-supply = <&v2m_fixed_3v3>; +				clocks = <&v2m_clk24mhz>, <&smbclk>; +				clock-names = "mclk", "apb_pclk";  			};  			kmi@06000 {  				compatible = "arm,pl050", "arm,primecell";  				reg = <0x06000 0x1000>;  				interrupts = <12>; +				clocks = <&v2m_clk24mhz>, <&smbclk>; +				clock-names = "KMIREFCLK", "apb_pclk";  			};  			kmi@07000 {  				compatible = "arm,pl050", "arm,primecell";  				reg = <0x07000 0x1000>;  				interrupts = <13>; +				clocks = <&v2m_clk24mhz>, <&smbclk>; +				clock-names = "KMIREFCLK", "apb_pclk";  			};  			v2m_serial0: uart@09000 {  				compatible = "arm,pl011", "arm,primecell";  				reg = <0x09000 0x1000>;  				interrupts = <5>; +				clocks = <&v2m_oscclk2>, <&smbclk>; +				clock-names = "uartclk", "apb_pclk";  			};  			v2m_serial1: uart@0a000 {  				compatible = "arm,pl011", "arm,primecell";  				reg = <0x0a000 0x1000>;  				interrupts = <6>; +				clocks = <&v2m_oscclk2>, <&smbclk>; +				clock-names = "uartclk", "apb_pclk";  			};  			v2m_serial2: uart@0b000 {  				compatible = "arm,pl011", "arm,primecell";  				reg = <0x0b000 0x1000>;  				interrupts = <7>; +				clocks = <&v2m_oscclk2>, <&smbclk>; +				clock-names = "uartclk", "apb_pclk";  			};  			v2m_serial3: uart@0c000 {  				compatible = "arm,pl011", "arm,primecell";  				reg = <0x0c000 0x1000>;  				interrupts = <8>; +				clocks = <&v2m_oscclk2>, <&smbclk>; +				clock-names = "uartclk", "apb_pclk";  			};  			wdt@0f000 {  				compatible = "arm,sp805", "arm,primecell";  				reg = <0x0f000 0x1000>;  				interrupts = <0>; +				clocks = <&v2m_refclk32khz>, <&smbclk>; +				clock-names = "wdogclk", "apb_pclk";  			};  			v2m_timer01: timer@11000 {  				compatible = "arm,sp804", "arm,primecell";  				reg = <0x11000 0x1000>;  				interrupts = <2>; +				clocks = <&v2m_sysctl 0>, <&v2m_sysctl 1>, <&smbclk>; +				clock-names = "timclken1", "timclken2", "apb_pclk";  			};  			v2m_timer23: timer@12000 {  				compatible = "arm,sp804", "arm,primecell";  				reg = <0x12000 0x1000>;  				interrupts = <3>; +				clocks = <&v2m_sysctl 2>, <&v2m_sysctl 3>, <&smbclk>; +				clock-names = "timclken1", "timclken2", "apb_pclk";  			};  			/* DVI I2C bus */ @@ -184,6 +215,8 @@  				compatible = "arm,pl031", "arm,primecell";  				reg = <0x17000 0x1000>;  				interrupts = <4>; +				clocks = <&smbclk>; +				clock-names = "apb_pclk";  			};  			compact-flash@1a000 { @@ -197,6 +230,8 @@  				compatible = "arm,pl111", "arm,primecell";  				reg = <0x1f000 0x1000>;  				interrupts = <14>; +				clocks = <&v2m_oscclk1>, <&smbclk>; +				clock-names = "clcdclk", "apb_pclk";  			};  		}; @@ -207,5 +242,98 @@  			regulator-max-microvolt = <3300000>;  			regulator-always-on;  		}; + +		v2m_clk24mhz: clk24mhz { +			compatible = "fixed-clock"; +			#clock-cells = <0>; +			clock-frequency = <24000000>; +			clock-output-names = "v2m:clk24mhz"; +		}; + +		v2m_refclk1mhz: refclk1mhz { +			compatible = "fixed-clock"; +			#clock-cells = <0>; +			clock-frequency = <1000000>; +			clock-output-names = "v2m:refclk1mhz"; +		}; + +		v2m_refclk32khz: refclk32khz { +			compatible = "fixed-clock"; +			#clock-cells = <0>; +			clock-frequency = <32768>; +			clock-output-names = "v2m:refclk32khz"; +		}; + +		mcc { +			compatible = "arm,vexpress,config-bus"; +			arm,vexpress,config-bridge = <&v2m_sysreg>; + +			osc@0 { +				/* MCC static memory clock */ +				compatible = "arm,vexpress-osc"; +				arm,vexpress-sysreg,func = <1 0>; +				freq-range = <25000000 60000000>; +				#clock-cells = <0>; +				clock-output-names = "v2m:oscclk0"; +			}; + +			v2m_oscclk1: osc@1 { +				/* CLCD clock */ +				compatible = "arm,vexpress-osc"; +				arm,vexpress-sysreg,func = <1 1>; +				freq-range = <23750000 63500000>; +				#clock-cells = <0>; +				clock-output-names = "v2m:oscclk1"; +			}; + +			v2m_oscclk2: osc@2 { +				/* IO FPGA peripheral clock */ +				compatible = "arm,vexpress-osc"; +				arm,vexpress-sysreg,func = <1 2>; +				freq-range = <24000000 24000000>; +				#clock-cells = <0>; +				clock-output-names = "v2m:oscclk2"; +			}; + +			volt@0 { +				/* Logic level voltage */ +				compatible = "arm,vexpress-volt"; +				arm,vexpress-sysreg,func = <2 0>; +				regulator-name = "VIO"; +				regulator-always-on; +				label = "VIO"; +			}; + +			temp@0 { +				/* MCC internal operating temperature */ +				compatible = "arm,vexpress-temp"; +				arm,vexpress-sysreg,func = <4 0>; +				label = "MCC"; +			}; + +			reset@0 { +				compatible = "arm,vexpress-reset"; +				arm,vexpress-sysreg,func = <5 0>; +			}; + +			muxfpga@0 { +				compatible = "arm,vexpress-muxfpga"; +				arm,vexpress-sysreg,func = <7 0>; +			}; + +			shutdown@0 { +				compatible = "arm,vexpress-shutdown"; +				arm,vexpress-sysreg,func = <8 0>; +			}; + +			reboot@0 { +				compatible = "arm,vexpress-reboot"; +				arm,vexpress-sysreg,func = <9 0>; +			}; + +			dvimode@0 { +				compatible = "arm,vexpress-dvimode"; +				arm,vexpress-sysreg,func = <11 0>; +			}; +		};  	}; -}; diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts index d12b34ca056..a3d37ec2655 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts @@ -12,6 +12,7 @@  / {  	model = "V2P-CA15";  	arm,hbi = <0x237>; +	arm,vexpress,site = <0xf>;  	compatible = "arm,vexpress,v2p-ca15,tc1", "arm,vexpress,v2p-ca15", "arm,vexpress";  	interrupt-parent = <&gic>;  	#address-cells = <2>; @@ -54,17 +55,24 @@  		compatible = "arm,hdlcd";  		reg = <0 0x2b000000 0 0x1000>;  		interrupts = <0 85 4>; +		clocks = <&oscclk5>; +		clock-names = "pxlclk";  	};  	memory-controller@2b0a0000 {  		compatible = "arm,pl341", "arm,primecell";  		reg = <0 0x2b0a0000 0 0x1000>; +		clocks = <&oscclk7>; +		clock-names = "apb_pclk";  	};  	wdt@2b060000 {  		compatible = "arm,sp805", "arm,primecell"; +		status = "disabled";  		reg = <0 0x2b060000 0 0x1000>;  		interrupts = <98>; +		clocks = <&oscclk7>; +		clock-names = "apb_pclk";  	};  	gic: interrupt-controller@2c001000 { @@ -84,6 +92,8 @@  		reg = <0 0x7ffd0000 0 0x1000>;  		interrupts = <0 86 4>,  			     <0 87 4>; +		clocks = <&oscclk7>; +		clock-names = "apb_pclk";  	};  	dma@7ffb0000 { @@ -94,6 +104,8 @@  			     <0 89 4>,  			     <0 90 4>,  			     <0 91 4>; +		clocks = <&oscclk7>; +		clock-names = "apb_pclk";  	};  	timer { @@ -110,7 +122,109 @@  			     <0 69 4>;  	}; -	motherboard { +	dcc { +		compatible = "arm,vexpress,config-bus"; +		arm,vexpress,config-bridge = <&v2m_sysreg>; + +		osc@0 { +			/* CPU PLL reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 0>; +			freq-range = <50000000 60000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk0"; +		}; + +		osc@4 { +			/* Multiplexed AXI master clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 4>; +			freq-range = <20000000 40000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk4"; +		}; + +		oscclk5: osc@5 { +			/* HDLCD PLL reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 5>; +			freq-range = <23750000 165000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk5"; +		}; + +		smbclk: osc@6 { +			/* SMB clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 6>; +			freq-range = <20000000 50000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk6"; +		}; + +		oscclk7: osc@7 { +			/* SYS PLL reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 7>; +			freq-range = <20000000 60000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk7"; +		}; + +		osc@8 { +			/* DDR2 PLL reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 8>; +			freq-range = <40000000 40000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk8"; +		}; + +		volt@0 { +			/* CPU core voltage */ +			compatible = "arm,vexpress-volt"; +			arm,vexpress-sysreg,func = <2 0>; +			regulator-name = "Cores"; +			regulator-min-microvolt = <800000>; +			regulator-max-microvolt = <1050000>; +			regulator-always-on; +			label = "Cores"; +		}; + +		amp@0 { +			/* Total current for the two cores */ +			compatible = "arm,vexpress-amp"; +			arm,vexpress-sysreg,func = <3 0>; +			label = "Cores"; +		}; + +		temp@0 { +			/* DCC internal temperature */ +			compatible = "arm,vexpress-temp"; +			arm,vexpress-sysreg,func = <4 0>; +			label = "DCC"; +		}; + +		power@0 { +			/* Total power */ +			compatible = "arm,vexpress-power"; +			arm,vexpress-sysreg,func = <12 0>; +			label = "Cores"; +		}; + +		energy@0 { +			/* Total energy */ +			compatible = "arm,vexpress-energy"; +			arm,vexpress-sysreg,func = <13 0>; +			label = "Cores"; +		}; +	}; + +	smb { +		compatible = "simple-bus"; + +		#address-cells = <2>; +		#size-cells = <1>;  		ranges = <0 0 0 0x08000000 0x04000000>,  			 <1 0 0 0x14000000 0x04000000>,  			 <2 0 0 0x18000000 0x04000000>, @@ -118,6 +232,7 @@  			 <4 0 0 0x0c000000 0x04000000>,  			 <5 0 0 0x10000000 0x04000000>; +		#interrupt-cells = <1>;  		interrupt-map-mask = <0 0 63>;  		interrupt-map = <0 0  0 &gic 0  0 4>,  				<0 0  1 &gic 0  1 4>, @@ -162,7 +277,7 @@  				<0 0 40 &gic 0 40 4>,  				<0 0 41 &gic 0 41 4>,  				<0 0 42 &gic 0 42 4>; + +		/include/ "vexpress-v2m-rs1.dtsi"  	};  }; - -/include/ "vexpress-v2m-rs1.dtsi" diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts index 4890a81c546..1fc405a9ecf 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts @@ -12,6 +12,7 @@  / {  	model = "V2P-CA15_CA7";  	arm,hbi = <0x249>; +	arm,vexpress,site = <0xf>;  	compatible = "arm,vexpress,v2p-ca15_a7", "arm,vexpress";  	interrupt-parent = <&gic>;  	#address-cells = <2>; @@ -74,17 +75,23 @@  		compatible = "arm,sp805", "arm,primecell";  		reg = <0 0x2a490000 0 0x1000>;  		interrupts = <98>; +		clocks = <&oscclk6a>, <&oscclk6a>; +		clock-names = "wdogclk", "apb_pclk";  	};  	hdlcd@2b000000 {  		compatible = "arm,hdlcd";  		reg = <0 0x2b000000 0 0x1000>;  		interrupts = <0 85 4>; +		clocks = <&oscclk5>; +		clock-names = "pxlclk";  	};  	memory-controller@2b0a0000 {  		compatible = "arm,pl341", "arm,primecell";  		reg = <0 0x2b0a0000 0 0x1000>; +		clocks = <&oscclk6a>; +		clock-names = "apb_pclk";  	};  	gic: interrupt-controller@2c001000 { @@ -104,6 +111,8 @@  		reg = <0 0x7ffd0000 0 0x1000>;  		interrupts = <0 86 4>,  			     <0 87 4>; +		clocks = <&oscclk6a>; +		clock-names = "apb_pclk";  	};  	dma@7ff00000 { @@ -114,6 +123,8 @@  			     <0 89 4>,  			     <0 90 4>,  			     <0 91 4>; +		clocks = <&oscclk6a>; +		clock-names = "apb_pclk";  	};  	timer { @@ -130,7 +141,175 @@  			     <0 69 4>;  	}; -	motherboard { +	oscclk6a: oscclk6a { +		/* Reference 24MHz clock */ +		compatible = "fixed-clock"; +		#clock-cells = <0>; +		clock-frequency = <24000000>; +		clock-output-names = "oscclk6a"; +	}; + +	dcc { +		compatible = "arm,vexpress,config-bus"; +		arm,vexpress,config-bridge = <&v2m_sysreg>; + +		osc@0 { +			/* A15 PLL 0 reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 0>; +			freq-range = <17000000 50000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk0"; +		}; + +		osc@1 { +			/* A15 PLL 1 reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 1>; +			freq-range = <17000000 50000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk1"; +		}; + +		osc@2 { +			/* A7 PLL 0 reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 2>; +			freq-range = <17000000 50000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk2"; +		}; + +		osc@3 { +			/* A7 PLL 1 reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 3>; +			freq-range = <17000000 50000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk3"; +		}; + +		osc@4 { +			/* External AXI master clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 4>; +			freq-range = <20000000 40000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk4"; +		}; + +		oscclk5: osc@5 { +			/* HDLCD PLL reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 5>; +			freq-range = <23750000 165000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk5"; +		}; + +		smbclk: osc@6 { +			/* Static memory controller clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 6>; +			freq-range = <20000000 40000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk6"; +		}; + +		osc@7 { +			/* SYS PLL reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 7>; +			freq-range = <17000000 50000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk7"; +		}; + +		osc@8 { +			/* DDR2 PLL reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 8>; +			freq-range = <20000000 50000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk8"; +		}; + +		volt@0 { +			/* A15 CPU core voltage */ +			compatible = "arm,vexpress-volt"; +			arm,vexpress-sysreg,func = <2 0>; +			regulator-name = "A15 Vcore"; +			regulator-min-microvolt = <800000>; +			regulator-max-microvolt = <1050000>; +			regulator-always-on; +			label = "A15 Vcore"; +		}; + +		volt@1 { +			/* A7 CPU core voltage */ +			compatible = "arm,vexpress-volt"; +			arm,vexpress-sysreg,func = <2 1>; +			regulator-name = "A7 Vcore"; +			regulator-min-microvolt = <800000>; +			regulator-max-microvolt = <1050000>; +			regulator-always-on; +			label = "A7 Vcore"; +		}; + +		amp@0 { +			/* Total current for the two A15 cores */ +			compatible = "arm,vexpress-amp"; +			arm,vexpress-sysreg,func = <3 0>; +			label = "A15 Icore"; +		}; + +		amp@1 { +			/* Total current for the three A7 cores */ +			compatible = "arm,vexpress-amp"; +			arm,vexpress-sysreg,func = <3 1>; +			label = "A7 Icore"; +		}; + +		temp@0 { +			/* DCC internal temperature */ +			compatible = "arm,vexpress-temp"; +			arm,vexpress-sysreg,func = <4 0>; +			label = "DCC"; +		}; + +		power@0 { +			/* Total power for the two A15 cores */ +			compatible = "arm,vexpress-power"; +			arm,vexpress-sysreg,func = <12 0>; +			label = "A15 Pcore"; +		}; +		power@1 { +			/* Total power for the three A7 cores */ +			compatible = "arm,vexpress-power"; +			arm,vexpress-sysreg,func = <12 1>; +			label = "A7 Pcore"; +		}; + +		energy@0 { +			/* Total energy for the two A15 cores */ +			compatible = "arm,vexpress-energy"; +			arm,vexpress-sysreg,func = <13 0>; +			label = "A15 Jcore"; +		}; + +		energy@2 { +			/* Total energy for the three A7 cores */ +			compatible = "arm,vexpress-energy"; +			arm,vexpress-sysreg,func = <13 2>; +			label = "A7 Jcore"; +		}; +	}; + +	smb { +		compatible = "simple-bus"; + +		#address-cells = <2>; +		#size-cells = <1>;  		ranges = <0 0 0 0x08000000 0x04000000>,  			 <1 0 0 0x14000000 0x04000000>,  			 <2 0 0 0x18000000 0x04000000>, @@ -138,6 +317,7 @@  			 <4 0 0 0x0c000000 0x04000000>,  			 <5 0 0 0x10000000 0x04000000>; +		#interrupt-cells = <1>;  		interrupt-map-mask = <0 0 63>;  		interrupt-map = <0 0  0 &gic 0  0 4>,  				<0 0  1 &gic 0  1 4>, @@ -182,7 +362,7 @@  				<0 0 40 &gic 0 40 4>,  				<0 0 41 &gic 0 41 4>,  				<0 0 42 &gic 0 42 4>; + +		/include/ "vexpress-v2m-rs1.dtsi"  	};  }; - -/include/ "vexpress-v2m-rs1.dtsi" diff --git a/arch/arm/boot/dts/vexpress-v2p-ca5s.dts b/arch/arm/boot/dts/vexpress-v2p-ca5s.dts index 18917a0f860..6328cbc71d3 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca5s.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca5s.dts @@ -12,6 +12,7 @@  / {  	model = "V2P-CA5s";  	arm,hbi = <0x225>; +	arm,vexpress,site = <0xf>;  	compatible = "arm,vexpress,v2p-ca5s", "arm,vexpress";  	interrupt-parent = <&gic>;  	#address-cells = <1>; @@ -56,11 +57,15 @@  		compatible = "arm,hdlcd";  		reg = <0x2a110000 0x1000>;  		interrupts = <0 85 4>; +		clocks = <&oscclk3>; +		clock-names = "pxlclk";  	};  	memory-controller@2a150000 {  		compatible = "arm,pl341", "arm,primecell";  		reg = <0x2a150000 0x1000>; +		clocks = <&oscclk1>; +		clock-names = "apb_pclk";  	};  	memory-controller@2a190000 { @@ -68,6 +73,8 @@  		reg = <0x2a190000 0x1000>;  		interrupts = <0 86 4>,  			     <0 87 4>; +		clocks = <&oscclk1>; +		clock-names = "apb_pclk";  	};  	scu@2c000000 { @@ -109,7 +116,77 @@  			     <0 69 4>;  	}; -	motherboard { +	dcc { +		compatible = "arm,vexpress,config-bus"; +		arm,vexpress,config-bridge = <&v2m_sysreg>; + +		osc@0 { +			/* CPU and internal AXI reference clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 0>; +			freq-range = <50000000 100000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk0"; +		}; + +		oscclk1: osc@1 { +			/* Multiplexed AXI master clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 1>; +			freq-range = <5000000 50000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk1"; +		}; + +		osc@2 { +			/* DDR2 */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 2>; +			freq-range = <80000000 120000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk2"; +		}; + +		oscclk3: osc@3 { +			/* HDLCD */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 3>; +			freq-range = <23750000 165000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk3"; +		}; + +		osc@4 { +			/* Test chip gate configuration */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 4>; +			freq-range = <80000000 80000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk4"; +		}; + +		smbclk: osc@5 { +			/* SMB clock */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 5>; +			freq-range = <25000000 60000000>; +			#clock-cells = <0>; +			clock-output-names = "oscclk5"; +		}; + +		temp@0 { +			/* DCC internal operating temperature */ +			compatible = "arm,vexpress-temp"; +			arm,vexpress-sysreg,func = <4 0>; +			label = "DCC"; +		}; +	}; + +	smb { +		compatible = "simple-bus"; + +		#address-cells = <2>; +		#size-cells = <1>;  		ranges = <0 0 0x08000000 0x04000000>,  			 <1 0 0x14000000 0x04000000>,  			 <2 0 0x18000000 0x04000000>, @@ -117,6 +194,7 @@  			 <4 0 0x0c000000 0x04000000>,  			 <5 0 0x10000000 0x04000000>; +		#interrupt-cells = <1>;  		interrupt-map-mask = <0 0 63>;  		interrupt-map = <0 0  0 &gic 0  0 4>,  				<0 0  1 &gic 0  1 4>, @@ -161,7 +239,7 @@  				<0 0 40 &gic 0 40 4>,  				<0 0 41 &gic 0 41 4>,  				<0 0 42 &gic 0 42 4>; + +		/include/ "vexpress-v2m-rs1.dtsi"  	};  }; - -/include/ "vexpress-v2m-rs1.dtsi" diff --git a/arch/arm/boot/dts/vexpress-v2p-ca9.dts b/arch/arm/boot/dts/vexpress-v2p-ca9.dts index 3f0c736d31d..1420bb14d95 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca9.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca9.dts @@ -12,6 +12,7 @@  / {  	model = "V2P-CA9";  	arm,hbi = <0x191>; +	arm,vexpress,site = <0xf>;  	compatible = "arm,vexpress,v2p-ca9", "arm,vexpress";  	interrupt-parent = <&gic>;  	#address-cells = <1>; @@ -70,11 +71,15 @@  		compatible = "arm,pl111", "arm,primecell";  		reg = <0x10020000 0x1000>;  		interrupts = <0 44 4>; +		clocks = <&oscclk1>, <&oscclk2>; +		clock-names = "clcdclk", "apb_pclk";  	};  	memory-controller@100e0000 {  		compatible = "arm,pl341", "arm,primecell";  		reg = <0x100e0000 0x1000>; +		clocks = <&oscclk2>; +		clock-names = "apb_pclk";  	};  	memory-controller@100e1000 { @@ -82,6 +87,8 @@  		reg = <0x100e1000 0x1000>;  		interrupts = <0 45 4>,  			     <0 46 4>; +		clocks = <&oscclk2>; +		clock-names = "apb_pclk";  	};  	timer@100e4000 { @@ -89,12 +96,16 @@  		reg = <0x100e4000 0x1000>;  		interrupts = <0 48 4>,  			     <0 49 4>; +		clocks = <&oscclk2>, <&oscclk2>; +		clock-names = "timclk", "apb_pclk";  	};  	watchdog@100e5000 {  		compatible = "arm,sp805", "arm,primecell";  		reg = <0x100e5000 0x1000>;  		interrupts = <0 51 4>; +		clocks = <&oscclk2>, <&oscclk2>; +		clock-names = "wdogclk", "apb_pclk";  	};  	scu@1e000000 { @@ -140,13 +151,132 @@  			     <0 63 4>;  	}; -	motherboard { +	dcc { +		compatible = "arm,vexpress,config-bus"; +		arm,vexpress,config-bridge = <&v2m_sysreg>; + +		osc@0 { +			/* ACLK clock to the AXI master port on the test chip */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 0>; +			freq-range = <30000000 50000000>; +			#clock-cells = <0>; +			clock-output-names = "extsaxiclk"; +		}; + +		oscclk1: osc@1 { +			/* Reference clock for the CLCD */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 1>; +			freq-range = <10000000 80000000>; +			#clock-cells = <0>; +			clock-output-names = "clcdclk"; +		}; + +		smbclk: oscclk2: osc@2 { +			/* Reference clock for the test chip internal PLLs */ +			compatible = "arm,vexpress-osc"; +			arm,vexpress-sysreg,func = <1 2>; +			freq-range = <33000000 100000000>; +			#clock-cells = <0>; +			clock-output-names = "tcrefclk"; +		}; + +		volt@0 { +			/* Test Chip internal logic voltage */ +			compatible = "arm,vexpress-volt"; +			arm,vexpress-sysreg,func = <2 0>; +			regulator-name = "VD10"; +			regulator-always-on; +			label = "VD10"; +		}; + +		volt@1 { +			/* PL310, L2 cache, RAM cell supply (not PL310 logic) */ +			compatible = "arm,vexpress-volt"; +			arm,vexpress-sysreg,func = <2 1>; +			regulator-name = "VD10_S2"; +			regulator-always-on; +			label = "VD10_S2"; +		}; + +		volt@2 { +			/* Cortex-A9 system supply, Cores, MPEs, SCU and PL310 logic */ +			compatible = "arm,vexpress-volt"; +			arm,vexpress-sysreg,func = <2 2>; +			regulator-name = "VD10_S3"; +			regulator-always-on; +			label = "VD10_S3"; +		}; + +		volt@3 { +			/* DDR2 SDRAM and Test Chip DDR2 I/O supply */ +			compatible = "arm,vexpress-volt"; +			arm,vexpress-sysreg,func = <2 3>; +			regulator-name = "VCC1V8"; +			regulator-always-on; +			label = "VCC1V8"; +		}; + +		volt@4 { +			/* DDR2 SDRAM VTT termination voltage */ +			compatible = "arm,vexpress-volt"; +			arm,vexpress-sysreg,func = <2 4>; +			regulator-name = "DDR2VTT"; +			regulator-always-on; +			label = "DDR2VTT"; +		}; + +		volt@5 { +			/* Local board supply for miscellaneous logic external to the Test Chip */ +			arm,vexpress-sysreg,func = <2 5>; +			compatible = "arm,vexpress-volt"; +			regulator-name = "VCC3V3"; +			regulator-always-on; +			label = "VCC3V3"; +		}; + +		amp@0 { +			/* PL310, L2 cache, RAM cell supply (not PL310 logic) */ +			compatible = "arm,vexpress-amp"; +			arm,vexpress-sysreg,func = <3 0>; +			label = "VD10_S2"; +		}; + +		amp@1 { +			/* Cortex-A9 system supply, Cores, MPEs, SCU and PL310 logic */ +			compatible = "arm,vexpress-amp"; +			arm,vexpress-sysreg,func = <3 1>; +			label = "VD10_S3"; +		}; + +		power@0 { +			/* PL310, L2 cache, RAM cell supply (not PL310 logic) */ +			compatible = "arm,vexpress-power"; +			arm,vexpress-sysreg,func = <12 0>; +			label = "PVD10_S2"; +		}; + +		power@1 { +			/* Cortex-A9 system supply, Cores, MPEs, SCU and PL310 logic */ +			compatible = "arm,vexpress-power"; +			arm,vexpress-sysreg,func = <12 1>; +			label = "PVD10_S3"; +		}; +	}; + +	smb { +		compatible = "simple-bus"; + +		#address-cells = <2>; +		#size-cells = <1>;  		ranges = <0 0 0x40000000 0x04000000>,  			 <1 0 0x44000000 0x04000000>,  			 <2 0 0x48000000 0x04000000>,  			 <3 0 0x4c000000 0x04000000>,  			 <7 0 0x10000000 0x00020000>; +		#interrupt-cells = <1>;  		interrupt-map-mask = <0 0 63>;  		interrupt-map = <0 0  0 &gic 0  0 4>,  				<0 0  1 &gic 0  1 4>, @@ -191,7 +321,7 @@  				<0 0 40 &gic 0 40 4>,  				<0 0 41 &gic 0 41 4>,  				<0 0 42 &gic 0 42 4>; + +		/include/ "vexpress-v2m.dtsi"  	};  }; - -/include/ "vexpress-v2m.dtsi" diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index aa526998418..36ae03a3f5d 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c @@ -70,6 +70,14 @@ struct gic_chip_data {  static DEFINE_RAW_SPINLOCK(irq_controller_lock);  /* + * The GIC mapping of CPU interfaces does not necessarily match + * the logical CPU numbering.  Let's use a mapping as returned + * by the GIC itself. + */ +#define NR_GIC_CPU_IF 8 +static u8 gic_cpu_map[NR_GIC_CPU_IF] __read_mostly; + +/*   * Supported arch specific GIC irq extension.   * Default make them NULL.   */ @@ -238,11 +246,11 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,  	unsigned int cpu = cpumask_any_and(mask_val, cpu_online_mask);  	u32 val, mask, bit; -	if (cpu >= 8 || cpu >= nr_cpu_ids) +	if (cpu >= NR_GIC_CPU_IF || cpu >= nr_cpu_ids)  		return -EINVAL;  	mask = 0xff << shift; -	bit = 1 << (cpu_logical_map(cpu) + shift); +	bit = gic_cpu_map[cpu] << shift;  	raw_spin_lock(&irq_controller_lock);  	val = readl_relaxed(reg) & ~mask; @@ -349,11 +357,6 @@ static void __init gic_dist_init(struct gic_chip_data *gic)  	u32 cpumask;  	unsigned int gic_irqs = gic->gic_irqs;  	void __iomem *base = gic_data_dist_base(gic); -	u32 cpu = cpu_logical_map(smp_processor_id()); - -	cpumask = 1 << cpu; -	cpumask |= cpumask << 8; -	cpumask |= cpumask << 16;  	writel_relaxed(0, base + GIC_DIST_CTRL); @@ -366,6 +369,7 @@ static void __init gic_dist_init(struct gic_chip_data *gic)  	/*  	 * Set all global interrupts to this CPU only.  	 */ +	cpumask = readl_relaxed(base + GIC_DIST_TARGET + 0);  	for (i = 32; i < gic_irqs; i += 4)  		writel_relaxed(cpumask, base + GIC_DIST_TARGET + i * 4 / 4); @@ -389,9 +393,25 @@ static void __cpuinit gic_cpu_init(struct gic_chip_data *gic)  {  	void __iomem *dist_base = gic_data_dist_base(gic);  	void __iomem *base = gic_data_cpu_base(gic); +	unsigned int cpu_mask, cpu = smp_processor_id();  	int i;  	/* +	 * Get what the GIC says our CPU mask is. +	 */ +	BUG_ON(cpu >= NR_GIC_CPU_IF); +	cpu_mask = readl_relaxed(dist_base + GIC_DIST_TARGET + 0); +	gic_cpu_map[cpu] = cpu_mask; + +	/* +	 * Clear our mask from the other map entries in case they're +	 * still undefined. +	 */ +	for (i = 0; i < NR_GIC_CPU_IF; i++) +		if (i != cpu) +			gic_cpu_map[i] &= ~cpu_mask; + +	/*  	 * Deal with the banked PPI and SGI interrupts - disable all  	 * PPI interrupts, ensure all SGI interrupts are enabled.  	 */ @@ -646,7 +666,7 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,  {  	irq_hw_number_t hwirq_base;  	struct gic_chip_data *gic; -	int gic_irqs, irq_base; +	int gic_irqs, irq_base, i;  	BUG_ON(gic_nr >= MAX_GIC_NR); @@ -683,6 +703,13 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,  	}  	/* +	 * Initialize the CPU interface map to all CPUs. +	 * It will be refined as each CPU probes its ID. +	 */ +	for (i = 0; i < NR_GIC_CPU_IF; i++) +		gic_cpu_map[i] = 0xff; + +	/*  	 * For primary GICs, skip over SGIs.  	 * For secondary GICs, skip over PPIs, too.  	 */ @@ -737,7 +764,7 @@ void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)  	/* Convert our logical CPU mask into a physical one. */  	for_each_cpu(cpu, mask) -		map |= 1 << cpu_logical_map(cpu); +		map |= gic_cpu_map[cpu];  	/*  	 * Ensure that stores to Normal memory are visible to the diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c index df13a3ffff3..9d2d3ba339f 100644 --- a/arch/arm/common/timer-sp.c +++ b/arch/arm/common/timer-sp.c @@ -162,7 +162,6 @@ static struct clock_event_device sp804_clockevent = {  	.set_mode	= sp804_set_mode,  	.set_next_event	= sp804_set_next_event,  	.rating		= 300, -	.cpumask	= cpu_all_mask,  };  static struct irqaction sp804_timer_irq = { @@ -185,6 +184,7 @@ void __init sp804_clockevents_init(void __iomem *base, unsigned int irq,  	clkevt_reload = DIV_ROUND_CLOSEST(rate, HZ);  	evt->name = name;  	evt->irq = irq; +	evt->cpumask = cpu_possible_mask;  	setup_irq(irq, &sp804_timer_irq);  	clockevents_config_and_register(evt, rate, 0xf, 0xffffffff); diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c index e0d538803cc..e4df17ca90c 100644 --- a/arch/arm/common/vic.c +++ b/arch/arm/common/vic.c @@ -218,7 +218,7 @@ static void __init vic_register(void __iomem *base, unsigned int irq,  	v->resume_sources = resume_sources;  	v->irq = irq;  	vic_id++; -	v->domain = irq_domain_add_legacy(node, fls(valid_sources), irq, 0, +	v->domain = irq_domain_add_simple(node, fls(valid_sources), irq,  					  &vic_irqdomain_ops, v);  } @@ -350,7 +350,7 @@ static void __init vic_init_st(void __iomem *base, unsigned int irq_start,  	vic_register(base, irq_start, vic_sources, 0, node);  } -void __init __vic_init(void __iomem *base, unsigned int irq_start, +void __init __vic_init(void __iomem *base, int irq_start,  			      u32 vic_sources, u32 resume_sources,  			      struct device_node *node)  { @@ -407,7 +407,6 @@ void __init vic_init(void __iomem *base, unsigned int irq_start,  int __init vic_of_init(struct device_node *node, struct device_node *parent)  {  	void __iomem *regs; -	int irq_base;  	if (WARN(parent, "non-root VICs are not supported"))  		return -EINVAL; @@ -416,18 +415,12 @@ int __init vic_of_init(struct device_node *node, struct device_node *parent)  	if (WARN_ON(!regs))  		return -EIO; -	irq_base = irq_alloc_descs(-1, 0, 32, numa_node_id()); -	if (WARN_ON(irq_base < 0)) -		goto out_unmap; - -	__vic_init(regs, irq_base, ~0, ~0, node); +	/* +	 * Passing -1 as first IRQ makes the simple domain allocate descriptors +	 */ +	__vic_init(regs, -1, ~0, ~0, node);  	return 0; - - out_unmap: -	iounmap(regs); - -	return -EIO;  }  #endif /* CONFIG OF */ diff --git a/arch/arm/configs/afeb9260_defconfig b/arch/arm/configs/afeb9260_defconfig deleted file mode 100644 index c285a9d777d..00000000000 --- a/arch/arm/configs/afeb9260_defconfig +++ /dev/null @@ -1,106 +0,0 @@ -CONFIG_EXPERIMENTAL=y -# CONFIG_LOCALVERSION_AUTO is not set -CONFIG_SYSVIPC=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_BLK_DEV_INITRD=y -CONFIG_SLAB=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_BLK_DEV_BSG is not set -# CONFIG_IOSCHED_DEADLINE is not set -# CONFIG_IOSCHED_CFQ is not set -CONFIG_ARCH_AT91=y -CONFIG_ARCH_AT91SAM9260=y -CONFIG_MACH_AFEB9260=y -CONFIG_AT91_PROGRAMMABLE_CLOCKS=y -CONFIG_PREEMPT=y -CONFIG_AEABI=y -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw" -CONFIG_FPE_NWFPE=y -CONFIG_NET=y -CONFIG_PACKET=y -CONFIG_UNIX=y -CONFIG_INET=y -CONFIG_IP_PNP=y -CONFIG_IP_PNP_BOOTP=y -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set -# CONFIG_INET_LRO is not set -# CONFIG_IPV6 is not set -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_DATAFLASH=y -CONFIG_MTD_NAND=y -CONFIG_MTD_NAND_ATMEL=y -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=8192 -CONFIG_ATMEL_SSC=y -CONFIG_EEPROM_AT24=y -CONFIG_SCSI=y -CONFIG_BLK_DEV_SD=y -CONFIG_SCSI_MULTI_LUN=y -CONFIG_NETDEVICES=y -CONFIG_NET_ETHERNET=y -CONFIG_MII=y -CONFIG_MACB=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -CONFIG_SERIAL_ATMEL=y -CONFIG_SERIAL_ATMEL_CONSOLE=y -# CONFIG_HW_RANDOM is not set -CONFIG_I2C=y -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_GPIO=y -CONFIG_SPI=y -CONFIG_SPI_DEBUG=y -CONFIG_SPI_ATMEL=y -CONFIG_SPI_SPIDEV=y -# CONFIG_HWMON is not set -CONFIG_WATCHDOG=y -CONFIG_WATCHDOG_NOWAYOUT=y -# CONFIG_VGA_CONSOLE is not set -# CONFIG_USB_HID is not set -CONFIG_USB=y -CONFIG_USB_DEVICEFS=y -CONFIG_USB_MON=y -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_STORAGE=y -CONFIG_USB_GADGET=y -CONFIG_USB_ZERO=m -CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m -CONFIG_USB_G_SERIAL=m -CONFIG_RTC_CLASS=y -CONFIG_RTC_DEBUG=y -CONFIG_RTC_DRV_FM3130=y -CONFIG_EXT2_FS=y -CONFIG_EXT3_FS=y -CONFIG_INOTIFY=y -CONFIG_VFAT_FS=y -CONFIG_TMPFS=y -CONFIG_JFFS2_FS=y -CONFIG_CRAMFS=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_ROOT_NFS=y -CONFIG_NLS_CODEPAGE_437=y -CONFIG_NLS_CODEPAGE_850=y -CONFIG_NLS_ISO8859_1=y -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_INFO=y -CONFIG_SYSCTL_SYSCALL_CHECK=y -# CONFIG_FTRACE is not set -CONFIG_DEBUG_USER=y -CONFIG_DEBUG_LL=y -CONFIG_CRC_T10DIF=y diff --git a/arch/arm/configs/ap4evb_defconfig b/arch/arm/configs/ap4evb_defconfig index 2eef85e3c9b..66894f736d0 100644 --- a/arch/arm/configs/ap4evb_defconfig +++ b/arch/arm/configs/ap4evb_defconfig @@ -46,7 +46,6 @@ CONFIG_SERIAL_SH_SCI_CONSOLE=y  # CONFIG_HID_SUPPORT is not set  # CONFIG_USB_SUPPORT is not set  # CONFIG_DNOTIFY is not set -# CONFIG_INOTIFY_USER is not set  CONFIG_TMPFS=y  # CONFIG_MISC_FILESYSTEMS is not set  CONFIG_MAGIC_SYSRQ=y diff --git a/arch/arm/configs/armadillo800eva_defconfig b/arch/arm/configs/armadillo800eva_defconfig index f78d259f8d2..2e1a8257720 100644 --- a/arch/arm/configs/armadillo800eva_defconfig +++ b/arch/arm/configs/armadillo800eva_defconfig @@ -7,6 +7,7 @@ CONFIG_LOG_BUF_SHIFT=16  # CONFIG_IPC_NS is not set  # CONFIG_PID_NS is not set  CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_PERF_EVENTS=y  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y @@ -20,7 +21,7 @@ CONFIG_MACH_ARMADILLO800EVA=y  # CONFIG_SH_TIMER_TMU is not set  CONFIG_ARM_THUMB=y  CONFIG_CPU_BPREDICT_DISABLE=y -# CONFIG_CACHE_L2X0 is not set +CONFIG_CACHE_L2X0=y  CONFIG_ARM_ERRATA_430973=y  CONFIG_ARM_ERRATA_458693=y  CONFIG_ARM_ERRATA_460075=y diff --git a/arch/arm/configs/at91_dt_defconfig b/arch/arm/configs/at91_dt_defconfig index 67bc571ed0c..b175577d7ab 100644 --- a/arch/arm/configs/at91_dt_defconfig +++ b/arch/arm/configs/at91_dt_defconfig @@ -111,6 +111,7 @@ CONFIG_I2C=y  CONFIG_I2C_GPIO=y  CONFIG_SPI=y  CONFIG_SPI_ATMEL=y +CONFIG_PINCTRL_AT91=y  # CONFIG_HWMON is not set  CONFIG_WATCHDOG=y  CONFIG_AT91SAM9X_WATCHDOG=y diff --git a/arch/arm/configs/at91sam9260_defconfig b/arch/arm/configs/at91sam9260_defconfig index 505b3765f87..0ea5d2c97fc 100644 --- a/arch/arm/configs/at91sam9260_defconfig +++ b/arch/arm/configs/at91sam9260_defconfig @@ -75,7 +75,7 @@ CONFIG_USB_STORAGE_DEBUG=y  CONFIG_USB_GADGET=y  CONFIG_USB_ZERO=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_AT91SAM9=y diff --git a/arch/arm/configs/at91sam9261_defconfig b/arch/arm/configs/at91sam9261_defconfig index 1e8712ef062..c87beb973b3 100644 --- a/arch/arm/configs/at91sam9261_defconfig +++ b/arch/arm/configs/at91sam9261_defconfig @@ -125,7 +125,7 @@ CONFIG_USB_GADGET=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_MMC=y  CONFIG_MMC_ATMELMCI=m diff --git a/arch/arm/configs/at91sam9263_defconfig b/arch/arm/configs/at91sam9263_defconfig index d2050cada82..c5212f43eee 100644 --- a/arch/arm/configs/at91sam9263_defconfig +++ b/arch/arm/configs/at91sam9263_defconfig @@ -133,7 +133,7 @@ CONFIG_USB_GADGET=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_MMC=y  CONFIG_SDIO_UART=m diff --git a/arch/arm/configs/at91sam9g20_defconfig b/arch/arm/configs/at91sam9g20_defconfig index e1b0e80b54a..3b1881033ad 100644 --- a/arch/arm/configs/at91sam9g20_defconfig +++ b/arch/arm/configs/at91sam9g20_defconfig @@ -96,7 +96,7 @@ CONFIG_USB_STORAGE=y  CONFIG_USB_GADGET=y  CONFIG_USB_ZERO=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_MMC=y  CONFIG_MMC_ATMELMCI=m diff --git a/arch/arm/configs/bcm2835_defconfig b/arch/arm/configs/bcm2835_defconfig index 7aea70253c6..74e27f0ff6a 100644 --- a/arch/arm/configs/bcm2835_defconfig +++ b/arch/arm/configs/bcm2835_defconfig @@ -66,8 +66,6 @@ CONFIG_TTY_PRINTK=y  # CONFIG_FILE_LOCKING is not set  # CONFIG_DNOTIFY is not set  # CONFIG_INOTIFY_USER is not set -# CONFIG_PROC_FS is not set -# CONFIG_SYSFS is not set  # CONFIG_MISC_FILESYSTEMS is not set  CONFIG_PRINTK_TIME=y  # CONFIG_ENABLE_WARN_DEPRECATED is not set diff --git a/arch/arm/configs/bcm_defconfig b/arch/arm/configs/bcm_defconfig new file mode 100644 index 00000000000..e3bf2d65618 --- /dev/null +++ b/arch/arm/configs/bcm_defconfig @@ -0,0 +1,114 @@ +CONFIG_EXPERIMENTAL=y +# CONFIG_LOCALVERSION_AUTO is not set +# CONFIG_SWAP is not set +CONFIG_SYSVIPC=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=19 +CONFIG_CGROUPS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +CONFIG_CGROUP_SCHED=y +CONFIG_BLK_CGROUP=y +CONFIG_NAMESPACES=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_EMBEDDED=y +# CONFIG_COMPAT_BRK is not set +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_BLK_DEV_BSG is not set +CONFIG_PARTITION_ADVANCED=y +CONFIG_EFI_PARTITION=y +CONFIG_ARCH_BCM=y +CONFIG_ARM_THUMBEE=y +CONFIG_ARM_ERRATA_743622=y +CONFIG_PREEMPT=y +CONFIG_AEABI=y +# CONFIG_OABI_COMPAT is not set +# CONFIG_COMPACTION is not set +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_ARM_APPENDED_DTB=y +CONFIG_CMDLINE="console=ttyS0,115200n8 mem=128M" +CONFIG_CPU_IDLE=y +CONFIG_VFP=y +CONFIG_NEON=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_PM_RUNTIME=y +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_PROC_DEVICETREE=y +# CONFIG_BLK_DEV is not set +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_INPUT_FF_MEMLESS=y +CONFIG_INPUT_JOYDEV=y +CONFIG_INPUT_EVDEV=y +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=y +# CONFIG_SERIO is not set +# CONFIG_LEGACY_PTYS is not set +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_8250_RSA=y +CONFIG_SERIAL_8250_DW=y +CONFIG_HW_RANDOM=y +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=y +# CONFIG_HWMON is not set +CONFIG_VIDEO_OUTPUT_CONTROL=y +CONFIG_FB=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_LCD_CLASS_DEVICE=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_USB_SUPPORT is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_AUTOFS4_FS=y +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_CONFIGFS_FS=y +# CONFIG_MISC_FILESYSTEMS is not set +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_FS=y +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=110 +CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y +CONFIG_DEBUG_INFO=y +# CONFIG_FTRACE is not set +CONFIG_DEBUG_LL=y +CONFIG_CRC_CCITT=y +CONFIG_CRC_T10DIF=y +CONFIG_CRC_ITU_T=y +CONFIG_CRC7=y +CONFIG_XZ_DEC=y +CONFIG_AVERAGE=y diff --git a/arch/arm/configs/cam60_defconfig b/arch/arm/configs/cam60_defconfig deleted file mode 100644 index 14579711d8f..00000000000 --- a/arch/arm/configs/cam60_defconfig +++ /dev/null @@ -1,173 +0,0 @@ -CONFIG_EXPERIMENTAL=y -# CONFIG_LOCALVERSION_AUTO is not set -CONFIG_SYSVIPC=y -CONFIG_POSIX_MQUEUE=y -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_BSD_PROCESS_ACCT_V3=y -CONFIG_AUDIT=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -CONFIG_KALLSYMS_ALL=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -CONFIG_MODVERSIONS=y -# CONFIG_BLK_DEV_BSG is not set -CONFIG_ARCH_AT91=y -CONFIG_ARCH_AT91SAM9260=y -CONFIG_MACH_CAM60=y -CONFIG_ZBOOT_ROM_BSS=0x20004000 -CONFIG_CMDLINE="console=ttyS0,115200 noinitrd root=/dev/mtdblock0 rootfstype=jffs2 mem=64M" -CONFIG_FPE_NWFPE=y -CONFIG_BINFMT_AOUT=y -CONFIG_BINFMT_MISC=y -CONFIG_PACKET=y -CONFIG_UNIX=y -CONFIG_INET=y -CONFIG_IP_MULTICAST=y -CONFIG_IP_PNP=y -CONFIG_IP_PNP_DHCP=y -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set -# CONFIG_INET_LRO is not set -# CONFIG_INET_DIAG is not set -# CONFIG_IPV6 is not set -CONFIG_NETWORK_SECMARK=y -CONFIG_CFG80211=m -CONFIG_MAC80211=m -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -CONFIG_MTD=y -CONFIG_MTD_CONCAT=y -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_CMDLINE_PARTS=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_CFI=y -CONFIG_MTD_COMPLEX_MAPPINGS=y -CONFIG_MTD_PLATRAM=m -CONFIG_MTD_DATAFLASH=y -CONFIG_MTD_NAND=y -CONFIG_MTD_NAND_ATMEL=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_RAM=y -# CONFIG_MISC_DEVICES is not set -CONFIG_SCSI=y -CONFIG_SCSI_TGT=y -CONFIG_BLK_DEV_SD=y -CONFIG_CHR_DEV_SG=y -CONFIG_CHR_DEV_SCH=y -CONFIG_SCSI_MULTI_LUN=y -CONFIG_SCSI_LOGGING=y -CONFIG_SCSI_SCAN_ASYNC=y -CONFIG_SCSI_SPI_ATTRS=m -CONFIG_SCSI_FC_ATTRS=m -CONFIG_SCSI_ISCSI_ATTRS=m -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -# CONFIG_SCSI_LOWLEVEL is not set -CONFIG_NETDEVICES=y -CONFIG_MARVELL_PHY=m -CONFIG_DAVICOM_PHY=m -CONFIG_QSEMI_PHY=m -CONFIG_LXT_PHY=m -CONFIG_CICADA_PHY=m -CONFIG_VITESSE_PHY=m -CONFIG_SMSC_PHY=m -CONFIG_BROADCOM_PHY=m -CONFIG_NET_ETHERNET=y -CONFIG_MII=y -CONFIG_MACB=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set -CONFIG_INPUT_EVDEV=y -CONFIG_KEYBOARD_LKKBD=m -CONFIG_KEYBOARD_NEWTON=m -CONFIG_KEYBOARD_STOWAWAY=m -CONFIG_KEYBOARD_SUNKBD=m -CONFIG_KEYBOARD_XTKBD=m -CONFIG_MOUSE_SERIAL=m -CONFIG_MOUSE_APPLETOUCH=m -CONFIG_MOUSE_VSXXXAA=m -# CONFIG_SERIO_SERPORT is not set -CONFIG_VT_HW_CONSOLE_BINDING=y -CONFIG_SERIAL_NONSTANDARD=y -CONFIG_SERIAL_ATMEL=y -CONFIG_SERIAL_ATMEL_CONSOLE=y -# CONFIG_LEGACY_PTYS is not set -CONFIG_HW_RANDOM=y -CONFIG_I2C=y -CONFIG_I2C_CHARDEV=y -CONFIG_SPI=y -CONFIG_SPI_ATMEL=y -# CONFIG_HWMON is not set -# CONFIG_VGA_CONSOLE is not set -# CONFIG_HID_SUPPORT is not set -CONFIG_USB=y -CONFIG_USB_DEVICEFS=y -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_STORAGE=y -CONFIG_USB_LIBUSUAL=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_INTF_DEV_UIE_EMUL=y -CONFIG_RTC_DRV_TEST=m -CONFIG_RTC_DRV_AT91SAM9=y -CONFIG_EXT2_FS=y -CONFIG_EXT2_FS_XATTR=y -CONFIG_EXT2_FS_POSIX_ACL=y -CONFIG_EXT3_FS=y -CONFIG_INOTIFY=y -CONFIG_QUOTA=y -CONFIG_AUTOFS_FS=y -CONFIG_AUTOFS4_FS=y -CONFIG_MSDOS_FS=y -CONFIG_VFAT_FS=y -CONFIG_TMPFS=y -CONFIG_CONFIGFS_FS=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_ROOT_NFS=y -CONFIG_NLS_DEFAULT="cp437" -CONFIG_NLS_CODEPAGE_437=y -CONFIG_NLS_ASCII=y -CONFIG_NLS_ISO8859_1=y -CONFIG_NLS_UTF8=y -CONFIG_PRINTK_TIME=y -# CONFIG_ENABLE_MUST_CHECK is not set -CONFIG_MAGIC_SYSRQ=y -CONFIG_UNUSED_SYMBOLS=y -CONFIG_DEBUG_KERNEL=y -CONFIG_BLK_DEV_IO_TRACE=y -CONFIG_DEBUG_LL=y -CONFIG_CRYPTO=y -CONFIG_CRYPTO_NULL=m -CONFIG_CRYPTO_CRYPTD=m -CONFIG_CRYPTO_TEST=m -CONFIG_CRYPTO_CBC=m -CONFIG_CRYPTO_LRW=m -CONFIG_CRYPTO_PCBC=m -CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_MICHAEL_MIC=m -CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA256=y -CONFIG_CRYPTO_SHA512=y -CONFIG_CRYPTO_TGR192=m -CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_ANUBIS=m -CONFIG_CRYPTO_BLOWFISH=m -CONFIG_CRYPTO_CAMELLIA=m -CONFIG_CRYPTO_CAST5=m -CONFIG_CRYPTO_CAST6=m -CONFIG_CRYPTO_DES=y -CONFIG_CRYPTO_FCRYPT=m -CONFIG_CRYPTO_KHAZAD=m -CONFIG_CRYPTO_SERPENT=m -CONFIG_CRYPTO_TEA=m -CONFIG_CRYPTO_TWOFISH=m -CONFIG_CRYPTO_DEFLATE=m -# CONFIG_CRYPTO_HW is not set -CONFIG_CRC32=m -CONFIG_LIBCRC32C=m diff --git a/arch/arm/configs/clps711x_defconfig b/arch/arm/configs/clps711x_defconfig new file mode 100644 index 00000000000..1cd94c36321 --- /dev/null +++ b/arch/arm/configs/clps711x_defconfig @@ -0,0 +1,90 @@ +CONFIG_KERNEL_LZMA=y +CONFIG_SYSVIPC=y +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_BLK_DEV_INITRD=y +CONFIG_RD_LZMA=y +CONFIG_EMBEDDED=y +CONFIG_SLOB=y +CONFIG_JUMP_LABEL=y +# CONFIG_LBDAF is not set +CONFIG_PARTITION_ADVANCED=y +# CONFIG_IOSCHED_CFQ is not set +CONFIG_ARCH_CLPS711X=y +CONFIG_ARCH_AUTCPU12=y +CONFIG_ARCH_CDB89712=y +CONFIG_ARCH_CLEP7312=y +CONFIG_ARCH_EDB7211=y +CONFIG_ARCH_P720T=y +CONFIG_ARCH_FORTUNET=y +CONFIG_AEABI=y +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +# CONFIG_COREDUMP is not set +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IPV6 is not set +CONFIG_IRDA=y +CONFIG_IRTTY_SIR=y +CONFIG_EP7211_DONGLE=y +# CONFIG_WIRELESS is not set +CONFIG_MTD=y +CONFIG_MTD_CMDLINE_PARTS=y +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +CONFIG_MTD_CFI=y +CONFIG_MTD_JEDECPROBE=y +CONFIG_MTD_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +CONFIG_MTD_CFI_STAA=y +CONFIG_MTD_AUTCPU12=y +CONFIG_MTD_PLATRAM=y +CONFIG_MTD_NAND=y +CONFIG_MTD_NAND_GPIO=y +CONFIG_NETDEVICES=y +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_CHELSIO is not set +CONFIG_CS89x0=y +CONFIG_CS89x0_PLATFORM=y +# CONFIG_NET_VENDOR_FARADAY is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SMSC is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set +# CONFIG_WLAN is not set +# CONFIG_INPUT is not set +# CONFIG_SERIO is not set +# CONFIG_VT is not set +CONFIG_SERIAL_CLPS711X_CONSOLE=y +# CONFIG_HW_RANDOM is not set +CONFIG_SPI=y +CONFIG_GPIO_GENERIC_PLATFORM=y +# CONFIG_HWMON is not set +CONFIG_FB=y +CONFIG_FB_CLPS711X=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_LCD_PLATFORM=y +# CONFIG_USB_SUPPORT is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_EXT2_FS=y +CONFIG_CRAMFS=y +CONFIG_MINIX_FS=y +# CONFIG_NETWORK_FILESYSTEMS is not set +# CONFIG_FTRACE is not set +CONFIG_DEBUG_USER=y +CONFIG_DEBUG_LL=y +CONFIG_EARLY_PRINTK=y +# CONFIG_CRYPTO_ANSI_CPRNG is not set +# CONFIG_CRYPTO_HW is not set +# CONFIG_CRC32 is not set diff --git a/arch/arm/configs/corgi_defconfig b/arch/arm/configs/corgi_defconfig index 4b8a25d9e68..1fd1d1de322 100644 --- a/arch/arm/configs/corgi_defconfig +++ b/arch/arm/configs/corgi_defconfig @@ -218,7 +218,7 @@ CONFIG_USB_GADGET=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_MMC=y  CONFIG_MMC_PXA=y diff --git a/arch/arm/configs/cpu9260_defconfig b/arch/arm/configs/cpu9260_defconfig deleted file mode 100644 index 921480c23b9..00000000000 --- a/arch/arm/configs/cpu9260_defconfig +++ /dev/null @@ -1,116 +0,0 @@ -CONFIG_EXPERIMENTAL=y -# CONFIG_LOCALVERSION_AUTO is not set -# CONFIG_SWAP is not set -CONFIG_SYSVIPC=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_BLK_DEV_BSG is not set -# CONFIG_IOSCHED_CFQ is not set -CONFIG_ARCH_AT91=y -CONFIG_ARCH_AT91SAM9260=y -CONFIG_MACH_CPU9260=y -# CONFIG_ARM_THUMB is not set -CONFIG_PREEMPT=y -CONFIG_AEABI=y -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_NET=y -CONFIG_PACKET=y -CONFIG_UNIX=y -CONFIG_INET=y -CONFIG_IP_PNP=y -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set -# CONFIG_IPV6 is not set -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_CMDLINE_PARTS=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_CFI=y -CONFIG_MTD_CFI_INTELEXT=y -CONFIG_MTD_PHYSMAP=y -CONFIG_MTD_PLATRAM=y -CONFIG_MTD_NAND=y -CONFIG_MTD_NAND_ATMEL=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_NBD=y -CONFIG_BLK_DEV_RAM=y -# CONFIG_MISC_DEVICES is not set -CONFIG_SCSI=y -CONFIG_BLK_DEV_SD=y -CONFIG_SCSI_MULTI_LUN=y -# CONFIG_SCSI_LOWLEVEL is not set -CONFIG_NETDEVICES=y -CONFIG_SMSC_PHY=y -CONFIG_NET_ETHERNET=y -CONFIG_MII=y -CONFIG_MACB=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set -CONFIG_PPP=y -CONFIG_PPP_ASYNC=y -CONFIG_PPP_DEFLATE=y -CONFIG_PPP_BSDCOMP=y -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -# CONFIG_KEYBOARD_ATKBD is not set -CONFIG_KEYBOARD_GPIO=y -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -CONFIG_SERIAL_ATMEL=y -CONFIG_SERIAL_ATMEL_CONSOLE=y -CONFIG_LEGACY_PTY_COUNT=32 -# CONFIG_HW_RANDOM is not set -CONFIG_I2C=y -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_GPIO=y -CONFIG_GPIO_SYSFS=y -# CONFIG_HWMON is not set -CONFIG_WATCHDOG=y -CONFIG_WATCHDOG_NOWAYOUT=y -CONFIG_AT91SAM9X_WATCHDOG=y -# CONFIG_VGA_CONSOLE is not set -# CONFIG_HID_SUPPORT is not set -CONFIG_USB=y -# CONFIG_USB_DEVICE_CLASS is not set -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_STORAGE=y -CONFIG_USB_GADGET=y -CONFIG_USB_ETH=m -CONFIG_MMC=y -CONFIG_MMC_ATMELMCI=m -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y -CONFIG_LEDS_GPIO=y -CONFIG_LEDS_TRIGGERS=y -CONFIG_LEDS_TRIGGER_TIMER=y -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -CONFIG_LEDS_TRIGGER_GPIO=y -CONFIG_LEDS_TRIGGER_DEFAULT_ON=y -CONFIG_RTC_CLASS=y -# CONFIG_RTC_HCTOSYS is not set -CONFIG_RTC_DRV_DS1307=y -CONFIG_EXT2_FS=y -CONFIG_EXT3_FS=y -# CONFIG_EXT3_FS_XATTR is not set -CONFIG_INOTIFY=y -CONFIG_AUTOFS4_FS=y -CONFIG_MSDOS_FS=y -CONFIG_VFAT_FS=y -CONFIG_TMPFS=y -CONFIG_JFFS2_FS=y -CONFIG_JFFS2_SUMMARY=y -CONFIG_CRAMFS=y -CONFIG_MINIX_FS=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_ROOT_NFS=y -CONFIG_PARTITION_ADVANCED=y -CONFIG_NLS_CODEPAGE_437=y -CONFIG_NLS_ISO8859_1=y -CONFIG_NLS_UTF8=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set diff --git a/arch/arm/configs/cpu9g20_defconfig b/arch/arm/configs/cpu9g20_defconfig deleted file mode 100644 index ea116cbdffa..00000000000 --- a/arch/arm/configs/cpu9g20_defconfig +++ /dev/null @@ -1,116 +0,0 @@ -CONFIG_EXPERIMENTAL=y -# CONFIG_LOCALVERSION_AUTO is not set -# CONFIG_SWAP is not set -CONFIG_SYSVIPC=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_BLK_DEV_BSG is not set -# CONFIG_IOSCHED_CFQ is not set -CONFIG_ARCH_AT91=y -CONFIG_ARCH_AT91SAM9G20=y -CONFIG_MACH_CPU9G20=y -# CONFIG_ARM_THUMB is not set -CONFIG_PREEMPT=y -CONFIG_AEABI=y -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_NET=y -CONFIG_PACKET=y -CONFIG_UNIX=y -CONFIG_INET=y -CONFIG_IP_PNP=y -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set -# CONFIG_IPV6 is not set -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_CMDLINE_PARTS=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_CFI=y -CONFIG_MTD_CFI_INTELEXT=y -CONFIG_MTD_PHYSMAP=y -CONFIG_MTD_PLATRAM=y -CONFIG_MTD_NAND=y -CONFIG_MTD_NAND_ATMEL=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_NBD=y -CONFIG_BLK_DEV_RAM=y -# CONFIG_MISC_DEVICES is not set -CONFIG_SCSI=y -CONFIG_BLK_DEV_SD=y -CONFIG_SCSI_MULTI_LUN=y -# CONFIG_SCSI_LOWLEVEL is not set -CONFIG_NETDEVICES=y -CONFIG_SMSC_PHY=y -CONFIG_NET_ETHERNET=y -CONFIG_MII=y -CONFIG_MACB=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set -CONFIG_PPP=y -CONFIG_PPP_ASYNC=y -CONFIG_PPP_DEFLATE=y -CONFIG_PPP_BSDCOMP=y -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -# CONFIG_KEYBOARD_ATKBD is not set -CONFIG_KEYBOARD_GPIO=y -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -CONFIG_SERIAL_ATMEL=y -CONFIG_SERIAL_ATMEL_CONSOLE=y -CONFIG_LEGACY_PTY_COUNT=32 -# CONFIG_HW_RANDOM is not set -CONFIG_I2C=y -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_GPIO=y -CONFIG_GPIO_SYSFS=y -# CONFIG_HWMON is not set -CONFIG_WATCHDOG=y -CONFIG_WATCHDOG_NOWAYOUT=y -CONFIG_AT91SAM9X_WATCHDOG=y -# CONFIG_VGA_CONSOLE is not set -# CONFIG_HID_SUPPORT is not set -CONFIG_USB=y -# CONFIG_USB_DEVICE_CLASS is not set -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_STORAGE=y -CONFIG_USB_GADGET=y -CONFIG_USB_ETH=m -CONFIG_MMC=y -CONFIG_MMC_ATMELMCI=m -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y -CONFIG_LEDS_GPIO=y -CONFIG_LEDS_TRIGGERS=y -CONFIG_LEDS_TRIGGER_TIMER=y -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -CONFIG_LEDS_TRIGGER_GPIO=y -CONFIG_LEDS_TRIGGER_DEFAULT_ON=y -CONFIG_RTC_CLASS=y -# CONFIG_RTC_HCTOSYS is not set -CONFIG_RTC_DRV_DS1307=y -CONFIG_EXT2_FS=y -CONFIG_EXT3_FS=y -# CONFIG_EXT3_FS_XATTR is not set -CONFIG_INOTIFY=y -CONFIG_AUTOFS4_FS=y -CONFIG_MSDOS_FS=y -CONFIG_VFAT_FS=y -CONFIG_TMPFS=y -CONFIG_JFFS2_FS=y -CONFIG_JFFS2_SUMMARY=y -CONFIG_CRAMFS=y -CONFIG_MINIX_FS=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_ROOT_NFS=y -CONFIG_PARTITION_ADVANCED=y -CONFIG_NLS_CODEPAGE_437=y -CONFIG_NLS_ISO8859_1=y -CONFIG_NLS_UTF8=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set diff --git a/arch/arm/configs/da8xx_omapl_defconfig b/arch/arm/configs/da8xx_omapl_defconfig index 88ccde058ba..f29223954af 100644 --- a/arch/arm/configs/da8xx_omapl_defconfig +++ b/arch/arm/configs/da8xx_omapl_defconfig @@ -17,6 +17,7 @@ CONFIG_MODVERSIONS=y  CONFIG_ARCH_DAVINCI=y  CONFIG_ARCH_DAVINCI_DA830=y  CONFIG_ARCH_DAVINCI_DA850=y +CONFIG_MACH_DA8XX_DT=y  CONFIG_MACH_MITYOMAPL138=y  CONFIG_MACH_OMAPL138_HAWKBOARD=y  CONFIG_DAVINCI_RESET_CLOCKS=y @@ -26,6 +27,7 @@ CONFIG_PREEMPT=y  CONFIG_AEABI=y  # CONFIG_OABI_COMPAT is not set  CONFIG_LEDS=y +CONFIG_USE_OF=y  CONFIG_ZBOOT_ROM_TEXT=0x0  CONFIG_ZBOOT_ROM_BSS=0x0  CONFIG_CPU_FREQ=y @@ -75,6 +77,7 @@ CONFIG_SERIO_LIBPS2=y  CONFIG_SERIAL_8250=y  CONFIG_SERIAL_8250_CONSOLE=y  CONFIG_SERIAL_8250_NR_UARTS=3 +CONFIG_SERIAL_OF_PLATFORM=y  CONFIG_I2C=y  CONFIG_I2C_CHARDEV=y  CONFIG_I2C_DAVINCI=y diff --git a/arch/arm/configs/davinci_all_defconfig b/arch/arm/configs/davinci_all_defconfig index 67b5abb6f85..4ea7c95719d 100644 --- a/arch/arm/configs/davinci_all_defconfig +++ b/arch/arm/configs/davinci_all_defconfig @@ -144,7 +144,7 @@ CONFIG_USB_GADGET_DEBUG_FS=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_G_PRINTER=m  CONFIG_USB_CDC_COMPOSITE=m diff --git a/arch/arm/configs/edb7211_defconfig b/arch/arm/configs/edb7211_defconfig deleted file mode 100644 index d52ded350a1..00000000000 --- a/arch/arm/configs/edb7211_defconfig +++ /dev/null @@ -1,27 +0,0 @@ -CONFIG_EXPERIMENTAL=y -CONFIG_SYSVIPC=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_BLK_DEV_INITRD=y -CONFIG_EXPERT=y -# CONFIG_HOTPLUG is not set -CONFIG_ARCH_CLPS711X=y -CONFIG_ARCH_EDB7211=y -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_NET=y -CONFIG_PACKET=y -CONFIG_UNIX=y -CONFIG_INET=y -# CONFIG_IPV6 is not set -CONFIG_BLK_DEV_RAM=y -CONFIG_NETDEVICES=y -# CONFIG_INPUT is not set -CONFIG_SERIO_LIBPS2=y -# CONFIG_VT is not set -CONFIG_SERIAL_CLPS711X=y -CONFIG_SERIAL_CLPS711X_CONSOLE=y -CONFIG_EXT2_FS=y -CONFIG_MINIX_FS=y -CONFIG_PARTITION_ADVANCED=y -# CONFIG_MSDOS_PARTITION is not set -CONFIG_DEBUG_USER=y diff --git a/arch/arm/configs/fortunet_defconfig b/arch/arm/configs/fortunet_defconfig deleted file mode 100644 index 840fced7529..00000000000 --- a/arch/arm/configs/fortunet_defconfig +++ /dev/null @@ -1,28 +0,0 @@ -CONFIG_EXPERIMENTAL=y -CONFIG_SYSVIPC=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_BLK_DEV_INITRD=y -CONFIG_EXPERT=y -# CONFIG_HOTPLUG is not set -CONFIG_ARCH_CLPS711X=y -CONFIG_ARCH_FORTUNET=y -# CONFIG_ARM_THUMB is not set -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_FPE_FASTFPE=y -CONFIG_BINFMT_AOUT=y -CONFIG_NET=y -CONFIG_UNIX=y -CONFIG_MTD=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_CFI=y -CONFIG_MTD_CFI_INTELEXT=y -CONFIG_BLK_DEV_RAM=y -# CONFIG_INPUT is not set -# CONFIG_SERIO is not set -# CONFIG_VT is not set -CONFIG_SERIAL_CLPS711X=y -CONFIG_SERIAL_CLPS711X_CONSOLE=y -CONFIG_EXT2_FS=y -CONFIG_DEBUG_USER=y diff --git a/arch/arm/configs/g3evm_defconfig b/arch/arm/configs/g3evm_defconfig deleted file mode 100644 index 4a336ab5a0c..00000000000 --- a/arch/arm/configs/g3evm_defconfig +++ /dev/null @@ -1,57 +0,0 @@ -CONFIG_EXPERIMENTAL=y -CONFIG_SYSVIPC=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_LOG_BUF_SHIFT=16 -CONFIG_BLK_DEV_INITRD=y -CONFIG_SLAB=y -# CONFIG_BLK_DEV_BSG is not set -# CONFIG_IOSCHED_DEADLINE is not set -# CONFIG_IOSCHED_CFQ is not set -CONFIG_ARCH_SHMOBILE=y -CONFIG_ARCH_SH7367=y -CONFIG_MACH_G3EVM=y -CONFIG_AEABI=y -# CONFIG_OABI_COMPAT is not set -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="console=ttySC1,115200 earlyprintk=sh-sci.1,115200" -CONFIG_KEXEC=y -CONFIG_PM=y -# CONFIG_SUSPEND is not set -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -# CONFIG_FIRMWARE_IN_KERNEL is not set -CONFIG_MTD=y -CONFIG_MTD_CONCAT=y -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_CFI=y -CONFIG_MTD_CFI_INTELEXT=y -CONFIG_MTD_PHYSMAP=y -CONFIG_MTD_NAND=y -# CONFIG_BLK_DEV is not set -# CONFIG_MISC_DEVICES is not set -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -CONFIG_SERIAL_SH_SCI=y -CONFIG_SERIAL_SH_SCI_NR_UARTS=8 -CONFIG_SERIAL_SH_SCI_CONSOLE=y -# CONFIG_LEGACY_PTYS is not set -# CONFIG_HW_RANDOM is not set -# CONFIG_HWMON is not set -# CONFIG_VGA_CONSOLE is not set -# CONFIG_HID_SUPPORT is not set -# CONFIG_USB_SUPPORT is not set -# CONFIG_DNOTIFY is not set -# CONFIG_INOTIFY_USER is not set -CONFIG_TMPFS=y -# CONFIG_MISC_FILESYSTEMS is not set -CONFIG_MAGIC_SYSRQ=y -CONFIG_DEBUG_KERNEL=y -# CONFIG_DETECT_SOFTLOCKUP is not set -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -# CONFIG_FTRACE is not set -# CONFIG_CRC32 is not set diff --git a/arch/arm/configs/g4evm_defconfig b/arch/arm/configs/g4evm_defconfig deleted file mode 100644 index 21c6d0307bc..00000000000 --- a/arch/arm/configs/g4evm_defconfig +++ /dev/null @@ -1,57 +0,0 @@ -CONFIG_EXPERIMENTAL=y -CONFIG_SYSVIPC=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_LOG_BUF_SHIFT=16 -CONFIG_BLK_DEV_INITRD=y -CONFIG_SLAB=y -# CONFIG_BLK_DEV_BSG is not set -# CONFIG_IOSCHED_DEADLINE is not set -# CONFIG_IOSCHED_CFQ is not set -CONFIG_ARCH_SHMOBILE=y -CONFIG_ARCH_SH7377=y -CONFIG_MACH_G4EVM=y -CONFIG_AEABI=y -# CONFIG_OABI_COMPAT is not set -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="console=ttySC4,115200 earlyprintk=sh-sci.4,115200" -CONFIG_KEXEC=y -CONFIG_PM=y -# CONFIG_SUSPEND is not set -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -# CONFIG_FIRMWARE_IN_KERNEL is not set -CONFIG_MTD=y -CONFIG_MTD_CONCAT=y -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_CFI=y -CONFIG_MTD_CFI_INTELEXT=y -CONFIG_MTD_PHYSMAP=y -CONFIG_MTD_NAND=y -# CONFIG_BLK_DEV is not set -# CONFIG_MISC_DEVICES is not set -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -CONFIG_SERIAL_SH_SCI=y -CONFIG_SERIAL_SH_SCI_NR_UARTS=8 -CONFIG_SERIAL_SH_SCI_CONSOLE=y -# CONFIG_LEGACY_PTYS is not set -# CONFIG_HW_RANDOM is not set -# CONFIG_HWMON is not set -# CONFIG_VGA_CONSOLE is not set -# CONFIG_HID_SUPPORT is not set -# CONFIG_USB_SUPPORT is not set -# CONFIG_DNOTIFY is not set -# CONFIG_INOTIFY_USER is not set -CONFIG_TMPFS=y -# CONFIG_MISC_FILESYSTEMS is not set -CONFIG_MAGIC_SYSRQ=y -CONFIG_DEBUG_KERNEL=y -# CONFIG_DETECT_SOFTLOCKUP is not set -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -# CONFIG_FTRACE is not set -# CONFIG_CRC32 is not set diff --git a/arch/arm/configs/h7202_defconfig b/arch/arm/configs/h7202_defconfig index 69405a76242..e16d3f372e2 100644 --- a/arch/arm/configs/h7202_defconfig +++ b/arch/arm/configs/h7202_defconfig @@ -34,8 +34,7 @@ CONFIG_FB_MODE_HELPERS=y  CONFIG_USB_GADGET=m  CONFIG_USB_ZERO=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m -CONFIG_USB_FILE_STORAGE_TEST=y +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_EXT2_FS=y  CONFIG_TMPFS=y diff --git a/arch/arm/configs/imx_v4_v5_defconfig b/arch/arm/configs/imx_v4_v5_defconfig index f71302c3ac3..ebbfb27e0e7 100644 --- a/arch/arm/configs/imx_v4_v5_defconfig +++ b/arch/arm/configs/imx_v4_v5_defconfig @@ -123,6 +123,7 @@ CONFIG_REGULATOR_MC13892=y  CONFIG_MEDIA_SUPPORT=y  CONFIG_VIDEO_DEV=y  CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_MEDIA_CAMERA_SUPPORT=y  CONFIG_SOC_CAMERA=y  CONFIG_SOC_CAMERA_OV2640=y  CONFIG_VIDEO_MX2=y diff --git a/arch/arm/configs/imx_v6_v7_defconfig b/arch/arm/configs/imx_v6_v7_defconfig index 44f117aab52..69667133321 100644 --- a/arch/arm/configs/imx_v6_v7_defconfig +++ b/arch/arm/configs/imx_v6_v7_defconfig @@ -145,15 +145,18 @@ CONFIG_GPIO_MC9S08DZ60=y  # CONFIG_HWMON is not set  CONFIG_WATCHDOG=y  CONFIG_IMX2_WDT=y +CONFIG_MFD_DA9052_I2C=y  CONFIG_MFD_MC13XXX_SPI=y  CONFIG_MFD_MC13XXX_I2C=y  CONFIG_REGULATOR=y  CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_DA9052=y  CONFIG_REGULATOR_MC13783=y  CONFIG_REGULATOR_MC13892=y  CONFIG_MEDIA_SUPPORT=y  CONFIG_VIDEO_DEV=y  CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_MEDIA_CAMERA_SUPPORT=y  CONFIG_SOC_CAMERA=y  CONFIG_SOC_CAMERA_OV2640=y  CONFIG_VIDEO_MX3=y diff --git a/arch/arm/configs/kota2_defconfig b/arch/arm/configs/kota2_defconfig index b7735d6347a..fa83db1ef0e 100644 --- a/arch/arm/configs/kota2_defconfig +++ b/arch/arm/configs/kota2_defconfig @@ -112,7 +112,6 @@ CONFIG_LEDS_GPIO=y  CONFIG_LEDS_RENESAS_TPU=y  CONFIG_LEDS_TRIGGERS=y  # CONFIG_DNOTIFY is not set -# CONFIG_INOTIFY_USER is not set  CONFIG_TMPFS=y  # CONFIG_MISC_FILESYSTEMS is not set  CONFIG_MAGIC_SYSRQ=y diff --git a/arch/arm/configs/kzm9g_defconfig b/arch/arm/configs/kzm9g_defconfig index c88b57886e7..afbae287436 100644 --- a/arch/arm/configs/kzm9g_defconfig +++ b/arch/arm/configs/kzm9g_defconfig @@ -74,6 +74,8 @@ CONFIG_KEYBOARD_GPIO=y  # CONFIG_INPUT_MOUSE is not set  CONFIG_INPUT_TOUCHSCREEN=y  CONFIG_TOUCHSCREEN_ST1232=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_ADXL34X=y  # CONFIG_LEGACY_PTYS is not set  CONFIG_SERIAL_SH_SCI=y  CONFIG_SERIAL_SH_SCI_NR_UARTS=9 @@ -119,8 +121,9 @@ CONFIG_DMADEVICES=y  CONFIG_SH_DMAE=y  CONFIG_ASYNC_TX_DMA=y  CONFIG_STAGING=y +CONFIG_SENSORS_AK8975=y +CONFIG_IIO=y  # CONFIG_DNOTIFY is not set -CONFIG_INOTIFY_USER=y  CONFIG_VFAT_FS=y  CONFIG_TMPFS=y  # CONFIG_MISC_FILESYSTEMS is not set diff --git a/arch/arm/configs/mackerel_defconfig b/arch/arm/configs/mackerel_defconfig index 306a2e2d362..2098ce15554 100644 --- a/arch/arm/configs/mackerel_defconfig +++ b/arch/arm/configs/mackerel_defconfig @@ -70,17 +70,31 @@ CONFIG_SERIAL_SH_SCI_NR_UARTS=8  CONFIG_SERIAL_SH_SCI_CONSOLE=y  # CONFIG_LEGACY_PTYS is not set  # CONFIG_HW_RANDOM is not set +CONFIG_I2C=y +CONFIG_I2C_SH_MOBILE=y  # CONFIG_HWMON is not set  # CONFIG_MFD_SUPPORT is not set  CONFIG_FB=y  CONFIG_FB_MODE_HELPERS=y  CONFIG_FB_SH_MOBILE_LCDC=y +CONFIG_FB_SH_MOBILE_HDMI=y  CONFIG_FRAMEBUFFER_CONSOLE=y  CONFIG_LOGO=y  # CONFIG_LOGO_LINUX_MONO is not set  # CONFIG_LOGO_LINUX_CLUT224 is not set -# CONFIG_HID_SUPPORT is not set -# CONFIG_USB_SUPPORT is not set +# CONFIG_SND_SUPPORT_OLD_API is not set +# CONFIG_SND_VERBOSE_PROCFS is not set +# CONFIG_SND_DRIVERS is not set +# CONFIG_SND_ARM is not set +CONFIG_SND_SOC_SH4_FSI=y +CONFIG_USB=y +CONFIG_USB_RENESAS_USBHS_HCD=y +CONFIG_USB_RENESAS_USBHS=y +CONFIG_USB_STORAGE=y +CONFIG_USB_GADGET=y +CONFIG_USB_RENESAS_USBHS_UDC=y +CONFIG_DMADEVICES=y +CONFIG_SH_DMAE=y  CONFIG_EXT2_FS=y  CONFIG_EXT2_FS_XATTR=y  CONFIG_EXT2_FS_POSIX_ACL=y @@ -91,7 +105,6 @@ CONFIG_EXT3_FS=y  CONFIG_EXT3_FS_POSIX_ACL=y  CONFIG_EXT3_FS_SECURITY=y  # CONFIG_DNOTIFY is not set -# CONFIG_INOTIFY_USER is not set  CONFIG_MSDOS_FS=y  CONFIG_VFAT_FS=y  CONFIG_TMPFS=y diff --git a/arch/arm/configs/magician_defconfig b/arch/arm/configs/magician_defconfig index a691ef4c600..557dd291288 100644 --- a/arch/arm/configs/magician_defconfig +++ b/arch/arm/configs/magician_defconfig @@ -136,7 +136,7 @@ CONFIG_USB_PXA27X=y  CONFIG_USB_ETH=m  # CONFIG_USB_ETH_RNDIS is not set  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_USB_GPIO_VBUS=y diff --git a/arch/arm/configs/marzen_defconfig b/arch/arm/configs/marzen_defconfig index 53382b6c8bb..5b8215f424c 100644 --- a/arch/arm/configs/marzen_defconfig +++ b/arch/arm/configs/marzen_defconfig @@ -69,6 +69,10 @@ CONFIG_SERIAL_SH_SCI=y  CONFIG_SERIAL_SH_SCI_NR_UARTS=6  CONFIG_SERIAL_SH_SCI_CONSOLE=y  # CONFIG_HW_RANDOM is not set +CONFIG_I2C=y +CONFIG_I2C_RCAR=y +CONFIG_SPI=y +CONFIG_SPI_SH_HSPI=y  CONFIG_GPIO_SYSFS=y  # CONFIG_HWMON is not set  CONFIG_THERMAL=y diff --git a/arch/arm/configs/mini2440_defconfig b/arch/arm/configs/mini2440_defconfig index 00630e6af45..a07948a87ca 100644 --- a/arch/arm/configs/mini2440_defconfig +++ b/arch/arm/configs/mini2440_defconfig @@ -240,7 +240,7 @@ CONFIG_USB_GADGET_S3C2410=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/arm/configs/omap1_defconfig b/arch/arm/configs/omap1_defconfig index dde2a1af7b3..42eab9a2a0f 100644 --- a/arch/arm/configs/omap1_defconfig +++ b/arch/arm/configs/omap1_defconfig @@ -214,8 +214,7 @@ CONFIG_USB_TEST=y  CONFIG_USB_GADGET=y  CONFIG_USB_ETH=m  # CONFIG_USB_ETH_RNDIS is not set -CONFIG_USB_FILE_STORAGE=m -CONFIG_USB_FILE_STORAGE_TEST=y +CONFIG_USB_MASS_STORAGE=m  CONFIG_MMC=y  CONFIG_MMC_SDHCI=y  CONFIG_MMC_SDHCI_PLTFM=y diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index 62303043db9..a1dc5c071e7 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig @@ -240,3 +240,6 @@ CONFIG_CRC_ITU_T=y  CONFIG_CRC7=y  CONFIG_LIBCRC32C=y  CONFIG_SOC_OMAP5=y +CONFIG_TI_DAVINCI_MDIO=y +CONFIG_TI_DAVINCI_CPDMA=y +CONFIG_TI_CPSW=y diff --git a/arch/arm/configs/prima2_defconfig b/arch/arm/configs/prima2_defconfig index 807d4e2acb1..6a936c7c078 100644 --- a/arch/arm/configs/prima2_defconfig +++ b/arch/arm/configs/prima2_defconfig @@ -37,7 +37,6 @@ CONFIG_SPI_SIRF=y  CONFIG_SPI_SPIDEV=y  # CONFIG_HWMON is not set  CONFIG_USB_GADGET=y -CONFIG_USB_FILE_STORAGE=m  CONFIG_USB_MASS_STORAGE=m  CONFIG_MMC=y  CONFIG_MMC_SDHCI=y diff --git a/arch/arm/configs/qil-a9260_defconfig b/arch/arm/configs/qil-a9260_defconfig deleted file mode 100644 index 42d5db1876a..00000000000 --- a/arch/arm/configs/qil-a9260_defconfig +++ /dev/null @@ -1,114 +0,0 @@ -CONFIG_EXPERIMENTAL=y -# CONFIG_LOCALVERSION_AUTO is not set -# CONFIG_SWAP is not set -CONFIG_SYSVIPC=y -CONFIG_LOG_BUF_SHIFT=14 -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -CONFIG_SLAB=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_BLK_DEV_BSG is not set -# CONFIG_IOSCHED_DEADLINE is not set -# CONFIG_IOSCHED_CFQ is not set -CONFIG_ARCH_AT91=y -CONFIG_ARCH_AT91SAM9260=y -CONFIG_MACH_QIL_A9260=y -CONFIG_AT91_SLOW_CLOCK=y -CONFIG_AT91_EARLY_USART0=y -# CONFIG_ARM_THUMB is not set -CONFIG_AEABI=y -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="mem=64M console=ttyS1,115200" -CONFIG_FPE_NWFPE=y -CONFIG_PM=y -CONFIG_NET=y -CONFIG_PACKET=y -CONFIG_UNIX=y -CONFIG_INET=y -CONFIG_IP_MULTICAST=y -CONFIG_IP_ADVANCED_ROUTER=y -CONFIG_IP_ROUTE_VERBOSE=y -CONFIG_IP_PNP=y -CONFIG_IP_PNP_BOOTP=y -CONFIG_IP_PNP_RARP=y -CONFIG_IP_MROUTE=y -CONFIG_IP_PIMSM_V1=y -CONFIG_IP_PIMSM_V2=y -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set -# CONFIG_INET_LRO is not set -# CONFIG_INET_DIAG is not set -# CONFIG_IPV6 is not set -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_CMDLINE_PARTS=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_DATAFLASH=y -CONFIG_MTD_NAND=y -CONFIG_MTD_NAND_ATMEL=y -CONFIG_BLK_DEV_LOOP=y -# CONFIG_MISC_DEVICES is not set -CONFIG_SCSI=y -CONFIG_BLK_DEV_SD=y -CONFIG_SCSI_MULTI_LUN=y -CONFIG_NETDEVICES=y -CONFIG_NET_ETHERNET=y -CONFIG_MII=y -CONFIG_MACB=y -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -CONFIG_INPUT_EVDEV=y -CONFIG_INPUT_EVBUG=y -# CONFIG_KEYBOARD_ATKBD is not set -CONFIG_KEYBOARD_GPIO=y -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -CONFIG_SERIAL_ATMEL=y -CONFIG_SERIAL_ATMEL_CONSOLE=y -CONFIG_HW_RANDOM=y -CONFIG_I2C=y -CONFIG_I2C_CHARDEV=y -CONFIG_SPI=y -CONFIG_SPI_ATMEL=y -# CONFIG_HWMON is not set -CONFIG_WATCHDOG=y -CONFIG_WATCHDOG_NOWAYOUT=y -# CONFIG_VGA_CONSOLE is not set -# CONFIG_USB_HID is not set -CONFIG_USB=y -CONFIG_USB_DEVICEFS=y -CONFIG_USB_MON=y -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_STORAGE=y -CONFIG_USB_GADGET=y -CONFIG_USB_ETH=m -CONFIG_MMC=y -CONFIG_MMC_ATMELMCI=m -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y -CONFIG_LEDS_GPIO=y -CONFIG_LEDS_TRIGGERS=y -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_DRV_M41T94=y -CONFIG_EXT2_FS=y -CONFIG_INOTIFY=y -CONFIG_FUSE_FS=m -CONFIG_VFAT_FS=y -CONFIG_TMPFS=y -CONFIG_JFFS2_FS=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_NFS_V3_ACL=y -CONFIG_NFS_V4=y -CONFIG_ROOT_NFS=y -CONFIG_NLS_CODEPAGE_437=y -CONFIG_NLS_CODEPAGE_850=y -CONFIG_NLS_ISO8859_1=y -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_USER=y -CONFIG_DEBUG_LL=y -# CONFIG_CRYPTO_HW is not set diff --git a/arch/arm/configs/sam9_l9260_defconfig b/arch/arm/configs/sam9_l9260_defconfig deleted file mode 100644 index b4384af1bea..00000000000 --- a/arch/arm/configs/sam9_l9260_defconfig +++ /dev/null @@ -1,148 +0,0 @@ -CONFIG_EXPERIMENTAL=y -# CONFIG_LOCALVERSION_AUTO is not set -CONFIG_SYSVIPC=y -CONFIG_POSIX_MQUEUE=y -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_BSD_PROCESS_ACCT_V3=y -CONFIG_AUDIT=y -CONFIG_LOG_BUF_SHIFT=15 -CONFIG_BLK_DEV_INITRD=y -CONFIG_SLAB=y -# CONFIG_BLK_DEV_BSG is not set -CONFIG_ARCH_AT91=y -CONFIG_ARCH_AT91SAM9260=y -CONFIG_MACH_SAM9_L9260=y -CONFIG_MTD_AT91_DATAFLASH_CARD=y -CONFIG_PREEMPT=y -CONFIG_LEDS=y -CONFIG_LEDS_CPU=y -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="console=ttyS0,115200 mem=64M initrd=0x21100000,4194304 root=/dev/ram0 rw" -CONFIG_FPE_NWFPE=y -CONFIG_NET=y -CONFIG_PACKET=y -CONFIG_UNIX=y -CONFIG_XFRM_USER=y -CONFIG_NET_KEY=y -CONFIG_INET=y -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set -# CONFIG_IPV6 is not set -CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_BLOCK2MTD=y -CONFIG_MTD_NAND=y -CONFIG_MTD_NAND_ATMEL=y -CONFIG_MTD_NAND_PLATFORM=y -CONFIG_MTD_UBI=y -CONFIG_MTD_UBI_BEB_LIMIT=25 -CONFIG_MTD_UBI_GLUEBI=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=8192 -# CONFIG_MISC_DEVICES is not set -CONFIG_RAID_ATTRS=y -CONFIG_SCSI=y -CONFIG_BLK_DEV_SD=y -CONFIG_CHR_DEV_SG=y -CONFIG_SCSI_MULTI_LUN=y -CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_LOGGING=y -# CONFIG_SCSI_LOWLEVEL is not set -CONFIG_NETDEVICES=y -CONFIG_NET_ETHERNET=y -CONFIG_MII=y -CONFIG_MACB=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -CONFIG_SERIAL_ATMEL=y -CONFIG_SERIAL_ATMEL_CONSOLE=y -CONFIG_LEGACY_PTY_COUNT=16 -# CONFIG_HW_RANDOM is not set -# CONFIG_HWMON is not set -# CONFIG_VGA_CONSOLE is not set -# CONFIG_HID_SUPPORT is not set -CONFIG_USB=y -CONFIG_USB_DEVICEFS=y -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_STORAGE=y -CONFIG_USB_LIBUSUAL=y -CONFIG_USB_GADGET=y -CONFIG_MMC=y -CONFIG_MMC_DEBUG=y -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y -CONFIG_LEDS_GPIO=y -CONFIG_LEDS_TRIGGERS=y -CONFIG_LEDS_TRIGGER_TIMER=y -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_DRV_DS1553=y -CONFIG_RTC_DRV_DS1742=y -CONFIG_RTC_DRV_M48T86=y -CONFIG_RTC_DRV_V3020=y -CONFIG_EXT2_FS=y -CONFIG_EXT2_FS_XATTR=y -CONFIG_EXT2_FS_POSIX_ACL=y -CONFIG_EXT2_FS_SECURITY=y -CONFIG_EXT3_FS=y -CONFIG_EXT3_FS_POSIX_ACL=y -CONFIG_EXT3_FS_SECURITY=y -CONFIG_INOTIFY=y -CONFIG_MSDOS_FS=y -CONFIG_VFAT_FS=y -CONFIG_TMPFS=y -CONFIG_JFFS2_FS=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_NLS_CODEPAGE_437=y -CONFIG_NLS_CODEPAGE_737=y -CONFIG_NLS_CODEPAGE_775=y -CONFIG_NLS_CODEPAGE_850=y -CONFIG_NLS_CODEPAGE_852=y -CONFIG_NLS_CODEPAGE_855=y -CONFIG_NLS_CODEPAGE_857=y -CONFIG_NLS_CODEPAGE_860=y -CONFIG_NLS_CODEPAGE_861=y -CONFIG_NLS_CODEPAGE_862=y -CONFIG_NLS_CODEPAGE_863=y -CONFIG_NLS_CODEPAGE_864=y -CONFIG_NLS_CODEPAGE_865=y -CONFIG_NLS_CODEPAGE_866=y -CONFIG_NLS_CODEPAGE_869=y -CONFIG_NLS_CODEPAGE_936=y -CONFIG_NLS_CODEPAGE_950=y -CONFIG_NLS_CODEPAGE_932=y -CONFIG_NLS_CODEPAGE_949=y -CONFIG_NLS_CODEPAGE_874=y -CONFIG_NLS_ISO8859_8=y -CONFIG_NLS_CODEPAGE_1250=y -CONFIG_NLS_CODEPAGE_1251=y -CONFIG_NLS_ASCII=y -CONFIG_NLS_ISO8859_1=y -CONFIG_NLS_ISO8859_2=y -CONFIG_NLS_ISO8859_3=y -CONFIG_NLS_ISO8859_4=y -CONFIG_NLS_ISO8859_5=y -CONFIG_NLS_ISO8859_6=y -CONFIG_NLS_ISO8859_7=y -CONFIG_NLS_ISO8859_9=y -CONFIG_NLS_ISO8859_13=y -CONFIG_NLS_ISO8859_14=y -CONFIG_NLS_ISO8859_15=y -CONFIG_NLS_KOI8_R=y -CONFIG_NLS_KOI8_U=y -CONFIG_NLS_UTF8=y -CONFIG_MAGIC_SYSRQ=y -CONFIG_UNUSED_SYMBOLS=y -CONFIG_DEBUG_FS=y -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_LL=y diff --git a/arch/arm/configs/spitz_defconfig b/arch/arm/configs/spitz_defconfig index df77931a432..2e0419d1b96 100644 --- a/arch/arm/configs/spitz_defconfig +++ b/arch/arm/configs/spitz_defconfig @@ -214,7 +214,7 @@ CONFIG_USB_GADGET_DUMMY_HCD=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_MMC=y  CONFIG_MMC_PXA=y diff --git a/arch/arm/configs/stamp9g20_defconfig b/arch/arm/configs/stamp9g20_defconfig deleted file mode 100644 index 52f1488591c..00000000000 --- a/arch/arm/configs/stamp9g20_defconfig +++ /dev/null @@ -1,128 +0,0 @@ -CONFIG_EXPERIMENTAL=y -# CONFIG_LOCALVERSION_AUTO is not set -# CONFIG_SWAP is not set -CONFIG_SYSVIPC=y -CONFIG_TREE_PREEMPT_RCU=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_BLK_DEV_INITRD=y -CONFIG_SLAB=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_LBDAF is not set -# CONFIG_BLK_DEV_BSG is not set -# CONFIG_IOSCHED_DEADLINE is not set -CONFIG_ARCH_AT91=y -CONFIG_ARCH_AT91SAM9G20=y -CONFIG_MACH_PORTUXG20=y -CONFIG_MACH_STAMP9G20=y -CONFIG_AT91_PROGRAMMABLE_CLOCKS=y -CONFIG_AT91_SLOW_CLOCK=y -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y -CONFIG_PREEMPT=y -CONFIG_AEABI=y -# CONFIG_OABI_COMPAT is not set -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw" -CONFIG_KEXEC=y -CONFIG_CPU_IDLE=y -CONFIG_PM=y -CONFIG_NET=y -CONFIG_PACKET=y -CONFIG_UNIX=y -CONFIG_INET=y -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set -# CONFIG_INET_LRO is not set -# CONFIG_IPV6 is not set -# CONFIG_WIRELESS is not set -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -CONFIG_MTD=y -CONFIG_MTD_CONCAT=y -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_CMDLINE_PARTS=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_DATAFLASH=y -CONFIG_MTD_NAND=y -CONFIG_MTD_NAND_ATMEL=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=8192 -# CONFIG_MISC_DEVICES is not set -CONFIG_SCSI=y -CONFIG_BLK_DEV_SD=y -CONFIG_SCSI_MULTI_LUN=y -# CONFIG_SCSI_LOWLEVEL is not set -CONFIG_NETDEVICES=y -CONFIG_NET_ETHERNET=y -CONFIG_MACB=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set -# CONFIG_WLAN is not set -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -CONFIG_INPUT_MOUSEDEV_SCREEN_X=320 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=240 -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -CONFIG_SERIAL_ATMEL=y -CONFIG_SERIAL_ATMEL_CONSOLE=y -# CONFIG_LEGACY_PTYS is not set -# CONFIG_HW_RANDOM is not set -CONFIG_I2C=y -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_GPIO=y -CONFIG_SPI=y -CONFIG_SPI_ATMEL=y -CONFIG_SPI_SPIDEV=y -CONFIG_GPIO_SYSFS=y -CONFIG_W1=y -CONFIG_W1_MASTER_GPIO=y -CONFIG_W1_SLAVE_THERM=y -CONFIG_W1_SLAVE_DS2431=y -# CONFIG_HWMON is not set -CONFIG_WATCHDOG=y -CONFIG_AT91SAM9X_WATCHDOG=y -# CONFIG_VGA_CONSOLE is not set -# CONFIG_HID_SUPPORT is not set -CONFIG_USB=y -CONFIG_USB_DEVICEFS=y -# CONFIG_USB_DEVICE_CLASS is not set -CONFIG_USB_MON=y -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_STORAGE=y -CONFIG_USB_GADGET=m -CONFIG_USB_ZERO=m -CONFIG_USB_ETH=m -CONFIG_USB_FILE_STORAGE=m -CONFIG_USB_G_SERIAL=m -CONFIG_MMC=y -CONFIG_MMC_ATMELMCI=y -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y -CONFIG_LEDS_GPIO=y -CONFIG_LEDS_TRIGGERS=y -CONFIG_LEDS_TRIGGER_TIMER=y -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -CONFIG_LEDS_TRIGGER_DEFAULT_ON=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_DRV_AT91SAM9=y -CONFIG_EXT2_FS=y -CONFIG_EXT3_FS=y -CONFIG_INOTIFY=y -CONFIG_VFAT_FS=y -CONFIG_TMPFS=y -CONFIG_JFFS2_FS=y -CONFIG_JFFS2_SUMMARY=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_NLS_CODEPAGE_437=y -CONFIG_NLS_CODEPAGE_850=y -CONFIG_NLS_ISO8859_1=y -CONFIG_NLS_ISO8859_15=y -CONFIG_NLS_UTF8=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -# CONFIG_ARM_UNWIND is not set diff --git a/arch/arm/configs/tegra_defconfig b/arch/arm/configs/tegra_defconfig index e2184f6c20b..a7827fd0616 100644 --- a/arch/arm/configs/tegra_defconfig +++ b/arch/arm/configs/tegra_defconfig @@ -80,6 +80,10 @@ CONFIG_RFKILL_GPIO=y  CONFIG_DEVTMPFS=y  CONFIG_DEVTMPFS_MOUNT=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +CONFIG_CMA=y +CONFIG_MTD=y +CONFIG_MTD_CHAR=y +CONFIG_MTD_M25P80=y  CONFIG_PROC_DEVICETREE=y  CONFIG_BLK_DEV_LOOP=y  CONFIG_AD525X_DPOT=y @@ -98,12 +102,12 @@ CONFIG_USB_PEGASUS=y  CONFIG_USB_USBNET=y  CONFIG_USB_NET_SMSC75XX=y  CONFIG_USB_NET_SMSC95XX=y +CONFIG_BRCMFMAC=m  CONFIG_RT2X00=y  CONFIG_RT2800USB=m  CONFIG_INPUT_EVDEV=y  CONFIG_INPUT_MISC=y  CONFIG_INPUT_MPU3050=y -# CONFIG_VT is not set  # CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  CONFIG_SERIAL_8250=y @@ -116,7 +120,8 @@ CONFIG_I2C_MUX=y  CONFIG_I2C_MUX_PINCTRL=y  CONFIG_I2C_TEGRA=y  CONFIG_SPI=y -CONFIG_SPI_TEGRA=y +CONFIG_SPI_TEGRA20_SFLASH=y +CONFIG_SPI_TEGRA20_SLINK=y  CONFIG_GPIO_PCA953X_IRQ=y  CONFIG_GPIO_TPS6586X=y  CONFIG_GPIO_TPS65910=y @@ -138,6 +143,15 @@ CONFIG_MEDIA_SUPPORT=y  CONFIG_MEDIA_CAMERA_SUPPORT=y  CONFIG_MEDIA_USB_SUPPORT=y  CONFIG_USB_VIDEO_CLASS=m +CONFIG_DRM=y +CONFIG_DRM_TEGRA=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +# CONFIG_LCD_CLASS_DEVICE is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_GENERIC is not set +CONFIG_BACKLIGHT_PWM=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_LOGO=y  CONFIG_SOUND=y  CONFIG_SND=y  # CONFIG_SND_SUPPORT_OLD_API is not set @@ -205,6 +219,9 @@ CONFIG_EXT4_FS=y  CONFIG_VFAT_FS=y  CONFIG_TMPFS=y  CONFIG_TMPFS_POSIX_ACL=y +CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_SQUASHFS_XZ=y  CONFIG_NFS_FS=y  CONFIG_ROOT_NFS=y  CONFIG_NLS_CODEPAGE_437=y diff --git a/arch/arm/configs/u8500_defconfig b/arch/arm/configs/u8500_defconfig index 6fe7ede6f0c..231dca60473 100644 --- a/arch/arm/configs/u8500_defconfig +++ b/arch/arm/configs/u8500_defconfig @@ -69,6 +69,8 @@ CONFIG_GPIO_TC3589X=y  CONFIG_POWER_SUPPLY=y  CONFIG_AB8500_BM=y  CONFIG_AB8500_BATTERY_THERM_ON_BATCTRL=y +CONFIG_THERMAL=y +CONFIG_CPU_THERMAL=y  CONFIG_MFD_STMPE=y  CONFIG_MFD_TC3589X=y  CONFIG_AB5500_CORE=y diff --git a/arch/arm/configs/usb-a9260_defconfig b/arch/arm/configs/usb-a9260_defconfig deleted file mode 100644 index a1501e1e1a9..00000000000 --- a/arch/arm/configs/usb-a9260_defconfig +++ /dev/null @@ -1,105 +0,0 @@ -CONFIG_EXPERIMENTAL=y -# CONFIG_LOCALVERSION_AUTO is not set -# CONFIG_SWAP is not set -CONFIG_SYSVIPC=y -CONFIG_LOG_BUF_SHIFT=14 -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -CONFIG_SLAB=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_BLK_DEV_BSG is not set -# CONFIG_IOSCHED_DEADLINE is not set -# CONFIG_IOSCHED_CFQ is not set -CONFIG_ARCH_AT91=y -CONFIG_ARCH_AT91SAM9260=y -CONFIG_MACH_USB_A9260=y -CONFIG_AT91_SLOW_CLOCK=y -# CONFIG_ARM_THUMB is not set -CONFIG_AEABI=y -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="mem=64M console=ttyS0,115200" -CONFIG_FPE_NWFPE=y -CONFIG_PM=y -CONFIG_NET=y -CONFIG_PACKET=y -CONFIG_UNIX=y -CONFIG_INET=y -CONFIG_IP_MULTICAST=y -CONFIG_IP_ADVANCED_ROUTER=y -CONFIG_IP_ROUTE_VERBOSE=y -CONFIG_IP_PNP=y -CONFIG_IP_PNP_BOOTP=y -CONFIG_IP_PNP_RARP=y -CONFIG_IP_MROUTE=y -CONFIG_IP_PIMSM_V1=y -CONFIG_IP_PIMSM_V2=y -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set -# CONFIG_INET_LRO is not set -# CONFIG_INET_DIAG is not set -# CONFIG_IPV6 is not set -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_CMDLINE_PARTS=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_DATAFLASH=y -CONFIG_MTD_NAND=y -CONFIG_MTD_NAND_ATMEL=y -CONFIG_BLK_DEV_LOOP=y -# CONFIG_MISC_DEVICES is not set -CONFIG_SCSI=y -CONFIG_BLK_DEV_SD=y -CONFIG_SCSI_MULTI_LUN=y -CONFIG_NETDEVICES=y -CONFIG_NET_ETHERNET=y -CONFIG_MII=y -CONFIG_MACB=y -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -CONFIG_INPUT_EVDEV=y -CONFIG_INPUT_EVBUG=y -# CONFIG_KEYBOARD_ATKBD is not set -CONFIG_KEYBOARD_GPIO=y -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -CONFIG_SERIAL_ATMEL=y -CONFIG_SERIAL_ATMEL_CONSOLE=y -CONFIG_HW_RANDOM=y -CONFIG_SPI=y -CONFIG_SPI_ATMEL=y -# CONFIG_HWMON is not set -# CONFIG_VGA_CONSOLE is not set -# CONFIG_USB_HID is not set -CONFIG_USB=y -CONFIG_USB_DEVICEFS=y -CONFIG_USB_MON=y -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_STORAGE=y -CONFIG_USB_GADGET=y -CONFIG_USB_ETH=m -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y -CONFIG_LEDS_GPIO=y -CONFIG_LEDS_TRIGGERS=y -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -CONFIG_EXT2_FS=y -CONFIG_INOTIFY=y -CONFIG_FUSE_FS=m -CONFIG_VFAT_FS=y -CONFIG_TMPFS=y -CONFIG_JFFS2_FS=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_NFS_V3_ACL=y -CONFIG_NFS_V4=y -CONFIG_ROOT_NFS=y -CONFIG_NLS_CODEPAGE_437=y -CONFIG_NLS_CODEPAGE_850=y -CONFIG_NLS_ISO8859_1=y -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_USER=y -CONFIG_DEBUG_LL=y -# CONFIG_CRYPTO_HW is not set diff --git a/arch/arm/configs/viper_defconfig b/arch/arm/configs/viper_defconfig index 1d01ddd3312..d36e0d3c86e 100644 --- a/arch/arm/configs/viper_defconfig +++ b/arch/arm/configs/viper_defconfig @@ -139,7 +139,7 @@ CONFIG_USB_SERIAL_MCT_U232=m  CONFIG_USB_GADGET=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_G_PRINTER=m  CONFIG_RTC_CLASS=y diff --git a/arch/arm/configs/zeus_defconfig b/arch/arm/configs/zeus_defconfig index 547a3c1e59d..731d4f98531 100644 --- a/arch/arm/configs/zeus_defconfig +++ b/arch/arm/configs/zeus_defconfig @@ -143,7 +143,7 @@ CONFIG_USB_GADGET=m  CONFIG_USB_PXA27X=y  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_G_PRINTER=m  CONFIG_MMC=y diff --git a/arch/arm/include/asm/Kbuild b/arch/arm/include/asm/Kbuild index f70ae175a3d..d3db39860b9 100644 --- a/arch/arm/include/asm/Kbuild +++ b/arch/arm/include/asm/Kbuild @@ -16,7 +16,6 @@ generic-y += local64.h  generic-y += msgbuf.h  generic-y += param.h  generic-y += parport.h -generic-y += percpu.h  generic-y += poll.h  generic-y += resource.h  generic-y += sections.h @@ -31,5 +30,6 @@ generic-y += sockios.h  generic-y += termbits.h  generic-y += termios.h  generic-y += timex.h +generic-y += trace_clock.h  generic-y += types.h  generic-y += unaligned.h diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 2ef95813fce..eb87200aa4b 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -250,6 +250,7 @@   * Beware, it also clobers LR.   */  .macro safe_svcmode_maskall reg:req +#if __LINUX_ARM_ARCH__ >= 6  	mrs	\reg , cpsr  	mov	lr , \reg  	and	lr , lr , #MODE_MASK @@ -266,6 +267,13 @@ THUMB(	orr	\reg , \reg , #PSR_T_BIT	)  	__ERET  1:	msr	cpsr_c, \reg  2: +#else +/* + * workaround for possibly broken pre-v6 hardware + * (akita, Sharp Zaurus C-1000, PXA270-based) + */ +	setmode	PSR_F_BIT | PSR_I_BIT | SVC_MODE, \reg +#endif  .endm  /* diff --git a/arch/arm/include/asm/cpu.h b/arch/arm/include/asm/cpu.h index d797223b39d..2744f060255 100644 --- a/arch/arm/include/asm/cpu.h +++ b/arch/arm/include/asm/cpu.h @@ -15,6 +15,7 @@  struct cpuinfo_arm {  	struct cpu	cpu; +	u32		cpuid;  #ifdef CONFIG_SMP  	unsigned int	loops_per_jiffy;  #endif diff --git a/arch/arm/include/asm/cputype.h b/arch/arm/include/asm/cputype.h index cb47d28cbe1..a59dcb5ab5f 100644 --- a/arch/arm/include/asm/cputype.h +++ b/arch/arm/include/asm/cputype.h @@ -25,6 +25,19 @@  #define CPUID_EXT_ISAR4	"c2, 4"  #define CPUID_EXT_ISAR5	"c2, 5" +#define MPIDR_SMP_BITMASK (0x3 << 30) +#define MPIDR_SMP_VALUE (0x2 << 30) + +#define MPIDR_MT_BITMASK (0x1 << 24) + +#define MPIDR_HWID_BITMASK 0xFFFFFF + +#define MPIDR_LEVEL_BITS 8 +#define MPIDR_LEVEL_MASK ((1 << MPIDR_LEVEL_BITS) - 1) + +#define MPIDR_AFFINITY_LEVEL(mpidr, level) \ +	((mpidr >> (MPIDR_LEVEL_BITS * level)) & MPIDR_LEVEL_MASK) +  extern unsigned int processor_id;  #ifdef CONFIG_CPU_CP15 diff --git a/arch/arm/include/asm/cti.h b/arch/arm/include/asm/cti.h index a0ada3ea435..f2e5cad3f30 100644 --- a/arch/arm/include/asm/cti.h +++ b/arch/arm/include/asm/cti.h @@ -146,15 +146,7 @@ static inline void cti_irq_ack(struct cti *cti)   */  static inline void cti_unlock(struct cti *cti)  { -	void __iomem *base = cti->base; -	unsigned long val; - -	val = __raw_readl(base + LOCKSTATUS); - -	if (val & 1) { -		val = LOCKCODE; -		__raw_writel(val, base + LOCKACCESS); -	} +	__raw_writel(LOCKCODE, cti->base + LOCKACCESS);  }  /** @@ -166,14 +158,6 @@ static inline void cti_unlock(struct cti *cti)   */  static inline void cti_lock(struct cti *cti)  { -	void __iomem *base = cti->base; -	unsigned long val; - -	val = __raw_readl(base + LOCKSTATUS); - -	if (!(val & 1)) { -		val = ~LOCKCODE; -		__raw_writel(val, base + LOCKACCESS); -	} +	__raw_writel(~LOCKCODE, cti->base + LOCKACCESS);  }  #endif diff --git a/arch/arm/include/asm/hardware/cache-l2x0.h b/arch/arm/include/asm/hardware/cache-l2x0.h index c4c87bc1223..3b2c40b5bfa 100644 --- a/arch/arm/include/asm/hardware/cache-l2x0.h +++ b/arch/arm/include/asm/hardware/cache-l2x0.h @@ -102,6 +102,10 @@  #define L2X0_ADDR_FILTER_EN		1 +#define L2X0_CTRL_EN			1 + +#define L2X0_WAY_SIZE_SHIFT		3 +  #ifndef __ASSEMBLY__  extern void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask);  #if defined(CONFIG_CACHE_L2X0) && defined(CONFIG_OF) @@ -126,6 +130,7 @@ struct l2x0_regs {  	unsigned long filter_end;  	unsigned long prefetch_ctrl;  	unsigned long pwr_ctrl; +	unsigned long ctrl;  };  extern struct l2x0_regs l2x0_saved_regs; diff --git a/arch/arm/include/asm/hardware/sp810.h b/arch/arm/include/asm/hardware/sp810.h index 6b9b077d86b..6636430dd0e 100644 --- a/arch/arm/include/asm/hardware/sp810.h +++ b/arch/arm/include/asm/hardware/sp810.h @@ -50,11 +50,7 @@  #define SCPCELLID2		0xFF8  #define SCPCELLID3		0xFFC -#define SCCTRL_TIMEREN0SEL_REFCLK	(0 << 15) -#define SCCTRL_TIMEREN0SEL_TIMCLK	(1 << 15) - -#define SCCTRL_TIMEREN1SEL_REFCLK	(0 << 17) -#define SCCTRL_TIMEREN1SEL_TIMCLK	(1 << 17) +#define SCCTRL_TIMERENnSEL_SHIFT(n)	(15 + ((n) * 2))  static inline void sysctl_soft_reset(void __iomem *base)  { diff --git a/arch/arm/include/asm/hardware/vic.h b/arch/arm/include/asm/hardware/vic.h index e14af1a1a32..2bebad36fc8 100644 --- a/arch/arm/include/asm/hardware/vic.h +++ b/arch/arm/include/asm/hardware/vic.h @@ -47,7 +47,7 @@  struct device_node;  struct pt_regs; -void __vic_init(void __iomem *base, unsigned int irq_start, u32 vic_sources, +void __vic_init(void __iomem *base, int irq_start, u32 vic_sources,  		u32 resume_sources, struct device_node *node);  void vic_init(void __iomem *base, unsigned int irq_start, u32 vic_sources, u32 resume_sources);  int vic_of_init(struct device_node *node, struct device_node *parent); diff --git a/arch/arm/include/asm/hw_breakpoint.h b/arch/arm/include/asm/hw_breakpoint.h index c190bc992f0..01169dd723f 100644 --- a/arch/arm/include/asm/hw_breakpoint.h +++ b/arch/arm/include/asm/hw_breakpoint.h @@ -98,12 +98,12 @@ static inline void decode_ctrl_reg(u32 reg,  #define ARM_BASE_WCR		112  /* Accessor macros for the debug registers. */ -#define ARM_DBG_READ(M, OP2, VAL) do {\ -	asm volatile("mrc p14, 0, %0, c0," #M ", " #OP2 : "=r" (VAL));\ +#define ARM_DBG_READ(N, M, OP2, VAL) do {\ +	asm volatile("mrc p14, 0, %0, " #N "," #M ", " #OP2 : "=r" (VAL));\  } while (0) -#define ARM_DBG_WRITE(M, OP2, VAL) do {\ -	asm volatile("mcr p14, 0, %0, c0," #M ", " #OP2 : : "r" (VAL));\ +#define ARM_DBG_WRITE(N, M, OP2, VAL) do {\ +	asm volatile("mcr p14, 0, %0, " #N "," #M ", " #OP2 : : "r" (VAL));\  } while (0)  struct notifier_block; diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index 42f042ee4ad..652b56086de 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h @@ -374,7 +374,7 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *addr);  #ifdef CONFIG_MMU  #define ARCH_HAS_VALID_PHYS_ADDR_RANGE -extern int valid_phys_addr_range(unsigned long addr, size_t size); +extern int valid_phys_addr_range(phys_addr_t addr, size_t size);  extern int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);  extern int devmem_is_allowed(unsigned long pfn);  #endif diff --git a/arch/arm/include/asm/mach/map.h b/arch/arm/include/asm/mach/map.h index 195ac2f9d3d..2fe141fcc8d 100644 --- a/arch/arm/include/asm/mach/map.h +++ b/arch/arm/include/asm/mach/map.h @@ -40,6 +40,13 @@ extern void iotable_init(struct map_desc *, int);  extern void vm_reserve_area_early(unsigned long addr, unsigned long size,  				  void *caller); +#ifdef CONFIG_DEBUG_LL +extern void debug_ll_addr(unsigned long *paddr, unsigned long *vaddr); +extern void debug_ll_io_init(void); +#else +static inline void debug_ll_io_init(void) {} +#endif +  struct mem_type;  extern const struct mem_type *get_mem_type(unsigned int type);  /* diff --git a/arch/arm/include/asm/mach/serial_at91.h b/arch/arm/include/asm/mach/serial_at91.h deleted file mode 100644 index ea6d063923b..00000000000 --- a/arch/arm/include/asm/mach/serial_at91.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - *  arch/arm/include/asm/mach/serial_at91.h - * - *  Based on serial_sa1100.h  by Nicolas Pitre - * - *  Copyright (C) 2002 ATMEL Rousset - * - *  Low level machine dependent UART functions. - */ - -struct uart_port; - -/* - * This is a temporary structure for registering these - * functions; it is intended to be discarded after boot. - */ -struct atmel_port_fns { -	void	(*set_mctrl)(struct uart_port *, u_int); -	u_int	(*get_mctrl)(struct uart_port *); -	void	(*enable_ms)(struct uart_port *); -	void	(*pm)(struct uart_port *, u_int, u_int); -	int	(*set_wake)(struct uart_port *, u_int); -	int	(*open)(struct uart_port *); -	void	(*close)(struct uart_port *); -}; - -#if defined(CONFIG_SERIAL_ATMEL) -void atmel_register_uart_fns(struct atmel_port_fns *fns); -#else -#define atmel_register_uart_fns(fns) do { } while (0) -#endif - - diff --git a/arch/arm/include/asm/mach/serial_sa1100.h b/arch/arm/include/asm/mach/serial_sa1100.h deleted file mode 100644 index d09064bf95a..00000000000 --- a/arch/arm/include/asm/mach/serial_sa1100.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - *  arch/arm/include/asm/mach/serial_sa1100.h - * - *  Author: Nicolas Pitre - * - * Moved and changed lots, Russell King - * - * Low level machine dependent UART functions. - */ - -struct uart_port; -struct uart_info; - -/* - * This is a temporary structure for registering these - * functions; it is intended to be discarded after boot. - */ -struct sa1100_port_fns { -	void	(*set_mctrl)(struct uart_port *, u_int); -	u_int	(*get_mctrl)(struct uart_port *); -	void	(*pm)(struct uart_port *, u_int, u_int); -	int	(*set_wake)(struct uart_port *, u_int); -}; - -#ifdef CONFIG_SERIAL_SA1100 -void sa1100_register_uart_fns(struct sa1100_port_fns *fns); -void sa1100_register_uart(int idx, int port); -#else -#define sa1100_register_uart_fns(fns) do { } while (0) -#define sa1100_register_uart(idx,port) do { } while (0) -#endif diff --git a/arch/arm/include/asm/mach/udc_pxa2xx.h b/arch/arm/include/asm/mach/udc_pxa2xx.h deleted file mode 100644 index ea297ac70bc..00000000000 --- a/arch/arm/include/asm/mach/udc_pxa2xx.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * arch/arm/include/asm/mach/udc_pxa2xx.h - * - * This supports machine-specific differences in how the PXA2xx - * USB Device Controller (UDC) is wired. - * - * It is set in linux/arch/arm/mach-pxa/<machine>.c or in - * linux/arch/mach-ixp4xx/<machine>.c and used in - * the probe routine of linux/drivers/usb/gadget/pxa2xx_udc.c - */ - -struct pxa2xx_udc_mach_info { -        int  (*udc_is_connected)(void);		/* do we see host? */ -        void (*udc_command)(int cmd); -#define	PXA2XX_UDC_CMD_CONNECT		0	/* let host see us */ -#define	PXA2XX_UDC_CMD_DISCONNECT	1	/* so host won't see us */ - -	/* Boards following the design guidelines in the developer's manual, -	 * with on-chip GPIOs not Lubbock's weird hardware, can have a sane -	 * VBUS IRQ and omit the methods above.  Store the GPIO number -	 * here.  Note that sometimes the signals go through inverters... -	 */ -	bool	gpio_pullup_inverted; -	int	gpio_pullup;			/* high == pullup activated */ -}; - diff --git a/arch/arm/include/asm/mmu.h b/arch/arm/include/asm/mmu.h index 14965658a92..9f77e7804f3 100644 --- a/arch/arm/include/asm/mmu.h +++ b/arch/arm/include/asm/mmu.h @@ -5,18 +5,15 @@  typedef struct {  #ifdef CONFIG_CPU_HAS_ASID -	unsigned int id; -	raw_spinlock_t id_lock; +	u64 id;  #endif -	unsigned int kvm_seq; +	unsigned int vmalloc_seq;  } mm_context_t;  #ifdef CONFIG_CPU_HAS_ASID -#define ASID(mm)	((mm)->context.id & 255) - -/* init_mm.context.id_lock should be initialized. */ -#define INIT_MM_CONTEXT(name)                                                 \ -	.context.id_lock    = __RAW_SPIN_LOCK_UNLOCKED(name.context.id_lock), +#define ASID_BITS	8 +#define ASID_MASK	((~0ULL) << ASID_BITS) +#define ASID(mm)	((mm)->context.id & ~ASID_MASK)  #else  #define ASID(mm)	(0)  #endif diff --git a/arch/arm/include/asm/mmu_context.h b/arch/arm/include/asm/mmu_context.h index 0306bc642c0..e1f644bc7cc 100644 --- a/arch/arm/include/asm/mmu_context.h +++ b/arch/arm/include/asm/mmu_context.h @@ -20,88 +20,12 @@  #include <asm/proc-fns.h>  #include <asm-generic/mm_hooks.h> -void __check_kvm_seq(struct mm_struct *mm); +void __check_vmalloc_seq(struct mm_struct *mm);  #ifdef CONFIG_CPU_HAS_ASID -/* - * On ARMv6, we have the following structure in the Context ID: - * - * 31                         7          0 - * +-------------------------+-----------+ - * |      process ID         |   ASID    | - * +-------------------------+-----------+ - * |              context ID             | - * +-------------------------------------+ - * - * The ASID is used to tag entries in the CPU caches and TLBs. - * The context ID is used by debuggers and trace logic, and - * should be unique within all running processes. - */ -#define ASID_BITS		8 -#define ASID_MASK		((~0) << ASID_BITS) -#define ASID_FIRST_VERSION	(1 << ASID_BITS) - -extern unsigned int cpu_last_asid; - -void __init_new_context(struct task_struct *tsk, struct mm_struct *mm); -void __new_context(struct mm_struct *mm); -void cpu_set_reserved_ttbr0(void); - -static inline void switch_new_context(struct mm_struct *mm) -{ -	unsigned long flags; - -	__new_context(mm); - -	local_irq_save(flags); -	cpu_switch_mm(mm->pgd, mm); -	local_irq_restore(flags); -} - -static inline void check_and_switch_context(struct mm_struct *mm, -					    struct task_struct *tsk) -{ -	if (unlikely(mm->context.kvm_seq != init_mm.context.kvm_seq)) -		__check_kvm_seq(mm); - -	/* -	 * Required during context switch to avoid speculative page table -	 * walking with the wrong TTBR. -	 */ -	cpu_set_reserved_ttbr0(); - -	if (!((mm->context.id ^ cpu_last_asid) >> ASID_BITS)) -		/* -		 * The ASID is from the current generation, just switch to the -		 * new pgd. This condition is only true for calls from -		 * context_switch() and interrupts are already disabled. -		 */ -		cpu_switch_mm(mm->pgd, mm); -	else if (irqs_disabled()) -		/* -		 * Defer the new ASID allocation until after the context -		 * switch critical region since __new_context() cannot be -		 * called with interrupts disabled (it sends IPIs). -		 */ -		set_ti_thread_flag(task_thread_info(tsk), TIF_SWITCH_MM); -	else -		/* -		 * That is a direct call to switch_mm() or activate_mm() with -		 * interrupts enabled and a new context. -		 */ -		switch_new_context(mm); -} - -#define init_new_context(tsk,mm)	(__init_new_context(tsk,mm),0) - -#define finish_arch_post_lock_switch \ -	finish_arch_post_lock_switch -static inline void finish_arch_post_lock_switch(void) -{ -	if (test_and_clear_thread_flag(TIF_SWITCH_MM)) -		switch_new_context(current->mm); -} +void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk); +#define init_new_context(tsk,mm)	({ mm->context.id = 0; })  #else	/* !CONFIG_CPU_HAS_ASID */ @@ -110,8 +34,8 @@ static inline void finish_arch_post_lock_switch(void)  static inline void check_and_switch_context(struct mm_struct *mm,  					    struct task_struct *tsk)  { -	if (unlikely(mm->context.kvm_seq != init_mm.context.kvm_seq)) -		__check_kvm_seq(mm); +	if (unlikely(mm->context.vmalloc_seq != init_mm.context.vmalloc_seq)) +		__check_vmalloc_seq(mm);  	if (irqs_disabled())  		/* @@ -143,6 +67,7 @@ static inline void finish_arch_post_lock_switch(void)  #endif	/* CONFIG_CPU_HAS_ASID */  #define destroy_context(mm)		do { } while(0) +#define activate_mm(prev,next)		switch_mm(prev, next, NULL)  /*   * This is called when "tsk" is about to enter lazy TLB mode. @@ -186,6 +111,5 @@ switch_mm(struct mm_struct *prev, struct mm_struct *next,  }  #define deactivate_mm(tsk,mm)	do { } while (0) -#define activate_mm(prev,next)	switch_mm(prev, next, NULL)  #endif diff --git a/arch/arm/include/asm/percpu.h b/arch/arm/include/asm/percpu.h new file mode 100644 index 00000000000..968c0a14e0a --- /dev/null +++ b/arch/arm/include/asm/percpu.h @@ -0,0 +1,45 @@ +/* + * Copyright 2012 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef _ASM_ARM_PERCPU_H_ +#define _ASM_ARM_PERCPU_H_ + +/* + * Same as asm-generic/percpu.h, except that we store the per cpu offset + * in the TPIDRPRW. TPIDRPRW only exists on V6K and V7 + */ +#if defined(CONFIG_SMP) && !defined(CONFIG_CPU_V6) +static inline void set_my_cpu_offset(unsigned long off) +{ +	/* Set TPIDRPRW */ +	asm volatile("mcr p15, 0, %0, c13, c0, 4" : : "r" (off) : "memory"); +} + +static inline unsigned long __my_cpu_offset(void) +{ +	unsigned long off; +	/* Read TPIDRPRW */ +	asm("mrc p15, 0, %0, c13, c0, 4" : "=r" (off) : : "memory"); +	return off; +} +#define __my_cpu_offset __my_cpu_offset() +#else +#define set_my_cpu_offset(x)	do {} while(0) + +#endif /* CONFIG_SMP */ + +#include <asm-generic/percpu.h> + +#endif /* _ASM_ARM_PERCPU_H_ */ diff --git a/arch/arm/include/asm/perf_event.h b/arch/arm/include/asm/perf_event.h index 625cd621a43..755877527cf 100644 --- a/arch/arm/include/asm/perf_event.h +++ b/arch/arm/include/asm/perf_event.h @@ -21,4 +21,11 @@  #define C(_x)				PERF_COUNT_HW_CACHE_##_x  #define CACHE_OP_UNSUPPORTED		0xFFFF +#ifdef CONFIG_HW_PERF_EVENTS +struct pt_regs; +extern unsigned long perf_instruction_pointer(struct pt_regs *regs); +extern unsigned long perf_misc_flags(struct pt_regs *regs); +#define perf_misc_flags(regs)	perf_misc_flags(regs) +#endif +  #endif /* __ARM_PERF_EVENT_H__ */ diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h index 2317a71c8f8..f97ee02386e 100644 --- a/arch/arm/include/asm/pgtable-2level.h +++ b/arch/arm/include/asm/pgtable-2level.h @@ -115,6 +115,7 @@   * The PTE table pointer refers to the hardware entries; the "Linux"   * entries are stored 1024 bytes below.   */ +#define L_PTE_VALID		(_AT(pteval_t, 1) << 0)		/* Valid */  #define L_PTE_PRESENT		(_AT(pteval_t, 1) << 0)  #define L_PTE_YOUNG		(_AT(pteval_t, 1) << 1)  #define L_PTE_FILE		(_AT(pteval_t, 1) << 2)	/* only when !PRESENT */ @@ -123,6 +124,7 @@  #define L_PTE_USER		(_AT(pteval_t, 1) << 8)  #define L_PTE_XN		(_AT(pteval_t, 1) << 9)  #define L_PTE_SHARED		(_AT(pteval_t, 1) << 10)	/* shared(v6), coherent(xsc3) */ +#define L_PTE_NONE		(_AT(pteval_t, 1) << 11)  /*   * These are the memory types, defined to be compatible with diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h index b24903549d1..a3f37929940 100644 --- a/arch/arm/include/asm/pgtable-3level.h +++ b/arch/arm/include/asm/pgtable-3level.h @@ -67,7 +67,8 @@   * These bits overlap with the hardware bits but the naming is preserved for   * consistency with the classic page table format.   */ -#define L_PTE_PRESENT		(_AT(pteval_t, 3) << 0)		/* Valid */ +#define L_PTE_VALID		(_AT(pteval_t, 1) << 0)		/* Valid */ +#define L_PTE_PRESENT		(_AT(pteval_t, 3) << 0)		/* Present */  #define L_PTE_FILE		(_AT(pteval_t, 1) << 2)		/* only when !PRESENT */  #define L_PTE_USER		(_AT(pteval_t, 1) << 6)		/* AP[1] */  #define L_PTE_RDONLY		(_AT(pteval_t, 1) << 7)		/* AP[2] */ @@ -76,6 +77,7 @@  #define L_PTE_XN		(_AT(pteval_t, 1) << 54)	/* XN */  #define L_PTE_DIRTY		(_AT(pteval_t, 1) << 55)	/* unused */  #define L_PTE_SPECIAL		(_AT(pteval_t, 1) << 56)	/* unused */ +#define L_PTE_NONE		(_AT(pteval_t, 1) << 57)	/* PROT_NONE */  /*   * To be used in assembly code with the upper page attributes. diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index 08c12312a1f..9c82f988c0e 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h @@ -73,7 +73,7 @@ extern pgprot_t		pgprot_kernel;  #define _MOD_PROT(p, b)	__pgprot(pgprot_val(p) | (b)) -#define PAGE_NONE		_MOD_PROT(pgprot_user, L_PTE_XN | L_PTE_RDONLY) +#define PAGE_NONE		_MOD_PROT(pgprot_user, L_PTE_XN | L_PTE_RDONLY | L_PTE_NONE)  #define PAGE_SHARED		_MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_XN)  #define PAGE_SHARED_EXEC	_MOD_PROT(pgprot_user, L_PTE_USER)  #define PAGE_COPY		_MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_RDONLY | L_PTE_XN) @@ -83,7 +83,7 @@ extern pgprot_t		pgprot_kernel;  #define PAGE_KERNEL		_MOD_PROT(pgprot_kernel, L_PTE_XN)  #define PAGE_KERNEL_EXEC	pgprot_kernel -#define __PAGE_NONE		__pgprot(_L_PTE_DEFAULT | L_PTE_RDONLY | L_PTE_XN) +#define __PAGE_NONE		__pgprot(_L_PTE_DEFAULT | L_PTE_RDONLY | L_PTE_XN | L_PTE_NONE)  #define __PAGE_SHARED		__pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_XN)  #define __PAGE_SHARED_EXEC	__pgprot(_L_PTE_DEFAULT | L_PTE_USER)  #define __PAGE_COPY		__pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_RDONLY | L_PTE_XN) @@ -203,9 +203,7 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd)  #define pte_exec(pte)		(!(pte_val(pte) & L_PTE_XN))  #define pte_special(pte)	(0) -#define pte_present_user(pte) \ -	((pte_val(pte) & (L_PTE_PRESENT | L_PTE_USER)) == \ -	 (L_PTE_PRESENT | L_PTE_USER)) +#define pte_present_user(pte)  (pte_present(pte) && (pte_val(pte) & L_PTE_USER))  #if __LINUX_ARM_ARCH__ < 6  static inline void __sync_icache_dcache(pte_t pteval) @@ -242,7 +240,7 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; }  static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)  { -	const pteval_t mask = L_PTE_XN | L_PTE_RDONLY | L_PTE_USER; +	const pteval_t mask = L_PTE_XN | L_PTE_RDONLY | L_PTE_USER | L_PTE_NONE;  	pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask);  	return pte;  } diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index a26170dce02..f24edad26c7 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h @@ -67,19 +67,19 @@ struct arm_pmu {  	cpumask_t	active_irqs;  	char		*name;  	irqreturn_t	(*handle_irq)(int irq_num, void *dev); -	void		(*enable)(struct hw_perf_event *evt, int idx); -	void		(*disable)(struct hw_perf_event *evt, int idx); +	void		(*enable)(struct perf_event *event); +	void		(*disable)(struct perf_event *event);  	int		(*get_event_idx)(struct pmu_hw_events *hw_events, -					 struct hw_perf_event *hwc); +					 struct perf_event *event);  	int		(*set_event_filter)(struct hw_perf_event *evt,  					    struct perf_event_attr *attr); -	u32		(*read_counter)(int idx); -	void		(*write_counter)(int idx, u32 val); -	void		(*start)(void); -	void		(*stop)(void); +	u32		(*read_counter)(struct perf_event *event); +	void		(*write_counter)(struct perf_event *event, u32 val); +	void		(*start)(struct arm_pmu *); +	void		(*stop)(struct arm_pmu *);  	void		(*reset)(void *); -	int		(*request_irq)(irq_handler_t handler); -	void		(*free_irq)(void); +	int		(*request_irq)(struct arm_pmu *, irq_handler_t handler); +	void		(*free_irq)(struct arm_pmu *);  	int		(*map_event)(struct perf_event *event);  	int		num_events;  	atomic_t	active_events; @@ -93,15 +93,11 @@ struct arm_pmu {  extern const struct dev_pm_ops armpmu_dev_pm_ops; -int armpmu_register(struct arm_pmu *armpmu, char *name, int type); +int armpmu_register(struct arm_pmu *armpmu, int type); -u64 armpmu_event_update(struct perf_event *event, -			struct hw_perf_event *hwc, -			int idx); +u64 armpmu_event_update(struct perf_event *event); -int armpmu_event_set_period(struct perf_event *event, -			    struct hw_perf_event *hwc, -			    int idx); +int armpmu_event_set_period(struct perf_event *event);  int armpmu_map_event(struct perf_event *event,  		     const unsigned (*event_map)[PERF_COUNT_HW_MAX], diff --git a/arch/arm/include/asm/prom.h b/arch/arm/include/asm/prom.h index aeae9c609df..a219227c3e4 100644 --- a/arch/arm/include/asm/prom.h +++ b/arch/arm/include/asm/prom.h @@ -11,10 +11,13 @@  #ifndef __ASMARM_PROM_H  #define __ASMARM_PROM_H +#define HAVE_ARCH_DEVTREE_FIXUPS +  #ifdef CONFIG_OF  extern struct machine_desc *setup_machine_fdt(unsigned int dt_phys);  extern void arm_dt_memblock_reserve(void); +extern void __init arm_dt_init_cpu_maps(void);  #else /* CONFIG_OF */ @@ -24,6 +27,7 @@ static inline struct machine_desc *setup_machine_fdt(unsigned int dt_phys)  }  static inline void arm_dt_memblock_reserve(void) { } +static inline void arm_dt_init_cpu_maps(void) { }  #endif /* CONFIG_OF */  #endif /* ASMARM_PROM_H */ diff --git a/arch/arm/include/asm/signal.h b/arch/arm/include/asm/signal.h index 5a7963dbd3f..9a0ea6ab988 100644 --- a/arch/arm/include/asm/signal.h +++ b/arch/arm/include/asm/signal.h @@ -35,5 +35,4 @@ struct k_sigaction {  };  #include <asm/sigcontext.h> -#define ptrace_signal_deliver(regs, cookie) do { } while (0)  #endif diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h index 2e3be16c676..d3a22bebe6c 100644 --- a/arch/arm/include/asm/smp.h +++ b/arch/arm/include/asm/smp.h @@ -79,6 +79,7 @@ extern void cpu_die(void);  extern void arch_send_call_function_single_ipi(int cpu);  extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); +extern void arch_send_wakeup_ipi_mask(const struct cpumask *mask);  struct smp_operations {  #ifdef CONFIG_SMP diff --git a/arch/arm/include/asm/smp_plat.h b/arch/arm/include/asm/smp_plat.h index 558d6c80aca..aaa61b6f50f 100644 --- a/arch/arm/include/asm/smp_plat.h +++ b/arch/arm/include/asm/smp_plat.h @@ -5,6 +5,9 @@  #ifndef __ASMARM_SMP_PLAT_H  #define __ASMARM_SMP_PLAT_H +#include <linux/cpumask.h> +#include <linux/err.h> +  #include <asm/cputype.h>  /* @@ -48,5 +51,19 @@ static inline int cache_ops_need_broadcast(void)   */  extern int __cpu_logical_map[];  #define cpu_logical_map(cpu)	__cpu_logical_map[cpu] +/* + * Retrieve logical cpu index corresponding to a given MPIDR[23:0] + *  - mpidr: MPIDR[23:0] to be used for the look-up + * + * Returns the cpu logical index or -EINVAL on look-up error + */ +static inline int get_logical_index(u32 mpidr) +{ +	int cpu; +	for (cpu = 0; cpu < nr_cpu_ids; cpu++) +		if (cpu_logical_map(cpu) == mpidr) +			return cpu; +	return -EINVAL; +}  #endif diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h index 9fdded6b108..f1d96d4e809 100644 --- a/arch/arm/include/asm/syscall.h +++ b/arch/arm/include/asm/syscall.h @@ -7,6 +7,8 @@  #ifndef _ASM_ARM_SYSCALL_H  #define _ASM_ARM_SYSCALL_H +#include <linux/audit.h> /* for AUDIT_ARCH_* */ +#include <linux/elf.h> /* for ELF_EM */  #include <linux/err.h>  #include <linux/sched.h> @@ -95,4 +97,11 @@ static inline void syscall_set_arguments(struct task_struct *task,  	memcpy(®s->ARM_r0 + i, args, n * sizeof(args[0]));  } +static inline int syscall_get_arch(struct task_struct *task, +				   struct pt_regs *regs) +{ +	/* ARM tasks don't change audit architectures on the fly. */ +	return AUDIT_ARCH_ARM; +} +  #endif /* _ASM_ARM_SYSCALL_H */ diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h index 8477b4c1d39..cddda1f41f0 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h @@ -151,10 +151,10 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,  #define TIF_SYSCALL_TRACE	8  #define TIF_SYSCALL_AUDIT	9  #define TIF_SYSCALL_TRACEPOINT	10 +#define TIF_SECCOMP		11	/* seccomp syscall filtering active */  #define TIF_USING_IWMMXT	17  #define TIF_MEMDIE		18	/* is terminating due to OOM killer */  #define TIF_RESTORE_SIGMASK	20 -#define TIF_SECCOMP		21  #define TIF_SWITCH_MM		22	/* deferred switch_mm */  #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING) @@ -163,11 +163,12 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,  #define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE)  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)  #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT) -#define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)  #define _TIF_SECCOMP		(1 << TIF_SECCOMP) +#define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)  /* Checks for any syscall work in entry-common.S */ -#define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SYSCALL_TRACEPOINT) +#define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ +			   _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP)  /*   * Change these and you break ASM code in entry-common.S diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index 8f60b6e6bd4..7cd13cc6262 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h @@ -42,6 +42,9 @@  #define __ARCH_WANT_SYS_SOCKETCALL  #endif  #define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/arm/include/debug/sunxi.S b/arch/arm/include/debug/sunxi.S new file mode 100644 index 00000000000..04eb56d5db2 --- /dev/null +++ b/arch/arm/include/debug/sunxi.S @@ -0,0 +1,27 @@ +/* + * Early serial output macro for Allwinner A1X SoCs + * + * Copyright (C) 2012 Maxime Ripard + * + * Maxime Ripard <maxime.ripard@free-electrons.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. +*/ + +#if defined(CONFIG_DEBUG_SUNXI_UART0) +#define SUNXI_UART_DEBUG_PHYS_BASE 0x01c28000 +#define SUNXI_UART_DEBUG_VIRT_BASE 0xf1c28000 +#elif defined(CONFIG_DEBUG_SUNXI_UART1) +#define SUNXI_UART_DEBUG_PHYS_BASE 0x01c28400 +#define SUNXI_UART_DEBUG_VIRT_BASE 0xf1c28400 +#endif + +	.macro	addruart, rp, rv, tmp +	ldr	\rp, =SUNXI_UART_DEBUG_PHYS_BASE +	ldr	\rv, =SUNXI_UART_DEBUG_VIRT_BASE +	.endm + +#define UART_SHIFT	2 +#include <asm/hardware/debug-8250.S> diff --git a/arch/arm/include/debug/tegra.S b/arch/arm/include/debug/tegra.S new file mode 100644 index 00000000000..883d7c22fd9 --- /dev/null +++ b/arch/arm/include/debug/tegra.S @@ -0,0 +1,223 @@ +/* + * Copyright (C) 2010,2011 Google, Inc. + * Copyright (C) 2011-2012 NVIDIA CORPORATION. All Rights Reserved. + * + * Author: + *	Colin Cross <ccross@google.com> + *	Erik Gilling <konkers@google.com> + *	Doug Anderson <dianders@chromium.org> + *	Stephen Warren <swarren@nvidia.com> + * + * Portions based on mach-omap2's debug-macro.S + * Copyright (C) 1994-1999 Russell King + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + */ + +#include <linux/serial_reg.h> + +#define UART_SHIFT 2 + +/* Physical addresses */ +#define TEGRA_CLK_RESET_BASE		0x60006000 +#define TEGRA_APB_MISC_BASE		0x70000000 +#define TEGRA_UARTA_BASE		0x70006000 +#define TEGRA_UARTB_BASE		0x70006040 +#define TEGRA_UARTC_BASE		0x70006200 +#define TEGRA_UARTD_BASE		0x70006300 +#define TEGRA_UARTE_BASE		0x70006400 +#define TEGRA_PMC_BASE			0x7000e400 + +#define TEGRA_CLK_RST_DEVICES_L		(TEGRA_CLK_RESET_BASE + 0x04) +#define TEGRA_CLK_RST_DEVICES_H		(TEGRA_CLK_RESET_BASE + 0x08) +#define TEGRA_CLK_RST_DEVICES_U		(TEGRA_CLK_RESET_BASE + 0x0c) +#define TEGRA_CLK_OUT_ENB_L		(TEGRA_CLK_RESET_BASE + 0x10) +#define TEGRA_CLK_OUT_ENB_H		(TEGRA_CLK_RESET_BASE + 0x14) +#define TEGRA_CLK_OUT_ENB_U		(TEGRA_CLK_RESET_BASE + 0x18) +#define TEGRA_PMC_SCRATCH20		(TEGRA_PMC_BASE + 0xa0) +#define TEGRA_APB_MISC_GP_HIDREV	(TEGRA_APB_MISC_BASE + 0x804) + +/* + * Must be 1MB-aligned since a 1MB mapping is used early on. + * Must not overlap with regions in mach-tegra/io.c:tegra_io_desc[]. + */ +#define UART_VIRTUAL_BASE		0xfe100000 + +#define checkuart(rp, rv, lhu, bit, uart) \ +		/* Load address of CLK_RST register */ \ +		movw	rp, #TEGRA_CLK_RST_DEVICES_##lhu & 0xffff ; \ +		movt	rp, #TEGRA_CLK_RST_DEVICES_##lhu >> 16 ; \ +		/* Load value from CLK_RST register */ \ +		ldr	rp, [rp, #0] ; \ +		/* Test UART's reset bit */ \ +		tst	rp, #(1 << bit) ; \ +		/* If set, can't use UART; jump to save no UART */ \ +		bne	90f ; \ +		/* Load address of CLK_OUT_ENB register */ \ +		movw	rp, #TEGRA_CLK_OUT_ENB_##lhu & 0xffff ; \ +		movt	rp, #TEGRA_CLK_OUT_ENB_##lhu >> 16 ; \ +		/* Load value from CLK_OUT_ENB register */ \ +		ldr	rp, [rp, #0] ; \ +		/* Test UART's clock enable bit */ \ +		tst	rp, #(1 << bit) ; \ +		/* If clear, can't use UART; jump to save no UART */ \ +		beq	90f ; \ +		/* Passed all tests, load address of UART registers */ \ +		movw	rp, #TEGRA_UART##uart##_BASE & 0xffff ; \ +		movt	rp, #TEGRA_UART##uart##_BASE >> 16 ; \ +		/* Jump to save UART address */ \ +		b 91f + +		.macro  addruart, rp, rv, tmp +		adr	\rp, 99f		@ actual addr of 99f +		ldr	\rv, [\rp]		@ linked addr is stored there +		sub	\rv, \rv, \rp		@ offset between the two +		ldr	\rp, [\rp, #4]		@ linked tegra_uart_config +		sub	\tmp, \rp, \rv		@ actual tegra_uart_config +		ldr	\rp, [\tmp]		@ Load tegra_uart_config +		cmp	\rp, #1			@ needs initialization? +		bne	100f			@ no; go load the addresses +		mov	\rv, #0			@ yes; record init is done +		str	\rv, [\tmp] + +#ifdef CONFIG_TEGRA_DEBUG_UART_AUTO_ODMDATA +		/* Check ODMDATA */ +10:		movw	\rp, #TEGRA_PMC_SCRATCH20 & 0xffff +		movt	\rp, #TEGRA_PMC_SCRATCH20 >> 16 +		ldr	\rp, [\rp, #0]		@ Load PMC_SCRATCH20 +		ubfx	\rv, \rp, #18, #2	@ 19:18 are console type +		cmp	\rv, #2			@ 2 and 3 mean DCC, UART +		beq	11f			@ some boards swap the meaning +		cmp	\rv, #3			@ so accept either +		bne	90f +11:		ubfx	\rv, \rp, #15, #3	@ 17:15 are UART ID +		cmp	\rv, #0			@ UART 0? +		beq	20f +		cmp	\rv, #1			@ UART 1? +		beq	21f +		cmp	\rv, #2			@ UART 2? +		beq	22f +		cmp	\rv, #3			@ UART 3? +		beq	23f +		cmp	\rv, #4			@ UART 4? +		beq	24f +		b	90f			@ invalid +#endif + +#if defined(CONFIG_TEGRA_DEBUG_UARTA) || \ +    defined(CONFIG_TEGRA_DEBUG_UART_AUTO_ODMDATA) +		/* Check UART A validity */ +20:		checkuart(\rp, \rv, L, 6, A) +#endif + +#if defined(CONFIG_TEGRA_DEBUG_UARTB) || \ +    defined(CONFIG_TEGRA_DEBUG_UART_AUTO_ODMDATA) +		/* Check UART B validity */ +21:		checkuart(\rp, \rv, L, 7, B) +#endif + +#if defined(CONFIG_TEGRA_DEBUG_UARTC) || \ +    defined(CONFIG_TEGRA_DEBUG_UART_AUTO_ODMDATA) +		/* Check UART C validity */ +22:		checkuart(\rp, \rv, H, 23, C) +#endif + +#if defined(CONFIG_TEGRA_DEBUG_UARTD) || \ +    defined(CONFIG_TEGRA_DEBUG_UART_AUTO_ODMDATA) +		/* Check UART D validity */ +23:		checkuart(\rp, \rv, U, 1, D) +#endif + +#if defined(CONFIG_TEGRA_DEBUG_UARTE) || \ +    defined(CONFIG_TEGRA_DEBUG_UART_AUTO_ODMDATA) +		/* Check UART E validity */ +24: +		checkuart(\rp, \rv, U, 2, E) +#endif + +		/* No valid UART found */ +90:		mov	\rp, #0 +		/* fall through */ + +		/* Record whichever UART we chose */ +91:		str	\rp, [\tmp, #4]		@ Store in tegra_uart_phys +		cmp	\rp, #0			@ Valid UART address? +		bne	92f			@ Yes, go process it +		str	\rp, [\tmp, #8]		@ Store 0 in tegra_uart_virt +		b	100f			@ Done +92:		and	\rv, \rp, #0xffffff	@ offset within 1MB section +		add	\rv, \rv, #UART_VIRTUAL_BASE +		str	\rv, [\tmp, #8]		@ Store in tegra_uart_virt +		movw	\rv, #TEGRA_APB_MISC_GP_HIDREV & 0xffff +		movt	\rv, #TEGRA_APB_MISC_GP_HIDREV >> 16 +		ldr	\rv, [\rv, #0]		@ Load HIDREV +		ubfx	\rv, \rv, #8, #8	@ 15:8 are SoC version +		cmp	\rv, #0x20		@ Tegra20? +		moveq	\rv, #0x75		@ Tegra20 divisor +		movne	\rv, #0xdd		@ Tegra30 divisor +		str	\rv, [\tmp, #12]	@ Save divisor to scratch +		/* uart[UART_LCR] = UART_LCR_WLEN8 | UART_LCR_DLAB; */ +		mov	\rv, #UART_LCR_WLEN8 | UART_LCR_DLAB +		str	\rv, [\rp, #UART_LCR << UART_SHIFT] +		/* uart[UART_DLL] = div & 0xff; */ +		ldr	\rv, [\tmp, #12] +		and	\rv, \rv, #0xff +		str	\rv, [\rp, #UART_DLL << UART_SHIFT] +		/* uart[UART_DLM] = div >> 8; */ +		ldr	\rv, [\tmp, #12] +		lsr	\rv, \rv, #8 +		str	\rv, [\rp, #UART_DLM << UART_SHIFT] +		/* uart[UART_LCR] = UART_LCR_WLEN8; */ +		mov	\rv, #UART_LCR_WLEN8 +		str	\rv, [\rp, #UART_LCR << UART_SHIFT] +		b	100f + +		.align +99:		.word	. +		.word	tegra_uart_config +		.ltorg + +		/* Load previously selected UART address */ +100:		ldr	\rp, [\tmp, #4]		@ Load tegra_uart_phys +		ldr	\rv, [\tmp, #8]		@ Load tegra_uart_virt +		.endm + +/* + * Code below is swiped from <asm/hardware/debug-8250.S>, but add an extra + * check to make sure that the UART address is actually valid. + */ + +		.macro	senduart, rd, rx +		cmp	\rx, #0 +		strneb	\rd, [\rx, #UART_TX << UART_SHIFT] +1001: +		.endm + +		.macro	busyuart, rd, rx +		cmp	\rx, #0 +		beq	1002f +1001:		ldrb	\rd, [\rx, #UART_LSR << UART_SHIFT] +		and	\rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE +		teq	\rd, #UART_LSR_TEMT | UART_LSR_THRE +		bne	1001b +1002: +		.endm + +		.macro	waituart, rd, rx +#ifdef FLOW_CONTROL +		cmp	\rx, #0 +		beq	1002f +1001:		ldrb	\rd, [\rx, #UART_MSR << UART_SHIFT] +		tst	\rd, #UART_MSR_CTS +		beq	1001b +1002: +#endif +		.endm diff --git a/arch/arm/include/debug/vexpress.S b/arch/arm/include/debug/vexpress.S index 9f509f55d07..dc8e882a625 100644 --- a/arch/arm/include/debug/vexpress.S +++ b/arch/arm/include/debug/vexpress.S @@ -21,14 +21,17 @@  #if defined(CONFIG_DEBUG_VEXPRESS_UART0_DETECT)  		.macro	addruart,rp,rv,tmp +		.arch   armv7-a  		@ Make an educated guess regarding the memory map: -		@ - the original A9 core tile, which has MPCore peripherals -		@   located at 0x1e000000, should use UART at 0x10009000 +		@ - the original A9 core tile (based on ARM Cortex-A9 r0p1) +		@   should use UART at 0x10009000  		@ - all other (RS1 complaint) tiles use UART mapped  		@   at 0x1c090000 -		mrc	p15, 4, \tmp, c15, c0, 0 -		cmp	\tmp, #0x1e000000 +		mrc	p15, 0, \rp, c0, c0, 0 +		movw	\rv, #0xc091 +		movt	\rv, #0x410f +		cmp	\rp, \rv  		@ Original memory map  		moveq	\rp, #DEBUG_LL_UART_OFFSET diff --git a/arch/arm/mach-zynq/include/mach/debug-macro.S b/arch/arm/include/debug/zynq.S index 3ab0be1f619..f9aa9740a73 100644 --- a/arch/arm/mach-zynq/include/mach/debug-macro.S +++ b/arch/arm/include/debug/zynq.S @@ -1,5 +1,4 @@ -/* arch/arm/mach-zynq/include/mach/debug-macro.S - * +/*   * Debugging macro include header   *   *  Copyright (C) 2011 Xilinx @@ -13,9 +12,25 @@   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   * GNU General Public License for more details.   */ +#define UART_CR_OFFSET		0x00  /* Control Register [8:0] */ +#define UART_SR_OFFSET		0x2C  /* Channel Status [11:0] */ +#define UART_FIFO_OFFSET	0x30  /* FIFO [15:0] or [7:0] */ + +#define UART_SR_TXFULL		0x00000010	/* TX FIFO full */ +#define UART_SR_TXEMPTY		0x00000008	/* TX FIFO empty */ + +#define UART0_PHYS		0xE0000000 +#define UART1_PHYS		0xE0001000 +#define UART_SIZE		SZ_4K +#define UART_VIRT		0xF0001000 + +#if IS_ENABLED(CONFIG_DEBUG_ZYNQ_UART1) +# define LL_UART_PADDR		UART1_PHYS +#else +# define LL_UART_PADDR		UART0_PHYS +#endif -#include <mach/zynq_soc.h> -#include <mach/uart.h> +#define LL_UART_VADDR		UART_VIRT  		.macro	addruart, rp, rv, tmp  		ldr	\rp, =LL_UART_PADDR	@ physical diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 831cd38c8d9..5935b6a02e6 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S @@ -11,7 +11,7 @@   */  /* 0 */		CALL(sys_restart_syscall)  		CALL(sys_exit) -		CALL(sys_fork_wrapper) +		CALL(sys_fork)  		CALL(sys_read)  		CALL(sys_write)  /* 5 */		CALL(sys_open) @@ -129,7 +129,7 @@  		CALL(OBSOLETE(ABI(sys_ipc, sys_oabi_ipc)))  		CALL(sys_fsync)  		CALL(sys_sigreturn_wrapper) -/* 120 */	CALL(sys_clone_wrapper) +/* 120 */	CALL(sys_clone)  		CALL(sys_setdomainname)  		CALL(sys_newuname)  		CALL(sys_ni_syscall)		/* modify_ldt */ @@ -199,7 +199,7 @@  		CALL(sys_sendfile)  		CALL(sys_ni_syscall)		/* getpmsg */  		CALL(sys_ni_syscall)		/* putpmsg */ -/* 190 */	CALL(sys_vfork_wrapper) +/* 190 */	CALL(sys_vfork)  		CALL(sys_getrlimit)  		CALL(sys_mmap2)  		CALL(ABI(sys_truncate64, sys_oabi_truncate64)) diff --git a/arch/arm/kernel/debug.S b/arch/arm/kernel/debug.S index 66f711b2e0e..6809200c31f 100644 --- a/arch/arm/kernel/debug.S +++ b/arch/arm/kernel/debug.S @@ -100,6 +100,13 @@ ENTRY(printch)  		b	1b  ENDPROC(printch) +ENTRY(debug_ll_addr) +		addruart r2, r3, ip +		str	r2, [r0] +		str	r3, [r1] +		mov	pc, lr +ENDPROC(debug_ll_addr) +  #else  ENTRY(printascii) @@ -119,4 +126,11 @@ ENTRY(printch)  		mov	pc, lr  ENDPROC(printch) +ENTRY(debug_ll_addr) +		mov	r2, #0 +		str	r2, [r0] +		str	r2, [r1] +		mov	pc, lr +ENDPROC(debug_ll_addr) +  #endif diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c index bee7f9d47f0..70f1bdeb241 100644 --- a/arch/arm/kernel/devtree.c +++ b/arch/arm/kernel/devtree.c @@ -19,8 +19,10 @@  #include <linux/of_irq.h>  #include <linux/of_platform.h> +#include <asm/cputype.h>  #include <asm/setup.h>  #include <asm/page.h> +#include <asm/smp_plat.h>  #include <asm/mach/arch.h>  #include <asm/mach-types.h> @@ -61,6 +63,108 @@ void __init arm_dt_memblock_reserve(void)  	}  } +/* + * arm_dt_init_cpu_maps - Function retrieves cpu nodes from the device tree + * and builds the cpu logical map array containing MPIDR values related to + * logical cpus + * + * Updates the cpu possible mask with the number of parsed cpu nodes + */ +void __init arm_dt_init_cpu_maps(void) +{ +	/* +	 * Temp logical map is initialized with UINT_MAX values that are +	 * considered invalid logical map entries since the logical map must +	 * contain a list of MPIDR[23:0] values where MPIDR[31:24] must +	 * read as 0. +	 */ +	struct device_node *cpu, *cpus; +	u32 i, j, cpuidx = 1; +	u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0; + +	u32 tmp_map[NR_CPUS] = { [0 ... NR_CPUS-1] = UINT_MAX }; +	bool bootcpu_valid = false; +	cpus = of_find_node_by_path("/cpus"); + +	if (!cpus) +		return; + +	for_each_child_of_node(cpus, cpu) { +		u32 hwid; + +		pr_debug(" * %s...\n", cpu->full_name); +		/* +		 * A device tree containing CPU nodes with missing "reg" +		 * properties is considered invalid to build the +		 * cpu_logical_map. +		 */ +		if (of_property_read_u32(cpu, "reg", &hwid)) { +			pr_debug(" * %s missing reg property\n", +				     cpu->full_name); +			return; +		} + +		/* +		 * 8 MSBs must be set to 0 in the DT since the reg property +		 * defines the MPIDR[23:0]. +		 */ +		if (hwid & ~MPIDR_HWID_BITMASK) +			return; + +		/* +		 * Duplicate MPIDRs are a recipe for disaster. +		 * Scan all initialized entries and check for +		 * duplicates. If any is found just bail out. +		 * temp values were initialized to UINT_MAX +		 * to avoid matching valid MPIDR[23:0] values. +		 */ +		for (j = 0; j < cpuidx; j++) +			if (WARN(tmp_map[j] == hwid, "Duplicate /cpu reg " +						     "properties in the DT\n")) +				return; + +		/* +		 * Build a stashed array of MPIDR values. Numbering scheme +		 * requires that if detected the boot CPU must be assigned +		 * logical id 0. Other CPUs get sequential indexes starting +		 * from 1. If a CPU node with a reg property matching the +		 * boot CPU MPIDR is detected, this is recorded so that the +		 * logical map built from DT is validated and can be used +		 * to override the map created in smp_setup_processor_id(). +		 */ +		if (hwid == mpidr) { +			i = 0; +			bootcpu_valid = true; +		} else { +			i = cpuidx++; +		} + +		if (WARN(cpuidx > nr_cpu_ids, "DT /cpu %u nodes greater than " +					       "max cores %u, capping them\n", +					       cpuidx, nr_cpu_ids)) { +			cpuidx = nr_cpu_ids; +			break; +		} + +		tmp_map[i] = hwid; +	} + +	if (WARN(!bootcpu_valid, "DT missing boot CPU MPIDR[23:0], " +				 "fall back to default cpu_logical_map\n")) +		return; + +	/* +	 * Since the boot CPU node contains proper data, and all nodes have +	 * a reg property, the DT CPU list can be considered valid and the +	 * logical map created in smp_setup_processor_id() can be overridden +	 */ +	for (i = 0; i < cpuidx; i++) { +		set_cpu_possible(i, true); +		cpu_logical_map(i) = tmp_map[i]; +		pr_debug("cpu logical map 0x%x\n", cpu_logical_map(i)); +	} +} +  /**   * setup_machine_fdt - Machine setup when an dtb was passed to the kernel   * @dt_phys: physical address of dt blob diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 34711757ba5..a6c301e90a3 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -417,16 +417,6 @@ local_restart:  	ldr	r10, [tsk, #TI_FLAGS]		@ check for syscall tracing  	stmdb	sp!, {r4, r5}			@ push fifth and sixth args -#ifdef CONFIG_SECCOMP -	tst	r10, #_TIF_SECCOMP -	beq	1f -	mov	r0, scno -	bl	__secure_computing	 -	add	r0, sp, #S_R0 + S_OFF		@ pointer to regs -	ldmia	r0, {r0 - r3}			@ have to reload r0 - r3 -1: -#endif -  	tst	r10, #_TIF_SYSCALL_WORK		@ are we tracing syscalls?  	bne	__sys_trace @@ -458,11 +448,13 @@ __sys_trace:  	ldmccia	r1, {r0 - r6}			@ have to reload r0 - r6  	stmccia	sp, {r4, r5}			@ and update the stack args  	ldrcc	pc, [tbl, scno, lsl #2]		@ call sys_* routine -	b	2b +	cmp	scno, #-1			@ skip the syscall? +	bne	2b +	add	sp, sp, #S_OFF			@ restore stack +	b	ret_slow_syscall  __sys_trace_return:  	str	r0, [sp, #S_R0 + S_OFF]!	@ save returned r0 -	mov	r1, scno  	mov	r0, sp  	bl	syscall_trace_exit  	b	ret_slow_syscall @@ -510,22 +502,6 @@ sys_syscall:  		b	sys_ni_syscall  ENDPROC(sys_syscall) -sys_fork_wrapper: -		add	r0, sp, #S_OFF -		b	sys_fork -ENDPROC(sys_fork_wrapper) - -sys_vfork_wrapper: -		add	r0, sp, #S_OFF -		b	sys_vfork -ENDPROC(sys_vfork_wrapper) - -sys_clone_wrapper: -		add	ip, sp, #S_OFF -		str	ip, [sp, #4] -		b	sys_clone -ENDPROC(sys_clone_wrapper) -  sys_sigreturn_wrapper:  		add	r0, sp, #S_OFF  		mov	why, #0		@ prevent syscall restart handling diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index 278cfc144f4..2c228a07e58 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S @@ -68,7 +68,7 @@ __after_proc_init:  	 * CP15 system control register value returned in r0 from  	 * the CPU init function.  	 */ -#ifdef CONFIG_ALIGNMENT_TRAP +#if defined(CONFIG_ALIGNMENT_TRAP) && __LINUX_ARM_ARCH__ < 6  	orr	r0, r0, #CR_A  #else  	bic	r0, r0, #CR_A diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c index 281bf330124..5ff2e77782b 100644 --- a/arch/arm/kernel/hw_breakpoint.c +++ b/arch/arm/kernel/hw_breakpoint.c @@ -52,14 +52,14 @@ static u8 debug_arch;  /* Maximum supported watchpoint length. */  static u8 max_watchpoint_len; -#define READ_WB_REG_CASE(OP2, M, VAL)		\ -	case ((OP2 << 4) + M):			\ -		ARM_DBG_READ(c ## M, OP2, VAL); \ +#define READ_WB_REG_CASE(OP2, M, VAL)			\ +	case ((OP2 << 4) + M):				\ +		ARM_DBG_READ(c0, c ## M, OP2, VAL);	\  		break -#define WRITE_WB_REG_CASE(OP2, M, VAL)		\ -	case ((OP2 << 4) + M):			\ -		ARM_DBG_WRITE(c ## M, OP2, VAL);\ +#define WRITE_WB_REG_CASE(OP2, M, VAL)			\ +	case ((OP2 << 4) + M):				\ +		ARM_DBG_WRITE(c0, c ## M, OP2, VAL);	\  		break  #define GEN_READ_WB_REG_CASES(OP2, VAL)		\ @@ -136,12 +136,12 @@ static u8 get_debug_arch(void)  	/* Do we implement the extended CPUID interface? */  	if (((read_cpuid_id() >> 16) & 0xf) != 0xf) { -		pr_warning("CPUID feature registers not supported. " -			   "Assuming v6 debug is present.\n"); +		pr_warn_once("CPUID feature registers not supported. " +			     "Assuming v6 debug is present.\n");  		return ARM_DEBUG_ARCH_V6;  	} -	ARM_DBG_READ(c0, 0, didr); +	ARM_DBG_READ(c0, c0, 0, didr);  	return (didr >> 16) & 0xf;  } @@ -169,7 +169,7 @@ static int debug_exception_updates_fsr(void)  static int get_num_wrp_resources(void)  {  	u32 didr; -	ARM_DBG_READ(c0, 0, didr); +	ARM_DBG_READ(c0, c0, 0, didr);  	return ((didr >> 28) & 0xf) + 1;  } @@ -177,7 +177,7 @@ static int get_num_wrp_resources(void)  static int get_num_brp_resources(void)  {  	u32 didr; -	ARM_DBG_READ(c0, 0, didr); +	ARM_DBG_READ(c0, c0, 0, didr);  	return ((didr >> 24) & 0xf) + 1;  } @@ -228,19 +228,17 @@ static int get_num_brps(void)   * be put into halting debug mode at any time by an external debugger   * but there is nothing we can do to prevent that.   */ -static int enable_monitor_mode(void) +static int monitor_mode_enabled(void)  {  	u32 dscr; -	int ret = 0; - -	ARM_DBG_READ(c1, 0, dscr); +	ARM_DBG_READ(c0, c1, 0, dscr); +	return !!(dscr & ARM_DSCR_MDBGEN); +} -	/* Ensure that halting mode is disabled. */ -	if (WARN_ONCE(dscr & ARM_DSCR_HDBGEN, -		"halting debug mode enabled. Unable to access hardware resources.\n")) { -		ret = -EPERM; -		goto out; -	} +static int enable_monitor_mode(void) +{ +	u32 dscr; +	ARM_DBG_READ(c0, c1, 0, dscr);  	/* If monitor mode is already enabled, just return. */  	if (dscr & ARM_DSCR_MDBGEN) @@ -250,24 +248,27 @@ static int enable_monitor_mode(void)  	switch (get_debug_arch()) {  	case ARM_DEBUG_ARCH_V6:  	case ARM_DEBUG_ARCH_V6_1: -		ARM_DBG_WRITE(c1, 0, (dscr | ARM_DSCR_MDBGEN)); +		ARM_DBG_WRITE(c0, c1, 0, (dscr | ARM_DSCR_MDBGEN));  		break;  	case ARM_DEBUG_ARCH_V7_ECP14:  	case ARM_DEBUG_ARCH_V7_1: -		ARM_DBG_WRITE(c2, 2, (dscr | ARM_DSCR_MDBGEN)); +		ARM_DBG_WRITE(c0, c2, 2, (dscr | ARM_DSCR_MDBGEN)); +		isb();  		break;  	default: -		ret = -ENODEV; -		goto out; +		return -ENODEV;  	}  	/* Check that the write made it through. */ -	ARM_DBG_READ(c1, 0, dscr); -	if (!(dscr & ARM_DSCR_MDBGEN)) -		ret = -EPERM; +	ARM_DBG_READ(c0, c1, 0, dscr); +	if (!(dscr & ARM_DSCR_MDBGEN)) { +		pr_warn_once("Failed to enable monitor mode on CPU %d.\n", +				smp_processor_id()); +		return -EPERM; +	}  out: -	return ret; +	return 0;  }  int hw_breakpoint_slots(int type) @@ -328,14 +329,9 @@ int arch_install_hw_breakpoint(struct perf_event *bp)  {  	struct arch_hw_breakpoint *info = counter_arch_bp(bp);  	struct perf_event **slot, **slots; -	int i, max_slots, ctrl_base, val_base, ret = 0; +	int i, max_slots, ctrl_base, val_base;  	u32 addr, ctrl; -	/* Ensure that we are in monitor mode and halting mode is disabled. */ -	ret = enable_monitor_mode(); -	if (ret) -		goto out; -  	addr = info->address;  	ctrl = encode_ctrl_reg(info->ctrl) | 0x1; @@ -362,9 +358,9 @@ int arch_install_hw_breakpoint(struct perf_event *bp)  		}  	} -	if (WARN_ONCE(i == max_slots, "Can't find any breakpoint slot\n")) { -		ret = -EBUSY; -		goto out; +	if (i == max_slots) { +		pr_warning("Can't find any breakpoint slot\n"); +		return -EBUSY;  	}  	/* Override the breakpoint data with the step data. */ @@ -383,9 +379,7 @@ int arch_install_hw_breakpoint(struct perf_event *bp)  	/* Setup the control register. */  	write_wb_reg(ctrl_base + i, ctrl); - -out: -	return ret; +	return 0;  }  void arch_uninstall_hw_breakpoint(struct perf_event *bp) @@ -416,8 +410,10 @@ void arch_uninstall_hw_breakpoint(struct perf_event *bp)  		}  	} -	if (WARN_ONCE(i == max_slots, "Can't find any breakpoint slot\n")) +	if (i == max_slots) { +		pr_warning("Can't find any breakpoint slot\n");  		return; +	}  	/* Ensure that we disable the mismatch breakpoint. */  	if (info->ctrl.type != ARM_BREAKPOINT_EXECUTE && @@ -596,6 +592,10 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp)  	int ret = 0;  	u32 offset, alignment_mask = 0x3; +	/* Ensure that we are in monitor debug mode. */ +	if (!monitor_mode_enabled()) +		return -ENODEV; +  	/* Build the arch_hw_breakpoint. */  	ret = arch_build_bp_info(bp);  	if (ret) @@ -858,7 +858,7 @@ static int hw_breakpoint_pending(unsigned long addr, unsigned int fsr,  		local_irq_enable();  	/* We only handle watchpoints and hardware breakpoints. */ -	ARM_DBG_READ(c1, 0, dscr); +	ARM_DBG_READ(c0, c1, 0, dscr);  	/* Perform perf callbacks. */  	switch (ARM_DSCR_MOE(dscr)) { @@ -906,7 +906,7 @@ static struct undef_hook debug_reg_hook = {  static void reset_ctrl_regs(void *unused)  {  	int i, raw_num_brps, err = 0, cpu = smp_processor_id(); -	u32 dbg_power; +	u32 val;  	/*  	 * v7 debug contains save and restore registers so that debug state @@ -919,23 +919,30 @@ static void reset_ctrl_regs(void *unused)  	switch (debug_arch) {  	case ARM_DEBUG_ARCH_V6:  	case ARM_DEBUG_ARCH_V6_1: -		/* ARMv6 cores just need to reset the registers. */ -		goto reset_regs; +		/* ARMv6 cores clear the registers out of reset. */ +		goto out_mdbgen;  	case ARM_DEBUG_ARCH_V7_ECP14:  		/*  		 * Ensure sticky power-down is clear (i.e. debug logic is  		 * powered up).  		 */ -		asm volatile("mrc p14, 0, %0, c1, c5, 4" : "=r" (dbg_power)); -		if ((dbg_power & 0x1) == 0) +		ARM_DBG_READ(c1, c5, 4, val); +		if ((val & 0x1) == 0)  			err = -EPERM; + +		/* +		 * Check whether we implement OS save and restore. +		 */ +		ARM_DBG_READ(c1, c1, 4, val); +		if ((val & 0x9) == 0) +			goto clear_vcr;  		break;  	case ARM_DEBUG_ARCH_V7_1:  		/*  		 * Ensure the OS double lock is clear.  		 */ -		asm volatile("mrc p14, 0, %0, c1, c3, 4" : "=r" (dbg_power)); -		if ((dbg_power & 0x1) == 1) +		ARM_DBG_READ(c1, c3, 4, val); +		if ((val & 0x1) == 1)  			err = -EPERM;  		break;  	} @@ -947,24 +954,29 @@ static void reset_ctrl_regs(void *unused)  	}  	/* -	 * Unconditionally clear the lock by writing a value +	 * Unconditionally clear the OS lock by writing a value  	 * other than 0xC5ACCE55 to the access register.  	 */ -	asm volatile("mcr p14, 0, %0, c1, c0, 4" : : "r" (0)); +	ARM_DBG_WRITE(c1, c0, 4, 0);  	isb();  	/*  	 * Clear any configured vector-catch events before  	 * enabling monitor mode.  	 */ -	asm volatile("mcr p14, 0, %0, c0, c7, 0" : : "r" (0)); +clear_vcr: +	ARM_DBG_WRITE(c0, c7, 0, 0);  	isb(); -reset_regs: -	if (enable_monitor_mode()) +	if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) { +		pr_warning("CPU %d failed to disable vector catch\n", cpu);  		return; +	} -	/* We must also reset any reserved registers. */ +	/* +	 * The control/value register pairs are UNKNOWN out of reset so +	 * clear them to avoid spurious debug events. +	 */  	raw_num_brps = get_num_brp_resources();  	for (i = 0; i < raw_num_brps; ++i) {  		write_wb_reg(ARM_BASE_BCR + i, 0UL); @@ -975,6 +987,19 @@ reset_regs:  		write_wb_reg(ARM_BASE_WCR + i, 0UL);  		write_wb_reg(ARM_BASE_WVR + i, 0UL);  	} + +	if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) { +		pr_warning("CPU %d failed to clear debug register pairs\n", cpu); +		return; +	} + +	/* +	 * Have a crack at enabling monitor mode. We don't actually need +	 * it yet, but reporting an error early is useful if it fails. +	 */ +out_mdbgen: +	if (enable_monitor_mode()) +		cpumask_or(&debug_err_mask, &debug_err_mask, cpumask_of(cpu));  }  static int __cpuinit dbg_reset_notify(struct notifier_block *self, @@ -992,8 +1017,6 @@ static struct notifier_block __cpuinitdata dbg_reset_nb = {  static int __init arch_hw_breakpoint_init(void)  { -	u32 dscr; -  	debug_arch = get_debug_arch();  	if (!debug_arch_supported()) { @@ -1028,17 +1051,10 @@ static int __init arch_hw_breakpoint_init(void)  		core_num_brps, core_has_mismatch_brps() ? "(+1 reserved) " :  		"", core_num_wrps); -	ARM_DBG_READ(c1, 0, dscr); -	if (dscr & ARM_DSCR_HDBGEN) { -		max_watchpoint_len = 4; -		pr_warning("halting debug mode enabled. Assuming maximum watchpoint size of %u bytes.\n", -			   max_watchpoint_len); -	} else { -		/* Work out the maximum supported watchpoint length. */ -		max_watchpoint_len = get_max_wp_len(); -		pr_info("maximum watchpoint size is %u bytes.\n", -				max_watchpoint_len); -	} +	/* Work out the maximum supported watchpoint length. */ +	max_watchpoint_len = get_max_wp_len(); +	pr_info("maximum watchpoint size is %u bytes.\n", +			max_watchpoint_len);  	/* Register debug fault handler. */  	hook_fault_code(FAULT_CODE_DEBUG, hw_breakpoint_pending, SIGTRAP, diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 53c0304b734..f9e8657dd24 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c @@ -86,12 +86,10 @@ armpmu_map_event(struct perf_event *event,  	return -ENOENT;  } -int -armpmu_event_set_period(struct perf_event *event, -			struct hw_perf_event *hwc, -			int idx) +int armpmu_event_set_period(struct perf_event *event)  {  	struct arm_pmu *armpmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw;  	s64 left = local64_read(&hwc->period_left);  	s64 period = hwc->sample_period;  	int ret = 0; @@ -119,24 +117,22 @@ armpmu_event_set_period(struct perf_event *event,  	local64_set(&hwc->prev_count, (u64)-left); -	armpmu->write_counter(idx, (u64)(-left) & 0xffffffff); +	armpmu->write_counter(event, (u64)(-left) & 0xffffffff);  	perf_event_update_userpage(event);  	return ret;  } -u64 -armpmu_event_update(struct perf_event *event, -		    struct hw_perf_event *hwc, -		    int idx) +u64 armpmu_event_update(struct perf_event *event)  {  	struct arm_pmu *armpmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw;  	u64 delta, prev_raw_count, new_raw_count;  again:  	prev_raw_count = local64_read(&hwc->prev_count); -	new_raw_count = armpmu->read_counter(idx); +	new_raw_count = armpmu->read_counter(event);  	if (local64_cmpxchg(&hwc->prev_count, prev_raw_count,  			     new_raw_count) != prev_raw_count) @@ -159,7 +155,7 @@ armpmu_read(struct perf_event *event)  	if (hwc->idx < 0)  		return; -	armpmu_event_update(event, hwc, hwc->idx); +	armpmu_event_update(event);  }  static void @@ -173,14 +169,13 @@ armpmu_stop(struct perf_event *event, int flags)  	 * PERF_EF_UPDATE, see comments in armpmu_start().  	 */  	if (!(hwc->state & PERF_HES_STOPPED)) { -		armpmu->disable(hwc, hwc->idx); -		armpmu_event_update(event, hwc, hwc->idx); +		armpmu->disable(event); +		armpmu_event_update(event);  		hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;  	}  } -static void -armpmu_start(struct perf_event *event, int flags) +static void armpmu_start(struct perf_event *event, int flags)  {  	struct arm_pmu *armpmu = to_arm_pmu(event->pmu);  	struct hw_perf_event *hwc = &event->hw; @@ -200,8 +195,8 @@ armpmu_start(struct perf_event *event, int flags)  	 * get an interrupt too soon or *way* too late if the overflow has  	 * happened since disabling.  	 */ -	armpmu_event_set_period(event, hwc, hwc->idx); -	armpmu->enable(hwc, hwc->idx); +	armpmu_event_set_period(event); +	armpmu->enable(event);  }  static void @@ -233,7 +228,7 @@ armpmu_add(struct perf_event *event, int flags)  	perf_pmu_disable(event->pmu);  	/* If we don't have a space for the counter then finish early. */ -	idx = armpmu->get_event_idx(hw_events, hwc); +	idx = armpmu->get_event_idx(hw_events, event);  	if (idx < 0) {  		err = idx;  		goto out; @@ -244,7 +239,7 @@ armpmu_add(struct perf_event *event, int flags)  	 * sure it is disabled.  	 */  	event->hw.idx = idx; -	armpmu->disable(hwc, idx); +	armpmu->disable(event);  	hw_events->events[idx] = event;  	hwc->state = PERF_HES_STOPPED | PERF_HES_UPTODATE; @@ -264,13 +259,12 @@ validate_event(struct pmu_hw_events *hw_events,  	       struct perf_event *event)  {  	struct arm_pmu *armpmu = to_arm_pmu(event->pmu); -	struct hw_perf_event fake_event = event->hw;  	struct pmu *leader_pmu = event->group_leader->pmu;  	if (event->pmu != leader_pmu || event->state <= PERF_EVENT_STATE_OFF)  		return 1; -	return armpmu->get_event_idx(hw_events, &fake_event) >= 0; +	return armpmu->get_event_idx(hw_events, event) >= 0;  }  static int @@ -316,7 +310,7 @@ static irqreturn_t armpmu_dispatch_irq(int irq, void *dev)  static void  armpmu_release_hardware(struct arm_pmu *armpmu)  { -	armpmu->free_irq(); +	armpmu->free_irq(armpmu);  	pm_runtime_put_sync(&armpmu->plat_device->dev);  } @@ -330,7 +324,7 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu)  		return -ENODEV;  	pm_runtime_get_sync(&pmu_device->dev); -	err = armpmu->request_irq(armpmu_dispatch_irq); +	err = armpmu->request_irq(armpmu, armpmu_dispatch_irq);  	if (err) {  		armpmu_release_hardware(armpmu);  		return err; @@ -465,13 +459,13 @@ static void armpmu_enable(struct pmu *pmu)  	int enabled = bitmap_weight(hw_events->used_mask, armpmu->num_events);  	if (enabled) -		armpmu->start(); +		armpmu->start(armpmu);  }  static void armpmu_disable(struct pmu *pmu)  {  	struct arm_pmu *armpmu = to_arm_pmu(pmu); -	armpmu->stop(); +	armpmu->stop(armpmu);  }  #ifdef CONFIG_PM_RUNTIME @@ -517,12 +511,13 @@ static void __init armpmu_init(struct arm_pmu *armpmu)  	};  } -int armpmu_register(struct arm_pmu *armpmu, char *name, int type) +int armpmu_register(struct arm_pmu *armpmu, int type)  {  	armpmu_init(armpmu); +	pm_runtime_enable(&armpmu->plat_device->dev);  	pr_info("enabled with %s PMU driver, %d counters available\n",  			armpmu->name, armpmu->num_events); -	return perf_pmu_register(&armpmu->pmu, name, type); +	return perf_pmu_register(&armpmu->pmu, armpmu->name, type);  }  /* @@ -576,6 +571,10 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs)  {  	struct frame_tail __user *tail; +	if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) { +		/* We don't support guest os callchain now */ +		return; +	}  	tail = (struct frame_tail __user *)regs->ARM_fp - 1; @@ -603,9 +602,41 @@ perf_callchain_kernel(struct perf_callchain_entry *entry, struct pt_regs *regs)  {  	struct stackframe fr; +	if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) { +		/* We don't support guest os callchain now */ +		return; +	} +  	fr.fp = regs->ARM_fp;  	fr.sp = regs->ARM_sp;  	fr.lr = regs->ARM_lr;  	fr.pc = regs->ARM_pc;  	walk_stackframe(&fr, callchain_trace, entry);  } + +unsigned long perf_instruction_pointer(struct pt_regs *regs) +{ +	if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) +		return perf_guest_cbs->get_guest_ip(); + +	return instruction_pointer(regs); +} + +unsigned long perf_misc_flags(struct pt_regs *regs) +{ +	int misc = 0; + +	if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) { +		if (perf_guest_cbs->is_user_mode()) +			misc |= PERF_RECORD_MISC_GUEST_USER; +		else +			misc |= PERF_RECORD_MISC_GUEST_KERNEL; +	} else { +		if (user_mode(regs)) +			misc |= PERF_RECORD_MISC_USER; +		else +			misc |= PERF_RECORD_MISC_KERNEL; +	} + +	return misc; +} diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c index 8d7d8d4de9d..9a4f6307a01 100644 --- a/arch/arm/kernel/perf_event_cpu.c +++ b/arch/arm/kernel/perf_event_cpu.c @@ -23,6 +23,7 @@  #include <linux/kernel.h>  #include <linux/of.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <linux/spinlock.h>  #include <asm/cputype.h> @@ -45,7 +46,7 @@ const char *perf_pmu_name(void)  	if (!cpu_pmu)  		return NULL; -	return cpu_pmu->pmu.name; +	return cpu_pmu->name;  }  EXPORT_SYMBOL_GPL(perf_pmu_name); @@ -70,7 +71,7 @@ static struct pmu_hw_events *cpu_pmu_get_cpu_events(void)  	return &__get_cpu_var(cpu_hw_events);  } -static void cpu_pmu_free_irq(void) +static void cpu_pmu_free_irq(struct arm_pmu *cpu_pmu)  {  	int i, irq, irqs;  	struct platform_device *pmu_device = cpu_pmu->plat_device; @@ -86,7 +87,7 @@ static void cpu_pmu_free_irq(void)  	}  } -static int cpu_pmu_request_irq(irq_handler_t handler) +static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, irq_handler_t handler)  {  	int i, err, irq, irqs;  	struct platform_device *pmu_device = cpu_pmu->plat_device; @@ -147,7 +148,7 @@ static void __devinit cpu_pmu_init(struct arm_pmu *cpu_pmu)  	/* Ensure the PMU has sane values out of reset. */  	if (cpu_pmu && cpu_pmu->reset) -		on_each_cpu(cpu_pmu->reset, NULL, 1); +		on_each_cpu(cpu_pmu->reset, cpu_pmu, 1);  }  /* @@ -163,7 +164,9 @@ static int __cpuinit cpu_pmu_notify(struct notifier_block *b,  		return NOTIFY_DONE;  	if (cpu_pmu && cpu_pmu->reset) -		cpu_pmu->reset(NULL); +		cpu_pmu->reset(cpu_pmu); +	else +		return NOTIFY_DONE;  	return NOTIFY_OK;  } @@ -195,13 +198,13 @@ static struct platform_device_id __devinitdata cpu_pmu_plat_device_ids[] = {  /*   * CPU PMU identification and probing.   */ -static struct arm_pmu *__devinit probe_current_pmu(void) +static int __devinit probe_current_pmu(struct arm_pmu *pmu)  { -	struct arm_pmu *pmu = NULL;  	int cpu = get_cpu();  	unsigned long cpuid = read_cpuid_id();  	unsigned long implementor = (cpuid & 0xFF000000) >> 24;  	unsigned long part_number = (cpuid & 0xFFF0); +	int ret = -ENODEV;  	pr_info("probing PMU on CPU %d\n", cpu); @@ -211,25 +214,25 @@ static struct arm_pmu *__devinit probe_current_pmu(void)  		case 0xB360:	/* ARM1136 */  		case 0xB560:	/* ARM1156 */  		case 0xB760:	/* ARM1176 */ -			pmu = armv6pmu_init(); +			ret = armv6pmu_init(pmu);  			break;  		case 0xB020:	/* ARM11mpcore */ -			pmu = armv6mpcore_pmu_init(); +			ret = armv6mpcore_pmu_init(pmu);  			break;  		case 0xC080:	/* Cortex-A8 */ -			pmu = armv7_a8_pmu_init(); +			ret = armv7_a8_pmu_init(pmu);  			break;  		case 0xC090:	/* Cortex-A9 */ -			pmu = armv7_a9_pmu_init(); +			ret = armv7_a9_pmu_init(pmu);  			break;  		case 0xC050:	/* Cortex-A5 */ -			pmu = armv7_a5_pmu_init(); +			ret = armv7_a5_pmu_init(pmu);  			break;  		case 0xC0F0:	/* Cortex-A15 */ -			pmu = armv7_a15_pmu_init(); +			ret = armv7_a15_pmu_init(pmu);  			break;  		case 0xC070:	/* Cortex-A7 */ -			pmu = armv7_a7_pmu_init(); +			ret = armv7_a7_pmu_init(pmu);  			break;  		}  	/* Intel CPUs [xscale]. */ @@ -237,43 +240,54 @@ static struct arm_pmu *__devinit probe_current_pmu(void)  		part_number = (cpuid >> 13) & 0x7;  		switch (part_number) {  		case 1: -			pmu = xscale1pmu_init(); +			ret = xscale1pmu_init(pmu);  			break;  		case 2: -			pmu = xscale2pmu_init(); +			ret = xscale2pmu_init(pmu);  			break;  		}  	}  	put_cpu(); -	return pmu; +	return ret;  }  static int __devinit cpu_pmu_device_probe(struct platform_device *pdev)  {  	const struct of_device_id *of_id; -	struct arm_pmu *(*init_fn)(void); +	int (*init_fn)(struct arm_pmu *);  	struct device_node *node = pdev->dev.of_node; +	struct arm_pmu *pmu; +	int ret = -ENODEV;  	if (cpu_pmu) {  		pr_info("attempt to register multiple PMU devices!");  		return -ENOSPC;  	} +	pmu = kzalloc(sizeof(struct arm_pmu), GFP_KERNEL); +	if (!pmu) { +		pr_info("failed to allocate PMU device!"); +		return -ENOMEM; +	} +  	if (node && (of_id = of_match_node(cpu_pmu_of_device_ids, pdev->dev.of_node))) {  		init_fn = of_id->data; -		cpu_pmu = init_fn(); +		ret = init_fn(pmu);  	} else { -		cpu_pmu = probe_current_pmu(); +		ret = probe_current_pmu(pmu);  	} -	if (!cpu_pmu) -		return -ENODEV; +	if (ret) { +		pr_info("failed to register PMU devices!"); +		kfree(pmu); +		return ret; +	} +	cpu_pmu = pmu;  	cpu_pmu->plat_device = pdev;  	cpu_pmu_init(cpu_pmu); -	register_cpu_notifier(&cpu_pmu_hotplug_notifier); -	armpmu_register(cpu_pmu, cpu_pmu->name, PERF_TYPE_RAW); +	armpmu_register(cpu_pmu, PERF_TYPE_RAW);  	return 0;  } @@ -290,6 +304,16 @@ static struct platform_driver cpu_pmu_driver = {  static int __init register_pmu_driver(void)  { -	return platform_driver_register(&cpu_pmu_driver); +	int err; + +	err = register_cpu_notifier(&cpu_pmu_hotplug_notifier); +	if (err) +		return err; + +	err = platform_driver_register(&cpu_pmu_driver); +	if (err) +		unregister_cpu_notifier(&cpu_pmu_hotplug_notifier); + +	return err;  }  device_initcall(register_pmu_driver); diff --git a/arch/arm/kernel/perf_event_v6.c b/arch/arm/kernel/perf_event_v6.c index 6ccc0797174..f3e22ff8b6a 100644 --- a/arch/arm/kernel/perf_event_v6.c +++ b/arch/arm/kernel/perf_event_v6.c @@ -401,9 +401,10 @@ armv6_pmcr_counter_has_overflowed(unsigned long pmcr,  	return ret;  } -static inline u32 -armv6pmu_read_counter(int counter) +static inline u32 armv6pmu_read_counter(struct perf_event *event)  { +	struct hw_perf_event *hwc = &event->hw; +	int counter = hwc->idx;  	unsigned long value = 0;  	if (ARMV6_CYCLE_COUNTER == counter) @@ -418,10 +419,11 @@ armv6pmu_read_counter(int counter)  	return value;  } -static inline void -armv6pmu_write_counter(int counter, -		       u32 value) +static inline void armv6pmu_write_counter(struct perf_event *event, u32 value)  { +	struct hw_perf_event *hwc = &event->hw; +	int counter = hwc->idx; +  	if (ARMV6_CYCLE_COUNTER == counter)  		asm volatile("mcr   p15, 0, %0, c15, c12, 1" : : "r"(value));  	else if (ARMV6_COUNTER0 == counter) @@ -432,12 +434,13 @@ armv6pmu_write_counter(int counter,  		WARN_ONCE(1, "invalid counter number (%d)\n", counter);  } -static void -armv6pmu_enable_event(struct hw_perf_event *hwc, -		      int idx) +static void armv6pmu_enable_event(struct perf_event *event)  {  	unsigned long val, mask, evt, flags; +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); +	int idx = hwc->idx;  	if (ARMV6_CYCLE_COUNTER == idx) {  		mask	= 0; @@ -473,7 +476,8 @@ armv6pmu_handle_irq(int irq_num,  {  	unsigned long pmcr = armv6_pmcr_read();  	struct perf_sample_data data; -	struct pmu_hw_events *cpuc; +	struct arm_pmu *cpu_pmu = (struct arm_pmu *)dev; +	struct pmu_hw_events *cpuc = cpu_pmu->get_hw_events();  	struct pt_regs *regs;  	int idx; @@ -489,7 +493,6 @@ armv6pmu_handle_irq(int irq_num,  	 */  	armv6_pmcr_write(pmcr); -	cpuc = &__get_cpu_var(cpu_hw_events);  	for (idx = 0; idx < cpu_pmu->num_events; ++idx) {  		struct perf_event *event = cpuc->events[idx];  		struct hw_perf_event *hwc; @@ -506,13 +509,13 @@ armv6pmu_handle_irq(int irq_num,  			continue;  		hwc = &event->hw; -		armpmu_event_update(event, hwc, idx); +		armpmu_event_update(event);  		perf_sample_data_init(&data, 0, hwc->last_period); -		if (!armpmu_event_set_period(event, hwc, idx)) +		if (!armpmu_event_set_period(event))  			continue;  		if (perf_event_overflow(event, &data, regs)) -			cpu_pmu->disable(hwc, idx); +			cpu_pmu->disable(event);  	}  	/* @@ -527,8 +530,7 @@ armv6pmu_handle_irq(int irq_num,  	return IRQ_HANDLED;  } -static void -armv6pmu_start(void) +static void armv6pmu_start(struct arm_pmu *cpu_pmu)  {  	unsigned long flags, val;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); @@ -540,8 +542,7 @@ armv6pmu_start(void)  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } -static void -armv6pmu_stop(void) +static void armv6pmu_stop(struct arm_pmu *cpu_pmu)  {  	unsigned long flags, val;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); @@ -555,10 +556,11 @@ armv6pmu_stop(void)  static int  armv6pmu_get_event_idx(struct pmu_hw_events *cpuc, -		       struct hw_perf_event *event) +				struct perf_event *event)  { +	struct hw_perf_event *hwc = &event->hw;  	/* Always place a cycle counter into the cycle counter. */ -	if (ARMV6_PERFCTR_CPU_CYCLES == event->config_base) { +	if (ARMV6_PERFCTR_CPU_CYCLES == hwc->config_base) {  		if (test_and_set_bit(ARMV6_CYCLE_COUNTER, cpuc->used_mask))  			return -EAGAIN; @@ -579,12 +581,13 @@ armv6pmu_get_event_idx(struct pmu_hw_events *cpuc,  	}  } -static void -armv6pmu_disable_event(struct hw_perf_event *hwc, -		       int idx) +static void armv6pmu_disable_event(struct perf_event *event)  {  	unsigned long val, mask, evt, flags; +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); +	int idx = hwc->idx;  	if (ARMV6_CYCLE_COUNTER == idx) {  		mask	= ARMV6_PMCR_CCOUNT_IEN; @@ -613,12 +616,13 @@ armv6pmu_disable_event(struct hw_perf_event *hwc,  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } -static void -armv6mpcore_pmu_disable_event(struct hw_perf_event *hwc, -			      int idx) +static void armv6mpcore_pmu_disable_event(struct perf_event *event)  {  	unsigned long val, mask, flags, evt = 0; +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); +	int idx = hwc->idx;  	if (ARMV6_CYCLE_COUNTER == idx) {  		mask	= ARMV6_PMCR_CCOUNT_IEN; @@ -649,24 +653,22 @@ static int armv6_map_event(struct perf_event *event)  				&armv6_perf_cache_map, 0xFF);  } -static struct arm_pmu armv6pmu = { -	.name			= "v6", -	.handle_irq		= armv6pmu_handle_irq, -	.enable			= armv6pmu_enable_event, -	.disable		= armv6pmu_disable_event, -	.read_counter		= armv6pmu_read_counter, -	.write_counter		= armv6pmu_write_counter, -	.get_event_idx		= armv6pmu_get_event_idx, -	.start			= armv6pmu_start, -	.stop			= armv6pmu_stop, -	.map_event		= armv6_map_event, -	.num_events		= 3, -	.max_period		= (1LLU << 32) - 1, -}; - -static struct arm_pmu *__devinit armv6pmu_init(void) +static int __devinit armv6pmu_init(struct arm_pmu *cpu_pmu)  { -	return &armv6pmu; +	cpu_pmu->name		= "v6"; +	cpu_pmu->handle_irq	= armv6pmu_handle_irq; +	cpu_pmu->enable		= armv6pmu_enable_event; +	cpu_pmu->disable	= armv6pmu_disable_event; +	cpu_pmu->read_counter	= armv6pmu_read_counter; +	cpu_pmu->write_counter	= armv6pmu_write_counter; +	cpu_pmu->get_event_idx	= armv6pmu_get_event_idx; +	cpu_pmu->start		= armv6pmu_start; +	cpu_pmu->stop		= armv6pmu_stop; +	cpu_pmu->map_event	= armv6_map_event; +	cpu_pmu->num_events	= 3; +	cpu_pmu->max_period	= (1LLU << 32) - 1; + +	return 0;  }  /* @@ -683,33 +685,31 @@ static int armv6mpcore_map_event(struct perf_event *event)  				&armv6mpcore_perf_cache_map, 0xFF);  } -static struct arm_pmu armv6mpcore_pmu = { -	.name			= "v6mpcore", -	.handle_irq		= armv6pmu_handle_irq, -	.enable			= armv6pmu_enable_event, -	.disable		= armv6mpcore_pmu_disable_event, -	.read_counter		= armv6pmu_read_counter, -	.write_counter		= armv6pmu_write_counter, -	.get_event_idx		= armv6pmu_get_event_idx, -	.start			= armv6pmu_start, -	.stop			= armv6pmu_stop, -	.map_event		= armv6mpcore_map_event, -	.num_events		= 3, -	.max_period		= (1LLU << 32) - 1, -}; - -static struct arm_pmu *__devinit armv6mpcore_pmu_init(void) +static int __devinit armv6mpcore_pmu_init(struct arm_pmu *cpu_pmu)  { -	return &armv6mpcore_pmu; +	cpu_pmu->name		= "v6mpcore"; +	cpu_pmu->handle_irq	= armv6pmu_handle_irq; +	cpu_pmu->enable		= armv6pmu_enable_event; +	cpu_pmu->disable	= armv6mpcore_pmu_disable_event; +	cpu_pmu->read_counter	= armv6pmu_read_counter; +	cpu_pmu->write_counter	= armv6pmu_write_counter; +	cpu_pmu->get_event_idx	= armv6pmu_get_event_idx; +	cpu_pmu->start		= armv6pmu_start; +	cpu_pmu->stop		= armv6pmu_stop; +	cpu_pmu->map_event	= armv6mpcore_map_event; +	cpu_pmu->num_events	= 3; +	cpu_pmu->max_period	= (1LLU << 32) - 1; + +	return 0;  }  #else -static struct arm_pmu *__devinit armv6pmu_init(void) +static int armv6pmu_init(struct arm_pmu *cpu_pmu)  { -	return NULL; +	return -ENODEV;  } -static struct arm_pmu *__devinit armv6mpcore_pmu_init(void) +static int armv6mpcore_pmu_init(struct arm_pmu *cpu_pmu)  { -	return NULL; +	return -ENODEV;  }  #endif	/* CONFIG_CPU_V6 || CONFIG_CPU_V6K */ diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index bd4b090ebcf..7d0cce85d17 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c @@ -18,8 +18,6 @@  #ifdef CONFIG_CPU_V7 -static struct arm_pmu armv7pmu; -  /*   * Common ARMv7 event types   * @@ -738,7 +736,8 @@ static const unsigned armv7_a7_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]   */  #define	ARMV7_IDX_CYCLE_COUNTER	0  #define	ARMV7_IDX_COUNTER0	1 -#define	ARMV7_IDX_COUNTER_LAST	(ARMV7_IDX_CYCLE_COUNTER + cpu_pmu->num_events - 1) +#define	ARMV7_IDX_COUNTER_LAST(cpu_pmu) \ +	(ARMV7_IDX_CYCLE_COUNTER + cpu_pmu->num_events - 1)  #define	ARMV7_MAX_COUNTERS	32  #define	ARMV7_COUNTER_MASK	(ARMV7_MAX_COUNTERS - 1) @@ -804,49 +803,34 @@ static inline int armv7_pmnc_has_overflowed(u32 pmnc)  	return pmnc & ARMV7_OVERFLOWED_MASK;  } -static inline int armv7_pmnc_counter_valid(int idx) +static inline int armv7_pmnc_counter_valid(struct arm_pmu *cpu_pmu, int idx)  { -	return idx >= ARMV7_IDX_CYCLE_COUNTER && idx <= ARMV7_IDX_COUNTER_LAST; +	return idx >= ARMV7_IDX_CYCLE_COUNTER && +		idx <= ARMV7_IDX_COUNTER_LAST(cpu_pmu);  }  static inline int armv7_pmnc_counter_has_overflowed(u32 pmnc, int idx)  { -	int ret = 0; -	u32 counter; - -	if (!armv7_pmnc_counter_valid(idx)) { -		pr_err("CPU%u checking wrong counter %d overflow status\n", -			smp_processor_id(), idx); -	} else { -		counter = ARMV7_IDX_TO_COUNTER(idx); -		ret = pmnc & BIT(counter); -	} - -	return ret; +	return pmnc & BIT(ARMV7_IDX_TO_COUNTER(idx));  }  static inline int armv7_pmnc_select_counter(int idx)  { -	u32 counter; - -	if (!armv7_pmnc_counter_valid(idx)) { -		pr_err("CPU%u selecting wrong PMNC counter %d\n", -			smp_processor_id(), idx); -		return -EINVAL; -	} - -	counter = ARMV7_IDX_TO_COUNTER(idx); +	u32 counter = ARMV7_IDX_TO_COUNTER(idx);  	asm volatile("mcr p15, 0, %0, c9, c12, 5" : : "r" (counter));  	isb();  	return idx;  } -static inline u32 armv7pmu_read_counter(int idx) +static inline u32 armv7pmu_read_counter(struct perf_event *event)  { +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw; +	int idx = hwc->idx;  	u32 value = 0; -	if (!armv7_pmnc_counter_valid(idx)) +	if (!armv7_pmnc_counter_valid(cpu_pmu, idx))  		pr_err("CPU%u reading wrong counter %d\n",  			smp_processor_id(), idx);  	else if (idx == ARMV7_IDX_CYCLE_COUNTER) @@ -857,9 +841,13 @@ static inline u32 armv7pmu_read_counter(int idx)  	return value;  } -static inline void armv7pmu_write_counter(int idx, u32 value) +static inline void armv7pmu_write_counter(struct perf_event *event, u32 value)  { -	if (!armv7_pmnc_counter_valid(idx)) +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw; +	int idx = hwc->idx; + +	if (!armv7_pmnc_counter_valid(cpu_pmu, idx))  		pr_err("CPU%u writing wrong counter %d\n",  			smp_processor_id(), idx);  	else if (idx == ARMV7_IDX_CYCLE_COUNTER) @@ -878,60 +866,28 @@ static inline void armv7_pmnc_write_evtsel(int idx, u32 val)  static inline int armv7_pmnc_enable_counter(int idx)  { -	u32 counter; - -	if (!armv7_pmnc_counter_valid(idx)) { -		pr_err("CPU%u enabling wrong PMNC counter %d\n", -			smp_processor_id(), idx); -		return -EINVAL; -	} - -	counter = ARMV7_IDX_TO_COUNTER(idx); +	u32 counter = ARMV7_IDX_TO_COUNTER(idx);  	asm volatile("mcr p15, 0, %0, c9, c12, 1" : : "r" (BIT(counter)));  	return idx;  }  static inline int armv7_pmnc_disable_counter(int idx)  { -	u32 counter; - -	if (!armv7_pmnc_counter_valid(idx)) { -		pr_err("CPU%u disabling wrong PMNC counter %d\n", -			smp_processor_id(), idx); -		return -EINVAL; -	} - -	counter = ARMV7_IDX_TO_COUNTER(idx); +	u32 counter = ARMV7_IDX_TO_COUNTER(idx);  	asm volatile("mcr p15, 0, %0, c9, c12, 2" : : "r" (BIT(counter)));  	return idx;  }  static inline int armv7_pmnc_enable_intens(int idx)  { -	u32 counter; - -	if (!armv7_pmnc_counter_valid(idx)) { -		pr_err("CPU%u enabling wrong PMNC counter IRQ enable %d\n", -			smp_processor_id(), idx); -		return -EINVAL; -	} - -	counter = ARMV7_IDX_TO_COUNTER(idx); +	u32 counter = ARMV7_IDX_TO_COUNTER(idx);  	asm volatile("mcr p15, 0, %0, c9, c14, 1" : : "r" (BIT(counter)));  	return idx;  }  static inline int armv7_pmnc_disable_intens(int idx)  { -	u32 counter; - -	if (!armv7_pmnc_counter_valid(idx)) { -		pr_err("CPU%u disabling wrong PMNC counter IRQ enable %d\n", -			smp_processor_id(), idx); -		return -EINVAL; -	} - -	counter = ARMV7_IDX_TO_COUNTER(idx); +	u32 counter = ARMV7_IDX_TO_COUNTER(idx);  	asm volatile("mcr p15, 0, %0, c9, c14, 2" : : "r" (BIT(counter)));  	isb();  	/* Clear the overflow flag in case an interrupt is pending. */ @@ -956,7 +912,7 @@ static inline u32 armv7_pmnc_getreset_flags(void)  }  #ifdef DEBUG -static void armv7_pmnc_dump_regs(void) +static void armv7_pmnc_dump_regs(struct arm_pmu *cpu_pmu)  {  	u32 val;  	unsigned int cnt; @@ -981,7 +937,8 @@ static void armv7_pmnc_dump_regs(void)  	asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (val));  	printk(KERN_INFO "CCNT  =0x%08x\n", val); -	for (cnt = ARMV7_IDX_COUNTER0; cnt <= ARMV7_IDX_COUNTER_LAST; cnt++) { +	for (cnt = ARMV7_IDX_COUNTER0; +			cnt <= ARMV7_IDX_COUNTER_LAST(cpu_pmu); cnt++) {  		armv7_pmnc_select_counter(cnt);  		asm volatile("mrc p15, 0, %0, c9, c13, 2" : "=r" (val));  		printk(KERN_INFO "CNT[%d] count =0x%08x\n", @@ -993,10 +950,19 @@ static void armv7_pmnc_dump_regs(void)  }  #endif -static void armv7pmu_enable_event(struct hw_perf_event *hwc, int idx) +static void armv7pmu_enable_event(struct perf_event *event)  {  	unsigned long flags; +	struct hw_perf_event *hwc = &event->hw; +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu);  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); +	int idx = hwc->idx; + +	if (!armv7_pmnc_counter_valid(cpu_pmu, idx)) { +		pr_err("CPU%u enabling wrong PMNC counter IRQ enable %d\n", +			smp_processor_id(), idx); +		return; +	}  	/*  	 * Enable counter and interrupt, and set the counter to count @@ -1014,7 +980,7 @@ static void armv7pmu_enable_event(struct hw_perf_event *hwc, int idx)  	 * We only need to set the event for the cycle counter if we  	 * have the ability to perform event filtering.  	 */ -	if (armv7pmu.set_event_filter || idx != ARMV7_IDX_CYCLE_COUNTER) +	if (cpu_pmu->set_event_filter || idx != ARMV7_IDX_CYCLE_COUNTER)  		armv7_pmnc_write_evtsel(idx, hwc->config_base);  	/* @@ -1030,10 +996,19 @@ static void armv7pmu_enable_event(struct hw_perf_event *hwc, int idx)  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } -static void armv7pmu_disable_event(struct hw_perf_event *hwc, int idx) +static void armv7pmu_disable_event(struct perf_event *event)  {  	unsigned long flags; +	struct hw_perf_event *hwc = &event->hw; +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu);  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); +	int idx = hwc->idx; + +	if (!armv7_pmnc_counter_valid(cpu_pmu, idx)) { +		pr_err("CPU%u disabling wrong PMNC counter IRQ enable %d\n", +			smp_processor_id(), idx); +		return; +	}  	/*  	 * Disable counter and interrupt @@ -1057,7 +1032,8 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)  {  	u32 pmnc;  	struct perf_sample_data data; -	struct pmu_hw_events *cpuc; +	struct arm_pmu *cpu_pmu = (struct arm_pmu *)dev; +	struct pmu_hw_events *cpuc = cpu_pmu->get_hw_events();  	struct pt_regs *regs;  	int idx; @@ -1077,7 +1053,6 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)  	 */  	regs = get_irq_regs(); -	cpuc = &__get_cpu_var(cpu_hw_events);  	for (idx = 0; idx < cpu_pmu->num_events; ++idx) {  		struct perf_event *event = cpuc->events[idx];  		struct hw_perf_event *hwc; @@ -1094,13 +1069,13 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)  			continue;  		hwc = &event->hw; -		armpmu_event_update(event, hwc, idx); +		armpmu_event_update(event);  		perf_sample_data_init(&data, 0, hwc->last_period); -		if (!armpmu_event_set_period(event, hwc, idx)) +		if (!armpmu_event_set_period(event))  			continue;  		if (perf_event_overflow(event, &data, regs)) -			cpu_pmu->disable(hwc, idx); +			cpu_pmu->disable(event);  	}  	/* @@ -1115,7 +1090,7 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)  	return IRQ_HANDLED;  } -static void armv7pmu_start(void) +static void armv7pmu_start(struct arm_pmu *cpu_pmu)  {  	unsigned long flags;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); @@ -1126,7 +1101,7 @@ static void armv7pmu_start(void)  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } -static void armv7pmu_stop(void) +static void armv7pmu_stop(struct arm_pmu *cpu_pmu)  {  	unsigned long flags;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); @@ -1138,10 +1113,12 @@ static void armv7pmu_stop(void)  }  static int armv7pmu_get_event_idx(struct pmu_hw_events *cpuc, -				  struct hw_perf_event *event) +				  struct perf_event *event)  {  	int idx; -	unsigned long evtype = event->config_base & ARMV7_EVTYPE_EVENT; +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw; +	unsigned long evtype = hwc->config_base & ARMV7_EVTYPE_EVENT;  	/* Always place a cycle counter into the cycle counter. */  	if (evtype == ARMV7_PERFCTR_CPU_CYCLES) { @@ -1192,11 +1169,14 @@ static int armv7pmu_set_event_filter(struct hw_perf_event *event,  static void armv7pmu_reset(void *info)  { +	struct arm_pmu *cpu_pmu = (struct arm_pmu *)info;  	u32 idx, nb_cnt = cpu_pmu->num_events;  	/* The counter and interrupt enable registers are unknown at reset. */ -	for (idx = ARMV7_IDX_CYCLE_COUNTER; idx < nb_cnt; ++idx) -		armv7pmu_disable_event(NULL, idx); +	for (idx = ARMV7_IDX_CYCLE_COUNTER; idx < nb_cnt; ++idx) { +		armv7_pmnc_disable_counter(idx); +		armv7_pmnc_disable_intens(idx); +	}  	/* Initialize & Reset PMNC: C and P bits */  	armv7_pmnc_write(ARMV7_PMNC_P | ARMV7_PMNC_C); @@ -1232,17 +1212,18 @@ static int armv7_a7_map_event(struct perf_event *event)  				&armv7_a7_perf_cache_map, 0xFF);  } -static struct arm_pmu armv7pmu = { -	.handle_irq		= armv7pmu_handle_irq, -	.enable			= armv7pmu_enable_event, -	.disable		= armv7pmu_disable_event, -	.read_counter		= armv7pmu_read_counter, -	.write_counter		= armv7pmu_write_counter, -	.get_event_idx		= armv7pmu_get_event_idx, -	.start			= armv7pmu_start, -	.stop			= armv7pmu_stop, -	.reset			= armv7pmu_reset, -	.max_period		= (1LLU << 32) - 1, +static void armv7pmu_init(struct arm_pmu *cpu_pmu) +{ +	cpu_pmu->handle_irq	= armv7pmu_handle_irq; +	cpu_pmu->enable		= armv7pmu_enable_event; +	cpu_pmu->disable	= armv7pmu_disable_event; +	cpu_pmu->read_counter	= armv7pmu_read_counter; +	cpu_pmu->write_counter	= armv7pmu_write_counter; +	cpu_pmu->get_event_idx	= armv7pmu_get_event_idx; +	cpu_pmu->start		= armv7pmu_start; +	cpu_pmu->stop		= armv7pmu_stop; +	cpu_pmu->reset		= armv7pmu_reset; +	cpu_pmu->max_period	= (1LLU << 32) - 1;  };  static u32 __devinit armv7_read_num_pmnc_events(void) @@ -1256,70 +1237,75 @@ static u32 __devinit armv7_read_num_pmnc_events(void)  	return nb_cnt + 1;  } -static struct arm_pmu *__devinit armv7_a8_pmu_init(void) +static int __devinit armv7_a8_pmu_init(struct arm_pmu *cpu_pmu)  { -	armv7pmu.name		= "ARMv7 Cortex-A8"; -	armv7pmu.map_event	= armv7_a8_map_event; -	armv7pmu.num_events	= armv7_read_num_pmnc_events(); -	return &armv7pmu; +	armv7pmu_init(cpu_pmu); +	cpu_pmu->name		= "ARMv7 Cortex-A8"; +	cpu_pmu->map_event	= armv7_a8_map_event; +	cpu_pmu->num_events	= armv7_read_num_pmnc_events(); +	return 0;  } -static struct arm_pmu *__devinit armv7_a9_pmu_init(void) +static int __devinit armv7_a9_pmu_init(struct arm_pmu *cpu_pmu)  { -	armv7pmu.name		= "ARMv7 Cortex-A9"; -	armv7pmu.map_event	= armv7_a9_map_event; -	armv7pmu.num_events	= armv7_read_num_pmnc_events(); -	return &armv7pmu; +	armv7pmu_init(cpu_pmu); +	cpu_pmu->name		= "ARMv7 Cortex-A9"; +	cpu_pmu->map_event	= armv7_a9_map_event; +	cpu_pmu->num_events	= armv7_read_num_pmnc_events(); +	return 0;  } -static struct arm_pmu *__devinit armv7_a5_pmu_init(void) +static int __devinit armv7_a5_pmu_init(struct arm_pmu *cpu_pmu)  { -	armv7pmu.name		= "ARMv7 Cortex-A5"; -	armv7pmu.map_event	= armv7_a5_map_event; -	armv7pmu.num_events	= armv7_read_num_pmnc_events(); -	return &armv7pmu; +	armv7pmu_init(cpu_pmu); +	cpu_pmu->name		= "ARMv7 Cortex-A5"; +	cpu_pmu->map_event	= armv7_a5_map_event; +	cpu_pmu->num_events	= armv7_read_num_pmnc_events(); +	return 0;  } -static struct arm_pmu *__devinit armv7_a15_pmu_init(void) +static int __devinit armv7_a15_pmu_init(struct arm_pmu *cpu_pmu)  { -	armv7pmu.name		= "ARMv7 Cortex-A15"; -	armv7pmu.map_event	= armv7_a15_map_event; -	armv7pmu.num_events	= armv7_read_num_pmnc_events(); -	armv7pmu.set_event_filter = armv7pmu_set_event_filter; -	return &armv7pmu; +	armv7pmu_init(cpu_pmu); +	cpu_pmu->name		= "ARMv7 Cortex-A15"; +	cpu_pmu->map_event	= armv7_a15_map_event; +	cpu_pmu->num_events	= armv7_read_num_pmnc_events(); +	cpu_pmu->set_event_filter = armv7pmu_set_event_filter; +	return 0;  } -static struct arm_pmu *__devinit armv7_a7_pmu_init(void) +static int __devinit armv7_a7_pmu_init(struct arm_pmu *cpu_pmu)  { -	armv7pmu.name		= "ARMv7 Cortex-A7"; -	armv7pmu.map_event	= armv7_a7_map_event; -	armv7pmu.num_events	= armv7_read_num_pmnc_events(); -	armv7pmu.set_event_filter = armv7pmu_set_event_filter; -	return &armv7pmu; +	armv7pmu_init(cpu_pmu); +	cpu_pmu->name		= "ARMv7 Cortex-A7"; +	cpu_pmu->map_event	= armv7_a7_map_event; +	cpu_pmu->num_events	= armv7_read_num_pmnc_events(); +	cpu_pmu->set_event_filter = armv7pmu_set_event_filter; +	return 0;  }  #else -static struct arm_pmu *__devinit armv7_a8_pmu_init(void) +static inline int armv7_a8_pmu_init(struct arm_pmu *cpu_pmu)  { -	return NULL; +	return -ENODEV;  } -static struct arm_pmu *__devinit armv7_a9_pmu_init(void) +static inline int armv7_a9_pmu_init(struct arm_pmu *cpu_pmu)  { -	return NULL; +	return -ENODEV;  } -static struct arm_pmu *__devinit armv7_a5_pmu_init(void) +static inline int armv7_a5_pmu_init(struct arm_pmu *cpu_pmu)  { -	return NULL; +	return -ENODEV;  } -static struct arm_pmu *__devinit armv7_a15_pmu_init(void) +static inline int armv7_a15_pmu_init(struct arm_pmu *cpu_pmu)  { -	return NULL; +	return -ENODEV;  } -static struct arm_pmu *__devinit armv7_a7_pmu_init(void) +static inline int armv7_a7_pmu_init(struct arm_pmu *cpu_pmu)  { -	return NULL; +	return -ENODEV;  }  #endif	/* CONFIG_CPU_V7 */ diff --git a/arch/arm/kernel/perf_event_xscale.c b/arch/arm/kernel/perf_event_xscale.c index 426e19f380a..0c8265e53d5 100644 --- a/arch/arm/kernel/perf_event_xscale.c +++ b/arch/arm/kernel/perf_event_xscale.c @@ -224,7 +224,8 @@ xscale1pmu_handle_irq(int irq_num, void *dev)  {  	unsigned long pmnc;  	struct perf_sample_data data; -	struct pmu_hw_events *cpuc; +	struct arm_pmu *cpu_pmu = (struct arm_pmu *)dev; +	struct pmu_hw_events *cpuc = cpu_pmu->get_hw_events();  	struct pt_regs *regs;  	int idx; @@ -248,7 +249,6 @@ xscale1pmu_handle_irq(int irq_num, void *dev)  	regs = get_irq_regs(); -	cpuc = &__get_cpu_var(cpu_hw_events);  	for (idx = 0; idx < cpu_pmu->num_events; ++idx) {  		struct perf_event *event = cpuc->events[idx];  		struct hw_perf_event *hwc; @@ -260,13 +260,13 @@ xscale1pmu_handle_irq(int irq_num, void *dev)  			continue;  		hwc = &event->hw; -		armpmu_event_update(event, hwc, idx); +		armpmu_event_update(event);  		perf_sample_data_init(&data, 0, hwc->last_period); -		if (!armpmu_event_set_period(event, hwc, idx)) +		if (!armpmu_event_set_period(event))  			continue;  		if (perf_event_overflow(event, &data, regs)) -			cpu_pmu->disable(hwc, idx); +			cpu_pmu->disable(event);  	}  	irq_work_run(); @@ -280,11 +280,13 @@ xscale1pmu_handle_irq(int irq_num, void *dev)  	return IRQ_HANDLED;  } -static void -xscale1pmu_enable_event(struct hw_perf_event *hwc, int idx) +static void xscale1pmu_enable_event(struct perf_event *event)  {  	unsigned long val, mask, evt, flags; +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); +	int idx = hwc->idx;  	switch (idx) {  	case XSCALE_CYCLE_COUNTER: @@ -314,11 +316,13 @@ xscale1pmu_enable_event(struct hw_perf_event *hwc, int idx)  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } -static void -xscale1pmu_disable_event(struct hw_perf_event *hwc, int idx) +static void xscale1pmu_disable_event(struct perf_event *event)  {  	unsigned long val, mask, evt, flags; +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); +	int idx = hwc->idx;  	switch (idx) {  	case XSCALE_CYCLE_COUNTER: @@ -348,9 +352,10 @@ xscale1pmu_disable_event(struct hw_perf_event *hwc, int idx)  static int  xscale1pmu_get_event_idx(struct pmu_hw_events *cpuc, -			struct hw_perf_event *event) +				struct perf_event *event)  { -	if (XSCALE_PERFCTR_CCNT == event->config_base) { +	struct hw_perf_event *hwc = &event->hw; +	if (XSCALE_PERFCTR_CCNT == hwc->config_base) {  		if (test_and_set_bit(XSCALE_CYCLE_COUNTER, cpuc->used_mask))  			return -EAGAIN; @@ -366,8 +371,7 @@ xscale1pmu_get_event_idx(struct pmu_hw_events *cpuc,  	}  } -static void -xscale1pmu_start(void) +static void xscale1pmu_start(struct arm_pmu *cpu_pmu)  {  	unsigned long flags, val;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); @@ -379,8 +383,7 @@ xscale1pmu_start(void)  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } -static void -xscale1pmu_stop(void) +static void xscale1pmu_stop(struct arm_pmu *cpu_pmu)  {  	unsigned long flags, val;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); @@ -392,9 +395,10 @@ xscale1pmu_stop(void)  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } -static inline u32 -xscale1pmu_read_counter(int counter) +static inline u32 xscale1pmu_read_counter(struct perf_event *event)  { +	struct hw_perf_event *hwc = &event->hw; +	int counter = hwc->idx;  	u32 val = 0;  	switch (counter) { @@ -412,9 +416,11 @@ xscale1pmu_read_counter(int counter)  	return val;  } -static inline void -xscale1pmu_write_counter(int counter, u32 val) +static inline void xscale1pmu_write_counter(struct perf_event *event, u32 val)  { +	struct hw_perf_event *hwc = &event->hw; +	int counter = hwc->idx; +  	switch (counter) {  	case XSCALE_CYCLE_COUNTER:  		asm volatile("mcr p14, 0, %0, c1, c0, 0" : : "r" (val)); @@ -434,24 +440,22 @@ static int xscale_map_event(struct perf_event *event)  				&xscale_perf_cache_map, 0xFF);  } -static struct arm_pmu xscale1pmu = { -	.name		= "xscale1", -	.handle_irq	= xscale1pmu_handle_irq, -	.enable		= xscale1pmu_enable_event, -	.disable	= xscale1pmu_disable_event, -	.read_counter	= xscale1pmu_read_counter, -	.write_counter	= xscale1pmu_write_counter, -	.get_event_idx	= xscale1pmu_get_event_idx, -	.start		= xscale1pmu_start, -	.stop		= xscale1pmu_stop, -	.map_event	= xscale_map_event, -	.num_events	= 3, -	.max_period	= (1LLU << 32) - 1, -}; - -static struct arm_pmu *__devinit xscale1pmu_init(void) +static int __devinit xscale1pmu_init(struct arm_pmu *cpu_pmu)  { -	return &xscale1pmu; +	cpu_pmu->name		= "xscale1"; +	cpu_pmu->handle_irq	= xscale1pmu_handle_irq; +	cpu_pmu->enable		= xscale1pmu_enable_event; +	cpu_pmu->disable	= xscale1pmu_disable_event; +	cpu_pmu->read_counter	= xscale1pmu_read_counter; +	cpu_pmu->write_counter	= xscale1pmu_write_counter; +	cpu_pmu->get_event_idx	= xscale1pmu_get_event_idx; +	cpu_pmu->start		= xscale1pmu_start; +	cpu_pmu->stop		= xscale1pmu_stop; +	cpu_pmu->map_event	= xscale_map_event; +	cpu_pmu->num_events	= 3; +	cpu_pmu->max_period	= (1LLU << 32) - 1; + +	return 0;  }  #define XSCALE2_OVERFLOWED_MASK	0x01f @@ -567,7 +571,8 @@ xscale2pmu_handle_irq(int irq_num, void *dev)  {  	unsigned long pmnc, of_flags;  	struct perf_sample_data data; -	struct pmu_hw_events *cpuc; +	struct arm_pmu *cpu_pmu = (struct arm_pmu *)dev; +	struct pmu_hw_events *cpuc = cpu_pmu->get_hw_events();  	struct pt_regs *regs;  	int idx; @@ -585,7 +590,6 @@ xscale2pmu_handle_irq(int irq_num, void *dev)  	regs = get_irq_regs(); -	cpuc = &__get_cpu_var(cpu_hw_events);  	for (idx = 0; idx < cpu_pmu->num_events; ++idx) {  		struct perf_event *event = cpuc->events[idx];  		struct hw_perf_event *hwc; @@ -597,13 +601,13 @@ xscale2pmu_handle_irq(int irq_num, void *dev)  			continue;  		hwc = &event->hw; -		armpmu_event_update(event, hwc, idx); +		armpmu_event_update(event);  		perf_sample_data_init(&data, 0, hwc->last_period); -		if (!armpmu_event_set_period(event, hwc, idx)) +		if (!armpmu_event_set_period(event))  			continue;  		if (perf_event_overflow(event, &data, regs)) -			cpu_pmu->disable(hwc, idx); +			cpu_pmu->disable(event);  	}  	irq_work_run(); @@ -617,11 +621,13 @@ xscale2pmu_handle_irq(int irq_num, void *dev)  	return IRQ_HANDLED;  } -static void -xscale2pmu_enable_event(struct hw_perf_event *hwc, int idx) +static void xscale2pmu_enable_event(struct perf_event *event)  {  	unsigned long flags, ien, evtsel; +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); +	int idx = hwc->idx;  	ien = xscale2pmu_read_int_enable();  	evtsel = xscale2pmu_read_event_select(); @@ -661,11 +667,13 @@ xscale2pmu_enable_event(struct hw_perf_event *hwc, int idx)  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } -static void -xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx) +static void xscale2pmu_disable_event(struct perf_event *event)  {  	unsigned long flags, ien, evtsel, of_flags; +	struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); +	struct hw_perf_event *hwc = &event->hw;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); +	int idx = hwc->idx;  	ien = xscale2pmu_read_int_enable();  	evtsel = xscale2pmu_read_event_select(); @@ -713,7 +721,7 @@ xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)  static int  xscale2pmu_get_event_idx(struct pmu_hw_events *cpuc, -			struct hw_perf_event *event) +				struct perf_event *event)  {  	int idx = xscale1pmu_get_event_idx(cpuc, event);  	if (idx >= 0) @@ -727,8 +735,7 @@ out:  	return idx;  } -static void -xscale2pmu_start(void) +static void xscale2pmu_start(struct arm_pmu *cpu_pmu)  {  	unsigned long flags, val;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); @@ -740,8 +747,7 @@ xscale2pmu_start(void)  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } -static void -xscale2pmu_stop(void) +static void xscale2pmu_stop(struct arm_pmu *cpu_pmu)  {  	unsigned long flags, val;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events(); @@ -753,9 +759,10 @@ xscale2pmu_stop(void)  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } -static inline u32 -xscale2pmu_read_counter(int counter) +static inline u32 xscale2pmu_read_counter(struct perf_event *event)  { +	struct hw_perf_event *hwc = &event->hw; +	int counter = hwc->idx;  	u32 val = 0;  	switch (counter) { @@ -779,9 +786,11 @@ xscale2pmu_read_counter(int counter)  	return val;  } -static inline void -xscale2pmu_write_counter(int counter, u32 val) +static inline void xscale2pmu_write_counter(struct perf_event *event, u32 val)  { +	struct hw_perf_event *hwc = &event->hw; +	int counter = hwc->idx; +  	switch (counter) {  	case XSCALE_CYCLE_COUNTER:  		asm volatile("mcr p14, 0, %0, c1, c1, 0" : : "r" (val)); @@ -801,33 +810,31 @@ xscale2pmu_write_counter(int counter, u32 val)  	}  } -static struct arm_pmu xscale2pmu = { -	.name		= "xscale2", -	.handle_irq	= xscale2pmu_handle_irq, -	.enable		= xscale2pmu_enable_event, -	.disable	= xscale2pmu_disable_event, -	.read_counter	= xscale2pmu_read_counter, -	.write_counter	= xscale2pmu_write_counter, -	.get_event_idx	= xscale2pmu_get_event_idx, -	.start		= xscale2pmu_start, -	.stop		= xscale2pmu_stop, -	.map_event	= xscale_map_event, -	.num_events	= 5, -	.max_period	= (1LLU << 32) - 1, -}; - -static struct arm_pmu *__devinit xscale2pmu_init(void) +static int __devinit xscale2pmu_init(struct arm_pmu *cpu_pmu)  { -	return &xscale2pmu; +	cpu_pmu->name		= "xscale2"; +	cpu_pmu->handle_irq	= xscale2pmu_handle_irq; +	cpu_pmu->enable		= xscale2pmu_enable_event; +	cpu_pmu->disable	= xscale2pmu_disable_event; +	cpu_pmu->read_counter	= xscale2pmu_read_counter; +	cpu_pmu->write_counter	= xscale2pmu_write_counter; +	cpu_pmu->get_event_idx	= xscale2pmu_get_event_idx; +	cpu_pmu->start		= xscale2pmu_start; +	cpu_pmu->stop		= xscale2pmu_stop; +	cpu_pmu->map_event	= xscale_map_event; +	cpu_pmu->num_events	= 5; +	cpu_pmu->max_period	= (1LLU << 32) - 1; + +	return 0;  }  #else -static struct arm_pmu *__devinit xscale1pmu_init(void) +static inline int xscale1pmu_init(struct arm_pmu *cpu_pmu)  { -	return NULL; +	return -ENODEV;  } -static struct arm_pmu *__devinit xscale2pmu_init(void) +static inline int xscale2pmu_init(struct arm_pmu *cpu_pmu)  { -	return NULL; +	return -ENODEV;  }  #endif	/* CONFIG_CPU_XSCALE */ diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 90084a6de35..c6dec5fc20a 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -34,6 +34,7 @@  #include <linux/leds.h>  #include <asm/cacheflush.h> +#include <asm/idmap.h>  #include <asm/processor.h>  #include <asm/thread_notify.h>  #include <asm/stacktrace.h> @@ -56,8 +57,6 @@ static const char *isa_modes[] = {    "ARM" , "Thumb" , "Jazelle", "ThumbEE"  }; -extern void setup_mm_for_reboot(void); -  static volatile int hlt_counter;  void disable_hlt(void) @@ -70,6 +69,7 @@ EXPORT_SYMBOL(disable_hlt);  void enable_hlt(void)  {  	hlt_counter--; +	BUG_ON(hlt_counter < 0);  }  EXPORT_SYMBOL(enable_hlt); @@ -376,17 +376,18 @@ asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");  int  copy_thread(unsigned long clone_flags, unsigned long stack_start, -	    unsigned long stk_sz, struct task_struct *p, struct pt_regs *regs) +	    unsigned long stk_sz, struct task_struct *p)  {  	struct thread_info *thread = task_thread_info(p);  	struct pt_regs *childregs = task_pt_regs(p);  	memset(&thread->cpu_context, 0, sizeof(struct cpu_context_save)); -	if (likely(regs)) { -		*childregs = *regs; +	if (likely(!(p->flags & PF_KTHREAD))) { +		*childregs = *current_pt_regs();  		childregs->ARM_r0 = 0; -		childregs->ARM_sp = stack_start; +		if (stack_start) +			childregs->ARM_sp = stack_start;  	} else {  		memset(childregs, 0, sizeof(struct pt_regs));  		thread->cpu_context.r4 = stk_sz; @@ -399,7 +400,7 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,  	clear_ptrace_hw_breakpoint(p);  	if (clone_flags & CLONE_SETTLS) -		thread->tp_value = regs->ARM_r3; +		thread->tp_value = childregs->ARM_r3;  	thread_notify(THREAD_NOTIFY_COPY, thread); diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 739db3a1b2d..03deeffd9f6 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -916,16 +916,11 @@ enum ptrace_syscall_dir {  	PTRACE_SYSCALL_EXIT,  }; -static int ptrace_syscall_trace(struct pt_regs *regs, int scno, -				enum ptrace_syscall_dir dir) +static int tracehook_report_syscall(struct pt_regs *regs, +				    enum ptrace_syscall_dir dir)  {  	unsigned long ip; -	current_thread_info()->syscall = scno; - -	if (!test_thread_flag(TIF_SYSCALL_TRACE)) -		return scno; -  	/*  	 * IP is used to denote syscall entry/exit:  	 * IP = 0 -> entry, =1 -> exit @@ -944,19 +939,41 @@ static int ptrace_syscall_trace(struct pt_regs *regs, int scno,  asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno)  { -	scno = ptrace_syscall_trace(regs, scno, PTRACE_SYSCALL_ENTER); +	current_thread_info()->syscall = scno; + +	/* Do the secure computing check first; failures should be fast. */ +	if (secure_computing(scno) == -1) +		return -1; + +	if (test_thread_flag(TIF_SYSCALL_TRACE)) +		scno = tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER); +  	if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))  		trace_sys_enter(regs, scno); +  	audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0, regs->ARM_r1,  			    regs->ARM_r2, regs->ARM_r3); +  	return scno;  } -asmlinkage int syscall_trace_exit(struct pt_regs *regs, int scno) +asmlinkage void syscall_trace_exit(struct pt_regs *regs)  { -	scno = ptrace_syscall_trace(regs, scno, PTRACE_SYSCALL_EXIT); -	if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) -		trace_sys_exit(regs, scno); +	/* +	 * Audit the syscall before anything else, as a debugger may +	 * come in and change the current registers. +	 */  	audit_syscall_exit(regs); -	return scno; + +	/* +	 * Note that we haven't updated the ->syscall field for the +	 * current thread. This isn't a problem because it will have +	 * been set on syscall entry and there hasn't been an opportunity +	 * for a PTRACE_SET_SYSCALL since then. +	 */ +	if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) +		trace_sys_exit(regs, regs_return_value(regs)); + +	if (test_thread_flag(TIF_SYSCALL_TRACE)) +		tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT);  } diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index da1d1aa20ad..9a89bf4aefe 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -383,6 +383,12 @@ void cpu_init(void)  		BUG();  	} +	/* +	 * This only works on resume and secondary cores. For booting on the +	 * boot cpu, smp_prepare_boot_cpu is called after percpu area setup. +	 */ +	set_my_cpu_offset(per_cpu_offset(cpu)); +  	cpu_proc_init();  	/* @@ -426,13 +432,14 @@ int __cpu_logical_map[NR_CPUS];  void __init smp_setup_processor_id(void)  {  	int i; -	u32 cpu = is_smp() ? read_cpuid_mpidr() & 0xff : 0; +	u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0; +	u32 cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);  	cpu_logical_map(0) = cpu; -	for (i = 1; i < NR_CPUS; ++i) +	for (i = 1; i < nr_cpu_ids; ++i)  		cpu_logical_map(i) = i == cpu ? 0 : i; -	printk(KERN_INFO "Booting Linux on physical CPU %d\n", cpu); +	printk(KERN_INFO "Booting Linux on physical CPU 0x%x\n", mpidr);  }  static void __init setup_processor(void) @@ -758,6 +765,7 @@ void __init setup_arch(char **cmdline_p)  	unflatten_device_tree(); +	arm_dt_init_cpu_maps();  #ifdef CONFIG_SMP  	if (is_smp()) {  		smp_set_ops(mdesc->smp); @@ -841,12 +849,9 @@ static const char *hwcap_str[] = {  static int c_show(struct seq_file *m, void *v)  { -	int i; +	int i, j; +	u32 cpuid; -	seq_printf(m, "Processor\t: %s rev %d (%s)\n", -		   cpu_name, read_cpuid_id() & 15, elf_platform); - -#if defined(CONFIG_SMP)  	for_each_online_cpu(i) {  		/*  		 * glibc reads /proc/cpuinfo to determine the number of @@ -854,45 +859,48 @@ static int c_show(struct seq_file *m, void *v)  		 * "processor".  Give glibc what it expects.  		 */  		seq_printf(m, "processor\t: %d\n", i); -		seq_printf(m, "BogoMIPS\t: %lu.%02lu\n\n", +		cpuid = is_smp() ? per_cpu(cpu_data, i).cpuid : read_cpuid_id(); +		seq_printf(m, "model name\t: %s rev %d (%s)\n", +			   cpu_name, cpuid & 15, elf_platform); + +#if defined(CONFIG_SMP) +		seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",  			   per_cpu(cpu_data, i).loops_per_jiffy / (500000UL/HZ),  			   (per_cpu(cpu_data, i).loops_per_jiffy / (5000UL/HZ)) % 100); -	} -#else /* CONFIG_SMP */ -	seq_printf(m, "BogoMIPS\t: %lu.%02lu\n", -		   loops_per_jiffy / (500000/HZ), -		   (loops_per_jiffy / (5000/HZ)) % 100); +#else +		seq_printf(m, "BogoMIPS\t: %lu.%02lu\n", +			   loops_per_jiffy / (500000/HZ), +			   (loops_per_jiffy / (5000/HZ)) % 100);  #endif +		/* dump out the processor features */ +		seq_puts(m, "Features\t: "); -	/* dump out the processor features */ -	seq_puts(m, "Features\t: "); - -	for (i = 0; hwcap_str[i]; i++) -		if (elf_hwcap & (1 << i)) -			seq_printf(m, "%s ", hwcap_str[i]); +		for (j = 0; hwcap_str[j]; j++) +			if (elf_hwcap & (1 << j)) +				seq_printf(m, "%s ", hwcap_str[j]); -	seq_printf(m, "\nCPU implementer\t: 0x%02x\n", read_cpuid_id() >> 24); -	seq_printf(m, "CPU architecture: %s\n", proc_arch[cpu_architecture()]); +		seq_printf(m, "\nCPU implementer\t: 0x%02x\n", cpuid >> 24); +		seq_printf(m, "CPU architecture: %s\n", +			   proc_arch[cpu_architecture()]); -	if ((read_cpuid_id() & 0x0008f000) == 0x00000000) { -		/* pre-ARM7 */ -		seq_printf(m, "CPU part\t: %07x\n", read_cpuid_id() >> 4); -	} else { -		if ((read_cpuid_id() & 0x0008f000) == 0x00007000) { -			/* ARM7 */ -			seq_printf(m, "CPU variant\t: 0x%02x\n", -				   (read_cpuid_id() >> 16) & 127); +		if ((cpuid & 0x0008f000) == 0x00000000) { +			/* pre-ARM7 */ +			seq_printf(m, "CPU part\t: %07x\n", cpuid >> 4);  		} else { -			/* post-ARM7 */ -			seq_printf(m, "CPU variant\t: 0x%x\n", -				   (read_cpuid_id() >> 20) & 15); +			if ((cpuid & 0x0008f000) == 0x00007000) { +				/* ARM7 */ +				seq_printf(m, "CPU variant\t: 0x%02x\n", +					   (cpuid >> 16) & 127); +			} else { +				/* post-ARM7 */ +				seq_printf(m, "CPU variant\t: 0x%x\n", +					   (cpuid >> 20) & 15); +			} +			seq_printf(m, "CPU part\t: 0x%03x\n", +				   (cpuid >> 4) & 0xfff);  		} -		seq_printf(m, "CPU part\t: 0x%03x\n", -			   (read_cpuid_id() >> 4) & 0xfff); +		seq_printf(m, "CPU revision\t: %d\n\n", cpuid & 15);  	} -	seq_printf(m, "CPU revision\t: %d\n", read_cpuid_id() & 15); - -	seq_puts(m, "\n");  	seq_printf(m, "Hardware\t: %s\n", machine_name);  	seq_printf(m, "Revision\t: %04x\n", system_rev); diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index fbc8b2623d8..84f4cbf652e 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -281,6 +281,7 @@ static void __cpuinit smp_store_cpu_info(unsigned int cpuid)  	struct cpuinfo_arm *cpu_info = &per_cpu(cpu_data, cpuid);  	cpu_info->loops_per_jiffy = loops_per_jiffy; +	cpu_info->cpuid = read_cpuid_id();  	store_cpu_topology(cpuid);  } @@ -313,9 +314,10 @@ asmlinkage void __cpuinit secondary_start_kernel(void)  	current->active_mm = mm;  	cpumask_set_cpu(cpu, mm_cpumask(mm)); +	cpu_init(); +  	printk("CPU%u: Booted secondary processor\n", cpu); -	cpu_init();  	preempt_disable();  	trace_hardirqs_off(); @@ -371,6 +373,7 @@ void __init smp_cpus_done(unsigned int max_cpus)  void __init smp_prepare_boot_cpu(void)  { +	set_my_cpu_offset(per_cpu_offset(smp_processor_id()));  }  void __init smp_prepare_cpus(unsigned int max_cpus) @@ -421,6 +424,11 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)  	smp_cross_call(mask, IPI_CALL_FUNC);  } +void arch_send_wakeup_ipi_mask(const struct cpumask *mask) +{ +	smp_cross_call(mask, IPI_WAKEUP); +} +  void arch_send_call_function_single_ipi(int cpu)  {  	smp_cross_call(cpumask_of(cpu), IPI_CALL_FUNC_SINGLE); @@ -443,7 +451,7 @@ void show_ipi_list(struct seq_file *p, int prec)  	for (i = 0; i < NR_IPI; i++) {  		seq_printf(p, "%*s%u: ", prec - 1, "IPI", i); -		for_each_present_cpu(cpu) +		for_each_online_cpu(cpu)  			seq_printf(p, "%10u ",  				   __get_irq_stat(cpu, ipi_irqs[i])); diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index b22d700fea2..49f335d301b 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c @@ -31,6 +31,8 @@ static void __iomem *twd_base;  static struct clk *twd_clk;  static unsigned long twd_timer_rate; +static bool common_setup_called; +static DEFINE_PER_CPU(bool, percpu_setup_called);  static struct clock_event_device __percpu **twd_evt;  static int twd_ppi; @@ -248,17 +250,9 @@ static struct clk *twd_get_clock(void)  		return clk;  	} -	err = clk_prepare(clk); +	err = clk_prepare_enable(clk);  	if (err) { -		pr_err("smp_twd: clock failed to prepare: %d\n", err); -		clk_put(clk); -		return ERR_PTR(err); -	} - -	err = clk_enable(clk); -	if (err) { -		pr_err("smp_twd: clock failed to enable: %d\n", err); -		clk_unprepare(clk); +		pr_err("smp_twd: clock failed to prepare+enable: %d\n", err);  		clk_put(clk);  		return ERR_PTR(err);  	} @@ -272,15 +266,45 @@ static struct clk *twd_get_clock(void)  static int __cpuinit twd_timer_setup(struct clock_event_device *clk)  {  	struct clock_event_device **this_cpu_clk; +	int cpu = smp_processor_id(); + +	/* +	 * If the basic setup for this CPU has been done before don't +	 * bother with the below. +	 */ +	if (per_cpu(percpu_setup_called, cpu)) { +		__raw_writel(0, twd_base + TWD_TIMER_CONTROL); +		clockevents_register_device(*__this_cpu_ptr(twd_evt)); +		enable_percpu_irq(clk->irq, 0); +		return 0; +	} +	per_cpu(percpu_setup_called, cpu) = true; -	if (!twd_clk) +	/* +	 * This stuff only need to be done once for the entire TWD cluster +	 * during the runtime of the system. +	 */ +	if (!common_setup_called) {  		twd_clk = twd_get_clock(); -	if (!IS_ERR_OR_NULL(twd_clk)) -		twd_timer_rate = clk_get_rate(twd_clk); -	else -		twd_calibrate_rate(); +		/* +		 * We use IS_ERR_OR_NULL() here, because if the clock stubs +		 * are active we will get a valid clk reference which is +		 * however NULL and will return the rate 0. In that case we +		 * need to calibrate the rate instead. +		 */ +		if (!IS_ERR_OR_NULL(twd_clk)) +			twd_timer_rate = clk_get_rate(twd_clk); +		else +			twd_calibrate_rate(); + +		common_setup_called = true; +	} +	/* +	 * The following is done once per CPU the first time .setup() is +	 * called. +	 */  	__raw_writel(0, twd_base + TWD_TIMER_CONTROL);  	clk->name = "local_timer"; @@ -366,10 +390,8 @@ void __init twd_local_timer_of_register(void)  	int err;  	np = of_find_matching_node(NULL, twd_of_match); -	if (!np) { -		err = -ENODEV; -		goto out; -	} +	if (!np) +		return;  	twd_ppi = irq_of_parse_and_map(np, 0);  	if (!twd_ppi) { diff --git a/arch/arm/kernel/sys_arm.c b/arch/arm/kernel/sys_arm.c index c2a898aa57a..3151f5623d0 100644 --- a/arch/arm/kernel/sys_arm.c +++ b/arch/arm/kernel/sys_arm.c @@ -28,37 +28,6 @@  #include <linux/uaccess.h>  #include <linux/slab.h> -/* Fork a new task - this creates a new program thread. - * This is called indirectly via a small wrapper - */ -asmlinkage int sys_fork(struct pt_regs *regs) -{ -#ifdef CONFIG_MMU -	return do_fork(SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL); -#else -	/* can not support in nommu mode */ -	return(-EINVAL); -#endif -} - -/* Clone a task - this clones the calling program thread. - * This is called indirectly via a small wrapper - */ -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, -			 int __user *parent_tidptr, int tls_val, -			 int __user *child_tidptr, struct pt_regs *regs) -{ -	if (!newsp) -		newsp = regs->ARM_sp; - -	return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr); -} - -asmlinkage int sys_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL); -} -  /*   * Since loff_t is a 64 bit type we avoid a lot of ABI hassle   * with a different argument ordering. diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c index 26c12c6440f..79282ebcd93 100644 --- a/arch/arm/kernel/topology.c +++ b/arch/arm/kernel/topology.c @@ -196,32 +196,7 @@ static inline void parse_dt_topology(void) {}  static inline void update_cpu_power(unsigned int cpuid, unsigned int mpidr) {}  #endif - -/* - * cpu topology management - */ - -#define MPIDR_SMP_BITMASK (0x3 << 30) -#define MPIDR_SMP_VALUE (0x2 << 30) - -#define MPIDR_MT_BITMASK (0x1 << 24) - -/* - * These masks reflect the current use of the affinity levels. - * The affinity level can be up to 16 bits according to ARM ARM - */ -#define MPIDR_HWID_BITMASK 0xFFFFFF - -#define MPIDR_LEVEL0_MASK 0x3 -#define MPIDR_LEVEL0_SHIFT 0 - -#define MPIDR_LEVEL1_MASK 0xF -#define MPIDR_LEVEL1_SHIFT 8 - -#define MPIDR_LEVEL2_MASK 0xFF -#define MPIDR_LEVEL2_SHIFT 16 - -/* + /*   * cpu topology table   */  struct cputopo_arm cpu_topology[NR_CPUS]; @@ -282,19 +257,14 @@ void store_cpu_topology(unsigned int cpuid)  		if (mpidr & MPIDR_MT_BITMASK) {  			/* core performance interdependency */ -			cpuid_topo->thread_id = (mpidr >> MPIDR_LEVEL0_SHIFT) -				& MPIDR_LEVEL0_MASK; -			cpuid_topo->core_id = (mpidr >> MPIDR_LEVEL1_SHIFT) -				& MPIDR_LEVEL1_MASK; -			cpuid_topo->socket_id = (mpidr >> MPIDR_LEVEL2_SHIFT) -				& MPIDR_LEVEL2_MASK; +			cpuid_topo->thread_id = MPIDR_AFFINITY_LEVEL(mpidr, 0); +			cpuid_topo->core_id = MPIDR_AFFINITY_LEVEL(mpidr, 1); +			cpuid_topo->socket_id = MPIDR_AFFINITY_LEVEL(mpidr, 2);  		} else {  			/* largely independent cores */  			cpuid_topo->thread_id = -1; -			cpuid_topo->core_id = (mpidr >> MPIDR_LEVEL0_SHIFT) -				& MPIDR_LEVEL0_MASK; -			cpuid_topo->socket_id = (mpidr >> MPIDR_LEVEL1_SHIFT) -				& MPIDR_LEVEL1_MASK; +			cpuid_topo->core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0); +			cpuid_topo->socket_id = MPIDR_AFFINITY_LEVEL(mpidr, 1);  		}  	} else {  		/* diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 36ff15bbfdd..b9f38e388b4 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S @@ -114,6 +114,15 @@ SECTIONS  	RO_DATA(PAGE_SIZE) +	. = ALIGN(4); +	__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { +		__start___ex_table = .; +#ifdef CONFIG_MMU +		*(__ex_table) +#endif +		__stop___ex_table = .; +	} +  #ifdef CONFIG_ARM_UNWIND  	/*  	 * Stack unwinding tables @@ -220,16 +229,6 @@ SECTIONS  		READ_MOSTLY_DATA(L1_CACHE_BYTES)  		/* -		 * The exception fixup table (might need resorting at runtime) -		 */ -		. = ALIGN(4); -		__start___ex_table = .; -#ifdef CONFIG_MMU -		*(__ex_table) -#endif -		__stop___ex_table = .; - -		/*  		 * and the usual data section  		 */  		DATA_DATA diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index 043624219b5..958358c91af 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig @@ -39,7 +39,6 @@ config SOC_AT91RM9200  config SOC_AT91SAM9260  	bool "AT91SAM9260, AT91SAM9XE or AT91SAM9G20"  	select HAVE_AT91_DBGU0 -	select HAVE_NET_MACB  	select SOC_AT91SAM9  	help  	  Select this if you are using one of Atmel's AT91SAM9260, AT91SAM9XE @@ -57,7 +56,6 @@ config SOC_AT91SAM9263  	bool "AT91SAM9263"  	select HAVE_AT91_DBGU1  	select HAVE_FB_ATMEL -	select HAVE_NET_MACB  	select SOC_AT91SAM9  config SOC_AT91SAM9RL @@ -70,7 +68,6 @@ config SOC_AT91SAM9G45  	bool "AT91SAM9G45 or AT91SAM9M10 families"  	select HAVE_AT91_DBGU1  	select HAVE_FB_ATMEL -	select HAVE_NET_MACB  	select SOC_AT91SAM9  	help  	  Select this if you are using one of Atmel's AT91SAM9G45 family SoC. @@ -80,7 +77,6 @@ config SOC_AT91SAM9X5  	bool "AT91SAM9x5 family"  	select HAVE_AT91_DBGU0  	select HAVE_FB_ATMEL -	select HAVE_NET_MACB  	select SOC_AT91SAM9  	help  	  Select this if you are using one of Atmel's AT91SAM9x5 family SoC. @@ -494,8 +490,17 @@ endif  comment "Generic Board Type" +config MACH_AT91RM9200_DT +	bool "Atmel AT91RM9200 Evaluation Kits with device-tree support" +	depends on SOC_AT91RM9200 +	select USE_OF +	help +	  Select this if you want to experiment device-tree with +	  an Atmel RM9200 Evaluation Kit. +  config MACH_AT91SAM_DT  	bool "Atmel AT91SAM Evaluation Kits with device-tree support" +	depends on SOC_AT91SAM9  	select USE_OF  	help  	  Select this if you want to experiment device-tree with diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index 3bb7a51efc9..b38a1dcb79b 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile @@ -88,6 +88,7 @@ obj-$(CONFIG_MACH_SNAPPER_9260)	+= board-snapper9260.o  obj-$(CONFIG_MACH_AT91SAM9M10G45EK) += board-sam9m10g45ek.o  # AT91SAM board with device-tree +obj-$(CONFIG_MACH_AT91RM9200_DT) += board-rm9200-dt.o  obj-$(CONFIG_MACH_AT91SAM_DT) += board-dt.o  # AT91X40 board-specific support diff --git a/arch/arm/mach-at91/include/mach/at91_aic.h b/arch/arm/mach-at91/at91_aic.h index eaea66197fa..eaea66197fa 100644 --- a/arch/arm/mach-at91/include/mach/at91_aic.h +++ b/arch/arm/mach-at91/at91_aic.h diff --git a/arch/arm/mach-at91/include/mach/at91_rstc.h b/arch/arm/mach-at91/at91_rstc.h index 875fa336800..875fa336800 100644 --- a/arch/arm/mach-at91/include/mach/at91_rstc.h +++ b/arch/arm/mach-at91/at91_rstc.h diff --git a/arch/arm/mach-at91/include/mach/at91_shdwc.h b/arch/arm/mach-at91/at91_shdwc.h index 60478ea8bd4..60478ea8bd4 100644 --- a/arch/arm/mach-at91/include/mach/at91_shdwc.h +++ b/arch/arm/mach-at91/at91_shdwc.h diff --git a/arch/arm/mach-at91/include/mach/at91_tc.h b/arch/arm/mach-at91/at91_tc.h index 46a317fd716..46a317fd716 100644 --- a/arch/arm/mach-at91/include/mach/at91_tc.h +++ b/arch/arm/mach-at91/at91_tc.h diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index 5269825194a..8ce068240c6 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c @@ -17,11 +17,11 @@  #include <asm/mach/map.h>  #include <asm/system_misc.h>  #include <mach/at91rm9200.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/at91_st.h>  #include <mach/cpu.h> +#include "at91_aic.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -194,6 +194,24 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_ID("pioB", &pioB_clk),  	CLKDEV_CON_ID("pioC", &pioC_clk),  	CLKDEV_CON_ID("pioD", &pioD_clk), +	/* usart lookup table for DT entries */ +	CLKDEV_CON_DEV_ID("usart", "fffff200.serial", &mck), +	CLKDEV_CON_DEV_ID("usart", "fffc0000.serial", &usart0_clk), +	CLKDEV_CON_DEV_ID("usart", "fffc4000.serial", &usart1_clk), +	CLKDEV_CON_DEV_ID("usart", "fffc8000.serial", &usart2_clk), +	CLKDEV_CON_DEV_ID("usart", "fffcc000.serial", &usart3_clk), +	/* tc lookup table for DT entries */ +	CLKDEV_CON_DEV_ID("t0_clk", "fffa0000.timer", &tc0_clk), +	CLKDEV_CON_DEV_ID("t1_clk", "fffa0000.timer", &tc1_clk), +	CLKDEV_CON_DEV_ID("t2_clk", "fffa0000.timer", &tc2_clk), +	CLKDEV_CON_DEV_ID("t0_clk", "fffa4000.timer", &tc3_clk), +	CLKDEV_CON_DEV_ID("t1_clk", "fffa4000.timer", &tc4_clk), +	CLKDEV_CON_DEV_ID("t2_clk", "fffa4000.timer", &tc5_clk), +	CLKDEV_CON_DEV_ID("hclk", "300000.ohci", &ohci_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioA_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioC_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioD_clk),  };  static struct clk_lookup usart_clocks_lookups[] = { @@ -361,10 +379,10 @@ static unsigned int at91rm9200_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0	/* Advanced Interrupt Controller (IRQ6) */  }; -struct at91_init_soc __initdata at91rm9200_soc = { +AT91_SOC_START(rm9200)  	.map_io = at91rm9200_map_io,  	.default_irq_priority = at91rm9200_default_irq_priority,  	.ioremap_registers = at91rm9200_ioremap_registers,  	.register_clocks = at91rm9200_register_clocks,  	.init = at91rm9200_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index 3cee0e6ea7c..2a1f8e67683 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c @@ -18,11 +18,11 @@  #include <linux/platform_device.h>  #include <linux/i2c-gpio.h> -#include <mach/board.h>  #include <mach/at91rm9200.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c index aaa443b48c9..cafe98836c8 100644 --- a/arch/arm/mach-at91/at91rm9200_time.c +++ b/arch/arm/mach-at91/at91rm9200_time.c @@ -24,6 +24,9 @@  #include <linux/irq.h>  #include <linux/clockchips.h>  #include <linux/export.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h>  #include <asm/mach/time.h> @@ -91,7 +94,8 @@ static irqreturn_t at91rm9200_timer_interrupt(int irq, void *dev_id)  static struct irqaction at91rm9200_timer_irq = {  	.name		= "at91_tick",  	.flags		= IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, -	.handler	= at91rm9200_timer_interrupt +	.handler	= at91rm9200_timer_interrupt, +	.irq		= NR_IRQS_LEGACY + AT91_ID_SYS,  };  static cycle_t read_clk32k(struct clocksource *cs) @@ -179,8 +183,60 @@ static struct clock_event_device clkevt = {  void __iomem *at91_st_base;  EXPORT_SYMBOL_GPL(at91_st_base); +#ifdef CONFIG_OF +static struct of_device_id at91rm9200_st_timer_ids[] = { +	{ .compatible = "atmel,at91rm9200-st" }, +	{ /* sentinel */ } +}; + +static int __init of_at91rm9200_st_init(void) +{ +	struct device_node *np; +	int ret; + +	np = of_find_matching_node(NULL, at91rm9200_st_timer_ids); +	if (!np) +		goto err; + +	at91_st_base = of_iomap(np, 0); +	if (!at91_st_base) +		goto node_err; + +	/* Get the interrupts property */ +	ret = irq_of_parse_and_map(np, 0); +	if (!ret) +		goto ioremap_err; +	at91rm9200_timer_irq.irq = ret; + +	of_node_put(np); + +	return 0; + +ioremap_err: +	iounmap(at91_st_base); +node_err: +	of_node_put(np); +err: +	return -EINVAL; +} +#else +static int __init of_at91rm9200_st_init(void) +{ +	return -EINVAL; +} +#endif +  void __init at91rm9200_ioremap_st(u32 addr)  { +#ifdef CONFIG_OF +	struct device_node *np; + +	np = of_find_matching_node(NULL, at91rm9200_st_timer_ids); +	if (np) { +		of_node_put(np); +		return; +	} +#endif  	at91_st_base = ioremap(addr, 256);  	if (!at91_st_base)  		panic("Impossible to ioremap ST\n"); @@ -191,13 +247,16 @@ void __init at91rm9200_ioremap_st(u32 addr)   */  void __init at91rm9200_timer_init(void)  { +	/* For device tree enabled device: initialize here */ +	of_at91rm9200_st_init(); +  	/* Disable all timer interrupts, and clear any pending ones */  	at91_st_write(AT91_ST_IDR,  		AT91_ST_PITS | AT91_ST_WDOVF | AT91_ST_RTTINC | AT91_ST_ALMS);  	at91_st_read(AT91_ST_SR);  	/* Make IRQs happen for the system timer */ -	setup_irq(NR_IRQS_LEGACY + AT91_ID_SYS, &at91rm9200_timer_irq); +	setup_irq(at91rm9200_timer_irq.irq, &at91rm9200_timer_irq);  	/* The 32KiHz "Slow Clock" (tick every 30517.58 nanoseconds) is used  	 * directly for the clocksource and all clockevents, after adjusting diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index f8202615f4a..c65e7b8d7a8 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c @@ -20,10 +20,10 @@  #include <mach/cpu.h>  #include <mach/at91_dbgu.h>  #include <mach/at91sam9260.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h> -#include <mach/at91_rstc.h> +#include "at91_aic.h" +#include "at91_rstc.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -230,11 +230,15 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk),  	CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk),  	CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "fffa8000.mmc", &mmc_clk),  	/* fake hclk clock */  	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),  	CLKDEV_CON_ID("pioA", &pioA_clk),  	CLKDEV_CON_ID("pioB", &pioB_clk),  	CLKDEV_CON_ID("pioC", &pioC_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioA_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioC_clk),  };  static struct clk_lookup usart_clocks_lookups[] = { @@ -390,10 +394,10 @@ static unsigned int at91sam9260_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0,	/* Advanced Interrupt Controller */  }; -struct at91_init_soc __initdata at91sam9260_soc = { +AT91_SOC_START(sam9260)  	.map_io = at91sam9260_map_io,  	.default_irq_priority = at91sam9260_default_irq_priority,  	.ioremap_registers = at91sam9260_ioremap_registers,  	.register_clocks = at91sam9260_register_clocks,  	.init = at91sam9260_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 414bd855fb0..1f6fac21b2c 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c @@ -19,7 +19,6 @@  #include <linux/platform_data/at91_adc.h> -#include <mach/board.h>  #include <mach/cpu.h>  #include <mach/at91sam9260.h>  #include <mach/at91sam9260_matrix.h> @@ -27,6 +26,7 @@  #include <mach/at91sam9_smc.h>  #include <mach/at91_adc.h> +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index 04295c04b3e..9d3e9b8b992 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c @@ -19,10 +19,10 @@  #include <asm/system_misc.h>  #include <mach/cpu.h>  #include <mach/at91sam9261.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h> -#include <mach/at91_rstc.h> +#include "at91_aic.h" +#include "at91_rstc.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -334,10 +334,10 @@ static unsigned int at91sam9261_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0,	/* Advanced Interrupt Controller */  }; -struct at91_init_soc __initdata at91sam9261_soc = { +AT91_SOC_START(sam9261)  	.map_io = at91sam9261_map_io,  	.default_irq_priority = at91sam9261_default_irq_priority,  	.ioremap_registers = at91sam9261_ioremap_registers,  	.register_clocks = at91sam9261_register_clocks,  	.init = at91sam9261_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index cd604aad8e9..6ce6d27e244 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c @@ -21,12 +21,12 @@  #include <linux/fb.h>  #include <video/atmel_lcdc.h> -#include <mach/board.h>  #include <mach/at91sam9261.h>  #include <mach/at91sam9261_matrix.h>  #include <mach/at91_matrix.h>  #include <mach/at91sam9_smc.h> +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index d6f9c23927c..82deb4d748b 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c @@ -18,10 +18,10 @@  #include <asm/mach/map.h>  #include <asm/system_misc.h>  #include <mach/at91sam9263.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h> -#include <mach/at91_rstc.h> +#include "at91_aic.h" +#include "at91_rstc.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -211,7 +211,14 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("hclk", "a00000.ohci", &ohci_clk),  	CLKDEV_CON_DEV_ID("spi_clk", "fffa4000.spi", &spi0_clk),  	CLKDEV_CON_DEV_ID("spi_clk", "fffa8000.spi", &spi1_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "fff80000.mmc", &mmc0_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "fff84000.mmc", &mmc1_clk),  	CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff200.gpio", &pioA_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioCDE_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCDE_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioCDE_clk),  };  static struct clk_lookup usart_clocks_lookups[] = { @@ -365,10 +372,10 @@ static unsigned int at91sam9263_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0,	/* Advanced Interrupt Controller (IRQ1) */  }; -struct at91_init_soc __initdata at91sam9263_soc = { +AT91_SOC_START(sam9263)  	.map_io = at91sam9263_map_io,  	.default_irq_priority = at91sam9263_default_irq_priority,  	.ioremap_registers = at91sam9263_ioremap_registers,  	.register_clocks = at91sam9263_register_clocks,  	.init = at91sam9263_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 9c61e59a210..fb98163b9b3 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -20,12 +20,12 @@  #include <linux/fb.h>  #include <video/atmel_lcdc.h> -#include <mach/board.h>  #include <mach/at91sam9263.h>  #include <mach/at91sam9263_matrix.h>  #include <mach/at91_matrix.h>  #include <mach/at91sam9_smc.h> +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c index ffc0957d762..358412f1f5f 100644 --- a/arch/arm/mach-at91/at91sam926x_time.c +++ b/arch/arm/mach-at91/at91sam926x_time.c @@ -20,8 +20,18 @@  #include <asm/mach/time.h> -#include <mach/at91_pit.h> +#define AT91_PIT_MR		0x00			/* Mode Register */ +#define		AT91_PIT_PITIEN		(1 << 25)		/* Timer Interrupt Enable */ +#define		AT91_PIT_PITEN		(1 << 24)		/* Timer Enabled */ +#define		AT91_PIT_PIV		(0xfffff)		/* Periodic Interval Value */ +#define AT91_PIT_SR		0x04			/* Status Register */ +#define		AT91_PIT_PITS		(1 << 0)		/* Timer Status */ + +#define AT91_PIT_PIVR		0x08			/* Periodic Interval Value Register */ +#define AT91_PIT_PIIR		0x0c			/* Periodic Interval Image Register */ +#define		AT91_PIT_PICNT		(0xfff << 20)		/* Interval Counter */ +#define		AT91_PIT_CPIV		(0xfffff)		/* Inverval Value */  #define PIT_CPIV(x)	((x) & AT91_PIT_CPIV)  #define PIT_PICNT(x)	(((x) & AT91_PIT_PICNT) >> 20) diff --git a/arch/arm/mach-at91/at91sam9_alt_reset.S b/arch/arm/mach-at91/at91sam9_alt_reset.S index 7af2e108b8a..f039538d3bd 100644 --- a/arch/arm/mach-at91/at91sam9_alt_reset.S +++ b/arch/arm/mach-at91/at91sam9_alt_reset.S @@ -16,7 +16,7 @@  #include <linux/linkage.h>  #include <mach/hardware.h>  #include <mach/at91_ramc.h> -#include <mach/at91_rstc.h> +#include "at91_rstc.h"  			.arm diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index b7ae124c16e..45d753d473f 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c @@ -18,10 +18,10 @@  #include <asm/mach/map.h>  #include <asm/system_misc.h>  #include <mach/at91sam9g45.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/cpu.h> +#include "at91_aic.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -256,10 +256,18 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk),  	CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk),  	CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "fff80000.mmc", &mmc0_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "fffd0000.mmc", &mmc1_clk),  	CLKDEV_CON_DEV_ID(NULL, "fff84000.i2c", &twi0_clk),  	CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi1_clk),  	/* fake hclk clock */  	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff200.gpio", &pioA_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioC_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioDE_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioDE_clk), +  	CLKDEV_CON_ID("pioA", &pioA_clk),  	CLKDEV_CON_ID("pioB", &pioB_clk),  	CLKDEV_CON_ID("pioC", &pioC_clk), @@ -408,10 +416,10 @@ static unsigned int at91sam9g45_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0,	/* Advanced Interrupt Controller (IRQ0) */  }; -struct at91_init_soc __initdata at91sam9g45_soc = { +AT91_SOC_START(sam9g45)  	.map_io = at91sam9g45_map_io,  	.default_irq_priority = at91sam9g45_default_irq_priority,  	.ioremap_registers = at91sam9g45_ioremap_registers,  	.register_clocks = at91sam9g45_register_clocks,  	.init = at91sam9g45_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index fcd233cb33d..e35964201a1 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c @@ -26,7 +26,6 @@  #include <video/atmel_lcdc.h>  #include <mach/at91_adc.h> -#include <mach/board.h>  #include <mach/at91sam9g45.h>  #include <mach/at91sam9g45_matrix.h>  #include <mach/at91_matrix.h> @@ -36,6 +35,7 @@  #include <media/atmel-isi.h> +#include "board.h"  #include "generic.h"  #include "clock.h" diff --git a/arch/arm/mach-at91/at91sam9g45_reset.S b/arch/arm/mach-at91/at91sam9g45_reset.S index 9d457182c86..721a1a34dd1 100644 --- a/arch/arm/mach-at91/at91sam9g45_reset.S +++ b/arch/arm/mach-at91/at91sam9g45_reset.S @@ -13,8 +13,7 @@  #include <linux/linkage.h>  #include <mach/hardware.h>  #include <mach/at91_ramc.h> -#include <mach/at91_rstc.h> - +#include "at91_rstc.h"  			.arm  			.globl	at91sam9g45_restart diff --git a/arch/arm/mach-at91/at91sam9n12.c b/arch/arm/mach-at91/at91sam9n12.c index 732d3d3f4ec..5dfc8fd8710 100644 --- a/arch/arm/mach-at91/at91sam9n12.c +++ b/arch/arm/mach-at91/at91sam9n12.c @@ -15,8 +15,8 @@  #include <mach/at91sam9n12.h>  #include <mach/at91_pmc.h>  #include <mach/cpu.h> -#include <mach/board.h> +#include "board.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -168,13 +168,14 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk),  	CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb_clk),  	CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc_clk),  	CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma_clk),  	CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk),  	CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), -	CLKDEV_CON_ID("pioA", &pioAB_clk), -	CLKDEV_CON_ID("pioB", &pioAB_clk), -	CLKDEV_CON_ID("pioC", &pioCD_clk), -	CLKDEV_CON_ID("pioD", &pioCD_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioAB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioAB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCD_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioCD_clk),  	/* additional fake clock for macb_hclk */  	CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &uhp_clk),  	CLKDEV_CON_DEV_ID("ohci_clk", "500000.ohci", &uhp_clk), @@ -223,13 +224,10 @@ static void __init at91sam9n12_map_io(void)  void __init at91sam9n12_initialize(void)  {  	at91_extern_irq = (1 << AT91SAM9N12_ID_IRQ0); - -	/* Register GPIO subsystem (using DT) */ -	at91_gpio_init(NULL, 0);  } -struct at91_init_soc __initdata at91sam9n12_soc = { +AT91_SOC_START(sam9n12)  	.map_io = at91sam9n12_map_io,  	.register_clocks = at91sam9n12_register_clocks,  	.init = at91sam9n12_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index 72e90841222..44e3a633fda 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c @@ -19,10 +19,10 @@  #include <mach/cpu.h>  #include <mach/at91_dbgu.h>  #include <mach/at91sam9rl.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h> -#include <mach/at91_rstc.h> +#include "at91_aic.h" +#include "at91_rstc.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -338,10 +338,10 @@ static unsigned int at91sam9rl_default_irq_priority[NR_AIC_IRQS] __initdata = {  	0,	/* Advanced Interrupt Controller */  }; -struct at91_init_soc __initdata at91sam9rl_soc = { +AT91_SOC_START(sam9rl)  	.map_io = at91sam9rl_map_io,  	.default_irq_priority = at91sam9rl_default_irq_priority,  	.ioremap_registers = at91sam9rl_ioremap_registers,  	.register_clocks = at91sam9rl_register_clocks,  	.init = at91sam9rl_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index 5047bdc92ad..160384d93db 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c @@ -17,13 +17,13 @@  #include <linux/fb.h>  #include <video/atmel_lcdc.h> -#include <mach/board.h>  #include <mach/at91sam9rl.h>  #include <mach/at91sam9rl_matrix.h>  #include <mach/at91_matrix.h>  #include <mach/at91sam9_smc.h>  #include <linux/platform_data/dma-atmel.h> +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c index e5035380dcb..dfb2c0c13fb 100644 --- a/arch/arm/mach-at91/at91sam9x5.c +++ b/arch/arm/mach-at91/at91sam9x5.c @@ -15,8 +15,8 @@  #include <mach/at91sam9x5.h>  #include <mach/at91_pmc.h>  #include <mach/cpu.h> -#include <mach/board.h> +#include "board.h"  #include "soc.h"  #include "generic.h"  #include "clock.h" @@ -229,15 +229,17 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk),  	CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb0_clk),  	CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc0_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "f000c000.mmc", &mmc1_clk),  	CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma0_clk),  	CLKDEV_CON_DEV_ID("dma_clk", "ffffee00.dma-controller", &dma1_clk),  	CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk),  	CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk),  	CLKDEV_CON_DEV_ID(NULL, "f8018000.i2c", &twi2_clk), -	CLKDEV_CON_ID("pioA", &pioAB_clk), -	CLKDEV_CON_ID("pioB", &pioAB_clk), -	CLKDEV_CON_ID("pioC", &pioCD_clk), -	CLKDEV_CON_ID("pioD", &pioCD_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioAB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioAB_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCD_clk), +	CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioCD_clk),  	/* additional fake clock for macb_hclk */  	CLKDEV_CON_DEV_ID("hclk", "f802c000.ethernet", &macb0_clk),  	CLKDEV_CON_DEV_ID("hclk", "f8030000.ethernet", &macb1_clk), @@ -313,18 +315,11 @@ static void __init at91sam9x5_map_io(void)  	at91_init_sram(0, AT91SAM9X5_SRAM_BASE, AT91SAM9X5_SRAM_SIZE);  } -void __init at91sam9x5_initialize(void) -{ -	/* Register GPIO subsystem (using DT) */ -	at91_gpio_init(NULL, 0); -} -  /* --------------------------------------------------------------------   *  Interrupt initialization   * -------------------------------------------------------------------- */ -struct at91_init_soc __initdata at91sam9x5_soc = { +AT91_SOC_START(sam9x5)  	.map_io = at91sam9x5_map_io,  	.register_clocks = at91sam9x5_register_clocks, -	.init = at91sam9x5_initialize, -}; +AT91_SOC_END diff --git a/arch/arm/mach-at91/at91x40.c b/arch/arm/mach-at91/at91x40.c index bb7f54474b9..19ca7939690 100644 --- a/arch/arm/mach-at91/at91x40.c +++ b/arch/arm/mach-at91/at91x40.c @@ -18,9 +18,10 @@  #include <asm/system_misc.h>  #include <asm/mach/arch.h>  #include <mach/at91x40.h> -#include <mach/at91_aic.h>  #include <mach/at91_st.h>  #include <mach/timex.h> + +#include "at91_aic.h"  #include "generic.h"  /* diff --git a/arch/arm/mach-at91/at91x40_time.c b/arch/arm/mach-at91/at91x40_time.c index ee06d7bcdf7..0e57e440c06 100644 --- a/arch/arm/mach-at91/at91x40_time.c +++ b/arch/arm/mach-at91/at91x40_time.c @@ -26,7 +26,8 @@  #include <linux/io.h>  #include <mach/hardware.h>  #include <asm/mach/time.h> -#include <mach/at91_tc.h> + +#include "at91_tc.h"  #define at91_tc_read(field) \  	__raw_readl(AT91_IO_P2V(AT91_TC) + field) diff --git a/arch/arm/mach-at91/board-1arm.c b/arch/arm/mach-at91/board-1arm.c index 22d8856094f..b99b5752cc1 100644 --- a/arch/arm/mach-at91/board-1arm.c +++ b/arch/arm/mach-at91/board-1arm.c @@ -34,10 +34,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h>  #include <mach/cpu.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c index 93a832f7023..854b9797428 100644 --- a/arch/arm/mach-at91/board-afeb-9260v1.c +++ b/arch/arm/mach-at91/board-afeb-9260v1.c @@ -43,9 +43,8 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h> - +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-cam60.c b/arch/arm/mach-at91/board-cam60.c index 477e708497b..28a18ce6d91 100644 --- a/arch/arm/mach-at91/board-cam60.c +++ b/arch/arm/mach-at91/board-cam60.c @@ -38,10 +38,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-carmeva.c b/arch/arm/mach-at91/board-carmeva.c index 71d8f362a1d..c17bb533a94 100644 --- a/arch/arm/mach-at91/board-carmeva.c +++ b/arch/arm/mach-at91/board-carmeva.c @@ -35,9 +35,9 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-cpu9krea.c b/arch/arm/mach-at91/board-cpu9krea.c index e71c473316e..847432441ec 100644 --- a/arch/arm/mach-at91/board-cpu9krea.c +++ b/arch/arm/mach-at91/board-cpu9krea.c @@ -40,12 +40,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91sam9260_matrix.h>  #include <mach/at91_matrix.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-cpuat91.c b/arch/arm/mach-at91/board-cpuat91.c index 2cbd1a2b6c3..2a7af786874 100644 --- a/arch/arm/mach-at91/board-cpuat91.c +++ b/arch/arm/mach-at91/board-cpuat91.c @@ -36,12 +36,12 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h>  #include <mach/cpu.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static struct gpio_led cpuat91_leds[] = { diff --git a/arch/arm/mach-at91/board-csb337.c b/arch/arm/mach-at91/board-csb337.c index 3e37437a7a6..48a531e05be 100644 --- a/arch/arm/mach-at91/board-csb337.c +++ b/arch/arm/mach-at91/board-csb337.c @@ -38,9 +38,9 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" @@ -53,6 +53,8 @@ static void __init csb337_init_early(void)  static struct macb_platform_data __initdata csb337_eth_data = {  	.phy_irq_pin	= AT91_PIN_PC2,  	.is_rmii	= 0, +	/* The CSB337 bootloader stores the MAC the wrong-way around */ +	.rev_eth_addr	= 1,  };  static struct at91_usbh_data __initdata csb337_usbh_data = { diff --git a/arch/arm/mach-at91/board-csb637.c b/arch/arm/mach-at91/board-csb637.c index 872871ab116..ec0f3abd504 100644 --- a/arch/arm/mach-at91/board-csb637.c +++ b/arch/arm/mach-at91/board-csb637.c @@ -35,9 +35,9 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-dt.c b/arch/arm/mach-at91/board-dt.c index e8f45c4e0ea..881170ce61d 100644 --- a/arch/arm/mach-at91/board-dt.c +++ b/arch/arm/mach-at91/board-dt.c @@ -15,23 +15,20 @@  #include <linux/of_irq.h>  #include <linux/of_platform.h> -#include <mach/board.h> -#include <mach/at91_aic.h> -  #include <asm/setup.h>  #include <asm/irq.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/irq.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static const struct of_device_id irq_of_match[] __initconst = {  	{ .compatible = "atmel,at91rm9200-aic", .data = at91_aic_of_init }, -	{ .compatible = "atmel,at91rm9200-gpio", .data = at91_gpio_of_irq_setup }, -	{ .compatible = "atmel,at91sam9x5-gpio", .data = at91_gpio_of_irq_setup },  	{ /*sentinel*/ }  }; diff --git a/arch/arm/mach-at91/board-eb01.c b/arch/arm/mach-at91/board-eb01.c index 01f66e99ece..b489388a6f8 100644 --- a/arch/arm/mach-at91/board-eb01.c +++ b/arch/arm/mach-at91/board-eb01.c @@ -27,8 +27,9 @@  #include <mach/hardware.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <mach/board.h> -#include <mach/at91_aic.h> + +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static void __init at91eb01_init_irq(void) diff --git a/arch/arm/mach-at91/board-eb9200.c b/arch/arm/mach-at91/board-eb9200.c index 0cfac16ee9d..9f5e71c95f0 100644 --- a/arch/arm/mach-at91/board-eb9200.c +++ b/arch/arm/mach-at91/board-eb9200.c @@ -35,9 +35,8 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h> - +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-ecbat91.c b/arch/arm/mach-at91/board-ecbat91.c index 3d931ffac4b..ef69e0ebe94 100644 --- a/arch/arm/mach-at91/board-ecbat91.c +++ b/arch/arm/mach-at91/board-ecbat91.c @@ -37,10 +37,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h>  #include <mach/cpu.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-eco920.c b/arch/arm/mach-at91/board-eco920.c index d93658a2b12..50f3d3795c0 100644 --- a/arch/arm/mach-at91/board-eco920.c +++ b/arch/arm/mach-at91/board-eco920.c @@ -24,12 +24,12 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h>  #include <mach/cpu.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static void __init eco920_init_early(void) diff --git a/arch/arm/mach-at91/board-flexibity.c b/arch/arm/mach-at91/board-flexibity.c index fa98abacb1b..5d44eba0f20 100644 --- a/arch/arm/mach-at91/board-flexibity.c +++ b/arch/arm/mach-at91/board-flexibity.c @@ -33,9 +33,9 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static void __init flexibity_init_early(void) diff --git a/arch/arm/mach-at91/board-foxg20.c b/arch/arm/mach-at91/board-foxg20.c index 6e47071d820..191d37c16ba 100644 --- a/arch/arm/mach-at91/board-foxg20.c +++ b/arch/arm/mach-at91/board-foxg20.c @@ -41,10 +41,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-gsia18s.c b/arch/arm/mach-at91/board-gsia18s.c index a9d5e78118c..23a2fa17ab2 100644 --- a/arch/arm/mach-at91/board-gsia18s.c +++ b/arch/arm/mach-at91/board-gsia18s.c @@ -30,14 +30,14 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/gsia18s.h> -#include <mach/stamp9g20.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" +#include "gsia18s.h" +#include "stamp9g20.h"  static void __init gsia18s_init_early(void)  { diff --git a/arch/arm/mach-at91/board-kafa.c b/arch/arm/mach-at91/board-kafa.c index 86050da3ba5..9a43d1e1a03 100644 --- a/arch/arm/mach-at91/board-kafa.c +++ b/arch/arm/mach-at91/board-kafa.c @@ -34,10 +34,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/cpu.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-kb9202.c b/arch/arm/mach-at91/board-kb9202.c index abe9fed7a3e..f168bec2369 100644 --- a/arch/arm/mach-at91/board-kb9202.c +++ b/arch/arm/mach-at91/board-kb9202.c @@ -35,12 +35,12 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h>  #include <mach/cpu.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-neocore926.c b/arch/arm/mach-at91/board-neocore926.c index 6960778af4c..bc7a1c4a1f6 100644 --- a/arch/arm/mach-at91/board-neocore926.c +++ b/arch/arm/mach-at91/board-neocore926.c @@ -44,10 +44,10 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-pcontrol-g20.c b/arch/arm/mach-at91/board-pcontrol-g20.c index 9ca3e32c54c..0299554495d 100644 --- a/arch/arm/mach-at91/board-pcontrol-g20.c +++ b/arch/arm/mach-at91/board-pcontrol-g20.c @@ -29,13 +29,13 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/stamp9g20.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" +#include "stamp9g20.h"  static void __init pcontrol_g20_init_early(void) diff --git a/arch/arm/mach-at91/board-picotux200.c b/arch/arm/mach-at91/board-picotux200.c index f83e1de699e..4938f1cd5e1 100644 --- a/arch/arm/mach-at91/board-picotux200.c +++ b/arch/arm/mach-at91/board-picotux200.c @@ -37,11 +37,11 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-qil-a9260.c b/arch/arm/mach-at91/board-qil-a9260.c index 799f214edeb..33b1628467e 100644 --- a/arch/arm/mach-at91/board-qil-a9260.c +++ b/arch/arm/mach-at91/board-qil-a9260.c @@ -40,11 +40,11 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-rm9200-dt.c b/arch/arm/mach-at91/board-rm9200-dt.c new file mode 100644 index 00000000000..5f9ce3da3fd --- /dev/null +++ b/arch/arm/mach-at91/board-rm9200-dt.c @@ -0,0 +1,57 @@ +/* + *  Setup code for AT91RM9200 Evaluation Kits with Device Tree support + * + *  Copyright (C) 2011 Atmel, + *                2011 Nicolas Ferre <nicolas.ferre@atmel.com> + *                2012 Joachim Eastwood <manabian@gmail.com> + * + * Licensed under GPLv2 or later. + */ + +#include <linux/types.h> +#include <linux/init.h> +#include <linux/module.h> +#include <linux/gpio.h> +#include <linux/of.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> + +#include <asm/setup.h> +#include <asm/irq.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <asm/mach/irq.h> + +#include "at91_aic.h" +#include "generic.h" + + +static const struct of_device_id irq_of_match[] __initconst = { +	{ .compatible = "atmel,at91rm9200-aic", .data = at91_aic_of_init }, +	{ /*sentinel*/ } +}; + +static void __init at91rm9200_dt_init_irq(void) +{ +	of_irq_init(irq_of_match); +} + +static void __init at91rm9200_dt_device_init(void) +{ +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); +} + +static const char *at91rm9200_dt_board_compat[] __initdata = { +	"atmel,at91rm9200", +	NULL +}; + +DT_MACHINE_START(at91rm9200_dt, "Atmel AT91RM9200 (Device Tree)") +	.timer		= &at91rm9200_timer, +	.map_io		= at91_map_io, +	.handle_irq	= at91_aic_handle_irq, +	.init_early	= at91rm9200_dt_initialize, +	.init_irq	= at91rm9200_dt_init_irq, +	.init_machine	= at91rm9200_dt_device_init, +	.dt_compat	= at91rm9200_dt_board_compat, +MACHINE_END diff --git a/arch/arm/mach-at91/board-rm9200dk.c b/arch/arm/mach-at91/board-rm9200dk.c index 66338e7ebfb..9e5061bef0d 100644 --- a/arch/arm/mach-at91/board-rm9200dk.c +++ b/arch/arm/mach-at91/board-rm9200dk.c @@ -39,11 +39,11 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-rm9200ek.c b/arch/arm/mach-at91/board-rm9200ek.c index 5d1b5729dc6..58277dbc718 100644 --- a/arch/arm/mach-at91/board-rm9200ek.c +++ b/arch/arm/mach-at91/board-rm9200ek.c @@ -39,11 +39,11 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-rsi-ews.c b/arch/arm/mach-at91/board-rsi-ews.c index a0ecf04e9ae..2e8b8339a20 100644 --- a/arch/arm/mach-at91/board-rsi-ews.c +++ b/arch/arm/mach-at91/board-rsi-ews.c @@ -25,11 +25,11 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <linux/gpio.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h"  static void __init rsi_ews_init_early(void) diff --git a/arch/arm/mach-at91/board-sam9-l9260.c b/arch/arm/mach-at91/board-sam9-l9260.c index c5f01acce3c..b75fbf6003a 100644 --- a/arch/arm/mach-at91/board-sam9-l9260.c +++ b/arch/arm/mach-at91/board-sam9-l9260.c @@ -37,10 +37,10 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9260ek.c b/arch/arm/mach-at91/board-sam9260ek.c index 8cd6e679fbe..f0135cd1d85 100644 --- a/arch/arm/mach-at91/board-sam9260ek.c +++ b/arch/arm/mach-at91/board-sam9260ek.c @@ -41,12 +41,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h>  #include <mach/system_rev.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9261ek.c b/arch/arm/mach-at91/board-sam9261ek.c index a9167dd45f9..13ebaa8e410 100644 --- a/arch/arm/mach-at91/board-sam9261ek.c +++ b/arch/arm/mach-at91/board-sam9261ek.c @@ -45,12 +45,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h>  #include <mach/system_rev.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c index b87dbe2be0d..89b9608742a 100644 --- a/arch/arm/mach-at91/board-sam9263ek.c +++ b/arch/arm/mach-at91/board-sam9263ek.c @@ -44,12 +44,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h>  #include <mach/system_rev.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c index 3ab2b86a376..7b512380236 100644 --- a/arch/arm/mach-at91/board-sam9g20ek.c +++ b/arch/arm/mach-at91/board-sam9g20ek.c @@ -43,11 +43,11 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h>  #include <mach/system_rev.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c index 3d48ec15468..e4cc375e3a3 100644 --- a/arch/arm/mach-at91/board-sam9m10g45ek.c +++ b/arch/arm/mach-at91/board-sam9m10g45ek.c @@ -42,12 +42,12 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h>  #include <mach/system_rev.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9rlek.c b/arch/arm/mach-at91/board-sam9rlek.c index fb89ea92e3f..377a1097afa 100644 --- a/arch/arm/mach-at91/board-sam9rlek.c +++ b/arch/arm/mach-at91/board-sam9rlek.c @@ -30,11 +30,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h> + +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-snapper9260.c b/arch/arm/mach-at91/board-snapper9260.c index a4e031a039f..98771500ddb 100644 --- a/arch/arm/mach-at91/board-snapper9260.c +++ b/arch/arm/mach-at91/board-snapper9260.c @@ -32,10 +32,10 @@  #include <asm/mach/arch.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-stamp9g20.c b/arch/arm/mach-at91/board-stamp9g20.c index c3fb31d5116..48a962b61fa 100644 --- a/arch/arm/mach-at91/board-stamp9g20.c +++ b/arch/arm/mach-at91/board-stamp9g20.c @@ -25,10 +25,10 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> +#include "at91_aic.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-usb-a926x.c b/arch/arm/mach-at91/board-usb-a926x.c index 6ea069b5733..c1060f96e58 100644 --- a/arch/arm/mach-at91/board-usb-a926x.c +++ b/arch/arm/mach-at91/board-usb-a926x.c @@ -41,11 +41,11 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91sam9_smc.h> -#include <mach/at91_shdwc.h> +#include "at91_aic.h" +#include "at91_shdwc.h" +#include "board.h"  #include "sam9_smc.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/board-yl-9200.c b/arch/arm/mach-at91/board-yl-9200.c index f162fdfd66e..8673aebcb85 100644 --- a/arch/arm/mach-at91/board-yl-9200.c +++ b/arch/arm/mach-at91/board-yl-9200.c @@ -43,12 +43,12 @@  #include <asm/mach/irq.h>  #include <mach/hardware.h> -#include <mach/board.h> -#include <mach/at91_aic.h>  #include <mach/at91rm9200_mc.h>  #include <mach/at91_ramc.h>  #include <mach/cpu.h> +#include "at91_aic.h" +#include "board.h"  #include "generic.h" diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/board.h index c55a4364ffb..4a234fb2ab3 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/board.h @@ -31,71 +31,24 @@  #ifndef __ASM_ARCH_BOARD_H  #define __ASM_ARCH_BOARD_H -#include <linux/mtd/partitions.h> -#include <linux/device.h> -#include <linux/i2c.h> -#include <linux/leds.h> -#include <linux/spi/spi.h> -#include <linux/usb/atmel_usba_udc.h> -#include <linux/atmel-mci.h> -#include <sound/atmel-ac97c.h> -#include <linux/serial.h> -#include <linux/platform_data/macb.h>  #include <linux/platform_data/atmel.h>   /* USB Device */ -struct at91_udc_data { -	int	vbus_pin;		/* high == host powering us */ -	u8	vbus_active_low;	/* vbus polarity */ -	u8	vbus_polled;		/* Use polling, not interrupt */ -	int	pullup_pin;		/* active == D+ pulled up */ -	u8	pullup_active_low;	/* true == pullup_pin is active low */ -};  extern void __init at91_add_device_udc(struct at91_udc_data *data);   /* USB High Speed Device */  extern void __init at91_add_device_usba(struct usba_platform_data *data);   /* Compact Flash */ -struct at91_cf_data { -	int	irq_pin;		/* I/O IRQ */ -	int	det_pin;		/* Card detect */ -	int	vcc_pin;		/* power switching */ -	int	rst_pin;		/* card reset */ -	u8	chipselect;		/* EBI Chip Select number */ -	u8	flags; -#define AT91_CF_TRUE_IDE	0x01 -#define AT91_IDE_SWAP_A0_A2	0x02 -};  extern void __init at91_add_device_cf(struct at91_cf_data *data);   /* MMC / SD */ -  /* at91_mci platform config */ -struct at91_mmc_data { -	int		det_pin;	/* card detect IRQ */ -	unsigned	slot_b:1;	/* uses Slot B */ -	unsigned	wire4:1;	/* (SD) supports DAT0..DAT3 */ -	int		wp_pin;		/* (SD) writeprotect detect */ -	int		vcc_pin;	/* power switching (high == on) */ -}; -extern void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data); -    /* atmel-mci platform config */  extern void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data);  extern void __init at91_add_device_eth(struct macb_platform_data *data);   /* USB Host */ -#define AT91_MAX_USBH_PORTS	3 -struct at91_usbh_data { -	int		vbus_pin[AT91_MAX_USBH_PORTS];	/* port power-control pin */ -	int             overcurrent_pin[AT91_MAX_USBH_PORTS]; -	u8		ports;				/* number of ports on root hub */ -	u8              overcurrent_supported; -	u8              vbus_pin_active_low[AT91_MAX_USBH_PORTS]; -	u8              overcurrent_status[AT91_MAX_USBH_PORTS]; -	u8              overcurrent_changed[AT91_MAX_USBH_PORTS]; -};  extern void __init at91_add_device_usbh(struct at91_usbh_data *data);  extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data);  extern void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data); @@ -124,13 +77,6 @@ extern void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pin  extern struct platform_device *atmel_default_console_device; -struct atmel_uart_data { -	int			num;		/* port num */ -	short			use_dma_tx;	/* use transmit DMA? */ -	short			use_dma_rx;	/* use receive DMA? */ -	void __iomem		*regs;		/* virt. base address, if any */ -	struct serial_rs485	rs485;		/* rs485 settings */ -};  extern void __init at91_add_device_serial(void);  /* @@ -173,24 +119,13 @@ extern void __init at91_add_device_isi(struct isi_platform_data *data,  		bool use_pck_as_mck);   /* Touchscreen Controller */ -struct at91_tsadcc_data { -	unsigned int    adc_clock; -	u8		pendet_debounce; -	u8		ts_sample_hold_time; -};  extern void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data);  /* CAN */ -struct at91_can_data { -	void (*transceiver_switch)(int on); -};  extern void __init at91_add_device_can(struct at91_can_data *data);   /* LEDs */  extern void __init at91_gpio_leds(struct gpio_led *leds, int nr);  extern void __init at91_pwm_leds(struct gpio_led *leds, int nr); -/* FIXME: this needs a better location, but gets stuff building again */ -extern int at91_suspend_entering_slow_clock(void); -  #endif diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index b62f560e6c7..fc593d615e7 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h @@ -20,6 +20,7 @@ extern void __init at91_init_sram(int bank, unsigned long base,  extern void __init at91rm9200_set_type(int type);  extern void __init at91_initialize(unsigned long main_clock);  extern void __init at91x40_initialize(unsigned long main_clock); +extern void __init at91rm9200_dt_initialize(void);  extern void __init at91_dt_initialize(void);   /* Interrupts */ diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c index be42cf0e74b..c5d7e1e9d75 100644 --- a/arch/arm/mach-at91/gpio.c +++ b/arch/arm/mach-at91/gpio.c @@ -23,8 +23,6 @@  #include <linux/io.h>  #include <linux/irqdomain.h>  #include <linux/of_address.h> -#include <linux/of_irq.h> -#include <linux/of_gpio.h>  #include <asm/mach/irq.h> @@ -33,6 +31,8 @@  #include "generic.h" +#define MAX_NB_GPIO_PER_BANK	32 +  struct at91_gpio_chip {  	struct gpio_chip	chip;  	struct at91_gpio_chip	*next;		/* Bank sharing same clock */ @@ -46,6 +46,7 @@ struct at91_gpio_chip {  #define to_at91_gpio_chip(c) container_of(c, struct at91_gpio_chip, chip) +static int at91_gpiolib_request(struct gpio_chip *chip, unsigned offset);  static void at91_gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip);  static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val);  static int at91_gpiolib_get(struct gpio_chip *chip, unsigned offset); @@ -55,26 +56,27 @@ static int at91_gpiolib_direction_input(struct gpio_chip *chip,  					unsigned offset);  static int at91_gpiolib_to_irq(struct gpio_chip *chip, unsigned offset); -#define AT91_GPIO_CHIP(name, nr_gpio)					\ +#define AT91_GPIO_CHIP(name)						\  	{								\  		.chip = {						\  			.label		  = name,			\ +			.request	  = at91_gpiolib_request,	\  			.direction_input  = at91_gpiolib_direction_input, \  			.direction_output = at91_gpiolib_direction_output, \  			.get		  = at91_gpiolib_get,		\  			.set		  = at91_gpiolib_set,		\  			.dbg_show	  = at91_gpiolib_dbg_show,	\  			.to_irq		  = at91_gpiolib_to_irq,	\ -			.ngpio		  = nr_gpio,			\ +			.ngpio		  = MAX_NB_GPIO_PER_BANK,	\  		},							\  	}  static struct at91_gpio_chip gpio_chip[] = { -	AT91_GPIO_CHIP("pioA", 32), -	AT91_GPIO_CHIP("pioB", 32), -	AT91_GPIO_CHIP("pioC", 32), -	AT91_GPIO_CHIP("pioD", 32), -	AT91_GPIO_CHIP("pioE", 32), +	AT91_GPIO_CHIP("pioA"), +	AT91_GPIO_CHIP("pioB"), +	AT91_GPIO_CHIP("pioC"), +	AT91_GPIO_CHIP("pioD"), +	AT91_GPIO_CHIP("pioE"),  };  static int gpio_banks; @@ -89,7 +91,7 @@ static unsigned long at91_gpio_caps;  static inline void __iomem *pin_to_controller(unsigned pin)  { -	pin /= 32; +	pin /= MAX_NB_GPIO_PER_BANK;  	if (likely(pin < gpio_banks))  		return gpio_chip[pin].regbase; @@ -98,7 +100,7 @@ static inline void __iomem *pin_to_controller(unsigned pin)  static inline unsigned pin_to_mask(unsigned pin)  { -	return 1 << (pin % 32); +	return 1 << (pin % MAX_NB_GPIO_PER_BANK);  } @@ -713,80 +715,6 @@ postcore_initcall(at91_gpio_debugfs_init);   */  static struct lock_class_key gpio_lock_class; -#if defined(CONFIG_OF) -static int at91_gpio_irq_map(struct irq_domain *h, unsigned int virq, -							irq_hw_number_t hw) -{ -	struct at91_gpio_chip	*at91_gpio = h->host_data; - -	irq_set_lockdep_class(virq, &gpio_lock_class); - -	/* -	 * Can use the "simple" and not "edge" handler since it's -	 * shorter, and the AIC handles interrupts sanely. -	 */ -	irq_set_chip_and_handler(virq, &gpio_irqchip, -				 handle_simple_irq); -	set_irq_flags(virq, IRQF_VALID); -	irq_set_chip_data(virq, at91_gpio); - -	return 0; -} - -static struct irq_domain_ops at91_gpio_ops = { -	.map	= at91_gpio_irq_map, -	.xlate	= irq_domain_xlate_twocell, -}; - -int __init at91_gpio_of_irq_setup(struct device_node *node, -				     struct device_node *parent) -{ -	struct at91_gpio_chip	*prev = NULL; -	int			alias_idx = of_alias_get_id(node, "gpio"); -	struct at91_gpio_chip	*at91_gpio = &gpio_chip[alias_idx]; - -	/* Setup proper .irq_set_type function */ -	if (has_pio3()) -		gpio_irqchip.irq_set_type = alt_gpio_irq_type; -	else -		gpio_irqchip.irq_set_type = gpio_irq_type; - -	/* Disable irqs of this PIO controller */ -	__raw_writel(~0, at91_gpio->regbase + PIO_IDR); - -	/* Setup irq domain */ -	at91_gpio->domain = irq_domain_add_linear(node, at91_gpio->chip.ngpio, -						&at91_gpio_ops, at91_gpio); -	if (!at91_gpio->domain) -		panic("at91_gpio.%d: couldn't allocate irq domain (DT).\n", -			at91_gpio->pioc_idx); - -	/* Setup chained handler */ -	if (at91_gpio->pioc_idx) -		prev = &gpio_chip[at91_gpio->pioc_idx - 1]; - -	/* The toplevel handler handles one bank of GPIOs, except -	 * on some SoC it can handles up to three... -	 * We only set up the handler for the first of the list. -	 */ -	if (prev && prev->next == at91_gpio) -		return 0; - -	at91_gpio->pioc_virq = irq_create_mapping(irq_find_host(parent), -							at91_gpio->pioc_hwirq); -	irq_set_chip_data(at91_gpio->pioc_virq, at91_gpio); -	irq_set_chained_handler(at91_gpio->pioc_virq, gpio_irq_handler); - -	return 0; -} -#else -int __init at91_gpio_of_irq_setup(struct device_node *node, -				     struct device_node *parent) -{ -	return -EINVAL; -} -#endif -  /*   * irqdomain initialization: pile up irqdomains on top of AIC range   */ @@ -862,6 +790,16 @@ void __init at91_gpio_irq_setup(void)  }  /* gpiolib support */ +static int at91_gpiolib_request(struct gpio_chip *chip, unsigned offset) +{ +	struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); +	void __iomem *pio = at91_gpio->regbase; +	unsigned mask = 1 << offset; + +	__raw_writel(mask, pio + PIO_PER); +	return 0; +} +  static int at91_gpiolib_direction_input(struct gpio_chip *chip,  					unsigned offset)  { @@ -975,81 +913,11 @@ err:  	return -EINVAL;  } -#ifdef CONFIG_OF_GPIO -static void __init of_at91_gpio_init_one(struct device_node *np) -{ -	int alias_idx; -	struct at91_gpio_chip *at91_gpio; - -	if (!np) -		return; - -	alias_idx = of_alias_get_id(np, "gpio"); -	if (alias_idx >= MAX_GPIO_BANKS) { -		pr_err("at91_gpio, failed alias idx(%d) > MAX_GPIO_BANKS(%d), ignoring.\n", -						alias_idx, MAX_GPIO_BANKS); -		return; -	} - -	at91_gpio = &gpio_chip[alias_idx]; -	at91_gpio->chip.base = alias_idx * at91_gpio->chip.ngpio; - -	at91_gpio->regbase = of_iomap(np, 0); -	if (!at91_gpio->regbase) { -		pr_err("at91_gpio.%d, failed to map registers, ignoring.\n", -								alias_idx); -		return; -	} - -	/* Get the interrupts property */ -	if (of_property_read_u32(np, "interrupts", &at91_gpio->pioc_hwirq)) { -		pr_err("at91_gpio.%d, failed to get interrupts property, ignoring.\n", -								alias_idx); -		goto ioremap_err; -	} - -	/* Get capabilities from compatibility property */ -	if (of_device_is_compatible(np, "atmel,at91sam9x5-gpio")) -		at91_gpio_caps |= AT91_GPIO_CAP_PIO3; - -	/* Setup clock */ -	if (at91_gpio_setup_clk(alias_idx)) -		goto ioremap_err; - -	at91_gpio->chip.of_node = np; -	gpio_banks = max(gpio_banks, alias_idx + 1); -	at91_gpio->pioc_idx = alias_idx; -	return; - -ioremap_err: -	iounmap(at91_gpio->regbase); -} - -static int __init of_at91_gpio_init(void) -{ -	struct device_node *np = NULL; - -	/* -	 * This isn't ideal, but it gets things hooked up until this -	 * driver is converted into a platform_device -	 */ -	for_each_compatible_node(np, NULL, "atmel,at91rm9200-gpio") -		of_at91_gpio_init_one(np); - -	return gpio_banks > 0 ? 0 : -EINVAL; -} -#else -static int __init of_at91_gpio_init(void) -{ -	return -EINVAL; -} -#endif -  static void __init at91_gpio_init_one(int idx, u32 regbase, int pioc_hwirq)  {  	struct at91_gpio_chip *at91_gpio = &gpio_chip[idx]; -	at91_gpio->chip.base = idx * at91_gpio->chip.ngpio; +	at91_gpio->chip.base = idx * MAX_NB_GPIO_PER_BANK;  	at91_gpio->pioc_hwirq = pioc_hwirq;  	at91_gpio->pioc_idx = idx; @@ -1079,11 +947,11 @@ void __init at91_gpio_init(struct at91_gpio_bank *data, int nr_banks)  	BUG_ON(nr_banks > MAX_GPIO_BANKS); -	if (of_at91_gpio_init() < 0) { -		/* No GPIO controller found in device tree */ -		for (i = 0; i < nr_banks; i++) -			at91_gpio_init_one(i, data[i].regbase, data[i].id); -	} +	if (of_have_populated_dt()) +		return; + +	for (i = 0; i < nr_banks; i++) +		at91_gpio_init_one(i, data[i].regbase, data[i].id);  	for (i = 0; i < gpio_banks; i++) {  		at91_gpio = &gpio_chip[i]; diff --git a/arch/arm/mach-at91/include/mach/gsia18s.h b/arch/arm/mach-at91/gsia18s.h index 307c194926f..307c194926f 100644 --- a/arch/arm/mach-at91/include/mach/gsia18s.h +++ b/arch/arm/mach-at91/gsia18s.h diff --git a/arch/arm/mach-at91/include/mach/at91_pit.h b/arch/arm/mach-at91/include/mach/at91_pit.h deleted file mode 100644 index d1f80ad7f4d..00000000000 --- a/arch/arm/mach-at91/include/mach/at91_pit.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * arch/arm/mach-at91/include/mach/at91_pit.h - * - * Copyright (C) 2007 Andrew Victor - * Copyright (C) 2007 Atmel Corporation. - * - * Periodic Interval Timer (PIT) - System peripherals regsters. - * Based on AT91SAM9261 datasheet revision D. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#ifndef AT91_PIT_H -#define AT91_PIT_H - -#define AT91_PIT_MR		0x00			/* Mode Register */ -#define		AT91_PIT_PITIEN		(1 << 25)		/* Timer Interrupt Enable */ -#define		AT91_PIT_PITEN		(1 << 24)		/* Timer Enabled */ -#define		AT91_PIT_PIV		(0xfffff)		/* Periodic Interval Value */ - -#define AT91_PIT_SR		0x04			/* Status Register */ -#define		AT91_PIT_PITS		(1 << 0)		/* Timer Status */ - -#define AT91_PIT_PIVR		0x08			/* Periodic Interval Value Register */ -#define AT91_PIT_PIIR		0x0c			/* Periodic Interval Image Register */ -#define		AT91_PIT_PICNT		(0xfff << 20)		/* Interval Counter */ -#define		AT91_PIT_CPIV		(0xfffff)		/* Inverval Value */ - -#endif diff --git a/arch/arm/mach-at91/include/mach/at91_rtc.h b/arch/arm/mach-at91/include/mach/at91_rtc.h deleted file mode 100644 index da1945e5f71..00000000000 --- a/arch/arm/mach-at91/include/mach/at91_rtc.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * arch/arm/mach-at91/include/mach/at91_rtc.h - * - * Copyright (C) 2005 Ivan Kokshaysky - * Copyright (C) SAN People - * - * Real Time Clock (RTC) - System peripheral registers. - * Based on AT91RM9200 datasheet revision E. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#ifndef AT91_RTC_H -#define AT91_RTC_H - -#define	AT91_RTC_CR		0x00			/* Control Register */ -#define		AT91_RTC_UPDTIM		(1 <<  0)		/* Update Request Time Register */ -#define		AT91_RTC_UPDCAL		(1 <<  1)		/* Update Request Calendar Register */ -#define		AT91_RTC_TIMEVSEL	(3 <<  8)		/* Time Event Selection */ -#define			AT91_RTC_TIMEVSEL_MINUTE	(0 << 8) -#define			AT91_RTC_TIMEVSEL_HOUR		(1 << 8) -#define			AT91_RTC_TIMEVSEL_DAY24		(2 << 8) -#define			AT91_RTC_TIMEVSEL_DAY12		(3 << 8) -#define		AT91_RTC_CALEVSEL	(3 << 16)		/* Calendar Event Selection */ -#define			AT91_RTC_CALEVSEL_WEEK		(0 << 16) -#define			AT91_RTC_CALEVSEL_MONTH		(1 << 16) -#define			AT91_RTC_CALEVSEL_YEAR		(2 << 16) - -#define	AT91_RTC_MR		0x04			/* Mode Register */ -#define			AT91_RTC_HRMOD		(1 <<  0)		/* 12/24 Hour Mode */ - -#define	AT91_RTC_TIMR		0x08			/* Time Register */ -#define		AT91_RTC_SEC		(0x7f <<  0)		/* Current Second */ -#define		AT91_RTC_MIN		(0x7f <<  8)		/* Current Minute */ -#define		AT91_RTC_HOUR		(0x3f << 16)		/* Current Hour */ -#define		AT91_RTC_AMPM		(1    << 22)		/* Ante Meridiem Post Meridiem Indicator */ - -#define	AT91_RTC_CALR		0x0c			/* Calendar Register */ -#define		AT91_RTC_CENT		(0x7f <<  0)		/* Current Century */ -#define		AT91_RTC_YEAR		(0xff <<  8)		/* Current Year */ -#define		AT91_RTC_MONTH		(0x1f << 16)		/* Current Month */ -#define		AT91_RTC_DAY		(7    << 21)		/* Current Day */ -#define		AT91_RTC_DATE		(0x3f << 24)		/* Current Date */ - -#define	AT91_RTC_TIMALR		0x10			/* Time Alarm Register */ -#define		AT91_RTC_SECEN		(1 <<  7)		/* Second Alarm Enable */ -#define		AT91_RTC_MINEN		(1 << 15)		/* Minute Alarm Enable */ -#define		AT91_RTC_HOUREN		(1 << 23)		/* Hour Alarm Enable */ - -#define	AT91_RTC_CALALR		0x14			/* Calendar Alarm Register */ -#define		AT91_RTC_MTHEN		(1 << 23)		/* Month Alarm Enable */ -#define		AT91_RTC_DATEEN		(1 << 31)		/* Date Alarm Enable */ - -#define	AT91_RTC_SR		0x18			/* Status Register */ -#define		AT91_RTC_ACKUPD		(1 <<  0)		/* Acknowledge for Update */ -#define		AT91_RTC_ALARM		(1 <<  1)		/* Alarm Flag */ -#define		AT91_RTC_SECEV		(1 <<  2)		/* Second Event */ -#define		AT91_RTC_TIMEV		(1 <<  3)		/* Time Event */ -#define		AT91_RTC_CALEV		(1 <<  4)		/* Calendar Event */ - -#define	AT91_RTC_SCCR		0x1c			/* Status Clear Command Register */ -#define	AT91_RTC_IER		0x20			/* Interrupt Enable Register */ -#define	AT91_RTC_IDR		0x24			/* Interrupt Disable Register */ -#define	AT91_RTC_IMR		0x28			/* Interrupt Mask Register */ - -#define	AT91_RTC_VER		0x2c			/* Valid Entry Register */ -#define		AT91_RTC_NVTIM		(1 <<  0)		/* Non valid Time */ -#define		AT91_RTC_NVCAL		(1 <<  1)		/* Non valid Calendar */ -#define		AT91_RTC_NVTIMALR	(1 <<  2)		/* Non valid Time Alarm */ -#define		AT91_RTC_NVCALALR	(1 <<  3)		/* Non valid Calendar Alarm */ - -#endif diff --git a/arch/arm/mach-at91/include/mach/at91rm9200_emac.h b/arch/arm/mach-at91/include/mach/at91rm9200_emac.h deleted file mode 100644 index b8260cd8041..00000000000 --- a/arch/arm/mach-at91/include/mach/at91rm9200_emac.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * arch/arm/mach-at91/include/mach/at91rm9200_emac.h - * - * Copyright (C) 2005 Ivan Kokshaysky - * Copyright (C) SAN People - * - * Ethernet MAC registers. - * Based on AT91RM9200 datasheet revision E. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#ifndef AT91RM9200_EMAC_H -#define AT91RM9200_EMAC_H - -#define	AT91_EMAC_CTL		0x00	/* Control Register */ -#define		AT91_EMAC_LB		(1 <<  0)	/* Loopback */ -#define		AT91_EMAC_LBL		(1 <<  1)	/* Loopback Local */ -#define		AT91_EMAC_RE		(1 <<  2)	/* Receive Enable */ -#define		AT91_EMAC_TE		(1 <<  3)	/* Transmit Enable */ -#define		AT91_EMAC_MPE		(1 <<  4)	/* Management Port Enable */ -#define		AT91_EMAC_CSR		(1 <<  5)	/* Clear Statistics Registers */ -#define		AT91_EMAC_INCSTAT	(1 <<  6)	/* Increment Statistics Registers */ -#define		AT91_EMAC_WES		(1 <<  7)	/* Write Enable for Statistics Registers */ -#define		AT91_EMAC_BP		(1 <<  8)	/* Back Pressure */ - -#define	AT91_EMAC_CFG		0x04	/* Configuration Register */ -#define		AT91_EMAC_SPD		(1 <<  0)	/* Speed */ -#define		AT91_EMAC_FD		(1 <<  1)	/* Full Duplex */ -#define		AT91_EMAC_BR		(1 <<  2)	/* Bit Rate */ -#define		AT91_EMAC_CAF		(1 <<  4)	/* Copy All Frames */ -#define		AT91_EMAC_NBC		(1 <<  5)	/* No Broadcast */ -#define		AT91_EMAC_MTI		(1 <<  6)	/* Multicast Hash Enable */ -#define		AT91_EMAC_UNI		(1 <<  7)	/* Unicast Hash Enable */ -#define		AT91_EMAC_BIG		(1 <<  8)	/* Receive 1522 Bytes */ -#define		AT91_EMAC_EAE		(1 <<  9)	/* External Address Match Enable */ -#define		AT91_EMAC_CLK		(3 << 10)	/* MDC Clock Divisor */ -#define		AT91_EMAC_CLK_DIV8		(0 << 10) -#define		AT91_EMAC_CLK_DIV16		(1 << 10) -#define		AT91_EMAC_CLK_DIV32		(2 << 10) -#define		AT91_EMAC_CLK_DIV64		(3 << 10) -#define		AT91_EMAC_RTY		(1 << 12)	/* Retry Test */ -#define		AT91_EMAC_RMII		(1 << 13)	/* Reduce MII (RMII) */ - -#define	AT91_EMAC_SR		0x08	/* Status Register */ -#define		AT91_EMAC_SR_LINK	(1 <<  0)	/* Link */ -#define		AT91_EMAC_SR_MDIO	(1 <<  1)	/* MDIO pin */ -#define		AT91_EMAC_SR_IDLE	(1 <<  2)	/* PHY idle */ - -#define	AT91_EMAC_TAR		0x0c	/* Transmit Address Register */ - -#define	AT91_EMAC_TCR		0x10	/* Transmit Control Register */ -#define		AT91_EMAC_LEN		(0x7ff << 0)	/* Transmit Frame Length */ -#define		AT91_EMAC_NCRC		(1     << 15)	/* No CRC */ - -#define	AT91_EMAC_TSR		0x14	/* Transmit Status Register */ -#define		AT91_EMAC_TSR_OVR	(1 <<  0)	/* Transmit Buffer Overrun */ -#define		AT91_EMAC_TSR_COL	(1 <<  1)	/* Collision Occurred */ -#define		AT91_EMAC_TSR_RLE	(1 <<  2)	/* Retry Limit Exceeded */ -#define		AT91_EMAC_TSR_IDLE	(1 <<  3)	/* Transmitter Idle */ -#define		AT91_EMAC_TSR_BNQ	(1 <<  4)	/* Transmit Buffer not Queued */ -#define		AT91_EMAC_TSR_COMP	(1 <<  5)	/* Transmit Complete */ -#define		AT91_EMAC_TSR_UND	(1 <<  6)	/* Transmit Underrun */ - -#define	AT91_EMAC_RBQP		0x18	/* Receive Buffer Queue Pointer */ - -#define	AT91_EMAC_RSR		0x20	/* Receive Status Register */ -#define		AT91_EMAC_RSR_BNA	(1 <<  0)	/* Buffer Not Available */ -#define		AT91_EMAC_RSR_REC	(1 <<  1)	/* Frame Received */ -#define		AT91_EMAC_RSR_OVR	(1 <<  2)	/* RX Overrun */ - -#define	AT91_EMAC_ISR		0x24	/* Interrupt Status Register */ -#define		AT91_EMAC_DONE		(1 <<  0)	/* Management Done */ -#define		AT91_EMAC_RCOM		(1 <<  1)	/* Receive Complete */ -#define		AT91_EMAC_RBNA		(1 <<  2)	/* Receive Buffer Not Available */ -#define		AT91_EMAC_TOVR		(1 <<  3)	/* Transmit Buffer Overrun */ -#define		AT91_EMAC_TUND		(1 <<  4)	/* Transmit Buffer Underrun */ -#define		AT91_EMAC_RTRY		(1 <<  5)	/* Retry Limit */ -#define		AT91_EMAC_TBRE		(1 <<  6)	/* Transmit Buffer Register Empty */ -#define		AT91_EMAC_TCOM		(1 <<  7)	/* Transmit Complete */ -#define		AT91_EMAC_TIDLE		(1 <<  8)	/* Transmit Idle */ -#define		AT91_EMAC_LINK		(1 <<  9)	/* Link */ -#define		AT91_EMAC_ROVR		(1 << 10)	/* RX Overrun */ -#define		AT91_EMAC_ABT		(1 << 11)	/* Abort */ - -#define	AT91_EMAC_IER		0x28	/* Interrupt Enable Register */ -#define	AT91_EMAC_IDR		0x2c	/* Interrupt Disable Register */ -#define	AT91_EMAC_IMR		0x30	/* Interrupt Mask Register */ - -#define	AT91_EMAC_MAN		0x34	/* PHY Maintenance Register */ -#define		AT91_EMAC_DATA		(0xffff << 0)	/* MDIO Data */ -#define		AT91_EMAC_REGA		(0x1f	<< 18)	/* MDIO Register */ -#define		AT91_EMAC_PHYA		(0x1f	<< 23)	/* MDIO PHY Address */ -#define		AT91_EMAC_RW		(3	<< 28)	/* Read/Write operation */ -#define			AT91_EMAC_RW_W		(1 << 28) -#define			AT91_EMAC_RW_R		(2 << 28) -#define		AT91_EMAC_MAN_802_3	0x40020000	/* IEEE 802.3 value */ - -/* - * Statistics Registers. - */ -#define AT91_EMAC_FRA		0x40	/* Frames Transmitted OK */ -#define AT91_EMAC_SCOL		0x44	/* Single Collision Frame */ -#define AT91_EMAC_MCOL		0x48	/* Multiple Collision Frame */ -#define AT91_EMAC_OK		0x4c	/* Frames Received OK */ -#define AT91_EMAC_SEQE		0x50	/* Frame Check Sequence Error */ -#define AT91_EMAC_ALE		0x54	/* Alignmemt Error */ -#define AT91_EMAC_DTE		0x58	/* Deffered Transmission Frame */ -#define AT91_EMAC_LCOL		0x5c	/* Late Collision */ -#define AT91_EMAC_ECOL		0x60	/* Excessive Collision */ -#define AT91_EMAC_TUE		0x64	/* Transmit Underrun Error */ -#define AT91_EMAC_CSE		0x68	/* Carrier Sense Error */ -#define AT91_EMAC_DRFC		0x6c	/* Discard RX Frame */ -#define AT91_EMAC_ROV		0x70	/* Receive Overrun */ -#define AT91_EMAC_CDE		0x74	/* Code Error */ -#define AT91_EMAC_ELR		0x78	/* Excessive Length Error */ -#define AT91_EMAC_RJB		0x7c	/* Receive Jabber */ -#define AT91_EMAC_USF		0x80	/* Undersize Frame */ -#define AT91_EMAC_SQEE		0x84	/* SQE Test Error */ - -/* - * Address Registers. - */ -#define AT91_EMAC_HSL		0x90	/* Hash Address Low [31:0] */ -#define AT91_EMAC_HSH		0x94	/* Hash Address High [63:32] */ -#define AT91_EMAC_SA1L		0x98	/* Specific Address 1 Low, bytes 0-3 */ -#define AT91_EMAC_SA1H		0x9c	/* Specific Address 1 High, bytes 4-5 */ -#define AT91_EMAC_SA2L		0xa0	/* Specific Address 2 Low, bytes 0-3 */ -#define AT91_EMAC_SA2H		0xa4	/* Specific Address 2 High, bytes 4-5 */ -#define AT91_EMAC_SA3L		0xa8	/* Specific Address 3 Low, bytes 0-3 */ -#define AT91_EMAC_SA3H		0xac	/* Specific Address 3 High, bytes 4-5 */ -#define AT91_EMAC_SA4L		0xb0	/* Specific Address 4 Low, bytes 0-3 */ -#define AT91_EMAC_SA4H		0xb4	/* Specific Address 4 High, bytes 4-5 */ - -#endif diff --git a/arch/arm/mach-at91/include/mach/hardware.h b/arch/arm/mach-at91/include/mach/hardware.h index 711a7892d33..a832e070761 100644 --- a/arch/arm/mach-at91/include/mach/hardware.h +++ b/arch/arm/mach-at91/include/mach/hardware.h @@ -90,9 +90,6 @@  #define AT91_SRAM_MAX		SZ_1M  #define AT91_VIRT_BASE		(AT91_IO_VIRT_BASE - AT91_SRAM_MAX) -/* Serial ports */ -#define ATMEL_MAX_UART		7		/* 6 USART3's and one DBGU port (SAM9260) */ -  /* External Memory Map */  #define AT91_CHIPSELECT_0	0x10000000  #define AT91_CHIPSELECT_1	0x20000000 diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c index febc2ee901a..8e210262aee 100644 --- a/arch/arm/mach-at91/irq.c +++ b/arch/arm/mach-at91/irq.c @@ -42,7 +42,7 @@  #include <asm/mach/irq.h>  #include <asm/mach/map.h> -#include <mach/at91_aic.h> +#include "at91_aic.h"  void __iomem *at91_aic_base;  static struct irq_domain *at91_aic_domain; diff --git a/arch/arm/mach-at91/leds.c b/arch/arm/mach-at91/leds.c index 1b1e62b5f41..3e22978b554 100644 --- a/arch/arm/mach-at91/leds.c +++ b/arch/arm/mach-at91/leds.c @@ -15,7 +15,7 @@  #include <linux/init.h>  #include <linux/platform_device.h> -#include <mach/board.h> +#include "board.h"  /* ------------------------------------------------------------------------- */ diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 5315f05896e..adb6db888a1 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c @@ -25,10 +25,10 @@  #include <asm/mach/time.h>  #include <asm/mach/irq.h> -#include <mach/at91_aic.h>  #include <mach/at91_pmc.h>  #include <mach/cpu.h> +#include "at91_aic.h"  #include "generic.h"  #include "pm.h" @@ -36,8 +36,8 @@   * Show the reason for the previous system reset.   */ -#include <mach/at91_rstc.h> -#include <mach/at91_shdwc.h> +#include "at91_rstc.h" +#include "at91_shdwc.h"  static void __init show_reset_status(void)  { diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c index 0b32c81730a..9ee866ce047 100644 --- a/arch/arm/mach-at91/setup.c +++ b/arch/arm/mach-at91/setup.c @@ -10,6 +10,7 @@  #include <linux/mm.h>  #include <linux/pm.h>  #include <linux/of_address.h> +#include <linux/pinctrl/machine.h>  #include <asm/system_misc.h>  #include <asm/mach/map.h> @@ -18,8 +19,8 @@  #include <mach/cpu.h>  #include <mach/at91_dbgu.h>  #include <mach/at91_pmc.h> -#include <mach/at91_shdwc.h> +#include "at91_shdwc.h"  #include "soc.h"  #include "generic.h" @@ -338,6 +339,7 @@ static void at91_dt_rstc(void)  }  static struct of_device_id ramc_ids[] = { +	{ .compatible = "atmel,at91rm9200-sdramc" },  	{ .compatible = "atmel,at91sam9260-sdramc" },  	{ .compatible = "atmel,at91sam9g45-ddramc" },  	{ /*sentinel*/ } @@ -436,6 +438,19 @@ end:  	of_node_put(np);  } +void __init at91rm9200_dt_initialize(void) +{ +	at91_dt_ramc(); + +	/* Init clock subsystem */ +	at91_dt_clock_init(); + +	/* Register the processor-specific clocks */ +	at91_boot_soc.register_clocks(); + +	at91_boot_soc.init(); +} +  void __init at91_dt_initialize(void)  {  	at91_dt_rstc(); @@ -448,7 +463,8 @@ void __init at91_dt_initialize(void)  	/* Register the processor-specific clocks */  	at91_boot_soc.register_clocks(); -	at91_boot_soc.init(); +	if (at91_boot_soc.init) +		at91_boot_soc.init();  }  #endif @@ -463,4 +479,6 @@ void __init at91_initialize(unsigned long main_clock)  	at91_boot_soc.register_clocks();  	at91_boot_soc.init(); + +	pinctrl_provide_dummies();  } diff --git a/arch/arm/mach-at91/soc.h b/arch/arm/mach-at91/soc.h index a9cfeb15371..9c6d3d4f9a2 100644 --- a/arch/arm/mach-at91/soc.h +++ b/arch/arm/mach-at91/soc.h @@ -5,6 +5,7 @@   */  struct at91_init_soc { +	int builtin;  	unsigned int *default_irq_priority;  	void (*map_io)(void);  	void (*ioremap_registers)(void); @@ -22,9 +23,18 @@ extern struct at91_init_soc at91sam9rl_soc;  extern struct at91_init_soc at91sam9x5_soc;  extern struct at91_init_soc at91sam9n12_soc; +#define AT91_SOC_START(_name)				\ +struct at91_init_soc __initdata at91##_name##_soc	\ + __used							\ +						= {	\ +	.builtin	= 1,				\ + +#define AT91_SOC_END					\ +}; +  static inline int at91_soc_is_enabled(void)  { -	return at91_boot_soc.init != NULL; +	return at91_boot_soc.builtin;  }  #if !defined(CONFIG_SOC_AT91RM9200) diff --git a/arch/arm/mach-at91/include/mach/stamp9g20.h b/arch/arm/mach-at91/stamp9g20.h index f62c0abca4b..f62c0abca4b 100644 --- a/arch/arm/mach-at91/include/mach/stamp9g20.h +++ b/arch/arm/mach-at91/stamp9g20.h diff --git a/arch/arm/mach-bcm/Kconfig b/arch/arm/mach-bcm/Kconfig new file mode 100644 index 00000000000..48705c10a0f --- /dev/null +++ b/arch/arm/mach-bcm/Kconfig @@ -0,0 +1,19 @@ +config ARCH_BCM +	bool "Broadcom SoC" if ARCH_MULTI_V7 +	depends on MMU +	select ARCH_REQUIRE_GPIOLIB +	select ARM_ERRATA_754322 +	select ARM_ERRATA_764369 if SMP +	select ARM_GIC +	select CPU_V7 +	select GENERIC_CLOCKEVENTS +	select GENERIC_GPIO +	select GENERIC_TIME +	select GPIO_BCM +	select SPARSE_IRQ +	select TICK_ONESHOT +	help +	  This enables support for system based on Broadcom SoCs. +	  It currently supports the 'BCM281XX' family, which includes +	  BCM11130, BCM11140, BCM11351, BCM28145 and +	  BCM28155 variants. diff --git a/arch/arm/mach-bcm/Makefile b/arch/arm/mach-bcm/Makefile new file mode 100644 index 00000000000..bbf412261e5 --- /dev/null +++ b/arch/arm/mach-bcm/Makefile @@ -0,0 +1,13 @@ +# +# Copyright (C) 2012 Broadcom Corporation +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation version 2. +# +# This program is distributed "as is" WITHOUT ANY WARRANTY of any +# kind, whether express or implied; without even the implied warranty +# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. + +obj-$(CONFIG_ARCH_BCM) := board_bcm.o diff --git a/arch/arm/mach-bcm/board_bcm.c b/arch/arm/mach-bcm/board_bcm.c new file mode 100644 index 00000000000..3a62f1b1cab --- /dev/null +++ b/arch/arm/mach-bcm/board_bcm.c @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2012 Broadcom Corporation + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#include <linux/of_irq.h> +#include <linux/of_platform.h> +#include <linux/init.h> +#include <linux/device.h> +#include <linux/platform_device.h> + +#include <asm/mach/arch.h> +#include <asm/hardware/gic.h> + +#include <asm/mach/time.h> + +static const struct of_device_id irq_match[] = { +	{.compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, +	{} +}; + +static void timer_init(void) +{ +} + +static struct sys_timer timer = { +	.init = timer_init, +}; + +static void __init init_irq(void) +{ +	of_irq_init(irq_match); +} + +static void __init board_init(void) +{ +	of_platform_populate(NULL, of_default_bus_match_table, NULL, +		&platform_bus); +} + +static const char * const bcm11351_dt_compat[] = { "bcm,bcm11351", NULL, }; + +DT_MACHINE_START(BCM11351_DT, "Broadcom Application Processor") +	.init_irq = init_irq, +	.timer = &timer, +	.init_machine = board_init, +	.dt_compat = bcm11351_dt_compat, +	.handle_irq = gic_handle_irq, +MACHINE_END diff --git a/arch/arm/mach-bcm2835/bcm2835.c b/arch/arm/mach-bcm2835/bcm2835.c index 53e3842c933..f0d739f4b7a 100644 --- a/arch/arm/mach-bcm2835/bcm2835.c +++ b/arch/arm/mach-bcm2835/bcm2835.c @@ -12,8 +12,10 @@   * GNU General Public License for more details.   */ +#include <linux/delay.h>  #include <linux/init.h>  #include <linux/irqchip/bcm2835.h> +#include <linux/of_address.h>  #include <linux/of_platform.h>  #include <linux/bcm2835_timer.h>  #include <linux/clk/bcm2835.h> @@ -23,6 +25,48 @@  #include <mach/bcm2835_soc.h> +#define PM_RSTC				0x1c +#define PM_WDOG				0x24 + +#define PM_PASSWORD			0x5a000000 +#define PM_RSTC_WRCFG_MASK		0x00000030 +#define PM_RSTC_WRCFG_FULL_RESET	0x00000020 + +static void __iomem *wdt_regs; + +/* + * The machine restart method can be called from an atomic context so we won't + * be able to ioremap the regs then. + */ +static void bcm2835_setup_restart(void) +{ +	struct device_node *np = of_find_compatible_node(NULL, NULL, +						"brcm,bcm2835-pm-wdt"); +	if (WARN(!np, "unable to setup watchdog restart")) +		return; + +	wdt_regs = of_iomap(np, 0); +	WARN(!wdt_regs, "failed to remap watchdog regs"); +} + +static void bcm2835_restart(char mode, const char *cmd) +{ +	u32 val; + +	if (!wdt_regs) +		return; + +	/* use a timeout of 10 ticks (~150us) */ +	writel_relaxed(10 | PM_PASSWORD, wdt_regs + PM_WDOG); +	val = readl_relaxed(wdt_regs + PM_RSTC); +	val &= ~PM_RSTC_WRCFG_MASK; +	val |= PM_PASSWORD | PM_RSTC_WRCFG_FULL_RESET; +	writel_relaxed(val, wdt_regs + PM_RSTC); + +	/* No sleeping, possibly atomic. */ +	mdelay(1); +} +  static struct map_desc io_map __initdata = {  	.virtual = BCM2835_PERIPH_VIRT,  	.pfn = __phys_to_pfn(BCM2835_PERIPH_PHYS), @@ -39,6 +83,7 @@ static void __init bcm2835_init(void)  {  	int ret; +	bcm2835_setup_restart();  	bcm2835_init_clocks();  	ret = of_platform_populate(NULL, of_default_bus_match_table, NULL, @@ -60,5 +105,6 @@ DT_MACHINE_START(BCM2835, "BCM2835")  	.handle_irq = bcm2835_handle_irq,  	.init_machine = bcm2835_init,  	.timer = &bcm2835_timer, +	.restart = bcm2835_restart,  	.dt_compat = bcm2835_compat  MACHINE_END diff --git a/arch/arm/mach-bcm2835/include/mach/gpio.h b/arch/arm/mach-bcm2835/include/mach/gpio.h new file mode 100644 index 00000000000..40a8c178f10 --- /dev/null +++ b/arch/arm/mach-bcm2835/include/mach/gpio.h @@ -0,0 +1 @@ +/* empty */ diff --git a/arch/arm/mach-clps711x/Kconfig b/arch/arm/mach-clps711x/Kconfig index 263242da2cb..2d00165e85e 100644 --- a/arch/arm/mach-clps711x/Kconfig +++ b/arch/arm/mach-clps711x/Kconfig @@ -10,7 +10,6 @@ config ARCH_AUTCPU12  config ARCH_CDB89712  	bool "CDB89712" -	select ISA  	help  	  This is an evaluation board from Cirrus for the CS89712 processor.  	  The board includes 2 serial ports, Ethernet, IRDA, and expansion @@ -25,7 +24,6 @@ config ARCH_EDB7211  	bool "EDB7211"  	select ARCH_SELECT_MEMORY_MODEL  	select ARCH_SPARSEMEM_ENABLE -	select ISA  	help  	  Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211  	  evaluation board. diff --git a/arch/arm/mach-clps711x/Makefile b/arch/arm/mach-clps711x/Makefile index 6da6940b365..992995af666 100644 --- a/arch/arm/mach-clps711x/Makefile +++ b/arch/arm/mach-clps711x/Makefile @@ -9,9 +9,9 @@ obj-m			:=  obj-n			:=  obj-			:= -obj-$(CONFIG_ARCH_AUTCPU12) += autcpu12.o -obj-$(CONFIG_ARCH_CDB89712) += cdb89712.o -obj-$(CONFIG_ARCH_CLEP7312) += clep7312.o -obj-$(CONFIG_ARCH_EDB7211)  += edb7211-arch.o edb7211-mm.o -obj-$(CONFIG_ARCH_FORTUNET) += fortunet.o -obj-$(CONFIG_ARCH_P720T)    += p720t.o +obj-$(CONFIG_ARCH_AUTCPU12)	+= board-autcpu12.o +obj-$(CONFIG_ARCH_CDB89712)	+= board-cdb89712.o +obj-$(CONFIG_ARCH_CLEP7312)	+= board-clep7312.o +obj-$(CONFIG_ARCH_EDB7211)	+= board-edb7211.o +obj-$(CONFIG_ARCH_FORTUNET)	+= board-fortunet.o +obj-$(CONFIG_ARCH_P720T)	+= board-p720t.o diff --git a/arch/arm/mach-clps711x/Makefile.boot b/arch/arm/mach-clps711x/Makefile.boot index 9398e859b5a..eba77d35a61 100644 --- a/arch/arm/mach-clps711x/Makefile.boot +++ b/arch/arm/mach-clps711x/Makefile.boot @@ -1,5 +1,4 @@  # The standard locations for stuff on CLPS711x type processors -   zreladdr-y				+= 0xc0028000  params_phys-y				:= 0xc0000100  # Should probably have some agreement on these...  initrd_phys-$(CONFIG_ARCH_P720T)	:= 0xc0400000 diff --git a/arch/arm/mach-clps711x/autcpu12.c b/arch/arm/mach-clps711x/autcpu12.c deleted file mode 100644 index 32871918bb6..00000000000 --- a/arch/arm/mach-clps711x/autcpu12.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - *  linux/arch/arm/mach-clps711x/autcpu12.c - * - * (c) 2001 Thomas Gleixner, autronix automation <gleixner@autronix.de> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/types.h> -#include <linux/string.h> -#include <linux/mm.h> -#include <linux/io.h> -#include <linux/ioport.h> -#include <linux/platform_device.h> - -#include <mach/hardware.h> -#include <asm/sizes.h> -#include <asm/setup.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> -#include <asm/pgtable.h> -#include <asm/page.h> - -#include <asm/mach/map.h> -#include <mach/autcpu12.h> - -#include "common.h" - -/* - * The on-chip registers are given a size of 1MB so that a section can - * be used to map them; this saves a page table.  This is the place to - * add mappings for ROM, expansion memory, PCMCIA, etc.  (if static - * mappings are chosen for those areas). - * -*/ - -static struct map_desc autcpu12_io_desc[] __initdata = { -	/* memory-mapped extra io and CS8900A Ethernet chip */ - 	/* ethernet chip */ - 	{ -		.virtual	= AUTCPU12_VIRT_CS8900A, -		.pfn		= __phys_to_pfn(AUTCPU12_PHYS_CS8900A), -		.length		= SZ_1M, -		.type		= MT_DEVICE -	} -}; - -void __init autcpu12_map_io(void) -{ -        clps711x_map_io(); -        iotable_init(autcpu12_io_desc, ARRAY_SIZE(autcpu12_io_desc)); -} - -static struct resource autcpu12_nvram_resource[] __initdata = { -	DEFINE_RES_MEM_NAMED(AUTCPU12_PHYS_NVRAM, SZ_128K, "SRAM"), -}; - -static struct platform_device autcpu12_nvram_pdev __initdata = { -	.name		= "autcpu12_nvram", -	.id		= -1, -	.resource	= autcpu12_nvram_resource, -	.num_resources	= ARRAY_SIZE(autcpu12_nvram_resource), -}; - -static void __init autcpu12_init(void) -{ -	platform_device_register(&autcpu12_nvram_pdev); -} - -MACHINE_START(AUTCPU12, "autronix autcpu12") -	/* Maintainer: Thomas Gleixner */ -	.atag_offset	= 0x20000, -	.init_machine	= autcpu12_init, -	.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/board-autcpu12.c b/arch/arm/mach-clps711x/board-autcpu12.c new file mode 100644 index 00000000000..3fbf43f7258 --- /dev/null +++ b/arch/arm/mach-clps711x/board-autcpu12.c @@ -0,0 +1,179 @@ +/* + *  linux/arch/arm/mach-clps711x/autcpu12.c + * + * (c) 2001 Thomas Gleixner, autronix automation <gleixner@autronix.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/types.h> +#include <linux/string.h> +#include <linux/mm.h> +#include <linux/io.h> +#include <linux/gpio.h> +#include <linux/ioport.h> +#include <linux/interrupt.h> +#include <linux/mtd/partitions.h> +#include <linux/mtd/nand-gpio.h> +#include <linux/platform_device.h> +#include <linux/basic_mmio_gpio.h> + +#include <mach/hardware.h> +#include <asm/sizes.h> +#include <asm/setup.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <asm/pgtable.h> +#include <asm/page.h> + +#include <asm/mach/map.h> +#include <mach/autcpu12.h> + +#include "common.h" + +#define AUTCPU12_CS8900_BASE	(CS2_PHYS_BASE + 0x300) +#define AUTCPU12_CS8900_IRQ	(IRQ_EINT3) + +#define AUTCPU12_SMC_BASE	(CS1_PHYS_BASE + 0x06000000) +#define AUTCPU12_SMC_SEL_BASE	(AUTCPU12_SMC_BASE + 0x10) + +#define AUTCPU12_MMGPIO_BASE	(CLPS711X_NR_GPIO) +#define AUTCPU12_SMC_NCE	(AUTCPU12_MMGPIO_BASE + 0) /* Bit 0 */ +#define AUTCPU12_SMC_RDY	CLPS711X_GPIO(1, 2) +#define AUTCPU12_SMC_ALE	CLPS711X_GPIO(1, 3) +#define AUTCPU12_SMC_CLE	CLPS711X_GPIO(1, 3) + +static struct resource autcpu12_cs8900_resource[] __initdata = { +	DEFINE_RES_MEM(AUTCPU12_CS8900_BASE, SZ_1K), +	DEFINE_RES_IRQ(AUTCPU12_CS8900_IRQ), +}; + +static struct resource autcpu12_nvram_resource[] __initdata = { +	DEFINE_RES_MEM_NAMED(AUTCPU12_PHYS_NVRAM, SZ_128K, "SRAM"), +}; + +static struct platform_device autcpu12_nvram_pdev __initdata = { +	.name		= "autcpu12_nvram", +	.id		= -1, +	.resource	= autcpu12_nvram_resource, +	.num_resources	= ARRAY_SIZE(autcpu12_nvram_resource), +}; + +static struct resource autcpu12_nand_resource[] __initdata = { +	DEFINE_RES_MEM(AUTCPU12_SMC_BASE, SZ_16), +}; + +static struct mtd_partition autcpu12_nand_parts[] __initdata = { +	{ +		.name	= "Flash partition 1", +		.offset	= 0, +		.size	= SZ_8M, +	}, +	{ +		.name	= "Flash partition 2", +		.offset	= MTDPART_OFS_APPEND, +		.size	= MTDPART_SIZ_FULL, +	}, +}; + +static void __init autcpu12_adjust_parts(struct gpio_nand_platdata *pdata, +					 size_t sz) +{ +	switch (sz) { +	case SZ_16M: +	case SZ_32M: +		break; +	case SZ_64M: +	case SZ_128M: +		pdata->parts[0].size = SZ_16M; +		break; +	default: +		pr_warn("Unsupported SmartMedia device size %u\n", sz); +		break; +	} +} + +static struct gpio_nand_platdata autcpu12_nand_pdata __initdata = { +	.gpio_rdy	= AUTCPU12_SMC_RDY, +	.gpio_nce	= AUTCPU12_SMC_NCE, +	.gpio_ale	= AUTCPU12_SMC_ALE, +	.gpio_cle	= AUTCPU12_SMC_CLE, +	.gpio_nwp	= -1, +	.chip_delay	= 20, +	.parts		= autcpu12_nand_parts, +	.num_parts	= ARRAY_SIZE(autcpu12_nand_parts), +	.adjust_parts	= autcpu12_adjust_parts, +}; + +static struct platform_device autcpu12_nand_pdev __initdata = { +	.name		= "gpio-nand", +	.id		= -1, +	.resource	= autcpu12_nand_resource, +	.num_resources	= ARRAY_SIZE(autcpu12_nand_resource), +	.dev		= { +		.platform_data = &autcpu12_nand_pdata, +	}, +}; + +static struct resource autcpu12_mmgpio_resource[] __initdata = { +	DEFINE_RES_MEM_NAMED(AUTCPU12_SMC_SEL_BASE, SZ_1, "dat"), +}; + +static struct bgpio_pdata autcpu12_mmgpio_pdata __initdata = { +	.base	= AUTCPU12_MMGPIO_BASE, +	.ngpio	= 8, +}; + +static struct platform_device autcpu12_mmgpio_pdev __initdata = { +	.name		= "basic-mmio-gpio", +	.id		= -1, +	.resource	= autcpu12_mmgpio_resource, +	.num_resources	= ARRAY_SIZE(autcpu12_mmgpio_resource), +	.dev		= { +		.platform_data = &autcpu12_mmgpio_pdata, +	}, +}; + +static void __init autcpu12_init(void) +{ +	platform_device_register_simple("video-clps711x", 0, NULL, 0); +	platform_device_register_simple("cs89x0", 0, autcpu12_cs8900_resource, +					ARRAY_SIZE(autcpu12_cs8900_resource)); +	platform_device_register(&autcpu12_mmgpio_pdev); +	platform_device_register(&autcpu12_nvram_pdev); +} + +static void __init autcpu12_init_late(void) +{ +	if (IS_ENABLED(MTD_NAND_GPIO) && IS_ENABLED(GPIO_GENERIC_PLATFORM)) { +		/* We are need both drivers to handle NAND */ +		platform_device_register(&autcpu12_nand_pdev); +	} +} + +MACHINE_START(AUTCPU12, "autronix autcpu12") +	/* Maintainer: Thomas Gleixner */ +	.atag_offset	= 0x20000, +	.nr_irqs	= CLPS711X_NR_IRQS, +	.map_io		= clps711x_map_io, +	.init_irq	= clps711x_init_irq, +	.timer		= &clps711x_timer, +	.init_machine	= autcpu12_init, +	.init_late	= autcpu12_init_late, +	.handle_irq	= clps711x_handle_irq, +	.restart	= clps711x_restart, +MACHINE_END + diff --git a/arch/arm/mach-clps711x/board-cdb89712.c b/arch/arm/mach-clps711x/board-cdb89712.c new file mode 100644 index 00000000000..60900ddf97c --- /dev/null +++ b/arch/arm/mach-clps711x/board-cdb89712.c @@ -0,0 +1,147 @@ +/* + *  linux/arch/arm/mach-clps711x/cdb89712.c + * + *  Copyright (C) 2000-2001 Deep Blue Solutions Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/types.h> +#include <linux/string.h> +#include <linux/mm.h> +#include <linux/io.h> +#include <linux/interrupt.h> +#include <linux/platform_device.h> + +#include <linux/mtd/physmap.h> +#include <linux/mtd/plat-ram.h> +#include <linux/mtd/partitions.h> + +#include <mach/hardware.h> +#include <asm/pgtable.h> +#include <asm/page.h> +#include <asm/setup.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> + +#include "common.h" + +#define CDB89712_CS8900_BASE	(CS2_PHYS_BASE + 0x300) +#define CDB89712_CS8900_IRQ	(IRQ_EINT3) + +static struct resource cdb89712_cs8900_resource[] __initdata = { +	DEFINE_RES_MEM(CDB89712_CS8900_BASE, SZ_1K), +	DEFINE_RES_IRQ(CDB89712_CS8900_IRQ), +}; + +static struct mtd_partition cdb89712_flash_partitions[] __initdata = { +	{ +		.name	= "Flash", +		.offset	= 0, +		.size	= MTDPART_SIZ_FULL, +	}, +}; + +static struct physmap_flash_data cdb89712_flash_pdata __initdata = { +	.width		= 4, +	.probe_type	= "map_rom", +	.parts		= cdb89712_flash_partitions, +	.nr_parts	= ARRAY_SIZE(cdb89712_flash_partitions), +}; + +static struct resource cdb89712_flash_resources[] __initdata = { +	DEFINE_RES_MEM(CS0_PHYS_BASE, SZ_8M), +}; + +static struct platform_device cdb89712_flash_pdev __initdata = { +	.name		= "physmap-flash", +	.id		= 0, +	.resource	= cdb89712_flash_resources, +	.num_resources	= ARRAY_SIZE(cdb89712_flash_resources), +	.dev	= { +		.platform_data	= &cdb89712_flash_pdata, +	}, +}; + +static struct mtd_partition cdb89712_bootrom_partitions[] __initdata = { +	{ +		.name	= "BootROM", +		.offset	= 0, +		.size	= MTDPART_SIZ_FULL, +	}, +}; + +static struct physmap_flash_data cdb89712_bootrom_pdata __initdata = { +	.width		= 4, +	.probe_type	= "map_rom", +	.parts		= cdb89712_bootrom_partitions, +	.nr_parts	= ARRAY_SIZE(cdb89712_bootrom_partitions), +}; + +static struct resource cdb89712_bootrom_resources[] __initdata = { +	DEFINE_RES_NAMED(CS7_PHYS_BASE, SZ_128, "BOOTROM", IORESOURCE_MEM | +			 IORESOURCE_CACHEABLE | IORESOURCE_READONLY), +}; + +static struct platform_device cdb89712_bootrom_pdev __initdata = { +	.name		= "physmap-flash", +	.id		= 1, +	.resource	= cdb89712_bootrom_resources, +	.num_resources	= ARRAY_SIZE(cdb89712_bootrom_resources), +	.dev	= { +		.platform_data	= &cdb89712_bootrom_pdata, +	}, +}; + +static struct platdata_mtd_ram cdb89712_sram_pdata __initdata = { +	.bankwidth	= 4, +}; + +static struct resource cdb89712_sram_resources[] __initdata = { +	DEFINE_RES_MEM(CLPS711X_SRAM_BASE, CLPS711X_SRAM_SIZE), +}; + +static struct platform_device cdb89712_sram_pdev __initdata = { +	.name		= "mtd-ram", +	.id		= 0, +	.resource	= cdb89712_sram_resources, +	.num_resources	= ARRAY_SIZE(cdb89712_sram_resources), +	.dev	= { +		.platform_data	= &cdb89712_sram_pdata, +	}, +}; + +static void __init cdb89712_init(void) +{ +	platform_device_register(&cdb89712_flash_pdev); +	platform_device_register(&cdb89712_bootrom_pdev); +	platform_device_register(&cdb89712_sram_pdev); +	platform_device_register_simple("cs89x0", 0, cdb89712_cs8900_resource, +					ARRAY_SIZE(cdb89712_cs8900_resource)); +} + +MACHINE_START(CDB89712, "Cirrus-CDB89712") +	/* Maintainer: Ray Lehtiniemi */ +	.atag_offset	= 0x100, +	.nr_irqs	= CLPS711X_NR_IRQS, +	.map_io		= clps711x_map_io, +	.init_irq	= clps711x_init_irq, +	.timer		= &clps711x_timer, +	.init_machine	= cdb89712_init, +	.handle_irq	= clps711x_handle_irq, +	.restart	= clps711x_restart, +MACHINE_END diff --git a/arch/arm/mach-clps711x/clep7312.c b/arch/arm/mach-clps711x/board-clep7312.c index dbc7842639d..0b32a487183 100644 --- a/arch/arm/mach-clps711x/clep7312.c +++ b/arch/arm/mach-clps711x/board-clep7312.c @@ -33,14 +33,14 @@ fixup_clep7312(struct tag *tags, char **cmdline, struct meminfo *mi)  	mi->bank[0].size = 0x01000000;  } -  MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312")  	/* Maintainer: Nobody */  	.atag_offset	= 0x0100, +	.nr_irqs	= CLPS711X_NR_IRQS,  	.fixup		= fixup_clep7312,  	.map_io		= clps711x_map_io,  	.init_irq	= clps711x_init_irq,  	.timer		= &clps711x_timer, +	.handle_irq	= clps711x_handle_irq,  	.restart	= clps711x_restart,  MACHINE_END - diff --git a/arch/arm/mach-clps711x/board-edb7211.c b/arch/arm/mach-clps711x/board-edb7211.c new file mode 100644 index 00000000000..71aa5cf2c0d --- /dev/null +++ b/arch/arm/mach-clps711x/board-edb7211.c @@ -0,0 +1,180 @@ +/* + *  Copyright (C) 2000, 2001 Blue Mug, Inc.  All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include <linux/init.h> +#include <linux/gpio.h> +#include <linux/delay.h> +#include <linux/memblock.h> +#include <linux/types.h> +#include <linux/interrupt.h> +#include <linux/backlight.h> +#include <linux/platform_device.h> + +#include <linux/mtd/physmap.h> +#include <linux/mtd/partitions.h> + +#include <asm/setup.h> +#include <asm/mach/map.h> +#include <asm/mach/arch.h> +#include <asm/mach-types.h> + +#include <video/platform_lcd.h> + +#include <mach/hardware.h> + +#include "common.h" + +#define VIDEORAM_SIZE		SZ_128K + +#define EDB7211_LCD_DC_DC_EN	CLPS711X_GPIO(3, 1) +#define EDB7211_LCDEN		CLPS711X_GPIO(3, 2) +#define EDB7211_LCDBL		CLPS711X_GPIO(3, 3) + +#define EDB7211_FLASH0_BASE	(CS0_PHYS_BASE) +#define EDB7211_FLASH1_BASE	(CS1_PHYS_BASE) +#define EDB7211_CS8900_BASE	(CS2_PHYS_BASE + 0x300) +#define EDB7211_CS8900_IRQ	(IRQ_EINT3) + +static struct resource edb7211_cs8900_resource[] __initdata = { +	DEFINE_RES_MEM(EDB7211_CS8900_BASE, SZ_1K), +	DEFINE_RES_IRQ(EDB7211_CS8900_IRQ), +}; + +static struct mtd_partition edb7211_flash_partitions[] __initdata = { +	{ +		.name	= "Flash", +		.offset	= 0, +		.size	= MTDPART_SIZ_FULL, +	}, +}; + +static struct physmap_flash_data edb7211_flash_pdata __initdata = { +	.width		= 4, +	.parts		= edb7211_flash_partitions, +	.nr_parts	= ARRAY_SIZE(edb7211_flash_partitions), +}; + +static struct resource edb7211_flash_resources[] __initdata = { +	DEFINE_RES_MEM(EDB7211_FLASH0_BASE, SZ_8M), +	DEFINE_RES_MEM(EDB7211_FLASH1_BASE, SZ_8M), +}; + +static struct platform_device edb7211_flash_pdev __initdata = { +	.name		= "physmap-flash", +	.id		= 0, +	.resource	= edb7211_flash_resources, +	.num_resources	= ARRAY_SIZE(edb7211_flash_resources), +	.dev	= { +		.platform_data	= &edb7211_flash_pdata, +	}, +}; + +static void edb7211_lcd_power_set(struct plat_lcd_data *pd, unsigned int power) +{ +	if (power) { +		gpio_set_value(EDB7211_LCDEN, 1); +		udelay(100); +		gpio_set_value(EDB7211_LCD_DC_DC_EN, 1); +	} else { +		gpio_set_value(EDB7211_LCD_DC_DC_EN, 0); +		udelay(100); +		gpio_set_value(EDB7211_LCDEN, 0); +	} +} + +static struct plat_lcd_data edb7211_lcd_power_pdata = { +	.set_power	= edb7211_lcd_power_set, +}; + +static void edb7211_lcd_backlight_set_intensity(int intensity) +{ +	gpio_set_value(EDB7211_LCDBL, intensity); +} + +static struct generic_bl_info edb7211_lcd_backlight_pdata = { +	.name			= "lcd-backlight.0", +	.default_intensity	= 0x01, +	.max_intensity		= 0x01, +	.set_bl_intensity	= edb7211_lcd_backlight_set_intensity, +}; + +static struct gpio edb7211_gpios[] __initconst = { +	{ EDB7211_LCD_DC_DC_EN,	GPIOF_OUT_INIT_LOW,	"LCD DC-DC" }, +	{ EDB7211_LCDEN,	GPIOF_OUT_INIT_LOW,	"LCD POWER" }, +	{ EDB7211_LCDBL,	GPIOF_OUT_INIT_LOW,	"LCD BACKLIGHT" }, +}; + +static struct map_desc edb7211_io_desc[] __initdata = { +	{	/* Memory-mapped extra keyboard row */ +		.virtual	= IO_ADDRESS(EP7211_PHYS_EXTKBD), +		.pfn		= __phys_to_pfn(EP7211_PHYS_EXTKBD), +		.length		= SZ_1M, +		.type		= MT_DEVICE, +	}, +}; + +void __init edb7211_map_io(void) +{ +	clps711x_map_io(); +	iotable_init(edb7211_io_desc, ARRAY_SIZE(edb7211_io_desc)); +} + +/* Reserve screen memory region at the start of main system memory. */ +static void __init edb7211_reserve(void) +{ +	memblock_reserve(PHYS_OFFSET, VIDEORAM_SIZE); +} + +static void __init +fixup_edb7211(struct tag *tags, char **cmdline, struct meminfo *mi) +{ +	/* +	 * Bank start addresses are not present in the information +	 * passed in from the boot loader.  We could potentially +	 * detect them, but instead we hard-code them. +	 * +	 * Banks sizes _are_ present in the param block, but we're +	 * not using that information yet. +	 */ +	mi->bank[0].start = 0xc0000000; +	mi->bank[0].size = SZ_8M; +	mi->bank[1].start = 0xc1000000; +	mi->bank[1].size = SZ_8M; +	mi->nr_banks = 2; +} + +static void __init edb7211_init(void) +{ +	gpio_request_array(edb7211_gpios, ARRAY_SIZE(edb7211_gpios)); + +	platform_device_register(&edb7211_flash_pdev); +	platform_device_register_data(&platform_bus, "platform-lcd", 0, +				      &edb7211_lcd_power_pdata, +				      sizeof(edb7211_lcd_power_pdata)); +	platform_device_register_data(&platform_bus, "generic-bl", 0, +				      &edb7211_lcd_backlight_pdata, +				      sizeof(edb7211_lcd_backlight_pdata)); +	platform_device_register_simple("video-clps711x", 0, NULL, 0); +	platform_device_register_simple("cs89x0", 0, edb7211_cs8900_resource, +					ARRAY_SIZE(edb7211_cs8900_resource)); +} + +MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)") +	/* Maintainer: Jon McClintock */ +	.atag_offset	= VIDEORAM_SIZE + 0x100, +	.nr_irqs	= CLPS711X_NR_IRQS, +	.fixup		= fixup_edb7211, +	.reserve	= edb7211_reserve, +	.map_io		= edb7211_map_io, +	.init_irq	= clps711x_init_irq, +	.timer		= &clps711x_timer, +	.init_machine	= edb7211_init, +	.handle_irq	= clps711x_handle_irq, +	.restart	= clps711x_restart, +MACHINE_END diff --git a/arch/arm/mach-clps711x/fortunet.c b/arch/arm/mach-clps711x/board-fortunet.c index 3a3f0b702cb..7d012558036 100644 --- a/arch/arm/mach-clps711x/fortunet.c +++ b/arch/arm/mach-clps711x/board-fortunet.c @@ -74,9 +74,11 @@ fortunet_fixup(struct tag *tags, char **cmdline, struct meminfo *mi)  MACHINE_START(FORTUNET, "ARM-FortuNet")  	/* Maintainer: FortuNet Inc. */ +	.nr_irqs	= CLPS711X_NR_IRQS,  	.fixup		= fortunet_fixup,  	.map_io		= clps711x_map_io,  	.init_irq	= clps711x_init_irq,  	.timer		= &clps711x_timer, +	.handle_irq	= clps711x_handle_irq,  	.restart	= clps711x_restart,  MACHINE_END diff --git a/arch/arm/mach-clps711x/board-p720t.c b/arch/arm/mach-clps711x/board-p720t.c new file mode 100644 index 00000000000..1518fc83bab --- /dev/null +++ b/arch/arm/mach-clps711x/board-p720t.c @@ -0,0 +1,232 @@ +/* + *  linux/arch/arm/mach-clps711x/p720t.c + * + *  Copyright (C) 2000-2001 Deep Blue Solutions Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/types.h> +#include <linux/string.h> +#include <linux/mm.h> +#include <linux/io.h> +#include <linux/slab.h> +#include <linux/leds.h> +#include <linux/sizes.h> +#include <linux/backlight.h> +#include <linux/platform_device.h> +#include <linux/mtd/partitions.h> +#include <linux/mtd/nand-gpio.h> + +#include <mach/hardware.h> +#include <asm/pgtable.h> +#include <asm/page.h> +#include <asm/setup.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <mach/syspld.h> + +#include <video/platform_lcd.h> + +#include "common.h" + +#define P720T_USERLED		CLPS711X_GPIO(3, 0) +#define P720T_NAND_CLE		CLPS711X_GPIO(4, 0) +#define P720T_NAND_ALE		CLPS711X_GPIO(4, 1) +#define P720T_NAND_NCE		CLPS711X_GPIO(4, 2) + +#define P720T_NAND_BASE		(CLPS711X_SDRAM1_BASE) + +static struct resource p720t_nand_resource[] __initdata = { +	DEFINE_RES_MEM(P720T_NAND_BASE, SZ_4), +}; + +static struct mtd_partition p720t_nand_parts[] __initdata = { +	{ +		.name	= "Flash partition 1", +		.offset	= 0, +		.size	= SZ_2M, +	}, +	{ +		.name	= "Flash partition 2", +		.offset	= MTDPART_OFS_APPEND, +		.size	= MTDPART_SIZ_FULL, +	}, +}; + +static struct gpio_nand_platdata p720t_nand_pdata __initdata = { +	.gpio_rdy	= -1, +	.gpio_nce	= P720T_NAND_NCE, +	.gpio_ale	= P720T_NAND_ALE, +	.gpio_cle	= P720T_NAND_CLE, +	.gpio_nwp	= -1, +	.chip_delay	= 15, +	.parts		= p720t_nand_parts, +	.num_parts	= ARRAY_SIZE(p720t_nand_parts), +}; + +static struct platform_device p720t_nand_pdev __initdata = { +	.name		= "gpio-nand", +	.id		= -1, +	.resource	= p720t_nand_resource, +	.num_resources	= ARRAY_SIZE(p720t_nand_resource), +	.dev		= { +		.platform_data = &p720t_nand_pdata, +	}, +}; + +static void p720t_lcd_power_set(struct plat_lcd_data *pd, unsigned int power) +{ +	if (power) { +		PLD_LCDEN = PLD_LCDEN_EN; +		PLD_PWR |= PLD_S4_ON | PLD_S2_ON | PLD_S1_ON; +	} else { +		PLD_PWR &= ~(PLD_S4_ON | PLD_S2_ON | PLD_S1_ON); +		PLD_LCDEN = 0; +	} +} + +static struct plat_lcd_data p720t_lcd_power_pdata = { +	.set_power	= p720t_lcd_power_set, +}; + +static void p720t_lcd_backlight_set_intensity(int intensity) +{ +	if (intensity) +		PLD_PWR |= PLD_S3_ON; +	else +		PLD_PWR = 0; +} + +static struct generic_bl_info p720t_lcd_backlight_pdata = { +	.name			= "lcd-backlight.0", +	.default_intensity	= 0x01, +	.max_intensity		= 0x01, +	.set_bl_intensity	= p720t_lcd_backlight_set_intensity, +}; + +/* + * Map the P720T system PLD. It occupies two address spaces: + * 0x10000000 and 0x10400000. We map both regions as one. + */ +static struct map_desc p720t_io_desc[] __initdata = { +	{ +		.virtual	= SYSPLD_VIRT_BASE, +		.pfn		= __phys_to_pfn(SYSPLD_PHYS_BASE), +		.length		= SZ_8M, +		.type		= MT_DEVICE, +	}, +}; + +static void __init +fixup_p720t(struct tag *tag, char **cmdline, struct meminfo *mi) +{ +	/* +	 * Our bootloader doesn't setup any tags (yet). +	 */ +	if (tag->hdr.tag != ATAG_CORE) { +		tag->hdr.tag = ATAG_CORE; +		tag->hdr.size = tag_size(tag_core); +		tag->u.core.flags = 0; +		tag->u.core.pagesize = PAGE_SIZE; +		tag->u.core.rootdev = 0x0100; + +		tag = tag_next(tag); +		tag->hdr.tag = ATAG_MEM; +		tag->hdr.size = tag_size(tag_mem32); +		tag->u.mem.size = 4096; +		tag->u.mem.start = PHYS_OFFSET; + +		tag = tag_next(tag); +		tag->hdr.tag = ATAG_NONE; +		tag->hdr.size = 0; +	} +} + +static void __init p720t_map_io(void) +{ +	clps711x_map_io(); +	iotable_init(p720t_io_desc, ARRAY_SIZE(p720t_io_desc)); +} + +static void __init p720t_init_early(void) +{ +	/* +	 * Power down as much as possible in case we don't +	 * have the drivers loaded. +	 */ +	PLD_LCDEN = 0; +	PLD_PWR  &= ~(PLD_S4_ON|PLD_S3_ON|PLD_S2_ON|PLD_S1_ON); + +	PLD_KBD   = 0; +	PLD_IO    = 0; +	PLD_IRDA  = 0; +	PLD_CODEC = 0; +	PLD_TCH   = 0; +	PLD_SPI   = 0; +	if (!IS_ENABLED(CONFIG_DEBUG_LL)) { +		PLD_COM2 = 0; +		PLD_COM1 = 0; +	} +} + +static struct gpio_led p720t_gpio_leds[] = { +	{ +		.name			= "User LED", +		.default_trigger	= "heartbeat", +		.gpio			= P720T_USERLED, +	}, +}; + +static struct gpio_led_platform_data p720t_gpio_led_pdata __initdata = { +	.leds		= p720t_gpio_leds, +	.num_leds	= ARRAY_SIZE(p720t_gpio_leds), +}; + +static void __init p720t_init(void) +{ +	platform_device_register(&p720t_nand_pdev); +	platform_device_register_data(&platform_bus, "platform-lcd", 0, +				      &p720t_lcd_power_pdata, +				      sizeof(p720t_lcd_power_pdata)); +	platform_device_register_data(&platform_bus, "generic-bl", 0, +				      &p720t_lcd_backlight_pdata, +				      sizeof(p720t_lcd_backlight_pdata)); +	platform_device_register_simple("video-clps711x", 0, NULL, 0); +} + +static void __init p720t_init_late(void) +{ +	platform_device_register_data(&platform_bus, "leds-gpio", 0, +				      &p720t_gpio_led_pdata, +				      sizeof(p720t_gpio_led_pdata)); +} + +MACHINE_START(P720T, "ARM-Prospector720T") +	/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ +	.atag_offset	= 0x100, +	.nr_irqs	= CLPS711X_NR_IRQS, +	.fixup		= fixup_p720t, +	.map_io		= p720t_map_io, +	.init_early	= p720t_init_early, +	.init_irq	= clps711x_init_irq, +	.timer		= &clps711x_timer, +	.init_machine	= p720t_init, +	.init_late	= p720t_init_late, +	.handle_irq	= clps711x_handle_irq, +	.restart	= clps711x_restart, +MACHINE_END diff --git a/arch/arm/mach-clps711x/cdb89712.c b/arch/arm/mach-clps711x/cdb89712.c deleted file mode 100644 index c314f49d6ef..00000000000 --- a/arch/arm/mach-clps711x/cdb89712.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - *  linux/arch/arm/mach-clps711x/cdb89712.c - * - *  Copyright (C) 2000-2001 Deep Blue Solutions Ltd - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/types.h> -#include <linux/string.h> -#include <linux/mm.h> -#include <linux/io.h> - -#include <mach/hardware.h> -#include <asm/pgtable.h> -#include <asm/page.h> -#include <asm/setup.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> -#include <asm/mach/map.h> - -#include "common.h" - -/* - * Map the CS89712 Ethernet port.  That should be moved to the - * ethernet driver, perhaps. - */ -static struct map_desc cdb89712_io_desc[] __initdata = { -	{ -		.virtual	= ETHER_BASE, -		.pfn		=__phys_to_pfn(ETHER_START), -		.length		= ETHER_SIZE, -		.type		= MT_DEVICE -	} -}; - -static void __init cdb89712_map_io(void) -{ -	clps711x_map_io(); -	iotable_init(cdb89712_io_desc, ARRAY_SIZE(cdb89712_io_desc)); -} - -MACHINE_START(CDB89712, "Cirrus-CDB89712") -	/* Maintainer: Ray Lehtiniemi */ -	.atag_offset	= 0x100, -	.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/common.c b/arch/arm/mach-clps711x/common.c index 509243d89a3..e046439573e 100644 --- a/arch/arm/mach-clps711x/common.c +++ b/arch/arm/mach-clps711x/common.c @@ -21,13 +21,16 @@   */  #include <linux/io.h>  #include <linux/init.h> +#include <linux/sizes.h>  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/clk.h>  #include <linux/clkdev.h> +#include <linux/clockchips.h>  #include <linux/clk-provider.h> -#include <asm/sizes.h> +#include <asm/exception.h> +#include <asm/mach/irq.h>  #include <asm/mach/map.h>  #include <asm/mach/time.h>  #include <asm/system_misc.h> @@ -36,7 +39,6 @@  static struct clk *clk_pll, *clk_bus, *clk_uart, *clk_timerl, *clk_timerh,  		  *clk_tint, *clk_spi; -static unsigned long latch;  /*   * This maps the generic CLPS711x registers @@ -45,7 +47,7 @@ static struct map_desc clps711x_io_desc[] __initdata = {  	{  		.virtual	= (unsigned long)CLPS711X_VIRT_BASE,  		.pfn		= __phys_to_pfn(CLPS711X_PHYS_BASE), -		.length		= SZ_1M, +		.length		= SZ_64K,  		.type		= MT_DEVICE  	}  }; @@ -64,7 +66,7 @@ static void int1_mask(struct irq_data *d)  	clps_writel(intmr1, INTMR1);  } -static void int1_ack(struct irq_data *d) +static void int1_eoi(struct irq_data *d)  {  	switch (d->irq) {  	case IRQ_CSINT:  clps_writel(0, COEOI);  break; @@ -86,7 +88,8 @@ static void int1_unmask(struct irq_data *d)  }  static struct irq_chip int1_chip = { -	.irq_ack	= int1_ack, +	.name		= "Interrupt Vector 1", +	.irq_eoi	= int1_eoi,  	.irq_mask	= int1_mask,  	.irq_unmask	= int1_unmask,  }; @@ -100,7 +103,7 @@ static void int2_mask(struct irq_data *d)  	clps_writel(intmr2, INTMR2);  } -static void int2_ack(struct irq_data *d) +static void int2_eoi(struct irq_data *d)  {  	switch (d->irq) {  	case IRQ_KBDINT: clps_writel(0, KBDEOI); break; @@ -117,73 +120,160 @@ static void int2_unmask(struct irq_data *d)  }  static struct irq_chip int2_chip = { -	.irq_ack	= int2_ack, +	.name		= "Interrupt Vector 2", +	.irq_eoi	= int2_eoi,  	.irq_mask	= int2_mask,  	.irq_unmask	= int2_unmask,  }; +static void int3_mask(struct irq_data *d) +{ +	u32 intmr3; + +	intmr3 = clps_readl(INTMR3); +	intmr3 &= ~(1 << (d->irq - 32)); +	clps_writel(intmr3, INTMR3); +} + +static void int3_unmask(struct irq_data *d) +{ +	u32 intmr3; + +	intmr3 = clps_readl(INTMR3); +	intmr3 |= 1 << (d->irq - 32); +	clps_writel(intmr3, INTMR3); +} + +static struct irq_chip int3_chip = { +	.name		= "Interrupt Vector 3", +	.irq_mask	= int3_mask, +	.irq_unmask	= int3_unmask, +}; + +static struct { +	int			nr; +	struct irq_chip		*chip; +	irq_flow_handler_t	handle; +} clps711x_irqdescs[] __initdata = { +	{ IRQ_CSINT,	&int1_chip,	handle_fasteoi_irq,	}, +	{ IRQ_EINT1,	&int1_chip,	handle_level_irq,	}, +	{ IRQ_EINT2,	&int1_chip,	handle_level_irq,	}, +	{ IRQ_EINT3,	&int1_chip,	handle_level_irq,	}, +	{ IRQ_TC1OI,	&int1_chip,	handle_fasteoi_irq,	}, +	{ IRQ_TC2OI,	&int1_chip,	handle_fasteoi_irq,	}, +	{ IRQ_RTCMI,	&int1_chip,	handle_fasteoi_irq,	}, +	{ IRQ_TINT,	&int1_chip,	handle_fasteoi_irq,	}, +	{ IRQ_UTXINT1,	&int1_chip,	handle_level_irq,	}, +	{ IRQ_URXINT1,	&int1_chip,	handle_level_irq,	}, +	{ IRQ_UMSINT,	&int1_chip,	handle_fasteoi_irq,	}, +	{ IRQ_SSEOTI,	&int1_chip,	handle_level_irq,	}, +	{ IRQ_KBDINT,	&int2_chip,	handle_fasteoi_irq,	}, +	{ IRQ_SS2RX,	&int2_chip,	handle_level_irq,	}, +	{ IRQ_SS2TX,	&int2_chip,	handle_level_irq,	}, +	{ IRQ_UTXINT2,	&int2_chip,	handle_level_irq,	}, +	{ IRQ_URXINT2,	&int2_chip,	handle_level_irq,	}, +}; +  void __init clps711x_init_irq(void)  {  	unsigned int i; -	for (i = 0; i < NR_IRQS; i++) { -	        if (INT1_IRQS & (1 << i)) { -			irq_set_chip_and_handler(i, &int1_chip, -						 handle_level_irq); -			set_irq_flags(i, IRQF_VALID | IRQF_PROBE); -		} -		if (INT2_IRQS & (1 << i)) { -			irq_set_chip_and_handler(i, &int2_chip, -						 handle_level_irq); -			set_irq_flags(i, IRQF_VALID | IRQF_PROBE); -		} -	} - -	/* -	 * Disable interrupts -	 */ +	/* Disable interrupts */  	clps_writel(0, INTMR1);  	clps_writel(0, INTMR2); +	clps_writel(0, INTMR3); -	/* -	 * Clear down any pending interrupts -	 */ +	/* Clear down any pending interrupts */ +	clps_writel(0, BLEOI); +	clps_writel(0, MCEOI);  	clps_writel(0, COEOI);  	clps_writel(0, TC1EOI);  	clps_writel(0, TC2EOI);  	clps_writel(0, RTCEOI);  	clps_writel(0, TEOI);  	clps_writel(0, UMSEOI); -	clps_writel(0, SYNCIO);  	clps_writel(0, KBDEOI); +	clps_writel(0, SRXEOF); +	clps_writel(0xffffffff, DAISR); + +	for (i = 0; i < ARRAY_SIZE(clps711x_irqdescs); i++) { +		irq_set_chip_and_handler(clps711x_irqdescs[i].nr, +					 clps711x_irqdescs[i].chip, +					 clps711x_irqdescs[i].handle); +		set_irq_flags(clps711x_irqdescs[i].nr, +			      IRQF_VALID | IRQF_PROBE); +	} + +	if (IS_ENABLED(CONFIG_FIQ)) { +		init_FIQ(0); +		irq_set_chip_and_handler(IRQ_DAIINT, &int3_chip, +					 handle_bad_irq); +		set_irq_flags(IRQ_DAIINT, +			      IRQF_VALID | IRQF_PROBE | IRQF_NOAUTOEN); +	}  } -/* - * gettimeoffset() returns time since last timer tick, in usecs. - * - * 'LATCH' is hwclock ticks (see CLOCK_TICK_RATE in timex.h) per jiffy. - * 'tick' is usecs per jiffy. - */ -static unsigned long clps711x_gettimeoffset(void) +inline u32 fls16(u32 x)  { -	unsigned long hwticks; -	hwticks = latch - (clps_readl(TC2D) & 0xffff); -	return (hwticks * (tick_nsec / 1000)) / latch; +	u32 r = 15; + +	if (!(x & 0xff00)) { +		x <<= 8; +		r -= 8; +	} +	if (!(x & 0xf000)) { +		x <<= 4; +		r -= 4; +	} +	if (!(x & 0xc000)) { +		x <<= 2; +		r -= 2; +	} +	if (!(x & 0x8000)) +		r--; + +	return r;  } -/* - * IRQ handler for the timer - */ -static irqreturn_t p720t_timer_interrupt(int irq, void *dev_id) +asmlinkage void __exception_irq_entry clps711x_handle_irq(struct pt_regs *regs) +{ +	u32 irqstat; +	void __iomem *base = CLPS711X_VIRT_BASE; + +	irqstat = readl_relaxed(base + INTSR1) & readl_relaxed(base + INTMR1); +	if (irqstat) { +		handle_IRQ(fls16(irqstat), regs); +		return; +	} + +	irqstat = readl_relaxed(base + INTSR2) & readl_relaxed(base + INTMR2); +	if (likely(irqstat)) +		handle_IRQ(fls16(irqstat) + 16, regs); +} + +static void clps711x_clockevent_set_mode(enum clock_event_mode mode, +					 struct clock_event_device *evt) +{ +} + +static struct clock_event_device clockevent_clps711x = { +	.name		= "CLPS711x Clockevents", +	.rating		= 300, +	.features	= CLOCK_EVT_FEAT_PERIODIC, +	.set_mode	= clps711x_clockevent_set_mode, +}; + +static irqreturn_t clps711x_timer_interrupt(int irq, void *dev_id)  { -	timer_tick(); +	clockevent_clps711x.event_handler(&clockevent_clps711x); +  	return IRQ_HANDLED;  }  static struct irqaction clps711x_timer_irq = {  	.name		= "CLPS711x Timer Tick",  	.flags		= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, -	.handler	= p720t_timer_interrupt, +	.handler	= clps711x_timer_interrupt,  };  static void add_fixed_clk(struct clk *clk, const char *name, int rate) @@ -244,20 +334,19 @@ static void __init clps711x_timer_init(void)  	pr_info("CPU frequency set at %i Hz.\n", cpu); -	latch = (timh + HZ / 2) / HZ; +	clps_writew(DIV_ROUND_CLOSEST(timh, HZ), TC2D);  	tmp = clps_readl(SYSCON1);  	tmp |= SYSCON1_TC2S | SYSCON1_TC2M;  	clps_writel(tmp, SYSCON1); -	clps_writel(latch - 1, TC2D); +	clockevents_config_and_register(&clockevent_clps711x, timh, 1, 0xffff);  	setup_irq(IRQ_TC2OI, &clps711x_timer_irq);  }  struct sys_timer clps711x_timer = {  	.init		= clps711x_timer_init, -	.offset		= clps711x_gettimeoffset,  };  void clps711x_restart(char mode, const char *cmd) diff --git a/arch/arm/mach-clps711x/common.h b/arch/arm/mach-clps711x/common.h index fc0f0650dcb..b7c0c75c90c 100644 --- a/arch/arm/mach-clps711x/common.h +++ b/arch/arm/mach-clps711x/common.h @@ -4,9 +4,14 @@   * Common bits.   */ +#define CLPS711X_NR_IRQS	(33) +#define CLPS711X_NR_GPIO	(4 * 8 + 3) +#define CLPS711X_GPIO(prt, bit)	((prt) * 8 + (bit)) +  struct sys_timer;  extern void clps711x_map_io(void);  extern void clps711x_init_irq(void); -extern struct sys_timer clps711x_timer; +extern void clps711x_handle_irq(struct pt_regs *regs);  extern void clps711x_restart(char mode, const char *cmd); +extern struct sys_timer clps711x_timer; diff --git a/arch/arm/mach-clps711x/edb7211-arch.c b/arch/arm/mach-clps711x/edb7211-arch.c deleted file mode 100644 index 5fad0b4f40a..00000000000 --- a/arch/arm/mach-clps711x/edb7211-arch.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - *  linux/arch/arm/mach-clps711x/arch-edb7211.c - * - *  Copyright (C) 2000, 2001 Blue Mug, Inc.  All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ -#include <linux/init.h> -#include <linux/memblock.h> -#include <linux/types.h> -#include <linux/string.h> - -#include <asm/setup.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> - -#include "common.h" - -extern void edb7211_map_io(void); - -/* Reserve screen memory region at the start of main system memory. */ -static void __init edb7211_reserve(void) -{ -	memblock_reserve(PHYS_OFFSET, 0x00020000); -} - -static void __init -fixup_edb7211(struct tag *tags, char **cmdline, struct meminfo *mi) -{ -	/* -	 * Bank start addresses are not present in the information -	 * passed in from the boot loader.  We could potentially -	 * detect them, but instead we hard-code them. -	 * -	 * Banks sizes _are_ present in the param block, but we're -	 * not using that information yet. -	 */ -	mi->bank[0].start = 0xc0000000; -	mi->bank[0].size = 8*1024*1024; -	mi->bank[1].start = 0xc1000000; -	mi->bank[1].size = 8*1024*1024; -	mi->nr_banks = 2; -} - -MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)") -	/* Maintainer: Jon McClintock */ -	.atag_offset	= 0x20100,	/* 0xc0000000 - 0xc001ffff can be video RAM */ -	.fixup		= fixup_edb7211, -	.map_io		= edb7211_map_io, -	.reserve	= edb7211_reserve, -	.init_irq	= clps711x_init_irq, -	.timer		= &clps711x_timer, -	.restart	= clps711x_restart, -MACHINE_END diff --git a/arch/arm/mach-clps711x/edb7211-mm.c b/arch/arm/mach-clps711x/edb7211-mm.c deleted file mode 100644 index 4372f06c992..00000000000 --- a/arch/arm/mach-clps711x/edb7211-mm.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - *  linux/arch/arm/mach-clps711x/mm.c - * - *  Extra MM routines for the EDB7211 board - * - *  Copyright (C) 2000, 2001 Blue Mug, Inc.  All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/bug.h> - -#include <mach/hardware.h> -#include <asm/page.h> -#include <asm/sizes.h> -  -#include <asm/mach/map.h> - -extern void clps711x_map_io(void); - -/* - * The on-chip registers are given a size of 1MB so that a section can - * be used to map them; this saves a page table.  This is the place to - * add mappings for ROM, expansion memory, PCMCIA, etc.  (if static - * mappings are chosen for those areas). - * - * Here is a physical memory map (to be fleshed out later): - * - * Physical Address  Size  Description - * ----------------- ----- --------------------------------- - * c0000000-c001ffff 128KB reserved for video RAM [1] - * c0020000-c0023fff  16KB parameters (see Documentation/arm/Setup) - * c0024000-c0027fff  16KB swapper_pg_dir (task 0 page directory) - * c0028000-...            kernel image (TEXTADDR) - * - * [1] Unused pages should be given back to the VM; they are not yet. - *     The parameter block should also be released (not sure if this - *     happens). - */ -static struct map_desc edb7211_io_desc[] __initdata = { - 	{	/* memory-mapped extra keyboard row */ -	 	.virtual 	= EP7211_VIRT_EXTKBD, -		.pfn		= __phys_to_pfn(EP7211_PHYS_EXTKBD), -		.length		= SZ_1M, -		.type		= MT_DEVICE, -	}, {	/* and CS8900A Ethernet chip */ -		.virtual	= EP7211_VIRT_CS8900A, -		.pfn		= __phys_to_pfn(EP7211_PHYS_CS8900A), -		.length		= SZ_1M, -		.type		= MT_DEVICE, -	}, { 	/* flash banks */ -		.virtual	= EP7211_VIRT_FLASH1, -		.pfn		= __phys_to_pfn(EP7211_PHYS_FLASH1), -		.length		= SZ_8M, -		.type		= MT_DEVICE, -	}, { -		.virtual	= EP7211_VIRT_FLASH2, -		.pfn		= __phys_to_pfn(EP7211_PHYS_FLASH2), -		.length		= SZ_8M, -		.type		= MT_DEVICE, -	} -}; - -void __init edb7211_map_io(void) -{ -        clps711x_map_io(); -        iotable_init(edb7211_io_desc, ARRAY_SIZE(edb7211_io_desc)); -} - diff --git a/arch/arm/mach-clps711x/include/mach/autcpu12.h b/arch/arm/mach-clps711x/include/mach/autcpu12.h index 1588a365f61..0452f5f3f03 100644 --- a/arch/arm/mach-clps711x/include/mach/autcpu12.h +++ b/arch/arm/mach-clps711x/include/mach/autcpu12.h @@ -21,24 +21,15 @@  #define __ASM_ARCH_AUTCPU12_H  /* - * The CS8900A ethernet chip has its I/O registers wired to chip select 2 - * (nCS2). This is the mapping for it. - */ -#define AUTCPU12_PHYS_CS8900A		CS2_PHYS_BASE		/* physical */ -#define AUTCPU12_VIRT_CS8900A		(0xfe000000)		/* virtual */ - -/*   * The flash bank is wired to chip select 0   */  #define AUTCPU12_PHYS_FLASH		CS0_PHYS_BASE		/* physical */  /* offset for device specific information structure */  #define AUTCPU12_LCDINFO_OFFS		(0x00010000)	 -/* -* Videomemory is the internal SRAM (CS 6)	 -*/ + +/* Videomemory in the internal SRAM (CS 6) */  #define AUTCPU12_PHYS_VIDEO		CS6_PHYS_BASE -#define AUTCPU12_VIRT_VIDEO		(0xfd000000)  /*  * All special IO's are tied to CS1 @@ -49,8 +40,6 @@  #define AUTCPU12_PHYS_CSAUX1           	CS1_PHYS_BASE +0x04000000  /* physical */ -#define AUTCPU12_PHYS_SMC              	CS1_PHYS_BASE +0x06000000  /* physical */ -  #define AUTCPU12_PHYS_CAN              	CS1_PHYS_BASE +0x08000000  /* physical */  #define AUTCPU12_PHYS_TOUCH            	CS1_PHYS_BASE +0x0A000000  /* physical */ @@ -59,14 +48,6 @@  #define AUTCPU12_PHYS_LPT              	CS1_PHYS_BASE +0x0E000000  /* physical */ -/*  -* defines for smartmedia card access  -*/ -#define AUTCPU12_SMC_RDY		(1<<2) -#define AUTCPU12_SMC_ALE		(1<<3) -#define AUTCPU12_SMC_CLE  		(1<<4) -#define AUTCPU12_SMC_PORT_OFFSET	PBDR -#define AUTCPU12_SMC_SELECT_OFFSET 	0x10  /*  * defines for lcd contrast   */ diff --git a/arch/arm/mach-clps711x/include/mach/clps711x.h b/arch/arm/mach-clps711x/include/mach/clps711x.h index c82e21ca49c..01d1b955971 100644 --- a/arch/arm/mach-clps711x/include/mach/clps711x.h +++ b/arch/arm/mach-clps711x/include/mach/clps711x.h @@ -257,6 +257,9 @@  #define MEMCFG_BUS_WIDTH_16	(0)  #define MEMCFG_BUS_WIDTH_8	(3) +#define MEMCFG_SQAEN		(1 << 6) +#define MEMCFG_CLKENB		(1 << 7) +  #define MEMCFG_WAITSTATE_8_3	(0 << 2)  #define MEMCFG_WAITSTATE_7_3	(1 << 2)  #define MEMCFG_WAITSTATE_6_3	(2 << 2) @@ -274,4 +277,28 @@  #define MEMCFG_WAITSTATE_2_0	(14 << 2)  #define MEMCFG_WAITSTATE_1_0	(15 << 2) +/* INTSR1 Interrupts */ +#define IRQ_CSINT		(4) +#define IRQ_EINT1		(5) +#define IRQ_EINT2		(6) +#define IRQ_EINT3		(7) +#define IRQ_TC1OI		(8) +#define IRQ_TC2OI		(9) +#define IRQ_RTCMI		(10) +#define IRQ_TINT		(11) +#define IRQ_UTXINT1		(12) +#define IRQ_URXINT1		(13) +#define IRQ_UMSINT		(14) +#define IRQ_SSEOTI		(15) + +/* INTSR2 Interrupts */ +#define IRQ_KBDINT		(16 + 0) +#define IRQ_SS2RX		(16 + 1) +#define IRQ_SS2TX		(16 + 2) +#define IRQ_UTXINT2		(16 + 12) +#define IRQ_URXINT2		(16 + 13) + +/* INTSR3 Interrupts */ +#define IRQ_DAIINT		(32 + 0) +  #endif /* __MACH_CLPS711X_H */ diff --git a/arch/arm/mach-clps711x/include/mach/entry-macro.S b/arch/arm/mach-clps711x/include/mach/entry-macro.S deleted file mode 100644 index 56e5c2c2350..00000000000 --- a/arch/arm/mach-clps711x/include/mach/entry-macro.S +++ /dev/null @@ -1,51 +0,0 @@ -/* - * arch/arm/mach-clps711x/include/mach/entry-macro.S - * - * Low-level IRQ helper macros for CLPS711X-based platforms - * - * This file is licensed under  the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ -#include <mach/hardware.h> - -		.macro	get_irqnr_preamble, base, tmp -		.endm - -#if (INTSR2 - INTSR1) != (INTMR2 - INTMR1) -#error INTSR stride != INTMR stride -#endif - -		.macro	get_irqnr_and_base, irqnr, stat, base, mask -		mov	\base, #CLPS711X_VIRT_BASE -		ldr	\stat, [\base, #INTSR1] -		ldr	\mask, [\base, #INTMR1] -		mov	\irqnr, #4 -		mov	\mask, \mask, lsl #16 -		and	\stat, \stat, \mask, lsr #16 -		movs	\stat, \stat, lsr #4 -		bne	1001f - -		add	\base, \base, #INTSR2 - INTSR1 -		ldr	\stat, [\base, #INTSR1] -		ldr	\mask, [\base, #INTMR1] -		mov	\irqnr, #16 -		mov	\mask, \mask, lsl #16 -		and	\stat, \stat, \mask, lsr #16 - -1001:		tst	\stat, #255 -		addeq	\irqnr, \irqnr, #8 -		moveq	\stat, \stat, lsr #8 -		tst	\stat, #15 -		addeq	\irqnr, \irqnr, #4 -		moveq	\stat, \stat, lsr #4 -		tst	\stat, #3 -		addeq	\irqnr, \irqnr, #2 -		moveq	\stat, \stat, lsr #2 -		tst	\stat, #1 -		addeq	\irqnr, \irqnr, #1 -		moveq	\stat, \stat, lsr #1 -		tst	\stat, #1			@ bit 0 should be set -		.endm - - diff --git a/arch/arm/mach-clps711x/include/mach/hardware.h b/arch/arm/mach-clps711x/include/mach/hardware.h index 8497775d6ee..2f23dd5d73e 100644 --- a/arch/arm/mach-clps711x/include/mach/hardware.h +++ b/arch/arm/mach-clps711x/include/mach/hardware.h @@ -24,7 +24,10 @@  #include <mach/clps711x.h> -#define CLPS711X_VIRT_BASE	IOMEM(0xff000000) +#define IO_ADDRESS(x)		(0xdc000000 + (((x) & 0x03ffffff) | \ +				(((x) >> 2) & 0x3c000000))) + +#define CLPS711X_VIRT_BASE	IOMEM(IO_ADDRESS(CLPS711X_PHYS_BASE))  #ifndef __ASSEMBLY__  #define clps_readb(off)		readb(CLPS711X_VIRT_BASE + (off)) @@ -61,67 +64,17 @@  #define CS7_PHYS_BASE		(0x00000000)  #endif -#define SYSPLD_VIRT_BASE	0xfe000000 -#define SYSPLD_BASE		SYSPLD_VIRT_BASE - -#if defined (CONFIG_ARCH_CDB89712) - -#define ETHER_START      0x20000000 -#define ETHER_SIZE       0x1000 -#define ETHER_BASE       0xfe000000 - -#endif +#define CLPS711X_SRAM_BASE	CS6_PHYS_BASE +#define CLPS711X_SRAM_SIZE	(48 * 1024) +#define CLPS711X_SDRAM0_BASE	(0xc0000000) +#define CLPS711X_SDRAM1_BASE	(0xd0000000)  #if defined (CONFIG_ARCH_EDB7211) -/* - * The extra 8 lines of the keyboard matrix are wired to chip select 3 (nCS3)  - * and repeat across it. This is the mapping for it. - * - * In jumpered boot mode, nCS3 is mapped to 0x4000000, not 0x3000000. This  - * was cause for much consternation and headscratching. This should probably - * be made a compile/run time kernel option. - */ -#define EP7211_PHYS_EXTKBD		CS3_PHYS_BASE	/* physical */ - -#define EP7211_VIRT_EXTKBD		(0xfd000000)	/* virtual */ - - -/* - * The CS8900A ethernet chip has its I/O registers wired to chip select 2  - * (nCS2). This is the mapping for it. - * - * In jumpered boot mode, nCS2 is mapped to 0x5000000, not 0x2000000. This  - * was cause for much consternation and headscratching. This should probably - * be made a compile/run time kernel option. - */ -#define EP7211_PHYS_CS8900A		CS2_PHYS_BASE	/* physical */ - -#define EP7211_VIRT_CS8900A		(0xfc000000)	/* virtual */ - - -/* - * The two flash banks are wired to chip selects 0 and 1. This is the mapping - * for them. - * - * nCS0 and nCS1 are at 0x70000000 and 0x60000000, respectively, when running - * in jumpered boot mode. - */ -#define EP7211_PHYS_FLASH1		CS0_PHYS_BASE	/* physical */ -#define EP7211_PHYS_FLASH2		CS1_PHYS_BASE	/* physical */ - -#define EP7211_VIRT_FLASH1		(0xfa000000)	/* virtual */ -#define EP7211_VIRT_FLASH2		(0xfb000000)	/* virtual */ +/* The extra 8 lines of the keyboard matrix are wired to chip select 3 */ +#define EP7211_PHYS_EXTKBD	CS3_PHYS_BASE  #endif /* CONFIG_ARCH_EDB7211 */ -/* - * Relevant bits in port D, which controls power to the various parts of - * the LCD on the EDB7211. - */ -#define EDB_PD1_LCD_DC_DC_EN	(1<<1) -#define EDB_PD2_LCDEN		(1<<2) -#define EDB_PD3_LCDBL		(1<<3) -  #endif diff --git a/arch/arm/mach-clps711x/include/mach/irqs.h b/arch/arm/mach-clps711x/include/mach/irqs.h deleted file mode 100644 index 14d215f8ca8..00000000000 --- a/arch/arm/mach-clps711x/include/mach/irqs.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - *  arch/arm/mach-clps711x/include/mach/irqs.h - * - *  Copyright (C) 2000 Deep Blue Solutions Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ - -/* - * Interrupts from INTSR1 - */ -#define IRQ_CSINT			4 -#define IRQ_EINT1			5 -#define IRQ_EINT2			6 -#define IRQ_EINT3			7 -#define IRQ_TC1OI			8 -#define IRQ_TC2OI			9 -#define IRQ_RTCMI			10 -#define IRQ_TINT			11 -#define IRQ_UTXINT1			12 -#define IRQ_URXINT1			13 -#define IRQ_UMSINT			14 -#define IRQ_SSEOTI			15 - -#define INT1_IRQS			(0x0000fff0) - -/* - * Interrupts from INTSR2 - */ -#define IRQ_KBDINT			(16+0)	/* bit 0 */ -#define IRQ_SS2RX			(16+1)	/* bit 1 */ -#define IRQ_SS2TX			(16+2)	/* bit 2 */ -#define IRQ_UTXINT2			(16+12)	/* bit 12 */ -#define IRQ_URXINT2			(16+13)	/* bit 13 */ - -#define INT2_IRQS			(0x30070000) - -#define NR_IRQS				30 diff --git a/arch/arm/mach-clps711x/include/mach/syspld.h b/arch/arm/mach-clps711x/include/mach/syspld.h index f7f4c120189..9a433155bf5 100644 --- a/arch/arm/mach-clps711x/include/mach/syspld.h +++ b/arch/arm/mach-clps711x/include/mach/syspld.h @@ -23,14 +23,9 @@  #define __ASM_ARCH_SYSPLD_H  #define SYSPLD_PHYS_BASE	(0x10000000) +#define SYSPLD_VIRT_BASE	IO_ADDRESS(SYSPLD_PHYS_BASE) -#ifndef __ASSEMBLY__ -#include <asm/types.h> - -#define SYSPLD_REG(type,off)	(*(volatile type *)(SYSPLD_BASE + off)) -#else -#define SYSPLD_REG(type,off)	(off) -#endif +#define SYSPLD_REG(type, off)	(*(volatile type *)(SYSPLD_VIRT_BASE + (off)))  #define PLD_INT		SYSPLD_REG(u32, 0x000000)  #define PLD_INT_PENIRQ		(1 << 5) diff --git a/arch/arm/mach-clps711x/p720t.c b/arch/arm/mach-clps711x/p720t.c deleted file mode 100644 index b752b586fc2..00000000000 --- a/arch/arm/mach-clps711x/p720t.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - *  linux/arch/arm/mach-clps711x/p720t.c - * - *  Copyright (C) 2000-2001 Deep Blue Solutions Ltd - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/types.h> -#include <linux/string.h> -#include <linux/mm.h> -#include <linux/io.h> -#include <linux/slab.h> -#include <linux/leds.h> - -#include <mach/hardware.h> -#include <asm/pgtable.h> -#include <asm/page.h> -#include <asm/setup.h> -#include <asm/sizes.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> -#include <asm/mach/map.h> -#include <mach/syspld.h> - -#include <asm/hardware/clps7111.h> - -#include "common.h" - -/* - * Map the P720T system PLD.  It occupies two address spaces: - *  SYSPLD_PHYS_BASE and SYSPLD_PHYS_BASE + 0x00400000 - * We map both here. - */ -static struct map_desc p720t_io_desc[] __initdata = { -	{ -		.virtual	= SYSPLD_VIRT_BASE, -		.pfn		= __phys_to_pfn(SYSPLD_PHYS_BASE), -		.length		= SZ_1M, -		.type		= MT_DEVICE -	}, { -		.virtual	= 0xfe400000, -		.pfn		= __phys_to_pfn(0x10400000), -		.length		= SZ_1M, -		.type		= MT_DEVICE -	} -}; - -static void __init -fixup_p720t(struct tag *tag, char **cmdline, struct meminfo *mi) -{ -	/* -	 * Our bootloader doesn't setup any tags (yet). -	 */ -	if (tag->hdr.tag != ATAG_CORE) { -		tag->hdr.tag = ATAG_CORE; -		tag->hdr.size = tag_size(tag_core); -		tag->u.core.flags = 0; -		tag->u.core.pagesize = PAGE_SIZE; -		tag->u.core.rootdev = 0x0100; - -		tag = tag_next(tag); -		tag->hdr.tag = ATAG_MEM; -		tag->hdr.size = tag_size(tag_mem32); -		tag->u.mem.size = 4096; -		tag->u.mem.start = PHYS_OFFSET; - -		tag = tag_next(tag); -		tag->hdr.tag = ATAG_NONE; -		tag->hdr.size = 0; -	} -} - -static void __init p720t_map_io(void) -{ -	clps711x_map_io(); -	iotable_init(p720t_io_desc, ARRAY_SIZE(p720t_io_desc)); -} - -static void __init p720t_init_early(void) -{ -	/* -	 * Power down as much as possible in case we don't -	 * have the drivers loaded. -	 */ -	PLD_LCDEN = 0; -	PLD_PWR  &= ~(PLD_S4_ON|PLD_S3_ON|PLD_S2_ON|PLD_S1_ON); - -	PLD_KBD   = 0; -	PLD_IO    = 0; -	PLD_IRDA  = 0; -	PLD_CODEC = 0; -	PLD_TCH   = 0; -	PLD_SPI   = 0; -	if (!IS_ENABLED(CONFIG_DEBUG_LL)) { -		PLD_COM2 = 0; -		PLD_COM1 = 0; -	} -} - -/* - * LED controled by CPLD - */ -#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS) -static void p720t_led_set(struct led_classdev *cdev, -			      enum led_brightness b) -{ -	u8 reg = clps_readb(PDDR); - -	if (b != LED_OFF) -		reg |= 0x1; -	else -		reg &= ~0x1; - -	clps_writeb(reg, PDDR); -} - -static enum led_brightness p720t_led_get(struct led_classdev *cdev) -{ -	u8 reg = clps_readb(PDDR); - -	return (reg & 0x1) ? LED_FULL : LED_OFF; -} - -static int __init p720t_leds_init(void) -{ - -	struct led_classdev *cdev; -	int ret; - -	if (!machine_is_p720t()) -		return -ENODEV; - -	cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); -	if (!cdev) -		return -ENOMEM; - -	cdev->name = "p720t:0"; -	cdev->brightness_set = p720t_led_set; -	cdev->brightness_get = p720t_led_get; -	cdev->default_trigger = "heartbeat"; - -	ret = led_classdev_register(NULL, cdev); -	if (ret	< 0) { -		kfree(cdev); -		return ret; -	} - -	return 0; -} - -/* - * Since we may have triggers on any subsystem, defer registration - * until after subsystem_init. - */ -fs_initcall(p720t_leds_init); -#endif - -MACHINE_START(P720T, "ARM-Prospector720T") -	/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ -	.atag_offset	= 0x100, -	.fixup		= fixup_p720t, -	.init_early	= p720t_init_early, -	.map_io		= p720t_map_io, -	.init_irq	= clps711x_init_irq, -	.timer		= &clps711x_timer, -	.restart	= clps711x_restart, -MACHINE_END diff --git a/arch/arm/mach-cns3xxx/Kconfig b/arch/arm/mach-cns3xxx/Kconfig index 29b13f249aa..9ebfcc46feb 100644 --- a/arch/arm/mach-cns3xxx/Kconfig +++ b/arch/arm/mach-cns3xxx/Kconfig @@ -3,7 +3,6 @@ menu "CNS3XXX platform type"  config MACH_CNS3420VB  	bool "Support for CNS3420 Validation Board" -	select MIGHT_HAVE_PCI  	help  	  Include support for the Cavium Networks CNS3420 MPCore Platform  	  Baseboard. diff --git a/arch/arm/mach-cns3xxx/cns3420vb.c b/arch/arm/mach-cns3xxx/cns3420vb.c index 2c5fb4c7e50..ae305397003 100644 --- a/arch/arm/mach-cns3xxx/cns3420vb.c +++ b/arch/arm/mach-cns3xxx/cns3420vb.c @@ -24,6 +24,8 @@  #include <linux/mtd/mtd.h>  #include <linux/mtd/physmap.h>  #include <linux/mtd/partitions.h> +#include <linux/usb/ehci_pdriver.h> +#include <linux/usb/ohci_pdriver.h>  #include <asm/setup.h>  #include <asm/mach-types.h>  #include <asm/hardware/gic.h> @@ -32,6 +34,7 @@  #include <asm/mach/time.h>  #include <mach/cns3xxx.h>  #include <mach/irqs.h> +#include <mach/pm.h>  #include "core.h"  #include "devices.h" @@ -125,13 +128,52 @@ static struct resource cns3xxx_usb_ehci_resources[] = {  static u64 cns3xxx_usb_ehci_dma_mask = DMA_BIT_MASK(32); +static int csn3xxx_usb_power_on(struct platform_device *pdev) +{ +	/* +	 * EHCI and OHCI share the same clock and power, +	 * resetting twice would cause the 1st controller been reset. +	 * Therefore only do power up  at the first up device, and +	 * power down at the last down device. +	 * +	 * Set USB AHB INCR length to 16 +	 */ +	if (atomic_inc_return(&usb_pwr_ref) == 1) { +		cns3xxx_pwr_power_up(1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_USB); +		cns3xxx_pwr_clk_en(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); +		cns3xxx_pwr_soft_rst(1 << PM_SOFT_RST_REG_OFFST_USB_HOST); +		__raw_writel((__raw_readl(MISC_CHIP_CONFIG_REG) | (0X2 << 24)), +			MISC_CHIP_CONFIG_REG); +	} + +	return 0; +} + +static void csn3xxx_usb_power_off(struct platform_device *pdev) +{ +	/* +	 * EHCI and OHCI share the same clock and power, +	 * resetting twice would cause the 1st controller been reset. +	 * Therefore only do power up  at the first up device, and +	 * power down at the last down device. +	 */ +	if (atomic_dec_return(&usb_pwr_ref) == 0) +		cns3xxx_pwr_clk_dis(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); +} + +static struct usb_ehci_pdata cns3xxx_usb_ehci_pdata = { +	.power_on	= csn3xxx_usb_power_on, +	.power_off	= csn3xxx_usb_power_off, +}; +  static struct platform_device cns3xxx_usb_ehci_device = { -	.name          = "cns3xxx-ehci", +	.name          = "ehci-platform",  	.num_resources = ARRAY_SIZE(cns3xxx_usb_ehci_resources),  	.resource      = cns3xxx_usb_ehci_resources,  	.dev           = {  		.dma_mask          = &cns3xxx_usb_ehci_dma_mask,  		.coherent_dma_mask = DMA_BIT_MASK(32), +		.platform_data     = &cns3xxx_usb_ehci_pdata,  	},  }; @@ -149,13 +191,20 @@ static struct resource cns3xxx_usb_ohci_resources[] = {  static u64 cns3xxx_usb_ohci_dma_mask = DMA_BIT_MASK(32); +static struct usb_ohci_pdata cns3xxx_usb_ohci_pdata = { +	.num_ports	= 1, +	.power_on	= csn3xxx_usb_power_on, +	.power_off	= csn3xxx_usb_power_off, +}; +  static struct platform_device cns3xxx_usb_ohci_device = { -	.name          = "cns3xxx-ohci", +	.name          = "ohci-platform",  	.num_resources = ARRAY_SIZE(cns3xxx_usb_ohci_resources),  	.resource      = cns3xxx_usb_ohci_resources,  	.dev           = {  		.dma_mask          = &cns3xxx_usb_ohci_dma_mask,  		.coherent_dma_mask = DMA_BIT_MASK(32), +		.platform_data	   = &cns3xxx_usb_ohci_pdata,  	},  }; diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index 32ee3f89596..d4f4dbfc0e5 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c @@ -11,39 +11,40 @@   * is licensed "as is" without any warranty of any kind, whether express   * or implied.   */ -#include <linux/kernel.h> -#include <linux/init.h>  #include <linux/console.h> +#include <linux/delay.h> +#include <linux/gpio.h> +#include <linux/gpio_keys.h> +#include <linux/init.h> +#include <linux/kernel.h>  #include <linux/i2c.h>  #include <linux/i2c/at24.h>  #include <linux/i2c/pca953x.h>  #include <linux/input.h> +#include <linux/input/tps6507x-ts.h>  #include <linux/mfd/tps6507x.h> -#include <linux/gpio.h> -#include <linux/gpio_keys.h> -#include <linux/platform_device.h>  #include <linux/mtd/mtd.h>  #include <linux/mtd/nand.h>  #include <linux/mtd/partitions.h>  #include <linux/mtd/physmap.h> +#include <linux/platform_device.h> +#include <linux/platform_data/mtd-davinci.h> +#include <linux/platform_data/mtd-davinci-aemif.h> +#include <linux/platform_data/spi-davinci.h> +#include <linux/platform_data/uio_pruss.h>  #include <linux/regulator/machine.h>  #include <linux/regulator/tps6507x.h> -#include <linux/input/tps6507x-ts.h>  #include <linux/spi/spi.h>  #include <linux/spi/flash.h> -#include <linux/delay.h>  #include <linux/wl12xx.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> -#include <asm/system_info.h> -  #include <mach/cp_intc.h>  #include <mach/da8xx.h> -#include <linux/platform_data/mtd-davinci.h>  #include <mach/mux.h> -#include <linux/platform_data/mtd-davinci-aemif.h> -#include <linux/platform_data/spi-davinci.h> + +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <asm/system_info.h>  #include <media/tvp514x.h>  #include <media/adv7343.h> @@ -1516,6 +1517,11 @@ static __init void da850_evm_init(void)  		pr_warning("da850_evm_init: lcdcntl mux setup failed: %d\n",  				ret); +	ret = da8xx_register_uio_pruss(); +	if (ret) +		pr_warn("da850_evm_init: pruss initialization failed: %d\n", +				ret); +  	/* Handle board specific muxing for LCD here */  	ret = davinci_cfg_reg_list(da850_evm_lcdc_pins);  	if (ret) diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index a84dfcbc115..f5e018de7fa 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c @@ -519,13 +519,11 @@ static int dm6444evm_msp430_get_pins(void)  	char buf[4];  	struct i2c_msg msg[2] = {  		{ -			.addr = dm6446evm_msp->addr,  			.flags = 0,  			.len = 2,  			.buf = (void __force *)txbuf,  		},  		{ -			.addr = dm6446evm_msp->addr,  			.flags = I2C_M_RD,  			.len = 4,  			.buf = buf, @@ -536,6 +534,9 @@ static int dm6444evm_msp430_get_pins(void)  	if (!dm6446evm_msp)  		return -ENXIO; +	msg[0].addr = dm6446evm_msp->addr; +	msg[1].addr = dm6446evm_msp->addr; +  	/* Command 4 == get input state, returns port 2 and port3 data  	 *   S Addr W [A] len=2 [A] cmd=4 [A]  	 *   RS Addr R [A] [len=4] A [cmd=4] A [port2] A [port3] N P diff --git a/arch/arm/mach-davinci/devices-tnetv107x.c b/arch/arm/mach-davinci/devices-tnetv107x.c index 29b17f7d3a5..773ab07a71a 100644 --- a/arch/arm/mach-davinci/devices-tnetv107x.c +++ b/arch/arm/mach-davinci/devices-tnetv107x.c @@ -374,7 +374,7 @@ void __init tnetv107x_devices_init(struct tnetv107x_device_info *info)  	 * complete sample conversion in time.  	 */  	tsc_clk = clk_get(NULL, "sys_tsc_clk"); -	if (tsc_clk) { +	if (!IS_ERR(tsc_clk)) {  		error = clk_set_rate(tsc_clk, 5000000);  		WARN_ON(error < 0);  		clk_put(tsc_clk); diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h index 2d9d921e8b0..62ad300440f 100644 --- a/arch/arm/mach-davinci/include/mach/serial.h +++ b/arch/arm/mach-davinci/include/mach/serial.h @@ -38,7 +38,7 @@  #ifndef __ASSEMBLY__  struct davinci_uart_config { -	/* Bit field of UARTs present; bit 0 --> UART1 */ +	/* Bit field of UARTs present; bit 0 --> UART0 */  	unsigned int enabled_uarts;  }; diff --git a/arch/arm/mach-davinci/include/mach/uncompress.h b/arch/arm/mach-davinci/include/mach/uncompress.h index 18cfd497715..3a0ff905a69 100644 --- a/arch/arm/mach-davinci/include/mach/uncompress.h +++ b/arch/arm/mach-davinci/include/mach/uncompress.h @@ -32,6 +32,9 @@ u32 *uart;  /* PORT_16C550A, in polled non-fifo mode */  static void putc(char c)  { +	if (!uart) +		return; +  	while (!(uart[UART_LSR] & UART_LSR_THRE))  		barrier();  	uart[UART_TX] = c; @@ -39,6 +42,9 @@ static void putc(char c)  static inline void flush(void)  { +	if (!uart) +		return; +  	while (!(uart[UART_LSR] & UART_LSR_THRE))  		barrier();  } diff --git a/arch/arm/mach-dove/include/mach/pm.h b/arch/arm/mach-dove/include/mach/pm.h index 7bcd0dfce4b..b47f7503868 100644 --- a/arch/arm/mach-dove/include/mach/pm.h +++ b/arch/arm/mach-dove/include/mach/pm.h @@ -63,7 +63,7 @@ static inline int pmu_to_irq(int pin)  static inline int irq_to_pmu(int irq)  { -	if (IRQ_DOVE_PMU_START < irq && irq < NR_IRQS) +	if (IRQ_DOVE_PMU_START <= irq && irq < NR_IRQS)  		return irq - IRQ_DOVE_PMU_START;  	return -EINVAL; diff --git a/arch/arm/mach-dove/irq.c b/arch/arm/mach-dove/irq.c index 087711524e8..bc4344aa100 100644 --- a/arch/arm/mach-dove/irq.c +++ b/arch/arm/mach-dove/irq.c @@ -46,8 +46,20 @@ static void pmu_irq_ack(struct irq_data *d)  	int pin = irq_to_pmu(d->irq);  	u32 u; +	/* +	 * The PMU mask register is not RW0C: it is RW.  This means that +	 * the bits take whatever value is written to them; if you write +	 * a '1', you will set the interrupt. +	 * +	 * Unfortunately this means there is NO race free way to clear +	 * these interrupts. +	 * +	 * So, let's structure the code so that the window is as small as +	 * possible. +	 */  	u = ~(1 << (pin & 31)); -	writel(u, PMU_INTERRUPT_CAUSE); +	u &= readl_relaxed(PMU_INTERRUPT_CAUSE); +	writel_relaxed(u, PMU_INTERRUPT_CAUSE);  }  static struct irq_chip pmu_irq_chip = { diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig index bb3b09aa918..91d5b6f1d5a 100644 --- a/arch/arm/mach-exynos/Kconfig +++ b/arch/arm/mach-exynos/Kconfig @@ -68,6 +68,15 @@ config SOC_EXYNOS5250  	help  	  Enable EXYNOS5250 SoC support +config SOC_EXYNOS5440 +	bool "SAMSUNG EXYNOS5440" +	default y +	depends on ARCH_EXYNOS5 +	select ARM_ARCH_TIMER +	select AUTO_ZRELADDR +	help +	  Enable EXYNOS5440 SoC support +  config EXYNOS4_MCT  	bool  	default y @@ -99,11 +108,6 @@ config EXYNOS_DEV_SYSMMU  	help  	  Common setup code for SYSTEM MMU in EXYNOS platforms -config EXYNOS4_DEV_DWMCI -	bool -	help -	  Compile in platform device definitions for DWMCI -  config EXYNOS4_DEV_USB_OHCI  	bool  	help @@ -418,9 +422,9 @@ config MACH_EXYNOS4_DT  config MACH_EXYNOS5_DT  	bool "SAMSUNG EXYNOS5 Machine using device tree" +	default y  	depends on ARCH_EXYNOS5  	select ARM_AMBA -	select SOC_EXYNOS5250  	select USE_OF  	help  	  Machine support for Samsung EXYNOS5 machine with device tree enabled. diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile index 1797dee88a0..b189881657e 100644 --- a/arch/arm/mach-exynos/Makefile +++ b/arch/arm/mach-exynos/Makefile @@ -14,9 +14,9 @@ obj-				:=  obj-$(CONFIG_ARCH_EXYNOS)	+= common.o  obj-$(CONFIG_ARCH_EXYNOS4)	+= clock-exynos4.o -obj-$(CONFIG_ARCH_EXYNOS5)	+= clock-exynos5.o  obj-$(CONFIG_CPU_EXYNOS4210)	+= clock-exynos4210.o  obj-$(CONFIG_SOC_EXYNOS4212)	+= clock-exynos4212.o +obj-$(CONFIG_SOC_EXYNOS5250)	+= clock-exynos5.o  obj-$(CONFIG_PM)		+= pm.o  obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o @@ -50,7 +50,6 @@ obj-$(CONFIG_MACH_EXYNOS5_DT)		+= mach-exynos5-dt.o  obj-y					+= dev-uart.o  obj-$(CONFIG_ARCH_EXYNOS4)		+= dev-audio.o  obj-$(CONFIG_EXYNOS4_DEV_AHCI)		+= dev-ahci.o -obj-$(CONFIG_EXYNOS4_DEV_DWMCI)		+= dev-dwmci.o  obj-$(CONFIG_EXYNOS_DEV_DMA)		+= dma.o  obj-$(CONFIG_EXYNOS4_DEV_USB_OHCI)	+= dev-ohci.o  obj-$(CONFIG_EXYNOS_DEV_SYSMMU)		+= dev-sysmmu.o diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index 454bc6ed9a8..ddd4b72c6f9 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c @@ -18,6 +18,7 @@  #include <linux/sched.h>  #include <linux/serial_core.h>  #include <linux/of.h> +#include <linux/of_fdt.h>  #include <linux/of_irq.h>  #include <linux/export.h>  #include <linux/irqdomain.h> @@ -58,9 +59,11 @@ static const char name_exynos4210[] = "EXYNOS4210";  static const char name_exynos4212[] = "EXYNOS4212";  static const char name_exynos4412[] = "EXYNOS4412";  static const char name_exynos5250[] = "EXYNOS5250"; +static const char name_exynos5440[] = "EXYNOS5440";  static void exynos4_map_io(void);  static void exynos5_map_io(void); +static void exynos5440_map_io(void);  static void exynos4_init_clocks(int xtal);  static void exynos5_init_clocks(int xtal);  static void exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no); @@ -98,6 +101,12 @@ static struct cpu_table cpu_ids[] __initdata = {  		.init_clocks	= exynos5_init_clocks,  		.init		= exynos_init,  		.name		= name_exynos5250, +	}, { +		.idcode		= EXYNOS5440_SOC_ID, +		.idmask		= EXYNOS5_SOC_MASK, +		.map_io		= exynos5440_map_io, +		.init		= exynos_init, +		.name		= name_exynos5440,  	},  }; @@ -112,6 +121,17 @@ static struct map_desc exynos_iodesc[] __initdata = {  	},  }; +#ifdef CONFIG_ARCH_EXYNOS5 +static struct map_desc exynos5440_iodesc[] __initdata = { +	{ +		.virtual	= (unsigned long)S5P_VA_CHIPID, +		.pfn		= __phys_to_pfn(EXYNOS5440_PA_CHIPID), +		.length		= SZ_4K, +		.type		= MT_DEVICE, +	}, +}; +#endif +  static struct map_desc exynos4_iodesc[] __initdata = {  	{  		.virtual	= (unsigned long)S3C_VA_SYS, @@ -263,6 +283,15 @@ static struct map_desc exynos5_iodesc[] __initdata = {  	},  }; +static struct map_desc exynos5440_iodesc0[] __initdata = { +	{ +		.virtual	= (unsigned long)S3C_VA_UART, +		.pfn		= __phys_to_pfn(EXYNOS5440_PA_UART0), +		.length		= SZ_512K, +		.type		= MT_DEVICE, +	}, +}; +  void exynos4_restart(char mode, const char *cmd)  {  	__raw_writel(0x1, S5P_SWRESET); @@ -270,11 +299,29 @@ void exynos4_restart(char mode, const char *cmd)  void exynos5_restart(char mode, const char *cmd)  { -	__raw_writel(0x1, EXYNOS_SWRESET); +	u32 val; +	void __iomem *addr; + +	if (of_machine_is_compatible("samsung,exynos5250")) { +		val = 0x1; +		addr = EXYNOS_SWRESET; +	} else if (of_machine_is_compatible("samsung,exynos5440")) { +		val = (0x10 << 20) | (0x1 << 16); +		addr = EXYNOS5440_SWRESET; +	} else { +		pr_err("%s: cannot support non-DT\n", __func__); +		return; +	} + +	__raw_writel(val, addr);  }  void __init exynos_init_late(void)  { +	if (of_machine_is_compatible("samsung,exynos5440")) +		/* to be supported later */ +		return; +  	exynos_pm_late_initcall();  } @@ -286,8 +333,20 @@ void __init exynos_init_late(void)  void __init exynos_init_io(struct map_desc *mach_desc, int size)  { +	struct map_desc *iodesc = exynos_iodesc; +	int iodesc_sz = ARRAY_SIZE(exynos_iodesc); +#if defined(CONFIG_OF) && defined(CONFIG_ARCH_EXYNOS5) +	unsigned long root = of_get_flat_dt_root(); +  	/* initialize the io descriptors we need for initialization */ -	iotable_init(exynos_iodesc, ARRAY_SIZE(exynos_iodesc)); +	if (of_flat_dt_is_compatible(root, "samsung,exynos5440")) { +		iodesc = exynos5440_iodesc; +		iodesc_sz = ARRAY_SIZE(exynos5440_iodesc); +	} +#endif + +	iotable_init(iodesc, iodesc_sz); +  	if (mach_desc)  		iotable_init(mach_desc, size); @@ -356,6 +415,11 @@ static void __init exynos4_init_clocks(int xtal)  	exynos4_setup_clocks();  } +static void __init exynos5440_map_io(void) +{ +	iotable_init(exynos5440_iodesc0, ARRAY_SIZE(exynos5440_iodesc0)); +} +  static void __init exynos5_init_clocks(int xtal)  {  	printk(KERN_DEBUG "%s: initializing clocks\n", __func__); @@ -572,8 +636,9 @@ static int __init combiner_of_init(struct device_node *np,  	return 0;  } -static const struct of_device_id exynos4_dt_irq_match[] = { +static const struct of_device_id exynos_dt_irq_match[] = {  	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, +	{ .compatible = "arm,cortex-a15-gic", .data = gic_of_init, },  	{ .compatible = "samsung,exynos4210-combiner",  			.data = combiner_of_init, },  	{}, @@ -590,7 +655,7 @@ void __init exynos4_init_irq(void)  		gic_init_bases(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU, gic_bank_offset, NULL);  #ifdef CONFIG_OF  	else -		of_irq_init(exynos4_dt_irq_match); +		of_irq_init(exynos_dt_irq_match);  #endif  	if (!of_have_populated_dt()) @@ -607,7 +672,7 @@ void __init exynos4_init_irq(void)  void __init exynos5_init_irq(void)  {  #ifdef CONFIG_OF -	of_irq_init(exynos4_dt_irq_match); +	of_irq_init(exynos_dt_irq_match);  #endif  	/*  	 * The parameters of s5p_init_irq() are for VIC init. @@ -639,7 +704,7 @@ static int __init exynos4_l2x0_cache_init(void)  {  	int ret; -	if (soc_is_exynos5250()) +	if (soc_is_exynos5250() || soc_is_exynos5440())  		return 0;  	ret = l2x0_of_init(L2_AUX_VAL, L2_AUX_MASK); @@ -973,6 +1038,8 @@ static int __init exynos_init_irq_eint(void)  		}  	}  #endif +	if (soc_is_exynos5440()) +		return 0;  	if (soc_is_exynos5250())  		exynos_eint_base = ioremap(EXYNOS5_PA_GPIO1, SZ_4K); diff --git a/arch/arm/mach-exynos/dev-dwmci.c b/arch/arm/mach-exynos/dev-dwmci.c deleted file mode 100644 index 79035018fb7..00000000000 --- a/arch/arm/mach-exynos/dev-dwmci.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * linux/arch/arm/mach-exynos4/dev-dwmci.c - * - * Copyright (c) 2011 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * Platform device for Synopsys DesignWare Mobile Storage IP - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#include <linux/kernel.h> -#include <linux/dma-mapping.h> -#include <linux/platform_device.h> -#include <linux/interrupt.h> -#include <linux/ioport.h> -#include <linux/mmc/dw_mmc.h> - -#include <plat/devs.h> - -#include <mach/map.h> - -static int exynos4_dwmci_get_bus_wd(u32 slot_id) -{ -	return 4; -} - -static int exynos4_dwmci_init(u32 slot_id, irq_handler_t handler, void *data) -{ -	return 0; -} - -static struct resource exynos4_dwmci_resource[] = { -	[0] = DEFINE_RES_MEM(EXYNOS4_PA_DWMCI, SZ_4K), -	[1] = DEFINE_RES_IRQ(EXYNOS4_IRQ_DWMCI), -}; - -static struct dw_mci_board exynos4_dwci_pdata = { -	.num_slots			= 1, -	.quirks				= DW_MCI_QUIRK_BROKEN_CARD_DETECTION, -	.bus_hz				= 80 * 1000 * 1000, -	.detect_delay_ms	= 200, -	.init				= exynos4_dwmci_init, -	.get_bus_wd			= exynos4_dwmci_get_bus_wd, -}; - -static u64 exynos4_dwmci_dmamask = DMA_BIT_MASK(32); - -struct platform_device exynos4_device_dwmci = { -	.name		= "dw_mmc", -	.id		= -1, -	.num_resources	= ARRAY_SIZE(exynos4_dwmci_resource), -	.resource	= exynos4_dwmci_resource, -	.dev		= { -		.dma_mask		= &exynos4_dwmci_dmamask, -		.coherent_dma_mask	= DMA_BIT_MASK(32), -		.platform_data	= &exynos4_dwci_pdata, -	}, -}; - -void __init exynos4_dwmci_set_platdata(struct dw_mci_board *pd) -{ -	struct dw_mci_board *npd; - -	npd = s3c_set_platdata(pd, sizeof(struct dw_mci_board), -			&exynos4_device_dwmci); - -	if (!npd->init) -		npd->init = exynos4_dwmci_init; -	if (!npd->get_bus_wd) -		npd->get_bus_wd = exynos4_dwmci_get_bus_wd; -} diff --git a/arch/arm/mach-exynos/include/mach/dwmci.h b/arch/arm/mach-exynos/include/mach/dwmci.h deleted file mode 100644 index 7ce657459cc..00000000000 --- a/arch/arm/mach-exynos/include/mach/dwmci.h +++ /dev/null @@ -1,20 +0,0 @@ -/* linux/arch/arm/mach-exynos4/include/mach/dwmci.h - * - * Copyright (c) 2011 Samsung Electronics Co., Ltd. - *		http://www.samsung.com/ - * - * Synopsys DesignWare Mobile Storage for EXYNOS4210 - * - * 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 __ASM_ARM_ARCH_DWMCI_H -#define __ASM_ARM_ARCH_DWMCI_H __FILE__ - -#include <linux/mmc/dw_mmc.h> - -extern void exynos4_dwmci_set_platdata(struct dw_mci_board *pd); - -#endif /* __ASM_ARM_ARCH_DWMCI_H */ diff --git a/arch/arm/mach-exynos/include/mach/irqs.h b/arch/arm/mach-exynos/include/mach/irqs.h index 5d44616c201..1f4dc35cd4b 100644 --- a/arch/arm/mach-exynos/include/mach/irqs.h +++ b/arch/arm/mach-exynos/include/mach/irqs.h @@ -331,6 +331,11 @@  #define EXYNOS5_IRQ_FIMC_LITE1		IRQ_SPI(126)  #define EXYNOS5_IRQ_RP_TIMER		IRQ_SPI(127) +/* EXYNOS5440 */ + +#define EXYNOS5440_IRQ_UART0		IRQ_SPI(2) +#define EXYNOS5440_IRQ_UART1		IRQ_SPI(3) +  #define EXYNOS5_IRQ_PMU			COMBINER_IRQ(1, 2)  #define EXYNOS5_IRQ_SYSMMU_GSC0_0	COMBINER_IRQ(2, 0) diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h index 9f180aa3a84..1df6abbf53b 100644 --- a/arch/arm/mach-exynos/include/mach/map.h +++ b/arch/arm/mach-exynos/include/mach/map.h @@ -53,6 +53,7 @@  #define EXYNOS4_PA_ONENAND_DMA		0x0C600000  #define EXYNOS_PA_CHIPID		0x10000000 +#define EXYNOS5440_PA_CHIPID		0x00160000  #define EXYNOS4_PA_SYSCON		0x10010000  #define EXYNOS5_PA_SYSCON		0x10050100 @@ -283,6 +284,10 @@  #define EXYNOS5_PA_UART2		0x12C20000  #define EXYNOS5_PA_UART3		0x12C30000 +#define EXYNOS5440_PA_UART0		0x000B0000 +#define EXYNOS5440_PA_UART1		0x000C0000 +#define EXYNOS5440_SZ_UART		SZ_256 +  #define S3C_VA_UARTx(x)			(S3C_VA_UART + ((x) * S3C_UART_OFFSET))  #endif /* __ASM_ARCH_MAP_H */ diff --git a/arch/arm/mach-exynos/include/mach/regs-mem.h b/arch/arm/mach-exynos/include/mach/regs-mem.h deleted file mode 100644 index 0368b5a2725..00000000000 --- a/arch/arm/mach-exynos/include/mach/regs-mem.h +++ /dev/null @@ -1,23 +0,0 @@ -/* linux/arch/arm/mach-exynos4/include/mach/regs-mem.h - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * EXYNOS4 - SROMC and DMC register definitions - * - * 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 __ASM_ARCH_REGS_MEM_H -#define __ASM_ARCH_REGS_MEM_H __FILE__ - -#include <mach/map.h> - -#define S5P_DMC0_MEMCON_OFFSET		0x04 - -#define S5P_DMC0_MEMTYPE_SHIFT		8 -#define S5P_DMC0_MEMTYPE_MASK		0xF - -#endif /* __ASM_ARCH_REGS_MEM_H */ diff --git a/arch/arm/mach-exynos/include/mach/regs-pmu.h b/arch/arm/mach-exynos/include/mach/regs-pmu.h index 70b2795f528..84428e72cf5 100644 --- a/arch/arm/mach-exynos/include/mach/regs-pmu.h +++ b/arch/arm/mach-exynos/include/mach/regs-pmu.h @@ -31,6 +31,7 @@  #define S5P_SWRESET				S5P_PMUREG(0x0400)  #define EXYNOS_SWRESET				S5P_PMUREG(0x0400) +#define EXYNOS5440_SWRESET			S5P_PMUREG(0x00C4)  #define S5P_WAKEUP_STAT				S5P_PMUREG(0x0600)  #define S5P_EINT_WAKEUP_MASK			S5P_PMUREG(0x0604) diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c index 8858068d2b6..92757ff817a 100644 --- a/arch/arm/mach-exynos/mach-exynos4-dt.c +++ b/arch/arm/mach-exynos/mach-exynos4-dt.c @@ -77,6 +77,7 @@ static const struct of_dev_auxdata exynos4_auxdata_lookup[] __initconst = {  				"exynos4210-spi.2", NULL),  	OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_PDMA0, "dma-pl330.0", NULL),  	OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_PDMA1, "dma-pl330.1", NULL), +	OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_MDMA1, "dma-pl330.2", NULL),  	OF_DEV_AUXDATA("samsung,exynos4210-tmu", EXYNOS4_PA_TMU,  				"exynos-tmu", NULL),  	{}, diff --git a/arch/arm/mach-exynos/mach-exynos5-dt.c b/arch/arm/mach-exynos/mach-exynos5-dt.c index 25f464cf797..929de766d49 100644 --- a/arch/arm/mach-exynos/mach-exynos5-dt.c +++ b/arch/arm/mach-exynos/mach-exynos5-dt.c @@ -10,6 +10,7 @@  */  #include <linux/of_platform.h> +#include <linux/of_fdt.h>  #include <linux/serial_core.h>  #include <linux/memblock.h>  #include <linux/of_fdt.h> @@ -105,20 +106,35 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = {  	{},  }; -static void __init exynos5250_dt_map_io(void) +static const struct of_dev_auxdata exynos5440_auxdata_lookup[] __initconst = { +	OF_DEV_AUXDATA("samsung,exynos4210-uart", EXYNOS5440_PA_UART0, +				"exynos4210-uart.0", NULL), +	{}, +}; + +static void __init exynos5_dt_map_io(void)  { +	unsigned long root = of_get_flat_dt_root(); +  	exynos_init_io(NULL, 0); -	s3c24xx_init_clocks(24000000); + +	if (of_flat_dt_is_compatible(root, "samsung,exynos5250")) +		s3c24xx_init_clocks(24000000);  } -static void __init exynos5250_dt_machine_init(void) +static void __init exynos5_dt_machine_init(void)  { -	of_platform_populate(NULL, of_default_bus_match_table, -				exynos5250_auxdata_lookup, NULL); +	if (of_machine_is_compatible("samsung,exynos5250")) +		of_platform_populate(NULL, of_default_bus_match_table, +				     exynos5250_auxdata_lookup, NULL); +	else if (of_machine_is_compatible("samsung,exynos5440")) +		of_platform_populate(NULL, of_default_bus_match_table, +				     exynos5440_auxdata_lookup, NULL);  } -static char const *exynos5250_dt_compat[] __initdata = { +static char const *exynos5_dt_compat[] __initdata = {  	"samsung,exynos5250", +	"samsung,exynos5440",  	NULL  }; @@ -137,12 +153,12 @@ DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)")  	/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */  	.init_irq	= exynos5_init_irq,  	.smp		= smp_ops(exynos_smp_ops), -	.map_io		= exynos5250_dt_map_io, +	.map_io		= exynos5_dt_map_io,  	.handle_irq	= gic_handle_irq, -	.init_machine	= exynos5250_dt_machine_init, +	.init_machine	= exynos5_dt_machine_init,  	.init_late	= exynos_init_late,  	.timer		= &exynos4_timer, -	.dt_compat	= exynos5250_dt_compat, +	.dt_compat	= exynos5_dt_compat,  	.restart        = exynos5_restart,  	.reserve	= exynos5_reserve,  MACHINE_END diff --git a/arch/arm/mach-exynos/mach-origen.c b/arch/arm/mach-exynos/mach-origen.c index c931ce15a96..e6f4191cd14 100644 --- a/arch/arm/mach-exynos/mach-origen.c +++ b/arch/arm/mach-exynos/mach-origen.c @@ -100,6 +100,7 @@ static struct regulator_consumer_supply __initdata ldo3_consumer[] = {  	REGULATOR_SUPPLY("vddcore", "s5p-mipi-csis.0"), /* MIPI */  	REGULATOR_SUPPLY("vdd", "exynos4-hdmi"), /* HDMI */  	REGULATOR_SUPPLY("vdd_pll", "exynos4-hdmi"), /* HDMI */ +	REGULATOR_SUPPLY("vusb_a", "s3c-hsotg"), /* OTG */  };  static struct regulator_consumer_supply __initdata ldo6_consumer[] = {  	REGULATOR_SUPPLY("vddio", "s5p-mipi-csis.0"), /* MIPI */ @@ -110,6 +111,7 @@ static struct regulator_consumer_supply __initdata ldo7_consumer[] = {  static struct regulator_consumer_supply __initdata ldo8_consumer[] = {  	REGULATOR_SUPPLY("vdd", "s5p-adc"), /* ADC */  	REGULATOR_SUPPLY("vdd_osc", "exynos4-hdmi"), /* HDMI */ +	REGULATOR_SUPPLY("vusb_d", "s3c-hsotg"), /* OTG */  };  static struct regulator_consumer_supply __initdata ldo9_consumer[] = {  	REGULATOR_SUPPLY("dvdd", "swb-a31"), /* AR6003 WLAN & CSR 8810 BT */ diff --git a/arch/arm/mach-exynos/mct.c b/arch/arm/mach-exynos/mct.c index b601fb8a408..57668eb68e7 100644 --- a/arch/arm/mach-exynos/mct.c +++ b/arch/arm/mach-exynos/mct.c @@ -19,7 +19,9 @@  #include <linux/platform_device.h>  #include <linux/delay.h>  #include <linux/percpu.h> +#include <linux/of.h> +#include <asm/arch_timer.h>  #include <asm/hardware/gic.h>  #include <asm/localtimer.h> @@ -476,8 +478,13 @@ static void __init exynos4_timer_resources(void)  #endif /* CONFIG_LOCAL_TIMERS */  } -static void __init exynos4_timer_init(void) +static void __init exynos_timer_init(void)  { +	if (soc_is_exynos5440()) { +		arch_timer_of_register(); +		return; +	} +  	if ((soc_is_exynos4210()) || (soc_is_exynos5250()))  		mct_int_type = MCT_INT_SPI;  	else @@ -489,5 +496,5 @@ static void __init exynos4_timer_init(void)  }  struct sys_timer exynos4_timer = { -	.init		= exynos4_timer_init, +	.init		= exynos_timer_init,  }; diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index f93d820ecab..4ca8ff14a5b 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c @@ -36,8 +36,22 @@  extern void exynos4_secondary_startup(void); -#define CPU1_BOOT_REG		(samsung_rev() == EXYNOS4210_REV_1_1 ? \ -				S5P_INFORM5 : S5P_VA_SYSRAM) +static inline void __iomem *cpu_boot_reg_base(void) +{ +	if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_1_1) +		return S5P_INFORM5; +	return S5P_VA_SYSRAM; +} + +static inline void __iomem *cpu_boot_reg(int cpu) +{ +	void __iomem *boot_reg; + +	boot_reg = cpu_boot_reg_base(); +	if (soc_is_exynos4412()) +		boot_reg += 4*cpu; +	return boot_reg; +}  /*   * Write pen_release in a way that is guaranteed to be visible to all @@ -84,6 +98,7 @@ static void __cpuinit exynos_secondary_init(unsigned int cpu)  static int __cpuinit exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)  {  	unsigned long timeout; +	unsigned long phys_cpu = cpu_logical_map(cpu);  	/*  	 * Set synchronisation state between this boot processor @@ -99,7 +114,7 @@ static int __cpuinit exynos_boot_secondary(unsigned int cpu, struct task_struct  	 * Note that "pen_release" is the hardware CPU ID, whereas  	 * "cpu" is Linux's internal ID.  	 */ -	write_pen_release(cpu_logical_map(cpu)); +	write_pen_release(phys_cpu);  	if (!(__raw_readl(S5P_ARM_CORE1_STATUS) & S5P_CORE_LOCAL_PWR_EN)) {  		__raw_writel(S5P_CORE_LOCAL_PWR_EN, @@ -133,7 +148,7 @@ static int __cpuinit exynos_boot_secondary(unsigned int cpu, struct task_struct  		smp_rmb();  		__raw_writel(virt_to_phys(exynos4_secondary_startup), -			CPU1_BOOT_REG); +							cpu_boot_reg(phys_cpu));  		gic_raise_softirq(cpumask_of(cpu), 0);  		if (pen_release == -1) @@ -181,6 +196,8 @@ static void __init exynos_smp_init_cpus(void)  static void __init exynos_smp_prepare_cpus(unsigned int max_cpus)  { +	int i; +  	if (!soc_is_exynos5250())  		scu_enable(scu_base_addr()); @@ -190,8 +207,9 @@ static void __init exynos_smp_prepare_cpus(unsigned int max_cpus)  	 * until it receives a soft interrupt, and then the  	 * secondary CPU branches to this address.  	 */ -	__raw_writel(virt_to_phys(exynos4_secondary_startup), -			CPU1_BOOT_REG); +	for (i = 1; i < max_cpus; ++i) +		__raw_writel(virt_to_phys(exynos4_secondary_startup), +					cpu_boot_reg(cpu_logical_map(i)));  }  struct smp_operations exynos_smp_ops __initdata = { diff --git a/arch/arm/mach-exynos/setup-i2c0.c b/arch/arm/mach-exynos/setup-i2c0.c index 5700f23629f..e2d9dfbf102 100644 --- a/arch/arm/mach-exynos/setup-i2c0.c +++ b/arch/arm/mach-exynos/setup-i2c0.c @@ -20,7 +20,7 @@ struct platform_device; /* don't need the contents */  void s3c_i2c0_cfg_gpio(struct platform_device *dev)  { -	if (soc_is_exynos5250()) +	if (soc_is_exynos5250() || soc_is_exynos5440())  		/* will be implemented with gpio function */  		return; diff --git a/arch/arm/mach-highbank/Kconfig b/arch/arm/mach-highbank/Kconfig index 0e1d0a42a3e..551c97e87a7 100644 --- a/arch/arm/mach-highbank/Kconfig +++ b/arch/arm/mach-highbank/Kconfig @@ -1,5 +1,5 @@  config ARCH_HIGHBANK -	bool "Calxeda ECX-1000 (Highbank)" if ARCH_MULTI_V7 +	bool "Calxeda ECX-1000/2000 (Highbank/Midway)" if ARCH_MULTI_V7  	select ARCH_WANT_OPTIONAL_GPIOLIB  	select ARM_AMBA  	select ARM_GIC diff --git a/arch/arm/mach-highbank/Makefile b/arch/arm/mach-highbank/Makefile index 3ec8bdd25d0..8a1ef576d79 100644 --- a/arch/arm/mach-highbank/Makefile +++ b/arch/arm/mach-highbank/Makefile @@ -3,7 +3,6 @@ obj-y					:= highbank.o system.o smc.o  plus_sec := $(call as-instr,.arch_extension sec,+sec)  AFLAGS_smc.o				:=-Wa,-march=armv7-a$(plus_sec) -obj-$(CONFIG_DEBUG_HIGHBANK_UART)	+= lluart.o  obj-$(CONFIG_SMP)			+= platsmp.o  obj-$(CONFIG_HOTPLUG_CPU)		+= hotplug.o  obj-$(CONFIG_PM_SLEEP)			+= pm.o diff --git a/arch/arm/mach-highbank/core.h b/arch/arm/mach-highbank/core.h index 286ec82a4f6..80235b46cb5 100644 --- a/arch/arm/mach-highbank/core.h +++ b/arch/arm/mach-highbank/core.h @@ -1,12 +1,10 @@ +#ifndef __HIGHBANK_CORE_H +#define __HIGHBANK_CORE_H +  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); -#else -static inline void highbank_lluart_map_io(void) {} -#endif  #ifdef CONFIG_PM_SLEEP  extern void highbank_pm_init(void); @@ -18,3 +16,5 @@ extern void highbank_smc1(int fn, int arg);  extern void highbank_cpu_die(unsigned int cpu);  extern struct smp_operations highbank_smp_ops; + +#endif diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index 40e36a50304..dc248167d20 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c @@ -26,9 +26,9 @@  #include <linux/smp.h>  #include <linux/amba/bus.h> +#include <asm/arch_timer.h>  #include <asm/cacheflush.h>  #include <asm/smp_plat.h> -#include <asm/smp_scu.h>  #include <asm/smp_twd.h>  #include <asm/hardware/arm_timer.h>  #include <asm/hardware/timer-sp.h> @@ -42,16 +42,7 @@  #include "sysregs.h"  void __iomem *sregs_base; - -#define HB_SCU_VIRT_BASE	0xfee00000 -void __iomem *scu_base_addr = ((void __iomem *)(HB_SCU_VIRT_BASE)); - -static struct map_desc scu_io_desc __initdata = { -	.virtual	= HB_SCU_VIRT_BASE, -	.pfn		= 0, /* run-time */ -	.length		= SZ_4K, -	.type		= MT_DEVICE, -}; +void __iomem *scu_base_addr;  static void __init highbank_scu_map_io(void)  { @@ -60,14 +51,7 @@ static void __init highbank_scu_map_io(void)  	/* Get SCU base */  	asm("mrc p15, 4, %0, c15, c0, 0" : "=r" (base)); -	scu_io_desc.pfn = __phys_to_pfn(base); -	iotable_init(&scu_io_desc, 1); -} - -static void __init highbank_map_io(void) -{ -	highbank_scu_map_io(); -	highbank_lluart_map_io(); +	scu_base_addr = ioremap(base, SZ_4K);  }  #define HB_JUMP_TABLE_PHYS(cpu)		(0x40 + (0x10 * (cpu))) @@ -83,6 +67,7 @@ void highbank_set_cpu_jump(int cpu, void *jump_addr)  }  const static struct of_device_id irq_match[] = { +	{ .compatible = "arm,cortex-a15-gic", .data = gic_of_init, },  	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, },  	{}  }; @@ -99,6 +84,9 @@ static void __init highbank_init_irq(void)  {  	of_irq_init(irq_match); +	if (of_find_compatible_node(NULL, NULL, "arm,cortex-a9")) +		highbank_scu_map_io(); +  #ifdef CONFIG_CACHE_L2X0  	/* Enable PL310 L2 Cache controller */  	highbank_smc1(0x102, 0x1); @@ -136,6 +124,9 @@ static void __init highbank_timer_init(void)  	sp804_clockevents_init(timer_base, irq, "timer0");  	twd_local_timer_of_register(); + +	arch_timer_of_register(); +	arch_timer_sched_clock_init();  }  static struct sys_timer highbank_timer = { @@ -145,7 +136,6 @@ static struct sys_timer highbank_timer = {  static void highbank_power_off(void)  {  	hignbank_set_pwr_shutdown(); -	scu_power_mode(scu_base_addr, SCU_PM_POWEROFF);  	while (1)  		cpu_do_idle(); @@ -211,12 +201,13 @@ static void __init highbank_init(void)  static const char *highbank_match[] __initconst = {  	"calxeda,highbank", +	"calxeda,ecx-2000",  	NULL,  };  DT_MACHINE_START(HIGHBANK, "Highbank")  	.smp		= smp_ops(highbank_smp_ops), -	.map_io		= highbank_map_io, +	.map_io		= debug_ll_io_init,  	.init_irq	= highbank_init_irq,  	.timer		= &highbank_timer,  	.handle_irq	= gic_handle_irq, diff --git a/arch/arm/mach-highbank/hotplug.c b/arch/arm/mach-highbank/hotplug.c index 2c1b8c3c8e4..7b60faccd55 100644 --- a/arch/arm/mach-highbank/hotplug.c +++ b/arch/arm/mach-highbank/hotplug.c @@ -14,13 +14,11 @@   * this program.  If not, see <http://www.gnu.org/licenses/>.   */  #include <linux/kernel.h> -#include <linux/errno.h> -#include <linux/smp.h> -#include <asm/smp_scu.h>  #include <asm/cacheflush.h>  #include "core.h" +#include "sysregs.h"  extern void secondary_startup(void); @@ -33,7 +31,7 @@ void __ref highbank_cpu_die(unsigned int cpu)  	flush_cache_all();  	highbank_set_cpu_jump(cpu, secondary_startup); -	scu_power_mode(scu_base_addr, SCU_PM_POWEROFF); +	highbank_set_core_pwr();  	cpu_do_idle(); diff --git a/arch/arm/mach-highbank/lluart.c b/arch/arm/mach-highbank/lluart.c deleted file mode 100644 index 371575019f3..00000000000 --- a/arch/arm/mach-highbank/lluart.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2011 Calxeda, Inc. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program.  If not, see <http://www.gnu.org/licenses/>. - */ -#include <linux/init.h> -#include <asm/page.h> -#include <asm/sizes.h> -#include <asm/mach/map.h> - -#define HB_DEBUG_LL_PHYS_BASE	0xfff36000 -#define HB_DEBUG_LL_VIRT_BASE	0xfee36000 - -static struct map_desc lluart_io_desc __initdata = { -	.virtual	= HB_DEBUG_LL_VIRT_BASE, -	.pfn		= __phys_to_pfn(HB_DEBUG_LL_PHYS_BASE), -	.length		= SZ_4K, -	.type		= MT_DEVICE, -}; - -void __init highbank_lluart_map_io(void) -{ -	iotable_init(&lluart_io_desc, 1); -} diff --git a/arch/arm/mach-highbank/platsmp.c b/arch/arm/mach-highbank/platsmp.c index fa9560ec6e7..1129957f6c1 100644 --- a/arch/arm/mach-highbank/platsmp.c +++ b/arch/arm/mach-highbank/platsmp.c @@ -42,9 +42,7 @@ static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struc   */  static void __init highbank_smp_init_cpus(void)  { -	unsigned int i, ncores; - -	ncores = scu_get_core_count(scu_base_addr); +	unsigned int i, ncores = 4;  	/* sanity check */  	if (ncores > NR_CPUS) { @@ -65,7 +63,8 @@ static void __init highbank_smp_prepare_cpus(unsigned int max_cpus)  {  	int i; -	scu_enable(scu_base_addr); +	if (scu_base_addr) +		scu_enable(scu_base_addr);  	/*  	 * Write the address of secondary startup into the jump table diff --git a/arch/arm/mach-highbank/pm.c b/arch/arm/mach-highbank/pm.c index de866f21331..74aa135966f 100644 --- a/arch/arm/mach-highbank/pm.c +++ b/arch/arm/mach-highbank/pm.c @@ -19,7 +19,6 @@  #include <linux/suspend.h>  #include <asm/proc-fns.h> -#include <asm/smp_scu.h>  #include <asm/suspend.h>  #include "core.h" @@ -35,8 +34,6 @@ static int highbank_pm_enter(suspend_state_t state)  {  	hignbank_set_pwr_suspend();  	highbank_set_cpu_jump(0, cpu_resume); - -	scu_power_mode(scu_base_addr, SCU_PM_POWEROFF);  	cpu_suspend(0, highbank_suspend_finish);  	return 0; diff --git a/arch/arm/mach-highbank/sysregs.h b/arch/arm/mach-highbank/sysregs.h index 0e913389f44..e13e8ea7c6c 100644 --- a/arch/arm/mach-highbank/sysregs.h +++ b/arch/arm/mach-highbank/sysregs.h @@ -17,6 +17,10 @@  #define _MACH_HIGHBANK__SYSREGS_H_  #include <linux/io.h> +#include <linux/smp.h> +#include <asm/smp_plat.h> +#include <asm/smp_scu.h> +#include "core.h"  extern void __iomem *sregs_base; @@ -29,24 +33,39 @@ extern void __iomem *sregs_base;  #define HB_PWR_HARD_RESET		2  #define HB_PWR_SHUTDOWN			3 +#define SREG_CPU_PWR_CTRL(c)		(0x200 + ((c) * 4)) + +static inline void highbank_set_core_pwr(void) +{ +	int cpu = cpu_logical_map(smp_processor_id()); +	if (scu_base_addr) +		scu_power_mode(scu_base_addr, SCU_PM_POWEROFF); +	else +		writel_relaxed(1, sregs_base + SREG_CPU_PWR_CTRL(cpu)); +} +  static inline void hignbank_set_pwr_suspend(void)  {  	writel(HB_PWR_SUSPEND, sregs_base + HB_SREG_A9_PWR_REQ); +	highbank_set_core_pwr();  }  static inline void hignbank_set_pwr_shutdown(void)  {  	writel(HB_PWR_SHUTDOWN, sregs_base + HB_SREG_A9_PWR_REQ); +	highbank_set_core_pwr();  }  static inline void hignbank_set_pwr_soft_reset(void)  {  	writel(HB_PWR_SOFT_RESET, sregs_base + HB_SREG_A9_PWR_REQ); +	highbank_set_core_pwr();  }  static inline void hignbank_set_pwr_hard_reset(void)  {  	writel(HB_PWR_HARD_RESET, sregs_base + HB_SREG_A9_PWR_REQ); +	highbank_set_core_pwr();  }  #endif diff --git a/arch/arm/mach-highbank/system.c b/arch/arm/mach-highbank/system.c index 86e37cd9376..aed96ad9bd4 100644 --- a/arch/arm/mach-highbank/system.c +++ b/arch/arm/mach-highbank/system.c @@ -14,7 +14,6 @@   * this program.  If not, see <http://www.gnu.org/licenses/>.   */  #include <linux/io.h> -#include <asm/smp_scu.h>  #include <asm/proc-fns.h>  #include "core.h" @@ -27,7 +26,6 @@ void highbank_restart(char mode, const char *cmd)  	else  		hignbank_set_pwr_soft_reset(); -	scu_power_mode(scu_base_addr, SCU_PM_POWEROFF);  	while (1)  		cpu_do_idle();  } diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index b09924112f9..1ad0d76de8c 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -401,6 +401,7 @@ config MACH_IMX27_VISSTRIM_M10  	select IMX_HAVE_PLATFORM_IMX_SSI  	select IMX_HAVE_PLATFORM_IMX_UART  	select IMX_HAVE_PLATFORM_MX2_CAMERA +	select IMX_HAVE_PLATFORM_MX2_EMMA  	select IMX_HAVE_PLATFORM_MXC_EHCI  	select IMX_HAVE_PLATFORM_MXC_MMC  	select LEDS_GPIO_REGISTER @@ -827,6 +828,7 @@ config	SOC_IMX53  	select ARCH_MX5  	select ARCH_MX53  	select HAVE_CAN_FLEXCAN if CAN +	select IMX_HAVE_PLATFORM_IMX2_WDT  	select PINCTRL  	select PINCTRL_IMX53  	select SOC_IMX5 diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c index 585ab256c58..4c1d1e4efc7 100644 --- a/arch/arm/mach-imx/clk-imx27.c +++ b/arch/arm/mach-imx/clk-imx27.c @@ -51,8 +51,10 @@  static const char *vpu_sel_clks[] = { "spll", "mpll_main2", };  static const char *cpu_sel_clks[] = { "mpll_main2", "mpll", }; +static const char *mpll_sel_clks[] = { "fpm", "mpll_osc_sel", }; +static const char *mpll_osc_sel_clks[] = { "ckih", "ckih_div1p5", };  static const char *clko_sel_clks[] = { -	"ckil", "prem", "ckih", "ckih", +	"ckil", "fpm", "ckih", "ckih",  	"ckih", "mpll", "spll", "cpu_div",  	"ahb", "ipg", "per1_div", "per2_div",  	"per3_div", "per4_div", "ssi1_div", "ssi2_div", @@ -79,7 +81,8 @@ enum mx27_clks {  	vpu_ahb_gate, fec_ahb_gate, emma_ahb_gate, emi_ahb_gate, dma_ahb_gate,  	csi_ahb_gate, brom_ahb_gate, ata_ahb_gate, wdog_ipg_gate, usb_ipg_gate,  	uart6_ipg_gate, uart5_ipg_gate, uart4_ipg_gate, uart3_ipg_gate, -	uart2_ipg_gate, uart1_ipg_gate, clk_max +	uart2_ipg_gate, uart1_ipg_gate, ckih_div1p5, fpm, mpll_osc_sel, +	mpll_sel, clk_max  };  static struct clk *clk[clk_max]; @@ -91,7 +94,15 @@ int __init mx27_clocks_init(unsigned long fref)  	clk[dummy] = imx_clk_fixed("dummy", 0);  	clk[ckih] = imx_clk_fixed("ckih", fref);  	clk[ckil] = imx_clk_fixed("ckil", 32768); -	clk[mpll] = imx_clk_pllv1("mpll", "ckih", CCM_MPCTL0); +	clk[fpm] = imx_clk_fixed_factor("fpm", "ckil", 1024, 1); +	clk[ckih_div1p5] = imx_clk_fixed_factor("ckih_div1p5", "ckih", 2, 3); + +	clk[mpll_osc_sel] = imx_clk_mux("mpll_osc_sel", CCM_CSCR, 4, 1, +			mpll_osc_sel_clks, +			ARRAY_SIZE(mpll_osc_sel_clks)); +	clk[mpll_sel] = imx_clk_mux("mpll_sel", CCM_CSCR, 16, 1, mpll_sel_clks, +			ARRAY_SIZE(mpll_sel_clks)); +	clk[mpll] = imx_clk_pllv1("mpll", "mpll_sel", CCM_MPCTL0);  	clk[spll] = imx_clk_pllv1("spll", "ckih", CCM_SPCTL0);  	clk[mpll_main2] = imx_clk_fixed_factor("mpll_main2", "mpll", 2, 3); @@ -224,6 +235,7 @@ int __init mx27_clocks_init(unsigned long fref)  	clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx21-fb.0");  	clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx21-fb.0");  	clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0"); +	clk_register_clkdev(clk[per4_gate], "per", "imx27-camera.0");  	clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc");  	clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc");  	clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc"); diff --git a/arch/arm/mach-imx/clk-imx51-imx53.c b/arch/arm/mach-imx/clk-imx51-imx53.c index abb71f6b4d6..e8c0473c756 100644 --- a/arch/arm/mach-imx/clk-imx51-imx53.c +++ b/arch/arm/mach-imx/clk-imx51-imx53.c @@ -87,6 +87,7 @@ enum imx5_clks {  };  static struct clk *clk[clk_max]; +static struct clk_onecell_data clk_data;  static void __init mx5_clocks_common_init(unsigned long rate_ckil,  		unsigned long rate_osc, unsigned long rate_ckih1, @@ -305,6 +306,10 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,  	clk_prepare_enable(clk[spba]);  	clk_prepare_enable(clk[emi_fast_gate]); /* fec */  	clk_prepare_enable(clk[emi_slow_gate]); /* eim */ +	clk_prepare_enable(clk[mipi_hsc1_gate]); +	clk_prepare_enable(clk[mipi_hsc2_gate]); +	clk_prepare_enable(clk[mipi_esc_gate]); +	clk_prepare_enable(clk[mipi_hsp_gate]);  	clk_prepare_enable(clk[tmax1]);  	clk_prepare_enable(clk[tmax2]); /* esdhc2, fec */  	clk_prepare_enable(clk[tmax3]); /* esdhc1, esdhc4 */ @@ -314,6 +319,7 @@ int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,  			unsigned long rate_ckih1, unsigned long rate_ckih2)  {  	int i; +	struct device_node *np;  	clk[pll1_sw] = imx_clk_pllv2("pll1_sw", "osc", MX51_DPLL1_BASE);  	clk[pll2_sw] = imx_clk_pllv2("pll2_sw", "osc", MX51_DPLL2_BASE); @@ -342,16 +348,20 @@ int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,  			pr_err("i.MX51 clk %d: register failed with %ld\n",  				i, PTR_ERR(clk[i])); +	np = of_find_compatible_node(NULL, NULL, "fsl,imx51-ccm"); +	clk_data.clks = clk; +	clk_data.clk_num = ARRAY_SIZE(clk); +	of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); +  	mx5_clocks_common_init(rate_ckil, rate_osc, rate_ckih1, rate_ckih2);  	clk_register_clkdev(clk[hsi2c_gate], NULL, "imx21-i2c.2");  	clk_register_clkdev(clk[mx51_mipi], "mipi_hsp", NULL);  	clk_register_clkdev(clk[vpu_gate], NULL, "imx51-vpu.0");  	clk_register_clkdev(clk[fec_gate], NULL, "imx27-fec.0"); -	clk_register_clkdev(clk[ipu_gate], "bus", "imx51-ipu"); -	clk_register_clkdev(clk[ipu_di0_gate], "di0", "imx51-ipu"); -	clk_register_clkdev(clk[ipu_di1_gate], "di1", "imx51-ipu"); -	clk_register_clkdev(clk[ipu_gate], "hsp", "imx51-ipu"); +	clk_register_clkdev(clk[ipu_gate], "bus", "40000000.ipu"); +	clk_register_clkdev(clk[ipu_di0_gate], "di0", "40000000.ipu"); +	clk_register_clkdev(clk[ipu_di1_gate], "di1", "40000000.ipu");  	clk_register_clkdev(clk[usb_phy_gate], "phy", "mxc-ehci.0");  	clk_register_clkdev(clk[esdhc1_ipg_gate], "ipg", "sdhci-esdhc-imx51.0");  	clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx51.0"); @@ -365,10 +375,6 @@ int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,  	clk_register_clkdev(clk[esdhc4_ipg_gate], "ipg", "sdhci-esdhc-imx51.3");  	clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx51.3");  	clk_register_clkdev(clk[esdhc4_per_gate], "per", "sdhci-esdhc-imx51.3"); -	clk_register_clkdev(clk[ssi1_ipg_gate], NULL, "83fcc000.ssi"); -	clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "70014000.ssi"); -	clk_register_clkdev(clk[ssi3_ipg_gate], NULL, "83fe8000.ssi"); -	clk_register_clkdev(clk[nfc_gate], NULL, "83fdb000.nand");  	/* set the usboh3 parent to pll2_sw */  	clk_set_parent(clk[usboh3_sel], clk[pll2_sw]); @@ -392,6 +398,7 @@ int __init mx53_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,  {  	int i;  	unsigned long r; +	struct device_node *np;  	clk[pll1_sw] = imx_clk_pllv2("pll1_sw", "osc", MX53_DPLL1_BASE);  	clk[pll2_sw] = imx_clk_pllv2("pll2_sw", "osc", MX53_DPLL2_BASE); @@ -436,15 +443,20 @@ int __init mx53_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,  			pr_err("i.MX53 clk %d: register failed with %ld\n",  				i, PTR_ERR(clk[i])); +	np = of_find_compatible_node(NULL, NULL, "fsl,imx53-ccm"); +	clk_data.clks = clk; +	clk_data.clk_num = ARRAY_SIZE(clk); +	of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); +  	mx5_clocks_common_init(rate_ckil, rate_osc, rate_ckih1, rate_ckih2);  	clk_register_clkdev(clk[vpu_gate], NULL, "imx53-vpu.0");  	clk_register_clkdev(clk[i2c3_gate], NULL, "imx21-i2c.2");  	clk_register_clkdev(clk[fec_gate], NULL, "imx25-fec.0"); -	clk_register_clkdev(clk[ipu_gate], "bus", "imx53-ipu"); -	clk_register_clkdev(clk[ipu_di0_gate], "di0", "imx53-ipu"); -	clk_register_clkdev(clk[ipu_di1_gate], "di1", "imx53-ipu"); -	clk_register_clkdev(clk[ipu_gate], "hsp", "imx53-ipu"); +	clk_register_clkdev(clk[ipu_gate], "bus", "18000000.ipu"); +	clk_register_clkdev(clk[ipu_di0_gate], "di0", "18000000.ipu"); +	clk_register_clkdev(clk[ipu_di1_gate], "di1", "18000000.ipu"); +	clk_register_clkdev(clk[ipu_gate], "hsp", "18000000.ipu");  	clk_register_clkdev(clk[usb_phy1_gate], "usb_phy1", "mxc-ehci.0");  	clk_register_clkdev(clk[esdhc1_ipg_gate], "ipg", "sdhci-esdhc-imx53.0");  	clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx53.0"); @@ -458,14 +470,6 @@ int __init mx53_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,  	clk_register_clkdev(clk[esdhc4_ipg_gate], "ipg", "sdhci-esdhc-imx53.3");  	clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx53.3");  	clk_register_clkdev(clk[esdhc4_per_gate], "per", "sdhci-esdhc-imx53.3"); -	clk_register_clkdev(clk[ssi1_ipg_gate], NULL, "63fcc000.ssi"); -	clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "50014000.ssi"); -	clk_register_clkdev(clk[ssi3_ipg_gate], NULL, "63fd0000.ssi"); -	clk_register_clkdev(clk[nfc_gate], NULL, "63fdb000.nand"); -	clk_register_clkdev(clk[can1_ipg_gate], "ipg", "53fc8000.can"); -	clk_register_clkdev(clk[can1_serial_gate], "per", "53fc8000.can"); -	clk_register_clkdev(clk[can2_ipg_gate], "ipg", "53fcc000.can"); -	clk_register_clkdev(clk[can2_serial_gate], "per", "53fcc000.can");  	/* set SDHC root clock to 200MHZ*/  	clk_set_rate(clk[esdhc_a_podf], 200000000); diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index 5f9f5919dd7..7f2c10c7413 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c @@ -105,7 +105,7 @@ static const char *gpu2d_core_sels[]	= { "axi", "pll3_usb_otg", "pll2_pfd0_352m"  static const char *gpu3d_core_sels[]	= { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", };  static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd9_720m", };  static const char *ipu_sels[]		= { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; -static const char *ldb_di_sels[]	= { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; +static const char *ldb_di_sels[]	= { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_pfd1_540m", };  static const char *ipu_di_pre_sels[]	= { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", };  static const char *ipu1_di0_sels[]	= { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };  static const char *ipu1_di1_sels[]	= { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; @@ -152,8 +152,9 @@ enum mx6q_clks {  	gpmi_bch_apb, gpmi_bch, gpmi_io, gpmi_apb, sata, sdma, spba, ssi1,  	ssi2, ssi3, uart_ipg, uart_serial, usboh3, usdhc1, usdhc2, usdhc3,  	usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg, -	pll4_audio, pll5_video, pll6_mlb, pll7_usb_host, pll8_enet, ssi1_ipg, +	pll4_audio, pll5_video, pll8_mlb, pll7_usb_host, pll6_enet, ssi1_ipg,  	ssi2_ipg, ssi3_ipg, rom, usbphy1, usbphy2, ldb_di0_div_3_5, ldb_di1_div_3_5, +	sata_ref, sata_ref_100m, pcie_ref, pcie_ref_125m, enet_ref,  	clk_max  }; @@ -164,6 +165,13 @@ static enum mx6q_clks const clks_init_on[] __initconst = {  	mmdc_ch0_axi, rom,  }; +static struct clk_div_table clk_enet_ref_table[] = { +	{ .val = 0, .div = 20, }, +	{ .val = 1, .div = 10, }, +	{ .val = 2, .div = 5, }, +	{ .val = 3, .div = 4, }, +}; +  int __init mx6q_clocks_init(void)  {  	struct device_node *np; @@ -190,19 +198,29 @@ int __init mx6q_clocks_init(void)  	base = of_iomap(np, 0);  	WARN_ON(!base); -	/*                   type                               name         parent_name  base     gate_mask div_mask */ -	clk[pll1_sys]      = imx_clk_pllv3(IMX_PLLV3_SYS,	"pll1_sys",	"osc", base,        0x2000,   0x7f); -	clk[pll2_bus]      = imx_clk_pllv3(IMX_PLLV3_GENERIC,	"pll2_bus",	"osc", base + 0x30, 0x2000,   0x1); -	clk[pll3_usb_otg]  = imx_clk_pllv3(IMX_PLLV3_USB,	"pll3_usb_otg",	"osc", base + 0x10, 0x2000,   0x3); -	clk[pll4_audio]    = imx_clk_pllv3(IMX_PLLV3_AV,	"pll4_audio",	"osc", base + 0x70, 0x2000,   0x7f); -	clk[pll5_video]    = imx_clk_pllv3(IMX_PLLV3_AV,	"pll5_video",	"osc", base + 0xa0, 0x2000,   0x7f); -	clk[pll6_mlb]      = imx_clk_pllv3(IMX_PLLV3_MLB,	"pll6_mlb",	"osc", base + 0xd0, 0x2000,   0x0); -	clk[pll7_usb_host] = imx_clk_pllv3(IMX_PLLV3_USB,	"pll7_usb_host","osc", base + 0x20, 0x2000,   0x3); -	clk[pll8_enet]     = imx_clk_pllv3(IMX_PLLV3_ENET,	"pll8_enet",	"osc", base + 0xe0, 0x182000, 0x3); +	/*                   type                               name         parent_name  base     div_mask */ +	clk[pll1_sys]      = imx_clk_pllv3(IMX_PLLV3_SYS,	"pll1_sys",	"osc", base,        0x7f); +	clk[pll2_bus]      = imx_clk_pllv3(IMX_PLLV3_GENERIC,	"pll2_bus",	"osc", base + 0x30, 0x1); +	clk[pll3_usb_otg]  = imx_clk_pllv3(IMX_PLLV3_USB,	"pll3_usb_otg",	"osc", base + 0x10, 0x3); +	clk[pll4_audio]    = imx_clk_pllv3(IMX_PLLV3_AV,	"pll4_audio",	"osc", base + 0x70, 0x7f); +	clk[pll5_video]    = imx_clk_pllv3(IMX_PLLV3_AV,	"pll5_video",	"osc", base + 0xa0, 0x7f); +	clk[pll6_enet]     = imx_clk_pllv3(IMX_PLLV3_ENET,	"pll6_enet",	"osc", base + 0xe0, 0x3); +	clk[pll7_usb_host] = imx_clk_pllv3(IMX_PLLV3_USB,	"pll7_usb_host","osc", base + 0x20, 0x3); +	clk[pll8_mlb]      = imx_clk_pllv3(IMX_PLLV3_MLB,	"pll8_mlb",	"osc", base + 0xd0, 0x0);  	clk[usbphy1] = imx_clk_gate("usbphy1", "pll3_usb_otg", base + 0x10, 6);  	clk[usbphy2] = imx_clk_gate("usbphy2", "pll7_usb_host", base + 0x20, 6); +	clk[sata_ref] = imx_clk_fixed_factor("sata_ref", "pll6_enet", 1, 5); +	clk[pcie_ref] = imx_clk_fixed_factor("pcie_ref", "pll6_enet", 1, 4); + +	clk[sata_ref_100m] = imx_clk_gate("sata_ref_100m", "sata_ref", base + 0xe0, 20); +	clk[pcie_ref_125m] = imx_clk_gate("pcie_ref_125m", "pcie_ref", base + 0xe0, 19); + +	clk[enet_ref] = clk_register_divider_table(NULL, "enet_ref", "pll6_enet", 0, +			base + 0xe0, 0, 2, 0, clk_enet_ref_table, +			&imx_ccm_lock); +  	/*                                name              parent_name        reg       idx */  	clk[pll2_pfd0_352m] = imx_clk_pfd("pll2_pfd0_352m", "pll2_bus",     base + 0x100, 0);  	clk[pll2_pfd1_594m] = imx_clk_pfd("pll2_pfd1_594m", "pll2_bus",     base + 0x100, 1); @@ -358,7 +376,7 @@ int __init mx6q_clocks_init(void)  	clk[ldb_di1]      = imx_clk_gate2("ldb_di1",       "ldb_di1_podf",      base + 0x74, 14);  	clk[ipu2_di1]     = imx_clk_gate2("ipu2_di1",      "ipu2_di1_sel",      base + 0x74, 10);  	clk[hsi_tx]       = imx_clk_gate2("hsi_tx",        "hsi_tx_podf",       base + 0x74, 16); -	clk[mlb]          = imx_clk_gate2("mlb",           "pll6_mlb",          base + 0x74, 18); +	clk[mlb]          = imx_clk_gate2("mlb",           "pll8_mlb",          base + 0x74, 18);  	clk[mmdc_ch0_axi] = imx_clk_gate2("mmdc_ch0_axi",  "mmdc_ch0_axi_podf", base + 0x74, 20);  	clk[mmdc_ch1_axi] = imx_clk_gate2("mmdc_ch1_axi",  "mmdc_ch1_axi_podf", base + 0x74, 22);  	clk[ocram]        = imx_clk_gate2("ocram",         "ahb",               base + 0x74, 28); diff --git a/arch/arm/mach-imx/clk-pllv3.c b/arch/arm/mach-imx/clk-pllv3.c index 36aac947bce..d09bc3df9a7 100644 --- a/arch/arm/mach-imx/clk-pllv3.c +++ b/arch/arm/mach-imx/clk-pllv3.c @@ -31,7 +31,6 @@   * @clk_hw:	 clock source   * @base:	 base address of PLL registers   * @powerup_set: set POWER bit to power up the PLL - * @gate_mask:	 mask of gate bits   * @div_mask:	 mask of divider bits   *   * IMX PLL clock version 3, found on i.MX6 series.  Divider for pllv3 @@ -41,7 +40,6 @@ struct clk_pllv3 {  	struct clk_hw	hw;  	void __iomem	*base;  	bool		powerup_set; -	u32		gate_mask;  	u32		div_mask;  }; @@ -89,7 +87,7 @@ static int clk_pllv3_enable(struct clk_hw *hw)  	u32 val;  	val = readl_relaxed(pll->base); -	val |= pll->gate_mask; +	val |= BM_PLL_ENABLE;  	writel_relaxed(val, pll->base);  	return 0; @@ -101,7 +99,7 @@ static void clk_pllv3_disable(struct clk_hw *hw)  	u32 val;  	val = readl_relaxed(pll->base); -	val &= ~pll->gate_mask; +	val &= ~BM_PLL_ENABLE;  	writel_relaxed(val, pll->base);  } @@ -287,66 +285,7 @@ static const struct clk_ops clk_pllv3_av_ops = {  static unsigned long clk_pllv3_enet_recalc_rate(struct clk_hw *hw,  						unsigned long parent_rate)  { -	struct clk_pllv3 *pll = to_clk_pllv3(hw); -	u32 div = readl_relaxed(pll->base) & pll->div_mask; - -	switch (div) { -	case 0: -		return 25000000; -	case 1: -		return 50000000; -	case 2: -		return 100000000; -	case 3: -		return 125000000; -	} - -	return 0; -} - -static long clk_pllv3_enet_round_rate(struct clk_hw *hw, unsigned long rate, -				      unsigned long *prate) -{ -	if (rate >= 125000000) -		rate = 125000000; -	else if (rate >= 100000000) -		rate = 100000000; -	else if (rate >= 50000000) -		rate = 50000000; -	else -		rate = 25000000; -	return rate; -} - -static int clk_pllv3_enet_set_rate(struct clk_hw *hw, unsigned long rate, -		unsigned long parent_rate) -{ -	struct clk_pllv3 *pll = to_clk_pllv3(hw); -	u32 val, div; - -	switch (rate) { -	case 25000000: -		div = 0; -		break; -	case 50000000: -		div = 1; -		break; -	case 100000000: -		div = 2; -		break; -	case 125000000: -		div = 3; -		break; -	default: -		return -EINVAL; -	} - -	val = readl_relaxed(pll->base); -	val &= ~pll->div_mask; -	val |= div; -	writel_relaxed(val, pll->base); - -	return 0; +	return 500000000;  }  static const struct clk_ops clk_pllv3_enet_ops = { @@ -355,8 +294,6 @@ static const struct clk_ops clk_pllv3_enet_ops = {  	.enable		= clk_pllv3_enable,  	.disable	= clk_pllv3_disable,  	.recalc_rate	= clk_pllv3_enet_recalc_rate, -	.round_rate	= clk_pllv3_enet_round_rate, -	.set_rate	= clk_pllv3_enet_set_rate,  };  static const struct clk_ops clk_pllv3_mlb_ops = { @@ -368,7 +305,7 @@ static const struct clk_ops clk_pllv3_mlb_ops = {  struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,  			  const char *parent_name, void __iomem *base, -			  u32 gate_mask, u32 div_mask) +			  u32 div_mask)  {  	struct clk_pllv3 *pll;  	const struct clk_ops *ops; @@ -400,7 +337,6 @@ struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,  		ops = &clk_pllv3_ops;  	}  	pll->base = base; -	pll->gate_mask = gate_mask;  	pll->div_mask = div_mask;  	init.name = name; diff --git a/arch/arm/mach-imx/clk.h b/arch/arm/mach-imx/clk.h index 5f2d8acca25..9d1f3b99d1d 100644 --- a/arch/arm/mach-imx/clk.h +++ b/arch/arm/mach-imx/clk.h @@ -22,8 +22,7 @@ enum imx_pllv3_type {  };  struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name, -		const char *parent_name, void __iomem *base, u32 gate_mask, -		u32 div_mask); +		const char *parent_name, void __iomem *base, u32 div_mask);  struct clk *clk_register_gate2(struct device *dev, const char *name,  		const char *parent_name, unsigned long flags, diff --git a/arch/arm/mach-imx/devices-imx27.h b/arch/arm/mach-imx/devices-imx27.h index 8a1ad7972d4..13096251975 100644 --- a/arch/arm/mach-imx/devices-imx27.h +++ b/arch/arm/mach-imx/devices-imx27.h @@ -53,8 +53,10 @@ extern const struct imx_imx_uart_1irq_data imx27_imx_uart_data[];  extern const struct imx_mx2_camera_data imx27_mx2_camera_data;  #define imx27_add_mx2_camera(pdata)	\  	imx_add_mx2_camera(&imx27_mx2_camera_data, pdata) + +extern const struct imx_mx2_emma_data imx27_mx2_emmaprp_data;  #define imx27_add_mx2_emmaprp()	\ -	imx_add_mx2_emmaprp(&imx27_mx2_camera_data) +	imx_add_mx2_emmaprp(&imx27_mx2_emmaprp_data)  extern const struct imx_mxc_ehci_data imx27_mxc_ehci_otg_data;  #define imx27_add_mxc_ehci_otg(pdata)	\ diff --git a/arch/arm/mach-imx/devices/Kconfig b/arch/arm/mach-imx/devices/Kconfig index a35d9841f49..9a8f1ca7bcb 100644 --- a/arch/arm/mach-imx/devices/Kconfig +++ b/arch/arm/mach-imx/devices/Kconfig @@ -56,6 +56,9 @@ config IMX_HAVE_PLATFORM_MX1_CAMERA  config IMX_HAVE_PLATFORM_MX2_CAMERA  	bool +config IMX_HAVE_PLATFORM_MX2_EMMA +	bool +  config IMX_HAVE_PLATFORM_MXC_EHCI  	bool diff --git a/arch/arm/mach-imx/devices/Makefile b/arch/arm/mach-imx/devices/Makefile index 2abe2a5144d..6acf37e0c11 100644 --- a/arch/arm/mach-imx/devices/Makefile +++ b/arch/arm/mach-imx/devices/Makefile @@ -30,3 +30,4 @@ obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_W1) += platform-mxc_w1.o  obj-$(CONFIG_IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX) += platform-sdhci-esdhc-imx.o  obj-$(CONFIG_IMX_HAVE_PLATFORM_SPI_IMX) +=  platform-spi_imx.o  obj-$(CONFIG_IMX_HAVE_PLATFORM_AHCI) +=  platform-ahci-imx.o +obj-$(CONFIG_IMX_HAVE_PLATFORM_MX2_EMMA) += platform-mx2-emma.o diff --git a/arch/arm/mach-imx/devices/devices-common.h b/arch/arm/mach-imx/devices/devices-common.h index e4b790b9e2a..6277baf1b7b 100644 --- a/arch/arm/mach-imx/devices/devices-common.h +++ b/arch/arm/mach-imx/devices/devices-common.h @@ -232,8 +232,15 @@ struct imx_mx2_camera_data {  struct platform_device *__init imx_add_mx2_camera(  		const struct imx_mx2_camera_data *data,  		const struct mx2_camera_platform_data *pdata); + + +struct imx_mx2_emma_data { +	resource_size_t iobase; +	resource_size_t iosize; +	resource_size_t irq; +};  struct platform_device *__init imx_add_mx2_emmaprp( -		const struct imx_mx2_camera_data *data); +		const struct imx_mx2_emma_data *data);  #include <linux/platform_data/usb-ehci-mxc.h>  struct imx_mxc_ehci_data { diff --git a/arch/arm/mach-imx/devices/platform-mx2-camera.c b/arch/arm/mach-imx/devices/platform-mx2-camera.c index f4910160346..b53e1f348f5 100644 --- a/arch/arm/mach-imx/devices/platform-mx2-camera.c +++ b/arch/arm/mach-imx/devices/platform-mx2-camera.c @@ -65,20 +65,3 @@ struct platform_device *__init imx_add_mx2_camera(  			pdata, sizeof(*pdata), DMA_BIT_MASK(32));  } -struct platform_device *__init imx_add_mx2_emmaprp( -		const struct imx_mx2_camera_data *data) -{ -	struct resource res[] = { -		{ -			.start = data->iobaseemmaprp, -			.end = data->iobaseemmaprp + data->iosizeemmaprp - 1, -			.flags = IORESOURCE_MEM, -		}, { -			.start = data->irqemmaprp, -			.end = data->irqemmaprp, -			.flags = IORESOURCE_IRQ, -		}, -	}; -	return imx_add_platform_device_dmamask("m2m-emmaprp", 0, -			res, 2, NULL, 0, DMA_BIT_MASK(32)); -} diff --git a/arch/arm/mach-imx/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c index 50742990a13..5ffa40c673f 100644 --- a/arch/arm/mach-imx/imx51-dt.c +++ b/arch/arm/mach-imx/imx51-dt.c @@ -19,35 +19,9 @@  #include "common.h"  #include "mx51.h" -/* - * Lookup table for attaching a specific name and platform_data pointer to - * devices as they get created by of_platform_populate().  Ideally this table - * would not exist, but the current clock implementation depends on some devices - * having a specific name. - */ -static const struct of_dev_auxdata imx51_auxdata_lookup[] __initconst = { -	OF_DEV_AUXDATA("fsl,imx51-uart", MX51_UART1_BASE_ADDR, "imx21-uart.0", NULL), -	OF_DEV_AUXDATA("fsl,imx51-uart", MX51_UART2_BASE_ADDR, "imx21-uart.1", NULL), -	OF_DEV_AUXDATA("fsl,imx51-uart", MX51_UART3_BASE_ADDR, "imx21-uart.2", NULL), -	OF_DEV_AUXDATA("fsl,imx51-fec", MX51_FEC_BASE_ADDR, "imx27-fec.0", NULL), -	OF_DEV_AUXDATA("fsl,imx51-esdhc", MX51_ESDHC1_BASE_ADDR, "sdhci-esdhc-imx51.0", NULL), -	OF_DEV_AUXDATA("fsl,imx51-esdhc", MX51_ESDHC2_BASE_ADDR, "sdhci-esdhc-imx51.1", NULL), -	OF_DEV_AUXDATA("fsl,imx51-esdhc", MX51_ESDHC3_BASE_ADDR, "sdhci-esdhc-imx51.2", NULL), -	OF_DEV_AUXDATA("fsl,imx51-esdhc", MX51_ESDHC4_BASE_ADDR, "sdhci-esdhc-imx51.3", NULL), -	OF_DEV_AUXDATA("fsl,imx51-ecspi", MX51_ECSPI1_BASE_ADDR, "imx51-ecspi.0", NULL), -	OF_DEV_AUXDATA("fsl,imx51-ecspi", MX51_ECSPI2_BASE_ADDR, "imx51-ecspi.1", NULL), -	OF_DEV_AUXDATA("fsl,imx51-cspi", MX51_CSPI_BASE_ADDR, "imx35-cspi.0", NULL), -	OF_DEV_AUXDATA("fsl,imx51-i2c", MX51_I2C1_BASE_ADDR, "imx21-i2c.0", NULL), -	OF_DEV_AUXDATA("fsl,imx51-i2c", MX51_I2C2_BASE_ADDR, "imx21-i2c.1", NULL), -	OF_DEV_AUXDATA("fsl,imx51-sdma", MX51_SDMA_BASE_ADDR, "imx35-sdma", NULL), -	OF_DEV_AUXDATA("fsl,imx51-wdt", MX51_WDOG1_BASE_ADDR, "imx2-wdt.0", NULL), -	{ /* sentinel */ } -}; -  static void __init imx51_dt_init(void)  { -	of_platform_populate(NULL, of_default_bus_match_table, -			     imx51_auxdata_lookup, NULL); +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);  }  static void __init imx51_timer_init(void) diff --git a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c index b7442267912..318bd8df7fc 100644 --- a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c +++ b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c @@ -51,6 +51,10 @@  #define OTG_PHY_CS_GPIO (GPIO_PORTF + 17)  #define SDHC1_IRQ_GPIO IMX_GPIO_NR(2, 25) +#define VERSION_MASK		0x7 +#define MOTHERBOARD_SHIFT	4 +#define EXPBOARD_SHIFT		0 +  #define MOTHERBOARD_BIT2	(GPIO_PORTD + 31)  #define MOTHERBOARD_BIT1	(GPIO_PORTD + 30)  #define MOTHERBOARD_BIT0	(GPIO_PORTD + 29) @@ -237,7 +241,7 @@ static struct mx2_camera_platform_data visstrim_camera = {  static phys_addr_t mx2_camera_base __initdata;  #define MX2_CAMERA_BUF_SIZE SZ_8M -static void __init visstrim_camera_init(void) +static void __init visstrim_analog_camera_init(void)  {  	struct platform_device *pdev;  	int dma; @@ -474,6 +478,27 @@ static void __init visstrim_deinterlace_init(void)  		return;  } +/* Emma-PrP for format conversion */ +static void __init visstrim_emmaprp_init(void) +{ +	struct platform_device *pdev; +	int dma; + +	pdev = imx27_add_mx2_emmaprp(); +	if (IS_ERR(pdev)) +		return; + +	/* +	 * Use the same memory area as the analog camera since both +	 * devices are, by nature, exclusive. +	 */ +	dma = dma_declare_coherent_memory(&pdev->dev, +				mx2_camera_base, mx2_camera_base, +				MX2_CAMERA_BUF_SIZE, +				DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE); +	if (!(dma & DMA_MEMORY_MAP)) +		pr_err("Failed to declare memory for emmaprp\n"); +}  /* Audio */  static const struct snd_mx27vis_platform_data snd_mx27vis_pdata __initconst = { @@ -507,13 +532,14 @@ static void __init visstrim_m10_revision(void)  	mo_version |= !gpio_get_value(MOTHERBOARD_BIT0);  	system_rev = 0x27000; -	system_rev |= (mo_version << 4); -	system_rev |= exp_version; +	system_rev |= (mo_version << MOTHERBOARD_SHIFT); +	system_rev |= (exp_version << EXPBOARD_SHIFT);  }  static void __init visstrim_m10_board_init(void)  {  	int ret; +	int mo_version;  	imx27_soc_init();  	visstrim_m10_revision(); @@ -546,8 +572,24 @@ static void __init visstrim_m10_board_init(void)  	platform_device_register_resndata(NULL, "soc-camera-pdrv", 0, NULL, 0,  				      &iclink_tvp5150, sizeof(iclink_tvp5150));  	gpio_led_register_device(0, &visstrim_m10_led_data); -	visstrim_deinterlace_init(); -	visstrim_camera_init(); + +	/* Use mother board version to decide what video devices we shall use */ +	mo_version = (system_rev >> MOTHERBOARD_SHIFT) & VERSION_MASK; +	if (mo_version & 0x1) { +		visstrim_emmaprp_init(); + +		/* +		 * Despite not being used, tvp5150 must be +		 * powered on to avoid I2C problems. To minimize +		 * power consupmtion keep reset enabled. +		 */ +		gpio_set_value(TVP5150_PWDN, 1); +		ndelay(1); +		gpio_set_value(TVP5150_RSTN, 0); +	} else { +		visstrim_deinterlace_init(); +		visstrim_analog_camera_init(); +	}  	visstrim_coda_init();  } diff --git a/arch/arm/mach-imx/mach-imx53.c b/arch/arm/mach-imx/mach-imx53.c index e71e62610eb..860284dea0e 100644 --- a/arch/arm/mach-imx/mach-imx53.c +++ b/arch/arm/mach-imx/mach-imx53.c @@ -23,34 +23,6 @@  #include "common.h"  #include "mx53.h" -/* - * Lookup table for attaching a specific name and platform_data pointer to - * devices as they get created by of_platform_populate().  Ideally this table - * would not exist, but the current clock implementation depends on some devices - * having a specific name. - */ -static const struct of_dev_auxdata imx53_auxdata_lookup[] __initconst = { -	OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART1_BASE_ADDR, "imx21-uart.0", NULL), -	OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART2_BASE_ADDR, "imx21-uart.1", NULL), -	OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART3_BASE_ADDR, "imx21-uart.2", NULL), -	OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART4_BASE_ADDR, "imx21-uart.3", NULL), -	OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART5_BASE_ADDR, "imx21-uart.4", NULL), -	OF_DEV_AUXDATA("fsl,imx53-fec", MX53_FEC_BASE_ADDR, "imx25-fec.0", NULL), -	OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC1_BASE_ADDR, "sdhci-esdhc-imx53.0", NULL), -	OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC2_BASE_ADDR, "sdhci-esdhc-imx53.1", NULL), -	OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC3_BASE_ADDR, "sdhci-esdhc-imx53.2", NULL), -	OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC4_BASE_ADDR, "sdhci-esdhc-imx53.3", NULL), -	OF_DEV_AUXDATA("fsl,imx53-ecspi", MX53_ECSPI1_BASE_ADDR, "imx51-ecspi.0", NULL), -	OF_DEV_AUXDATA("fsl,imx53-ecspi", MX53_ECSPI2_BASE_ADDR, "imx51-ecspi.1", NULL), -	OF_DEV_AUXDATA("fsl,imx53-cspi", MX53_CSPI_BASE_ADDR, "imx35-cspi.0", NULL), -	OF_DEV_AUXDATA("fsl,imx53-i2c", MX53_I2C1_BASE_ADDR, "imx21-i2c.0", NULL), -	OF_DEV_AUXDATA("fsl,imx53-i2c", MX53_I2C2_BASE_ADDR, "imx21-i2c.1", NULL), -	OF_DEV_AUXDATA("fsl,imx53-i2c", MX53_I2C3_BASE_ADDR, "imx21-i2c.2", NULL), -	OF_DEV_AUXDATA("fsl,imx53-sdma", MX53_SDMA_BASE_ADDR, "imx35-sdma", NULL), -	OF_DEV_AUXDATA("fsl,imx53-wdt", MX53_WDOG1_BASE_ADDR, "imx2-wdt.0", NULL), -	{ /* sentinel */ } -}; -  static void __init imx53_qsb_init(void)  {  	struct clk *clk; @@ -69,8 +41,7 @@ static void __init imx53_dt_init(void)  	if (of_machine_is_compatible("fsl,imx53-qsb"))  		imx53_qsb_init(); -	of_platform_populate(NULL, of_default_bus_match_table, -			     imx53_auxdata_lookup, NULL); +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);  }  static void __init imx53_timer_init(void) diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 9511142d436..4eb1b3ac794 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c @@ -151,6 +151,17 @@ static void __init imx6q_sabrelite_init(void)  	imx6q_sabrelite_cko1_setup();  } +static void __init imx6q_1588_init(void) +{ +	struct regmap *gpr; + +	gpr = syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr"); +	if (!IS_ERR(gpr)) +		regmap_update_bits(gpr, 0x4, 1 << 21, 1 << 21); +	else +		pr_err("failed to find fsl,imx6q-iomux-gpr regmap\n"); + +}  static void __init imx6q_usb_init(void)  {  	struct regmap *anatop; @@ -187,6 +198,7 @@ static void __init imx6q_init_machine(void)  	imx6q_pm_init();  	imx6q_usb_init(); +	imx6q_1588_init();  }  static struct cpuidle_driver imx6q_cpuidle_driver = { diff --git a/arch/arm/mach-imx/mm-imx5.c b/arch/arm/mach-imx/mm-imx5.c index f92caf1b30b..79d71cf23a1 100644 --- a/arch/arm/mach-imx/mm-imx5.c +++ b/arch/arm/mach-imx/mm-imx5.c @@ -81,8 +81,28 @@ void __init imx50_init_early(void)  	mxc_arch_reset_init(MX50_IO_ADDRESS(MX50_WDOG_BASE_ADDR));  } +/* + * The MIPI HSC unit has been removed from the i.MX51 Reference Manual by + * the Freescale marketing division. However this did not remove the + * hardware from the chip which still needs to be configured for proper + * IPU support. + */ +static void __init imx51_ipu_mipi_setup(void) +{ +	void __iomem *hsc_addr; +	hsc_addr = MX51_IO_ADDRESS(MX51_MIPI_HSC_BASE_ADDR); + +	/* setup MIPI module to legacy mode */ +	__raw_writel(0xf00, hsc_addr); + +	/* CSI mode: reserved; DI control mode: legacy (from Freescale BSP) */ +	__raw_writel(__raw_readl(hsc_addr + 0x800) | 0x30ff, +		hsc_addr + 0x800); +} +  void __init imx51_init_early(void)  { +	imx51_ipu_mipi_setup();  	mxc_set_cpu_type(MXC_CPU_MX51);  	mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR));  	mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); diff --git a/arch/arm/mach-integrator/impd1.c b/arch/arm/mach-integrator/impd1.c index e428f3ab15c..9f82f9dcbb9 100644 --- a/arch/arm/mach-integrator/impd1.c +++ b/arch/arm/mach-integrator/impd1.c @@ -21,10 +21,9 @@  #include <linux/amba/bus.h>  #include <linux/amba/clcd.h>  #include <linux/io.h> +#include <linux/platform_data/clk-integrator.h>  #include <linux/slab.h> -#include <linux/clkdev.h> -#include <asm/hardware/icst.h>  #include <mach/lm.h>  #include <mach/impd1.h>  #include <asm/sizes.h> @@ -36,45 +35,6 @@ MODULE_PARM_DESC(lmid, "logic module stack position");  struct impd1_module {  	void __iomem	*base; -	struct clk	vcos[2]; -	struct clk_lookup *clks[3]; -}; - -static const struct icst_params impd1_vco_params = { -	.ref		= 24000000,	/* 24 MHz */ -	.vco_max	= ICST525_VCO_MAX_3V, -	.vco_min	= ICST525_VCO_MIN, -	.vd_min		= 12, -	.vd_max		= 519, -	.rd_min		= 3, -	.rd_max		= 120, -	.s2div		= icst525_s2div, -	.idx2s		= icst525_idx2s, -}; - -static void impd1_setvco(struct clk *clk, struct icst_vco vco) -{ -	struct impd1_module *impd1 = clk->data; -	u32 val = vco.v | (vco.r << 9) | (vco.s << 16); - -	writel(0xa05f, impd1->base + IMPD1_LOCK); -	writel(val, clk->vcoreg); -	writel(0, impd1->base + IMPD1_LOCK); - -#ifdef DEBUG -	vco.v = val & 0x1ff; -	vco.r = (val >> 9) & 0x7f; -	vco.s = (val >> 16) & 7; - -	pr_debug("IM-PD1: VCO%d clock is %ld Hz\n", -		 vconr, icst525_hz(&impd1_vco_params, vco)); -#endif -} - -static const struct clk_ops impd1_clk_ops = { -	.round	= icst_clk_round, -	.set	= icst_clk_set, -	.setvco	= impd1_setvco,  };  void impd1_tweak_control(struct device *dev, u32 mask, u32 val) @@ -344,10 +304,6 @@ static struct impd1_device impd1_devs[] = {  	}  }; -static struct clk fixed_14745600 = { -	.rate = 14745600, -}; -  static int impd1_probe(struct lm_device *dev)  {  	struct impd1_module *impd1; @@ -376,23 +332,7 @@ static int impd1_probe(struct lm_device *dev)  	printk("IM-PD1 found at 0x%08lx\n",  		(unsigned long)dev->resource.start); -	for (i = 0; i < ARRAY_SIZE(impd1->vcos); i++) { -		impd1->vcos[i].ops = &impd1_clk_ops, -		impd1->vcos[i].owner = THIS_MODULE, -		impd1->vcos[i].params = &impd1_vco_params, -		impd1->vcos[i].data = impd1; -	} -	impd1->vcos[0].vcoreg = impd1->base + IMPD1_OSC1; -	impd1->vcos[1].vcoreg = impd1->base + IMPD1_OSC2; - -	impd1->clks[0] = clkdev_alloc(&impd1->vcos[0], NULL, "lm%x:01000", -					dev->id); -	impd1->clks[1] = clkdev_alloc(&fixed_14745600, NULL, "lm%x:00100", -					dev->id); -	impd1->clks[2] = clkdev_alloc(&fixed_14745600, NULL, "lm%x:00200", -					dev->id); -	for (i = 0; i < ARRAY_SIZE(impd1->clks); i++) -		clkdev_add(impd1->clks[i]); +	integrator_impd1_clk_init(impd1->base, dev->id);  	for (i = 0; i < ARRAY_SIZE(impd1_devs); i++) {  		struct impd1_device *idev = impd1_devs + i; @@ -402,9 +342,10 @@ static int impd1_probe(struct lm_device *dev)  		pc_base = dev->resource.start + idev->offset;  		snprintf(devname, 32, "lm%x:%5.5lx", dev->id, idev->offset >> 12); -		d = amba_ahb_device_add(&dev->dev, devname, pc_base, SZ_4K, -					dev->irq, dev->irq, -					idev->platform_data, idev->id); +		d = amba_ahb_device_add_res(&dev->dev, devname, pc_base, SZ_4K, +					    dev->irq, dev->irq, +					    idev->platform_data, idev->id, +					    &dev->resource);  		if (IS_ERR(d)) {  			dev_err(&dev->dev, "unable to register device: %ld\n", PTR_ERR(d));  			continue; @@ -431,12 +372,9 @@ static int impd1_remove_one(struct device *dev, void *data)  static void impd1_remove(struct lm_device *dev)  {  	struct impd1_module *impd1 = lm_get_drvdata(dev); -	int i;  	device_for_each_child(&dev->dev, NULL, impd1_remove_one); - -	for (i = 0; i < ARRAY_SIZE(impd1->clks); i++) -		clkdev_drop(impd1->clks[i]); +	integrator_impd1_clk_exit(dev->id);  	lm_set_drvdata(dev, NULL); diff --git a/arch/arm/mach-integrator/include/mach/irqs.h b/arch/arm/mach-integrator/include/mach/irqs.h index 7371018455d..eff0adad9ae 100644 --- a/arch/arm/mach-integrator/include/mach/irqs.h +++ b/arch/arm/mach-integrator/include/mach/irqs.h @@ -19,64 +19,63 @@   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   */ -/*  - *  Interrupt numbers +/* + * Interrupt numbers, all of the above are just static reservations + * used so they can be encoded into device resources. They will finally + * be done away with when switching to device tree.   */ -#define IRQ_PIC_START			1 -#define IRQ_SOFTINT			1 -#define IRQ_UARTINT0			2 -#define IRQ_UARTINT1			3 -#define IRQ_KMIINT0			4 -#define IRQ_KMIINT1			5 -#define IRQ_TIMERINT0			6 -#define IRQ_TIMERINT1			7 -#define IRQ_TIMERINT2			8 -#define IRQ_RTCINT			9 -#define IRQ_AP_EXPINT0			10 -#define IRQ_AP_EXPINT1			11 -#define IRQ_AP_EXPINT2			12 -#define IRQ_AP_EXPINT3			13 -#define IRQ_AP_PCIINT0			14 -#define IRQ_AP_PCIINT1			15 -#define IRQ_AP_PCIINT2			16 -#define IRQ_AP_PCIINT3			17 -#define IRQ_AP_V3INT			18 -#define IRQ_AP_CPINT0			19 -#define IRQ_AP_CPINT1			20 -#define IRQ_AP_LBUSTIMEOUT 		21 -#define IRQ_AP_APCINT			22 -#define IRQ_CP_CLCDCINT			23 -#define IRQ_CP_MMCIINT0			24 -#define IRQ_CP_MMCIINT1			25 -#define IRQ_CP_AACIINT			26 -#define IRQ_CP_CPPLDINT			27 -#define IRQ_CP_ETHINT			28 -#define IRQ_CP_TSPENINT			29 -#define IRQ_PIC_END			29 +#define IRQ_PIC_START			64 +#define IRQ_SOFTINT			(IRQ_PIC_START+0) +#define IRQ_UARTINT0			(IRQ_PIC_START+1) +#define IRQ_UARTINT1			(IRQ_PIC_START+2) +#define IRQ_KMIINT0			(IRQ_PIC_START+3) +#define IRQ_KMIINT1			(IRQ_PIC_START+4) +#define IRQ_TIMERINT0			(IRQ_PIC_START+5) +#define IRQ_TIMERINT1			(IRQ_PIC_START+6) +#define IRQ_TIMERINT2			(IRQ_PIC_START+7) +#define IRQ_RTCINT			(IRQ_PIC_START+8) +#define IRQ_AP_EXPINT0			(IRQ_PIC_START+9) +#define IRQ_AP_EXPINT1			(IRQ_PIC_START+10) +#define IRQ_AP_EXPINT2			(IRQ_PIC_START+11) +#define IRQ_AP_EXPINT3			(IRQ_PIC_START+12) +#define IRQ_AP_PCIINT0			(IRQ_PIC_START+13) +#define IRQ_AP_PCIINT1			(IRQ_PIC_START+14) +#define IRQ_AP_PCIINT2			(IRQ_PIC_START+15) +#define IRQ_AP_PCIINT3			(IRQ_PIC_START+16) +#define IRQ_AP_V3INT			(IRQ_PIC_START+17) +#define IRQ_AP_CPINT0			(IRQ_PIC_START+18) +#define IRQ_AP_CPINT1			(IRQ_PIC_START+19) +#define IRQ_AP_LBUSTIMEOUT 		(IRQ_PIC_START+20) +#define IRQ_AP_APCINT			(IRQ_PIC_START+21) +#define IRQ_CP_CLCDCINT			(IRQ_PIC_START+22) +#define IRQ_CP_MMCIINT0			(IRQ_PIC_START+23) +#define IRQ_CP_MMCIINT1			(IRQ_PIC_START+24) +#define IRQ_CP_AACIINT			(IRQ_PIC_START+25) +#define IRQ_CP_CPPLDINT			(IRQ_PIC_START+26) +#define IRQ_CP_ETHINT			(IRQ_PIC_START+27) +#define IRQ_CP_TSPENINT			(IRQ_PIC_START+28) +#define IRQ_PIC_END			(IRQ_PIC_START+28) -#define IRQ_CIC_START			32 -#define IRQ_CM_SOFTINT			32 -#define IRQ_CM_COMMRX			33 -#define IRQ_CM_COMMTX			34 -#define IRQ_CIC_END			34 +#define IRQ_CIC_START			(IRQ_PIC_END+1) +#define IRQ_CM_SOFTINT			(IRQ_CIC_START+0) +#define IRQ_CM_COMMRX			(IRQ_CIC_START+1) +#define IRQ_CM_COMMTX			(IRQ_CIC_START+2) +#define IRQ_CIC_END			(IRQ_CIC_START+2)  /*   * IntegratorCP only   */ -#define IRQ_SIC_START			35 -#define IRQ_SIC_CP_SOFTINT		35 -#define IRQ_SIC_CP_RI0			36 -#define IRQ_SIC_CP_RI1			37 -#define IRQ_SIC_CP_CARDIN		38 -#define IRQ_SIC_CP_LMINT0		39 -#define IRQ_SIC_CP_LMINT1		40 -#define IRQ_SIC_CP_LMINT2		41 -#define IRQ_SIC_CP_LMINT3		42 -#define IRQ_SIC_CP_LMINT4		43 -#define IRQ_SIC_CP_LMINT5		44 -#define IRQ_SIC_CP_LMINT6		45 -#define IRQ_SIC_CP_LMINT7		46 -#define IRQ_SIC_END			46 - -#define NR_IRQS_INTEGRATOR_AP		34 -#define NR_IRQS_INTEGRATOR_CP		47 +#define IRQ_SIC_START			(IRQ_CIC_END+1) +#define IRQ_SIC_CP_SOFTINT		(IRQ_SIC_START+0) +#define IRQ_SIC_CP_RI0			(IRQ_SIC_START+1) +#define IRQ_SIC_CP_RI1			(IRQ_SIC_START+2) +#define IRQ_SIC_CP_CARDIN		(IRQ_SIC_START+3) +#define IRQ_SIC_CP_LMINT0		(IRQ_SIC_START+4) +#define IRQ_SIC_CP_LMINT1		(IRQ_SIC_START+5) +#define IRQ_SIC_CP_LMINT2		(IRQ_SIC_START+6) +#define IRQ_SIC_CP_LMINT3		(IRQ_SIC_START+7) +#define IRQ_SIC_CP_LMINT4		(IRQ_SIC_START+8) +#define IRQ_SIC_CP_LMINT5		(IRQ_SIC_START+9) +#define IRQ_SIC_CP_LMINT6		(IRQ_SIC_START+10) +#define IRQ_SIC_CP_LMINT7		(IRQ_SIC_START+11) +#define IRQ_SIC_END			(IRQ_SIC_START+11) diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index a0a7cbbb7a7..11e2a414580 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c @@ -31,6 +31,7 @@  #include <linux/clockchips.h>  #include <linux/interrupt.h>  #include <linux/io.h> +#include <linux/irqchip/versatile-fpga.h>  #include <linux/mtd/physmap.h>  #include <linux/clk.h>  #include <linux/platform_data/clk-integrator.h> @@ -59,8 +60,6 @@  #include <asm/mach/pci.h>  #include <asm/mach/time.h> -#include <plat/fpga-irq.h> -  #include "common.h"  /* Base address to the AP system controller */ @@ -584,7 +583,6 @@ static const char * ap_dt_board_compat[] = {  DT_MACHINE_START(INTEGRATOR_AP_DT, "ARM Integrator/AP (Device Tree)")  	.reserve	= integrator_reserve,  	.map_io		= ap_map_io, -	.nr_irqs	= NR_IRQS_INTEGRATOR_AP,  	.init_early	= ap_init_early,  	.init_irq	= ap_init_irq_of,  	.handle_irq	= fpga_handle_irq, @@ -715,7 +713,6 @@ MACHINE_START(INTEGRATOR, "ARM-Integrator")  	.atag_offset	= 0x100,  	.reserve	= integrator_reserve,  	.map_io		= ap_map_io_atag, -	.nr_irqs	= NR_IRQS_INTEGRATOR_AP,  	.init_early	= ap_init_early,  	.init_irq	= ap_init_irq,  	.handle_irq	= fpga_handle_irq, diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c index 29df06b35d0..7322838c044 100644 --- a/arch/arm/mach-integrator/integrator_cp.c +++ b/arch/arm/mach-integrator/integrator_cp.c @@ -20,6 +20,7 @@  #include <linux/amba/clcd.h>  #include <linux/amba/mmci.h>  #include <linux/io.h> +#include <linux/irqchip/versatile-fpga.h>  #include <linux/gfp.h>  #include <linux/mtd/physmap.h>  #include <linux/platform_data/clk-integrator.h> @@ -47,7 +48,6 @@  #include <asm/hardware/timer-sp.h>  #include <plat/clcd.h> -#include <plat/fpga-irq.h>  #include <plat/sched_clock.h>  #include "common.h" @@ -387,7 +387,6 @@ static const char * intcp_dt_board_compat[] = {  DT_MACHINE_START(INTEGRATOR_CP_DT, "ARM Integrator/CP (Device Tree)")  	.reserve	= integrator_reserve,  	.map_io		= intcp_map_io, -	.nr_irqs	= NR_IRQS_INTEGRATOR_CP,  	.init_early	= intcp_init_early,  	.init_irq	= intcp_init_irq_of,  	.handle_irq	= fpga_handle_irq, @@ -482,7 +481,7 @@ static void __init intcp_init_irq(void)  	u32 pic_mask, cic_mask, sic_mask;  	/* These masks are for the HW IRQ registers */ -	pic_mask = ~((~0u) << (11 - IRQ_PIC_START)); +	pic_mask = ~((~0u) << (11 - 0));  	pic_mask |= (~((~0u) << (29 - 22))) << 22;  	cic_mask = ~((~0u) << (1 + IRQ_CIC_END - IRQ_CIC_START));  	sic_mask = ~((~0u) << (1 + IRQ_SIC_END - IRQ_SIC_START)); @@ -563,7 +562,6 @@ MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP")  	.atag_offset	= 0x100,  	.reserve	= integrator_reserve,  	.map_io		= intcp_map_io_atag, -	.nr_irqs	= NR_IRQS_INTEGRATOR_CP,  	.init_early	= intcp_init_early,  	.init_irq	= intcp_init_irq,  	.handle_irq	= fpga_handle_irq, diff --git a/arch/arm/mach-ixp4xx/common-pci.c b/arch/arm/mach-ixp4xx/common-pci.c index 1694f01ce2b..6d6bde3e15f 100644 --- a/arch/arm/mach-ixp4xx/common-pci.c +++ b/arch/arm/mach-ixp4xx/common-pci.c @@ -410,6 +410,7 @@ void __init ixp4xx_pci_preinit(void)  		 * Enable the IO window to be way up high, at 0xfffffc00  		 */  		local_write_config(PCI_BASE_ADDRESS_5, 4, 0xfffffc01); +		local_write_config(0x40, 4, 0x000080FF); /* No TRDY time limit */  	} else {  		printk("PCI: IXP4xx is target - No bus scan performed\n");  	} diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index fdf91a16088..8c0c0e2d072 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c @@ -67,15 +67,12 @@ static struct map_desc ixp4xx_io_desc[] __initdata = {  		.pfn		= __phys_to_pfn(IXP4XX_PCI_CFG_BASE_PHYS),  		.length		= IXP4XX_PCI_CFG_REGION_SIZE,  		.type		= MT_DEVICE -	}, -#ifdef CONFIG_DEBUG_LL -	{	/* Debug UART mapping */ -		.virtual	= (unsigned long)IXP4XX_DEBUG_UART_BASE_VIRT, -		.pfn		= __phys_to_pfn(IXP4XX_DEBUG_UART_BASE_PHYS), -		.length		= IXP4XX_DEBUG_UART_REGION_SIZE, +	}, {	/* Queue Manager */ +		.virtual	= (unsigned long)IXP4XX_QMGR_BASE_VIRT, +		.pfn		= __phys_to_pfn(IXP4XX_QMGR_BASE_PHYS), +		.length		= IXP4XX_QMGR_REGION_SIZE,  		.type		= MT_DEVICE -	} -#endif +	},  };  void __init ixp4xx_map_io(void) diff --git a/arch/arm/mach-ixp4xx/goramo_mlr.c b/arch/arm/mach-ixp4xx/goramo_mlr.c index b800a031207..53b8348dfcc 100644 --- a/arch/arm/mach-ixp4xx/goramo_mlr.c +++ b/arch/arm/mach-ixp4xx/goramo_mlr.c @@ -15,6 +15,7 @@  #include <asm/mach/arch.h>  #include <asm/mach/flash.h>  #include <asm/mach/pci.h> +#include <asm/system_info.h>  #define SLOT_ETHA		0x0B	/* IDSEL = AD21 */  #define SLOT_ETHB		0x0C	/* IDSEL = AD20 */ @@ -329,7 +330,7 @@ static struct platform_device device_hss_tab[] = {  }; -static struct platform_device *device_tab[6] __initdata = { +static struct platform_device *device_tab[7] __initdata = {  	&device_flash,		/* index 0 */  }; diff --git a/arch/arm/mach-ixp4xx/include/mach/debug-macro.S b/arch/arm/mach-ixp4xx/include/mach/debug-macro.S index 8c9f8d56449..ff686cbc5df 100644 --- a/arch/arm/mach-ixp4xx/include/mach/debug-macro.S +++ b/arch/arm/mach-ixp4xx/include/mach/debug-macro.S @@ -17,8 +17,8 @@  #else  		mov	\rp, #0  #endif -                orr     \rv, \rp, #0xff000000	@ virtual -		orr	\rv, \rv, #0x00b00000 +		orr	\rv, \rp, #0xfe000000	@ virtual +		orr	\rv, \rv, #0x00f00000                  orr     \rp, \rp, #0xc8000000	@ physical                  .endm diff --git a/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h b/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h index eb68b61ce97..c5bae9c035d 100644 --- a/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h +++ b/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h @@ -30,51 +30,43 @@   *   * 0x50000000	0x10000000	ioremap'd	EXP BUS   * - * 0x6000000	0x00004000	ioremap'd	QMgr + * 0xC8000000	0x00013000	0xFEF00000	On-Chip Peripherals   * - * 0xC0000000	0x00001000	0xffbff000	PCI CFG + * 0xC0000000	0x00001000	0xFEF13000	PCI CFG   * - * 0xC4000000	0x00001000	0xffbfe000	EXP CFG + * 0xC4000000	0x00001000	0xFEF14000	EXP CFG   * - * 0xC8000000	0x00013000	0xffbeb000	On-Chip Peripherals + * 0x60000000	0x00004000	0xFEF15000	QMgr   */  /*   * Queue Manager   */ -#define IXP4XX_QMGR_BASE_PHYS		(0x60000000) -#define IXP4XX_QMGR_REGION_SIZE		(0x00004000) +#define IXP4XX_QMGR_BASE_PHYS		0x60000000 +#define IXP4XX_QMGR_BASE_VIRT		IOMEM(0xFEF15000) +#define IXP4XX_QMGR_REGION_SIZE		0x00004000  /* - * Expansion BUS Configuration registers + * Peripheral space, including debug UART. Must be section-aligned so that + * it can be used with the low-level debug code.   */ -#define IXP4XX_EXP_CFG_BASE_PHYS	(0xC4000000) -#define IXP4XX_EXP_CFG_BASE_VIRT	IOMEM(0xFFBFE000) -#define IXP4XX_EXP_CFG_REGION_SIZE	(0x00001000) +#define IXP4XX_PERIPHERAL_BASE_PHYS	0xC8000000 +#define IXP4XX_PERIPHERAL_BASE_VIRT	IOMEM(0xFEF00000) +#define IXP4XX_PERIPHERAL_REGION_SIZE	0x00013000  /*   * PCI Config registers   */ -#define IXP4XX_PCI_CFG_BASE_PHYS	(0xC0000000) -#define	IXP4XX_PCI_CFG_BASE_VIRT	IOMEM(0xFFBFF000) -#define IXP4XX_PCI_CFG_REGION_SIZE	(0x00001000) - -/* - * Peripheral space - */ -#define IXP4XX_PERIPHERAL_BASE_PHYS	(0xC8000000) -#define IXP4XX_PERIPHERAL_BASE_VIRT	IOMEM(0xFFBEB000) -#define IXP4XX_PERIPHERAL_REGION_SIZE	(0x00013000) +#define IXP4XX_PCI_CFG_BASE_PHYS	0xC0000000 +#define IXP4XX_PCI_CFG_BASE_VIRT	IOMEM(0xFEF13000) +#define IXP4XX_PCI_CFG_REGION_SIZE	0x00001000  /* - * Debug UART - * - * This is basically a remap of UART1 into a region that is section - * aligned so that it * can be used with the low-level debug code. + * Expansion BUS Configuration registers   */ -#define	IXP4XX_DEBUG_UART_BASE_PHYS	(0xC8000000) -#define	IXP4XX_DEBUG_UART_BASE_VIRT	IOMEM(0xffb00000) -#define	IXP4XX_DEBUG_UART_REGION_SIZE	(0x00001000) +#define IXP4XX_EXP_CFG_BASE_PHYS	0xC4000000 +#define IXP4XX_EXP_CFG_BASE_VIRT	0xFEF14000 +#define IXP4XX_EXP_CFG_REGION_SIZE	0x00001000  #define IXP4XX_EXP_CS0_OFFSET	0x00  #define IXP4XX_EXP_CS1_OFFSET   0x04 diff --git a/arch/arm/mach-ixp4xx/include/mach/qmgr.h b/arch/arm/mach-ixp4xx/include/mach/qmgr.h index 9e7cad2d54c..4de8da536db 100644 --- a/arch/arm/mach-ixp4xx/include/mach/qmgr.h +++ b/arch/arm/mach-ixp4xx/include/mach/qmgr.h @@ -86,7 +86,7 @@ void qmgr_release_queue(unsigned int queue);  static inline void qmgr_put_entry(unsigned int queue, u32 val)  { -	extern struct qmgr_regs __iomem *qmgr_regs; +	struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;  #if DEBUG_QMGR  	BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */ @@ -99,7 +99,7 @@ static inline void qmgr_put_entry(unsigned int queue, u32 val)  static inline u32 qmgr_get_entry(unsigned int queue)  {  	u32 val; -	extern struct qmgr_regs __iomem *qmgr_regs; +	const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;  	val = __raw_readl(&qmgr_regs->acc[queue][0]);  #if DEBUG_QMGR  	BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */ @@ -112,14 +112,14 @@ static inline u32 qmgr_get_entry(unsigned int queue)  static inline int __qmgr_get_stat1(unsigned int queue)  { -	extern struct qmgr_regs __iomem *qmgr_regs; +	const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;  	return (__raw_readl(&qmgr_regs->stat1[queue >> 3])  		>> ((queue & 7) << 2)) & 0xF;  }  static inline int __qmgr_get_stat2(unsigned int queue)  { -	extern struct qmgr_regs __iomem *qmgr_regs; +	const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;  	BUG_ON(queue >= HALF_QUEUES);  	return (__raw_readl(&qmgr_regs->stat2[queue >> 4])  		>> ((queue & 0xF) << 1)) & 0x3; @@ -145,7 +145,7 @@ static inline int qmgr_stat_empty(unsigned int queue)   */  static inline int qmgr_stat_below_low_watermark(unsigned int queue)  { -	extern struct qmgr_regs __iomem *qmgr_regs; +	const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;  	if (queue >= HALF_QUEUES)  		return (__raw_readl(&qmgr_regs->statne_h) >>  			(queue - HALF_QUEUES)) & 0x01; @@ -172,7 +172,7 @@ static inline int qmgr_stat_above_high_watermark(unsigned int queue)   */  static inline int qmgr_stat_full(unsigned int queue)  { -	extern struct qmgr_regs __iomem *qmgr_regs; +	const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;  	if (queue >= HALF_QUEUES)  		return (__raw_readl(&qmgr_regs->statf_h) >>  			(queue - HALF_QUEUES)) & 0x01; diff --git a/arch/arm/mach-ixp4xx/include/mach/udc.h b/arch/arm/mach-ixp4xx/include/mach/udc.h index 80d6da2eafa..7bd8b96c884 100644 --- a/arch/arm/mach-ixp4xx/include/mach/udc.h +++ b/arch/arm/mach-ixp4xx/include/mach/udc.h @@ -2,7 +2,7 @@   * arch/arm/mach-ixp4xx/include/mach/udc.h   *   */ -#include <asm/mach/udc_pxa2xx.h> +#include <linux/platform_data/pxa2xx_udc.h>  extern void ixp4xx_set_udc_info(struct pxa2xx_udc_mach_info *info); diff --git a/arch/arm/mach-ixp4xx/ixp4xx_npe.c b/arch/arm/mach-ixp4xx/ixp4xx_npe.c index a17ed79207a..d4eb09a6286 100644 --- a/arch/arm/mach-ixp4xx/ixp4xx_npe.c +++ b/arch/arm/mach-ixp4xx/ixp4xx_npe.c @@ -116,7 +116,11 @@  /* NPE mailbox_status value for reset */  #define RESET_MBOX_STAT			0x0000F0F0 -const char *npe_names[] = { "NPE-A", "NPE-B", "NPE-C" }; +#define NPE_A_FIRMWARE "NPE-A" +#define NPE_B_FIRMWARE "NPE-B" +#define NPE_C_FIRMWARE "NPE-C" + +const char *npe_names[] = { NPE_A_FIRMWARE, NPE_B_FIRMWARE, NPE_C_FIRMWARE };  #define print_npe(pri, npe, fmt, ...)					\  	printk(pri "%s: " fmt, npe_name(npe), ## __VA_ARGS__) @@ -724,6 +728,9 @@ module_exit(npe_cleanup_module);  MODULE_AUTHOR("Krzysztof Halasa");  MODULE_LICENSE("GPL v2"); +MODULE_FIRMWARE(NPE_A_FIRMWARE); +MODULE_FIRMWARE(NPE_B_FIRMWARE); +MODULE_FIRMWARE(NPE_C_FIRMWARE);  EXPORT_SYMBOL(npe_names);  EXPORT_SYMBOL(npe_running); diff --git a/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c b/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c index 852f7c9f87d..9d1b6b7c394 100644 --- a/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c +++ b/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c @@ -14,7 +14,7 @@  #include <linux/module.h>  #include <mach/qmgr.h> -struct qmgr_regs __iomem *qmgr_regs; +static struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;  static struct resource *mem_res;  static spinlock_t qmgr_lock;  static u32 used_sram_bitmap[4]; /* 128 16-dword pages */ @@ -293,12 +293,6 @@ static int qmgr_init(void)  	if (mem_res == NULL)  		return -EBUSY; -	qmgr_regs = ioremap(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE); -	if (qmgr_regs == NULL) { -		err = -ENOMEM; -		goto error_map; -	} -  	/* reset qmgr registers */  	for (i = 0; i < 4; i++) {  		__raw_writel(0x33333333, &qmgr_regs->stat1[i]); @@ -347,8 +341,6 @@ static int qmgr_init(void)  error_irq2:  	free_irq(IRQ_IXP4XX_QM1, NULL);  error_irq: -	iounmap(qmgr_regs); -error_map:  	release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE);  	return err;  } @@ -359,7 +351,6 @@ static void qmgr_remove(void)  	free_irq(IRQ_IXP4XX_QM2, NULL);  	synchronize_irq(IRQ_IXP4XX_QM1);  	synchronize_irq(IRQ_IXP4XX_QM2); -	iounmap(qmgr_regs);  	release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE);  } @@ -369,7 +360,6 @@ module_exit(qmgr_remove);  MODULE_LICENSE("GPL v2");  MODULE_AUTHOR("Krzysztof Halasa"); -EXPORT_SYMBOL(qmgr_regs);  EXPORT_SYMBOL(qmgr_set_irq);  EXPORT_SYMBOL(qmgr_enable_irq);  EXPORT_SYMBOL(qmgr_disable_irq); diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c index 1e9f90ee0f5..ef102646ba9 100644 --- a/arch/arm/mach-kirkwood/pcie.c +++ b/arch/arm/mach-kirkwood/pcie.c @@ -208,14 +208,19 @@ static int __init kirkwood_pcie_setup(int nr, struct pci_sys_data *sys)  	return 1;  } +/* + * The root complex has a hardwired class of PCI_CLASS_MEMORY_OTHER, when it + * is operating as a root complex this needs to be switched to + * PCI_CLASS_BRIDGE_HOST or Linux will errantly try to process the BAR's on + * the device. Decoding setup is handled by the orion code. + */  static void __devinit rc_pci_fixup(struct pci_dev *dev)  { -	/* -	 * Prevent enumeration of root complex. -	 */  	if (dev->bus->parent == NULL && dev->devfn == 0) {  		int i; +		dev->class &= 0xff; +		dev->class |= PCI_CLASS_BRIDGE_HOST << 8;  		for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {  			dev->resource[i].start = 0;  			dev->resource[i].end   = 0; diff --git a/arch/arm/mach-lpc32xx/clock.c b/arch/arm/mach-lpc32xx/clock.c index f48c2e961b8..dd5d6f532e8 100644 --- a/arch/arm/mach-lpc32xx/clock.c +++ b/arch/arm/mach-lpc32xx/clock.c @@ -585,6 +585,13 @@ static struct clk clk_timer3 = {  	.enable_mask	= LPC32XX_CLKPWR_TMRPWMCLK_TIMER3_EN,  	.get_rate	= local_return_parent_rate,  }; +static struct clk clk_mpwm = { +	.parent		= &clk_pclk, +	.enable		= local_onoff_enable, +	.enable_reg	= LPC32XX_CLKPWR_TIMERS_PWMS_CLK_CTRL_1, +	.enable_mask	= LPC32XX_CLKPWR_TMRPWMCLK_MPWM_EN, +	.get_rate	= local_return_parent_rate, +};  static struct clk clk_wdt = {  	.parent		= &clk_pclk,  	.enable		= local_onoff_enable, @@ -1202,6 +1209,7 @@ static struct clk_lookup lookups[] = {  	CLKDEV_INIT("pl08xdmac", NULL, &clk_dma),  	CLKDEV_INIT("4003c000.watchdog", NULL, &clk_wdt),  	CLKDEV_INIT("4005c000.pwm", NULL, &clk_pwm), +	CLKDEV_INIT("400e8000.mpwm", NULL, &clk_mpwm),  	CLKDEV_INIT(NULL, "uart3_ck", &clk_uart3),  	CLKDEV_INIT(NULL, "uart4_ck", &clk_uart4),  	CLKDEV_INIT(NULL, "uart5_ck", &clk_uart5), diff --git a/arch/arm/mach-lpc32xx/include/mach/platform.h b/arch/arm/mach-lpc32xx/include/mach/platform.h index acc4aabf1c7..b5612a1d183 100644 --- a/arch/arm/mach-lpc32xx/include/mach/platform.h +++ b/arch/arm/mach-lpc32xx/include/mach/platform.h @@ -515,6 +515,7 @@  /*   * clkpwr_timers_pwms_clk_ctrl_1 register definitions   */ +#define LPC32XX_CLKPWR_TMRPWMCLK_MPWM_EN	0x40  #define LPC32XX_CLKPWR_TMRPWMCLK_TIMER3_EN	0x20  #define LPC32XX_CLKPWR_TMRPWMCLK_TIMER2_EN	0x10  #define LPC32XX_CLKPWR_TMRPWMCLK_TIMER1_EN	0x08 diff --git a/arch/arm/mach-lpc32xx/irq.c b/arch/arm/mach-lpc32xx/irq.c index 3c633275335..9ecb8f9c4ef 100644 --- a/arch/arm/mach-lpc32xx/irq.c +++ b/arch/arm/mach-lpc32xx/irq.c @@ -412,7 +412,6 @@ static const struct of_device_id mic_of_match[] __initconst = {  void __init lpc32xx_init_irq(void)  {  	unsigned int i; -	int irq_base;  	/* Setup MIC */  	__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_MIC_BASE)); @@ -443,15 +442,6 @@ void __init lpc32xx_init_irq(void)  	lpc32xx_set_default_mappings(SIC1_APR_DEFAULT, SIC1_ATR_DEFAULT, 32);  	lpc32xx_set_default_mappings(SIC2_APR_DEFAULT, SIC2_ATR_DEFAULT, 64); -	/* mask all interrupts except SUBIRQ */ -	__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_MIC_BASE)); -	__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE)); -	__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE)); - -	/* MIC SUBIRQx interrupts will route handling to the chain handlers */ -	irq_set_chained_handler(IRQ_LPC32XX_SUB1IRQ, lpc32xx_sic1_handler); -	irq_set_chained_handler(IRQ_LPC32XX_SUB2IRQ, lpc32xx_sic2_handler); -  	/* Initially disable all wake events */  	__raw_writel(0, LPC32XX_CLKPWR_P01_ER);  	__raw_writel(0, LPC32XX_CLKPWR_INT_ER); @@ -475,16 +465,13 @@ void __init lpc32xx_init_irq(void)  	of_irq_init(mic_of_match); -	irq_base = irq_alloc_descs(-1, 0, NR_IRQS, 0); -	if (irq_base < 0) { -		pr_warn("Cannot allocate irq_descs, assuming pre-allocated\n"); -		irq_base = 0; -	} -  	lpc32xx_mic_domain = irq_domain_add_legacy(lpc32xx_mic_np, NR_IRQS, -						   irq_base, 0, -						   &irq_domain_simple_ops, +						   0, 0, &irq_domain_simple_ops,  						   NULL);  	if (!lpc32xx_mic_domain)  		panic("Unable to add MIC irq domain\n"); + +	/* MIC SUBIRQx interrupts will route handling to the chain handlers */ +	irq_set_chained_handler(IRQ_LPC32XX_SUB1IRQ, lpc32xx_sic1_handler); +	irq_set_chained_handler(IRQ_LPC32XX_SUB2IRQ, lpc32xx_sic2_handler);  } diff --git a/arch/arm/mach-mmp/Kconfig b/arch/arm/mach-mmp/Kconfig index 178d4daa5e1..ebdda8346a2 100644 --- a/arch/arm/mach-mmp/Kconfig +++ b/arch/arm/mach-mmp/Kconfig @@ -89,6 +89,8 @@ config MACH_MMP_DT  	select CPU_PXA168  	select CPU_PXA910  	select USE_OF +	select PINCTRL +	select PINCTRL_SINGLE  	help  	  Include support for Marvell MMP2 based platforms using  	  the device tree. Needn't select any other machine while @@ -99,6 +101,8 @@ config MACH_MMP2_DT  	depends on !CPU_MOHAWK  	select CPU_MMP2  	select USE_OF +	select PINCTRL +	select PINCTRL_SINGLE  	help  	  Include support for Marvell MMP2 based platforms using  	  the device tree. diff --git a/arch/arm/mach-nomadik/Kconfig b/arch/arm/mach-nomadik/Kconfig index c744946ef02..706dc5727bb 100644 --- a/arch/arm/mach-nomadik/Kconfig +++ b/arch/arm/mach-nomadik/Kconfig @@ -4,7 +4,7 @@ menu "Nomadik boards"  config MACH_NOMADIK_8815NHK  	bool "ST 8815 Nomadik Hardware Kit (evaluation board)" -	select HAS_MTU +	select CLKSRC_NOMADIK_MTU  	select NOMADIK_8815  endmenu diff --git a/arch/arm/mach-nomadik/board-nhk8815.c b/arch/arm/mach-nomadik/board-nhk8815.c index bfa1eab91f4..5ccdf53c5a9 100644 --- a/arch/arm/mach-nomadik/board-nhk8815.c +++ b/arch/arm/mach-nomadik/board-nhk8815.c @@ -24,20 +24,17 @@  #include <linux/i2c.h>  #include <linux/io.h>  #include <linux/pinctrl/machine.h> +#include <linux/platform_data/pinctrl-nomadik.h> +#include <linux/platform_data/clocksource-nomadik-mtu.h> +#include <linux/platform_data/mtd-nomadik-nand.h>  #include <asm/hardware/vic.h>  #include <asm/sizes.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <asm/mach/irq.h>  #include <asm/mach/flash.h>  #include <asm/mach/time.h> - -#include <plat/gpio-nomadik.h> -#include <plat/mtu.h> -#include <plat/pincfg.h> - -#include <linux/platform_data/mtd-nomadik-nand.h>  #include <mach/fsmc.h> +#include <mach/irqs.h>  #include "cpu-8815.h" @@ -261,7 +258,7 @@ static void __init nomadik_timer_init(void)  	src_cr |= SRC_CR_INIT_VAL;  	writel(src_cr, io_p2v(NOMADIK_SRC_BASE)); -	nmdk_timer_init(io_p2v(NOMADIK_MTU0_BASE)); +	nmdk_timer_init(io_p2v(NOMADIK_MTU0_BASE), IRQ_MTU0);  }  static struct sys_timer nomadik_timer = { diff --git a/arch/arm/mach-nomadik/cpu-8815.c b/arch/arm/mach-nomadik/cpu-8815.c index b617eaed0ce..1273931303f 100644 --- a/arch/arm/mach-nomadik/cpu-8815.c +++ b/arch/arm/mach-nomadik/cpu-8815.c @@ -26,8 +26,8 @@  #include <linux/irq.h>  #include <linux/dma-mapping.h>  #include <linux/platform_data/clk-nomadik.h> +#include <linux/platform_data/pinctrl-nomadik.h> -#include <plat/gpio-nomadik.h>  #include <mach/hardware.h>  #include <mach/irqs.h>  #include <asm/mach/map.h> diff --git a/arch/arm/mach-nomadik/i2c-8815nhk.c b/arch/arm/mach-nomadik/i2c-8815nhk.c index 6d14454d460..0c2f6628299 100644 --- a/arch/arm/mach-nomadik/i2c-8815nhk.c +++ b/arch/arm/mach-nomadik/i2c-8815nhk.c @@ -4,8 +4,7 @@  #include <linux/i2c-algo-bit.h>  #include <linux/i2c-gpio.h>  #include <linux/platform_device.h> -#include <plat/gpio-nomadik.h> -#include <plat/pincfg.h> +#include <linux/platform_data/pinctrl-nomadik.h>  /*   * There are two busses in the 8815NHK. diff --git a/arch/arm/mach-nomadik/include/mach/irqs.h b/arch/arm/mach-nomadik/include/mach/irqs.h index a118e615f86..b549d057154 100644 --- a/arch/arm/mach-nomadik/include/mach/irqs.h +++ b/arch/arm/mach-nomadik/include/mach/irqs.h @@ -72,7 +72,7 @@  #define NOMADIK_NR_GPIO			128 /* last 4 not wired to pins */  #define NOMADIK_GPIO_TO_IRQ(gpio)	((gpio) + NOMADIK_GPIO_OFFSET)  #define NOMADIK_IRQ_TO_GPIO(irq)	((irq) - NOMADIK_GPIO_OFFSET) -#define NR_IRQS				NOMADIK_GPIO_TO_IRQ(NOMADIK_NR_GPIO) +#define NOMADIK_NR_IRQS			NOMADIK_GPIO_TO_IRQ(NOMADIK_NR_GPIO)  /* Following two are used by entry_macro.S, to access our dual-vic */  #define VIC_REG_IRQSR0		0 diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c index e067f221f0f..560a7dcf0a5 100644 --- a/arch/arm/mach-omap1/board-fsample.c +++ b/arch/arm/mach-omap1/board-fsample.c @@ -307,8 +307,7 @@ static void __init omap_fsample_init(void)  	fsample_init_smc91x(); -	if (gpio_request(FSAMPLE_NAND_RB_GPIO_PIN, "NAND ready") < 0) -		BUG(); +	BUG_ON(gpio_request(FSAMPLE_NAND_RB_GPIO_PIN, "NAND ready") < 0);  	gpio_direction_input(FSAMPLE_NAND_RB_GPIO_PIN);  	omap_cfg_reg(L3_1610_FLASH_CS2B_OE); diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index dcf364d1a8b..2274bd677ef 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c @@ -412,8 +412,7 @@ static void __init h2_init(void)  	h2_nand_resource.end = h2_nand_resource.start = OMAP_CS2B_PHYS;  	h2_nand_resource.end += SZ_4K - 1; -	if (gpio_request(H2_NAND_RB_GPIO_PIN, "NAND ready") < 0) -		BUG(); +	BUG_ON(gpio_request(H2_NAND_RB_GPIO_PIN, "NAND ready") < 0);  	gpio_direction_input(H2_NAND_RB_GPIO_PIN);  	omap_cfg_reg(L3_1610_FLASH_CS2B_OE); diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index b3fcdedb44c..1051935f0aa 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c @@ -406,8 +406,7 @@ static void __init h3_init(void)  	nand_resource.end = nand_resource.start = OMAP_CS2B_PHYS;  	nand_resource.end += SZ_4K - 1; -	if (gpio_request(H3_NAND_RB_GPIO_PIN, "NAND ready") < 0) -		BUG(); +	BUG_ON(gpio_request(H3_NAND_RB_GPIO_PIN, "NAND ready") < 0);  	gpio_direction_input(H3_NAND_RB_GPIO_PIN);  	/* GPIO10 Func_MUX_CTRL reg bit 29:27, Configure V2 to mode1 as GPIO */ diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index 9a7e483ed6f..27f8d12ec22 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c @@ -275,8 +275,7 @@ static void __init omap_perseus2_init(void)  	perseus2_init_smc91x(); -	if (gpio_request(P2_NAND_RB_GPIO_PIN, "NAND ready") < 0) -		BUG(); +	BUG_ON(gpio_request(P2_NAND_RB_GPIO_PIN, "NAND ready") < 0);  	gpio_direction_input(P2_NAND_RB_GPIO_PIN);  	omap_cfg_reg(L3_1610_FLASH_CS2B_OE); diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index c81bc508e7a..be0f62bf903 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -275,14 +275,14 @@ config MACH_NOKIA_N8X0  	select OMAP_PACKAGE_ZAC  config MACH_NOKIA_RM680 -	bool "Nokia RM-680/696 board" +	bool "Nokia N950 (RM-680) / N9 (RM-696) phones"  	depends on ARCH_OMAP3  	default y  	select MACH_NOKIA_RM696  	select OMAP_PACKAGE_CBB  config MACH_NOKIA_RX51 -	bool "Nokia RX-51 board" +	bool "Nokia N900 (RX-51) phone"  	depends on ARCH_OMAP3  	default y  	select OMAP_PACKAGE_CBB diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 745401020c2..a8004f33b7e 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -202,8 +202,6 @@ obj-$(CONFIG_HW_PERF_EVENTS)		+= pmu.o  obj-$(CONFIG_OMAP_MBOX_FWK)		+= mailbox_mach.o  mailbox_mach-objs			:= mailbox.o -obj-$(CONFIG_OMAP_IOMMU)		+= iommu2.o -  iommu-$(CONFIG_OMAP_IOMMU)		:= omap-iommu.o  obj-y					+= $(iommu-m) $(iommu-y) @@ -297,4 +295,4 @@ endif  emac-$(CONFIG_TI_DAVINCI_EMAC)		:= am35xx-emac.o  obj-y					+= $(emac-m) $(emac-y) -obj-y					+= common-board-devices.o twl-common.o +obj-y					+= common-board-devices.o twl-common.o dss-common.o diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 85dfa71e0dc..1cc6696594f 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c @@ -36,9 +36,6 @@  #include "common.h"  #include "omap4-keypad.h" -#include <video/omapdss.h> -#include <video/omap-panel-nokia-dsi.h> -#include <video/omap-panel-picodlp.h>  #include <linux/wl12xx.h>  #include <linux/platform_data/omap-abe-twl6040.h> @@ -48,17 +45,13 @@  #include "hsmmc.h"  #include "control.h"  #include "common-board-devices.h" +#include "dss-common.h"  #define ETH_KS8851_IRQ			34  #define ETH_KS8851_POWER_ON		48  #define ETH_KS8851_QUART		138  #define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO	184  #define OMAP4_SFH7741_ENABLE_GPIO		188 -#define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */ -#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ -#define HDMI_GPIO_HPD  63 /* Hotplug detect */ -#define DISPLAY_SEL_GPIO	59	/* LCD2/PicoDLP switch */ -#define DLP_POWER_ON_GPIO	40  #define GPIO_WIFI_PMENA		54  #define GPIO_WIFI_IRQ		53 @@ -607,154 +600,6 @@ static void __init omap_sfh7741prox_init(void)  			__func__, OMAP4_SFH7741_ENABLE_GPIO, error);  } -static struct nokia_dsi_panel_data dsi1_panel = { -		.name		= "taal", -		.reset_gpio	= 102, -		.use_ext_te	= false, -		.ext_te_gpio	= 101, -		.esd_interval	= 0, -		.pin_config = { -			.num_pins	= 6, -			.pins		= { 0, 1, 2, 3, 4, 5 }, -		}, -}; - -static struct omap_dss_device sdp4430_lcd_device = { -	.name			= "lcd", -	.driver_name		= "taal", -	.type			= OMAP_DISPLAY_TYPE_DSI, -	.data			= &dsi1_panel, -	.phy.dsi		= { -		.module		= 0, -	}, -	.channel		= OMAP_DSS_CHANNEL_LCD, -}; - -static struct nokia_dsi_panel_data dsi2_panel = { -		.name		= "taal", -		.reset_gpio	= 104, -		.use_ext_te	= false, -		.ext_te_gpio	= 103, -		.esd_interval	= 0, -		.pin_config = { -			.num_pins	= 6, -			.pins		= { 0, 1, 2, 3, 4, 5 }, -		}, -}; - -static struct omap_dss_device sdp4430_lcd2_device = { -	.name			= "lcd2", -	.driver_name		= "taal", -	.type			= OMAP_DISPLAY_TYPE_DSI, -	.data			= &dsi2_panel, -	.phy.dsi		= { - -		.module		= 1, -	}, -	.channel		= OMAP_DSS_CHANNEL_LCD2, -}; - -static struct omap_dss_hdmi_data sdp4430_hdmi_data = { -	.ct_cp_hpd_gpio = HDMI_GPIO_CT_CP_HPD, -	.ls_oe_gpio = HDMI_GPIO_LS_OE, -	.hpd_gpio = HDMI_GPIO_HPD, -}; - -static struct omap_dss_device sdp4430_hdmi_device = { -	.name = "hdmi", -	.driver_name = "hdmi_panel", -	.type = OMAP_DISPLAY_TYPE_HDMI, -	.channel = OMAP_DSS_CHANNEL_DIGIT, -	.data = &sdp4430_hdmi_data, -}; - -static struct picodlp_panel_data sdp4430_picodlp_pdata = { -	.picodlp_adapter_id	= 2, -	.emu_done_gpio		= 44, -	.pwrgood_gpio		= 45, -}; - -static void sdp4430_picodlp_init(void) -{ -	int r; -	const struct gpio picodlp_gpios[] = { -		{DLP_POWER_ON_GPIO, GPIOF_OUT_INIT_LOW, -			"DLP POWER ON"}, -		{sdp4430_picodlp_pdata.emu_done_gpio, GPIOF_IN, -			"DLP EMU DONE"}, -		{sdp4430_picodlp_pdata.pwrgood_gpio, GPIOF_OUT_INIT_LOW, -			"DLP PWRGOOD"}, -	}; - -	r = gpio_request_array(picodlp_gpios, ARRAY_SIZE(picodlp_gpios)); -	if (r) -		pr_err("Cannot request PicoDLP GPIOs, error %d\n", r); -} - -static int sdp4430_panel_enable_picodlp(struct omap_dss_device *dssdev) -{ -	gpio_set_value(DISPLAY_SEL_GPIO, 0); -	gpio_set_value(DLP_POWER_ON_GPIO, 1); - -	return 0; -} - -static void sdp4430_panel_disable_picodlp(struct omap_dss_device *dssdev) -{ -	gpio_set_value(DLP_POWER_ON_GPIO, 0); -	gpio_set_value(DISPLAY_SEL_GPIO, 1); -} - -static struct omap_dss_device sdp4430_picodlp_device = { -	.name			= "picodlp", -	.driver_name		= "picodlp_panel", -	.type			= OMAP_DISPLAY_TYPE_DPI, -	.phy.dpi.data_lines	= 24, -	.channel		= OMAP_DSS_CHANNEL_LCD2, -	.platform_enable	= sdp4430_panel_enable_picodlp, -	.platform_disable	= sdp4430_panel_disable_picodlp, -	.data			= &sdp4430_picodlp_pdata, -}; - -static struct omap_dss_device *sdp4430_dss_devices[] = { -	&sdp4430_lcd_device, -	&sdp4430_lcd2_device, -	&sdp4430_hdmi_device, -	&sdp4430_picodlp_device, -}; - -static struct omap_dss_board_info sdp4430_dss_data = { -	.num_devices	= ARRAY_SIZE(sdp4430_dss_devices), -	.devices	= sdp4430_dss_devices, -	.default_device	= &sdp4430_lcd_device, -}; - -static void __init omap_4430sdp_display_init(void) -{ -	int r; - -	/* Enable LCD2 by default (instead of Pico DLP) */ -	r = gpio_request_one(DISPLAY_SEL_GPIO, GPIOF_OUT_INIT_HIGH, -			"display_sel"); -	if (r) -		pr_err("%s: Could not get display_sel GPIO\n", __func__); - -	sdp4430_picodlp_init(); -	omap_display_init(&sdp4430_dss_data); -	/* -	 * OMAP4460SDP/Blaze and OMAP4430 ES2.3 SDP/Blaze boards and -	 * later have external pull up on the HDMI I2C lines -	 */ -	if (cpu_is_omap446x() || omap_rev() > OMAP4430_REV_ES2_2) -		omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP); -	else -		omap_hdmi_init(0); - -	omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT); -	omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT); -	omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN); -} -  #ifdef CONFIG_OMAP_MUX  static struct omap_board_mux board_mux[] __initdata = {  	OMAP4_MUX(USBB2_ULPITLL_CLK, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index f0715a369c4..53cb380b787 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -21,6 +21,7 @@  #include "common.h"  #include "common-board-devices.h" +#include "dss-common.h"  #if !(defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3))  #define intc_of_init	NULL @@ -40,6 +41,15 @@ static void __init omap_generic_init(void)  	omap_sdrc_init(NULL, NULL);  	of_platform_populate(NULL, omap_dt_match_table, NULL, NULL); + +	/* +	 * HACK: call display setup code for selected boards to enable omapdss. +	 * This will be removed when omapdss supports DT. +	 */ +	if (of_machine_is_compatible("ti,omap4-panda")) +		omap4_panda_display_init_of(); +	else if (of_machine_is_compatible("ti,omap4-sdp")) +		omap_4430sdp_display_init_of();  }  #ifdef CONFIG_SOC_OMAP2420 diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 12a3a24d5bb..5c8e9cee2c2 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c @@ -37,9 +37,6 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <video/omapdss.h> - -#include <video/omap-panel-tfp410.h>  #include "common.h"  #include "soc.h" @@ -48,14 +45,12 @@  #include "control.h"  #include "mux.h"  #include "common-board-devices.h" +#include "dss-common.h"  #define GPIO_HUB_POWER		1  #define GPIO_HUB_NRESET		62  #define GPIO_WIFI_PMENA		43  #define GPIO_WIFI_IRQ		53 -#define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */ -#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ -#define HDMI_GPIO_HPD  63 /* Hotplug detect */  /* wl127x BT, FM, GPS connectivity chip */  static struct ti_st_plat_data wilink_platform_data = { @@ -409,68 +404,6 @@ static struct omap_board_mux board_mux[] __initdata = {  #define board_mux	NULL  #endif -/* Display DVI */ -#define PANDA_DVI_TFP410_POWER_DOWN_GPIO	0 - -/* Using generic display panel */ -static struct tfp410_platform_data omap4_dvi_panel = { -	.i2c_bus_num		= 3, -	.power_down_gpio	= PANDA_DVI_TFP410_POWER_DOWN_GPIO, -}; - -static struct omap_dss_device omap4_panda_dvi_device = { -	.type			= OMAP_DISPLAY_TYPE_DPI, -	.name			= "dvi", -	.driver_name		= "tfp410", -	.data			= &omap4_dvi_panel, -	.phy.dpi.data_lines	= 24, -	.reset_gpio		= PANDA_DVI_TFP410_POWER_DOWN_GPIO, -	.channel		= OMAP_DSS_CHANNEL_LCD2, -}; - -static struct omap_dss_hdmi_data omap4_panda_hdmi_data = { -	.ct_cp_hpd_gpio = HDMI_GPIO_CT_CP_HPD, -	.ls_oe_gpio = HDMI_GPIO_LS_OE, -	.hpd_gpio = HDMI_GPIO_HPD, -}; - -static struct omap_dss_device  omap4_panda_hdmi_device = { -	.name = "hdmi", -	.driver_name = "hdmi_panel", -	.type = OMAP_DISPLAY_TYPE_HDMI, -	.channel = OMAP_DSS_CHANNEL_DIGIT, -	.data = &omap4_panda_hdmi_data, -}; - -static struct omap_dss_device *omap4_panda_dss_devices[] = { -	&omap4_panda_dvi_device, -	&omap4_panda_hdmi_device, -}; - -static struct omap_dss_board_info omap4_panda_dss_data = { -	.num_devices	= ARRAY_SIZE(omap4_panda_dss_devices), -	.devices	= omap4_panda_dss_devices, -	.default_device	= &omap4_panda_dvi_device, -}; - -static void __init omap4_panda_display_init(void) -{ - -	omap_display_init(&omap4_panda_dss_data); - -	/* -	 * OMAP4460SDP/Blaze and OMAP4430 ES2.3 SDP/Blaze boards and -	 * later have external pull up on the HDMI I2C lines -	 */ -	if (cpu_is_omap446x() || omap_rev() > OMAP4430_REV_ES2_2) -		omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP); -	else -		omap_hdmi_init(0); - -	omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT); -	omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT); -	omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN); -}  static void omap4_panda_init_rev(void)  { diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index cbcb1b2dc31..0c777b75e48 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c @@ -1,5 +1,5 @@  /* - * Board support file for Nokia RM-680/696. + * Board support file for Nokia N950 (RM-680) / N9 (RM-696).   *   * Copyright (C) 2010 Nokia   * diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index ee1045c0ad6..f1d6efe079c 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c @@ -1,5 +1,5 @@  /* - * linux/arch/arm/mach-omap2/board-rx51.c + * Board support file for Nokia N900 (aka RX-51).   *   * Copyright (C) 2007, 2008 Nokia   * diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 3bbcde87dea..948bcaa82eb 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h @@ -214,6 +214,9 @@ static inline void __iomem *omap4_get_scu_base(void)  #endif  extern void __init gic_init_irq(void); +extern void gic_dist_disable(void); +extern bool gic_dist_disabled(void); +extern void gic_timer_retrigger(void);  extern void omap_smc1(u32 fn, u32 arg);  extern void __iomem *omap4_get_sar_ram_base(void);  extern void omap_do_wfi(void); @@ -221,6 +224,7 @@ extern void omap_do_wfi(void);  #ifdef CONFIG_SMP  /* Needed for secondary core boot */  extern void omap_secondary_startup(void); +extern void omap_secondary_startup_4460(void);  extern u32 omap_modify_auxcoreboot0(u32 set_mask, u32 clear_mask);  extern void omap_auxcoreboot_addr(u32 cpu_addr);  extern u32 omap_read_auxcoreboot0(void); diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index cafe04660a4..c67a731cfbb 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -129,7 +129,7 @@ static struct platform_device omap2cam_device = {  #if defined(CONFIG_IOMMU_API) -#include <plat/iommu.h> +#include <linux/platform_data/iommu-omap.h>  static struct resource omap3isp_resources[] = {  	{ diff --git a/arch/arm/mach-omap2/drm.c b/arch/arm/mach-omap2/drm.c index 6282cc82661..fce5aa3fff4 100644 --- a/arch/arm/mach-omap2/drm.c +++ b/arch/arm/mach-omap2/drm.c @@ -23,15 +23,20 @@  #include <linux/init.h>  #include <linux/platform_device.h>  #include <linux/dma-mapping.h> +#include <linux/platform_data/omap_drm.h>  #include "omap_device.h"  #include "omap_hwmod.h" +#include <plat/cpu.h>  #if defined(CONFIG_DRM_OMAP) || (CONFIG_DRM_OMAP_MODULE) +static struct omap_drm_platform_data platform_data; +  static struct platform_device omap_drm_device = {  	.dev = {  		.coherent_dma_mask = DMA_BIT_MASK(32), +		.platform_data = &platform_data,  	},  	.name = "omapdrm",  	.id = 0, @@ -52,6 +57,8 @@ static int __init omap_init_drm(void)  			oh->name);  	} +	platform_data.omaprev = GET_OMAP_REVISION(); +  	return platform_device_register(&omap_drm_device);  } diff --git a/arch/arm/mach-omap2/dss-common.c b/arch/arm/mach-omap2/dss-common.c new file mode 100644 index 00000000000..679a0478644 --- /dev/null +++ b/arch/arm/mach-omap2/dss-common.c @@ -0,0 +1,276 @@ +/* + * Copyright (C) 2012 Texas Instruments, Inc.. + * Author: Tomi Valkeinen <tomi.valkeinen@ti.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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +/* + * NOTE: this is a transitional file to help with DT adaptation. + * This file will be removed when DSS supports DT. + */ + +#include <linux/kernel.h> +#include <linux/gpio.h> + +#include <video/omapdss.h> +#include <video/omap-panel-tfp410.h> +#include <video/omap-panel-nokia-dsi.h> +#include <video/omap-panel-picodlp.h> + +#include <plat/cpu.h> + +#include "dss-common.h" +#include "mux.h" + +#define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */ +#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ +#define HDMI_GPIO_HPD  63 /* Hotplug detect */ + +/* Display DVI */ +#define PANDA_DVI_TFP410_POWER_DOWN_GPIO	0 + +/* Using generic display panel */ +static struct tfp410_platform_data omap4_dvi_panel = { +	.i2c_bus_num		= 3, +	.power_down_gpio	= PANDA_DVI_TFP410_POWER_DOWN_GPIO, +}; + +static struct omap_dss_device omap4_panda_dvi_device = { +	.type			= OMAP_DISPLAY_TYPE_DPI, +	.name			= "dvi", +	.driver_name		= "tfp410", +	.data			= &omap4_dvi_panel, +	.phy.dpi.data_lines	= 24, +	.reset_gpio		= PANDA_DVI_TFP410_POWER_DOWN_GPIO, +	.channel		= OMAP_DSS_CHANNEL_LCD2, +}; + +static struct omap_dss_hdmi_data omap4_panda_hdmi_data = { +	.ct_cp_hpd_gpio = HDMI_GPIO_CT_CP_HPD, +	.ls_oe_gpio = HDMI_GPIO_LS_OE, +	.hpd_gpio = HDMI_GPIO_HPD, +}; + +static struct omap_dss_device  omap4_panda_hdmi_device = { +	.name = "hdmi", +	.driver_name = "hdmi_panel", +	.type = OMAP_DISPLAY_TYPE_HDMI, +	.channel = OMAP_DSS_CHANNEL_DIGIT, +	.data = &omap4_panda_hdmi_data, +}; + +static struct omap_dss_device *omap4_panda_dss_devices[] = { +	&omap4_panda_dvi_device, +	&omap4_panda_hdmi_device, +}; + +static struct omap_dss_board_info omap4_panda_dss_data = { +	.num_devices	= ARRAY_SIZE(omap4_panda_dss_devices), +	.devices	= omap4_panda_dss_devices, +	.default_device	= &omap4_panda_dvi_device, +}; + +void __init omap4_panda_display_init(void) +{ +	omap_display_init(&omap4_panda_dss_data); + +	/* +	 * OMAP4460SDP/Blaze and OMAP4430 ES2.3 SDP/Blaze boards and +	 * later have external pull up on the HDMI I2C lines +	 */ +	if (cpu_is_omap446x() || omap_rev() > OMAP4430_REV_ES2_2) +		omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP); +	else +		omap_hdmi_init(0); + +	omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN); +} + +void __init omap4_panda_display_init_of(void) +{ +	omap_display_init(&omap4_panda_dss_data); +} + + +/* OMAP4 Blaze display data */ + +#define DISPLAY_SEL_GPIO	59	/* LCD2/PicoDLP switch */ +#define DLP_POWER_ON_GPIO	40 + +static struct nokia_dsi_panel_data dsi1_panel = { +		.name		= "taal", +		.reset_gpio	= 102, +		.use_ext_te	= false, +		.ext_te_gpio	= 101, +		.esd_interval	= 0, +		.pin_config = { +			.num_pins	= 6, +			.pins		= { 0, 1, 2, 3, 4, 5 }, +		}, +}; + +static struct omap_dss_device sdp4430_lcd_device = { +	.name			= "lcd", +	.driver_name		= "taal", +	.type			= OMAP_DISPLAY_TYPE_DSI, +	.data			= &dsi1_panel, +	.phy.dsi		= { +		.module		= 0, +	}, +	.channel		= OMAP_DSS_CHANNEL_LCD, +}; + +static struct nokia_dsi_panel_data dsi2_panel = { +		.name		= "taal", +		.reset_gpio	= 104, +		.use_ext_te	= false, +		.ext_te_gpio	= 103, +		.esd_interval	= 0, +		.pin_config = { +			.num_pins	= 6, +			.pins		= { 0, 1, 2, 3, 4, 5 }, +		}, +}; + +static struct omap_dss_device sdp4430_lcd2_device = { +	.name			= "lcd2", +	.driver_name		= "taal", +	.type			= OMAP_DISPLAY_TYPE_DSI, +	.data			= &dsi2_panel, +	.phy.dsi		= { + +		.module		= 1, +	}, +	.channel		= OMAP_DSS_CHANNEL_LCD2, +}; + +static struct omap_dss_hdmi_data sdp4430_hdmi_data = { +	.ct_cp_hpd_gpio = HDMI_GPIO_CT_CP_HPD, +	.ls_oe_gpio = HDMI_GPIO_LS_OE, +	.hpd_gpio = HDMI_GPIO_HPD, +}; + +static struct omap_dss_device sdp4430_hdmi_device = { +	.name = "hdmi", +	.driver_name = "hdmi_panel", +	.type = OMAP_DISPLAY_TYPE_HDMI, +	.channel = OMAP_DSS_CHANNEL_DIGIT, +	.data = &sdp4430_hdmi_data, +}; + +static struct picodlp_panel_data sdp4430_picodlp_pdata = { +	.picodlp_adapter_id	= 2, +	.emu_done_gpio		= 44, +	.pwrgood_gpio		= 45, +}; + +static void sdp4430_picodlp_init(void) +{ +	int r; +	const struct gpio picodlp_gpios[] = { +		{DLP_POWER_ON_GPIO, GPIOF_OUT_INIT_LOW, +			"DLP POWER ON"}, +		{sdp4430_picodlp_pdata.emu_done_gpio, GPIOF_IN, +			"DLP EMU DONE"}, +		{sdp4430_picodlp_pdata.pwrgood_gpio, GPIOF_OUT_INIT_LOW, +			"DLP PWRGOOD"}, +	}; + +	r = gpio_request_array(picodlp_gpios, ARRAY_SIZE(picodlp_gpios)); +	if (r) +		pr_err("Cannot request PicoDLP GPIOs, error %d\n", r); +} + +static int sdp4430_panel_enable_picodlp(struct omap_dss_device *dssdev) +{ +	gpio_set_value(DISPLAY_SEL_GPIO, 0); +	gpio_set_value(DLP_POWER_ON_GPIO, 1); + +	return 0; +} + +static void sdp4430_panel_disable_picodlp(struct omap_dss_device *dssdev) +{ +	gpio_set_value(DLP_POWER_ON_GPIO, 0); +	gpio_set_value(DISPLAY_SEL_GPIO, 1); +} + +static struct omap_dss_device sdp4430_picodlp_device = { +	.name			= "picodlp", +	.driver_name		= "picodlp_panel", +	.type			= OMAP_DISPLAY_TYPE_DPI, +	.phy.dpi.data_lines	= 24, +	.channel		= OMAP_DSS_CHANNEL_LCD2, +	.platform_enable	= sdp4430_panel_enable_picodlp, +	.platform_disable	= sdp4430_panel_disable_picodlp, +	.data			= &sdp4430_picodlp_pdata, +}; + +static struct omap_dss_device *sdp4430_dss_devices[] = { +	&sdp4430_lcd_device, +	&sdp4430_lcd2_device, +	&sdp4430_hdmi_device, +	&sdp4430_picodlp_device, +}; + +static struct omap_dss_board_info sdp4430_dss_data = { +	.num_devices	= ARRAY_SIZE(sdp4430_dss_devices), +	.devices	= sdp4430_dss_devices, +	.default_device	= &sdp4430_lcd_device, +}; + +void __init omap_4430sdp_display_init(void) +{ +	int r; + +	/* Enable LCD2 by default (instead of Pico DLP) */ +	r = gpio_request_one(DISPLAY_SEL_GPIO, GPIOF_OUT_INIT_HIGH, +			"display_sel"); +	if (r) +		pr_err("%s: Could not get display_sel GPIO\n", __func__); + +	sdp4430_picodlp_init(); +	omap_display_init(&sdp4430_dss_data); +	/* +	 * OMAP4460SDP/Blaze and OMAP4430 ES2.3 SDP/Blaze boards and +	 * later have external pull up on the HDMI I2C lines +	 */ +	if (cpu_is_omap446x() || omap_rev() > OMAP4430_REV_ES2_2) +		omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP); +	else +		omap_hdmi_init(0); + +	omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN); +} + +void __init omap_4430sdp_display_init_of(void) +{ +	int r; + +	/* Enable LCD2 by default (instead of Pico DLP) */ +	r = gpio_request_one(DISPLAY_SEL_GPIO, GPIOF_OUT_INIT_HIGH, +			"display_sel"); +	if (r) +		pr_err("%s: Could not get display_sel GPIO\n", __func__); + +	sdp4430_picodlp_init(); +	omap_display_init(&sdp4430_dss_data); +} diff --git a/arch/arm/mach-omap2/dss-common.h b/arch/arm/mach-omap2/dss-common.h new file mode 100644 index 00000000000..915f6fff510 --- /dev/null +++ b/arch/arm/mach-omap2/dss-common.h @@ -0,0 +1,14 @@ +#ifndef __OMAP_DSS_COMMON__ +#define __OMAP_DSS_COMMON__ + +/* + * NOTE: this is a transitional file to help with DT adaptation. + * This file will be removed when DSS supports DT. + */ + +void __init omap4_panda_display_init(void); +void __init omap4_panda_display_init_of(void); +void __init omap_4430sdp_display_init(void); +void __init omap_4430sdp_display_init_of(void); + +#endif diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c deleted file mode 100644 index eefc37912ef..00000000000 --- a/arch/arm/mach-omap2/iommu2.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * omap iommu: omap2/3 architecture specific functions - * - * Copyright (C) 2008-2009 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>, - *		Paul Mundt and Toshihiro Kobayashi - * - * 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/err.h> -#include <linux/device.h> -#include <linux/jiffies.h> -#include <linux/module.h> -#include <linux/slab.h> -#include <linux/stringify.h> - -#include <plat/iommu.h> - -/* - * omap2 architecture specific register bit definitions - */ -#define IOMMU_ARCH_VERSION	0x00000011 - -/* SYSCONF */ -#define MMU_SYS_IDLE_SHIFT	3 -#define MMU_SYS_IDLE_FORCE	(0 << MMU_SYS_IDLE_SHIFT) -#define MMU_SYS_IDLE_NONE	(1 << MMU_SYS_IDLE_SHIFT) -#define MMU_SYS_IDLE_SMART	(2 << MMU_SYS_IDLE_SHIFT) -#define MMU_SYS_IDLE_MASK	(3 << MMU_SYS_IDLE_SHIFT) - -#define MMU_SYS_SOFTRESET	(1 << 1) -#define MMU_SYS_AUTOIDLE	1 - -/* SYSSTATUS */ -#define MMU_SYS_RESETDONE	1 - -/* IRQSTATUS & IRQENABLE */ -#define MMU_IRQ_MULTIHITFAULT	(1 << 4) -#define MMU_IRQ_TABLEWALKFAULT	(1 << 3) -#define MMU_IRQ_EMUMISS		(1 << 2) -#define MMU_IRQ_TRANSLATIONFAULT	(1 << 1) -#define MMU_IRQ_TLBMISS		(1 << 0) - -#define __MMU_IRQ_FAULT		\ -	(MMU_IRQ_MULTIHITFAULT | MMU_IRQ_EMUMISS | MMU_IRQ_TRANSLATIONFAULT) -#define MMU_IRQ_MASK		\ -	(__MMU_IRQ_FAULT | MMU_IRQ_TABLEWALKFAULT | MMU_IRQ_TLBMISS) -#define MMU_IRQ_TWL_MASK	(__MMU_IRQ_FAULT | MMU_IRQ_TABLEWALKFAULT) -#define MMU_IRQ_TLB_MISS_MASK	(__MMU_IRQ_FAULT | MMU_IRQ_TLBMISS) - -/* MMU_CNTL */ -#define MMU_CNTL_SHIFT		1 -#define MMU_CNTL_MASK		(7 << MMU_CNTL_SHIFT) -#define MMU_CNTL_EML_TLB	(1 << 3) -#define MMU_CNTL_TWL_EN		(1 << 2) -#define MMU_CNTL_MMU_EN		(1 << 1) - -#define get_cam_va_mask(pgsz)				\ -	(((pgsz) == MMU_CAM_PGSZ_16M) ? 0xff000000 :	\ -	 ((pgsz) == MMU_CAM_PGSZ_1M)  ? 0xfff00000 :	\ -	 ((pgsz) == MMU_CAM_PGSZ_64K) ? 0xffff0000 :	\ -	 ((pgsz) == MMU_CAM_PGSZ_4K)  ? 0xfffff000 : 0) - - -static void __iommu_set_twl(struct omap_iommu *obj, bool on) -{ -	u32 l = iommu_read_reg(obj, MMU_CNTL); - -	if (on) -		iommu_write_reg(obj, MMU_IRQ_TWL_MASK, MMU_IRQENABLE); -	else -		iommu_write_reg(obj, MMU_IRQ_TLB_MISS_MASK, MMU_IRQENABLE); - -	l &= ~MMU_CNTL_MASK; -	if (on) -		l |= (MMU_CNTL_MMU_EN | MMU_CNTL_TWL_EN); -	else -		l |= (MMU_CNTL_MMU_EN); - -	iommu_write_reg(obj, l, MMU_CNTL); -} - - -static int omap2_iommu_enable(struct omap_iommu *obj) -{ -	u32 l, pa; -	unsigned long timeout; - -	if (!obj->iopgd || !IS_ALIGNED((u32)obj->iopgd,  SZ_16K)) -		return -EINVAL; - -	pa = virt_to_phys(obj->iopgd); -	if (!IS_ALIGNED(pa, SZ_16K)) -		return -EINVAL; - -	iommu_write_reg(obj, MMU_SYS_SOFTRESET, MMU_SYSCONFIG); - -	timeout = jiffies + msecs_to_jiffies(20); -	do { -		l = iommu_read_reg(obj, MMU_SYSSTATUS); -		if (l & MMU_SYS_RESETDONE) -			break; -	} while (!time_after(jiffies, timeout)); - -	if (!(l & MMU_SYS_RESETDONE)) { -		dev_err(obj->dev, "can't take mmu out of reset\n"); -		return -ENODEV; -	} - -	l = iommu_read_reg(obj, MMU_REVISION); -	dev_info(obj->dev, "%s: version %d.%d\n", obj->name, -		 (l >> 4) & 0xf, l & 0xf); - -	l = iommu_read_reg(obj, MMU_SYSCONFIG); -	l &= ~MMU_SYS_IDLE_MASK; -	l |= (MMU_SYS_IDLE_SMART | MMU_SYS_AUTOIDLE); -	iommu_write_reg(obj, l, MMU_SYSCONFIG); - -	iommu_write_reg(obj, pa, MMU_TTB); - -	__iommu_set_twl(obj, true); - -	return 0; -} - -static void omap2_iommu_disable(struct omap_iommu *obj) -{ -	u32 l = iommu_read_reg(obj, MMU_CNTL); - -	l &= ~MMU_CNTL_MASK; -	iommu_write_reg(obj, l, MMU_CNTL); -	iommu_write_reg(obj, MMU_SYS_IDLE_FORCE, MMU_SYSCONFIG); - -	dev_dbg(obj->dev, "%s is shutting down\n", obj->name); -} - -static void omap2_iommu_set_twl(struct omap_iommu *obj, bool on) -{ -	__iommu_set_twl(obj, false); -} - -static u32 omap2_iommu_fault_isr(struct omap_iommu *obj, u32 *ra) -{ -	u32 stat, da; -	u32 errs = 0; - -	stat = iommu_read_reg(obj, MMU_IRQSTATUS); -	stat &= MMU_IRQ_MASK; -	if (!stat) { -		*ra = 0; -		return 0; -	} - -	da = iommu_read_reg(obj, MMU_FAULT_AD); -	*ra = da; - -	if (stat & MMU_IRQ_TLBMISS) -		errs |= OMAP_IOMMU_ERR_TLB_MISS; -	if (stat & MMU_IRQ_TRANSLATIONFAULT) -		errs |= OMAP_IOMMU_ERR_TRANS_FAULT; -	if (stat & MMU_IRQ_EMUMISS) -		errs |= OMAP_IOMMU_ERR_EMU_MISS; -	if (stat & MMU_IRQ_TABLEWALKFAULT) -		errs |= OMAP_IOMMU_ERR_TBLWALK_FAULT; -	if (stat & MMU_IRQ_MULTIHITFAULT) -		errs |= OMAP_IOMMU_ERR_MULTIHIT_FAULT; -	iommu_write_reg(obj, stat, MMU_IRQSTATUS); - -	return errs; -} - -static void omap2_tlb_read_cr(struct omap_iommu *obj, struct cr_regs *cr) -{ -	cr->cam = iommu_read_reg(obj, MMU_READ_CAM); -	cr->ram = iommu_read_reg(obj, MMU_READ_RAM); -} - -static void omap2_tlb_load_cr(struct omap_iommu *obj, struct cr_regs *cr) -{ -	iommu_write_reg(obj, cr->cam | MMU_CAM_V, MMU_CAM); -	iommu_write_reg(obj, cr->ram, MMU_RAM); -} - -static u32 omap2_cr_to_virt(struct cr_regs *cr) -{ -	u32 page_size = cr->cam & MMU_CAM_PGSZ_MASK; -	u32 mask = get_cam_va_mask(cr->cam & page_size); - -	return cr->cam & mask; -} - -static struct cr_regs *omap2_alloc_cr(struct omap_iommu *obj, -						struct iotlb_entry *e) -{ -	struct cr_regs *cr; - -	if (e->da & ~(get_cam_va_mask(e->pgsz))) { -		dev_err(obj->dev, "%s:\twrong alignment: %08x\n", __func__, -			e->da); -		return ERR_PTR(-EINVAL); -	} - -	cr = kmalloc(sizeof(*cr), GFP_KERNEL); -	if (!cr) -		return ERR_PTR(-ENOMEM); - -	cr->cam = (e->da & MMU_CAM_VATAG_MASK) | e->prsvd | e->pgsz | e->valid; -	cr->ram = e->pa | e->endian | e->elsz | e->mixed; - -	return cr; -} - -static inline int omap2_cr_valid(struct cr_regs *cr) -{ -	return cr->cam & MMU_CAM_V; -} - -static u32 omap2_get_pte_attr(struct iotlb_entry *e) -{ -	u32 attr; - -	attr = e->mixed << 5; -	attr |= e->endian; -	attr |= e->elsz >> 3; -	attr <<= (((e->pgsz == MMU_CAM_PGSZ_4K) || -			(e->pgsz == MMU_CAM_PGSZ_64K)) ? 0 : 6); -	return attr; -} - -static ssize_t -omap2_dump_cr(struct omap_iommu *obj, struct cr_regs *cr, char *buf) -{ -	char *p = buf; - -	/* FIXME: Need more detail analysis of cam/ram */ -	p += sprintf(p, "%08x %08x %01x\n", cr->cam, cr->ram, -					(cr->cam & MMU_CAM_P) ? 1 : 0); - -	return p - buf; -} - -#define pr_reg(name)							\ -	do {								\ -		ssize_t bytes;						\ -		const char *str = "%20s: %08x\n";			\ -		const int maxcol = 32;					\ -		bytes = snprintf(p, maxcol, str, __stringify(name),	\ -				 iommu_read_reg(obj, MMU_##name));	\ -		p += bytes;						\ -		len -= bytes;						\ -		if (len < maxcol)					\ -			goto out;					\ -	} while (0) - -static ssize_t -omap2_iommu_dump_ctx(struct omap_iommu *obj, char *buf, ssize_t len) -{ -	char *p = buf; - -	pr_reg(REVISION); -	pr_reg(SYSCONFIG); -	pr_reg(SYSSTATUS); -	pr_reg(IRQSTATUS); -	pr_reg(IRQENABLE); -	pr_reg(WALKING_ST); -	pr_reg(CNTL); -	pr_reg(FAULT_AD); -	pr_reg(TTB); -	pr_reg(LOCK); -	pr_reg(LD_TLB); -	pr_reg(CAM); -	pr_reg(RAM); -	pr_reg(GFLUSH); -	pr_reg(FLUSH_ENTRY); -	pr_reg(READ_CAM); -	pr_reg(READ_RAM); -	pr_reg(EMU_FAULT_AD); -out: -	return p - buf; -} - -static void omap2_iommu_save_ctx(struct omap_iommu *obj) -{ -	int i; -	u32 *p = obj->ctx; - -	for (i = 0; i < (MMU_REG_SIZE / sizeof(u32)); i++) { -		p[i] = iommu_read_reg(obj, i * sizeof(u32)); -		dev_dbg(obj->dev, "%s\t[%02d] %08x\n", __func__, i, p[i]); -	} - -	BUG_ON(p[0] != IOMMU_ARCH_VERSION); -} - -static void omap2_iommu_restore_ctx(struct omap_iommu *obj) -{ -	int i; -	u32 *p = obj->ctx; - -	for (i = 0; i < (MMU_REG_SIZE / sizeof(u32)); i++) { -		iommu_write_reg(obj, p[i], i * sizeof(u32)); -		dev_dbg(obj->dev, "%s\t[%02d] %08x\n", __func__, i, p[i]); -	} - -	BUG_ON(p[0] != IOMMU_ARCH_VERSION); -} - -static void omap2_cr_to_e(struct cr_regs *cr, struct iotlb_entry *e) -{ -	e->da		= cr->cam & MMU_CAM_VATAG_MASK; -	e->pa		= cr->ram & MMU_RAM_PADDR_MASK; -	e->valid	= cr->cam & MMU_CAM_V; -	e->pgsz		= cr->cam & MMU_CAM_PGSZ_MASK; -	e->endian	= cr->ram & MMU_RAM_ENDIAN_MASK; -	e->elsz		= cr->ram & MMU_RAM_ELSZ_MASK; -	e->mixed	= cr->ram & MMU_RAM_MIXED; -} - -static const struct iommu_functions omap2_iommu_ops = { -	.version	= IOMMU_ARCH_VERSION, - -	.enable		= omap2_iommu_enable, -	.disable	= omap2_iommu_disable, -	.set_twl	= omap2_iommu_set_twl, -	.fault_isr	= omap2_iommu_fault_isr, - -	.tlb_read_cr	= omap2_tlb_read_cr, -	.tlb_load_cr	= omap2_tlb_load_cr, - -	.cr_to_e	= omap2_cr_to_e, -	.cr_to_virt	= omap2_cr_to_virt, -	.alloc_cr	= omap2_alloc_cr, -	.cr_valid	= omap2_cr_valid, -	.dump_cr	= omap2_dump_cr, - -	.get_pte_attr	= omap2_get_pte_attr, - -	.save_ctx	= omap2_iommu_save_ctx, -	.restore_ctx	= omap2_iommu_restore_ctx, -	.dump_ctx	= omap2_iommu_dump_ctx, -}; - -static int __init omap2_iommu_init(void) -{ -	return omap_install_iommu_arch(&omap2_iommu_ops); -} -module_init(omap2_iommu_init); - -static void __exit omap2_iommu_exit(void) -{ -	omap_uninstall_iommu_arch(&omap2_iommu_ops); -} -module_exit(omap2_iommu_exit); - -MODULE_AUTHOR("Hiroshi DOYU, Paul Mundt and Toshihiro Kobayashi"); -MODULE_DESCRIPTION("omap iommu: omap2/3 architecture specific functions"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S index 502e3135aad..0ea09faf327 100644 --- a/arch/arm/mach-omap2/omap-headsmp.S +++ b/arch/arm/mach-omap2/omap-headsmp.S @@ -18,6 +18,8 @@  #include <linux/linkage.h>  #include <linux/init.h> +#include "omap44xx.h" +  	__CPUINIT  /* Physical address needed since MMU not enabled yet on secondary core */ @@ -64,3 +66,39 @@ hold:	ldr	r12,=0x103  	b	secondary_startup  ENDPROC(omap_secondary_startup) +ENTRY(omap_secondary_startup_4460) +hold_2:	ldr	r12,=0x103 +	dsb +	smc	#0			@ read from AuxCoreBoot0 +	mov	r0, r0, lsr #9 +	mrc	p15, 0, r4, c0, c0, 5 +	and	r4, r4, #0x0f +	cmp	r0, r4 +	bne	hold_2 + +	/* +	 * GIC distributor control register has changed between +	 * CortexA9 r1pX and r2pX. The Control Register secure +	 * banked version is now composed of 2 bits: +	 * bit 0 == Secure Enable +	 * bit 1 == Non-Secure Enable +	 * The Non-Secure banked register has not changed +	 * Because the ROM Code is based on the r1pX GIC, the CPU1 +	 * GIC restoration will cause a problem to CPU0 Non-Secure SW. +	 * The workaround must be: +	 * 1) Before doing the CPU1 wakeup, CPU0 must disable +	 * the GIC distributor +	 * 2) CPU1 must re-enable the GIC distributor on +	 * it's wakeup path. +	 */ +	ldr	r1, =OMAP44XX_GIC_DIST_BASE +	ldr	r0, [r1] +	orr	r0, #1 +	str	r0, [r1] + +	/* +	 * we've been released from the wait loop,secondary_stack +	 * should now contain the SVC stack for this core +	 */ +	b	secondary_startup +ENDPROC(omap_secondary_startup_4460) diff --git a/arch/arm/mach-omap2/omap-iommu.c b/arch/arm/mach-omap2/omap-iommu.c index df298d46707..a6a4ff8744b 100644 --- a/arch/arm/mach-omap2/omap-iommu.c +++ b/arch/arm/mach-omap2/omap-iommu.c @@ -13,7 +13,7 @@  #include <linux/module.h>  #include <linux/platform_device.h> -#include <plat/iommu.h> +#include <linux/platform_data/iommu-omap.h>  #include "soc.h"  #include "common.h" diff --git a/arch/arm/mach-omap2/omap-mpuss-lowpower.c b/arch/arm/mach-omap2/omap-mpuss-lowpower.c index 3f5fd7e3549..aac46bfdbeb 100644 --- a/arch/arm/mach-omap2/omap-mpuss-lowpower.c +++ b/arch/arm/mach-omap2/omap-mpuss-lowpower.c @@ -68,6 +68,7 @@ struct omap4_cpu_pm_info {  	void __iomem *scu_sar_addr;  	void __iomem *wkup_sar_addr;  	void __iomem *l2x0_sar_addr; +	void (*secondary_startup)(void);  };  static DEFINE_PER_CPU(struct omap4_cpu_pm_info, omap4_pm_info); @@ -300,6 +301,7 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)  int __cpuinit omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state)  {  	unsigned int cpu_state = 0; +	struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu);  	if (omap_rev() == OMAP4430_REV_ES1_0)  		return -ENXIO; @@ -309,7 +311,7 @@ int __cpuinit omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state)  	clear_cpu_prev_pwrst(cpu);  	set_cpu_next_pwrst(cpu, power_state); -	set_cpu_wakeup_addr(cpu, virt_to_phys(omap_secondary_startup)); +	set_cpu_wakeup_addr(cpu, virt_to_phys(pm_info->secondary_startup));  	scu_pwrst_prepare(cpu, power_state);  	/* @@ -360,6 +362,11 @@ int __init omap4_mpuss_init(void)  	pm_info->scu_sar_addr = sar_base + SCU_OFFSET1;  	pm_info->wkup_sar_addr = sar_base + CPU1_WAKEUP_NS_PA_ADDR_OFFSET;  	pm_info->l2x0_sar_addr = sar_base + L2X0_SAVE_OFFSET1; +	if (cpu_is_omap446x()) +		pm_info->secondary_startup = omap_secondary_startup_4460; +	else +		pm_info->secondary_startup = omap_secondary_startup; +  	pm_info->pwrdm = pwrdm_lookup("cpu1_pwrdm");  	if (!pm_info->pwrdm) {  		pr_err("Lookup failed for CPU1 pwrdm\n"); diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index 4d05fa8a4e4..cd42d921940 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c @@ -32,6 +32,7 @@  #include "iomap.h"  #include "common.h"  #include "clockdomain.h" +#include "pm.h"  #define CPU_MASK		0xff0ffff0  #define CPU_CORTEX_A9		0x410FC090 @@ -39,6 +40,8 @@  #define OMAP5_CORE_COUNT	0x2 +u16 pm44xx_errata; +  /* SCU base address */  static void __iomem *scu_base; @@ -118,8 +121,37 @@ static int __cpuinit omap4_boot_secondary(unsigned int cpu, struct task_struct *  	 *	4.3.4.2 Power States of CPU0 and CPU1  	 */  	if (booted) { +		/* +		 * GIC distributor control register has changed between +		 * CortexA9 r1pX and r2pX. The Control Register secure +		 * banked version is now composed of 2 bits: +		 * bit 0 == Secure Enable +		 * bit 1 == Non-Secure Enable +		 * The Non-Secure banked register has not changed +		 * Because the ROM Code is based on the r1pX GIC, the CPU1 +		 * GIC restoration will cause a problem to CPU0 Non-Secure SW. +		 * The workaround must be: +		 * 1) Before doing the CPU1 wakeup, CPU0 must disable +		 * the GIC distributor +		 * 2) CPU1 must re-enable the GIC distributor on +		 * it's wakeup path. +		 */ +		if (IS_PM44XX_ERRATUM(PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD)) { +			local_irq_disable(); +			gic_dist_disable(); +		} +  		clkdm_wakeup(cpu1_clkdm);  		clkdm_allow_idle(cpu1_clkdm); + +		if (IS_PM44XX_ERRATUM(PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD)) { +			while (gic_dist_disabled()) { +				udelay(1); +				cpu_relax(); +			} +			gic_timer_retrigger(); +			local_irq_enable(); +		}  	} else {  		dsb_sev();  		booted = true; @@ -138,7 +170,14 @@ static int __cpuinit omap4_boot_secondary(unsigned int cpu, struct task_struct *  static void __init wakeup_secondary(void)  { +	void *startup_addr = omap_secondary_startup;  	void __iomem *base = omap_get_wakeupgen_base(); + +	if (cpu_is_omap446x()) { +		startup_addr = omap_secondary_startup_4460; +		pm44xx_errata |= PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD; +	} +  	/*  	 * Write the address of secondary startup routine into the  	 * AuxCoreBoot1 where ROM code will jump and start executing @@ -146,7 +185,7 @@ static void __init wakeup_secondary(void)  	 * A barrier is added to ensure that write buffer is drained  	 */  	if (omap_secure_apis_support()) -		omap_auxcoreboot_addr(virt_to_phys(omap_secondary_startup)); +		omap_auxcoreboot_addr(virt_to_phys(startup_addr));  	else  		__raw_writel(virt_to_phys(omap5_secondary_startup),  						base + OMAP_AUX_CORE_BOOT_1); diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 5695885ea34..6897ae21bb8 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c @@ -14,6 +14,7 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/io.h> +#include <linux/irq.h>  #include <linux/platform_device.h>  #include <linux/memblock.h>  #include <linux/of_irq.h> @@ -24,6 +25,7 @@  #include <asm/hardware/cache-l2x0.h>  #include <asm/mach/map.h>  #include <asm/memblock.h> +#include <asm/smp_twd.h>  #include "omap-wakeupgen.h"  #include "soc.h" @@ -42,6 +44,10 @@ static void __iomem *l2cache_base;  #endif  static void __iomem *sar_ram_base; +static void __iomem *gic_dist_base_addr; +static void __iomem *twd_base; + +#define IRQ_LOCALTIMER		29  #ifdef CONFIG_OMAP4_ERRATA_I688  /* Used to implement memory barrier on DRAM path */ @@ -96,12 +102,14 @@ void __init omap_barriers_init(void)  void __init gic_init_irq(void)  {  	void __iomem *omap_irq_base; -	void __iomem *gic_dist_base_addr;  	/* Static mapping, never released */  	gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K);  	BUG_ON(!gic_dist_base_addr); +	twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_4K); +	BUG_ON(!twd_base); +  	/* Static mapping, never released */  	omap_irq_base = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_512);  	BUG_ON(!omap_irq_base); @@ -111,6 +119,38 @@ void __init gic_init_irq(void)  	gic_init(0, 29, gic_dist_base_addr, omap_irq_base);  } +void gic_dist_disable(void) +{ +	if (gic_dist_base_addr) +		__raw_writel(0x0, gic_dist_base_addr + GIC_DIST_CTRL); +} + +bool gic_dist_disabled(void) +{ +	return !(__raw_readl(gic_dist_base_addr + GIC_DIST_CTRL) & 0x1); +} + +void gic_timer_retrigger(void) +{ +	u32 twd_int = __raw_readl(twd_base + TWD_TIMER_INTSTAT); +	u32 gic_int = __raw_readl(gic_dist_base_addr + GIC_DIST_PENDING_SET); +	u32 twd_ctrl = __raw_readl(twd_base + TWD_TIMER_CONTROL); + +	if (twd_int && !(gic_int & BIT(IRQ_LOCALTIMER))) { +		/* +		 * The local timer interrupt got lost while the distributor was +		 * disabled.  Ack the pending interrupt, and retrigger it. +		 */ +		pr_warn("%s: lost localtimer interrupt\n", __func__); +		__raw_writel(1, twd_base + TWD_TIMER_INTSTAT); +		if (!(twd_ctrl & TWD_TIMER_CONTROL_PERIODIC)) { +			__raw_writel(1, twd_base + TWD_TIMER_COUNTER); +			twd_ctrl |= TWD_TIMER_CONTROL_ENABLE; +			__raw_writel(twd_ctrl, twd_base + TWD_TIMER_CONTROL); +		} +	} +} +  #ifdef CONFIG_CACHE_L2X0  void __iomem *omap4_get_l2cache_base(void) diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c index ad8d43b3327..32820d89f5b 100644 --- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c @@ -674,6 +674,7 @@ static struct omap_hwmod am33xx_cpgmac0_hwmod = {  	.name		= "cpgmac0",  	.class		= &am33xx_cpgmac0_hwmod_class,  	.clkdm_name	= "cpsw_125mhz_clkdm", +	.flags		= (HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY),  	.mpu_irqs	= am33xx_cpgmac0_irqs,  	.main_clk	= "cpsw_125mhz_gclk",  	.prcm		= { @@ -685,6 +686,20 @@ static struct omap_hwmod am33xx_cpgmac0_hwmod = {  };  /* + * mdio class + */ +static struct omap_hwmod_class am33xx_mdio_hwmod_class = { +	.name		= "davinci_mdio", +}; + +static struct omap_hwmod am33xx_mdio_hwmod = { +	.name		= "davinci_mdio", +	.class		= &am33xx_mdio_hwmod_class, +	.clkdm_name	= "cpsw_125mhz_clkdm", +	.main_clk	= "cpsw_125mhz_gclk", +}; + +/*   * dcan class   */  static struct omap_hwmod_class am33xx_dcan_hwmod_class = { @@ -2501,6 +2516,21 @@ static struct omap_hwmod_ocp_if am33xx_l4_hs__cpgmac0 = {  	.user		= OCP_USER_MPU,  }; +struct omap_hwmod_addr_space am33xx_mdio_addr_space[] = { +	{ +		.pa_start	= 0x4A101000, +		.pa_end		= 0x4A101000 + SZ_256 - 1, +	}, +	{ } +}; + +struct omap_hwmod_ocp_if am33xx_cpgmac0__mdio = { +	.master		= &am33xx_cpgmac0_hwmod, +	.slave		= &am33xx_mdio_hwmod, +	.addr		= am33xx_mdio_addr_space, +	.user		= OCP_USER_MPU, +}; +  static struct omap_hwmod_addr_space am33xx_elm_addr_space[] = {  	{  		.pa_start	= 0x48080000, @@ -3371,6 +3401,7 @@ static struct omap_hwmod_ocp_if *am33xx_hwmod_ocp_ifs[] __initdata = {  	&am33xx_l3_main__tptc2,  	&am33xx_l3_s__usbss,  	&am33xx_l4_hs__cpgmac0, +	&am33xx_cpgmac0__mdio,  	NULL,  }; diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 0f10919f227..ec4499e5a4c 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c @@ -24,8 +24,8 @@  #include "l4_3xxx.h"  #include <linux/platform_data/asoc-ti-mcbsp.h>  #include <linux/platform_data/spi-omap2-mcspi.h> +#include <linux/platform_data/iommu-omap.h>  #include <plat/dmtimer.h> -#include <plat/iommu.h>  #include "am35xx.h" diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index ce1661d18e5..eb61cfd9452 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c @@ -29,8 +29,8 @@  #include <linux/platform_data/omap_ocp2scp.h>  #include <linux/platform_data/spi-omap2-mcspi.h>  #include <linux/platform_data/asoc-ti-mcbsp.h> +#include <linux/platform_data/iommu-omap.h>  #include <plat/dmtimer.h> -#include <plat/iommu.h>  #include "omap_hwmod.h"  #include "omap_hwmod_common_data.h" diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index 02c291c8e47..c22503b17ab 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h @@ -102,6 +102,15 @@ extern void enable_omap3630_toggle_l2_on_restore(void);  static inline void enable_omap3630_toggle_l2_on_restore(void) { }  #endif		/* defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP3) */ +#define PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD	(1 << 0) + +#if defined(CONFIG_ARCH_OMAP4) +extern u16 pm44xx_errata; +#define IS_PM44XX_ERRATUM(id)		(pm44xx_errata & (id)) +#else +#define IS_PM44XX_ERRATUM(id)		0 +#endif +  #ifdef CONFIG_POWER_AVS_OMAP  extern int omap_devinit_smartreflex(void);  extern void omap_enable_smartreflex_on_init(void); diff --git a/arch/arm/mach-omap2/pmu.c b/arch/arm/mach-omap2/pmu.c index 3cf79b54ce6..250d909e38b 100644 --- a/arch/arm/mach-omap2/pmu.c +++ b/arch/arm/mach-omap2/pmu.c @@ -58,8 +58,6 @@ static int __init omap2_init_pmu(unsigned oh_num, char *oh_names[])  	if (IS_ERR(omap_pmu_dev))  		return PTR_ERR(omap_pmu_dev); -	pm_runtime_enable(&omap_pmu_dev->dev); -  	return 0;  } diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index b9cff72ceae..7016637b531 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c @@ -628,9 +628,9 @@ static void __init omap4_local_timer_init(void)  	}  }  #else /* CONFIG_LOCAL_TIMERS */ -static inline void omap4_local_timer_init(void) +static void __init omap4_local_timer_init(void)  { -	omap4_sync32_timer_init(); +	omap4_sync32k_timer_init();  }  #endif /* CONFIG_LOCAL_TIMERS */  OMAP_SYS_TIMER(4, local); diff --git a/arch/arm/mach-pxa/include/mach/udc.h b/arch/arm/mach-pxa/include/mach/udc.h index 2f82332e81a..9a827e32db9 100644 --- a/arch/arm/mach-pxa/include/mach/udc.h +++ b/arch/arm/mach-pxa/include/mach/udc.h @@ -2,7 +2,7 @@   * arch/arm/mach-pxa/include/mach/udc.h   *   */ -#include <asm/mach/udc_pxa2xx.h> +#include <linux/platform_data/pxa2xx_udc.h>  extern void pxa_set_udc_info(struct pxa2xx_udc_mach_info *info); diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index 3352b37b60c..3f5171eaf67 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c @@ -209,6 +209,7 @@ static struct clk_lookup pxa25x_clkregs[] = {  	INIT_CLKREG(&clk_pxa25x_gpio12, NULL, "GPIO12_CLK"),  	INIT_CLKREG(&clk_pxa25x_mem, "pxa2xx-pcmcia", NULL),  	INIT_CLKREG(&clk_dummy, "pxa-gpio", NULL), +	INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL),  };  static struct clk_lookup pxa25x_hwuart_clkreg = @@ -338,6 +339,10 @@ void __init pxa25x_map_io(void)  	pxa25x_get_clk_frequency_khz(1);  } +static struct pxa_gpio_platform_data pxa25x_gpio_info __initdata = { +	.gpio_set_wake = gpio_set_wake, +}; +  static struct platform_device *pxa25x_devices[] __initdata = {  	&pxa25x_device_udc,  	&pxa_device_pmu, @@ -370,6 +375,7 @@ static int __init pxa25x_init(void)  		register_syscore_ops(&pxa2xx_mfp_syscore_ops);  		register_syscore_ops(&pxa2xx_clock_syscore_ops); +		pxa_register_device(&pxa_device_gpio, &pxa25x_gpio_info);  		ret = platform_add_devices(pxa25x_devices,  					   ARRAY_SIZE(pxa25x_devices));  		if (ret) diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index d3b3cd216d6..28511d43637 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c @@ -467,6 +467,7 @@ static void __init realview_eb_init(void)  MACHINE_START(REALVIEW_EB, "ARM-RealView EB")  	/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */  	.atag_offset	= 0x100, +	.smp		= smp_ops(realview_smp_ops),  	.fixup		= realview_fixup,  	.map_io		= realview_eb_map_io,  	.init_early	= realview_init_early, diff --git a/arch/arm/mach-s3c24xx/Kconfig b/arch/arm/mach-s3c24xx/Kconfig index 2b6cb5f29c2..25df14a9e26 100644 --- a/arch/arm/mach-s3c24xx/Kconfig +++ b/arch/arm/mach-s3c24xx/Kconfig @@ -400,11 +400,12 @@ config MACH_MINI2440  	bool "MINI2440 development board"  	select EEPROM_AT24  	select LEDS_CLASS -	select LEDS_TRIGGER +	select LEDS_TRIGGERS  	select LEDS_TRIGGER_BACKLIGHT  	select NEW_LEDS  	select S3C_DEV_NAND  	select S3C_DEV_USB_HOST +	select S3C_SETUP_CAMIF  	help  	  Say Y here to select support for the MINI2440. Is a 10cm x 10cm board  	  available via various sources. It can come with a 3.5" or 7" touch LCD. diff --git a/arch/arm/mach-s3c24xx/clock-s3c2440.c b/arch/arm/mach-s3c24xx/clock-s3c2440.c index 4407b173053..04b87ec9253 100644 --- a/arch/arm/mach-s3c24xx/clock-s3c2440.c +++ b/arch/arm/mach-s3c24xx/clock-s3c2440.c @@ -161,6 +161,7 @@ static struct clk_lookup s3c2440_clk_lookup[] = {  	CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk),  	CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p),  	CLKDEV_INIT(NULL, "clk_uart_baud3", &s3c2440_clk_fclk_n), +	CLKDEV_INIT("s3c2440-camif", "camera", &s3c2440_clk_cam_upll),  };  static int __init_refok s3c2440_clk_add(struct device *dev, struct subsys_interface *sif) diff --git a/arch/arm/mach-s3c64xx/Kconfig b/arch/arm/mach-s3c64xx/Kconfig index 63e7ae3ee9e..131c8628471 100644 --- a/arch/arm/mach-s3c64xx/Kconfig +++ b/arch/arm/mach-s3c64xx/Kconfig @@ -294,6 +294,7 @@ config MACH_WLF_CRAGG_6410  	select S3C64XX_SETUP_SDHCI  	select S3C64XX_SETUP_SPI  	select S3C64XX_SETUP_USB_PHY +	select S3C_DEV_FB  	select S3C_DEV_HSMMC  	select S3C_DEV_HSMMC1  	select S3C_DEV_HSMMC2 @@ -304,6 +305,7 @@ config MACH_WLF_CRAGG_6410  	select S3C_DEV_WDT  	select SAMSUNG_DEV_ADC  	select SAMSUNG_DEV_KEYPAD +	select SAMSUNG_DEV_PWM  	select SAMSUNG_GPIO_EXTRA128  	help  	  Machine support for the Wolfson Cragganmore S3C6410 variant. diff --git a/arch/arm/mach-s3c64xx/mach-crag6410-module.c b/arch/arm/mach-s3c64xx/mach-crag6410-module.c index 4e3fe57674c..c6d8dba9062 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410-module.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410-module.c @@ -20,6 +20,8 @@  #include <linux/regulator/machine.h> +#include <sound/wm0010.h> +#include <sound/wm2200.h>  #include <sound/wm5100.h>  #include <sound/wm8996.h>  #include <sound/wm8962.h> @@ -33,14 +35,34 @@ static struct s3c64xx_spi_csinfo wm0010_spi_csinfo = {  	.line = S3C64XX_GPC(3),  }; +static struct wm0010_pdata wm0010_pdata = { +	.gpio_reset = S3C64XX_GPN(6), +	.reset_active_high = 1, /* Active high for Glenfarclas Rev 2 */ +}; +  static struct spi_board_info wm1253_devs[] = {  	[0] = {  		.modalias	= "wm0010", +		.max_speed_hz	= 26 * 1000 * 1000,  		.bus_num	= 0,  		.chip_select	= 0,  		.mode		= SPI_MODE_0,  		.irq		= S3C_EINT(5),  		.controller_data = &wm0010_spi_csinfo, +		.platform_data = &wm0010_pdata, +	}, +}; + +static struct spi_board_info balblair_devs[] = { +	[0] = { +		.modalias	= "wm0010", +		.max_speed_hz	= 26 * 1000 * 1000, +		.bus_num	= 0, +		.chip_select	= 0, +		.mode		= SPI_MODE_0, +		.irq		= S3C_EINT(4), +		.controller_data = &wm0010_spi_csinfo, +		.platform_data = &wm0010_pdata,  	},  }; @@ -166,12 +188,13 @@ static struct regulator_init_data wm8994_ldo2 = {  static struct wm8994_pdata wm8994_pdata = {  	.gpio_base = CODEC_GPIO_BASE, +	.micb2_delay = 150,  	.gpio_defaults = {  		0x3,          /* IRQ out, active high, CMOS */  	},  	.ldo = { -		 { .init_data = &wm8994_ldo1, }, -		 { .init_data = &wm8994_ldo2, }, +		 { .enable = S3C64XX_GPN(6), .init_data = &wm8994_ldo1, }, +		 { .enable = S3C64XX_GPN(4), .init_data = &wm8994_ldo2, },  	},  }; @@ -182,7 +205,7 @@ static const struct i2c_board_info wm1277_devs[] = {  	},  }; -static struct arizona_pdata wm5102_pdata = { +static struct arizona_pdata wm5102_reva_pdata = {  	.ldoena = S3C64XX_GPN(7),  	.gpio_base = CODEC_GPIO_BASE,  	.irq_active_high = true, @@ -193,64 +216,131 @@ static struct arizona_pdata wm5102_pdata = {  	},  }; -static struct s3c64xx_spi_csinfo wm5102_spi_csinfo = { +static struct s3c64xx_spi_csinfo codec_spi_csinfo = {  	.line = S3C64XX_GPN(5),  }; +static struct spi_board_info wm5102_reva_spi_devs[] = { +	[0] = { +		.modalias	= "wm5102", +		.max_speed_hz	= 10 * 1000 * 1000, +		.bus_num	= 0, +		.chip_select	= 1, +		.mode		= SPI_MODE_0, +		.irq		= GLENFARCLAS_PMIC_IRQ_BASE + +				  WM831X_IRQ_GPIO_2, +		.controller_data = &codec_spi_csinfo, +		.platform_data = &wm5102_reva_pdata, +	}, +}; + +static struct arizona_pdata wm5102_pdata = { +	.ldoena = S3C64XX_GPN(7), +	.gpio_base = CODEC_GPIO_BASE, +	.irq_active_high = true, +	.micd_pol_gpio = CODEC_GPIO_BASE + 2, +	.gpio_defaults = { +		[2] = 0x10000, /* AIF3TXLRCLK */ +		[3] = 0x4,     /* OPCLK */ +	}, +}; +  static struct spi_board_info wm5102_spi_devs[] = {  	[0] = {  		.modalias	= "wm5102",  		.max_speed_hz	= 10 * 1000 * 1000,  		.bus_num	= 0, -		.chip_select	= 0, +		.chip_select	= 1,  		.mode		= SPI_MODE_0,  		.irq		= GLENFARCLAS_PMIC_IRQ_BASE +  				  WM831X_IRQ_GPIO_2, -		.controller_data = &wm5102_spi_csinfo, +		.controller_data = &codec_spi_csinfo,  		.platform_data = &wm5102_pdata,  	},  }; +static struct spi_board_info wm5110_spi_devs[] = { +	[0] = { +		.modalias	= "wm5110", +		.max_speed_hz	= 10 * 1000 * 1000, +		.bus_num	= 0, +		.chip_select	= 1, +		.mode		= SPI_MODE_0, +		.irq		= GLENFARCLAS_PMIC_IRQ_BASE + +				  WM831X_IRQ_GPIO_2, +		.controller_data = &codec_spi_csinfo, +		.platform_data = &wm5102_reva_pdata, +	}, +}; +  static const struct i2c_board_info wm6230_i2c_devs[] = {  	{ I2C_BOARD_INFO("wm9081", 0x6c),  	  .platform_data = &wm9081_pdata, },  }; +static struct wm2200_pdata wm2200_pdata = { +	.ldo_ena = S3C64XX_GPN(7), +	.gpio_defaults = { +		[2] = 0x0005,  /* GPIO3 24.576MHz output clock */ +	}, +}; + +static const struct i2c_board_info wm2200_i2c[] = { +	{ I2C_BOARD_INFO("wm2200", 0x3a), +	  .platform_data = &wm2200_pdata, }, +}; +  static __devinitdata const struct {  	u8 id; +	u8 rev;  	const char *name;  	const struct i2c_board_info *i2c_devs;  	int num_i2c_devs;  	const struct spi_board_info *spi_devs;  	int num_spi_devs;  } gf_mods[] = { -	{ .id = 0x01, .name = "1250-EV1 Springbank" }, -	{ .id = 0x02, .name = "1251-EV1 Jura" }, -	{ .id = 0x03, .name = "1252-EV1 Glenlivet" }, -	{ .id = 0x11, .name = "6249-EV2 Glenfarclas", }, -	{ .id = 0x14, .name = "6271-EV1 Lochnagar" }, -	{ .id = 0x15, .name = "6320-EV1 Bells", +	{ .id = 0x01, .rev = 0xff, .name = "1250-EV1 Springbank" }, +	{ .id = 0x02, .rev = 0xff, .name = "1251-EV1 Jura" }, +	{ .id = 0x03, .rev = 0xff, .name = "1252-EV1 Glenlivet" }, +	{ .id = 0x06, .rev = 0xff, .name = "WM8997-6721-CS96-EV1 Lapraoig" }, +	{ .id = 0x07, .rev = 0xff, .name = "WM5110-6271 Deanston", +	  .spi_devs = wm5110_spi_devs, +	  .num_spi_devs = ARRAY_SIZE(wm5110_spi_devs) }, +	{ .id = 0x08, .rev = 0xff, .name = "WM8903-6102 Tamdhu" }, +	{ .id = 0x09, .rev = 0xff, .name = "WM1811A-6305 Adelphi" }, +	{ .id = 0x0a, .rev = 0xff, .name = "WM8996-6272 Blackadder" }, +	{ .id = 0x0b, .rev = 0xff, .name = "WM8994-6235 Benromach" }, +	{ .id = 0x11, .rev = 0xff, .name = "6249-EV2 Glenfarclas", }, +	{ .id = 0x14, .rev = 0xff, .name = "6271-EV1 Lochnagar" }, +	{ .id = 0x15, .rev = 0xff, .name = "6320-EV1 Bells",  	  .i2c_devs = wm6230_i2c_devs,  	  .num_i2c_devs = ARRAY_SIZE(wm6230_i2c_devs) }, -	{ .id = 0x21, .name = "1275-EV1 Mortlach" }, -	{ .id = 0x25, .name = "1274-EV1 Glencadam" }, -	{ .id = 0x31, .name = "1253-EV1 Tomatin", +	{ .id = 0x21, .rev = 0xff, .name = "1275-EV1 Mortlach" }, +	{ .id = 0x25, .rev = 0xff, .name = "1274-EV1 Glencadam" }, +	{ .id = 0x31, .rev = 0xff, .name = "1253-EV1 Tomatin",  	  .spi_devs = wm1253_devs, .num_spi_devs = ARRAY_SIZE(wm1253_devs) }, -	{ .id = 0x32, .name = "XXXX-EV1 Caol Illa" }, -	{ .id = 0x33, .name = "XXXX-EV1 Oban" }, -	{ .id = 0x34, .name = "WM0010-6320-CS42 Balblair" }, -	{ .id = 0x39, .name = "1254-EV1 Dallas Dhu", +	{ .id = 0x32, .rev = 0xff, .name = "XXXX-EV1 Caol Illa" }, +	{ .id = 0x33, .rev = 0xff, .name = "XXXX-EV1 Oban" }, +	{ .id = 0x34, .rev = 0xff, .name = "WM0010-6320-CS42 Balblair", +	  .spi_devs = balblair_devs, +	  .num_spi_devs = ARRAY_SIZE(balblair_devs) }, +	{ .id = 0x39, .rev = 0xff, .name = "1254-EV1 Dallas Dhu",  	  .i2c_devs = wm1254_devs, .num_i2c_devs = ARRAY_SIZE(wm1254_devs) }, -	{ .id = 0x3a, .name = "1259-EV1 Tobermory", +	{ .id = 0x3a, .rev = 0xff, .name = "1259-EV1 Tobermory",  	  .i2c_devs = wm1259_devs, .num_i2c_devs = ARRAY_SIZE(wm1259_devs) }, -	{ .id = 0x3b, .name = "1255-EV1 Kilchoman", +	{ .id = 0x3b, .rev = 0xff, .name = "1255-EV1 Kilchoman",  	  .i2c_devs = wm1255_devs, .num_i2c_devs = ARRAY_SIZE(wm1255_devs) }, -	{ .id = 0x3c, .name = "1273-EV1 Longmorn" }, -	{ .id = 0x3d, .name = "1277-EV1 Littlemill", +	{ .id = 0x3c, .rev = 0xff, .name = "1273-EV1 Longmorn" }, +	{ .id = 0x3d, .rev = 0xff, .name = "1277-EV1 Littlemill",  	  .i2c_devs = wm1277_devs, .num_i2c_devs = ARRAY_SIZE(wm1277_devs) }, -	{ .id = 0x3e, .name = "WM5102-6271-EV1-CS127 Amrut", +	{ .id = 0x3e, .rev = 0, .name = "WM5102-6271-EV1-CS127 Amrut", +	  .spi_devs = wm5102_reva_spi_devs, +	  .num_spi_devs = ARRAY_SIZE(wm5102_reva_spi_devs) }, +	{ .id = 0x3e, .rev = -1, .name = "WM5102-6271-EV1-CS127 Amrut",  	  .spi_devs = wm5102_spi_devs,  	  .num_spi_devs = ARRAY_SIZE(wm5102_spi_devs) }, +	{ .id = 0x3f, .rev = -1, .name = "WM2200-6271-CS90-M-REV1", +	  .i2c_devs = wm2200_i2c, .num_i2c_devs = ARRAY_SIZE(wm2200_i2c) },  };  static __devinit int wlf_gf_module_probe(struct i2c_client *i2c, @@ -267,7 +357,8 @@ static __devinit int wlf_gf_module_probe(struct i2c_client *i2c,  	id = (ret & 0xfe) >> 2;  	rev = ret & 0x3;  	for (i = 0; i < ARRAY_SIZE(gf_mods); i++) -		if (id == gf_mods[i].id) +		if (id == gf_mods[i].id && (gf_mods[i].rev == 0xff || +					    rev == gf_mods[i].rev))  			break;  	if (i < ARRAY_SIZE(gf_mods)) { diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index 13b7eaa45fd..701f421de1a 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c @@ -287,16 +287,21 @@ static struct platform_device littlemill_device = {  	.id		= -1,  }; -static struct platform_device bells_wm5102_device = { +static struct platform_device bells_wm2200_device = {  	.name		= "bells",  	.id		= 0,  }; -static struct platform_device bells_wm5110_device = { +static struct platform_device bells_wm5102_device = {  	.name		= "bells",  	.id		= 1,  }; +static struct platform_device bells_wm5110_device = { +	.name		= "bells", +	.id		= 2, +}; +  static struct regulator_consumer_supply wallvdd_consumers[] = {  	REGULATOR_SUPPLY("SPKVDD", "1-001a"),  	REGULATOR_SUPPLY("SPKVDD1", "1-001a"), @@ -304,6 +309,13 @@ static struct regulator_consumer_supply wallvdd_consumers[] = {  	REGULATOR_SUPPLY("SPKVDDL", "1-001a"),  	REGULATOR_SUPPLY("SPKVDDR", "1-001a"), +	REGULATOR_SUPPLY("SPKVDDL", "spi0.1"), +	REGULATOR_SUPPLY("SPKVDDR", "spi0.1"), +	REGULATOR_SUPPLY("SPKVDDL", "wm5102-codec"), +	REGULATOR_SUPPLY("SPKVDDR", "wm5102-codec"), +	REGULATOR_SUPPLY("SPKVDDL", "wm5110-codec"), +	REGULATOR_SUPPLY("SPKVDDR", "wm5110-codec"), +  	REGULATOR_SUPPLY("DC1VDD", "0-0034"),  	REGULATOR_SUPPLY("DC2VDD", "0-0034"),  	REGULATOR_SUPPLY("DC3VDD", "0-0034"), @@ -321,6 +333,16 @@ static struct regulator_consumer_supply wallvdd_consumers[] = {  	REGULATOR_SUPPLY("DC1VDD", "1-0034"),  	REGULATOR_SUPPLY("DC2VDD", "1-0034"),  	REGULATOR_SUPPLY("DC3VDD", "1-0034"), +	REGULATOR_SUPPLY("LDO1VDD", "1-0034"), +	REGULATOR_SUPPLY("LDO2VDD", "1-0034"), +	REGULATOR_SUPPLY("LDO4VDD", "1-0034"), +	REGULATOR_SUPPLY("LDO5VDD", "1-0034"), +	REGULATOR_SUPPLY("LDO6VDD", "1-0034"), +	REGULATOR_SUPPLY("LDO7VDD", "1-0034"), +	REGULATOR_SUPPLY("LDO8VDD", "1-0034"), +	REGULATOR_SUPPLY("LDO9VDD", "1-0034"), +	REGULATOR_SUPPLY("LDO10VDD", "1-0034"), +	REGULATOR_SUPPLY("LDO11VDD", "1-0034"),  };  static struct regulator_init_data wallvdd_data = { @@ -369,6 +391,7 @@ static struct platform_device *crag6410_devices[] __initdata = {  	&tobermory_device,  	&littlemill_device,  	&lowland_device, +	&bells_wm2200_device,  	&bells_wm5102_device,  	&bells_wm5110_device,  	&wallvdd_device, @@ -597,6 +620,7 @@ static struct s3c2410_platform_i2c i2c0_pdata = {  static struct regulator_consumer_supply pvdd_1v2_consumers[] __devinitdata = {  	REGULATOR_SUPPLY("DCVDD", "spi0.0"),  	REGULATOR_SUPPLY("AVDD", "spi0.0"), +	REGULATOR_SUPPLY("AVDD", "spi0.1"),  };  static struct regulator_init_data pvdd_1v2 __devinitdata = { @@ -621,6 +645,24 @@ static struct regulator_consumer_supply pvdd_1v8_consumers[] __devinitdata = {  	REGULATOR_SUPPLY("DCVDD", "1-001a"),  	REGULATOR_SUPPLY("AVDD", "1-001a"),  	REGULATOR_SUPPLY("DBVDD", "spi0.0"), + +	REGULATOR_SUPPLY("DBVDD", "1-003a"), +	REGULATOR_SUPPLY("LDOVDD", "1-003a"), +	REGULATOR_SUPPLY("CPVDD", "1-003a"), +	REGULATOR_SUPPLY("AVDD", "1-003a"), +	REGULATOR_SUPPLY("DBVDD1", "spi0.1"), +	REGULATOR_SUPPLY("DBVDD2", "spi0.1"), +	REGULATOR_SUPPLY("DBVDD3", "spi0.1"), +	REGULATOR_SUPPLY("LDOVDD", "spi0.1"), +	REGULATOR_SUPPLY("CPVDD", "spi0.1"), + +	REGULATOR_SUPPLY("DBVDD2", "wm5102-codec"), +	REGULATOR_SUPPLY("DBVDD3", "wm5102-codec"), +	REGULATOR_SUPPLY("CPVDD", "wm5102-codec"), + +	REGULATOR_SUPPLY("DBVDD2", "wm5110-codec"), +	REGULATOR_SUPPLY("DBVDD3", "wm5110-codec"), +	REGULATOR_SUPPLY("CPVDD", "wm5110-codec"),  };  static struct regulator_init_data pvdd_1v8 __devinitdata = { @@ -685,6 +727,7 @@ static struct i2c_board_info i2c_devs1[] __devinitdata = {  	  .irq = S3C_EINT(0),  	  .platform_data = &glenfarclas_pmic_pdata }, +	{ I2C_BOARD_INFO("wlf-gf-module", 0x20) },  	{ I2C_BOARD_INFO("wlf-gf-module", 0x22) },  	{ I2C_BOARD_INFO("wlf-gf-module", 0x24) },  	{ I2C_BOARD_INFO("wlf-gf-module", 0x25) }, @@ -810,7 +853,7 @@ static void __init crag6410_machine_init(void)  	i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));  	samsung_keypad_set_platdata(&crag6410_keypad_data); -	s3c64xx_spi0_set_platdata(NULL, 0, 1); +	s3c64xx_spi0_set_platdata(NULL, 0, 2);  	platform_add_devices(crag6410_devices, ARRAY_SIZE(crag6410_devices)); diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index 6a7ad3c2a3f..9a23739f702 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c @@ -14,6 +14,7 @@  #include <linux/module.h>  #include <linux/errno.h>  #include <linux/ioport.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/serial_core.h>  #include <linux/mfd/ucb1x00.h>  #include <linux/mtd/mtd.h> @@ -37,7 +38,6 @@  #include <asm/mach/flash.h>  #include <asm/mach/irda.h>  #include <asm/mach/map.h> -#include <asm/mach/serial_sa1100.h>  #include <mach/assabet.h>  #include <linux/platform_data/mfd-mcp-sa11x0.h>  #include <mach/irqs.h> diff --git a/arch/arm/mach-sa1100/badge4.c b/arch/arm/mach-sa1100/badge4.c index 038df4894b0..b2dadf3ea3d 100644 --- a/arch/arm/mach-sa1100/badge4.c +++ b/arch/arm/mach-sa1100/badge4.c @@ -16,6 +16,7 @@  #include <linux/module.h>  #include <linux/init.h>  #include <linux/kernel.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/platform_device.h>  #include <linux/delay.h>  #include <linux/tty.h> @@ -34,7 +35,6 @@  #include <asm/mach/flash.h>  #include <asm/mach/map.h>  #include <asm/hardware/sa1111.h> -#include <asm/mach/serial_sa1100.h>  #include <mach/badge4.h> diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c index ad0eb08ea07..304bca4a07c 100644 --- a/arch/arm/mach-sa1100/cerf.c +++ b/arch/arm/mach-sa1100/cerf.c @@ -13,6 +13,7 @@  #include <linux/init.h>  #include <linux/kernel.h>  #include <linux/tty.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/platform_device.h>  #include <linux/irq.h>  #include <linux/mtd/mtd.h> @@ -27,7 +28,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/flash.h>  #include <asm/mach/map.h> -#include <asm/mach/serial_sa1100.h>  #include <mach/cerf.h>  #include <linux/platform_data/mfd-mcp-sa11x0.h> diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index 170cb6107f6..45f424f5fca 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c @@ -21,6 +21,7 @@  #include <linux/kernel.h>  #include <linux/tty.h>  #include <linux/delay.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/platform_device.h>  #include <linux/mfd/ucb1x00.h>  #include <linux/mtd/mtd.h> @@ -40,7 +41,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/flash.h>  #include <asm/mach/map.h> -#include <asm/mach/serial_sa1100.h>  #include <asm/hardware/scoop.h>  #include <asm/mach/sharpsl_param.h> diff --git a/arch/arm/mach-sa1100/h3xxx.c b/arch/arm/mach-sa1100/h3xxx.c index 63150e1ffe9..f17e7382242 100644 --- a/arch/arm/mach-sa1100/h3xxx.c +++ b/arch/arm/mach-sa1100/h3xxx.c @@ -17,12 +17,12 @@  #include <linux/mfd/htc-egpio.h>  #include <linux/mtd/mtd.h>  #include <linux/mtd/partitions.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/platform_device.h>  #include <linux/serial_core.h>  #include <asm/mach/flash.h>  #include <asm/mach/map.h> -#include <asm/mach/serial_sa1100.h>  #include <mach/h3xxx.h> diff --git a/arch/arm/mach-sa1100/hackkit.c b/arch/arm/mach-sa1100/hackkit.c index fc106aab7c7..d005939c41f 100644 --- a/arch/arm/mach-sa1100/hackkit.c +++ b/arch/arm/mach-sa1100/hackkit.c @@ -18,6 +18,7 @@  #include <linux/module.h>  #include <linux/errno.h>  #include <linux/cpufreq.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/serial_core.h>  #include <linux/mtd/mtd.h>  #include <linux/mtd/partitions.h> @@ -35,7 +36,6 @@  #include <asm/mach/flash.h>  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <asm/mach/serial_sa1100.h>  #include <mach/hardware.h>  #include <mach/irqs.h> diff --git a/arch/arm/mach-sa1100/jornada720.c b/arch/arm/mach-sa1100/jornada720.c index e3084f47027..35cfc428b4d 100644 --- a/arch/arm/mach-sa1100/jornada720.c +++ b/arch/arm/mach-sa1100/jornada720.c @@ -17,6 +17,7 @@  #include <linux/kernel.h>  #include <linux/tty.h>  #include <linux/delay.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/platform_device.h>  #include <linux/ioport.h>  #include <linux/mtd/mtd.h> @@ -30,7 +31,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/flash.h>  #include <asm/mach/map.h> -#include <asm/mach/serial_sa1100.h>  #include <mach/hardware.h>  #include <mach/irqs.h> diff --git a/arch/arm/mach-sa1100/lart.c b/arch/arm/mach-sa1100/lart.c index 3048b17e84c..f69f78fc3dd 100644 --- a/arch/arm/mach-sa1100/lart.c +++ b/arch/arm/mach-sa1100/lart.c @@ -4,6 +4,7 @@  #include <linux/init.h>  #include <linux/kernel.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/tty.h>  #include <linux/gpio.h>  #include <linux/leds.h> @@ -18,7 +19,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <asm/mach/serial_sa1100.h>  #include <linux/platform_data/mfd-mcp-sa11x0.h>  #include <mach/irqs.h> diff --git a/arch/arm/mach-sa1100/nanoengine.c b/arch/arm/mach-sa1100/nanoengine.c index 41f69d97066..102e08f7b10 100644 --- a/arch/arm/mach-sa1100/nanoengine.c +++ b/arch/arm/mach-sa1100/nanoengine.c @@ -13,6 +13,7 @@  #include <linux/init.h>  #include <linux/kernel.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/mtd/mtd.h>  #include <linux/mtd/partitions.h>  #include <linux/root_dev.h> @@ -24,7 +25,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/flash.h>  #include <asm/mach/map.h> -#include <asm/mach/serial_sa1100.h>  #include <mach/hardware.h>  #include <mach/nanoengine.h> diff --git a/arch/arm/mach-sa1100/neponset.c b/arch/arm/mach-sa1100/neponset.c index 266db873a4e..88be0474f3d 100644 --- a/arch/arm/mach-sa1100/neponset.c +++ b/arch/arm/mach-sa1100/neponset.c @@ -7,6 +7,7 @@  #include <linux/irq.h>  #include <linux/kernel.h>  #include <linux/module.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/platform_device.h>  #include <linux/pm.h>  #include <linux/serial_core.h> @@ -14,7 +15,6 @@  #include <asm/mach-types.h>  #include <asm/mach/map.h> -#include <asm/mach/serial_sa1100.h>  #include <asm/hardware/sa1111.h>  #include <asm/sizes.h> diff --git a/arch/arm/mach-sa1100/pleb.c b/arch/arm/mach-sa1100/pleb.c index 37fe0a0a536..c51bb63f90f 100644 --- a/arch/arm/mach-sa1100/pleb.c +++ b/arch/arm/mach-sa1100/pleb.c @@ -6,6 +6,7 @@  #include <linux/kernel.h>  #include <linux/tty.h>  #include <linux/ioport.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/platform_device.h>  #include <linux/irq.h>  #include <linux/io.h> @@ -18,7 +19,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/flash.h> -#include <asm/mach/serial_sa1100.h>  #include <mach/irqs.h>  #include "generic.h" diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c index ff6b7b35bca..6460d25fbb8 100644 --- a/arch/arm/mach-sa1100/shannon.c +++ b/arch/arm/mach-sa1100/shannon.c @@ -5,6 +5,7 @@  #include <linux/init.h>  #include <linux/device.h>  #include <linux/kernel.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/tty.h>  #include <linux/mtd/mtd.h>  #include <linux/mtd/partitions.h> @@ -18,7 +19,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/flash.h>  #include <asm/mach/map.h> -#include <asm/mach/serial_sa1100.h>  #include <linux/platform_data/mfd-mcp-sa11x0.h>  #include <mach/shannon.h>  #include <mach/irqs.h> diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c index 71790e581d9..6d65f65fcb2 100644 --- a/arch/arm/mach-sa1100/simpad.c +++ b/arch/arm/mach-sa1100/simpad.c @@ -9,6 +9,7 @@  #include <linux/proc_fs.h>  #include <linux/string.h>  #include <linux/pm.h> +#include <linux/platform_data/sa11x0-serial.h>  #include <linux/platform_device.h>  #include <linux/mfd/ucb1x00.h>  #include <linux/mtd/mtd.h> @@ -23,7 +24,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/flash.h>  #include <asm/mach/map.h> -#include <asm/mach/serial_sa1100.h>  #include <linux/platform_data/mfd-mcp-sa11x0.h>  #include <mach/simpad.h>  #include <mach/irqs.h> diff --git a/arch/arm/mach-shmobile/Kconfig b/arch/arm/mach-shmobile/Kconfig index 8ae100cc655..4eddca14ae0 100644 --- a/arch/arm/mach-shmobile/Kconfig +++ b/arch/arm/mach-shmobile/Kconfig @@ -2,18 +2,6 @@ if ARCH_SHMOBILE  comment "SH-Mobile System Type" -config ARCH_SH7367 -	bool "SH-Mobile G3 (SH7367)" -	select ARCH_WANT_OPTIONAL_GPIOLIB -	select CPU_V6 -	select SH_CLK_CPG - -config ARCH_SH7377 -	bool "SH-Mobile G4 (SH7377)" -	select ARCH_WANT_OPTIONAL_GPIOLIB -	select CPU_V7 -	select SH_CLK_CPG -  config ARCH_SH7372  	bool "SH-Mobile AP4 (SH7372)"  	select ARCH_WANT_OPTIONAL_GPIOLIB @@ -50,17 +38,6 @@ config ARCH_EMEV2  comment "SH-Mobile Board Type" -config MACH_G3EVM -	bool "G3EVM board" -	depends on ARCH_SH7367 -	select ARCH_REQUIRE_GPIOLIB - -config MACH_G4EVM -	bool "G4EVM board" -	depends on ARCH_SH7377 -	select ARCH_REQUIRE_GPIOLIB -	select REGULATOR_FIXED_VOLTAGE if REGULATOR -  config MACH_AP4EVB  	bool "AP4EVB board"  	depends on ARCH_SH7372 @@ -95,6 +72,7 @@ config MACH_MACKEREL  	select ARCH_REQUIRE_GPIOLIB  	select REGULATOR_FIXED_VOLTAGE if REGULATOR  	select SND_SOC_AK4642 if SND_SIMPLE_CARD +	select USE_OF  config MACH_KOTA2  	bool "KOTA2 board" @@ -146,8 +124,7 @@ menu "Memory configuration"  config MEMORY_START  	hex "Physical memory start address" -	default "0x50000000" if MACH_G3EVM -	default "0x40000000" if MACH_G4EVM || MACH_AP4EVB || MACH_AG5EVM || \ +	default "0x40000000" if MACH_AP4EVB || MACH_AG5EVM || \  				MACH_MACKEREL || MACH_BONITO || \  				MACH_ARMADILLO800EVA  	default "0x41000000" if MACH_KOTA2 @@ -159,8 +136,6 @@ config MEMORY_START  config MEMORY_SIZE  	hex "Physical memory size" -	default "0x08000000" if MACH_G3EVM -	default "0x08000000" if MACH_G4EVM  	default "0x20000000" if MACH_AG5EVM || MACH_BONITO || \  				MACH_ARMADILLO800EVA  	default "0x1e000000" if MACH_KOTA2 diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile index fe2c97c179d..0b7147928aa 100644 --- a/arch/arm/mach-shmobile/Makefile +++ b/arch/arm/mach-shmobile/Makefile @@ -6,8 +6,6 @@  obj-y				:= timer.o console.o clock.o  # CPU objects -obj-$(CONFIG_ARCH_SH7367)	+= setup-sh7367.o clock-sh7367.o intc-sh7367.o -obj-$(CONFIG_ARCH_SH7377)	+= setup-sh7377.o clock-sh7377.o intc-sh7377.o  obj-$(CONFIG_ARCH_SH7372)	+= setup-sh7372.o clock-sh7372.o intc-sh7372.o  obj-$(CONFIG_ARCH_SH73A0)	+= setup-sh73a0.o clock-sh73a0.o intc-sh73a0.o  obj-$(CONFIG_ARCH_R8A7740)	+= setup-r8a7740.o clock-r8a7740.o intc-r8a7740.o @@ -23,16 +21,12 @@ smp-$(CONFIG_ARCH_EMEV2)	+= smp-emev2.o  # Pinmux setup  pfc-y				:= -pfc-$(CONFIG_ARCH_SH7367)	+= pfc-sh7367.o -pfc-$(CONFIG_ARCH_SH7377)	+= pfc-sh7377.o  pfc-$(CONFIG_ARCH_SH7372)	+= pfc-sh7372.o  pfc-$(CONFIG_ARCH_SH73A0)	+= pfc-sh73a0.o  pfc-$(CONFIG_ARCH_R8A7740)	+= pfc-r8a7740.o  pfc-$(CONFIG_ARCH_R8A7779)	+= pfc-r8a7779.o  # IRQ objects -obj-$(CONFIG_ARCH_SH7367)	+= entry-intc.o -obj-$(CONFIG_ARCH_SH7377)	+= entry-intc.o  obj-$(CONFIG_ARCH_SH7372)	+= entry-intc.o  obj-$(CONFIG_ARCH_R8A7740)	+= entry-intc.o @@ -45,8 +39,6 @@ obj-$(CONFIG_ARCH_R8A7740)	+= pm-r8a7740.o  obj-$(CONFIG_ARCH_R8A7779)	+= pm-r8a7779.o  # Board objects -obj-$(CONFIG_MACH_G3EVM)	+= board-g3evm.o -obj-$(CONFIG_MACH_G4EVM)	+= board-g4evm.o  obj-$(CONFIG_MACH_AP4EVB)	+= board-ap4evb.o  obj-$(CONFIG_MACH_AG5EVM)	+= board-ag5evm.o  obj-$(CONFIG_MACH_MACKEREL)	+= board-mackerel.o diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index 790dc68c431..cefdd030361 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c @@ -728,7 +728,7 @@ fsia_ick_out:  static int fsi_hdmi_set_rate(struct device *dev, int rate, int enable)  {  	struct clk *fsib_clk; -	struct clk *fdiv_clk = &sh7372_fsidivb_clk; +	struct clk *fdiv_clk = clk_get(NULL, "fsidivb");  	long fsib_rate = 0;  	long fdiv_rate = 0;  	int ackmd_bpfmd; diff --git a/arch/arm/mach-shmobile/board-armadillo800eva.c b/arch/arm/mach-shmobile/board-armadillo800eva.c index 3cc8b1c21da..499e6e37666 100644 --- a/arch/arm/mach-shmobile/board-armadillo800eva.c +++ b/arch/arm/mach-shmobile/board-armadillo800eva.c @@ -1229,6 +1229,13 @@ static void __init eva_add_early_devices(void)  	shmobile_timer.init = eva_earlytimer_init;  } +#define RESCNT2 IOMEM(0xe6188020) +static void eva_restart(char mode, const char *cmd) +{ +	/* Do soft power on reset */ +	writel((1 << 31), RESCNT2); +} +  static const char *eva_boards_compat_dt[] __initdata = {  	"renesas,armadillo800eva",  	NULL, @@ -1243,4 +1250,5 @@ DT_MACHINE_START(ARMADILLO800EVA_DT, "armadillo800eva")  	.init_late	= shmobile_init_late,  	.timer		= &shmobile_timer,  	.dt_compat	= eva_boards_compat_dt, +	.restart	= eva_restart,  MACHINE_END diff --git a/arch/arm/mach-shmobile/board-g3evm.c b/arch/arm/mach-shmobile/board-g3evm.c deleted file mode 100644 index b179d4c213b..00000000000 --- a/arch/arm/mach-shmobile/board-g3evm.c +++ /dev/null @@ -1,343 +0,0 @@ -/* - * G3EVM board support - * - * Copyright (C) 2010  Magnus Damm - * Copyright (C) 2008  Yoshihiro Shimoda - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/platform_device.h> -#include <linux/delay.h> -#include <linux/mtd/mtd.h> -#include <linux/mtd/partitions.h> -#include <linux/mtd/physmap.h> -#include <linux/mtd/sh_flctl.h> -#include <linux/usb/r8a66597.h> -#include <linux/io.h> -#include <linux/gpio.h> -#include <linux/input.h> -#include <linux/input/sh_keysc.h> -#include <linux/dma-mapping.h> -#include <mach/irqs.h> -#include <mach/sh7367.h> -#include <mach/common.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> - -/* - * IrDA - * - * S67: 5bit : ON  power - *    : 6bit : ON  remote control - *             OFF IrDA - */ - -static struct mtd_partition nor_flash_partitions[] = { -	{ -		.name		= "loader", -		.offset		= 0x00000000, -		.size		= 512 * 1024, -	}, -	{ -		.name		= "bootenv", -		.offset		= MTDPART_OFS_APPEND, -		.size		= 512 * 1024, -	}, -	{ -		.name		= "kernel_ro", -		.offset		= MTDPART_OFS_APPEND, -		.size		= 8 * 1024 * 1024, -		.mask_flags	= MTD_WRITEABLE, -	}, -	{ -		.name		= "kernel", -		.offset		= MTDPART_OFS_APPEND, -		.size		= 8 * 1024 * 1024, -	}, -	{ -		.name		= "data", -		.offset		= MTDPART_OFS_APPEND, -		.size		= MTDPART_SIZ_FULL, -	}, -}; - -static struct physmap_flash_data nor_flash_data = { -	.width		= 2, -	.parts		= nor_flash_partitions, -	.nr_parts	= ARRAY_SIZE(nor_flash_partitions), -}; - -static struct resource nor_flash_resources[] = { -	[0]	= { -		.start	= 0x00000000, -		.end	= 0x08000000 - 1, -		.flags	= IORESOURCE_MEM, -	} -}; - -static struct platform_device nor_flash_device = { -	.name		= "physmap-flash", -	.dev		= { -		.platform_data	= &nor_flash_data, -	}, -	.num_resources	= ARRAY_SIZE(nor_flash_resources), -	.resource	= nor_flash_resources, -}; - -/* USBHS */ -static void usb_host_port_power(int port, int power) -{ -	if (!power) /* only power-on supported for now */ -		return; - -	/* set VBOUT/PWEN and EXTLP0 in DVSTCTR */ -	__raw_writew(__raw_readw(IOMEM(0xe6890008)) | 0x600, IOMEM(0xe6890008)); -} - -static struct r8a66597_platdata usb_host_data = { -	.on_chip = 1, -	.port_power = usb_host_port_power, -}; - -static struct resource usb_host_resources[] = { -	[0] = { -		.name	= "USBHS", -		.start	= 0xe6890000, -		.end	= 0xe68900e5, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= evt2irq(0xa20), /* USBHS_USHI0 */ -		.flags	= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device usb_host_device = { -	.name		= "r8a66597_hcd", -	.id		= 0, -	.dev = { -		.platform_data		= &usb_host_data, -		.dma_mask		= NULL, -		.coherent_dma_mask	= 0xffffffff, -	}, -	.num_resources	= ARRAY_SIZE(usb_host_resources), -	.resource	= usb_host_resources, -}; - -/* KEYSC */ -static struct sh_keysc_info keysc_info = { -	.mode		= SH_KEYSC_MODE_5, -	.scan_timing	= 3, -	.delay		= 100, -	.keycodes = { -		KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, -		KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, -		KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, -		KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_HOME, KEY_SLEEP, -		KEY_WAKEUP, KEY_COFFEE, KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, -		KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_STOP, KEY_COMPUTER, -	}, -}; - -static struct resource keysc_resources[] = { -	[0] = { -		.name	= "KEYSC", -		.start  = 0xe61b0000, -		.end    = 0xe61b000f, -		.flags  = IORESOURCE_MEM, -	}, -	[1] = { -		.start  = evt2irq(0xbe0), /* KEYSC_KEY */ -		.flags  = IORESOURCE_IRQ, -	}, -}; - -static struct platform_device keysc_device = { -	.name           = "sh_keysc", -	.num_resources  = ARRAY_SIZE(keysc_resources), -	.resource       = keysc_resources, -	.dev	= { -		.platform_data	= &keysc_info, -	}, -}; - -static struct mtd_partition nand_partition_info[] = { -	{ -		.name	= "system", -		.offset	= 0, -		.size	= 64 * 1024 * 1024, -	}, -	{ -		.name	= "userdata", -		.offset	= MTDPART_OFS_APPEND, -		.size	= 128 * 1024 * 1024, -	}, -	{ -		.name	= "cache", -		.offset	= MTDPART_OFS_APPEND, -		.size	= 64 * 1024 * 1024, -	}, -}; - -static struct resource nand_flash_resources[] = { -	[0] = { -		.start	= 0xe6a30000, -		.end	= 0xe6a3009b, -		.flags	= IORESOURCE_MEM, -	} -}; - -static struct sh_flctl_platform_data nand_flash_data = { -	.parts		= nand_partition_info, -	.nr_parts	= ARRAY_SIZE(nand_partition_info), -	.flcmncr_val	= QTSEL_E | FCKSEL_E | TYPESEL_SET | NANWF_E -			| SHBUSSEL | SEL_16BIT, -}; - -static struct platform_device nand_flash_device = { -	.name		= "sh_flctl", -	.resource	= nand_flash_resources, -	.num_resources	= ARRAY_SIZE(nand_flash_resources), -	.dev		= { -		.platform_data = &nand_flash_data, -	}, -}; - -static struct resource irda_resources[] = { -	[0] = { -		.start	= 0xE6D00000, -		.end	= 0xE6D01FD4 - 1, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start  = evt2irq(0x480), /* IRDA */ -		.flags  = IORESOURCE_IRQ, -	}, -}; - -static struct platform_device irda_device = { -	.name		= "sh_irda", -	.id		= -1, -	.resource	= irda_resources, -	.num_resources	= ARRAY_SIZE(irda_resources), -}; - -static struct platform_device *g3evm_devices[] __initdata = { -	&nor_flash_device, -	&usb_host_device, -	&keysc_device, -	&nand_flash_device, -	&irda_device, -}; - -static void __init g3evm_init(void) -{ -	sh7367_pinmux_init(); - -	/* Lit DS4 LED */ -	gpio_request(GPIO_PORT22, NULL); -	gpio_direction_output(GPIO_PORT22, 1); -	gpio_export(GPIO_PORT22, 0); - -	/* Lit DS8 LED */ -	gpio_request(GPIO_PORT23, NULL); -	gpio_direction_output(GPIO_PORT23, 1); -	gpio_export(GPIO_PORT23, 0); - -	/* Lit DS3 LED */ -	gpio_request(GPIO_PORT24, NULL); -	gpio_direction_output(GPIO_PORT24, 1); -	gpio_export(GPIO_PORT24, 0); - -	/* SCIFA1 */ -	gpio_request(GPIO_FN_SCIFA1_TXD, NULL); -	gpio_request(GPIO_FN_SCIFA1_RXD, NULL); -	gpio_request(GPIO_FN_SCIFA1_CTS, NULL); -	gpio_request(GPIO_FN_SCIFA1_RTS, NULL); - -	/* USBHS */ -	gpio_request(GPIO_FN_VBUS0, NULL); -	gpio_request(GPIO_FN_PWEN, NULL); -	gpio_request(GPIO_FN_OVCN, NULL); -	gpio_request(GPIO_FN_OVCN2, NULL); -	gpio_request(GPIO_FN_EXTLP, NULL); -	gpio_request(GPIO_FN_IDIN, NULL); - -	/* setup USB phy */ -	__raw_writew(0x0300, IOMEM(0xe605810a));	/* USBCR1 */ -	__raw_writew(0x00e0, IOMEM(0xe60581c0));	/* CPFCH */ -	__raw_writew(0x6010, IOMEM(0xe60581c6));	/* CGPOSR */ -	__raw_writew(0x8a0a, IOMEM(0xe605810c));	/* USBCR2 */ - -	/* KEYSC @ CN7 */ -	gpio_request(GPIO_FN_PORT42_KEYOUT0, NULL); -	gpio_request(GPIO_FN_PORT43_KEYOUT1, NULL); -	gpio_request(GPIO_FN_PORT44_KEYOUT2, NULL); -	gpio_request(GPIO_FN_PORT45_KEYOUT3, NULL); -	gpio_request(GPIO_FN_PORT46_KEYOUT4, NULL); -	gpio_request(GPIO_FN_PORT47_KEYOUT5, NULL); -	gpio_request(GPIO_FN_PORT48_KEYIN0_PU, NULL); -	gpio_request(GPIO_FN_PORT49_KEYIN1_PU, NULL); -	gpio_request(GPIO_FN_PORT50_KEYIN2_PU, NULL); -	gpio_request(GPIO_FN_PORT55_KEYIN3_PU, NULL); -	gpio_request(GPIO_FN_PORT56_KEYIN4_PU, NULL); -	gpio_request(GPIO_FN_PORT57_KEYIN5_PU, NULL); -	gpio_request(GPIO_FN_PORT58_KEYIN6_PU, NULL); - -	/* FLCTL */ -	gpio_request(GPIO_FN_FCE0, NULL); -	gpio_request(GPIO_FN_D0_ED0_NAF0, NULL); -	gpio_request(GPIO_FN_D1_ED1_NAF1, NULL); -	gpio_request(GPIO_FN_D2_ED2_NAF2, NULL); -	gpio_request(GPIO_FN_D3_ED3_NAF3, NULL); -	gpio_request(GPIO_FN_D4_ED4_NAF4, NULL); -	gpio_request(GPIO_FN_D5_ED5_NAF5, NULL); -	gpio_request(GPIO_FN_D6_ED6_NAF6, NULL); -	gpio_request(GPIO_FN_D7_ED7_NAF7, NULL); -	gpio_request(GPIO_FN_D8_ED8_NAF8, NULL); -	gpio_request(GPIO_FN_D9_ED9_NAF9, NULL); -	gpio_request(GPIO_FN_D10_ED10_NAF10, NULL); -	gpio_request(GPIO_FN_D11_ED11_NAF11, NULL); -	gpio_request(GPIO_FN_D12_ED12_NAF12, NULL); -	gpio_request(GPIO_FN_D13_ED13_NAF13, NULL); -	gpio_request(GPIO_FN_D14_ED14_NAF14, NULL); -	gpio_request(GPIO_FN_D15_ED15_NAF15, NULL); -	gpio_request(GPIO_FN_WE0_XWR0_FWE, NULL); -	gpio_request(GPIO_FN_FRB, NULL); -	/* FOE, FCDE, FSC on dedicated pins */ -	__raw_writel(__raw_readl(IOMEM(0xe6158048)) & ~(1 << 15), IOMEM(0xe6158048)); - -	/* IrDA */ -	gpio_request(GPIO_FN_IRDA_OUT, NULL); -	gpio_request(GPIO_FN_IRDA_IN, NULL); -	gpio_request(GPIO_FN_IRDA_FIRSEL, NULL); - -	sh7367_add_standard_devices(); - -	platform_add_devices(g3evm_devices, ARRAY_SIZE(g3evm_devices)); -} - -MACHINE_START(G3EVM, "g3evm") -	.map_io		= sh7367_map_io, -	.init_early	= sh7367_add_early_devices, -	.init_irq	= sh7367_init_irq, -	.handle_irq	= shmobile_handle_irq_intc, -	.init_machine	= g3evm_init, -	.init_late	= shmobile_init_late, -	.timer		= &shmobile_timer, -MACHINE_END diff --git a/arch/arm/mach-shmobile/board-g4evm.c b/arch/arm/mach-shmobile/board-g4evm.c deleted file mode 100644 index 35c126caa4d..00000000000 --- a/arch/arm/mach-shmobile/board-g4evm.c +++ /dev/null @@ -1,384 +0,0 @@ -/* - * G4EVM board support - * - * Copyright (C) 2010  Magnus Damm - * Copyright (C) 2008  Yoshihiro Shimoda - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/platform_device.h> -#include <linux/delay.h> -#include <linux/mtd/mtd.h> -#include <linux/mtd/partitions.h> -#include <linux/mtd/physmap.h> -#include <linux/regulator/fixed.h> -#include <linux/regulator/machine.h> -#include <linux/usb/r8a66597.h> -#include <linux/io.h> -#include <linux/input.h> -#include <linux/input/sh_keysc.h> -#include <linux/mmc/host.h> -#include <linux/mmc/sh_mobile_sdhi.h> -#include <linux/gpio.h> -#include <linux/dma-mapping.h> -#include <mach/irqs.h> -#include <mach/sh7377.h> -#include <mach/common.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> - -#include "sh-gpio.h" - -/* - * SDHI - * - * SDHI0 : card detection is possible - * SDHI1 : card detection is impossible - * - * [G4-MAIN-BOARD] - * JP74 : short		# DBG_2V8A    for SDHI0 - * JP75 : NC		# DBG_3V3A    for SDHI0 - * JP76 : NC		# DBG_3V3A_SD for SDHI0 - * JP77 : NC		# 3V3A_SDIO   for SDHI1 - * JP78 : short		# DBG_2V8A    for SDHI1 - * JP79 : NC		# DBG_3V3A    for SDHI1 - * JP80 : NC		# DBG_3V3A_SD for SDHI1 - * - * [G4-CORE-BOARD] - * S32 : all off	# to dissever from G3-CORE_DBG board - * S33 : all off	# to dissever from G3-CORE_DBG board - * - * [G3-CORE_DBG-BOARD] - * S1  : all off	# to dissever from G3-CORE_DBG board - * S3  : all off	# to dissever from G3-CORE_DBG board - * S4  : all off	# to dissever from G3-CORE_DBG board - */ - -static struct mtd_partition nor_flash_partitions[] = { -	{ -		.name		= "loader", -		.offset		= 0x00000000, -		.size		= 512 * 1024, -	}, -	{ -		.name		= "bootenv", -		.offset		= MTDPART_OFS_APPEND, -		.size		= 512 * 1024, -	}, -	{ -		.name		= "kernel_ro", -		.offset		= MTDPART_OFS_APPEND, -		.size		= 8 * 1024 * 1024, -		.mask_flags	= MTD_WRITEABLE, -	}, -	{ -		.name		= "kernel", -		.offset		= MTDPART_OFS_APPEND, -		.size		= 8 * 1024 * 1024, -	}, -	{ -		.name		= "data", -		.offset		= MTDPART_OFS_APPEND, -		.size		= MTDPART_SIZ_FULL, -	}, -}; - -static struct physmap_flash_data nor_flash_data = { -	.width		= 2, -	.parts		= nor_flash_partitions, -	.nr_parts	= ARRAY_SIZE(nor_flash_partitions), -}; - -static struct resource nor_flash_resources[] = { -	[0]	= { -		.start	= 0x00000000, -		.end	= 0x08000000 - 1, -		.flags	= IORESOURCE_MEM, -	} -}; - -static struct platform_device nor_flash_device = { -	.name		= "physmap-flash", -	.dev		= { -		.platform_data	= &nor_flash_data, -	}, -	.num_resources	= ARRAY_SIZE(nor_flash_resources), -	.resource	= nor_flash_resources, -}; - -/* USBHS */ -static void usb_host_port_power(int port, int power) -{ -	if (!power) /* only power-on supported for now */ -		return; - -	/* set VBOUT/PWEN and EXTLP0 in DVSTCTR */ -	__raw_writew(__raw_readw(IOMEM(0xe6890008)) | 0x600, IOMEM(0xe6890008)); -} - -static struct r8a66597_platdata usb_host_data = { -	.on_chip = 1, -	.port_power = usb_host_port_power, -}; - -static struct resource usb_host_resources[] = { -	[0] = { -		.name	= "USBHS", -		.start	= 0xe6890000, -		.end	= 0xe68900e5, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= evt2irq(0x0a20), /* USBHS_USHI0 */ -		.flags	= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device usb_host_device = { -	.name		= "r8a66597_hcd", -	.id		= 0, -	.dev = { -		.platform_data		= &usb_host_data, -		.dma_mask		= NULL, -		.coherent_dma_mask	= 0xffffffff, -	}, -	.num_resources	= ARRAY_SIZE(usb_host_resources), -	.resource	= usb_host_resources, -}; - -/* KEYSC */ -static struct sh_keysc_info keysc_info = { -	.mode		= SH_KEYSC_MODE_5, -	.scan_timing	= 3, -	.delay		= 100, -	.keycodes = { -		KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, -		KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, -		KEY_M, KEY_N, KEY_U, KEY_P, KEY_Q, KEY_R, -		KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, -		KEY_Y, KEY_Z, KEY_HOME, KEY_SLEEP, KEY_WAKEUP, KEY_COFFEE, -		KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, -		KEY_6, KEY_7, KEY_8, KEY_9, KEY_STOP, KEY_COMPUTER, -	}, -}; - -static struct resource keysc_resources[] = { -	[0] = { -		.name	= "KEYSC", -		.start  = 0xe61b0000, -		.end    = 0xe61b000f, -		.flags  = IORESOURCE_MEM, -	}, -	[1] = { -		.start  = evt2irq(0x0be0), /* KEYSC_KEY */ -		.flags  = IORESOURCE_IRQ, -	}, -}; - -static struct platform_device keysc_device = { -	.name           = "sh_keysc", -	.id             = 0, /* keysc0 clock */ -	.num_resources  = ARRAY_SIZE(keysc_resources), -	.resource       = keysc_resources, -	.dev	= { -		.platform_data	= &keysc_info, -	}, -}; - -/* Fixed 3.3V regulator to be used by SDHI0 and SDHI1 */ -static struct regulator_consumer_supply fixed3v3_power_consumers[] = -{ -	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), -	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), -	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), -	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), -}; - -/* SDHI */ -static struct sh_mobile_sdhi_info sdhi0_info = { -	.tmio_caps	= MMC_CAP_SDIO_IRQ, -}; - -static struct resource sdhi0_resources[] = { -	[0] = { -		.name	= "SDHI0", -		.start  = 0xe6d50000, -		.end    = 0xe6d500ff, -		.flags  = IORESOURCE_MEM, -	}, -	[1] = { -		.start  = evt2irq(0x0e00), /* SDHI0 */ -		.flags  = IORESOURCE_IRQ, -	}, -}; - -static struct platform_device sdhi0_device = { -	.name           = "sh_mobile_sdhi", -	.num_resources  = ARRAY_SIZE(sdhi0_resources), -	.resource       = sdhi0_resources, -	.id             = 0, -	.dev	= { -		.platform_data	= &sdhi0_info, -	}, -}; - -static struct sh_mobile_sdhi_info sdhi1_info = { -	.tmio_caps	= MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ, -}; - -static struct resource sdhi1_resources[] = { -	[0] = { -		.name	= "SDHI1", -		.start  = 0xe6d60000, -		.end    = 0xe6d600ff, -		.flags  = IORESOURCE_MEM, -	}, -	[1] = { -		.start  = evt2irq(0x0e80), /* SDHI1 */ -		.flags  = IORESOURCE_IRQ, -	}, -}; - -static struct platform_device sdhi1_device = { -	.name           = "sh_mobile_sdhi", -	.num_resources  = ARRAY_SIZE(sdhi1_resources), -	.resource       = sdhi1_resources, -	.id             = 1, -	.dev	= { -		.platform_data	= &sdhi1_info, -	}, -}; - -static struct platform_device *g4evm_devices[] __initdata = { -	&nor_flash_device, -	&usb_host_device, -	&keysc_device, -	&sdhi0_device, -	&sdhi1_device, -}; - -#define GPIO_SDHID0_D0	IOMEM(0xe60520fc) -#define GPIO_SDHID0_D1	IOMEM(0xe60520fd) -#define GPIO_SDHID0_D2	IOMEM(0xe60520fe) -#define GPIO_SDHID0_D3	IOMEM(0xe60520ff) -#define GPIO_SDHICMD0	IOMEM(0xe6052100) - -#define GPIO_SDHID1_D0	IOMEM(0xe6052103) -#define GPIO_SDHID1_D1	IOMEM(0xe6052104) -#define GPIO_SDHID1_D2	IOMEM(0xe6052105) -#define GPIO_SDHID1_D3	IOMEM(0xe6052106) -#define GPIO_SDHICMD1	IOMEM(0xe6052107) - -static void __init g4evm_init(void) -{ -	regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers, -				     ARRAY_SIZE(fixed3v3_power_consumers), 3300000); - -	sh7377_pinmux_init(); - -	/* Lit DS14 LED */ -	gpio_request(GPIO_PORT109, NULL); -	gpio_direction_output(GPIO_PORT109, 1); -	gpio_export(GPIO_PORT109, 1); - -	/* Lit DS15 LED */ -	gpio_request(GPIO_PORT110, NULL); -	gpio_direction_output(GPIO_PORT110, 1); -	gpio_export(GPIO_PORT110, 1); - -	/* Lit DS16 LED */ -	gpio_request(GPIO_PORT112, NULL); -	gpio_direction_output(GPIO_PORT112, 1); -	gpio_export(GPIO_PORT112, 1); - -	/* Lit DS17 LED */ -	gpio_request(GPIO_PORT113, NULL); -	gpio_direction_output(GPIO_PORT113, 1); -	gpio_export(GPIO_PORT113, 1); - -	/* USBHS */ -	gpio_request(GPIO_FN_VBUS_0, NULL); -	gpio_request(GPIO_FN_PWEN, NULL); -	gpio_request(GPIO_FN_OVCN, NULL); -	gpio_request(GPIO_FN_OVCN2, NULL); -	gpio_request(GPIO_FN_EXTLP, NULL); -	gpio_request(GPIO_FN_IDIN, NULL); - -	/* setup USB phy */ -	__raw_writew(0x0200, IOMEM(0xe605810a));       /* USBCR1 */ -	__raw_writew(0x00e0, IOMEM(0xe60581c0));       /* CPFCH */ -	__raw_writew(0x6010, IOMEM(0xe60581c6));       /* CGPOSR */ -	__raw_writew(0x8a0a, IOMEM(0xe605810c));       /* USBCR2 */ - -	/* KEYSC @ CN31 */ -	gpio_request(GPIO_FN_PORT60_KEYOUT5, NULL); -	gpio_request(GPIO_FN_PORT61_KEYOUT4, NULL); -	gpio_request(GPIO_FN_PORT62_KEYOUT3, NULL); -	gpio_request(GPIO_FN_PORT63_KEYOUT2, NULL); -	gpio_request(GPIO_FN_PORT64_KEYOUT1, NULL); -	gpio_request(GPIO_FN_PORT65_KEYOUT0, NULL); -	gpio_request(GPIO_FN_PORT66_KEYIN0_PU, NULL); -	gpio_request(GPIO_FN_PORT67_KEYIN1_PU, NULL); -	gpio_request(GPIO_FN_PORT68_KEYIN2_PU, NULL); -	gpio_request(GPIO_FN_PORT69_KEYIN3_PU, NULL); -	gpio_request(GPIO_FN_PORT70_KEYIN4_PU, NULL); -	gpio_request(GPIO_FN_PORT71_KEYIN5_PU, NULL); -	gpio_request(GPIO_FN_PORT72_KEYIN6_PU, NULL); - -	/* SDHI0 */ -	gpio_request(GPIO_FN_SDHICLK0, NULL); -	gpio_request(GPIO_FN_SDHICD0, NULL); -	gpio_request(GPIO_FN_SDHID0_0, NULL); -	gpio_request(GPIO_FN_SDHID0_1, NULL); -	gpio_request(GPIO_FN_SDHID0_2, NULL); -	gpio_request(GPIO_FN_SDHID0_3, NULL); -	gpio_request(GPIO_FN_SDHICMD0, NULL); -	gpio_request(GPIO_FN_SDHIWP0, NULL); -	gpio_request_pullup(GPIO_SDHID0_D0); -	gpio_request_pullup(GPIO_SDHID0_D1); -	gpio_request_pullup(GPIO_SDHID0_D2); -	gpio_request_pullup(GPIO_SDHID0_D3); -	gpio_request_pullup(GPIO_SDHICMD0); - -	/* SDHI1 */ -	gpio_request(GPIO_FN_SDHICLK1, NULL); -	gpio_request(GPIO_FN_SDHID1_0, NULL); -	gpio_request(GPIO_FN_SDHID1_1, NULL); -	gpio_request(GPIO_FN_SDHID1_2, NULL); -	gpio_request(GPIO_FN_SDHID1_3, NULL); -	gpio_request(GPIO_FN_SDHICMD1, NULL); -	gpio_request_pullup(GPIO_SDHID1_D0); -	gpio_request_pullup(GPIO_SDHID1_D1); -	gpio_request_pullup(GPIO_SDHID1_D2); -	gpio_request_pullup(GPIO_SDHID1_D3); -	gpio_request_pullup(GPIO_SDHICMD1); - -	sh7377_add_standard_devices(); - -	platform_add_devices(g4evm_devices, ARRAY_SIZE(g4evm_devices)); -} - -MACHINE_START(G4EVM, "g4evm") -	.map_io		= sh7377_map_io, -	.init_early	= sh7377_add_early_devices, -	.init_irq	= sh7377_init_irq, -	.handle_irq	= shmobile_handle_irq_intc, -	.init_machine	= g4evm_init, -	.init_late	= shmobile_init_late, -	.timer		= &shmobile_timer, -MACHINE_END diff --git a/arch/arm/mach-shmobile/board-kzm9g.c b/arch/arm/mach-shmobile/board-kzm9g.c index 0a43f3189c2..c02448d6847 100644 --- a/arch/arm/mach-shmobile/board-kzm9g.c +++ b/arch/arm/mach-shmobile/board-kzm9g.c @@ -384,6 +384,8 @@ static struct regulator_consumer_supply fixed2v8_power_consumers[] =  /* SDHI */  static struct sh_mobile_sdhi_info sdhi0_info = { +	.dma_slave_tx	= SHDMA_SLAVE_SDHI0_TX, +	.dma_slave_rx	= SHDMA_SLAVE_SDHI0_RX,  	.tmio_flags	= TMIO_MMC_HAS_IDLE_WAIT,  	.tmio_caps	= MMC_CAP_SD_HIGHSPEED,  	.tmio_ocr_mask	= MMC_VDD_27_28 | MMC_VDD_28_29, @@ -424,6 +426,8 @@ static struct platform_device sdhi0_device = {  /* Micro SD */  static struct sh_mobile_sdhi_info sdhi2_info = { +	.dma_slave_tx	= SHDMA_SLAVE_SDHI2_TX, +	.dma_slave_rx	= SHDMA_SLAVE_SDHI2_RX,  	.tmio_flags	= TMIO_MMC_HAS_IDLE_WAIT |  			  TMIO_MMC_USE_GPIO_CD |  			  TMIO_MMC_WRPROTECT_DISABLE, @@ -548,7 +552,6 @@ static struct platform_device fsi_ak4648_device = {  /* I2C */  static struct pcf857x_platform_data pcf8575_pdata = {  	.gpio_base	= GPIO_PCF8575_BASE, -	.irq		= intcs_evt2irq(0x3260), /* IRQ19 */  };  static struct i2c_board_info i2c0_devices[] = { @@ -557,7 +560,15 @@ static struct i2c_board_info i2c0_devices[] = {  	},  	{  		I2C_BOARD_INFO("r2025sd", 0x32), -	} +	}, +	{ +		I2C_BOARD_INFO("ak8975", 0x0c), +		.irq = intcs_evt2irq(0x3380), /* IRQ28 */ +	}, +	{ +		I2C_BOARD_INFO("adxl34x", 0x1d), +		.irq = intcs_evt2irq(0x3340), /* IRQ26 */ +	},  };  static struct i2c_board_info i2c1_devices[] = { @@ -570,6 +581,7 @@ static struct i2c_board_info i2c1_devices[] = {  static struct i2c_board_info i2c3_devices[] = {  	{  		I2C_BOARD_INFO("pcf8575", 0x20), +		.irq		= intcs_evt2irq(0x3260), /* IRQ19 */  		.platform_data = &pcf8575_pdata,  	},  }; diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 0c27c810cf9..f274252e470 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c @@ -882,7 +882,7 @@ static int __fsi_set_round_rate(struct clk *clk, long rate, int enable)  static int fsi_b_set_rate(struct device *dev, int rate, int enable)  {  	struct clk *fsib_clk; -	struct clk *fdiv_clk = &sh7372_fsidivb_clk; +	struct clk *fdiv_clk = clk_get(NULL, "fsidivb");  	long fsib_rate = 0;  	long fdiv_rate = 0;  	int ackmd_bpfmd; @@ -1651,7 +1651,12 @@ static void __init mackerel_init(void)  	pm_clk_add(&hdmi_lcdc_device.dev, "hdmi");  } -MACHINE_START(MACKEREL, "mackerel") +static const char *mackerel_boards_compat_dt[] __initdata = { +	"renesas,mackerel", +	NULL, +}; + +DT_MACHINE_START(MACKEREL_DT, "mackerel")  	.map_io		= sh7372_map_io,  	.init_early	= sh7372_add_early_devices,  	.init_irq	= sh7372_init_irq, @@ -1659,4 +1664,5 @@ MACHINE_START(MACKEREL, "mackerel")  	.init_machine	= mackerel_init,  	.init_late	= sh7372_pm_init_late,  	.timer		= &shmobile_timer, +	.dt_compat  = mackerel_boards_compat_dt,  MACHINE_END diff --git a/arch/arm/mach-shmobile/board-marzen.c b/arch/arm/mach-shmobile/board-marzen.c index b8a7525a4e2..69f7f464eff 100644 --- a/arch/arm/mach-shmobile/board-marzen.c +++ b/arch/arm/mach-shmobile/board-marzen.c @@ -30,6 +30,8 @@  #include <linux/regulator/fixed.h>  #include <linux/regulator/machine.h>  #include <linux/smsc911x.h> +#include <linux/spi/spi.h> +#include <linux/spi/sh_hspi.h>  #include <linux/mmc/sh_mobile_sdhi.h>  #include <linux/mfd/tmio.h>  #include <mach/hardware.h> @@ -126,10 +128,27 @@ static struct platform_device thermal_device = {  	.num_resources	= ARRAY_SIZE(thermal_resources),  }; +/* HSPI */ +static struct resource hspi_resources[] = { +	[0] = { +		.start		= 0xFFFC7000, +		.end		= 0xFFFC7018 - 1, +		.flags		= IORESOURCE_MEM, +	}, +}; + +static struct platform_device hspi_device = { +	.name	= "sh-hspi", +	.id	= 0, +	.resource	= hspi_resources, +	.num_resources	= ARRAY_SIZE(hspi_resources), +}; +  static struct platform_device *marzen_devices[] __initdata = {  	ð_device,  	&sdhi0_device,  	&thermal_device, +	&hspi_device,  };  static void __init marzen_init(void) @@ -163,6 +182,12 @@ static void __init marzen_init(void)  	gpio_request(GPIO_FN_SD0_CD, NULL);  	gpio_request(GPIO_FN_SD0_WP, NULL); +	/* HSPI 0 */ +	gpio_request(GPIO_FN_HSPI_CLK0,	NULL); +	gpio_request(GPIO_FN_HSPI_CS0,	NULL); +	gpio_request(GPIO_FN_HSPI_TX0,	NULL); +	gpio_request(GPIO_FN_HSPI_RX0,	NULL); +  	r8a7779_add_standard_devices();  	platform_add_devices(marzen_devices, ARRAY_SIZE(marzen_devices));  } diff --git a/arch/arm/mach-shmobile/clock-r8a7740.c b/arch/arm/mach-shmobile/clock-r8a7740.c index 6729e003218..eac49d59782 100644 --- a/arch/arm/mach-shmobile/clock-r8a7740.c +++ b/arch/arm/mach-shmobile/clock-r8a7740.c @@ -65,6 +65,9 @@  #define SMSTPCR3	IOMEM(0xe615013c)  #define SMSTPCR4	IOMEM(0xe6150140) +#define FSIDIVA		IOMEM(0xFE1F8000) +#define FSIDIVB		IOMEM(0xFE1F8008) +  /* Fixed 32 KHz root clock from EXTALR pin */  static struct clk extalr_clk = {  	.rate	= 32768, @@ -188,6 +191,22 @@ static struct clk pllc1_div2_clk = {  };  /* USB clock */ +/* + * USBCKCR is controlling usb24 clock + * bit[7] : parent clock + * bit[6] : clock divide rate + * And this bit[7] is used as a "usb24s" from other devices. + * (Video clock / Sub clock / SPU clock) + * You can controll this clock as a below. + * + * struct clk *usb24	= clk_get(dev,  "usb24"); + * struct clk *usb24s	= clk_get(NULL, "usb24s"); + * struct clk *system	= clk_get(NULL, "system_clk"); + * int rate = clk_get_rate(system); + * + * clk_set_parent(usb24s, system);  // for bit[7] + * clk_set_rate(usb24, rate / 2);   // for bit[6] + */  static struct clk *usb24s_parents[] = {  	[0] = &system_clk,  	[1] = &extal2_clk @@ -427,6 +446,14 @@ static struct clk *late_main_clks[] = {  	&hdmi2_clk,  }; +/* FSI DIV */ +enum { FSIDIV_A, FSIDIV_B, FSIDIV_REPARENT_NR }; + +static struct clk fsidivs[] = { +	[FSIDIV_A] = SH_CLK_FSIDIV(FSIDIVA, &div6_reparent_clks[DIV6_FSIA]), +	[FSIDIV_B] = SH_CLK_FSIDIV(FSIDIVB, &div6_reparent_clks[DIV6_FSIB]), +}; +  /* MSTP */  enum {  	DIV4_I, DIV4_ZG, DIV4_B, DIV4_M1, DIV4_HP, @@ -596,6 +623,10 @@ static struct clk_lookup lookups[] = {  	CLKDEV_ICK_ID("icka", "sh_fsi2",	&div6_reparent_clks[DIV6_FSIA]),  	CLKDEV_ICK_ID("ickb", "sh_fsi2",	&div6_reparent_clks[DIV6_FSIB]), +	CLKDEV_ICK_ID("diva", "sh_fsi2",	&fsidivs[FSIDIV_A]), +	CLKDEV_ICK_ID("divb", "sh_fsi2",	&fsidivs[FSIDIV_B]), +	CLKDEV_ICK_ID("xcka", "sh_fsi2",	&fsiack_clk), +	CLKDEV_ICK_ID("xckb", "sh_fsi2",	&fsibck_clk),  };  void __init r8a7740_clock_init(u8 md_ck) @@ -641,6 +672,9 @@ void __init r8a7740_clock_init(u8 md_ck)  	for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++)  		ret = clk_register(late_main_clks[k]); +	if (!ret) +		ret = sh_clk_fsidiv_register(fsidivs, FSIDIV_REPARENT_NR); +  	clkdev_add_table(lookups, ARRAY_SIZE(lookups));  	if (!ret) diff --git a/arch/arm/mach-shmobile/clock-r8a7779.c b/arch/arm/mach-shmobile/clock-r8a7779.c index 37b2a3133b3..c019609da66 100644 --- a/arch/arm/mach-shmobile/clock-r8a7779.c +++ b/arch/arm/mach-shmobile/clock-r8a7779.c @@ -87,8 +87,11 @@ static struct clk div4_clks[DIV4_NR] = {  };  enum { MSTP323, MSTP322, MSTP321, MSTP320, -	MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021, +	MSTP101, MSTP100, +	MSTP030, +	MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,  	MSTP016, MSTP015, MSTP014, +	MSTP007,  	MSTP_NR };  static struct clk mstp_clks[MSTP_NR] = { @@ -96,6 +99,12 @@ static struct clk mstp_clks[MSTP_NR] = {  	[MSTP322] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 22, 0), /* SDHI1 */  	[MSTP321] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 21, 0), /* SDHI2 */  	[MSTP320] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 20, 0), /* SDHI3 */ +	[MSTP101] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1,  1, 0), /* USB2 */ +	[MSTP100] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1,  0, 0), /* USB0/1 */ +	[MSTP030] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 30, 0), /* I2C0 */ +	[MSTP029] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 29, 0), /* I2C1 */ +	[MSTP028] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 28, 0), /* I2C2 */ +	[MSTP027] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 27, 0), /* I2C3 */  	[MSTP026] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 26, 0), /* SCIF0 */  	[MSTP025] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 25, 0), /* SCIF1 */  	[MSTP024] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 24, 0), /* SCIF2 */ @@ -105,6 +114,7 @@ static struct clk mstp_clks[MSTP_NR] = {  	[MSTP016] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 16, 0), /* TMU0 */  	[MSTP015] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 15, 0), /* TMU1 */  	[MSTP014] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 14, 0), /* TMU2 */ +	[MSTP007] = SH_CLK_MSTP32(&div4_clks[DIV4_S], MSTPCR0,  7, 0), /* HSPI */  };  static unsigned long mul4_recalc(struct clk *clk) @@ -146,14 +156,25 @@ static struct clk_lookup lookups[] = {  	CLKDEV_CON_ID("peripheral_clk",	&div4_clks[DIV4_P]),  	/* MSTP32 clocks */ +	CLKDEV_DEV_ID("ehci-platform.1", &mstp_clks[MSTP101]), /* USB EHCI port2 */ +	CLKDEV_DEV_ID("ohci-platform.1", &mstp_clks[MSTP101]), /* USB OHCI port2 */ +	CLKDEV_DEV_ID("ehci-platform.0", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */ +	CLKDEV_DEV_ID("ohci-platform.0", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */  	CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP016]), /* TMU00 */  	CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP016]), /* TMU01 */ +	CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */ +	CLKDEV_DEV_ID("i2c-rcar.1", &mstp_clks[MSTP029]), /* I2C1 */ +	CLKDEV_DEV_ID("i2c-rcar.2", &mstp_clks[MSTP028]), /* I2C2 */ +	CLKDEV_DEV_ID("i2c-rcar.3", &mstp_clks[MSTP027]), /* I2C3 */  	CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP026]), /* SCIF0 */  	CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP025]), /* SCIF1 */  	CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP024]), /* SCIF2 */  	CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP023]), /* SCIF3 */  	CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP022]), /* SCIF4 */  	CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP021]), /* SCIF6 */ +	CLKDEV_DEV_ID("sh-hspi.0", &mstp_clks[MSTP007]), /* HSPI0 */ +	CLKDEV_DEV_ID("sh-hspi.1", &mstp_clks[MSTP007]), /* HSPI1 */ +	CLKDEV_DEV_ID("sh-hspi.2", &mstp_clks[MSTP007]), /* HSPI2 */  	CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP323]), /* SDHI0 */  	CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP322]), /* SDHI1 */  	CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP321]), /* SDHI2 */ diff --git a/arch/arm/mach-shmobile/clock-sh7367.c b/arch/arm/mach-shmobile/clock-sh7367.c deleted file mode 100644 index ef0a95e592c..00000000000 --- a/arch/arm/mach-shmobile/clock-sh7367.c +++ /dev/null @@ -1,355 +0,0 @@ -/* - * SH7367 clock framework support - * - * Copyright (C) 2010  Magnus Damm - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/io.h> -#include <linux/sh_clk.h> -#include <linux/clkdev.h> -#include <mach/common.h> - -/* SH7367 registers */ -#define RTFRQCR    IOMEM(0xe6150000) -#define SYFRQCR    IOMEM(0xe6150004) -#define CMFRQCR    IOMEM(0xe61500E0) -#define VCLKCR1    IOMEM(0xe6150008) -#define VCLKCR2    IOMEM(0xe615000C) -#define VCLKCR3    IOMEM(0xe615001C) -#define SCLKACR    IOMEM(0xe6150010) -#define SCLKBCR    IOMEM(0xe6150014) -#define SUBUSBCKCR IOMEM(0xe6158080) -#define SPUCKCR    IOMEM(0xe6150084) -#define MSUCKCR    IOMEM(0xe6150088) -#define MVI3CKCR   IOMEM(0xe6150090) -#define VOUCKCR    IOMEM(0xe6150094) -#define MFCK1CR    IOMEM(0xe6150098) -#define MFCK2CR    IOMEM(0xe615009C) -#define PLLC1CR    IOMEM(0xe6150028) -#define PLLC2CR    IOMEM(0xe615002C) -#define RTMSTPCR0  IOMEM(0xe6158030) -#define RTMSTPCR2  IOMEM(0xe6158038) -#define SYMSTPCR0  IOMEM(0xe6158040) -#define SYMSTPCR2  IOMEM(0xe6158048) -#define CMMSTPCR0  IOMEM(0xe615804c) - -/* Fixed 32 KHz root clock from EXTALR pin */ -static struct clk r_clk = { -	.rate           = 32768, -}; - -/* - * 26MHz default rate for the EXTALB1 root input clock. - * If needed, reset this with clk_set_rate() from the platform code. - */ -struct clk sh7367_extalb1_clk = { -	.rate		= 26666666, -}; - -/* - * 48MHz default rate for the EXTAL2 root input clock. - * If needed, reset this with clk_set_rate() from the platform code. - */ -struct clk sh7367_extal2_clk = { -	.rate		= 48000000, -}; - -/* A fixed divide-by-2 block */ -static unsigned long div2_recalc(struct clk *clk) -{ -	return clk->parent->rate / 2; -} - -static struct sh_clk_ops div2_clk_ops = { -	.recalc		= div2_recalc, -}; - -/* Divide extalb1 by two */ -static struct clk extalb1_div2_clk = { -	.ops		= &div2_clk_ops, -	.parent		= &sh7367_extalb1_clk, -}; - -/* Divide extal2 by two */ -static struct clk extal2_div2_clk = { -	.ops		= &div2_clk_ops, -	.parent		= &sh7367_extal2_clk, -}; - -/* PLLC1 */ -static unsigned long pllc1_recalc(struct clk *clk) -{ -	unsigned long mult = 1; - -	if (__raw_readl(PLLC1CR) & (1 << 14)) -		mult = (((__raw_readl(RTFRQCR) >> 24) & 0x3f) + 1) * 2; - -	return clk->parent->rate * mult; -} - -static struct sh_clk_ops pllc1_clk_ops = { -	.recalc		= pllc1_recalc, -}; - -static struct clk pllc1_clk = { -	.ops		= &pllc1_clk_ops, -	.flags		= CLK_ENABLE_ON_INIT, -	.parent		= &extalb1_div2_clk, -}; - -/* Divide PLLC1 by two */ -static struct clk pllc1_div2_clk = { -	.ops		= &div2_clk_ops, -	.parent		= &pllc1_clk, -}; - -/* PLLC2 */ -static unsigned long pllc2_recalc(struct clk *clk) -{ -	unsigned long mult = 1; - -	if (__raw_readl(PLLC2CR) & (1 << 31)) -		mult = (((__raw_readl(PLLC2CR) >> 24) & 0x3f) + 1) * 2; - -	return clk->parent->rate * mult; -} - -static struct sh_clk_ops pllc2_clk_ops = { -	.recalc		= pllc2_recalc, -}; - -static struct clk pllc2_clk = { -	.ops		= &pllc2_clk_ops, -	.flags		= CLK_ENABLE_ON_INIT, -	.parent		= &extalb1_div2_clk, -}; - -static struct clk *main_clks[] = { -	&r_clk, -	&sh7367_extalb1_clk, -	&sh7367_extal2_clk, -	&extalb1_div2_clk, -	&extal2_div2_clk, -	&pllc1_clk, -	&pllc1_div2_clk, -	&pllc2_clk, -}; - -static void div4_kick(struct clk *clk) -{ -	unsigned long value; - -	/* set KICK bit in SYFRQCR to update hardware setting */ -	value = __raw_readl(SYFRQCR); -	value |= (1 << 31); -	__raw_writel(value, SYFRQCR); -} - -static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18, -			  24, 32, 36, 48, 0, 72, 0, 0 }; - -static struct clk_div_mult_table div4_div_mult_table = { -	.divisors = divisors, -	.nr_divisors = ARRAY_SIZE(divisors), -}; - -static struct clk_div4_table div4_table = { -	.div_mult_table = &div4_div_mult_table, -	.kick = div4_kick, -}; - -enum { DIV4_I, DIV4_G, DIV4_S, DIV4_B, -       DIV4_ZX, DIV4_ZT, DIV4_Z, DIV4_ZD, DIV4_HP, -       DIV4_ZS, DIV4_ZB, DIV4_ZB3, DIV4_CP, DIV4_NR }; - -#define DIV4(_reg, _bit, _mask, _flags) \ -  SH_CLK_DIV4(&pllc1_clk, _reg, _bit, _mask, _flags) - -static struct clk div4_clks[DIV4_NR] = { -	[DIV4_I] = DIV4(RTFRQCR, 20, 0x6fff, CLK_ENABLE_ON_INIT), -	[DIV4_G] = DIV4(RTFRQCR, 16, 0x6fff, CLK_ENABLE_ON_INIT), -	[DIV4_S] = DIV4(RTFRQCR, 12, 0x6fff, CLK_ENABLE_ON_INIT), -	[DIV4_B] = DIV4(RTFRQCR, 8, 0x6fff, CLK_ENABLE_ON_INIT), -	[DIV4_ZX] = DIV4(SYFRQCR, 20, 0x6fff, 0), -	[DIV4_ZT] = DIV4(SYFRQCR, 16, 0x6fff, 0), -	[DIV4_Z] = DIV4(SYFRQCR, 12, 0x6fff, 0), -	[DIV4_ZD] = DIV4(SYFRQCR, 8, 0x6fff, 0), -	[DIV4_HP] = DIV4(SYFRQCR, 4, 0x6fff, 0), -	[DIV4_ZS] = DIV4(CMFRQCR, 12, 0x6fff, 0), -	[DIV4_ZB] = DIV4(CMFRQCR, 8, 0x6fff, 0), -	[DIV4_ZB3] = DIV4(CMFRQCR, 4, 0x6fff, 0), -	[DIV4_CP] = DIV4(CMFRQCR, 0, 0x6fff, 0), -}; - -enum { DIV6_SUB, DIV6_SIUA, DIV6_SIUB, DIV6_MSU, DIV6_SPU, -       DIV6_MVI3, DIV6_MF1, DIV6_MF2, -       DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_VOU, -       DIV6_NR }; - -static struct clk div6_clks[DIV6_NR] = { -	[DIV6_SUB] = SH_CLK_DIV6(&sh7367_extal2_clk, SUBUSBCKCR, 0), -	[DIV6_SIUA] = SH_CLK_DIV6(&pllc1_div2_clk, SCLKACR, 0), -	[DIV6_SIUB] = SH_CLK_DIV6(&pllc1_div2_clk, SCLKBCR, 0), -	[DIV6_MSU] = SH_CLK_DIV6(&pllc1_div2_clk, MSUCKCR, 0), -	[DIV6_SPU] = SH_CLK_DIV6(&pllc1_div2_clk, SPUCKCR, 0), -	[DIV6_MVI3] = SH_CLK_DIV6(&pllc1_div2_clk, MVI3CKCR, 0), -	[DIV6_MF1] = SH_CLK_DIV6(&pllc1_div2_clk, MFCK1CR, 0), -	[DIV6_MF2] = SH_CLK_DIV6(&pllc1_div2_clk, MFCK2CR, 0), -	[DIV6_VCK1] = SH_CLK_DIV6(&pllc1_div2_clk, VCLKCR1, 0), -	[DIV6_VCK2] = SH_CLK_DIV6(&pllc1_div2_clk, VCLKCR2, 0), -	[DIV6_VCK3] = SH_CLK_DIV6(&pllc1_div2_clk, VCLKCR3, 0), -	[DIV6_VOU] = SH_CLK_DIV6(&pllc1_div2_clk, VOUCKCR, 0), -}; - -enum { RTMSTP001, -       RTMSTP231, RTMSTP230, RTMSTP229, RTMSTP228, RTMSTP226, -       RTMSTP216, RTMSTP206, RTMSTP205, RTMSTP201, -       SYMSTP023, SYMSTP007, SYMSTP006, SYMSTP004, -       SYMSTP003, SYMSTP002, SYMSTP001, SYMSTP000, -       SYMSTP231, SYMSTP229, SYMSTP225, SYMSTP223, SYMSTP222, -       SYMSTP215, SYMSTP214, SYMSTP213, SYMSTP211, -       CMMSTP003, -       MSTP_NR }; - -#define MSTP(_parent, _reg, _bit, _flags) \ -  SH_CLK_MSTP32(_parent, _reg, _bit, _flags) - -static struct clk mstp_clks[MSTP_NR] = { -	[RTMSTP001] = MSTP(&div6_clks[DIV6_SUB], RTMSTPCR0, 1, 0), /* IIC2 */ -	[RTMSTP231] = MSTP(&div4_clks[DIV4_B], RTMSTPCR2, 31, 0), /* VEU3 */ -	[RTMSTP230] = MSTP(&div4_clks[DIV4_B], RTMSTPCR2, 30, 0), /* VEU2 */ -	[RTMSTP229] = MSTP(&div4_clks[DIV4_B], RTMSTPCR2, 29, 0), /* VEU1 */ -	[RTMSTP228] = MSTP(&div4_clks[DIV4_B], RTMSTPCR2, 28, 0), /* VEU0 */ -	[RTMSTP226] = MSTP(&div4_clks[DIV4_B], RTMSTPCR2, 26, 0), /* VEU2H */ -	[RTMSTP216] = MSTP(&div6_clks[DIV6_SUB], RTMSTPCR2, 16, 0), /* IIC0 */ -	[RTMSTP206] = MSTP(&div4_clks[DIV4_B], RTMSTPCR2, 6, 0), /* JPU */ -	[RTMSTP205] = MSTP(&div6_clks[DIV6_VOU], RTMSTPCR2, 5, 0), /* VOU */ -	[RTMSTP201] = MSTP(&div4_clks[DIV4_B], RTMSTPCR2, 1, 0), /* VPU */ -	[SYMSTP023] = MSTP(&div6_clks[DIV6_SPU], SYMSTPCR0, 23, 0), /* SPU1 */ -	[SYMSTP007] = MSTP(&div6_clks[DIV6_SUB], SYMSTPCR0, 7, 0), /* SCIFA5 */ -	[SYMSTP006] = MSTP(&div6_clks[DIV6_SUB], SYMSTPCR0, 6, 0), /* SCIFB */ -	[SYMSTP004] = MSTP(&div6_clks[DIV6_SUB], SYMSTPCR0, 4, 0), /* SCIFA0 */ -	[SYMSTP003] = MSTP(&div6_clks[DIV6_SUB], SYMSTPCR0, 3, 0), /* SCIFA1 */ -	[SYMSTP002] = MSTP(&div6_clks[DIV6_SUB], SYMSTPCR0, 2, 0), /* SCIFA2 */ -	[SYMSTP001] = MSTP(&div6_clks[DIV6_SUB], SYMSTPCR0, 1, 0), /* SCIFA3 */ -	[SYMSTP000] = MSTP(&div6_clks[DIV6_SUB], SYMSTPCR0, 0, 0), /* SCIFA4 */ -	[SYMSTP231] = MSTP(&div6_clks[DIV6_SUB], SYMSTPCR2, 31, 0), /* SIU */ -	[SYMSTP229] = MSTP(&r_clk, SYMSTPCR2, 29, 0), /* CMT10 */ -	[SYMSTP225] = MSTP(&div6_clks[DIV6_SUB], SYMSTPCR2, 25, 0), /* IRDA */ -	[SYMSTP223] = MSTP(&div6_clks[DIV6_SUB], SYMSTPCR2, 23, 0), /* IIC1 */ -	[SYMSTP222] = MSTP(&div6_clks[DIV6_SUB], SYMSTPCR2, 22, 0), /* USBHS */ -	[SYMSTP215] = MSTP(&div4_clks[DIV4_HP], SYMSTPCR2, 15, 0), /* FLCTL */ -	[SYMSTP214] = MSTP(&div4_clks[DIV4_HP], SYMSTPCR2, 14, 0), /* SDHI0 */ -	[SYMSTP213] = MSTP(&div4_clks[DIV4_HP], SYMSTPCR2, 13, 0), /* SDHI1 */ -	[SYMSTP211] = MSTP(&div4_clks[DIV4_HP], SYMSTPCR2, 11, 0), /* SDHI2 */ -	[CMMSTP003] = MSTP(&r_clk, CMMSTPCR0, 3, 0), /* KEYSC */ -}; - -static struct clk_lookup lookups[] = { -	/* main clocks */ -	CLKDEV_CON_ID("r_clk", &r_clk), -	CLKDEV_CON_ID("extalb1", &sh7367_extalb1_clk), -	CLKDEV_CON_ID("extal2", &sh7367_extal2_clk), -	CLKDEV_CON_ID("extalb1_div2_clk", &extalb1_div2_clk), -	CLKDEV_CON_ID("extal2_div2_clk", &extal2_div2_clk), -	CLKDEV_CON_ID("pllc1_clk", &pllc1_clk), -	CLKDEV_CON_ID("pllc1_div2_clk", &pllc1_div2_clk), -	CLKDEV_CON_ID("pllc2_clk", &pllc2_clk), - -	/* DIV4 clocks */ -	CLKDEV_CON_ID("i_clk", &div4_clks[DIV4_I]), -	CLKDEV_CON_ID("g_clk", &div4_clks[DIV4_G]), -	CLKDEV_CON_ID("b_clk", &div4_clks[DIV4_B]), -	CLKDEV_CON_ID("zx_clk", &div4_clks[DIV4_ZX]), -	CLKDEV_CON_ID("zt_clk", &div4_clks[DIV4_ZT]), -	CLKDEV_CON_ID("z_clk", &div4_clks[DIV4_Z]), -	CLKDEV_CON_ID("zd_clk", &div4_clks[DIV4_ZD]), -	CLKDEV_CON_ID("hp_clk", &div4_clks[DIV4_HP]), -	CLKDEV_CON_ID("zs_clk", &div4_clks[DIV4_ZS]), -	CLKDEV_CON_ID("zb_clk", &div4_clks[DIV4_ZB]), -	CLKDEV_CON_ID("zb3_clk", &div4_clks[DIV4_ZB3]), -	CLKDEV_CON_ID("cp_clk", &div4_clks[DIV4_CP]), - -	/* DIV6 clocks */ -	CLKDEV_CON_ID("sub_clk", &div6_clks[DIV6_SUB]), -	CLKDEV_CON_ID("siua_clk", &div6_clks[DIV6_SIUA]), -	CLKDEV_CON_ID("siub_clk", &div6_clks[DIV6_SIUB]), -	CLKDEV_CON_ID("msu_clk", &div6_clks[DIV6_MSU]), -	CLKDEV_CON_ID("spu_clk", &div6_clks[DIV6_SPU]), -	CLKDEV_CON_ID("mvi3_clk", &div6_clks[DIV6_MVI3]), -	CLKDEV_CON_ID("mf1_clk", &div6_clks[DIV6_MF1]), -	CLKDEV_CON_ID("mf2_clk", &div6_clks[DIV6_MF2]), -	CLKDEV_CON_ID("vck1_clk", &div6_clks[DIV6_VCK1]), -	CLKDEV_CON_ID("vck2_clk", &div6_clks[DIV6_VCK2]), -	CLKDEV_CON_ID("vck3_clk", &div6_clks[DIV6_VCK3]), -	CLKDEV_CON_ID("vou_clk", &div6_clks[DIV6_VOU]), - -	/* MSTP32 clocks */ -	CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[RTMSTP001]), /* IIC2 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.4", &mstp_clks[RTMSTP231]), /* VEU3 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.3", &mstp_clks[RTMSTP230]), /* VEU2 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.2", &mstp_clks[RTMSTP229]), /* VEU1 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.1", &mstp_clks[RTMSTP228]), /* VEU0 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.5", &mstp_clks[RTMSTP226]), /* VEU2H */ -	CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[RTMSTP216]), /* IIC0 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.6", &mstp_clks[RTMSTP206]), /* JPU */ -	CLKDEV_DEV_ID("sh-vou", &mstp_clks[RTMSTP205]), /* VOU */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.0", &mstp_clks[RTMSTP201]), /* VPU */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.7", &mstp_clks[SYMSTP023]), /* SPU1 */ -	CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[SYMSTP007]), /* SCIFA5 */ -	CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[SYMSTP006]), /* SCIFB */ -	CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[SYMSTP004]), /* SCIFA0 */ -	CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[SYMSTP003]), /* SCIFA1 */ -	CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[SYMSTP002]), /* SCIFA2 */ -	CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[SYMSTP001]), /* SCIFA3 */ -	CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[SYMSTP000]), /* SCIFA4 */ -	CLKDEV_DEV_ID("sh_siu", &mstp_clks[SYMSTP231]), /* SIU */ -	CLKDEV_DEV_ID("sh_cmt.10", &mstp_clks[SYMSTP229]), /* CMT10 */ -	CLKDEV_DEV_ID("sh_irda", &mstp_clks[SYMSTP225]), /* IRDA */ -	CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[SYMSTP223]), /* IIC1 */ -	CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[SYMSTP222]), /* USBHS */ -	CLKDEV_DEV_ID("r8a66597_udc.0", &mstp_clks[SYMSTP222]), /* USBHS */ -	CLKDEV_DEV_ID("sh_flctl", &mstp_clks[SYMSTP215]), /* FLCTL */ -	CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[SYMSTP214]), /* SDHI0 */ -	CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[SYMSTP213]), /* SDHI1 */ -	CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[SYMSTP211]), /* SDHI2 */ -	CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[CMMSTP003]), /* KEYSC */ -}; - -void __init sh7367_clock_init(void) -{ -	int k, ret = 0; - -	for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++) -		ret = clk_register(main_clks[k]); - -	if (!ret) -		ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table); - -	if (!ret) -		ret = sh_clk_div6_register(div6_clks, DIV6_NR); - -	if (!ret) -		ret = sh_clk_mstp_register(mstp_clks, MSTP_NR); - -	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); - -	if (!ret) -		shmobile_clk_init(); -	else -		panic("failed to setup sh7367 clocks\n"); -} diff --git a/arch/arm/mach-shmobile/clock-sh7372.c b/arch/arm/mach-shmobile/clock-sh7372.c index 430a90ffa12..4d57e342537 100644 --- a/arch/arm/mach-shmobile/clock-sh7372.c +++ b/arch/arm/mach-shmobile/clock-sh7372.c @@ -420,87 +420,11 @@ static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {  };  /* FSI DIV */ -static unsigned long fsidiv_recalc(struct clk *clk) -{ -	unsigned long value; - -	value = __raw_readl(clk->mapping->base); - -	value >>= 16; -	if (value < 2) -		return 0; - -	return clk->parent->rate / value; -} - -static long fsidiv_round_rate(struct clk *clk, unsigned long rate) -{ -	return clk_rate_div_range_round(clk, 2, 0xffff, rate); -} - -static void fsidiv_disable(struct clk *clk) -{ -	__raw_writel(0, clk->mapping->base); -} - -static int fsidiv_enable(struct clk *clk) -{ -	unsigned long value; - -	value  = __raw_readl(clk->mapping->base) >> 16; -	if (value < 2) -		return -EIO; - -	__raw_writel((value << 16) | 0x3, clk->mapping->base); - -	return 0; -} +enum { FSIDIV_A, FSIDIV_B, FSIDIV_REPARENT_NR }; -static int fsidiv_set_rate(struct clk *clk, unsigned long rate) -{ -	int idx; - -	idx = (clk->parent->rate / rate) & 0xffff; -	if (idx < 2) -		return -EINVAL; - -	__raw_writel(idx << 16, clk->mapping->base); -	return 0; -} - -static struct sh_clk_ops fsidiv_clk_ops = { -	.recalc		= fsidiv_recalc, -	.round_rate	= fsidiv_round_rate, -	.set_rate	= fsidiv_set_rate, -	.enable		= fsidiv_enable, -	.disable	= fsidiv_disable, -}; - -static struct clk_mapping fsidiva_clk_mapping = { -	.phys	= FSIDIVA, -	.len	= 8, -}; - -struct clk sh7372_fsidiva_clk = { -	.ops		= &fsidiv_clk_ops, -	.parent		= &div6_reparent_clks[DIV6_FSIA], /* late install */ -	.mapping	= &fsidiva_clk_mapping, -}; - -static struct clk_mapping fsidivb_clk_mapping = { -	.phys	= FSIDIVB, -	.len	= 8, -}; - -struct clk sh7372_fsidivb_clk = { -	.ops		= &fsidiv_clk_ops, -	.parent		= &div6_reparent_clks[DIV6_FSIB],  /* late install */ -	.mapping	= &fsidivb_clk_mapping, -}; - -static struct clk *late_main_clks[] = { -	&sh7372_fsidiva_clk, -	&sh7372_fsidivb_clk, +static struct clk fsidivs[] = { +	[FSIDIV_A] = SH_CLK_FSIDIV(FSIDIVA, &div6_reparent_clks[DIV6_FSIA]), +	[FSIDIV_B] = SH_CLK_FSIDIV(FSIDIVB, &div6_reparent_clks[DIV6_FSIB]),  };  enum { MSTP001, MSTP000, @@ -583,6 +507,8 @@ static struct clk_lookup lookups[] = {  	CLKDEV_CON_ID("pllc1_clk", &pllc1_clk),  	CLKDEV_CON_ID("pllc1_div2_clk", &pllc1_div2_clk),  	CLKDEV_CON_ID("pllc2_clk", &sh7372_pllc2_clk), +	CLKDEV_CON_ID("fsidiva", &fsidivs[FSIDIV_A]), +	CLKDEV_CON_ID("fsidivb", &fsidivs[FSIDIV_B]),  	/* DIV4 clocks */  	CLKDEV_CON_ID("i_clk", &div4_clks[DIV4_I]), @@ -678,6 +604,10 @@ static struct clk_lookup lookups[] = {  	CLKDEV_ICK_ID("icka", "sh_fsi2", &div6_reparent_clks[DIV6_FSIA]),  	CLKDEV_ICK_ID("ickb", "sh_fsi2", &div6_reparent_clks[DIV6_FSIB]),  	CLKDEV_ICK_ID("spu2", "sh_fsi2", &mstp_clks[MSTP223]), +	CLKDEV_ICK_ID("diva", "sh_fsi2", &fsidivs[FSIDIV_A]), +	CLKDEV_ICK_ID("divb", "sh_fsi2", &fsidivs[FSIDIV_B]), +	CLKDEV_ICK_ID("xcka", "sh_fsi2", &sh7372_fsiack_clk), +	CLKDEV_ICK_ID("xckb", "sh_fsi2", &sh7372_fsibck_clk),  };  void __init sh7372_clock_init(void) @@ -706,8 +636,8 @@ void __init sh7372_clock_init(void)  	if (!ret)  		ret = sh_clk_mstp_register(mstp_clks, MSTP_NR); -	for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++) -		ret = clk_register(late_main_clks[k]); +	if (!ret) +		ret = sh_clk_fsidiv_register(fsidivs, FSIDIV_REPARENT_NR);  	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); diff --git a/arch/arm/mach-shmobile/clock-sh7377.c b/arch/arm/mach-shmobile/clock-sh7377.c deleted file mode 100644 index b8480d19e1c..00000000000 --- a/arch/arm/mach-shmobile/clock-sh7377.c +++ /dev/null @@ -1,366 +0,0 @@ -/* - * SH7377 clock framework support - * - * Copyright (C) 2010 Magnus Damm - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/io.h> -#include <linux/sh_clk.h> -#include <linux/clkdev.h> -#include <mach/common.h> - -/* SH7377 registers */ -#define RTFRQCR    IOMEM(0xe6150000) -#define SYFRQCR    IOMEM(0xe6150004) -#define CMFRQCR    IOMEM(0xe61500E0) -#define VCLKCR1    IOMEM(0xe6150008) -#define VCLKCR2    IOMEM(0xe615000C) -#define VCLKCR3    IOMEM(0xe615001C) -#define FMSICKCR   IOMEM(0xe6150010) -#define FMSOCKCR   IOMEM(0xe6150014) -#define FSICKCR    IOMEM(0xe6150018) -#define PLLC1CR    IOMEM(0xe6150028) -#define PLLC2CR    IOMEM(0xe615002C) -#define SUBUSBCKCR IOMEM(0xe6150080) -#define SPUCKCR    IOMEM(0xe6150084) -#define MSUCKCR    IOMEM(0xe6150088) -#define MVI3CKCR   IOMEM(0xe6150090) -#define HDMICKCR   IOMEM(0xe6150094) -#define MFCK1CR    IOMEM(0xe6150098) -#define MFCK2CR    IOMEM(0xe615009C) -#define DSITCKCR   IOMEM(0xe6150060) -#define DSIPCKCR   IOMEM(0xe6150064) -#define SMSTPCR0   IOMEM(0xe6150130) -#define SMSTPCR1   IOMEM(0xe6150134) -#define SMSTPCR2   IOMEM(0xe6150138) -#define SMSTPCR3   IOMEM(0xe615013C) -#define SMSTPCR4   IOMEM(0xe6150140) - -/* Fixed 32 KHz root clock from EXTALR pin */ -static struct clk r_clk = { -	.rate           = 32768, -}; - -/* - * 26MHz default rate for the EXTALC1 root input clock. - * If needed, reset this with clk_set_rate() from the platform code. - */ -struct clk sh7377_extalc1_clk = { -	.rate		= 26666666, -}; - -/* - * 48MHz default rate for the EXTAL2 root input clock. - * If needed, reset this with clk_set_rate() from the platform code. - */ -struct clk sh7377_extal2_clk = { -	.rate		= 48000000, -}; - -/* A fixed divide-by-2 block */ -static unsigned long div2_recalc(struct clk *clk) -{ -	return clk->parent->rate / 2; -} - -static struct sh_clk_ops div2_clk_ops = { -	.recalc		= div2_recalc, -}; - -/* Divide extalc1 by two */ -static struct clk extalc1_div2_clk = { -	.ops		= &div2_clk_ops, -	.parent		= &sh7377_extalc1_clk, -}; - -/* Divide extal2 by two */ -static struct clk extal2_div2_clk = { -	.ops		= &div2_clk_ops, -	.parent		= &sh7377_extal2_clk, -}; - -/* Divide extal2 by four */ -static struct clk extal2_div4_clk = { -	.ops		= &div2_clk_ops, -	.parent		= &extal2_div2_clk, -}; - -/* PLLC1 */ -static unsigned long pllc1_recalc(struct clk *clk) -{ -	unsigned long mult = 1; - -	if (__raw_readl(PLLC1CR) & (1 << 14)) -		mult = (((__raw_readl(RTFRQCR) >> 24) & 0x3f) + 1) * 2; - -	return clk->parent->rate * mult; -} - -static struct sh_clk_ops pllc1_clk_ops = { -	.recalc		= pllc1_recalc, -}; - -static struct clk pllc1_clk = { -	.ops		= &pllc1_clk_ops, -	.flags		= CLK_ENABLE_ON_INIT, -	.parent		= &extalc1_div2_clk, -}; - -/* Divide PLLC1 by two */ -static struct clk pllc1_div2_clk = { -	.ops		= &div2_clk_ops, -	.parent		= &pllc1_clk, -}; - -/* PLLC2 */ -static unsigned long pllc2_recalc(struct clk *clk) -{ -	unsigned long mult = 1; - -	if (__raw_readl(PLLC2CR) & (1 << 31)) -		mult = (((__raw_readl(PLLC2CR) >> 24) & 0x3f) + 1) * 2; - -	return clk->parent->rate * mult; -} - -static struct sh_clk_ops pllc2_clk_ops = { -	.recalc		= pllc2_recalc, -}; - -static struct clk pllc2_clk = { -	.ops		= &pllc2_clk_ops, -	.flags		= CLK_ENABLE_ON_INIT, -	.parent		= &extalc1_div2_clk, -}; - -static struct clk *main_clks[] = { -	&r_clk, -	&sh7377_extalc1_clk, -	&sh7377_extal2_clk, -	&extalc1_div2_clk, -	&extal2_div2_clk, -	&extal2_div4_clk, -	&pllc1_clk, -	&pllc1_div2_clk, -	&pllc2_clk, -}; - -static void div4_kick(struct clk *clk) -{ -	unsigned long value; - -	/* set KICK bit in SYFRQCR to update hardware setting */ -	value = __raw_readl(SYFRQCR); -	value |= (1 << 31); -	__raw_writel(value, SYFRQCR); -} - -static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18, -			  24, 32, 36, 48, 0, 72, 96, 0 }; - -static struct clk_div_mult_table div4_div_mult_table = { -	.divisors = divisors, -	.nr_divisors = ARRAY_SIZE(divisors), -}; - -static struct clk_div4_table div4_table = { -	.div_mult_table = &div4_div_mult_table, -	.kick = div4_kick, -}; - -enum { DIV4_I, DIV4_ZG, DIV4_B, DIV4_M1, DIV4_CSIR, -       DIV4_ZTR, DIV4_ZT, DIV4_Z, DIV4_HP, -       DIV4_ZS, DIV4_ZB, DIV4_ZB3, DIV4_CP, DIV4_NR }; - -#define DIV4(_reg, _bit, _mask, _flags) \ -  SH_CLK_DIV4(&pllc1_clk, _reg, _bit, _mask, _flags) - -static struct clk div4_clks[DIV4_NR] = { -	[DIV4_I] = DIV4(RTFRQCR, 20, 0x6fff, CLK_ENABLE_ON_INIT), -	[DIV4_ZG] = DIV4(RTFRQCR, 16, 0x6fff, CLK_ENABLE_ON_INIT), -	[DIV4_B] = DIV4(RTFRQCR, 8, 0x6fff, CLK_ENABLE_ON_INIT), -	[DIV4_M1] = DIV4(RTFRQCR, 4, 0x6fff, CLK_ENABLE_ON_INIT), -	[DIV4_CSIR] = DIV4(RTFRQCR, 0, 0x6fff, 0), -	[DIV4_ZTR] = DIV4(SYFRQCR, 20, 0x6fff, 0), -	[DIV4_ZT] = DIV4(SYFRQCR, 16, 0x6fff, 0), -	[DIV4_Z] = DIV4(SYFRQCR, 12, 0x6fff, 0), -	[DIV4_HP] = DIV4(SYFRQCR, 4, 0x6fff, 0), -	[DIV4_ZS] = DIV4(CMFRQCR, 12, 0x6fff, 0), -	[DIV4_ZB] = DIV4(CMFRQCR, 8, 0x6fff, 0), -	[DIV4_ZB3] = DIV4(CMFRQCR, 4, 0x6fff, 0), -	[DIV4_CP] = DIV4(CMFRQCR, 0, 0x6fff, 0), -}; - -enum { DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_FMSI, DIV6_FMSO, -       DIV6_FSI, DIV6_SUB, DIV6_SPU, DIV6_MSU, DIV6_MVI3, DIV6_HDMI, -       DIV6_MF1, DIV6_MF2, DIV6_DSIT, DIV6_DSIP, -       DIV6_NR }; - -static struct clk div6_clks[] = { -	[DIV6_VCK1] = SH_CLK_DIV6(&pllc1_div2_clk, VCLKCR1, 0), -	[DIV6_VCK2] = SH_CLK_DIV6(&pllc1_div2_clk, VCLKCR2, 0), -	[DIV6_VCK3] = SH_CLK_DIV6(&pllc1_div2_clk, VCLKCR3, 0), -	[DIV6_FMSI] = SH_CLK_DIV6(&pllc1_div2_clk, FMSICKCR, 0), -	[DIV6_FMSO] = SH_CLK_DIV6(&pllc1_div2_clk, FMSOCKCR, 0), -	[DIV6_FSI] = SH_CLK_DIV6(&pllc1_div2_clk, FSICKCR, 0), -	[DIV6_SUB] = SH_CLK_DIV6(&sh7377_extal2_clk, SUBUSBCKCR, 0), -	[DIV6_SPU] = SH_CLK_DIV6(&pllc1_div2_clk, SPUCKCR, 0), -	[DIV6_MSU] = SH_CLK_DIV6(&pllc1_div2_clk, MSUCKCR, 0), -	[DIV6_MVI3] = SH_CLK_DIV6(&pllc1_div2_clk, MVI3CKCR, 0), -	[DIV6_HDMI] = SH_CLK_DIV6(&pllc1_div2_clk, HDMICKCR, 0), -	[DIV6_MF1] = SH_CLK_DIV6(&pllc1_div2_clk, MFCK1CR, 0), -	[DIV6_MF2] = SH_CLK_DIV6(&pllc1_div2_clk, MFCK2CR, 0), -	[DIV6_DSIT] = SH_CLK_DIV6(&pllc1_div2_clk, DSITCKCR, 0), -	[DIV6_DSIP] = SH_CLK_DIV6(&pllc1_div2_clk, DSIPCKCR, 0), -}; - -enum { MSTP001, -       MSTP131, MSTP130, MSTP129, MSTP128, MSTP116, MSTP106, MSTP101, -       MSTP223, MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, -       MSTP331, MSTP329, MSTP325, MSTP323, MSTP322, -       MSTP315, MSTP314, MSTP313, -       MSTP403, -       MSTP_NR }; - -#define MSTP(_parent, _reg, _bit, _flags) \ -  SH_CLK_MSTP32(_parent, _reg, _bit, _flags) - -static struct clk mstp_clks[] = { -	[MSTP001] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR0, 1, 0), /* IIC2 */ -	[MSTP131] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 31, 0), /* VEU3 */ -	[MSTP130] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 30, 0), /* VEU2 */ -	[MSTP129] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 29, 0), /* VEU1 */ -	[MSTP128] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 28, 0), /* VEU0 */ -	[MSTP116] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR1, 16, 0), /* IIC0 */ -	[MSTP106] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 6, 0), /* JPU */ -	[MSTP101] = MSTP(&div4_clks[DIV4_M1], SMSTPCR1, 1, 0), /* VPU */ -	[MSTP223] = MSTP(&div6_clks[DIV6_SPU], SMSTPCR2, 23, 0), /* SPU2 */ -	[MSTP207] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 7, 0), /* SCIFA5 */ -	[MSTP206] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 6, 0), /* SCIFB */ -	[MSTP204] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 4, 0), /* SCIFA0 */ -	[MSTP203] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 3, 0), /* SCIFA1 */ -	[MSTP202] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 2, 0), /* SCIFA2 */ -	[MSTP201] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 1, 0), /* SCIFA3 */ -	[MSTP200] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 0, 0), /* SCIFA4 */ -	[MSTP331] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 31, 0), /* SCIFA6 */ -	[MSTP329] = MSTP(&r_clk, SMSTPCR3, 29, 0), /* CMT10 */ -	[MSTP325] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 25, 0), /* IRDA */ -	[MSTP323] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 23, 0), /* IIC1 */ -	[MSTP322] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 22, 0), /* USB0 */ -	[MSTP315] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 15, 0), /* FLCTL */ -	[MSTP314] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 14, 0), /* SDHI0 */ -	[MSTP313] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 13, 0), /* SDHI1 */ -	[MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */ -}; - -static struct clk_lookup lookups[] = { -	/* main clocks */ -	CLKDEV_CON_ID("r_clk", &r_clk), -	CLKDEV_CON_ID("extalc1", &sh7377_extalc1_clk), -	CLKDEV_CON_ID("extal2", &sh7377_extal2_clk), -	CLKDEV_CON_ID("extalc1_div2_clk", &extalc1_div2_clk), -	CLKDEV_CON_ID("extal2_div2_clk", &extal2_div2_clk), -	CLKDEV_CON_ID("extal2_div4_clk", &extal2_div4_clk), -	CLKDEV_CON_ID("pllc1_clk", &pllc1_clk), -	CLKDEV_CON_ID("pllc1_div2_clk", &pllc1_div2_clk), -	CLKDEV_CON_ID("pllc2_clk", &pllc2_clk), - -	/* DIV4 clocks */ -	CLKDEV_CON_ID("i_clk", &div4_clks[DIV4_I]), -	CLKDEV_CON_ID("zg_clk", &div4_clks[DIV4_ZG]), -	CLKDEV_CON_ID("b_clk", &div4_clks[DIV4_B]), -	CLKDEV_CON_ID("m1_clk", &div4_clks[DIV4_M1]), -	CLKDEV_CON_ID("csir_clk", &div4_clks[DIV4_CSIR]), -	CLKDEV_CON_ID("ztr_clk", &div4_clks[DIV4_ZTR]), -	CLKDEV_CON_ID("zt_clk", &div4_clks[DIV4_ZT]), -	CLKDEV_CON_ID("z_clk", &div4_clks[DIV4_Z]), -	CLKDEV_CON_ID("hp_clk", &div4_clks[DIV4_HP]), -	CLKDEV_CON_ID("zs_clk", &div4_clks[DIV4_ZS]), -	CLKDEV_CON_ID("zb_clk", &div4_clks[DIV4_ZB]), -	CLKDEV_CON_ID("zb3_clk", &div4_clks[DIV4_ZB3]), -	CLKDEV_CON_ID("cp_clk", &div4_clks[DIV4_CP]), - -	/* DIV6 clocks */ -	CLKDEV_CON_ID("vck1_clk", &div6_clks[DIV6_VCK1]), -	CLKDEV_CON_ID("vck2_clk", &div6_clks[DIV6_VCK2]), -	CLKDEV_CON_ID("vck3_clk", &div6_clks[DIV6_VCK3]), -	CLKDEV_CON_ID("fmsi_clk", &div6_clks[DIV6_FMSI]), -	CLKDEV_CON_ID("fmso_clk", &div6_clks[DIV6_FMSO]), -	CLKDEV_CON_ID("fsi_clk", &div6_clks[DIV6_FSI]), -	CLKDEV_CON_ID("sub_clk", &div6_clks[DIV6_SUB]), -	CLKDEV_CON_ID("spu_clk", &div6_clks[DIV6_SPU]), -	CLKDEV_CON_ID("msu_clk", &div6_clks[DIV6_MSU]), -	CLKDEV_CON_ID("mvi3_clk", &div6_clks[DIV6_MVI3]), -	CLKDEV_CON_ID("hdmi_clk", &div6_clks[DIV6_HDMI]), -	CLKDEV_CON_ID("mf1_clk", &div6_clks[DIV6_MF1]), -	CLKDEV_CON_ID("mf2_clk", &div6_clks[DIV6_MF2]), -	CLKDEV_CON_ID("dsit_clk", &div6_clks[DIV6_DSIT]), -	CLKDEV_CON_ID("dsip_clk", &div6_clks[DIV6_DSIP]), - -	/* MSTP32 clocks */ -	CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* IIC2 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.4", &mstp_clks[MSTP131]), /* VEU3 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.3", &mstp_clks[MSTP130]), /* VEU2 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.2", &mstp_clks[MSTP129]), /* VEU1 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.1", &mstp_clks[MSTP128]), /* VEU0 */ -	CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* IIC0 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.5", &mstp_clks[MSTP106]), /* JPU */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.0", &mstp_clks[MSTP101]), /* VPU */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.6", &mstp_clks[MSTP223]), /* SPU2DSP0 */ -	CLKDEV_DEV_ID("uio_pdrv_genirq.7", &mstp_clks[MSTP223]), /* SPU2DSP1 */ -	CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), /* SCIFA5 */ -	CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP206]), /* SCIFB */ -	CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]), /* SCIFA0 */ -	CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]), /* SCIFA1 */ -	CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP202]), /* SCIFA2 */ -	CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP201]), /* SCIFA3 */ -	CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */ -	CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP331]), /* SCIFA6 */ -	CLKDEV_DEV_ID("sh_cmt.10", &mstp_clks[MSTP329]), /* CMT10 */ -	CLKDEV_DEV_ID("sh_irda", &mstp_clks[MSTP325]), /* IRDA */ -	CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* IIC1 */ -	CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[MSTP322]), /* USBHS */ -	CLKDEV_DEV_ID("r8a66597_udc.0", &mstp_clks[MSTP322]), /* USBHS */ -	CLKDEV_DEV_ID("sh_flctl", &mstp_clks[MSTP315]), /* FLCTL */ -	CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */ -	CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ -	CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */ -}; - -void __init sh7377_clock_init(void) -{ -	int k, ret = 0; - -	for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++) -		ret = clk_register(main_clks[k]); - -	if (!ret) -		ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table); - -	if (!ret) -		ret = sh_clk_div6_register(div6_clks, DIV6_NR); - -	if (!ret) -		ret = sh_clk_mstp_register(mstp_clks, MSTP_NR); - -	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); - -	if (!ret) -		shmobile_clk_init(); -	else -		panic("failed to setup sh7377 clocks\n"); -} diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index d47e215aca8..dfeca79e9e9 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h @@ -18,24 +18,6 @@ extern int shmobile_enter_wfi(struct cpuidle_device *dev,  			      struct cpuidle_driver *drv, int index);  extern void shmobile_cpuidle_set_driver(struct cpuidle_driver *drv); -extern void sh7367_init_irq(void); -extern void sh7367_map_io(void); -extern void sh7367_add_early_devices(void); -extern void sh7367_add_standard_devices(void); -extern void sh7367_clock_init(void); -extern void sh7367_pinmux_init(void); -extern struct clk sh7367_extalb1_clk; -extern struct clk sh7367_extal2_clk; - -extern void sh7377_init_irq(void); -extern void sh7377_map_io(void); -extern void sh7377_add_early_devices(void); -extern void sh7377_add_standard_devices(void); -extern void sh7377_clock_init(void); -extern void sh7377_pinmux_init(void); -extern struct clk sh7377_extalc1_clk; -extern struct clk sh7377_extal2_clk; -  extern void sh7372_init_irq(void);  extern void sh7372_map_io(void);  extern void sh7372_add_early_devices(void); diff --git a/arch/arm/mach-shmobile/include/mach/r8a7779.h b/arch/arm/mach-shmobile/include/mach/r8a7779.h index 499f52d2a4a..8ab0cd6ad6b 100644 --- a/arch/arm/mach-shmobile/include/mach/r8a7779.h +++ b/arch/arm/mach-shmobile/include/mach/r8a7779.h @@ -71,7 +71,7 @@ enum {  	GPIO_FN_A19,  	/* IPSR0 */ -	GPIO_FN_PENC2, GPIO_FN_SCK0, GPIO_FN_PWM1, GPIO_FN_PWMFSW0, +	GPIO_FN_USB_PENC2, GPIO_FN_SCK0, GPIO_FN_PWM1, GPIO_FN_PWMFSW0,  	GPIO_FN_SCIF_CLK, GPIO_FN_TCLK0_C, GPIO_FN_BS, GPIO_FN_SD1_DAT2,  	GPIO_FN_MMC0_D2, GPIO_FN_FD2, GPIO_FN_ATADIR0, GPIO_FN_SDSELF,  	GPIO_FN_HCTS1, GPIO_FN_TX4_C, GPIO_FN_A0, GPIO_FN_SD1_DAT3, diff --git a/arch/arm/mach-shmobile/include/mach/sh7367.h b/arch/arm/mach-shmobile/include/mach/sh7367.h deleted file mode 100644 index 52d0de686f6..00000000000 --- a/arch/arm/mach-shmobile/include/mach/sh7367.h +++ /dev/null @@ -1,332 +0,0 @@ -#ifndef __ASM_SH7367_H__ -#define __ASM_SH7367_H__ - -/* Pin Function Controller: - * GPIO_FN_xx - GPIO used to select pin function - * GPIO_PORTxx - GPIO mapped to real I/O pin on CPU - */ -enum { -	/* 49-1 -> 49-6 (GPIO) */ -	GPIO_PORT0, GPIO_PORT1, GPIO_PORT2, GPIO_PORT3, GPIO_PORT4, -	GPIO_PORT5, GPIO_PORT6, GPIO_PORT7, GPIO_PORT8, GPIO_PORT9, - -	GPIO_PORT10, GPIO_PORT11, GPIO_PORT12, GPIO_PORT13, GPIO_PORT14, -	GPIO_PORT15, GPIO_PORT16, GPIO_PORT17, GPIO_PORT18, GPIO_PORT19, - -	GPIO_PORT20, GPIO_PORT21, GPIO_PORT22, GPIO_PORT23, GPIO_PORT24, -	GPIO_PORT25, GPIO_PORT26, GPIO_PORT27, GPIO_PORT28, GPIO_PORT29, - -	GPIO_PORT30, GPIO_PORT31, GPIO_PORT32, GPIO_PORT33, GPIO_PORT34, -	GPIO_PORT35, GPIO_PORT36, GPIO_PORT37, GPIO_PORT38, GPIO_PORT39, - -	GPIO_PORT40, GPIO_PORT41, GPIO_PORT42, GPIO_PORT43, GPIO_PORT44, -	GPIO_PORT45, GPIO_PORT46, GPIO_PORT47, GPIO_PORT48, GPIO_PORT49, - -	GPIO_PORT50, GPIO_PORT51, GPIO_PORT52, GPIO_PORT53, GPIO_PORT54, -	GPIO_PORT55, GPIO_PORT56, GPIO_PORT57, GPIO_PORT58, GPIO_PORT59, - -	GPIO_PORT60, GPIO_PORT61, GPIO_PORT62, GPIO_PORT63, GPIO_PORT64, -	GPIO_PORT65, GPIO_PORT66, GPIO_PORT67, GPIO_PORT68, GPIO_PORT69, - -	GPIO_PORT70, GPIO_PORT71, GPIO_PORT72, GPIO_PORT73, GPIO_PORT74, -	GPIO_PORT75, GPIO_PORT76, GPIO_PORT77, GPIO_PORT78, GPIO_PORT79, - -	GPIO_PORT80, GPIO_PORT81, GPIO_PORT82, GPIO_PORT83, GPIO_PORT84, -	GPIO_PORT85, GPIO_PORT86, GPIO_PORT87, GPIO_PORT88, GPIO_PORT89, - -	GPIO_PORT90, GPIO_PORT91, GPIO_PORT92, GPIO_PORT93, GPIO_PORT94, -	GPIO_PORT95, GPIO_PORT96, GPIO_PORT97, GPIO_PORT98, GPIO_PORT99, - -	GPIO_PORT100, GPIO_PORT101, GPIO_PORT102, GPIO_PORT103, GPIO_PORT104, -	GPIO_PORT105, GPIO_PORT106, GPIO_PORT107, GPIO_PORT108, GPIO_PORT109, - -	GPIO_PORT110, GPIO_PORT111, GPIO_PORT112, GPIO_PORT113, GPIO_PORT114, -	GPIO_PORT115, GPIO_PORT116, GPIO_PORT117, GPIO_PORT118, GPIO_PORT119, - -	GPIO_PORT120, GPIO_PORT121, GPIO_PORT122, GPIO_PORT123, GPIO_PORT124, -	GPIO_PORT125, GPIO_PORT126, GPIO_PORT127, GPIO_PORT128, GPIO_PORT129, - -	GPIO_PORT130, GPIO_PORT131, GPIO_PORT132, GPIO_PORT133, GPIO_PORT134, -	GPIO_PORT135, GPIO_PORT136, GPIO_PORT137, GPIO_PORT138, GPIO_PORT139, - -	GPIO_PORT140, GPIO_PORT141, GPIO_PORT142, GPIO_PORT143, GPIO_PORT144, -	GPIO_PORT145, GPIO_PORT146, GPIO_PORT147, GPIO_PORT148, GPIO_PORT149, - -	GPIO_PORT150, GPIO_PORT151, GPIO_PORT152, GPIO_PORT153, GPIO_PORT154, -	GPIO_PORT155, GPIO_PORT156, GPIO_PORT157, GPIO_PORT158, GPIO_PORT159, - -	GPIO_PORT160, GPIO_PORT161, GPIO_PORT162, GPIO_PORT163, GPIO_PORT164, -	GPIO_PORT165, GPIO_PORT166, GPIO_PORT167, GPIO_PORT168, GPIO_PORT169, - -	GPIO_PORT170, GPIO_PORT171, GPIO_PORT172, GPIO_PORT173, GPIO_PORT174, -	GPIO_PORT175, GPIO_PORT176, GPIO_PORT177, GPIO_PORT178, GPIO_PORT179, - -	GPIO_PORT180, GPIO_PORT181, GPIO_PORT182, GPIO_PORT183, GPIO_PORT184, -	GPIO_PORT185, GPIO_PORT186, GPIO_PORT187, GPIO_PORT188, GPIO_PORT189, - -	GPIO_PORT190, GPIO_PORT191, GPIO_PORT192, GPIO_PORT193, GPIO_PORT194, -	GPIO_PORT195, GPIO_PORT196, GPIO_PORT197, GPIO_PORT198, GPIO_PORT199, - -	GPIO_PORT200, GPIO_PORT201, GPIO_PORT202, GPIO_PORT203, GPIO_PORT204, -	GPIO_PORT205, GPIO_PORT206, GPIO_PORT207, GPIO_PORT208, GPIO_PORT209, - -	GPIO_PORT210, GPIO_PORT211, GPIO_PORT212, GPIO_PORT213, GPIO_PORT214, -	GPIO_PORT215, GPIO_PORT216, GPIO_PORT217, GPIO_PORT218, GPIO_PORT219, - -	GPIO_PORT220, GPIO_PORT221, GPIO_PORT222, GPIO_PORT223, GPIO_PORT224, -	GPIO_PORT225, GPIO_PORT226, GPIO_PORT227, GPIO_PORT228, GPIO_PORT229, - -	GPIO_PORT230, GPIO_PORT231, GPIO_PORT232, GPIO_PORT233, GPIO_PORT234, -	GPIO_PORT235, GPIO_PORT236, GPIO_PORT237, GPIO_PORT238, GPIO_PORT239, - -	GPIO_PORT240, GPIO_PORT241, GPIO_PORT242, GPIO_PORT243, GPIO_PORT244, -	GPIO_PORT245, GPIO_PORT246, GPIO_PORT247, GPIO_PORT248, GPIO_PORT249, - -	GPIO_PORT250, GPIO_PORT251, GPIO_PORT252, GPIO_PORT253, GPIO_PORT254, -	GPIO_PORT255, GPIO_PORT256, GPIO_PORT257, GPIO_PORT258, GPIO_PORT259, - -	GPIO_PORT260, GPIO_PORT261, GPIO_PORT262, GPIO_PORT263, GPIO_PORT264, -	GPIO_PORT265, GPIO_PORT266, GPIO_PORT267, GPIO_PORT268, GPIO_PORT269, - -	GPIO_PORT270, GPIO_PORT271, GPIO_PORT272, - -	/* Special Pull-up / Pull-down Functions */ -	GPIO_FN_PORT48_KEYIN0_PU, GPIO_FN_PORT49_KEYIN1_PU, -	GPIO_FN_PORT50_KEYIN2_PU, GPIO_FN_PORT55_KEYIN3_PU, -	GPIO_FN_PORT56_KEYIN4_PU, GPIO_FN_PORT57_KEYIN5_PU, -	GPIO_FN_PORT58_KEYIN6_PU, - -	/* 49-1 (FN) */ -	GPIO_FN_VBUS0, GPIO_FN_CPORT0, GPIO_FN_CPORT1, GPIO_FN_CPORT2, -	GPIO_FN_CPORT3, GPIO_FN_CPORT4, GPIO_FN_CPORT5, GPIO_FN_CPORT6, -	GPIO_FN_CPORT7, GPIO_FN_CPORT8, GPIO_FN_CPORT9, GPIO_FN_CPORT10, -	GPIO_FN_CPORT11, GPIO_FN_SIN2, GPIO_FN_CPORT12, GPIO_FN_XCTS2, -	GPIO_FN_CPORT13, GPIO_FN_RFSPO4, GPIO_FN_CPORT14, GPIO_FN_RFSPO5, -	GPIO_FN_CPORT15, GPIO_FN_CPORT16, GPIO_FN_CPORT17, GPIO_FN_SOUT2, -	GPIO_FN_CPORT18, GPIO_FN_XRTS2, GPIO_FN_CPORT19, GPIO_FN_CPORT20, -	GPIO_FN_RFSPO6, GPIO_FN_CPORT21, GPIO_FN_STATUS0, GPIO_FN_CPORT22, -	GPIO_FN_STATUS1, GPIO_FN_CPORT23, GPIO_FN_STATUS2, GPIO_FN_RFSPO7, -	GPIO_FN_MPORT0, GPIO_FN_MPORT1, GPIO_FN_B_SYNLD1, GPIO_FN_B_SYNLD2, -	GPIO_FN_XMAINPS, GPIO_FN_XDIVPS, GPIO_FN_XIDRST, GPIO_FN_IDCLK, -	GPIO_FN_IDIO, GPIO_FN_SOUT1, GPIO_FN_SCIFA4_TXD, -	GPIO_FN_M02_BERDAT, GPIO_FN_SIN1, GPIO_FN_SCIFA4_RXD, GPIO_FN_XWUP, -	GPIO_FN_XRTS1, GPIO_FN_SCIFA4_RTS, GPIO_FN_M03_BERCLK, -	GPIO_FN_XCTS1, GPIO_FN_SCIFA4_CTS, - -	/* 49-2 (FN) */ -	GPIO_FN_HSU_IQ_AGC6, GPIO_FN_MFG2_IN2, GPIO_FN_MSIOF2_MCK0, -	GPIO_FN_HSU_IQ_AGC5, GPIO_FN_MFG2_IN1, GPIO_FN_MSIOF2_MCK1, -	GPIO_FN_HSU_IQ_AGC4, GPIO_FN_MSIOF2_RSYNC, -	GPIO_FN_HSU_IQ_AGC3, GPIO_FN_MFG2_OUT1, GPIO_FN_MSIOF2_RSCK, -	GPIO_FN_HSU_IQ_AGC2, GPIO_FN_PORT42_KEYOUT0, -	GPIO_FN_HSU_IQ_AGC1, GPIO_FN_PORT43_KEYOUT1, -	GPIO_FN_HSU_IQ_AGC0, GPIO_FN_PORT44_KEYOUT2, -	GPIO_FN_HSU_IQ_AGC_ST, GPIO_FN_PORT45_KEYOUT3, -	GPIO_FN_HSU_IQ_PDO, GPIO_FN_PORT46_KEYOUT4, -	GPIO_FN_HSU_IQ_PYO, GPIO_FN_PORT47_KEYOUT5, -	GPIO_FN_HSU_EN_TXMUX_G3MO, GPIO_FN_PORT48_KEYIN0, -	GPIO_FN_HSU_I_TXMUX_G3MO, GPIO_FN_PORT49_KEYIN1, -	GPIO_FN_HSU_Q_TXMUX_G3MO, GPIO_FN_PORT50_KEYIN2, -	GPIO_FN_HSU_SYO, GPIO_FN_PORT51_MSIOF2_TSYNC, -	GPIO_FN_HSU_SDO, GPIO_FN_PORT52_MSIOF2_TSCK, -	GPIO_FN_HSU_TGTTI_G3MO, GPIO_FN_PORT53_MSIOF2_TXD, -	GPIO_FN_B_TIME_STAMP, GPIO_FN_PORT54_MSIOF2_RXD, -	GPIO_FN_HSU_SDI, GPIO_FN_PORT55_KEYIN3, -	GPIO_FN_HSU_SCO, GPIO_FN_PORT56_KEYIN4, -	GPIO_FN_HSU_DREQ, GPIO_FN_PORT57_KEYIN5, -	GPIO_FN_HSU_DACK, GPIO_FN_PORT58_KEYIN6, -	GPIO_FN_HSU_CLK61M, GPIO_FN_PORT59_MSIOF2_SS1, -	GPIO_FN_HSU_XRST, GPIO_FN_PORT60_MSIOF2_SS2, -	GPIO_FN_PCMCLKO, GPIO_FN_SYNC8KO, GPIO_FN_DNPCM_A, GPIO_FN_UPPCM_A, -	GPIO_FN_XTALB1L, -	GPIO_FN_GPS_AGC1, GPIO_FN_SCIFA0_RTS, -	GPIO_FN_GPS_AGC2, GPIO_FN_SCIFA0_SCK, -	GPIO_FN_GPS_AGC3, GPIO_FN_SCIFA0_TXD, -	GPIO_FN_GPS_AGC4, GPIO_FN_SCIFA0_RXD, -	GPIO_FN_GPS_PWRD, GPIO_FN_SCIFA0_CTS, -	GPIO_FN_GPS_IM, GPIO_FN_GPS_IS, GPIO_FN_GPS_QM, GPIO_FN_GPS_QS, -	GPIO_FN_SIUBOMC, GPIO_FN_TPU2TO0, -	GPIO_FN_SIUCKB, GPIO_FN_TPU2TO1, -	GPIO_FN_SIUBOLR, GPIO_FN_BBIF2_TSYNC, GPIO_FN_TPU2TO2, -	GPIO_FN_SIUBOBT, GPIO_FN_BBIF2_TSCK, GPIO_FN_TPU2TO3, -	GPIO_FN_SIUBOSLD, GPIO_FN_BBIF2_TXD, GPIO_FN_TPU3TO0, -	GPIO_FN_SIUBILR, GPIO_FN_TPU3TO1, -	GPIO_FN_SIUBIBT, GPIO_FN_TPU3TO2, -	GPIO_FN_SIUBISLD, GPIO_FN_TPU3TO3, -	GPIO_FN_NMI, GPIO_FN_TPU4TO0, -	GPIO_FN_DNPCM_M, GPIO_FN_TPU4TO1, GPIO_FN_TPU4TO2, GPIO_FN_TPU4TO3, -	GPIO_FN_IRQ_TMPB, -	GPIO_FN_PWEN, GPIO_FN_MFG1_OUT1, -	GPIO_FN_OVCN, GPIO_FN_MFG1_IN1, -	GPIO_FN_OVCN2, GPIO_FN_MFG1_IN2, - -	/* 49-3 (FN) */ -	GPIO_FN_RFSPO1, GPIO_FN_RFSPO2, GPIO_FN_RFSPO3, GPIO_FN_PORT93_VIO_CKO2, -	GPIO_FN_USBTERM, GPIO_FN_EXTLP, GPIO_FN_IDIN, -	GPIO_FN_SCIFA5_CTS, GPIO_FN_MFG0_IN1, -	GPIO_FN_SCIFA5_RTS, GPIO_FN_MFG0_IN2, -	GPIO_FN_SCIFA5_RXD, -	GPIO_FN_SCIFA5_TXD, -	GPIO_FN_SCIFA5_SCK, GPIO_FN_MFG0_OUT1, -	GPIO_FN_A0_EA0, GPIO_FN_BS, -	GPIO_FN_A14_EA14, GPIO_FN_PORT102_KEYOUT0, -	GPIO_FN_A15_EA15, GPIO_FN_PORT103_KEYOUT1, GPIO_FN_DV_CLKOL, -	GPIO_FN_A16_EA16, GPIO_FN_PORT104_KEYOUT2, -	GPIO_FN_DV_VSYNCL, GPIO_FN_MSIOF0_SS1, -	GPIO_FN_A17_EA17, GPIO_FN_PORT105_KEYOUT3, -	GPIO_FN_DV_HSYNCL, GPIO_FN_MSIOF0_TSYNC, -	GPIO_FN_A18_EA18, GPIO_FN_PORT106_KEYOUT4, -	GPIO_FN_DV_DL0, GPIO_FN_MSIOF0_TSCK, -	GPIO_FN_A19_EA19, GPIO_FN_PORT107_KEYOUT5, -	GPIO_FN_DV_DL1, GPIO_FN_MSIOF0_TXD, -	GPIO_FN_A20_EA20, GPIO_FN_PORT108_KEYIN0, -	GPIO_FN_DV_DL2, GPIO_FN_MSIOF0_RSCK, -	GPIO_FN_A21_EA21, GPIO_FN_PORT109_KEYIN1, -	GPIO_FN_DV_DL3, GPIO_FN_MSIOF0_RSYNC, -	GPIO_FN_A22_EA22, GPIO_FN_PORT110_KEYIN2, -	GPIO_FN_DV_DL4, GPIO_FN_MSIOF0_MCK0, -	GPIO_FN_A23_EA23, GPIO_FN_PORT111_KEYIN3, -	GPIO_FN_DV_DL5, GPIO_FN_MSIOF0_MCK1, -	GPIO_FN_A24_EA24, GPIO_FN_PORT112_KEYIN4, -	GPIO_FN_DV_DL6, GPIO_FN_MSIOF0_RXD, -	GPIO_FN_A25_EA25, GPIO_FN_PORT113_KEYIN5, -	GPIO_FN_DV_DL7, GPIO_FN_MSIOF0_SS2, -	GPIO_FN_A26, GPIO_FN_PORT113_KEYIN6, GPIO_FN_DV_CLKIL, -	GPIO_FN_D0_ED0_NAF0, GPIO_FN_D1_ED1_NAF1, GPIO_FN_D2_ED2_NAF2, -	GPIO_FN_D3_ED3_NAF3, GPIO_FN_D4_ED4_NAF4, GPIO_FN_D5_ED5_NAF5, -	GPIO_FN_D6_ED6_NAF6, GPIO_FN_D7_ED7_NAF7, GPIO_FN_D8_ED8_NAF8, -	GPIO_FN_D9_ED9_NAF9, GPIO_FN_D10_ED10_NAF10, GPIO_FN_D11_ED11_NAF11, -	GPIO_FN_D12_ED12_NAF12, GPIO_FN_D13_ED13_NAF13, -	GPIO_FN_D14_ED14_NAF14, GPIO_FN_D15_ED15_NAF15, -	GPIO_FN_CS4, GPIO_FN_CS5A, GPIO_FN_CS5B, GPIO_FN_FCE1, -	GPIO_FN_CS6B, GPIO_FN_XCS2, GPIO_FN_FCE0, GPIO_FN_CS6A, -	GPIO_FN_DACK0, GPIO_FN_WAIT, GPIO_FN_DREQ0, GPIO_FN_RD_XRD, -	GPIO_FN_A27, GPIO_FN_RDWR_XWE, GPIO_FN_WE0_XWR0_FWE, -	GPIO_FN_WE1_XWR1, GPIO_FN_FRB, GPIO_FN_CKO, -	GPIO_FN_NBRSTOUT, GPIO_FN_NBRST, - -	/* 49-4 (FN) */ -	GPIO_FN_RFSPO0, GPIO_FN_PORT146_VIO_CKO2, GPIO_FN_TSTMD, -	GPIO_FN_VIO_VD, GPIO_FN_VIO_HD, -	GPIO_FN_VIO_D0, GPIO_FN_VIO_D1, GPIO_FN_VIO_D2, -	GPIO_FN_VIO_D3, GPIO_FN_VIO_D4, GPIO_FN_VIO_D5, -	GPIO_FN_VIO_D6, GPIO_FN_VIO_D7, GPIO_FN_VIO_D8, -	GPIO_FN_VIO_D9, GPIO_FN_VIO_D10, GPIO_FN_VIO_D11, -	GPIO_FN_VIO_D12, GPIO_FN_VIO_D13, GPIO_FN_VIO_D14, -	GPIO_FN_VIO_D15, GPIO_FN_VIO_CLK, GPIO_FN_VIO_FIELD, -	GPIO_FN_VIO_CKO, -	GPIO_FN_MFG3_IN1, GPIO_FN_MFG3_IN2, -	GPIO_FN_M9_SLCD_A01, GPIO_FN_MFG3_OUT1, GPIO_FN_TPU0TO0, -	GPIO_FN_M10_SLCD_CK1, GPIO_FN_MFG4_IN1, GPIO_FN_TPU0TO1, -	GPIO_FN_M11_SLCD_SO1, GPIO_FN_MFG4_IN2, GPIO_FN_TPU0TO2, -	GPIO_FN_M12_SLCD_CE1, GPIO_FN_MFG4_OUT1, GPIO_FN_TPU0TO3, -	GPIO_FN_LCDD0, GPIO_FN_PORT175_KEYOUT0, GPIO_FN_DV_D0, -	GPIO_FN_SIUCKA, GPIO_FN_MFG0_OUT2, -	GPIO_FN_LCDD1, GPIO_FN_PORT176_KEYOUT1, GPIO_FN_DV_D1, -	GPIO_FN_SIUAOLR, GPIO_FN_BBIF2_TSYNC1, -	GPIO_FN_LCDD2, GPIO_FN_PORT177_KEYOUT2, GPIO_FN_DV_D2, -	GPIO_FN_SIUAOBT, GPIO_FN_BBIF2_TSCK1, -	GPIO_FN_LCDD3, GPIO_FN_PORT178_KEYOUT3, GPIO_FN_DV_D3, -	GPIO_FN_SIUAOSLD, GPIO_FN_BBIF2_TXD1, -	GPIO_FN_LCDD4, GPIO_FN_PORT179_KEYOUT4, GPIO_FN_DV_D4, -	GPIO_FN_SIUAISPD, GPIO_FN_MFG1_OUT2, -	GPIO_FN_LCDD5, GPIO_FN_PORT180_KEYOUT5, GPIO_FN_DV_D5, -	GPIO_FN_SIUAILR, GPIO_FN_MFG2_OUT2, -	GPIO_FN_LCDD6, GPIO_FN_DV_D6, -	GPIO_FN_SIUAIBT, GPIO_FN_MFG3_OUT2, GPIO_FN_XWR2, -	GPIO_FN_LCDD7, GPIO_FN_DV_D7, -	GPIO_FN_SIUAISLD, GPIO_FN_MFG4_OUT2, GPIO_FN_XWR3, -	GPIO_FN_LCDD8, GPIO_FN_DV_D8, GPIO_FN_D16, GPIO_FN_ED16, -	GPIO_FN_LCDD9, GPIO_FN_DV_D9, GPIO_FN_D17, GPIO_FN_ED17, -	GPIO_FN_LCDD10, GPIO_FN_DV_D10, GPIO_FN_D18, GPIO_FN_ED18, -	GPIO_FN_LCDD11, GPIO_FN_DV_D11, GPIO_FN_D19, GPIO_FN_ED19, -	GPIO_FN_LCDD12, GPIO_FN_DV_D12, GPIO_FN_D20, GPIO_FN_ED20, -	GPIO_FN_LCDD13, GPIO_FN_DV_D13, GPIO_FN_D21, GPIO_FN_ED21, -	GPIO_FN_LCDD14, GPIO_FN_DV_D14, GPIO_FN_D22, GPIO_FN_ED22, -	GPIO_FN_LCDD15, GPIO_FN_DV_D15, GPIO_FN_D23, GPIO_FN_ED23, -	GPIO_FN_LCDD16, GPIO_FN_DV_HSYNC, GPIO_FN_D24, GPIO_FN_ED24, -	GPIO_FN_LCDD17, GPIO_FN_DV_VSYNC, GPIO_FN_D25, GPIO_FN_ED25, -	GPIO_FN_LCDD18, GPIO_FN_DREQ2, GPIO_FN_MSIOF0L_TSCK, -	GPIO_FN_D26, GPIO_FN_ED26, -	GPIO_FN_LCDD19, GPIO_FN_MSIOF0L_TSYNC, -	GPIO_FN_D27, GPIO_FN_ED27, -	GPIO_FN_LCDD20, GPIO_FN_TS_SPSYNC1, GPIO_FN_MSIOF0L_MCK0, -	GPIO_FN_D28, GPIO_FN_ED28, -	GPIO_FN_LCDD21, GPIO_FN_TS_SDAT1, GPIO_FN_MSIOF0L_MCK1, -	GPIO_FN_D29, GPIO_FN_ED29, -	GPIO_FN_LCDD22, GPIO_FN_TS_SDEN1, GPIO_FN_MSIOF0L_SS1, -	GPIO_FN_D30, GPIO_FN_ED30, -	GPIO_FN_LCDD23, GPIO_FN_TS_SCK1, GPIO_FN_MSIOF0L_SS2, -	GPIO_FN_D31, GPIO_FN_ED31, -	GPIO_FN_LCDDCK, GPIO_FN_LCDWR, GPIO_FN_DV_CKO, GPIO_FN_SIUAOSPD, -	GPIO_FN_LCDRD, GPIO_FN_DACK2, GPIO_FN_MSIOF0L_RSYNC, - - -	/* 49-5 (FN) */ -	GPIO_FN_LCDHSYN, GPIO_FN_LCDCS, GPIO_FN_LCDCS2, GPIO_FN_DACK3, -	GPIO_FN_LCDDISP, GPIO_FN_LCDRS, GPIO_FN_DREQ3, GPIO_FN_MSIOF0L_RSCK, -	GPIO_FN_LCDCSYN, GPIO_FN_LCDCSYN2, GPIO_FN_DV_CKI, -	GPIO_FN_LCDLCLK, GPIO_FN_DREQ1, GPIO_FN_MSIOF0L_RXD, -	GPIO_FN_LCDDON, GPIO_FN_LCDDON2, GPIO_FN_DACK1, GPIO_FN_MSIOF0L_TXD, -	GPIO_FN_VIO_DR0, GPIO_FN_VIO_DR1, GPIO_FN_VIO_DR2, GPIO_FN_VIO_DR3, -	GPIO_FN_VIO_DR4, GPIO_FN_VIO_DR5, GPIO_FN_VIO_DR6, GPIO_FN_VIO_DR7, -	GPIO_FN_VIO_VDR, GPIO_FN_VIO_HDR, -	GPIO_FN_VIO_CLKR, GPIO_FN_VIO_CKOR, -	GPIO_FN_SCIFA1_TXD, GPIO_FN_GPS_PGFA0, -	GPIO_FN_SCIFA1_SCK, GPIO_FN_GPS_PGFA1, -	GPIO_FN_SCIFA1_RTS, GPIO_FN_GPS_EPPSINMON, -	GPIO_FN_SCIFA1_RXD, GPIO_FN_SCIFA1_CTS, -	GPIO_FN_MSIOF1_TXD, GPIO_FN_SCIFA1_TXD2, GPIO_FN_GPS_TXD, -	GPIO_FN_MSIOF1_TSYNC, GPIO_FN_SCIFA1_CTS2, GPIO_FN_I2C_SDA2, -	GPIO_FN_MSIOF1_TSCK, GPIO_FN_SCIFA1_SCK2, -	GPIO_FN_MSIOF1_RXD, GPIO_FN_SCIFA1_RXD2, GPIO_FN_GPS_RXD, -	GPIO_FN_MSIOF1_RSCK, GPIO_FN_SCIFA1_RTS2, -	GPIO_FN_MSIOF1_RSYNC, GPIO_FN_I2C_SCL2, -	GPIO_FN_MSIOF1_MCK0, GPIO_FN_MSIOF1_MCK1, -	GPIO_FN_MSIOF1_SS1, GPIO_FN_EDBGREQ3, -	GPIO_FN_MSIOF1_SS2, -	GPIO_FN_PORT236_IROUT, GPIO_FN_IRDA_OUT, -	GPIO_FN_IRDA_IN, GPIO_FN_IRDA_FIRSEL, -	GPIO_FN_TPU1TO0, GPIO_FN_TS_SPSYNC3, -	GPIO_FN_TPU1TO1, GPIO_FN_TS_SDAT3, -	GPIO_FN_TPU1TO2, GPIO_FN_TS_SDEN3, GPIO_FN_PORT241_MSIOF2_SS1, -	GPIO_FN_TPU1TO3, GPIO_FN_PORT242_MSIOF2_TSCK, -	GPIO_FN_M13_BSW, GPIO_FN_PORT243_MSIOF2_TSYNC, -	GPIO_FN_M14_GSW, GPIO_FN_PORT244_MSIOF2_TXD, -	GPIO_FN_PORT245_IROUT, GPIO_FN_M15_RSW, -	GPIO_FN_SOUT3, GPIO_FN_SCIFA2_TXD1, -	GPIO_FN_SIN3, GPIO_FN_SCIFA2_RXD1, -	GPIO_FN_XRTS3, GPIO_FN_SCIFA2_RTS1, GPIO_FN_PORT248_MSIOF2_SS2, -	GPIO_FN_XCTS3, GPIO_FN_SCIFA2_CTS1, GPIO_FN_PORT249_MSIOF2_RXD, -	GPIO_FN_DINT, GPIO_FN_SCIFA2_SCK1, GPIO_FN_TS_SCK3, -	GPIO_FN_SDHICLK0, GPIO_FN_TCK2, -	GPIO_FN_SDHICD0, -	GPIO_FN_SDHID0_0, GPIO_FN_TMS2, -	GPIO_FN_SDHID0_1, GPIO_FN_TDO2, -	GPIO_FN_SDHID0_2, GPIO_FN_TDI2, -	GPIO_FN_SDHID0_3, GPIO_FN_RTCK2, - -	/* 49-6 (FN) */ -	GPIO_FN_SDHICMD0, GPIO_FN_TRST2, -	GPIO_FN_SDHIWP0, GPIO_FN_EDBGREQ2, -	GPIO_FN_SDHICLK1, GPIO_FN_TCK3, -	GPIO_FN_SDHID1_0, GPIO_FN_M11_SLCD_SO2, -	GPIO_FN_TS_SPSYNC2, GPIO_FN_TMS3, -	GPIO_FN_SDHID1_1, GPIO_FN_M9_SLCD_AO2, -	GPIO_FN_TS_SDAT2, GPIO_FN_TDO3, -	GPIO_FN_SDHID1_2, GPIO_FN_M10_SLCD_CK2, -	GPIO_FN_TS_SDEN2, GPIO_FN_TDI3, -	GPIO_FN_SDHID1_3, GPIO_FN_M12_SLCD_CE2, -	GPIO_FN_TS_SCK2, GPIO_FN_RTCK3, -	GPIO_FN_SDHICMD1, GPIO_FN_TRST3, -	GPIO_FN_SDHICLK2, GPIO_FN_SCIFB_SCK, -	GPIO_FN_SDHID2_0, GPIO_FN_SCIFB_TXD, -	GPIO_FN_SDHID2_1, GPIO_FN_SCIFB_CTS, -	GPIO_FN_SDHID2_2, GPIO_FN_SCIFB_RXD, -	GPIO_FN_SDHID2_3, GPIO_FN_SCIFB_RTS, -	GPIO_FN_SDHICMD2, -	GPIO_FN_RESETOUTS, -	GPIO_FN_DIVLOCK, -}; - -#endif /* __ASM_SH7367_H__ */ diff --git a/arch/arm/mach-shmobile/include/mach/sh7372.h b/arch/arm/mach-shmobile/include/mach/sh7372.h index eb98b45c508..26cd1016fad 100644 --- a/arch/arm/mach-shmobile/include/mach/sh7372.h +++ b/arch/arm/mach-shmobile/include/mach/sh7372.h @@ -452,6 +452,10 @@ enum {  	SHDMA_SLAVE_SCIF5_RX,  	SHDMA_SLAVE_SCIF6_TX,  	SHDMA_SLAVE_SCIF6_RX, +	SHDMA_SLAVE_FLCTL0_TX, +	SHDMA_SLAVE_FLCTL0_RX, +	SHDMA_SLAVE_FLCTL1_TX, +	SHDMA_SLAVE_FLCTL1_RX,  	SHDMA_SLAVE_SDHI0_RX,  	SHDMA_SLAVE_SDHI0_TX,  	SHDMA_SLAVE_SDHI1_RX, @@ -475,8 +479,6 @@ extern struct clk sh7372_dv_clki_div2_clk;  extern struct clk sh7372_pllc2_clk;  extern struct clk sh7372_fsiack_clk;  extern struct clk sh7372_fsibck_clk; -extern struct clk sh7372_fsidiva_clk; -extern struct clk sh7372_fsidivb_clk;  extern void sh7372_intcs_suspend(void);  extern void sh7372_intcs_resume(void); diff --git a/arch/arm/mach-shmobile/include/mach/sh7377.h b/arch/arm/mach-shmobile/include/mach/sh7377.h deleted file mode 100644 index f580e227dd1..00000000000 --- a/arch/arm/mach-shmobile/include/mach/sh7377.h +++ /dev/null @@ -1,360 +0,0 @@ -#ifndef __ASM_SH7377_H__ -#define __ASM_SH7377_H__ - -/* Pin Function Controller: - * GPIO_FN_xx - GPIO used to select pin function - * GPIO_PORTxx - GPIO mapped to real I/O pin on CPU - */ -enum { -	/* 55-1 -> 55-5 (GPIO) */ -	GPIO_PORT0, GPIO_PORT1, GPIO_PORT2, GPIO_PORT3, GPIO_PORT4, -	GPIO_PORT5, GPIO_PORT6, GPIO_PORT7, GPIO_PORT8, GPIO_PORT9, - -	GPIO_PORT10, GPIO_PORT11, GPIO_PORT12, GPIO_PORT13, GPIO_PORT14, -	GPIO_PORT15, GPIO_PORT16, GPIO_PORT17, GPIO_PORT18, GPIO_PORT19, - -	GPIO_PORT20, GPIO_PORT21, GPIO_PORT22, GPIO_PORT23, GPIO_PORT24, -	GPIO_PORT25, GPIO_PORT26, GPIO_PORT27, GPIO_PORT28, GPIO_PORT29, - -	GPIO_PORT30, GPIO_PORT31, GPIO_PORT32, GPIO_PORT33, GPIO_PORT34, -	GPIO_PORT35, GPIO_PORT36, GPIO_PORT37, GPIO_PORT38, GPIO_PORT39, - -	GPIO_PORT40, GPIO_PORT41, GPIO_PORT42, GPIO_PORT43, GPIO_PORT44, -	GPIO_PORT45, GPIO_PORT46, GPIO_PORT47, GPIO_PORT48, GPIO_PORT49, - -	GPIO_PORT50, GPIO_PORT51, GPIO_PORT52, GPIO_PORT53, GPIO_PORT54, -	GPIO_PORT55, GPIO_PORT56, GPIO_PORT57, GPIO_PORT58, GPIO_PORT59, - -	GPIO_PORT60, GPIO_PORT61, GPIO_PORT62, GPIO_PORT63, GPIO_PORT64, -	GPIO_PORT65, GPIO_PORT66, GPIO_PORT67, GPIO_PORT68, GPIO_PORT69, - -	GPIO_PORT70, GPIO_PORT71, GPIO_PORT72, GPIO_PORT73, GPIO_PORT74, -	GPIO_PORT75, GPIO_PORT76, GPIO_PORT77, GPIO_PORT78, GPIO_PORT79, - -	GPIO_PORT80, GPIO_PORT81, GPIO_PORT82, GPIO_PORT83, GPIO_PORT84, -	GPIO_PORT85, GPIO_PORT86, GPIO_PORT87, GPIO_PORT88, GPIO_PORT89, - -	GPIO_PORT90, GPIO_PORT91, GPIO_PORT92, GPIO_PORT93, GPIO_PORT94, -	GPIO_PORT95, GPIO_PORT96, GPIO_PORT97, GPIO_PORT98, GPIO_PORT99, - -	GPIO_PORT100, GPIO_PORT101, GPIO_PORT102, GPIO_PORT103, GPIO_PORT104, -	GPIO_PORT105, GPIO_PORT106, GPIO_PORT107, GPIO_PORT108, GPIO_PORT109, - -	GPIO_PORT110, GPIO_PORT111, GPIO_PORT112, GPIO_PORT113, GPIO_PORT114, -	GPIO_PORT115, GPIO_PORT116, GPIO_PORT117, GPIO_PORT118, - -	GPIO_PORT128, GPIO_PORT129, - -	GPIO_PORT130, GPIO_PORT131, GPIO_PORT132, GPIO_PORT133, GPIO_PORT134, -	GPIO_PORT135, GPIO_PORT136, GPIO_PORT137, GPIO_PORT138, GPIO_PORT139, - -	GPIO_PORT140, GPIO_PORT141, GPIO_PORT142, GPIO_PORT143, GPIO_PORT144, -	GPIO_PORT145, GPIO_PORT146, GPIO_PORT147, GPIO_PORT148, GPIO_PORT149, - -	GPIO_PORT150, GPIO_PORT151, GPIO_PORT152, GPIO_PORT153, GPIO_PORT154, -	GPIO_PORT155, GPIO_PORT156, GPIO_PORT157, GPIO_PORT158, GPIO_PORT159, - -	GPIO_PORT160, GPIO_PORT161, GPIO_PORT162, GPIO_PORT163, GPIO_PORT164, - -	GPIO_PORT192, GPIO_PORT193, GPIO_PORT194, -	GPIO_PORT195, GPIO_PORT196, GPIO_PORT197, GPIO_PORT198, GPIO_PORT199, - -	GPIO_PORT200, GPIO_PORT201, GPIO_PORT202, GPIO_PORT203, GPIO_PORT204, -	GPIO_PORT205, GPIO_PORT206, GPIO_PORT207, GPIO_PORT208, GPIO_PORT209, - -	GPIO_PORT210, GPIO_PORT211, GPIO_PORT212, GPIO_PORT213, GPIO_PORT214, -	GPIO_PORT215, GPIO_PORT216, GPIO_PORT217, GPIO_PORT218, GPIO_PORT219, - -	GPIO_PORT220, GPIO_PORT221, GPIO_PORT222, GPIO_PORT223, GPIO_PORT224, -	GPIO_PORT225, GPIO_PORT226, GPIO_PORT227, GPIO_PORT228, GPIO_PORT229, - -	GPIO_PORT230, GPIO_PORT231, GPIO_PORT232, GPIO_PORT233, GPIO_PORT234, -	GPIO_PORT235, GPIO_PORT236, GPIO_PORT237, GPIO_PORT238, GPIO_PORT239, - -	GPIO_PORT240, GPIO_PORT241, GPIO_PORT242, GPIO_PORT243, GPIO_PORT244, -	GPIO_PORT245, GPIO_PORT246, GPIO_PORT247, GPIO_PORT248, GPIO_PORT249, - -	GPIO_PORT250, GPIO_PORT251, GPIO_PORT252, GPIO_PORT253, GPIO_PORT254, -	GPIO_PORT255, GPIO_PORT256, GPIO_PORT257, GPIO_PORT258, GPIO_PORT259, - -	GPIO_PORT260, GPIO_PORT261, GPIO_PORT262, GPIO_PORT263, GPIO_PORT264, - -	/* Special Pull-up / Pull-down Functions */ -	GPIO_FN_PORT66_KEYIN0_PU, GPIO_FN_PORT67_KEYIN1_PU, -	GPIO_FN_PORT68_KEYIN2_PU, GPIO_FN_PORT69_KEYIN3_PU, -	GPIO_FN_PORT70_KEYIN4_PU, GPIO_FN_PORT71_KEYIN5_PU, -	GPIO_FN_PORT72_KEYIN6_PU, - -	/* 55-1 (FN) */ -	GPIO_FN_VBUS_0, -	GPIO_FN_CPORT0, -	GPIO_FN_CPORT1, -	GPIO_FN_CPORT2, -	GPIO_FN_CPORT3, -	GPIO_FN_CPORT4, -	GPIO_FN_CPORT5, -	GPIO_FN_CPORT6, -	GPIO_FN_CPORT7, -	GPIO_FN_CPORT8, -	GPIO_FN_CPORT9, -	GPIO_FN_CPORT10, -	GPIO_FN_CPORT11, GPIO_FN_SIN2, -	GPIO_FN_CPORT12, GPIO_FN_XCTS2, -	GPIO_FN_CPORT13, GPIO_FN_RFSPO4, -	GPIO_FN_CPORT14, GPIO_FN_RFSPO5, -	GPIO_FN_CPORT15, GPIO_FN_SCIFA0_SCK, GPIO_FN_GPS_AGC2, -	GPIO_FN_CPORT16, GPIO_FN_SCIFA0_TXD, GPIO_FN_GPS_AGC3, -	GPIO_FN_CPORT17_IC_OE, GPIO_FN_SOUT2, -	GPIO_FN_CPORT18, GPIO_FN_XRTS2, GPIO_FN_PORT19_VIO_CKO2, -	GPIO_FN_CPORT19_MPORT1, -	GPIO_FN_CPORT20, GPIO_FN_RFSPO6, -	GPIO_FN_CPORT21, GPIO_FN_STATUS0, -	GPIO_FN_CPORT22, GPIO_FN_STATUS1, -	GPIO_FN_CPORT23, GPIO_FN_STATUS2, GPIO_FN_RFSPO7, -	GPIO_FN_B_SYNLD1, -	GPIO_FN_B_SYNLD2, GPIO_FN_SYSENMSK, -	GPIO_FN_XMAINPS, -	GPIO_FN_XDIVPS, -	GPIO_FN_XIDRST, -	GPIO_FN_IDCLK, GPIO_FN_IC_DP, -	GPIO_FN_IDIO, GPIO_FN_IC_DM, -	GPIO_FN_SOUT1, GPIO_FN_SCIFA4_TXD, GPIO_FN_M02_BERDAT, -	GPIO_FN_SIN1, GPIO_FN_SCIFA4_RXD, GPIO_FN_XWUP, -	GPIO_FN_XRTS1, GPIO_FN_SCIFA4_RTS, GPIO_FN_M03_BERCLK, -	GPIO_FN_XCTS1, GPIO_FN_SCIFA4_CTS, -	GPIO_FN_PCMCLKO, -	GPIO_FN_SYNC8KO, - -	/* 55-2 (FN) */ -	GPIO_FN_DNPCM_A, -	GPIO_FN_UPPCM_A, -	GPIO_FN_VACK, -	GPIO_FN_XTALB1L, -	GPIO_FN_GPS_AGC1, GPIO_FN_SCIFA0_RTS, -	GPIO_FN_GPS_AGC4, GPIO_FN_SCIFA0_RXD, -	GPIO_FN_GPS_PWRDOWN, GPIO_FN_SCIFA0_CTS, -	GPIO_FN_GPS_IM, -	GPIO_FN_GPS_IS, -	GPIO_FN_GPS_QM, -	GPIO_FN_GPS_QS, -	GPIO_FN_FMSOCK, GPIO_FN_PORT49_IRDA_OUT, GPIO_FN_PORT49_IROUT, -	GPIO_FN_FMSOOLR, GPIO_FN_BBIF2_TSYNC2, GPIO_FN_TPU2TO2, GPIO_FN_IPORT3, -	GPIO_FN_FMSIOLR, -	GPIO_FN_FMSOOBT, GPIO_FN_BBIF2_TSCK2, GPIO_FN_TPU2TO3, GPIO_FN_OPORT1, -	GPIO_FN_FMSIOBT, -	GPIO_FN_FMSOSLD, GPIO_FN_BBIF2_TXD2, GPIO_FN_OPORT2, -	GPIO_FN_FMSOILR, GPIO_FN_PORT53_IRDA_IN, GPIO_FN_TPU3TO3, -	GPIO_FN_OPORT3, GPIO_FN_FMSIILR, -	GPIO_FN_FMSOIBT, GPIO_FN_PORT54_IRDA_FIRSEL, GPIO_FN_TPU3TO2, -	GPIO_FN_FMSIIBT, -	GPIO_FN_FMSISLD, GPIO_FN_MFG0_OUT1, GPIO_FN_TPU0TO0, -	GPIO_FN_A0_EA0, GPIO_FN_BS, -	GPIO_FN_A12_EA12, GPIO_FN_PORT58_VIO_CKOR, GPIO_FN_TPU4TO2, -	GPIO_FN_A13_EA13, GPIO_FN_PORT59_IROUT, GPIO_FN_MFG0_OUT2, -	GPIO_FN_TPU0TO1, -	GPIO_FN_A14_EA14, GPIO_FN_PORT60_KEYOUT5, -	GPIO_FN_A15_EA15, GPIO_FN_PORT61_KEYOUT4, -	GPIO_FN_A16_EA16, GPIO_FN_PORT62_KEYOUT3, GPIO_FN_MSIOF0_SS1, -	GPIO_FN_A17_EA17, GPIO_FN_PORT63_KEYOUT2, GPIO_FN_MSIOF0_TSYNC, -	GPIO_FN_A18_EA18, GPIO_FN_PORT64_KEYOUT1, GPIO_FN_MSIOF0_TSCK, -	GPIO_FN_A19_EA19, GPIO_FN_PORT65_KEYOUT0, GPIO_FN_MSIOF0_TXD, -	GPIO_FN_A20_EA20, GPIO_FN_PORT66_KEYIN0, GPIO_FN_MSIOF0_RSCK, -	GPIO_FN_A21_EA21, GPIO_FN_PORT67_KEYIN1, GPIO_FN_MSIOF0_RSYNC, -	GPIO_FN_A22_EA22, GPIO_FN_PORT68_KEYIN2, GPIO_FN_MSIOF0_MCK0, -	GPIO_FN_A23_EA23, GPIO_FN_PORT69_KEYIN3, GPIO_FN_MSIOF0_MCK1, -	GPIO_FN_A24_EA24, GPIO_FN_PORT70_KEYIN4, GPIO_FN_MSIOF0_RXD, -	GPIO_FN_A25_EA25, GPIO_FN_PORT71_KEYIN5, GPIO_FN_MSIOF0_SS2, -	GPIO_FN_A26, GPIO_FN_PORT72_KEYIN6, -	GPIO_FN_D0_ED0_NAF0, -	GPIO_FN_D1_ED1_NAF1, -	GPIO_FN_D2_ED2_NAF2, -	GPIO_FN_D3_ED3_NAF3, -	GPIO_FN_D4_ED4_NAF4, -	GPIO_FN_D5_ED5_NAF5, -	GPIO_FN_D6_ED6_NAF6, -	GPIO_FN_D7_ED7_NAF7, -	GPIO_FN_D8_ED8_NAF8, -	GPIO_FN_D9_ED9_NAF9, -	GPIO_FN_D10_ED10_NAF10, -	GPIO_FN_D11_ED11_NAF11, -	GPIO_FN_D12_ED12_NAF12, -	GPIO_FN_D13_ED13_NAF13, -	GPIO_FN_D14_ED14_NAF14, -	GPIO_FN_D15_ED15_NAF15, -	GPIO_FN_CS4, -	GPIO_FN_CS5A, GPIO_FN_FMSICK, -	GPIO_FN_CS5B, GPIO_FN_FCE1, - -	/* 55-3 (FN) */ -	GPIO_FN_CS6B, GPIO_FN_XCS2, GPIO_FN_CS6A, GPIO_FN_DACK0, -	GPIO_FN_FCE0, -	GPIO_FN_WAIT, GPIO_FN_DREQ0, -	GPIO_FN_RD_XRD, -	GPIO_FN_WE0_XWR0_FWE, -	GPIO_FN_WE1_XWR1, -	GPIO_FN_FRB, -	GPIO_FN_CKO, -	GPIO_FN_NBRSTOUT, -	GPIO_FN_NBRST, -	GPIO_FN_GPS_EPPSIN, -	GPIO_FN_LATCHPULSE, -	GPIO_FN_LTESIGNAL, -	GPIO_FN_LEGACYSTATE, -	GPIO_FN_TCKON, -	GPIO_FN_VIO_VD, GPIO_FN_PORT128_KEYOUT0, GPIO_FN_IPORT0, -	GPIO_FN_VIO_HD, GPIO_FN_PORT129_KEYOUT1, GPIO_FN_IPORT1, -	GPIO_FN_VIO_D0, GPIO_FN_PORT130_KEYOUT2, GPIO_FN_PORT130_MSIOF2_RXD, -	GPIO_FN_VIO_D1, GPIO_FN_PORT131_KEYOUT3, GPIO_FN_PORT131_MSIOF2_SS1, -	GPIO_FN_VIO_D2, GPIO_FN_PORT132_KEYOUT4, GPIO_FN_PORT132_MSIOF2_SS2, -	GPIO_FN_VIO_D3, GPIO_FN_PORT133_KEYOUT5, GPIO_FN_PORT133_MSIOF2_TSYNC, -	GPIO_FN_VIO_D4, GPIO_FN_PORT134_KEYIN0, GPIO_FN_PORT134_MSIOF2_TXD, -	GPIO_FN_VIO_D5, GPIO_FN_PORT135_KEYIN1, GPIO_FN_PORT135_MSIOF2_TSCK, -	GPIO_FN_VIO_D6, GPIO_FN_PORT136_KEYIN2, -	GPIO_FN_VIO_D7, GPIO_FN_PORT137_KEYIN3, -	GPIO_FN_VIO_D8, GPIO_FN_M9_SLCD_A01, GPIO_FN_PORT138_FSIAOMC, -	GPIO_FN_VIO_D9, GPIO_FN_M10_SLCD_CK1, GPIO_FN_PORT139_FSIAOLR, -	GPIO_FN_VIO_D10, GPIO_FN_M11_SLCD_SO1, GPIO_FN_TPU0TO2, -	GPIO_FN_PORT140_FSIAOBT, -	GPIO_FN_VIO_D11, GPIO_FN_M12_SLCD_CE1, GPIO_FN_TPU0TO3, -	GPIO_FN_PORT141_FSIAOSLD, -	GPIO_FN_VIO_D12, GPIO_FN_M13_BSW, GPIO_FN_PORT142_FSIACK, -	GPIO_FN_VIO_D13, GPIO_FN_M14_GSW, GPIO_FN_PORT143_FSIAILR, -	GPIO_FN_VIO_D14, GPIO_FN_M15_RSW, GPIO_FN_PORT144_FSIAIBT, -	GPIO_FN_VIO_D15, GPIO_FN_TPU1TO3, GPIO_FN_PORT145_FSIAISLD, -	GPIO_FN_VIO_CLK, GPIO_FN_PORT146_KEYIN4, GPIO_FN_IPORT2, -	GPIO_FN_VIO_FIELD, GPIO_FN_PORT147_KEYIN5, -	GPIO_FN_VIO_CKO, GPIO_FN_PORT148_KEYIN6, -	GPIO_FN_A27, GPIO_FN_RDWR_XWE, GPIO_FN_MFG0_IN1, -	GPIO_FN_MFG0_IN2, -	GPIO_FN_TS_SPSYNC3, GPIO_FN_MSIOF2_RSCK, -	GPIO_FN_TS_SDAT3, GPIO_FN_MSIOF2_RSYNC, -	GPIO_FN_TPU1TO2, GPIO_FN_TS_SDEN3, GPIO_FN_PORT153_MSIOF2_SS1, -	GPIO_FN_SOUT3, GPIO_FN_SCIFA2_TXD1, GPIO_FN_MSIOF2_MCK0, -	GPIO_FN_SIN3, GPIO_FN_SCIFA2_RXD1, GPIO_FN_MSIOF2_MCK1, -	GPIO_FN_XRTS3, GPIO_FN_SCIFA2_RTS1, GPIO_FN_PORT156_MSIOF2_SS2, -	GPIO_FN_XCTS3, GPIO_FN_SCIFA2_CTS1, GPIO_FN_PORT157_MSIOF2_RXD, - -	/* 55-4 (FN) */ -	GPIO_FN_DINT, GPIO_FN_SCIFA2_SCK1, GPIO_FN_TS_SCK3, -	GPIO_FN_PORT159_SCIFB_SCK, GPIO_FN_PORT159_SCIFA5_SCK, GPIO_FN_NMI, -	GPIO_FN_PORT160_SCIFB_TXD, GPIO_FN_PORT160_SCIFA5_TXD, GPIO_FN_SOUT0, -	GPIO_FN_PORT161_SCIFB_CTS, GPIO_FN_PORT161_SCIFA5_CTS, GPIO_FN_XCTS0, -	GPIO_FN_MFG3_IN2, -	GPIO_FN_PORT162_SCIFB_RXD, GPIO_FN_PORT162_SCIFA5_RXD, GPIO_FN_SIN0, -	GPIO_FN_MFG3_IN1, -	GPIO_FN_PORT163_SCIFB_RTS, GPIO_FN_PORT163_SCIFA5_RTS, GPIO_FN_XRTS0, -	GPIO_FN_MFG3_OUT1, -	GPIO_FN_TPU3TO0, -	GPIO_FN_LCDD0, GPIO_FN_PORT192_KEYOUT0, GPIO_FN_EXT_CKI, -	GPIO_FN_LCDD1, GPIO_FN_PORT193_KEYOUT1, GPIO_FN_PORT193_SCIFA5_CTS, -	GPIO_FN_BBIF2_TSYNC1, -	GPIO_FN_LCDD2, GPIO_FN_PORT194_KEYOUT2, GPIO_FN_PORT194_SCIFA5_RTS, -	GPIO_FN_BBIF2_TSCK1, -	GPIO_FN_LCDD3, GPIO_FN_PORT195_KEYOUT3, GPIO_FN_PORT195_SCIFA5_RXD, -	GPIO_FN_BBIF2_TXD1, -	GPIO_FN_LCDD4, GPIO_FN_PORT196_KEYOUT4, GPIO_FN_PORT196_SCIFA5_TXD, -	GPIO_FN_LCDD5, GPIO_FN_PORT197_KEYOUT5, GPIO_FN_PORT197_SCIFA5_SCK, -	GPIO_FN_MFG2_OUT2, GPIO_FN_TPU2TO1, -	GPIO_FN_LCDD6, GPIO_FN_XWR2, -	GPIO_FN_LCDD7, GPIO_FN_TPU4TO1, GPIO_FN_MFG4_OUT2, GPIO_FN_XWR3, -	GPIO_FN_LCDD8, GPIO_FN_PORT200_KEYIN0, GPIO_FN_VIO_DR0, GPIO_FN_D16, -	GPIO_FN_ED16, -	GPIO_FN_LCDD9, GPIO_FN_PORT201_KEYIN1, GPIO_FN_VIO_DR1, GPIO_FN_D17, -	GPIO_FN_ED17, -	GPIO_FN_LCDD10, GPIO_FN_PORT202_KEYIN2, GPIO_FN_VIO_DR2, GPIO_FN_D18, -	GPIO_FN_ED18, -	GPIO_FN_LCDD11, GPIO_FN_PORT203_KEYIN3, GPIO_FN_VIO_DR3, GPIO_FN_D19, -	GPIO_FN_ED19, -	GPIO_FN_LCDD12, GPIO_FN_PORT204_KEYIN4, GPIO_FN_VIO_DR4, GPIO_FN_D20, -	GPIO_FN_ED20, -	GPIO_FN_LCDD13, GPIO_FN_PORT205_KEYIN5, GPIO_FN_VIO_DR5, GPIO_FN_D21, -	GPIO_FN_ED21, -	GPIO_FN_LCDD14, GPIO_FN_PORT206_KEYIN6, GPIO_FN_VIO_DR6, GPIO_FN_D22, -	GPIO_FN_ED22, -	GPIO_FN_LCDD15, GPIO_FN_PORT207_MSIOF0L_SS1, GPIO_FN_PORT207_KEYOUT0, -	GPIO_FN_VIO_DR7, -	GPIO_FN_D23, GPIO_FN_ED23, -	GPIO_FN_LCDD16, GPIO_FN_PORT208_MSIOF0L_SS2, GPIO_FN_PORT208_KEYOUT1, -	GPIO_FN_VIO_VDR, -	GPIO_FN_D24, GPIO_FN_ED24, -	GPIO_FN_LCDD17, GPIO_FN_PORT209_KEYOUT2, GPIO_FN_VIO_HDR, GPIO_FN_D25, -	GPIO_FN_ED25, -	GPIO_FN_LCDD18, GPIO_FN_DREQ2, GPIO_FN_PORT210_MSIOF0L_SS1, GPIO_FN_D26, -	GPIO_FN_ED26, -	GPIO_FN_LCDD19, GPIO_FN_PORT211_MSIOF0L_SS2, GPIO_FN_D27, GPIO_FN_ED27, -	GPIO_FN_LCDD20, GPIO_FN_TS_SPSYNC1, GPIO_FN_MSIOF0L_MCK0, GPIO_FN_D28, -	GPIO_FN_ED28, -	GPIO_FN_LCDD21, GPIO_FN_TS_SDAT1, GPIO_FN_MSIOF0L_MCK1, GPIO_FN_D29, -	GPIO_FN_ED29, -	GPIO_FN_LCDD22, GPIO_FN_TS_SDEN1, GPIO_FN_MSIOF0L_RSCK, GPIO_FN_D30, -	GPIO_FN_ED30, -	GPIO_FN_LCDD23, GPIO_FN_TS_SCK1, GPIO_FN_MSIOF0L_RSYNC, GPIO_FN_D31, -	GPIO_FN_ED31, -	GPIO_FN_LCDDCK, GPIO_FN_LCDWR, GPIO_FN_PORT216_KEYOUT3, -	GPIO_FN_VIO_CLKR, -	GPIO_FN_LCDRD, GPIO_FN_DACK2, GPIO_FN_MSIOF0L_TSYNC, -	GPIO_FN_LCDHSYN, GPIO_FN_LCDCS, GPIO_FN_LCDCS2, GPIO_FN_DACK3, -	GPIO_FN_PORT218_VIO_CKOR, GPIO_FN_PORT218_KEYOUT4, -	GPIO_FN_LCDDISP, GPIO_FN_LCDRS, GPIO_FN_DREQ3, GPIO_FN_MSIOF0L_TSCK, -	GPIO_FN_LCDVSYN, GPIO_FN_LCDVSYN2, GPIO_FN_PORT220_KEYOUT5, -	GPIO_FN_LCDLCLK, GPIO_FN_DREQ1, GPIO_FN_PWEN, GPIO_FN_MSIOF0L_RXD, -	GPIO_FN_LCDDON, GPIO_FN_LCDDON2, GPIO_FN_DACK1, GPIO_FN_OVCN, -	GPIO_FN_MSIOF0L_TXD, -	GPIO_FN_SCIFA1_TXD, GPIO_FN_OVCN2, -	GPIO_FN_EXTLP, GPIO_FN_SCIFA1_SCK, GPIO_FN_USBTERM, -	GPIO_FN_PORT226_VIO_CKO2, -	GPIO_FN_SCIFA1_RTS, GPIO_FN_IDIN, -	GPIO_FN_SCIFA1_RXD, -	GPIO_FN_SCIFA1_CTS, GPIO_FN_MFG1_IN1, -	GPIO_FN_MSIOF1_TXD, GPIO_FN_SCIFA2_TXD2, GPIO_FN_PORT230_FSIAOMC, -	GPIO_FN_MSIOF1_TSYNC, GPIO_FN_SCIFA2_CTS2, GPIO_FN_PORT231_FSIAOLR, -	GPIO_FN_MSIOF1_TSCK, GPIO_FN_SCIFA2_SCK2, GPIO_FN_PORT232_FSIAOBT, -	GPIO_FN_MSIOF1_RXD, GPIO_FN_SCIFA2_RXD2, GPIO_FN_GPS_VCOTRIG, -	GPIO_FN_PORT233_FSIACK, -	GPIO_FN_MSIOF1_RSCK, GPIO_FN_SCIFA2_RTS2, GPIO_FN_PORT234_FSIAOSLD, -	GPIO_FN_MSIOF1_RSYNC, GPIO_FN_OPORT0, GPIO_FN_MFG1_IN2, -	GPIO_FN_PORT235_FSIAILR, -	GPIO_FN_MSIOF1_MCK0, GPIO_FN_I2C_SDA2, GPIO_FN_PORT236_FSIAIBT, -	GPIO_FN_MSIOF1_MCK1, GPIO_FN_I2C_SCL2, GPIO_FN_PORT237_FSIAISLD, -	GPIO_FN_MSIOF1_SS1, GPIO_FN_EDBGREQ3, - -	/* 55-5 (FN) */ -	GPIO_FN_MSIOF1_SS2, -	GPIO_FN_SCIFA6_TXD, -	GPIO_FN_PORT241_IRDA_OUT, GPIO_FN_PORT241_IROUT, GPIO_FN_MFG4_OUT1, -	GPIO_FN_TPU4TO0, -	GPIO_FN_PORT242_IRDA_IN, GPIO_FN_MFG4_IN2, -	GPIO_FN_PORT243_IRDA_FIRSEL, GPIO_FN_PORT243_VIO_CKO2, -	GPIO_FN_PORT244_SCIFA5_CTS, GPIO_FN_MFG2_IN1, GPIO_FN_PORT244_SCIFB_CTS, -	GPIO_FN_PORT244_MSIOF2_RXD, -	GPIO_FN_PORT245_SCIFA5_RTS, GPIO_FN_MFG2_IN2, GPIO_FN_PORT245_SCIFB_RTS, -	GPIO_FN_PORT245_MSIOF2_TXD, -	GPIO_FN_PORT246_SCIFA5_RXD, GPIO_FN_MFG1_OUT1, -	GPIO_FN_PORT246_SCIFB_RXD, GPIO_FN_TPU1TO0, -	GPIO_FN_PORT247_SCIFA5_TXD, GPIO_FN_MFG3_OUT2, -	GPIO_FN_PORT247_SCIFB_TXD, GPIO_FN_TPU3TO1, -	GPIO_FN_PORT248_SCIFA5_SCK, GPIO_FN_MFG2_OUT1, -	GPIO_FN_PORT248_SCIFB_SCK, GPIO_FN_TPU2TO0, -	GPIO_FN_PORT248_MSIOF2_TSCK, -	GPIO_FN_PORT249_IROUT, GPIO_FN_MFG4_IN1, GPIO_FN_PORT249_MSIOF2_TSYNC, -	GPIO_FN_SDHICLK0, GPIO_FN_TCK2_SWCLK_MC0, -	GPIO_FN_SDHICD0, -	GPIO_FN_SDHID0_0, GPIO_FN_TMS2_SWDIO_MC0, -	GPIO_FN_SDHID0_1, GPIO_FN_TDO2_SWO0_MC0, -	GPIO_FN_SDHID0_2, GPIO_FN_TDI2, -	GPIO_FN_SDHID0_3, GPIO_FN_RTCK2_SWO1_MC0, -	GPIO_FN_SDHICMD0, GPIO_FN_TRST2, -	GPIO_FN_SDHIWP0, GPIO_FN_EDBGREQ2, -	GPIO_FN_SDHICLK1, GPIO_FN_TCK3_SWCLK_MC1, -	GPIO_FN_SDHID1_0, GPIO_FN_M11_SLCD_SO2, GPIO_FN_TS_SPSYNC2, -	GPIO_FN_TMS3_SWDIO_MC1, -	GPIO_FN_SDHID1_1, GPIO_FN_M9_SLCD_A02, GPIO_FN_TS_SDAT2, -	GPIO_FN_TDO3_SWO0_MC1, -	GPIO_FN_SDHID1_2, GPIO_FN_M10_SLCD_CK2, GPIO_FN_TS_SDEN2, GPIO_FN_TDI3, -	GPIO_FN_SDHID1_3, GPIO_FN_M12_SLCD_CE2, GPIO_FN_TS_SCK2, -	GPIO_FN_RTCK3_SWO1_MC1, -	GPIO_FN_SDHICMD1, GPIO_FN_TRST3, -	GPIO_FN_RESETOUTS, -}; - -#endif /* __ASM_SH7377_H__ */ diff --git a/arch/arm/mach-shmobile/intc-sh7367.c b/arch/arm/mach-shmobile/intc-sh7367.c deleted file mode 100644 index 5bf776495b7..00000000000 --- a/arch/arm/mach-shmobile/intc-sh7367.c +++ /dev/null @@ -1,413 +0,0 @@ -/* - * sh7367 processor support - INTC hardware block - * - * Copyright (C) 2010  Magnus Damm - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/io.h> -#include <linux/sh_intc.h> -#include <mach/intc.h> -#include <mach/irqs.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> - -enum { -	UNUSED_INTCA = 0, -	ENABLED, -	DISABLED, - -	/* interrupt sources INTCA */ -	DIRC, -	CRYPT1_ERR, CRYPT2_STD, -	IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1, -	ARM11_IRQPMU, ARM11_COMMTX, ARM11_COMMRX, -	ETM11_ACQCMP, ETM11_FULL, -	MFI_MFIM, MFI_MFIS, -	BBIF1, BBIF2, -	USBDMAC_USHDMI, -	USBHS_USHI0, USBHS_USHI1, -	CMT1_CMT10, CMT1_CMT11, CMT1_CMT12, CMT1_CMT13, CMT2, CMT3, -	KEYSC_KEY, -	SCIFA0, SCIFA1, SCIFA2, SCIFA3, -	MSIOF2, MSIOF1, -	SCIFA4, SCIFA5, SCIFB, -	FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, -	SDHI0, -	SDHI1, -	MSU_MSU, MSU_MSU2, -	IREM, -	SIU, -	SPU, -	IRDA, -	TPU0, TPU1, TPU2, TPU3, TPU4, -	LCRC, -	PINT1, PINT2, -	TTI20, -	MISTY, -	DDM, -	SDHI2, -	RWDT0, RWDT1, -	DMAC_1_DEI0, DMAC_1_DEI1, DMAC_1_DEI2, DMAC_1_DEI3, -	DMAC_2_DEI4, DMAC_2_DEI5, DMAC_2_DADERR, -	DMAC2_1_DEI0, DMAC2_1_DEI1, DMAC2_1_DEI2, DMAC2_1_DEI3, -	DMAC2_2_DEI4, DMAC2_2_DEI5, DMAC2_2_DADERR, -	DMAC3_1_DEI0, DMAC3_1_DEI1, DMAC3_1_DEI2, DMAC3_1_DEI3, -	DMAC3_2_DEI4, DMAC3_2_DEI5, DMAC3_2_DADERR, - -	/* interrupt groups INTCA */ -	DMAC_1, DMAC_2,	DMAC2_1, DMAC2_2, DMAC3_1, DMAC3_2, -	ETM11, ARM11, USBHS, FLCTL, IIC1 -}; - -static struct intc_vect intca_vectors[] __initdata = { -	INTC_VECT(DIRC, 0x0560), -	INTC_VECT(CRYPT1_ERR, 0x05e0), -	INTC_VECT(CRYPT2_STD, 0x0700), -	INTC_VECT(IIC1_ALI1, 0x0780), INTC_VECT(IIC1_TACKI1, 0x07a0), -	INTC_VECT(IIC1_WAITI1, 0x07c0), INTC_VECT(IIC1_DTEI1, 0x07e0), -	INTC_VECT(ARM11_IRQPMU, 0x0800), INTC_VECT(ARM11_COMMTX, 0x0840), -	INTC_VECT(ARM11_COMMRX, 0x0860), -	INTC_VECT(ETM11_ACQCMP, 0x0880), INTC_VECT(ETM11_FULL, 0x08a0), -	INTC_VECT(MFI_MFIM, 0x0900), INTC_VECT(MFI_MFIS, 0x0920), -	INTC_VECT(BBIF1, 0x0940), INTC_VECT(BBIF2, 0x0960), -	INTC_VECT(USBDMAC_USHDMI, 0x0a00), -	INTC_VECT(USBHS_USHI0, 0x0a20), INTC_VECT(USBHS_USHI1, 0x0a40), -	INTC_VECT(CMT1_CMT10, 0x0b00), INTC_VECT(CMT1_CMT11, 0x0b20), -	INTC_VECT(CMT1_CMT12, 0x0b40), INTC_VECT(CMT1_CMT13, 0x0b60), -	INTC_VECT(CMT2, 0x0b80), INTC_VECT(CMT3, 0x0ba0), -	INTC_VECT(KEYSC_KEY, 0x0be0), -	INTC_VECT(SCIFA0, 0x0c00), INTC_VECT(SCIFA1, 0x0c20), -	INTC_VECT(SCIFA2, 0x0c40), INTC_VECT(SCIFA3, 0x0c60), -	INTC_VECT(MSIOF2, 0x0c80), INTC_VECT(MSIOF1, 0x0d00), -	INTC_VECT(SCIFA4, 0x0d20), INTC_VECT(SCIFA5, 0x0d40), -	INTC_VECT(SCIFB, 0x0d60), -	INTC_VECT(FLCTL_FLSTEI, 0x0d80), INTC_VECT(FLCTL_FLTENDI, 0x0da0), -	INTC_VECT(FLCTL_FLTREQ0I, 0x0dc0), INTC_VECT(FLCTL_FLTREQ1I, 0x0de0), -	INTC_VECT(SDHI0, 0x0e00), INTC_VECT(SDHI0, 0x0e20), -	INTC_VECT(SDHI0, 0x0e40), INTC_VECT(SDHI0, 0x0e60), -	INTC_VECT(SDHI1, 0x0e80), INTC_VECT(SDHI1, 0x0ea0), -	INTC_VECT(SDHI1, 0x0ec0), INTC_VECT(SDHI1, 0x0ee0), -	INTC_VECT(MSU_MSU, 0x0f20), INTC_VECT(MSU_MSU2, 0x0f40), -	INTC_VECT(IREM, 0x0f60), -	INTC_VECT(SIU, 0x0fa0), -	INTC_VECT(SPU, 0x0fc0), -	INTC_VECT(IRDA, 0x0480), -	INTC_VECT(TPU0, 0x04a0), INTC_VECT(TPU1, 0x04c0), -	INTC_VECT(TPU2, 0x04e0), INTC_VECT(TPU3, 0x0500), -	INTC_VECT(TPU4, 0x0520), -	INTC_VECT(LCRC, 0x0540), -	INTC_VECT(PINT1, 0x1000), INTC_VECT(PINT2, 0x1020), -	INTC_VECT(TTI20, 0x1100), -	INTC_VECT(MISTY, 0x1120), -	INTC_VECT(DDM, 0x1140), -	INTC_VECT(SDHI2, 0x1200), INTC_VECT(SDHI2, 0x1220), -	INTC_VECT(SDHI2, 0x1240), INTC_VECT(SDHI2, 0x1260), -	INTC_VECT(RWDT0, 0x1280), INTC_VECT(RWDT1, 0x12a0), -	INTC_VECT(DMAC_1_DEI0, 0x2000), INTC_VECT(DMAC_1_DEI1, 0x2020), -	INTC_VECT(DMAC_1_DEI2, 0x2040), INTC_VECT(DMAC_1_DEI3, 0x2060), -	INTC_VECT(DMAC_2_DEI4, 0x2080), INTC_VECT(DMAC_2_DEI5, 0x20a0), -	INTC_VECT(DMAC_2_DADERR, 0x20c0), -	INTC_VECT(DMAC2_1_DEI0, 0x2100), INTC_VECT(DMAC2_1_DEI1, 0x2120), -	INTC_VECT(DMAC2_1_DEI2, 0x2140), INTC_VECT(DMAC2_1_DEI3, 0x2160), -	INTC_VECT(DMAC2_2_DEI4, 0x2180), INTC_VECT(DMAC2_2_DEI5, 0x21a0), -	INTC_VECT(DMAC2_2_DADERR, 0x21c0), -	INTC_VECT(DMAC3_1_DEI0, 0x2200), INTC_VECT(DMAC3_1_DEI1, 0x2220), -	INTC_VECT(DMAC3_1_DEI2, 0x2240), INTC_VECT(DMAC3_1_DEI3, 0x2260), -	INTC_VECT(DMAC3_2_DEI4, 0x2280), INTC_VECT(DMAC3_2_DEI5, 0x22a0), -	INTC_VECT(DMAC3_2_DADERR, 0x22c0), -}; - -static struct intc_group intca_groups[] __initdata = { -	INTC_GROUP(DMAC_1, DMAC_1_DEI0, -		   DMAC_1_DEI1, DMAC_1_DEI2, DMAC_1_DEI3), -	INTC_GROUP(DMAC_2, DMAC_2_DEI4, -		   DMAC_2_DEI5, DMAC_2_DADERR), -	INTC_GROUP(DMAC2_1, DMAC2_1_DEI0, -		   DMAC2_1_DEI1, DMAC2_1_DEI2, DMAC2_1_DEI3), -	INTC_GROUP(DMAC2_2, DMAC2_2_DEI4, -		   DMAC2_2_DEI5, DMAC2_2_DADERR), -	INTC_GROUP(DMAC3_1, DMAC3_1_DEI0, -		   DMAC3_1_DEI1, DMAC3_1_DEI2, DMAC3_1_DEI3), -	INTC_GROUP(DMAC3_2, DMAC3_2_DEI4, -		   DMAC3_2_DEI5, DMAC3_2_DADERR), -	INTC_GROUP(ETM11, ETM11_ACQCMP, ETM11_FULL), -	INTC_GROUP(ARM11, ARM11_IRQPMU, ARM11_COMMTX, ARM11_COMMTX), -	INTC_GROUP(USBHS, USBHS_USHI0, USBHS_USHI1), -	INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI, -		   FLCTL_FLTREQ0I, FLCTL_FLTREQ1I), -	INTC_GROUP(IIC1, IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1), -}; - -static struct intc_mask_reg intca_mask_registers[] __initdata = { -	{ 0xe6940080, 0xe69400c0, 8, /* IMR0A / IMCR0A */ -	  { DMAC2_1_DEI3, DMAC2_1_DEI2, DMAC2_1_DEI1, DMAC2_1_DEI0, -	    ARM11_IRQPMU, 0, ARM11_COMMTX, ARM11_COMMRX } }, -	{ 0xe6940084, 0xe69400c4, 8, /* IMR1A / IMCR1A */ -	  { CRYPT1_ERR, CRYPT2_STD, DIRC, 0, -	    DMAC_1_DEI3, DMAC_1_DEI2, DMAC_1_DEI1, DMAC_1_DEI0 } }, -	{ 0xe6940088, 0xe69400c8, 8, /* IMR2A / IMCR2A */ -	  { PINT1, PINT2, 0, 0, -	    BBIF1, BBIF2, MFI_MFIS, MFI_MFIM } }, -	{ 0xe694008c, 0xe69400cc, 8, /* IMR3A / IMCR3A */ -	  { DMAC3_1_DEI3, DMAC3_1_DEI2, DMAC3_1_DEI1, DMAC3_1_DEI0, -	    DMAC3_2_DADERR, DMAC3_2_DEI5, DMAC3_2_DEI4, IRDA } }, -	{ 0xe6940090, 0xe69400d0, 8, /* IMR4A / IMCR4A */ -	  { DDM, 0, 0, 0, -	    0, 0, ETM11_FULL, ETM11_ACQCMP } }, -	{ 0xe6940094, 0xe69400d4, 8, /* IMR5A / IMCR5A */ -	  { KEYSC_KEY, DMAC_2_DADERR, DMAC_2_DEI5, DMAC_2_DEI4, -	    SCIFA3, SCIFA2, SCIFA1, SCIFA0 } }, -	{ 0xe6940098, 0xe69400d8, 8, /* IMR6A / IMCR6A */ -	  { SCIFB, SCIFA5, SCIFA4, MSIOF1, -	    0, 0, MSIOF2, 0 } }, -	{ 0xe694009c, 0xe69400dc, 8, /* IMR7A / IMCR7A */ -	  { DISABLED, ENABLED, ENABLED, ENABLED, -	    FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } }, -	{ 0xe69400a0, 0xe69400e0, 8, /* IMR8A / IMCR8A */ -	  { DISABLED, ENABLED, ENABLED, ENABLED, -	    TTI20, USBDMAC_USHDMI, SPU, SIU } }, -	{ 0xe69400a4, 0xe69400e4, 8, /* IMR9A / IMCR9A */ -	  { CMT1_CMT13, CMT1_CMT12, CMT1_CMT11, CMT1_CMT10, -	    CMT2, USBHS_USHI1, USBHS_USHI0, 0 } }, -	{ 0xe69400a8, 0xe69400e8, 8, /* IMR10A / IMCR10A */ -	  { 0, DMAC2_2_DADERR, DMAC2_2_DEI5, DMAC2_2_DEI4, -	    0, 0, 0, 0 } }, -	{ 0xe69400ac, 0xe69400ec, 8, /* IMR11A / IMCR11A */ -	  { IIC1_DTEI1, IIC1_WAITI1, IIC1_TACKI1, IIC1_ALI1, -	    LCRC, MSU_MSU2, IREM, MSU_MSU } }, -	{ 0xe69400b0, 0xe69400f0, 8, /* IMR12A / IMCR12A */ -	  { 0, 0, TPU0, TPU1, -	    TPU2, TPU3, TPU4, 0 } }, -	{ 0xe69400b4, 0xe69400f4, 8, /* IMR13A / IMCR13A */ -	  { DISABLED, ENABLED, ENABLED, ENABLED, -	    MISTY, CMT3, RWDT1, RWDT0 } }, -}; - -static struct intc_prio_reg intca_prio_registers[] __initdata = { -	{ 0xe6940000, 0, 16, 4, /* IPRAA */ { DMAC3_1, DMAC3_2, CMT2, LCRC } }, -	{ 0xe6940004, 0, 16, 4, /* IPRBA */ { IRDA, ETM11, BBIF1, BBIF2 } }, -	{ 0xe6940008, 0, 16, 4, /* IPRCA */ { CRYPT1_ERR, CRYPT2_STD, -					      CMT1_CMT11, ARM11 } }, -	{ 0xe694000c, 0, 16, 4, /* IPRDA */ { PINT1, PINT2, -					      CMT1_CMT12, TPU4 } }, -	{ 0xe6940010, 0, 16, 4, /* IPREA */ { DMAC_1, MFI_MFIS, -					      MFI_MFIM, USBHS } }, -	{ 0xe6940014, 0, 16, 4, /* IPRFA */ { KEYSC_KEY, DMAC_2, -					      0, CMT1_CMT10 } }, -	{ 0xe6940018, 0, 16, 4, /* IPRGA */ { SCIFA0, SCIFA1, -					      SCIFA2, SCIFA3 } }, -	{ 0xe694001c, 0, 16, 4, /* IPRGH */ { MSIOF2, USBDMAC_USHDMI, -					      FLCTL, SDHI0 } }, -	{ 0xe6940020, 0, 16, 4, /* IPRIA */ { MSIOF1, SCIFA4, MSU_MSU, IIC1 } }, -	{ 0xe6940024, 0, 16, 4, /* IPRJA */ { DMAC2_1, DMAC2_2, SIU, TTI20 } }, -	{ 0xe6940028, 0, 16, 4, /* IPRKA */ { 0, CMT1_CMT13, IREM, SDHI1 } }, -	{ 0xe694002c, 0, 16, 4, /* IPRLA */ { TPU0, TPU1, TPU2, TPU3 } }, -	{ 0xe6940030, 0, 16, 4, /* IPRMA */ { MISTY, CMT3, RWDT1, RWDT0 } }, -	{ 0xe6940034, 0, 16, 4, /* IPRNA */ { SCIFB, SCIFA5, SPU, DDM } }, -	{ 0xe6940038, 0, 16, 4, /* IPROA */ { 0, 0, DIRC, SDHI2 } }, -}; - -static struct intc_desc intca_desc __initdata = { -	.name = "sh7367-intca", -	.force_enable = ENABLED, -	.force_disable = DISABLED, -	.hw = INTC_HW_DESC(intca_vectors, intca_groups, -			   intca_mask_registers, intca_prio_registers, -			   NULL, NULL), -}; - -INTC_IRQ_PINS_16(intca_irq_pins, 0xe6900000, -		 INTC_VECT, "sh7367-intca-irq-pins"); - -enum { -	UNUSED_INTCS = 0, - -	INTCS, - -	/* interrupt sources INTCS */ -	VIO2_VEU0, VIO2_VEU1, VIO2_VEU2, VIO2_VEU3, -	VIO3_VOU, -	RTDMAC_1_DEI0, RTDMAC_1_DEI1, RTDMAC_1_DEI2, RTDMAC_1_DEI3, -	VIO1_CEU, VIO1_BEU0, VIO1_BEU1, VIO1_BEU2, -	VPU, -	SGX530, -	_2DDMAC_2DDM0, _2DDMAC_2DDM1, _2DDMAC_2DDM2, _2DDMAC_2DDM3, -	IIC2_ALI2, IIC2_TACKI2, IIC2_WAITI2, IIC2_DTEI2, -	IPMMU_IPMMUB, IPMMU_IPMMUS, -	RTDMAC_2_DEI4, RTDMAC_2_DEI5, RTDMAC_2_DADERR, -	MSIOF, -	IIC0_ALI0, IIC0_TACKI0, IIC0_WAITI0, IIC0_DTEI0, -	TMU_TUNI0, TMU_TUNI1, TMU_TUNI2, -	CMT, -	TSIF, -	IPMMUI, -	MVI3, -	ICB, -	PEP, -	ASA, -	BEM, -	VE2HO, -	HQE, -	JPEG, -	LCDC, - -	/* interrupt groups INTCS */ -	_2DDMAC, RTDMAC_1, RTDMAC_2, VEU, BEU, IIC0, IPMMU, IIC2, -}; - -static struct intc_vect intcs_vectors[] = { -	INTCS_VECT(VIO2_VEU0, 0x700), INTCS_VECT(VIO2_VEU1, 0x720), -	INTCS_VECT(VIO2_VEU2, 0x740), INTCS_VECT(VIO2_VEU3, 0x760), -	INTCS_VECT(VIO3_VOU, 0x780), -	INTCS_VECT(RTDMAC_1_DEI0, 0x800), INTCS_VECT(RTDMAC_1_DEI1, 0x820), -	INTCS_VECT(RTDMAC_1_DEI2, 0x840), INTCS_VECT(RTDMAC_1_DEI3, 0x860), -	INTCS_VECT(VIO1_CEU, 0x880), INTCS_VECT(VIO1_BEU0, 0x8a0), -	INTCS_VECT(VIO1_BEU1, 0x8c0), INTCS_VECT(VIO1_BEU2, 0x8e0), -	INTCS_VECT(VPU, 0x980), -	INTCS_VECT(SGX530, 0x9e0), -	INTCS_VECT(_2DDMAC_2DDM0, 0xa00), INTCS_VECT(_2DDMAC_2DDM1, 0xa20), -	INTCS_VECT(_2DDMAC_2DDM2, 0xa40), INTCS_VECT(_2DDMAC_2DDM3, 0xa60), -	INTCS_VECT(IIC2_ALI2, 0xa80), INTCS_VECT(IIC2_TACKI2, 0xaa0), -	INTCS_VECT(IIC2_WAITI2, 0xac0), INTCS_VECT(IIC2_DTEI2, 0xae0), -	INTCS_VECT(IPMMU_IPMMUB, 0xb20), INTCS_VECT(IPMMU_IPMMUS, 0xb60), -	INTCS_VECT(RTDMAC_2_DEI4, 0xb80), INTCS_VECT(RTDMAC_2_DEI5, 0xba0), -	INTCS_VECT(RTDMAC_2_DADERR, 0xbc0), -	INTCS_VECT(MSIOF, 0xd20), -	INTCS_VECT(IIC0_ALI0, 0xe00), INTCS_VECT(IIC0_TACKI0, 0xe20), -	INTCS_VECT(IIC0_WAITI0, 0xe40), INTCS_VECT(IIC0_DTEI0, 0xe60), -	INTCS_VECT(TMU_TUNI0, 0xe80), INTCS_VECT(TMU_TUNI1, 0xea0), -	INTCS_VECT(TMU_TUNI2, 0xec0), -	INTCS_VECT(CMT, 0xf00), -	INTCS_VECT(TSIF, 0xf20), -	INTCS_VECT(IPMMUI, 0xf60), -	INTCS_VECT(MVI3, 0x420), -	INTCS_VECT(ICB, 0x480), -	INTCS_VECT(PEP, 0x4a0), -	INTCS_VECT(ASA, 0x4c0), -	INTCS_VECT(BEM, 0x4e0), -	INTCS_VECT(VE2HO, 0x520), -	INTCS_VECT(HQE, 0x540), -	INTCS_VECT(JPEG, 0x560), -	INTCS_VECT(LCDC, 0x580), - -	INTC_VECT(INTCS, 0xf80), -}; - -static struct intc_group intcs_groups[] __initdata = { -	INTC_GROUP(_2DDMAC, _2DDMAC_2DDM0, _2DDMAC_2DDM1, -		   _2DDMAC_2DDM2, _2DDMAC_2DDM3), -	INTC_GROUP(RTDMAC_1, RTDMAC_1_DEI0, RTDMAC_1_DEI1, -		   RTDMAC_1_DEI2, RTDMAC_1_DEI3), -	INTC_GROUP(RTDMAC_2, RTDMAC_2_DEI4, RTDMAC_2_DEI5, RTDMAC_2_DADERR), -	INTC_GROUP(VEU, VIO2_VEU0, VIO2_VEU1, VIO2_VEU2, VIO2_VEU3), -	INTC_GROUP(BEU, VIO1_BEU0, VIO1_BEU1, VIO1_BEU2), -	INTC_GROUP(IIC0, IIC0_ALI0, IIC0_TACKI0, IIC0_WAITI0, IIC0_DTEI0), -	INTC_GROUP(IPMMU, IPMMU_IPMMUS, IPMMU_IPMMUB), -	INTC_GROUP(IIC2, IIC2_ALI2, IIC2_TACKI2, IIC2_WAITI2, IIC2_DTEI2), -}; - -static struct intc_mask_reg intcs_mask_registers[] = { -	{ 0xffd20184, 0xffd201c4, 8, /* IMR1SA / IMCR1SA */ -	  { VIO1_BEU2, VIO1_BEU1, VIO1_BEU0, VIO1_CEU, -	    VIO2_VEU3, VIO2_VEU2, VIO2_VEU1, VIO2_VEU0 } }, -	{ 0xffd20188, 0xffd201c8, 8, /* IMR2SA / IMCR2SA */ -	  { VIO3_VOU, 0, VE2HO, VPU, -	    0, 0, 0, 0 } }, -	{ 0xffd2018c, 0xffd201cc, 8, /* IMR3SA / IMCR3SA */ -	  { _2DDMAC_2DDM3, _2DDMAC_2DDM2, _2DDMAC_2DDM1, _2DDMAC_2DDM0, -	    BEM, ASA, PEP, ICB } }, -	{ 0xffd20190, 0xffd201d0, 8, /* IMR4SA / IMCR4SA */ -	  { 0, 0, MVI3, 0, -	    JPEG, HQE, 0, LCDC } }, -	{ 0xffd20194, 0xffd201d4, 8, /* IMR5SA / IMCR5SA */ -	  { 0, RTDMAC_2_DADERR, RTDMAC_2_DEI5, RTDMAC_2_DEI4, -	    RTDMAC_1_DEI3, RTDMAC_1_DEI2, RTDMAC_1_DEI1, RTDMAC_1_DEI0 } }, -	{ 0xffd20198, 0xffd201d8, 8, /* IMR6SA / IMCR6SA */ -	  { 0, 0, MSIOF, 0, -	    SGX530, 0, 0, 0 } }, -	{ 0xffd2019c, 0xffd201dc, 8, /* IMR7SA / IMCR7SA */ -	  { 0, TMU_TUNI2, TMU_TUNI1, TMU_TUNI0, -	    0, 0, 0, 0 } }, -	{ 0xffd201a4, 0xffd201e4, 8, /* IMR9SA / IMCR9SA */ -	  { 0, 0, 0, CMT, -	    IIC2_DTEI2, IIC2_WAITI2, IIC2_TACKI2, IIC2_ALI2 } }, -	{ 0xffd201a8, 0xffd201e8, 8, /* IMR10SA / IMCR10SA */ -	  { IPMMU_IPMMUS, 0, IPMMU_IPMMUB, 0, -	    0, 0, 0, 0 } }, -	{ 0xffd201ac, 0xffd201ec, 8, /* IMR11SA / IMCR11SA */ -	  { IIC0_DTEI0, IIC0_WAITI0, IIC0_TACKI0, IIC0_ALI0, -	    0, 0, IPMMUI, TSIF } }, -	{ 0xffd20104, 0, 16, /* INTAMASK */ -	  { 0, 0, 0, 0, 0, 0, 0, 0, -	    0, 0, 0, 0, 0, 0, 0, INTCS } }, -}; - -/* Priority is needed for INTCA to receive the INTCS interrupt */ -static struct intc_prio_reg intcs_prio_registers[] = { -	{ 0xffd20000, 0, 16, 4, /* IPRAS */ { 0, MVI3, _2DDMAC, ICB } }, -	{ 0xffd20004, 0, 16, 4, /* IPRBS */ { JPEG, LCDC, 0, 0 } }, -	{ 0xffd20008, 0, 16, 4, /* IPRCS */ { BBIF2, 0, 0, 0 } }, -	{ 0xffd20010, 0, 16, 4, /* IPRES */ { RTDMAC_1, VIO1_CEU, 0, VPU } }, -	{ 0xffd20014, 0, 16, 4, /* IPRFS */ { 0, RTDMAC_2, 0, CMT } }, -	{ 0xffd20018, 0, 16, 4, /* IPRGS */ { TMU_TUNI0, TMU_TUNI1, -					      TMU_TUNI2, 0 } }, -	{ 0xffd2001c, 0, 16, 4, /* IPRHS */ { 0, VIO3_VOU, VEU, BEU } }, -	{ 0xffd20020, 0, 16, 4, /* IPRIS */ { 0, MSIOF, TSIF, IIC0 } }, -	{ 0xffd20024, 0, 16, 4, /* IPRJS */ { 0, SGX530, 0, 0 } }, -	{ 0xffd20028, 0, 16, 4, /* IPRKS */ { BEM, ASA, IPMMUI, PEP } }, -	{ 0xffd2002c, 0, 16, 4, /* IPRLS */ { IPMMU, 0, VE2HO, HQE } }, -	{ 0xffd20030, 0, 16, 4, /* IPRMS */ { IIC2, 0, 0, 0 } }, -}; - -static struct resource intcs_resources[] __initdata = { -	[0] = { -		.start	= 0xffd20000, -		.end	= 0xffd2ffff, -		.flags	= IORESOURCE_MEM, -	} -}; - -static struct intc_desc intcs_desc __initdata = { -	.name = "sh7367-intcs", -	.resource = intcs_resources, -	.num_resources = ARRAY_SIZE(intcs_resources), -	.hw = INTC_HW_DESC(intcs_vectors, intcs_groups, intcs_mask_registers, -			   intcs_prio_registers, NULL, NULL), -}; - -static void intcs_demux(unsigned int irq, struct irq_desc *desc) -{ -	void __iomem *reg = (void *)irq_get_handler_data(irq); -	unsigned int evtcodeas = ioread32(reg); - -	generic_handle_irq(intcs_evt2irq(evtcodeas)); -} - -void __init sh7367_init_irq(void) -{ -	void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE); - -	register_intc_controller(&intca_desc); -	register_intc_controller(&intca_irq_pins_desc); -	register_intc_controller(&intcs_desc); - -	/* demux using INTEVTSA */ -	irq_set_handler_data(evt2irq(0xf80), (void *)intevtsa); -	irq_set_chained_handler(evt2irq(0xf80), intcs_demux); -} diff --git a/arch/arm/mach-shmobile/intc-sh7377.c b/arch/arm/mach-shmobile/intc-sh7377.c deleted file mode 100644 index b84a460a340..00000000000 --- a/arch/arm/mach-shmobile/intc-sh7377.c +++ /dev/null @@ -1,592 +0,0 @@ -/* - * sh7377 processor support - INTC hardware block - * - * Copyright (C) 2010  Magnus Damm - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/io.h> -#include <linux/sh_intc.h> -#include <mach/intc.h> -#include <mach/irqs.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> - -enum { -	UNUSED_INTCA = 0, -	ENABLED, -	DISABLED, - -	/* interrupt sources INTCA */ -	DIRC, -	_2DG, -	CRYPT_STD, -	IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1, -	AP_ARM_IRQPMU, AP_ARM_COMMTX, AP_ARM_COMMRX, -	MFI_MFIM, MFI_MFIS, -	BBIF1, BBIF2, -	USBDMAC_USHDMI, -	USBHS_USHI0, USBHS_USHI1, -	_3DG_SGX540, -	CMT1_CMT10, CMT1_CMT11, CMT1_CMT12, CMT1_CMT13, CMT2, CMT3, -	KEYSC_KEY, -	SCIFA0, SCIFA1, SCIFA2, SCIFA3, -	MSIOF2, MSIOF1, -	SCIFA4, SCIFA5, SCIFB, -	FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, -	SDHI0, -	SDHI1, -	MSU_MSU, MSU_MSU2, -	IRREM, -	MSUG, -	IRDA, -	TPU0, TPU1, TPU2, TPU3, TPU4, -	LCRC, -	PINTCA_PINT1, PINTCA_PINT2, -	TTI20, -	MISTY, -	DDM, -	RWDT0, RWDT1, -	DMAC_1_DEI0, DMAC_1_DEI1, DMAC_1_DEI2, DMAC_1_DEI3, -	DMAC_2_DEI4, DMAC_2_DEI5, DMAC_2_DADERR, -	DMAC2_1_DEI0, DMAC2_1_DEI1, DMAC2_1_DEI2, DMAC2_1_DEI3, -	DMAC2_2_DEI4, DMAC2_2_DEI5, DMAC2_2_DADERR, -	DMAC3_1_DEI0, DMAC3_1_DEI1, DMAC3_1_DEI2, DMAC3_1_DEI3, -	DMAC3_2_DEI4, DMAC3_2_DEI5, DMAC3_2_DADERR, -	SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM, -	ICUSB_ICUSB0, ICUSB_ICUSB1, -	ICUDMC_ICUDMC1, ICUDMC_ICUDMC2, -	SPU2_SPU0, SPU2_SPU1, -	FSI, -	FMSI, -	SCUV, -	IPMMU_IPMMUB, -	AP_ARM_CTIIRQ, AP_ARM_DMAEXTERRIRQ, AP_ARM_DMAIRQ, AP_ARM_DMASIRQ, -	MFIS2, -	CPORTR2S, -	CMT14, CMT15, -	SCIFA6, - -	/* interrupt groups INTCA */ -	DMAC_1, DMAC_2,	DMAC2_1, DMAC2_2, DMAC3_1, DMAC3_2, SHWYSTAT, -	AP_ARM1, AP_ARM2, USBHS, SPU2, FLCTL, IIC1, -	ICUSB, ICUDMC -}; - -static struct intc_vect intca_vectors[] __initdata = { -	INTC_VECT(DIRC, 0x0560), -	INTC_VECT(_2DG, 0x05e0), -	INTC_VECT(CRYPT_STD, 0x0700), -	INTC_VECT(IIC1_ALI1, 0x0780), INTC_VECT(IIC1_TACKI1, 0x07a0), -	INTC_VECT(IIC1_WAITI1, 0x07c0), INTC_VECT(IIC1_DTEI1, 0x07e0), -	INTC_VECT(AP_ARM_IRQPMU, 0x0800), INTC_VECT(AP_ARM_COMMTX, 0x0840), -	INTC_VECT(AP_ARM_COMMRX, 0x0860), -	INTC_VECT(MFI_MFIM, 0x0900), INTC_VECT(MFI_MFIS, 0x0920), -	INTC_VECT(BBIF1, 0x0940), INTC_VECT(BBIF2, 0x0960), -	INTC_VECT(USBDMAC_USHDMI, 0x0a00), -	INTC_VECT(USBHS_USHI0, 0x0a20), INTC_VECT(USBHS_USHI1, 0x0a40), -	INTC_VECT(_3DG_SGX540, 0x0a60), -	INTC_VECT(CMT1_CMT10, 0x0b00), INTC_VECT(CMT1_CMT11, 0x0b20), -	INTC_VECT(CMT1_CMT12, 0x0b40), INTC_VECT(CMT1_CMT13, 0x0b60), -	INTC_VECT(CMT2, 0x0b80), INTC_VECT(CMT3, 0x0ba0), -	INTC_VECT(KEYSC_KEY, 0x0be0), -	INTC_VECT(SCIFA0, 0x0c00), INTC_VECT(SCIFA1, 0x0c20), -	INTC_VECT(SCIFA2, 0x0c40), INTC_VECT(SCIFA3, 0x0c60), -	INTC_VECT(MSIOF2, 0x0c80), INTC_VECT(MSIOF1, 0x0d00), -	INTC_VECT(SCIFA4, 0x0d20), INTC_VECT(SCIFA5, 0x0d40), -	INTC_VECT(SCIFB, 0x0d60), -	INTC_VECT(FLCTL_FLSTEI, 0x0d80), INTC_VECT(FLCTL_FLTENDI, 0x0da0), -	INTC_VECT(FLCTL_FLTREQ0I, 0x0dc0), INTC_VECT(FLCTL_FLTREQ1I, 0x0de0), -	INTC_VECT(SDHI0, 0x0e00), INTC_VECT(SDHI0, 0x0e20), -	INTC_VECT(SDHI0, 0x0e40), INTC_VECT(SDHI0, 0x0e60), -	INTC_VECT(SDHI1, 0x0e80), INTC_VECT(SDHI1, 0x0ea0), -	INTC_VECT(SDHI1, 0x0ec0), INTC_VECT(SDHI1, 0x0ee0), -	INTC_VECT(MSU_MSU, 0x0f20), INTC_VECT(MSU_MSU2, 0x0f40), -	INTC_VECT(IRREM, 0x0f60), -	INTC_VECT(MSUG, 0x0fa0), -	INTC_VECT(IRDA, 0x0480), -	INTC_VECT(TPU0, 0x04a0), INTC_VECT(TPU1, 0x04c0), -	INTC_VECT(TPU2, 0x04e0), INTC_VECT(TPU3, 0x0500), -	INTC_VECT(TPU4, 0x0520), -	INTC_VECT(LCRC, 0x0540), -	INTC_VECT(PINTCA_PINT1, 0x1000), INTC_VECT(PINTCA_PINT2, 0x1020), -	INTC_VECT(TTI20, 0x1100), -	INTC_VECT(MISTY, 0x1120), -	INTC_VECT(DDM, 0x1140), -	INTC_VECT(RWDT0, 0x1280), INTC_VECT(RWDT1, 0x12a0), -	INTC_VECT(DMAC_1_DEI0, 0x2000), INTC_VECT(DMAC_1_DEI1, 0x2020), -	INTC_VECT(DMAC_1_DEI2, 0x2040), INTC_VECT(DMAC_1_DEI3, 0x2060), -	INTC_VECT(DMAC_2_DEI4, 0x2080), INTC_VECT(DMAC_2_DEI5, 0x20a0), -	INTC_VECT(DMAC_2_DADERR, 0x20c0), -	INTC_VECT(DMAC2_1_DEI0, 0x2100), INTC_VECT(DMAC2_1_DEI1, 0x2120), -	INTC_VECT(DMAC2_1_DEI2, 0x2140), INTC_VECT(DMAC2_1_DEI3, 0x2160), -	INTC_VECT(DMAC2_2_DEI4, 0x2180), INTC_VECT(DMAC2_2_DEI5, 0x21a0), -	INTC_VECT(DMAC2_2_DADERR, 0x21c0), -	INTC_VECT(DMAC3_1_DEI0, 0x2200), INTC_VECT(DMAC3_1_DEI1, 0x2220), -	INTC_VECT(DMAC3_1_DEI2, 0x2240), INTC_VECT(DMAC3_1_DEI3, 0x2260), -	INTC_VECT(DMAC3_2_DEI4, 0x2280), INTC_VECT(DMAC3_2_DEI5, 0x22a0), -	INTC_VECT(DMAC3_2_DADERR, 0x22c0), -	INTC_VECT(SHWYSTAT_RT, 0x1300), INTC_VECT(SHWYSTAT_HS, 0x1d20), -	INTC_VECT(SHWYSTAT_COM, 0x1340), -	INTC_VECT(ICUSB_ICUSB0, 0x1700), INTC_VECT(ICUSB_ICUSB1, 0x1720), -	INTC_VECT(ICUDMC_ICUDMC1, 0x1780), INTC_VECT(ICUDMC_ICUDMC2, 0x17a0), -	INTC_VECT(SPU2_SPU0, 0x1800), INTC_VECT(SPU2_SPU1, 0x1820), -	INTC_VECT(FSI, 0x1840), -	INTC_VECT(FMSI, 0x1860), -	INTC_VECT(SCUV, 0x1880), -	INTC_VECT(IPMMU_IPMMUB, 0x1900), -	INTC_VECT(AP_ARM_CTIIRQ, 0x1980), -	INTC_VECT(AP_ARM_DMAEXTERRIRQ, 0x19a0), -	INTC_VECT(AP_ARM_DMAIRQ, 0x19c0), -	INTC_VECT(AP_ARM_DMASIRQ, 0x19e0), -	INTC_VECT(MFIS2, 0x1a00), -	INTC_VECT(CPORTR2S, 0x1a20), -	INTC_VECT(CMT14, 0x1a40), INTC_VECT(CMT15, 0x1a60), -	INTC_VECT(SCIFA6, 0x1a80), -}; - -static struct intc_group intca_groups[] __initdata = { -	INTC_GROUP(DMAC_1, DMAC_1_DEI0, -		   DMAC_1_DEI1, DMAC_1_DEI2, DMAC_1_DEI3), -	INTC_GROUP(DMAC_2, DMAC_2_DEI4, -		   DMAC_2_DEI5, DMAC_2_DADERR), -	INTC_GROUP(DMAC2_1, DMAC2_1_DEI0, -		   DMAC2_1_DEI1, DMAC2_1_DEI2, DMAC2_1_DEI3), -	INTC_GROUP(DMAC2_2, DMAC2_2_DEI4, -		   DMAC2_2_DEI5, DMAC2_2_DADERR), -	INTC_GROUP(DMAC3_1, DMAC3_1_DEI0, -		   DMAC3_1_DEI1, DMAC3_1_DEI2, DMAC3_1_DEI3), -	INTC_GROUP(DMAC3_2, DMAC3_2_DEI4, -		   DMAC3_2_DEI5, DMAC3_2_DADERR), -	INTC_GROUP(AP_ARM1, AP_ARM_IRQPMU, AP_ARM_COMMTX, AP_ARM_COMMTX), -	INTC_GROUP(USBHS, USBHS_USHI0, USBHS_USHI1), -	INTC_GROUP(SPU2, SPU2_SPU0, SPU2_SPU1), -	INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI, -		   FLCTL_FLTREQ0I, FLCTL_FLTREQ1I), -	INTC_GROUP(IIC1, IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1), -	INTC_GROUP(SHWYSTAT, SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM), -	INTC_GROUP(ICUSB, ICUSB_ICUSB0, ICUSB_ICUSB1), -	INTC_GROUP(ICUDMC, ICUDMC_ICUDMC1, ICUDMC_ICUDMC2), -}; - -static struct intc_mask_reg intca_mask_registers[] __initdata = { -	{ 0xe6940080, 0xe69400c0, 8, /* IMR0A / IMCR0A */ -	  { DMAC2_1_DEI3, DMAC2_1_DEI2, DMAC2_1_DEI1, DMAC2_1_DEI0, -	    AP_ARM_IRQPMU, 0, AP_ARM_COMMTX, AP_ARM_COMMRX } }, -	{ 0xe6940084, 0xe69400c4, 8, /* IMR1A / IMCR1A */ -	  { _2DG, CRYPT_STD, DIRC, 0, -	    DMAC_1_DEI3, DMAC_1_DEI2, DMAC_1_DEI1, DMAC_1_DEI0 } }, -	{ 0xe6940088, 0xe69400c8, 8, /* IMR2A / IMCR2A */ -	  { PINTCA_PINT1, PINTCA_PINT2, 0, 0, -	    BBIF1, BBIF2, MFI_MFIS, MFI_MFIM } }, -	{ 0xe694008c, 0xe69400cc, 8, /* IMR3A / IMCR3A */ -	  { DMAC3_1_DEI3, DMAC3_1_DEI2, DMAC3_1_DEI1, DMAC3_1_DEI0, -	    DMAC3_2_DADERR, DMAC3_2_DEI5, DMAC3_2_DEI4, IRDA } }, -	{ 0xe6940090, 0xe69400d0, 8, /* IMR4A / IMCR4A */ -	  { DDM, 0, 0, 0, -	    0, 0, 0, 0 } }, -	{ 0xe6940094, 0xe69400d4, 8, /* IMR5A / IMCR5A */ -	  { KEYSC_KEY, DMAC_2_DADERR, DMAC_2_DEI5, DMAC_2_DEI4, -	    SCIFA3, SCIFA2, SCIFA1, SCIFA0 } }, -	{ 0xe6940098, 0xe69400d8, 8, /* IMR6A / IMCR6A */ -	  { SCIFB, SCIFA5, SCIFA4, MSIOF1, -	    0, 0, MSIOF2, 0 } }, -	{ 0xe694009c, 0xe69400dc, 8, /* IMR7A / IMCR7A */ -	  { DISABLED, ENABLED, ENABLED, ENABLED, -	    FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } }, -	{ 0xe69400a0, 0xe69400e0, 8, /* IMR8A / IMCR8A */ -	  { DISABLED, ENABLED, ENABLED, ENABLED, -	    TTI20, USBDMAC_USHDMI, 0, MSUG } }, -	{ 0xe69400a4, 0xe69400e4, 8, /* IMR9A / IMCR9A */ -	  { CMT1_CMT13, CMT1_CMT12, CMT1_CMT11, CMT1_CMT10, -	    CMT2, USBHS_USHI1, USBHS_USHI0, _3DG_SGX540 } }, -	{ 0xe69400a8, 0xe69400e8, 8, /* IMR10A / IMCR10A */ -	  { 0, DMAC2_2_DADERR, DMAC2_2_DEI5, DMAC2_2_DEI4, -	    0, 0, 0, 0 } }, -	{ 0xe69400ac, 0xe69400ec, 8, /* IMR11A / IMCR11A */ -	  { IIC1_DTEI1, IIC1_WAITI1, IIC1_TACKI1, IIC1_ALI1, -	    LCRC, MSU_MSU2, IRREM, MSU_MSU } }, -	{ 0xe69400b0, 0xe69400f0, 8, /* IMR12A / IMCR12A */ -	  { 0, 0, TPU0, TPU1, -	    TPU2, TPU3, TPU4, 0 } }, -	{ 0xe69400b4, 0xe69400f4, 8, /* IMR13A / IMCR13A */ -	  { 0, 0, 0, 0, -	    MISTY, CMT3, RWDT1, RWDT0 } }, -	{ 0xe6950080, 0xe69500c0, 8, /* IMR0A3 / IMCR0A3 */ -	  { SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM, 0, -	    0, 0, 0, 0 } }, -	{ 0xe6950090, 0xe69500d0, 8, /* IMR4A3 / IMCR4A3 */ -	  { ICUSB_ICUSB0, ICUSB_ICUSB1, 0, 0, -	    ICUDMC_ICUDMC1, ICUDMC_ICUDMC2, 0, 0 } }, -	{ 0xe6950094, 0xe69500d4, 8, /* IMR5A3 / IMCR5A3 */ -	  { SPU2_SPU0, SPU2_SPU1, FSI, FMSI, -	    SCUV, 0, 0, 0 } }, -	{ 0xe6950098, 0xe69500d8, 8, /* IMR6A3 / IMCR6A3 */ -	  { IPMMU_IPMMUB, 0, 0, 0, -	    AP_ARM_CTIIRQ, AP_ARM_DMAEXTERRIRQ, -	    AP_ARM_DMAIRQ, AP_ARM_DMASIRQ } }, -	{ 0xe695009c, 0xe69500dc, 8, /* IMR7A3 / IMCR7A3 */ -	  { MFIS2, CPORTR2S, CMT14, CMT15, -	    SCIFA6, 0, 0, 0 } }, -}; - -static struct intc_prio_reg intca_prio_registers[] __initdata = { -	{ 0xe6940000, 0, 16, 4, /* IPRAA */ { DMAC3_1, DMAC3_2, CMT2, LCRC } }, -	{ 0xe6940004, 0, 16, 4, /* IPRBA */ { IRDA, 0, BBIF1, BBIF2 } }, -	{ 0xe6940008, 0, 16, 4, /* IPRCA */ { _2DG, CRYPT_STD, -					      CMT1_CMT11, AP_ARM1 } }, -	{ 0xe694000c, 0, 16, 4, /* IPRDA */ { PINTCA_PINT1, PINTCA_PINT2, -					      CMT1_CMT12, TPU4 } }, -	{ 0xe6940010, 0, 16, 4, /* IPREA */ { DMAC_1, MFI_MFIS, -					      MFI_MFIM, USBHS } }, -	{ 0xe6940014, 0, 16, 4, /* IPRFA */ { KEYSC_KEY, DMAC_2, -					      _3DG_SGX540, CMT1_CMT10 } }, -	{ 0xe6940018, 0, 16, 4, /* IPRGA */ { SCIFA0, SCIFA1, -					      SCIFA2, SCIFA3 } }, -	{ 0xe694001c, 0, 16, 4, /* IPRGH */ { MSIOF2, USBDMAC_USHDMI, -					      FLCTL, SDHI0 } }, -	{ 0xe6940020, 0, 16, 4, /* IPRIA */ { MSIOF1, SCIFA4, MSU_MSU, IIC1 } }, -	{ 0xe6940024, 0, 16, 4, /* IPRJA */ { DMAC2_1, DMAC2_2, MSUG, TTI20 } }, -	{ 0xe6940028, 0, 16, 4, /* IPRKA */ { 0, CMT1_CMT13, IRREM, SDHI1 } }, -	{ 0xe694002c, 0, 16, 4, /* IPRLA */ { TPU0, TPU1, TPU2, TPU3 } }, -	{ 0xe6940030, 0, 16, 4, /* IPRMA */ { MISTY, CMT3, RWDT1, RWDT0 } }, -	{ 0xe6940034, 0, 16, 4, /* IPRNA */ { SCIFB, SCIFA5, 0, DDM } }, -	{ 0xe6940038, 0, 16, 4, /* IPROA */ { 0, 0, DIRC, 0 } }, -	{ 0xe6950000, 0, 16, 4, /* IPRAA3 */ { SHWYSTAT, 0, 0, 0 } }, -	{ 0xe6950020, 0, 16, 4, /* IPRIA3 */ { ICUSB, 0, 0, 0 } }, -	{ 0xe6950024, 0, 16, 4, /* IPRJA3 */ { ICUDMC, 0, 0, 0 } }, -	{ 0xe6950028, 0, 16, 4, /* IPRKA3 */ { SPU2, 0, FSI, FMSI } }, -	{ 0xe695002c, 0, 16, 4, /* IPRLA3 */ { SCUV, 0, 0, 0 } }, -	{ 0xe6950030, 0, 16, 4, /* IPRMA3 */ { IPMMU_IPMMUB, 0, 0, 0 } }, -	{ 0xe6950034, 0, 16, 4, /* IPRNA3 */ { AP_ARM2, 0, 0, 0 } }, -	{ 0xe6950038, 0, 16, 4, /* IPROA3 */ { MFIS2, CPORTR2S, -					       CMT14, CMT15 } }, -	{ 0xe694003c, 0, 16, 4, /* IPRPA3 */ { SCIFA6, 0, 0, 0 } }, -}; - -static struct intc_desc intca_desc __initdata = { -	.name = "sh7377-intca", -	.force_enable = ENABLED, -	.force_disable = DISABLED, -	.hw = INTC_HW_DESC(intca_vectors, intca_groups, -			   intca_mask_registers, intca_prio_registers, -			   NULL, NULL), -}; - -INTC_IRQ_PINS_32(intca_irq_pins, 0xe6900000, -		 INTC_VECT, "sh7377-intca-irq-pins"); - -/* this macro ignore entry which is also in INTCA */ -#define __IGNORE(a...) -#define __IGNORE0(a...) 0 - -enum { -	UNUSED_INTCS = 0, - -	INTCS, - -	/* interrupt sources INTCS */ -	VEU_VEU0, VEU_VEU1, VEU_VEU2, VEU_VEU3, -	RTDMAC1_1_DEI0, RTDMAC1_1_DEI1, RTDMAC1_1_DEI2, RTDMAC1_1_DEI3, -	CEU, -	BEU_BEU0, BEU_BEU1, BEU_BEU2, -	__IGNORE(MFI) -	__IGNORE(BBIF2) -	VPU, -	TSIF1, -	__IGNORE(SGX540) -	_2DDMAC, -	IIC2_ALI2, IIC2_TACKI2, IIC2_WAITI2, IIC2_DTEI2, -	IPMMU_IPMMUR, IPMMU_IPMMUR2, -	RTDMAC1_2_DEI4, RTDMAC1_2_DEI5, RTDMAC1_2_DADERR, -	__IGNORE(KEYSC) -	__IGNORE(TTI20) -	__IGNORE(MSIOF) -	IIC0_ALI0, IIC0_TACKI0, IIC0_WAITI0, IIC0_DTEI0, -	TMU_TUNI0, TMU_TUNI1, TMU_TUNI2, -	CMT0, -	TSIF0, -	__IGNORE(CMT2) -	LMB, -	__IGNORE(MSUG) -	__IGNORE(MSU_MSU, MSU_MSU2) -	__IGNORE(CTI) -	MVI3, -	__IGNORE(RWDT0) -	__IGNORE(RWDT1) -	ICB, -	PEP, -	ASA, -	__IGNORE(_2DG) -	HQE, -	JPU, -	LCDC0, -	__IGNORE(LCRC) -	RTDMAC2_1_DEI0, RTDMAC2_1_DEI1, RTDMAC2_1_DEI2, RTDMAC2_1_DEI3, -	RTDMAC2_2_DEI4, RTDMAC2_2_DEI5, RTDMAC2_2_DADERR, -	FRC, -	LCDC1, -	CSIRX, -	DSITX_DSITX0, DSITX_DSITX1, -	__IGNORE(SPU2_SPU0, SPU2_SPU1) -	__IGNORE(FSI) -	__IGNORE(FMSI) -	__IGNORE(SCUV) -	TMU1_TUNI10, TMU1_TUNI11, TMU1_TUNI12, -	TSIF2, -	CMT4, -	__IGNORE(MFIS2) -	CPORTS2R, - -	/* interrupt groups INTCS */ -	RTDMAC1_1, RTDMAC1_2, VEU, BEU, IIC0, __IGNORE(MSU) IPMMU, -	IIC2, RTDMAC2_1, RTDMAC2_2, DSITX, __IGNORE(SPU2) TMU1, -}; - -#define INTCS_INTVECT 0x0F80 -static struct intc_vect intcs_vectors[] __initdata = { -	INTCS_VECT(VEU_VEU0, 0x0700), INTCS_VECT(VEU_VEU1, 0x0720), -	INTCS_VECT(VEU_VEU2, 0x0740), INTCS_VECT(VEU_VEU3, 0x0760), -	INTCS_VECT(RTDMAC1_1_DEI0, 0x0800), INTCS_VECT(RTDMAC1_1_DEI1, 0x0820), -	INTCS_VECT(RTDMAC1_1_DEI2, 0x0840), INTCS_VECT(RTDMAC1_1_DEI3, 0x0860), -	INTCS_VECT(CEU, 0x0880), -	INTCS_VECT(BEU_BEU0, 0x08A0), -	INTCS_VECT(BEU_BEU1, 0x08C0), -	INTCS_VECT(BEU_BEU2, 0x08E0), -	__IGNORE(INTCS_VECT(MFI, 0x0900)) -	__IGNORE(INTCS_VECT(BBIF2, 0x0960)) -	INTCS_VECT(VPU, 0x0980), -	INTCS_VECT(TSIF1, 0x09A0), -	__IGNORE(INTCS_VECT(SGX540, 0x09E0)) -	INTCS_VECT(_2DDMAC, 0x0A00), -	INTCS_VECT(IIC2_ALI2, 0x0A80), INTCS_VECT(IIC2_TACKI2, 0x0AA0), -	INTCS_VECT(IIC2_WAITI2, 0x0AC0), INTCS_VECT(IIC2_DTEI2, 0x0AE0), -	INTCS_VECT(IPMMU_IPMMUR, 0x0B00), INTCS_VECT(IPMMU_IPMMUR2, 0x0B20), -	INTCS_VECT(RTDMAC1_2_DEI4, 0x0B80), -	INTCS_VECT(RTDMAC1_2_DEI5, 0x0BA0), -	INTCS_VECT(RTDMAC1_2_DADERR, 0x0BC0), -	__IGNORE(INTCS_VECT(KEYSC 0x0BE0)) -	__IGNORE(INTCS_VECT(TTI20, 0x0C80)) -	__IGNORE(INTCS_VECT(MSIOF, 0x0D20)) -	INTCS_VECT(IIC0_ALI0, 0x0E00), INTCS_VECT(IIC0_TACKI0, 0x0E20), -	INTCS_VECT(IIC0_WAITI0, 0x0E40), INTCS_VECT(IIC0_DTEI0, 0x0E60), -	INTCS_VECT(TMU_TUNI0, 0x0E80), -	INTCS_VECT(TMU_TUNI1, 0x0EA0), -	INTCS_VECT(TMU_TUNI2, 0x0EC0), -	INTCS_VECT(CMT0, 0x0F00), -	INTCS_VECT(TSIF0, 0x0F20), -	__IGNORE(INTCS_VECT(CMT2, 0x0F40)) -	INTCS_VECT(LMB, 0x0F60), -	__IGNORE(INTCS_VECT(MSUG, 0x0F80)) -	__IGNORE(INTCS_VECT(MSU_MSU, 0x0FA0)) -	__IGNORE(INTCS_VECT(MSU_MSU2, 0x0FC0)) -	__IGNORE(INTCS_VECT(CTI, 0x0400)) -	INTCS_VECT(MVI3, 0x0420), -	__IGNORE(INTCS_VECT(RWDT0, 0x0440)) -	__IGNORE(INTCS_VECT(RWDT1, 0x0460)) -	INTCS_VECT(ICB, 0x0480), -	INTCS_VECT(PEP, 0x04A0), -	INTCS_VECT(ASA, 0x04C0), -	__IGNORE(INTCS_VECT(_2DG, 0x04E0)) -	INTCS_VECT(HQE, 0x0540), -	INTCS_VECT(JPU, 0x0560), -	INTCS_VECT(LCDC0, 0x0580), -	__IGNORE(INTCS_VECT(LCRC, 0x05A0)) -	INTCS_VECT(RTDMAC2_1_DEI0, 0x1300), INTCS_VECT(RTDMAC2_1_DEI1, 0x1320), -	INTCS_VECT(RTDMAC2_1_DEI2, 0x1340), INTCS_VECT(RTDMAC2_1_DEI3, 0x1360), -	INTCS_VECT(RTDMAC2_2_DEI4, 0x1380), INTCS_VECT(RTDMAC2_2_DEI5, 0x13A0), -	INTCS_VECT(RTDMAC2_2_DADERR, 0x13C0), -	INTCS_VECT(FRC, 0x1700), -	INTCS_VECT(LCDC1, 0x1780), -	INTCS_VECT(CSIRX, 0x17A0), -	INTCS_VECT(DSITX_DSITX0, 0x17C0), INTCS_VECT(DSITX_DSITX1, 0x17E0), -	__IGNORE(INTCS_VECT(SPU2_SPU0, 0x1800)) -	__IGNORE(INTCS_VECT(SPU2_SPU1, 0x1820)) -	__IGNORE(INTCS_VECT(FSI, 0x1840)) -	__IGNORE(INTCS_VECT(FMSI, 0x1860)) -	__IGNORE(INTCS_VECT(SCUV, 0x1880)) -	INTCS_VECT(TMU1_TUNI10, 0x1900), INTCS_VECT(TMU1_TUNI11, 0x1920), -	INTCS_VECT(TMU1_TUNI12, 0x1940), -	INTCS_VECT(TSIF2, 0x1960), -	INTCS_VECT(CMT4, 0x1980), -	__IGNORE(INTCS_VECT(MFIS2, 0x1A00)) -	INTCS_VECT(CPORTS2R, 0x1A20), - -	INTC_VECT(INTCS, INTCS_INTVECT), -}; - -static struct intc_group intcs_groups[] __initdata = { -	INTC_GROUP(RTDMAC1_1, -		   RTDMAC1_1_DEI0, RTDMAC1_1_DEI1, -		   RTDMAC1_1_DEI2, RTDMAC1_1_DEI3), -	INTC_GROUP(RTDMAC1_2, -		   RTDMAC1_2_DEI4, RTDMAC1_2_DEI5, RTDMAC1_2_DADERR), -	INTC_GROUP(VEU, VEU_VEU0, VEU_VEU1, VEU_VEU2, VEU_VEU3), -	INTC_GROUP(BEU, BEU_BEU0, BEU_BEU1, BEU_BEU2), -	INTC_GROUP(IIC0, IIC0_ALI0, IIC0_TACKI0, IIC0_WAITI0, IIC0_DTEI0), -	__IGNORE(INTC_GROUP(MSU, MSU_MSU, MSU_MSU2)) -	INTC_GROUP(IPMMU, IPMMU_IPMMUR, IPMMU_IPMMUR2), -	INTC_GROUP(IIC2, IIC2_ALI2, IIC2_TACKI2, IIC2_WAITI2, IIC2_DTEI2), -	INTC_GROUP(RTDMAC2_1, -		   RTDMAC2_1_DEI0, RTDMAC2_1_DEI1, -		   RTDMAC2_1_DEI2, RTDMAC2_1_DEI3), -	INTC_GROUP(RTDMAC2_2, RTDMAC2_2_DEI4, RTDMAC2_2_DEI5, RTDMAC2_2_DADERR), -	INTC_GROUP(DSITX, DSITX_DSITX0, DSITX_DSITX1), -	__IGNORE(INTC_GROUP(SPU2, SPU2_SPU0, SPU2_SPU1)) -	INTC_GROUP(TMU1, TMU1_TUNI10, TMU1_TUNI11, TMU1_TUNI12), -}; - -static struct intc_mask_reg intcs_mask_registers[] __initdata = { -	{ 0xE6940184, 0xE69401C4, 8, /* IMR1AS / IMCR1AS  */ -	  { BEU_BEU2, BEU_BEU1, BEU_BEU0, CEU, -	    VEU_VEU3, VEU_VEU2, VEU_VEU1, VEU_VEU0 } }, -	{ 0xE6940188, 0xE69401C8, 8, /* IMR2AS / IMCR2AS */ -	  { 0, 0, 0, VPU, -	    __IGNORE0(BBIF2), 0, 0, __IGNORE0(MFI) } }, -	{ 0xE694018C, 0xE69401CC, 8, /* IMR3AS / IMCR3AS */ -	  { 0, 0, 0, _2DDMAC, -	    __IGNORE0(_2DG), ASA, PEP, ICB } }, -	{ 0xE6940190, 0xE69401D0, 8, /* IMR4AS / IMCR4AS */ -	  { 0, 0, MVI3, __IGNORE0(CTI), -	    JPU, HQE, __IGNORE0(LCRC), LCDC0 } }, -	{ 0xE6940194, 0xE69401D4, 8, /* IMR5AS / IMCR5AS */ -	  { __IGNORE0(KEYSC), RTDMAC1_2_DADERR, RTDMAC1_2_DEI5, RTDMAC1_2_DEI4, -	    RTDMAC1_1_DEI3, RTDMAC1_1_DEI2, RTDMAC1_1_DEI1, RTDMAC1_1_DEI0 } }, -	__IGNORE({ 0xE6940198, 0xE69401D8, 8, /* IMR6AS / IMCR6AS */ -	  { 0, 0, MSIOF, 0, -	    SGX540, 0, TTI20, 0 } }) -	{ 0xE694019C, 0xE69401DC, 8, /* IMR7AS / IMCR7AS */ -	  { 0, TMU_TUNI2, TMU_TUNI1, TMU_TUNI0, -	    0, 0, 0, 0 } }, -	__IGNORE({ 0xE69401A0, 0xE69401E0, 8, /* IMR8AS / IMCR8AS */ -	  { 0, 0, 0, 0, -	    0, MSU_MSU, MSU_MSU2, MSUG } }) -	{ 0xE69401A4, 0xE69401E4, 8, /* IMR9AS / IMCR9AS */ -	  { __IGNORE0(RWDT1), __IGNORE0(RWDT0), __IGNORE0(CMT2), CMT0, -	    IIC2_DTEI2, IIC2_WAITI2, IIC2_TACKI2, IIC2_ALI2 } }, -	{ 0xE69401A8, 0xE69401E8, 8, /* IMR10AS / IMCR10AS */ -	  { 0, 0, IPMMU_IPMMUR, IPMMU_IPMMUR2, -	    0, 0, 0, 0 } }, -	{ 0xE69401AC, 0xE69401EC, 8, /* IMR11AS / IMCR11AS */ -	  { IIC0_DTEI0, IIC0_WAITI0, IIC0_TACKI0, IIC0_ALI0, -	    0, TSIF1, LMB, TSIF0 } }, -	{ 0xE6950180, 0xE69501C0, 8, /* IMR0AS3 / IMCR0AS3 */ -	  { RTDMAC2_1_DEI0, RTDMAC2_1_DEI1, RTDMAC2_1_DEI2, RTDMAC2_1_DEI3, -	    RTDMAC2_2_DEI4, RTDMAC2_2_DEI5, RTDMAC2_2_DADERR, 0 } }, -	{ 0xE6950190, 0xE69501D0, 8, /* IMR4AS3 / IMCR4AS3 */ -	  { FRC, 0, 0, 0, -	    LCDC1, CSIRX, DSITX_DSITX0, DSITX_DSITX1 } }, -	__IGNORE({ 0xE6950194, 0xE69501D4, 8, /* IMR5AS3 / IMCR5AS3 */ -	  {SPU2_SPU0, SPU2_SPU1, FSI, FMSI, -	   SCUV, 0, 0, 0 } }) -	{ 0xE6950198, 0xE69501D8, 8, /* IMR6AS3 / IMCR6AS3 */ -	  { TMU1_TUNI10, TMU1_TUNI11, TMU1_TUNI12, TSIF2, -	    CMT4, 0, 0, 0 } }, -	{ 0xE695019C, 0xE69501DC, 8, /* IMR7AS3 / IMCR7AS3 */ -	  { __IGNORE0(MFIS2), CPORTS2R, 0, 0, -	    0, 0, 0, 0 } }, -	{ 0xFFD20104, 0, 16, /* INTAMASK */ -	  { 0, 0, 0, 0, 0, 0, 0, 0, -	    0, 0, 0, 0, 0, 0, 0, INTCS } } -}; - -static struct intc_prio_reg intcs_prio_registers[] __initdata = { -	/* IPRAS */ -	{ 0xFFD20000, 0, 16, 4, { __IGNORE0(CTI), MVI3, _2DDMAC, ICB } }, -	/* IPRBS */ -	{ 0xFFD20004, 0, 16, 4, { JPU, LCDC0, 0, __IGNORE0(LCRC) } }, -	/* IPRCS */ -	__IGNORE({ 0xFFD20008, 0, 16, 4, { BBIF2, 0, 0, 0 } }) -	/* IPRES */ -	{ 0xFFD20010, 0, 16, 4, { RTDMAC1_1, CEU, __IGNORE0(MFI), VPU } }, -	/* IPRFS */ -	{ 0xFFD20014, 0, 16, 4, -	  { __IGNORE0(KEYSC), RTDMAC1_2, __IGNORE0(CMT2), CMT0 } }, -	/* IPRGS */ -	{ 0xFFD20018, 0, 16, 4, { TMU_TUNI0, TMU_TUNI1, TMU_TUNI2, TSIF1 } }, -	/* IPRHS */ -	{ 0xFFD2001C, 0, 16, 4, { __IGNORE0(TTI20), 0, VEU, BEU } }, -	/* IPRIS */ -	{ 0xFFD20020, 0, 16, 4, { 0, __IGNORE0(MSIOF), TSIF0, IIC0 } }, -	/* IPRJS */ -	__IGNORE({ 0xFFD20024, 0, 16, 4, { 0, SGX540, MSUG, MSU } }) -	/* IPRKS */ -	{ 0xFFD20028, 0, 16, 4, { __IGNORE0(_2DG), ASA, LMB, PEP } }, -	/* IPRLS */ -	{ 0xFFD2002C, 0, 16, 4, { IPMMU, 0, 0, HQE } }, -	/* IPRMS */ -	{ 0xFFD20030, 0, 16, 4, -	  { IIC2, 0, __IGNORE0(RWDT1), __IGNORE0(RWDT0) } }, -	/* IPRAS3 */ -	{ 0xFFD50000, 0, 16, 4, { RTDMAC2_1, 0, 0, 0 } }, -	/* IPRBS3 */ -	{ 0xFFD50004, 0, 16, 4, { RTDMAC2_2, 0, 0, 0 } }, -	/* IPRIS3 */ -	{ 0xFFD50020, 0, 16, 4, { FRC, 0, 0, 0 } }, -	/* IPRJS3 */ -	{ 0xFFD50024, 0, 16, 4, { LCDC1, CSIRX, DSITX, 0 } }, -	/* IPRKS3 */ -	__IGNORE({ 0xFFD50028, 0, 16, 4, { SPU2, 0, FSI, FMSI } }) -	/* IPRLS3 */ -	__IGNORE({ 0xFFD5002C, 0, 16, 4, { SCUV, 0, 0, 0 } }) -	/* IPRMS3 */ -	{ 0xFFD50030, 0, 16, 4, { TMU1, 0, 0, TSIF2 } }, -	/* IPRNS3 */ -	{ 0xFFD50034, 0, 16, 4, { CMT4, 0, 0, 0 } }, -	/* IPROS3 */ -	{ 0xFFD50038, 0, 16, 4, { __IGNORE0(MFIS2), CPORTS2R, 0, 0 } }, -}; - -static struct resource intcs_resources[] __initdata = { -	[0] = { -		.start	= 0xffd20000, -		.end	= 0xffd500ff, -		.flags	= IORESOURCE_MEM, -	} -}; - -static struct intc_desc intcs_desc __initdata = { -	.name = "sh7377-intcs", -	.resource = intcs_resources, -	.num_resources = ARRAY_SIZE(intcs_resources), -	.hw = INTC_HW_DESC(intcs_vectors, intcs_groups, -			   intcs_mask_registers, intcs_prio_registers, -			   NULL, NULL), -}; - -static void intcs_demux(unsigned int irq, struct irq_desc *desc) -{ -	void __iomem *reg = (void *)irq_get_handler_data(irq); -	unsigned int evtcodeas = ioread32(reg); - -	generic_handle_irq(intcs_evt2irq(evtcodeas)); -} - -#define INTEVTSA 0xFFD20100 -void __init sh7377_init_irq(void) -{ -	void __iomem *intevtsa = ioremap_nocache(INTEVTSA, PAGE_SIZE); - -	register_intc_controller(&intca_desc); -	register_intc_controller(&intca_irq_pins_desc); -	register_intc_controller(&intcs_desc); - -	/* demux using INTEVTSA */ -	irq_set_handler_data(evt2irq(INTCS_INTVECT), (void *)intevtsa); -	irq_set_chained_handler(evt2irq(INTCS_INTVECT), intcs_demux); -} diff --git a/arch/arm/mach-shmobile/pfc-r8a7779.c b/arch/arm/mach-shmobile/pfc-r8a7779.c index cbc26ba2a0a..9513234d322 100644 --- a/arch/arm/mach-shmobile/pfc-r8a7779.c +++ b/arch/arm/mach-shmobile/pfc-r8a7779.c @@ -140,7 +140,7 @@ enum {  	FN_IP7_3_2, FN_IP7_6_4, FN_IP7_9_7, FN_IP7_12_10,  	FN_IP7_14_13, FN_IP2_7_4, FN_IP2_11_8, FN_IP2_15_12,  	FN_IP1_28_25, FN_IP2_3_0, FN_IP8_3_0, FN_IP8_7_4, -	FN_IP8_11_8, FN_IP8_15_12, FN_PENC0, FN_PENC1, +	FN_IP8_11_8, FN_IP8_15_12, FN_USB_PENC0, FN_USB_PENC1,  	FN_IP0_2_0, FN_IP8_17_16, FN_IP8_18, FN_IP8_19,  	/* GPSR5 */ @@ -176,7 +176,7 @@ enum {  	FN_A0, FN_SD1_DAT3, FN_MMC0_D3, FN_FD3,  	FN_BS, FN_SD1_DAT2, FN_MMC0_D2, FN_FD2,  	FN_ATADIR0, FN_SDSELF, FN_HCTS1, FN_TX4_C, -	FN_PENC2, FN_SCK0, FN_PWM1, FN_PWMFSW0, +	FN_USB_PENC2, FN_SCK0, FN_PWM1, FN_PWMFSW0,  	FN_SCIF_CLK, FN_TCLK0_C,  	/* IPSR1 */ @@ -447,7 +447,7 @@ enum {  	A0_MARK, SD1_DAT3_MARK, MMC0_D3_MARK, FD3_MARK,  	BS_MARK, SD1_DAT2_MARK, MMC0_D2_MARK, FD2_MARK,  	ATADIR0_MARK, SDSELF_MARK, HCTS1_MARK, TX4_C_MARK, -	PENC2_MARK, SCK0_MARK, PWM1_MARK, PWMFSW0_MARK, +	USB_PENC2_MARK, SCK0_MARK, PWM1_MARK, PWMFSW0_MARK,  	SCIF_CLK_MARK, TCLK0_C_MARK,  	EX_CS0_MARK, RX3_C_IRDA_RX_C_MARK, MMC0_D6_MARK, @@ -658,7 +658,7 @@ static pinmux_enum_t pinmux_data[] = {  	PINMUX_DATA(A18_MARK, FN_A18),  	PINMUX_DATA(A19_MARK, FN_A19), -	PINMUX_IPSR_DATA(IP0_2_0, PENC2), +	PINMUX_IPSR_DATA(IP0_2_0, USB_PENC2),  	PINMUX_IPSR_MODSEL_DATA(IP0_2_0, SCK0, SEL_SCIF0_0),  	PINMUX_IPSR_DATA(IP0_2_0, PWM1),  	PINMUX_IPSR_MODSEL_DATA(IP0_2_0, PWMFSW0, SEL_PWMFSW_0), @@ -1456,7 +1456,7 @@ static struct pinmux_gpio pinmux_gpios[] = {  	GPIO_FN(A19),  	/* IPSR0 */ -	GPIO_FN(PENC2), GPIO_FN(SCK0), GPIO_FN(PWM1), GPIO_FN(PWMFSW0), +	GPIO_FN(USB_PENC2), GPIO_FN(SCK0), GPIO_FN(PWM1), GPIO_FN(PWMFSW0),  	GPIO_FN(SCIF_CLK), GPIO_FN(TCLK0_C), GPIO_FN(BS), GPIO_FN(SD1_DAT2),  	GPIO_FN(MMC0_D2), GPIO_FN(FD2), GPIO_FN(ATADIR0), GPIO_FN(SDSELF),  	GPIO_FN(HCTS1), GPIO_FN(TX4_C), GPIO_FN(A0), GPIO_FN(SD1_DAT3), @@ -1865,8 +1865,8 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {  		GP_4_30_FN, FN_IP8_18,  		GP_4_29_FN, FN_IP8_17_16,  		GP_4_28_FN, FN_IP0_2_0, -		GP_4_27_FN, FN_PENC1, -		GP_4_26_FN, FN_PENC0, +		GP_4_27_FN, FN_USB_PENC1, +		GP_4_26_FN, FN_USB_PENC0,  		GP_4_25_FN, FN_IP8_15_12,  		GP_4_24_FN, FN_IP8_11_8,  		GP_4_23_FN, FN_IP8_7_4, @@ -1981,7 +1981,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {  		FN_BS, FN_SD1_DAT2, FN_MMC0_D2, FN_FD2,  		FN_ATADIR0, FN_SDSELF, FN_HCTS1, FN_TX4_C,  		/* IP0_2_0 [3] */ -		FN_PENC2, FN_SCK0, FN_PWM1, FN_PWMFSW0, +		FN_USB_PENC2, FN_SCK0, FN_PWM1, FN_PWMFSW0,  		FN_SCIF_CLK, FN_TCLK0_C, 0, 0 }  	},  	{ PINMUX_CFG_REG_VAR("IPSR1", 0xfffc0024, 32, diff --git a/arch/arm/mach-shmobile/pfc-sh7367.c b/arch/arm/mach-shmobile/pfc-sh7367.c deleted file mode 100644 index c0c137f3905..00000000000 --- a/arch/arm/mach-shmobile/pfc-sh7367.c +++ /dev/null @@ -1,1727 +0,0 @@ -/* - * sh7367 processor support - PFC hardware block - * - * Copyright (C) 2010  Magnus Damm - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/sh_pfc.h> -#include <mach/sh7367.h> - -#define CPU_ALL_PORT(fn, pfx, sfx)				\ -	PORT_10(fn, pfx, sfx), PORT_90(fn, pfx, sfx),		\ -	PORT_10(fn, pfx##10, sfx), PORT_90(fn, pfx##1, sfx),	\ -	PORT_10(fn, pfx##20, sfx), PORT_10(fn, pfx##21, sfx),	\ -	PORT_10(fn, pfx##22, sfx), PORT_10(fn, pfx##23, sfx),	\ -	PORT_10(fn, pfx##24, sfx), PORT_10(fn, pfx##25, sfx),	\ -	PORT_10(fn, pfx##26, sfx), PORT_1(fn, pfx##270, sfx),	\ -	PORT_1(fn, pfx##271, sfx), PORT_1(fn, pfx##272, sfx) - -enum { -	PINMUX_RESERVED = 0, - -	PINMUX_DATA_BEGIN, -	PORT_ALL(DATA), /* PORT0_DATA -> PORT272_DATA */ -	PINMUX_DATA_END, - -	PINMUX_INPUT_BEGIN, -	PORT_ALL(IN), /* PORT0_IN -> PORT272_IN */ -	PINMUX_INPUT_END, - -	PINMUX_INPUT_PULLUP_BEGIN, -	PORT_ALL(IN_PU), /* PORT0_IN_PU -> PORT272_IN_PU */ -	PINMUX_INPUT_PULLUP_END, - -	PINMUX_INPUT_PULLDOWN_BEGIN, -	PORT_ALL(IN_PD), /* PORT0_IN_PD -> PORT272_IN_PD */ -	PINMUX_INPUT_PULLDOWN_END, - -	PINMUX_OUTPUT_BEGIN, -	PORT_ALL(OUT), /* PORT0_OUT -> PORT272_OUT */ -	PINMUX_OUTPUT_END, - -	PINMUX_FUNCTION_BEGIN, -	PORT_ALL(FN_IN), /* PORT0_FN_IN -> PORT272_FN_IN */ -	PORT_ALL(FN_OUT), /* PORT0_FN_OUT -> PORT272_FN_OUT */ -	PORT_ALL(FN0), /* PORT0_FN0 -> PORT272_FN0 */ -	PORT_ALL(FN1), /* PORT0_FN1 -> PORT272_FN1 */ -	PORT_ALL(FN2), /* PORT0_FN2 -> PORT272_FN2 */ -	PORT_ALL(FN3), /* PORT0_FN3 -> PORT272_FN3 */ -	PORT_ALL(FN4), /* PORT0_FN4 -> PORT272_FN4 */ -	PORT_ALL(FN5), /* PORT0_FN5 -> PORT272_FN5 */ -	PORT_ALL(FN6), /* PORT0_FN6 -> PORT272_FN6 */ -	PORT_ALL(FN7), /* PORT0_FN7 -> PORT272_FN7 */ - -	MSELBCR_MSEL2_1, MSELBCR_MSEL2_0, -	PINMUX_FUNCTION_END, - -	PINMUX_MARK_BEGIN, -	/* Special Pull-up / Pull-down Functions */ -	PORT48_KEYIN0_PU_MARK, PORT49_KEYIN1_PU_MARK, -	PORT50_KEYIN2_PU_MARK, PORT55_KEYIN3_PU_MARK, -	PORT56_KEYIN4_PU_MARK, PORT57_KEYIN5_PU_MARK, -	PORT58_KEYIN6_PU_MARK, - -	/* 49-1 */ -	VBUS0_MARK, CPORT0_MARK, CPORT1_MARK, CPORT2_MARK, -	CPORT3_MARK, CPORT4_MARK, CPORT5_MARK, CPORT6_MARK, -	CPORT7_MARK, CPORT8_MARK, CPORT9_MARK, CPORT10_MARK, -	CPORT11_MARK, SIN2_MARK, CPORT12_MARK, XCTS2_MARK, -	CPORT13_MARK, RFSPO4_MARK, CPORT14_MARK, RFSPO5_MARK, -	CPORT15_MARK, CPORT16_MARK, CPORT17_MARK, SOUT2_MARK, -	CPORT18_MARK, XRTS2_MARK, CPORT19_MARK, CPORT20_MARK, -	RFSPO6_MARK, CPORT21_MARK, STATUS0_MARK, CPORT22_MARK, -	STATUS1_MARK, CPORT23_MARK, STATUS2_MARK, RFSPO7_MARK, -	MPORT0_MARK, MPORT1_MARK, B_SYNLD1_MARK, B_SYNLD2_MARK, -	XMAINPS_MARK, XDIVPS_MARK, XIDRST_MARK, IDCLK_MARK, -	IDIO_MARK, SOUT1_MARK, SCIFA4_TXD_MARK, -	M02_BERDAT_MARK, SIN1_MARK, SCIFA4_RXD_MARK, XWUP_MARK, -	XRTS1_MARK, SCIFA4_RTS_MARK, M03_BERCLK_MARK, -	XCTS1_MARK, SCIFA4_CTS_MARK, - -	/* 49-2 */ -	HSU_IQ_AGC6_MARK, MFG2_IN2_MARK, MSIOF2_MCK0_MARK, -	HSU_IQ_AGC5_MARK, MFG2_IN1_MARK, MSIOF2_MCK1_MARK, -	HSU_IQ_AGC4_MARK, MSIOF2_RSYNC_MARK, -	HSU_IQ_AGC3_MARK, MFG2_OUT1_MARK, MSIOF2_RSCK_MARK, -	HSU_IQ_AGC2_MARK, PORT42_KEYOUT0_MARK, -	HSU_IQ_AGC1_MARK, PORT43_KEYOUT1_MARK, -	HSU_IQ_AGC0_MARK, PORT44_KEYOUT2_MARK, -	HSU_IQ_AGC_ST_MARK, PORT45_KEYOUT3_MARK, -	HSU_IQ_PDO_MARK, PORT46_KEYOUT4_MARK, -	HSU_IQ_PYO_MARK, PORT47_KEYOUT5_MARK, -	HSU_EN_TXMUX_G3MO_MARK, PORT48_KEYIN0_MARK, -	HSU_I_TXMUX_G3MO_MARK, PORT49_KEYIN1_MARK, -	HSU_Q_TXMUX_G3MO_MARK, PORT50_KEYIN2_MARK, -	HSU_SYO_MARK, PORT51_MSIOF2_TSYNC_MARK, -	HSU_SDO_MARK, PORT52_MSIOF2_TSCK_MARK, -	HSU_TGTTI_G3MO_MARK, PORT53_MSIOF2_TXD_MARK, -	B_TIME_STAMP_MARK, PORT54_MSIOF2_RXD_MARK, -	HSU_SDI_MARK, PORT55_KEYIN3_MARK, -	HSU_SCO_MARK, PORT56_KEYIN4_MARK, -	HSU_DREQ_MARK, PORT57_KEYIN5_MARK, -	HSU_DACK_MARK, PORT58_KEYIN6_MARK, -	HSU_CLK61M_MARK, PORT59_MSIOF2_SS1_MARK, -	HSU_XRST_MARK, PORT60_MSIOF2_SS2_MARK, -	PCMCLKO_MARK, SYNC8KO_MARK, DNPCM_A_MARK, UPPCM_A_MARK, -	XTALB1L_MARK, -	GPS_AGC1_MARK, SCIFA0_RTS_MARK, -	GPS_AGC2_MARK, SCIFA0_SCK_MARK, -	GPS_AGC3_MARK, SCIFA0_TXD_MARK, -	GPS_AGC4_MARK, SCIFA0_RXD_MARK, -	GPS_PWRD_MARK, SCIFA0_CTS_MARK, -	GPS_IM_MARK, GPS_IS_MARK, GPS_QM_MARK, GPS_QS_MARK, -	SIUBOMC_MARK, TPU2TO0_MARK, -	SIUCKB_MARK, TPU2TO1_MARK, -	SIUBOLR_MARK, BBIF2_TSYNC_MARK, TPU2TO2_MARK, -	SIUBOBT_MARK, BBIF2_TSCK_MARK, TPU2TO3_MARK, -	SIUBOSLD_MARK, BBIF2_TXD_MARK, TPU3TO0_MARK, -	SIUBILR_MARK, TPU3TO1_MARK, -	SIUBIBT_MARK, TPU3TO2_MARK, -	SIUBISLD_MARK, TPU3TO3_MARK, -	NMI_MARK, TPU4TO0_MARK, -	DNPCM_M_MARK, TPU4TO1_MARK, TPU4TO2_MARK, TPU4TO3_MARK, -	IRQ_TMPB_MARK, -	PWEN_MARK, MFG1_OUT1_MARK, -	OVCN_MARK, MFG1_IN1_MARK, -	OVCN2_MARK, MFG1_IN2_MARK, - -	/* 49-3 */ -	RFSPO1_MARK, RFSPO2_MARK, RFSPO3_MARK, PORT93_VIO_CKO2_MARK, -	USBTERM_MARK, EXTLP_MARK, IDIN_MARK, -	SCIFA5_CTS_MARK, MFG0_IN1_MARK, -	SCIFA5_RTS_MARK, MFG0_IN2_MARK, -	SCIFA5_RXD_MARK, -	SCIFA5_TXD_MARK, -	SCIFA5_SCK_MARK, MFG0_OUT1_MARK, -	A0_EA0_MARK, BS_MARK, -	A14_EA14_MARK, PORT102_KEYOUT0_MARK, -	A15_EA15_MARK, PORT103_KEYOUT1_MARK, DV_CLKOL_MARK, -	A16_EA16_MARK, PORT104_KEYOUT2_MARK, -	DV_VSYNCL_MARK, MSIOF0_SS1_MARK, -	A17_EA17_MARK, PORT105_KEYOUT3_MARK, -	DV_HSYNCL_MARK, MSIOF0_TSYNC_MARK, -	A18_EA18_MARK, PORT106_KEYOUT4_MARK, -	DV_DL0_MARK, MSIOF0_TSCK_MARK, -	A19_EA19_MARK, PORT107_KEYOUT5_MARK, -	DV_DL1_MARK, MSIOF0_TXD_MARK, -	A20_EA20_MARK, PORT108_KEYIN0_MARK, -	DV_DL2_MARK, MSIOF0_RSCK_MARK, -	A21_EA21_MARK, PORT109_KEYIN1_MARK, -	DV_DL3_MARK, MSIOF0_RSYNC_MARK, -	A22_EA22_MARK, PORT110_KEYIN2_MARK, -	DV_DL4_MARK, MSIOF0_MCK0_MARK, -	A23_EA23_MARK, PORT111_KEYIN3_MARK, -	DV_DL5_MARK, MSIOF0_MCK1_MARK, -	A24_EA24_MARK, PORT112_KEYIN4_MARK, -	DV_DL6_MARK, MSIOF0_RXD_MARK, -	A25_EA25_MARK, PORT113_KEYIN5_MARK, -	DV_DL7_MARK, MSIOF0_SS2_MARK, -	A26_MARK, PORT113_KEYIN6_MARK, DV_CLKIL_MARK, -	D0_ED0_NAF0_MARK, D1_ED1_NAF1_MARK, D2_ED2_NAF2_MARK, -	D3_ED3_NAF3_MARK, D4_ED4_NAF4_MARK, D5_ED5_NAF5_MARK, -	D6_ED6_NAF6_MARK, D7_ED7_NAF7_MARK, D8_ED8_NAF8_MARK, -	D9_ED9_NAF9_MARK, D10_ED10_NAF10_MARK, D11_ED11_NAF11_MARK, -	D12_ED12_NAF12_MARK, D13_ED13_NAF13_MARK, -	D14_ED14_NAF14_MARK, D15_ED15_NAF15_MARK, -	CS4_MARK, CS5A_MARK, CS5B_MARK, FCE1_MARK, -	CS6B_MARK, XCS2_MARK, FCE0_MARK, CS6A_MARK, -	DACK0_MARK, WAIT_MARK, DREQ0_MARK, RD_XRD_MARK, -	A27_MARK, RDWR_XWE_MARK, WE0_XWR0_FWE_MARK, -	WE1_XWR1_MARK, FRB_MARK, CKO_MARK, -	NBRSTOUT_MARK, NBRST_MARK, - -	/* 49-4 */ -	RFSPO0_MARK, PORT146_VIO_CKO2_MARK, TSTMD_MARK, -	VIO_VD_MARK, VIO_HD_MARK, -	VIO_D0_MARK, VIO_D1_MARK, VIO_D2_MARK, -	VIO_D3_MARK, VIO_D4_MARK, VIO_D5_MARK, -	VIO_D6_MARK, VIO_D7_MARK, VIO_D8_MARK, -	VIO_D9_MARK, VIO_D10_MARK, VIO_D11_MARK, -	VIO_D12_MARK, VIO_D13_MARK, VIO_D14_MARK, -	VIO_D15_MARK, VIO_CLK_MARK, VIO_FIELD_MARK, -	VIO_CKO_MARK, -	MFG3_IN1_MARK, MFG3_IN2_MARK, -	M9_SLCD_A01_MARK, MFG3_OUT1_MARK, TPU0TO0_MARK, -	M10_SLCD_CK1_MARK, MFG4_IN1_MARK, TPU0TO1_MARK, -	M11_SLCD_SO1_MARK, MFG4_IN2_MARK, TPU0TO2_MARK, -	M12_SLCD_CE1_MARK, MFG4_OUT1_MARK, TPU0TO3_MARK, -	LCDD0_MARK, PORT175_KEYOUT0_MARK, DV_D0_MARK, -	SIUCKA_MARK, MFG0_OUT2_MARK, -	LCDD1_MARK, PORT176_KEYOUT1_MARK, DV_D1_MARK, -	SIUAOLR_MARK, BBIF2_TSYNC1_MARK, -	LCDD2_MARK, PORT177_KEYOUT2_MARK, DV_D2_MARK, -	SIUAOBT_MARK, BBIF2_TSCK1_MARK, -	LCDD3_MARK, PORT178_KEYOUT3_MARK, DV_D3_MARK, -	SIUAOSLD_MARK, BBIF2_TXD1_MARK, -	LCDD4_MARK, PORT179_KEYOUT4_MARK, DV_D4_MARK, -	SIUAISPD_MARK, MFG1_OUT2_MARK, -	LCDD5_MARK, PORT180_KEYOUT5_MARK, DV_D5_MARK, -	SIUAILR_MARK, MFG2_OUT2_MARK, -	LCDD6_MARK, DV_D6_MARK, -	SIUAIBT_MARK, MFG3_OUT2_MARK, XWR2_MARK, -	LCDD7_MARK, DV_D7_MARK, -	SIUAISLD_MARK, MFG4_OUT2_MARK, XWR3_MARK, -	LCDD8_MARK, DV_D8_MARK, D16_MARK, ED16_MARK, -	LCDD9_MARK, DV_D9_MARK, D17_MARK, ED17_MARK, -	LCDD10_MARK, DV_D10_MARK, D18_MARK, ED18_MARK, -	LCDD11_MARK, DV_D11_MARK, D19_MARK, ED19_MARK, -	LCDD12_MARK, DV_D12_MARK, D20_MARK, ED20_MARK, -	LCDD13_MARK, DV_D13_MARK, D21_MARK, ED21_MARK, -	LCDD14_MARK, DV_D14_MARK, D22_MARK, ED22_MARK, -	LCDD15_MARK, DV_D15_MARK, D23_MARK, ED23_MARK, -	LCDD16_MARK, DV_HSYNC_MARK, D24_MARK, ED24_MARK, -	LCDD17_MARK, DV_VSYNC_MARK, D25_MARK, ED25_MARK, -	LCDD18_MARK, DREQ2_MARK, MSIOF0L_TSCK_MARK, -	D26_MARK, ED26_MARK, -	LCDD19_MARK, MSIOF0L_TSYNC_MARK, -	D27_MARK, ED27_MARK, -	LCDD20_MARK, TS_SPSYNC1_MARK, MSIOF0L_MCK0_MARK, -	D28_MARK, ED28_MARK, -	LCDD21_MARK, TS_SDAT1_MARK, MSIOF0L_MCK1_MARK, -	D29_MARK, ED29_MARK, -	LCDD22_MARK, TS_SDEN1_MARK, MSIOF0L_SS1_MARK, -	D30_MARK, ED30_MARK, -	LCDD23_MARK, TS_SCK1_MARK, MSIOF0L_SS2_MARK, -	D31_MARK, ED31_MARK, -	LCDDCK_MARK, LCDWR_MARK, DV_CKO_MARK, SIUAOSPD_MARK, -	LCDRD_MARK, DACK2_MARK, MSIOF0L_RSYNC_MARK, - -	/* 49-5 */ -	LCDHSYN_MARK, LCDCS_MARK, LCDCS2_MARK, DACK3_MARK, -	LCDDISP_MARK, LCDRS_MARK, DREQ3_MARK, MSIOF0L_RSCK_MARK, -	LCDCSYN_MARK, LCDCSYN2_MARK, DV_CKI_MARK, -	LCDLCLK_MARK, DREQ1_MARK, MSIOF0L_RXD_MARK, -	LCDDON_MARK, LCDDON2_MARK, DACK1_MARK, MSIOF0L_TXD_MARK, -	VIO_DR0_MARK, VIO_DR1_MARK, VIO_DR2_MARK, VIO_DR3_MARK, -	VIO_DR4_MARK, VIO_DR5_MARK, VIO_DR6_MARK, VIO_DR7_MARK, -	VIO_VDR_MARK, VIO_HDR_MARK, -	VIO_CLKR_MARK, VIO_CKOR_MARK, -	SCIFA1_TXD_MARK, GPS_PGFA0_MARK, -	SCIFA1_SCK_MARK, GPS_PGFA1_MARK, -	SCIFA1_RTS_MARK, GPS_EPPSINMON_MARK, -	SCIFA1_RXD_MARK, SCIFA1_CTS_MARK, -	MSIOF1_TXD_MARK, SCIFA1_TXD2_MARK, GPS_TXD_MARK, -	MSIOF1_TSYNC_MARK, SCIFA1_CTS2_MARK, I2C_SDA2_MARK, -	MSIOF1_TSCK_MARK, SCIFA1_SCK2_MARK, -	MSIOF1_RXD_MARK, SCIFA1_RXD2_MARK, GPS_RXD_MARK, -	MSIOF1_RSCK_MARK, SCIFA1_RTS2_MARK, -	MSIOF1_RSYNC_MARK, I2C_SCL2_MARK, -	MSIOF1_MCK0_MARK, MSIOF1_MCK1_MARK, -	MSIOF1_SS1_MARK, EDBGREQ3_MARK, -	MSIOF1_SS2_MARK, -	PORT236_IROUT_MARK, IRDA_OUT_MARK, -	IRDA_IN_MARK, IRDA_FIRSEL_MARK, -	TPU1TO0_MARK, TS_SPSYNC3_MARK, -	TPU1TO1_MARK, TS_SDAT3_MARK, -	TPU1TO2_MARK, TS_SDEN3_MARK, PORT241_MSIOF2_SS1_MARK, -	TPU1TO3_MARK, PORT242_MSIOF2_TSCK_MARK, -	M13_BSW_MARK, PORT243_MSIOF2_TSYNC_MARK, -	M14_GSW_MARK, PORT244_MSIOF2_TXD_MARK, -	PORT245_IROUT_MARK, M15_RSW_MARK, -	SOUT3_MARK, SCIFA2_TXD1_MARK, -	SIN3_MARK, SCIFA2_RXD1_MARK, -	XRTS3_MARK, SCIFA2_RTS1_MARK, PORT248_MSIOF2_SS2_MARK, -	XCTS3_MARK, SCIFA2_CTS1_MARK, PORT249_MSIOF2_RXD_MARK, -	DINT_MARK, SCIFA2_SCK1_MARK, TS_SCK3_MARK, -	SDHICLK0_MARK, TCK2_MARK, -	SDHICD0_MARK, -	SDHID0_0_MARK, TMS2_MARK, -	SDHID0_1_MARK, TDO2_MARK, -	SDHID0_2_MARK, TDI2_MARK, -	SDHID0_3_MARK, RTCK2_MARK, - -	/* 49-6 */ -	SDHICMD0_MARK, TRST2_MARK, -	SDHIWP0_MARK, EDBGREQ2_MARK, -	SDHICLK1_MARK, TCK3_MARK, -	SDHID1_0_MARK, M11_SLCD_SO2_MARK, -	TS_SPSYNC2_MARK, TMS3_MARK, -	SDHID1_1_MARK, M9_SLCD_AO2_MARK, -	TS_SDAT2_MARK, TDO3_MARK, -	SDHID1_2_MARK, M10_SLCD_CK2_MARK, -	TS_SDEN2_MARK, TDI3_MARK, -	SDHID1_3_MARK, M12_SLCD_CE2_MARK, -	TS_SCK2_MARK, RTCK3_MARK, -	SDHICMD1_MARK, TRST3_MARK, -	SDHICLK2_MARK, SCIFB_SCK_MARK, -	SDHID2_0_MARK, SCIFB_TXD_MARK, -	SDHID2_1_MARK, SCIFB_CTS_MARK, -	SDHID2_2_MARK, SCIFB_RXD_MARK, -	SDHID2_3_MARK, SCIFB_RTS_MARK, -	SDHICMD2_MARK, -	RESETOUTS_MARK, -	DIVLOCK_MARK, -	PINMUX_MARK_END, -}; - -static pinmux_enum_t pinmux_data[] = { - -	/* specify valid pin states for each pin in GPIO mode */ - -	/* 49-1 (GPIO) */ -	PORT_DATA_I_PD(0), -	PORT_DATA_I_PU(1), PORT_DATA_I_PU(2), PORT_DATA_I_PU(3), -	PORT_DATA_I_PU(4), PORT_DATA_I_PU(5), PORT_DATA_I_PU(6), -	PORT_DATA_I_PU(7), PORT_DATA_I_PU(8), PORT_DATA_I_PU(9), -	PORT_DATA_I_PU(10), PORT_DATA_I_PU(11), PORT_DATA_I_PU(12), -	PORT_DATA_I_PU(13), -	PORT_DATA_IO_PU_PD(14), PORT_DATA_IO_PU_PD(15), -	PORT_DATA_O(16), PORT_DATA_O(17), PORT_DATA_O(18), PORT_DATA_O(19), -	PORT_DATA_O(20), PORT_DATA_O(21), PORT_DATA_O(22), PORT_DATA_O(23), -	PORT_DATA_O(24), PORT_DATA_O(25), PORT_DATA_O(26), -	PORT_DATA_I_PD(27), PORT_DATA_I_PD(28), -	PORT_DATA_O(29), PORT_DATA_O(30), PORT_DATA_O(31), PORT_DATA_O(32), -	PORT_DATA_IO_PU(33), -	PORT_DATA_O(34), -	PORT_DATA_I_PU(35), -	PORT_DATA_O(36), -	PORT_DATA_I_PU_PD(37), - -	/* 49-2 (GPIO) */ -	PORT_DATA_IO_PU_PD(38), -	PORT_DATA_IO_PD(39), PORT_DATA_IO_PD(40), PORT_DATA_IO_PD(41), -	PORT_DATA_O(42), PORT_DATA_O(43), PORT_DATA_O(44), PORT_DATA_O(45), -	PORT_DATA_O(46), PORT_DATA_O(47), -	PORT_DATA_I_PU_PD(48), PORT_DATA_I_PU_PD(49), PORT_DATA_I_PU_PD(50), -	PORT_DATA_IO_PD(51), PORT_DATA_IO_PD(52), -	PORT_DATA_O(53), -	PORT_DATA_IO_PD(54), -	PORT_DATA_I_PU_PD(55), -	PORT_DATA_IO_PU_PD(56), -	PORT_DATA_I_PU_PD(57), -	PORT_DATA_IO_PU_PD(58), -	PORT_DATA_O(59), PORT_DATA_O(60), PORT_DATA_O(61), PORT_DATA_O(62), -	PORT_DATA_O(63), -	PORT_DATA_I_PU(64), -	PORT_DATA_O(65), PORT_DATA_O(66), PORT_DATA_O(67), PORT_DATA_O(68), -	PORT_DATA_IO_PD(69), PORT_DATA_IO_PD(70), -	PORT_DATA_I_PD(71), PORT_DATA_I_PD(72), PORT_DATA_I_PD(73), -	PORT_DATA_I_PD(74), -	PORT_DATA_IO_PU_PD(75), PORT_DATA_IO_PU_PD(76), -	PORT_DATA_IO_PD(77), PORT_DATA_IO_PD(78), -	PORT_DATA_O(79), -	PORT_DATA_IO_PD(80), PORT_DATA_IO_PD(81), PORT_DATA_IO_PD(82), -	PORT_DATA_IO_PU_PD(83), PORT_DATA_IO_PU_PD(84), -	PORT_DATA_IO_PU_PD(85), PORT_DATA_IO_PU_PD(86), -	PORT_DATA_I_PD(87), -	PORT_DATA_IO_PU_PD(88), -	PORT_DATA_I_PU_PD(89), PORT_DATA_I_PU_PD(90), - -	/* 49-3 (GPIO) */ -	PORT_DATA_O(91), PORT_DATA_O(92), PORT_DATA_O(93), PORT_DATA_O(94), -	PORT_DATA_I_PU_PD(95), -	PORT_DATA_IO_PU_PD(96), PORT_DATA_IO_PU_PD(97), PORT_DATA_IO_PU_PD(98), -	PORT_DATA_IO_PU_PD(99),	PORT_DATA_IO_PU_PD(100), -	PORT_DATA_IO(101), PORT_DATA_IO(102), PORT_DATA_IO(103), -	PORT_DATA_IO_PD(104), PORT_DATA_IO_PD(105), PORT_DATA_IO_PD(106), -	PORT_DATA_IO_PD(107), -	PORT_DATA_IO_PU_PD(108), PORT_DATA_IO_PU_PD(109), -	PORT_DATA_IO_PU_PD(110), PORT_DATA_IO_PU_PD(111), -	PORT_DATA_IO_PU_PD(112), PORT_DATA_IO_PU_PD(113), -	PORT_DATA_IO_PU_PD(114), -	PORT_DATA_IO_PU(115), PORT_DATA_IO_PU(116), PORT_DATA_IO_PU(117), -	PORT_DATA_IO_PU(118), PORT_DATA_IO_PU(119), PORT_DATA_IO_PU(120), -	PORT_DATA_IO_PU(121), PORT_DATA_IO_PU(122), PORT_DATA_IO_PU(123), -	PORT_DATA_IO_PU(124), PORT_DATA_IO_PU(125), PORT_DATA_IO_PU(126), -	PORT_DATA_IO_PU(127), PORT_DATA_IO_PU(128), PORT_DATA_IO_PU(129), -	PORT_DATA_IO_PU(130), -	PORT_DATA_O(131), PORT_DATA_O(132), PORT_DATA_O(133), -	PORT_DATA_IO_PU(134), -	PORT_DATA_O(135), PORT_DATA_O(136), -	PORT_DATA_I_PU_PD(137), -	PORT_DATA_IO(138), -	PORT_DATA_IO_PU_PD(139), -	PORT_DATA_IO(140), PORT_DATA_IO(141), -	PORT_DATA_I_PU(142), -	PORT_DATA_O(143), PORT_DATA_O(144), -	PORT_DATA_I_PU(145), - -	/* 49-4 (GPIO) */ -	PORT_DATA_O(146), -	PORT_DATA_I_PU_PD(147), -	PORT_DATA_I_PD(148), PORT_DATA_I_PD(149), -	PORT_DATA_IO_PD(150), PORT_DATA_IO_PD(151), PORT_DATA_IO_PD(152), -	PORT_DATA_IO_PD(153), PORT_DATA_IO_PD(154), PORT_DATA_IO_PD(155), -	PORT_DATA_IO_PD(156), PORT_DATA_IO_PD(157), PORT_DATA_IO_PD(158), -	PORT_DATA_IO_PD(159), PORT_DATA_IO_PD(160), PORT_DATA_IO_PD(161), -	PORT_DATA_IO_PD(162), PORT_DATA_IO_PD(163), PORT_DATA_IO_PD(164), -	PORT_DATA_IO_PD(165), PORT_DATA_IO_PD(166), -	PORT_DATA_IO_PU_PD(167), -	PORT_DATA_O(168), -	PORT_DATA_I_PD(169), PORT_DATA_I_PD(170), -	PORT_DATA_O(171), -	PORT_DATA_IO_PD(172), PORT_DATA_IO_PD(173), -	PORT_DATA_O(174), -	PORT_DATA_IO_PD(175), PORT_DATA_IO_PD(176), PORT_DATA_IO_PD(177), -	PORT_DATA_IO_PD(178), PORT_DATA_IO_PD(179), PORT_DATA_IO_PD(180), -	PORT_DATA_IO_PD(181), PORT_DATA_IO_PD(182), PORT_DATA_IO_PD(183), -	PORT_DATA_IO_PD(184), PORT_DATA_IO_PD(185), PORT_DATA_IO_PD(186), -	PORT_DATA_IO_PD(187), PORT_DATA_IO_PD(188), PORT_DATA_IO_PD(189), -	PORT_DATA_IO_PD(190), PORT_DATA_IO_PD(191), PORT_DATA_IO_PD(192), -	PORT_DATA_IO_PD(193), PORT_DATA_IO_PD(194), PORT_DATA_IO_PD(195), -	PORT_DATA_IO_PD(196), PORT_DATA_IO_PD(197), PORT_DATA_IO_PD(198), -	PORT_DATA_O(199), -	PORT_DATA_IO_PD(200), - -	/* 49-5 (GPIO) */ -	PORT_DATA_O(201), -	PORT_DATA_IO_PD(202), PORT_DATA_IO_PD(203), -	PORT_DATA_I(204), -	PORT_DATA_O(205), -	PORT_DATA_IO_PD(206), PORT_DATA_IO_PD(207), PORT_DATA_IO_PD(208), -	PORT_DATA_IO_PD(209), PORT_DATA_IO_PD(210), PORT_DATA_IO_PD(211), -	PORT_DATA_IO_PD(212), PORT_DATA_IO_PD(213), PORT_DATA_IO_PD(214), -	PORT_DATA_IO_PD(215), PORT_DATA_IO_PD(216), -	PORT_DATA_O(217), -	PORT_DATA_I_PU_PD(218), PORT_DATA_I_PU_PD(219), -	PORT_DATA_O(220), PORT_DATA_O(221), PORT_DATA_O(222), -	PORT_DATA_I_PD(223), -	PORT_DATA_I_PU_PD(224), -	PORT_DATA_O(225), -	PORT_DATA_IO_PD(226), -	PORT_DATA_IO_PU_PD(227), -	PORT_DATA_I_PD(228), -	PORT_DATA_IO_PD(229), PORT_DATA_IO_PD(230), -	PORT_DATA_I_PU_PD(231), PORT_DATA_I_PU_PD(232), -	PORT_DATA_IO_PU_PD(233), PORT_DATA_IO_PU_PD(234), -	PORT_DATA_I_PU_PD(235), -	PORT_DATA_O(236), -	PORT_DATA_I_PD(237), -	PORT_DATA_IO_PU_PD(238), PORT_DATA_IO_PU_PD(239), -	PORT_DATA_IO_PD(240), PORT_DATA_IO_PD(241), -	PORT_DATA_IO_PD(242), PORT_DATA_IO_PD(243), -	PORT_DATA_O(244), -	PORT_DATA_IO_PU_PD(245), -	PORT_DATA_O(246), -	PORT_DATA_I_PD(247), -	PORT_DATA_IO_PU_PD(248), -	PORT_DATA_I_PU_PD(249), -	PORT_DATA_IO_PD(250), PORT_DATA_IO_PD(251), -	PORT_DATA_IO_PU_PD(252), PORT_DATA_IO_PU_PD(253), -	PORT_DATA_IO_PU_PD(254), PORT_DATA_IO_PU_PD(255), -	PORT_DATA_IO_PU_PD(256), - -	/* 49-6 (GPIO) */ -	PORT_DATA_IO_PU_PD(257), PORT_DATA_IO_PU_PD(258), -	PORT_DATA_IO_PD(259), -	PORT_DATA_IO_PU(260), PORT_DATA_IO_PU(261), PORT_DATA_IO_PU(262), -	PORT_DATA_IO_PU(263), PORT_DATA_IO_PU(264), -	PORT_DATA_O(265), -	PORT_DATA_IO_PU(266), PORT_DATA_IO_PU(267), PORT_DATA_IO_PU(268), -	PORT_DATA_IO_PU(269), PORT_DATA_IO_PU(270), -	PORT_DATA_O(271), -	PORT_DATA_I_PD(272), - -	/* Special Pull-up / Pull-down Functions */ -	PINMUX_DATA(PORT48_KEYIN0_PU_MARK, MSELBCR_MSEL2_1, -		    PORT48_FN2, PORT48_IN_PU), -	PINMUX_DATA(PORT49_KEYIN1_PU_MARK, MSELBCR_MSEL2_1, -		    PORT49_FN2, PORT49_IN_PU), -	PINMUX_DATA(PORT50_KEYIN2_PU_MARK, MSELBCR_MSEL2_1, -		    PORT50_FN2, PORT50_IN_PU), -	PINMUX_DATA(PORT55_KEYIN3_PU_MARK, MSELBCR_MSEL2_1, -		    PORT55_FN2, PORT55_IN_PU), -	PINMUX_DATA(PORT56_KEYIN4_PU_MARK, MSELBCR_MSEL2_1, -		    PORT56_FN2, PORT56_IN_PU), -	PINMUX_DATA(PORT57_KEYIN5_PU_MARK, MSELBCR_MSEL2_1, -		    PORT57_FN2, PORT57_IN_PU), -	PINMUX_DATA(PORT58_KEYIN6_PU_MARK, MSELBCR_MSEL2_1, -		    PORT58_FN2, PORT58_IN_PU), - -	/* 49-1 (FN) */ -	PINMUX_DATA(VBUS0_MARK, PORT0_FN1), -	PINMUX_DATA(CPORT0_MARK, PORT1_FN1), -	PINMUX_DATA(CPORT1_MARK, PORT2_FN1), -	PINMUX_DATA(CPORT2_MARK, PORT3_FN1), -	PINMUX_DATA(CPORT3_MARK, PORT4_FN1), -	PINMUX_DATA(CPORT4_MARK, PORT5_FN1), -	PINMUX_DATA(CPORT5_MARK, PORT6_FN1), -	PINMUX_DATA(CPORT6_MARK, PORT7_FN1), -	PINMUX_DATA(CPORT7_MARK, PORT8_FN1), -	PINMUX_DATA(CPORT8_MARK, PORT9_FN1), -	PINMUX_DATA(CPORT9_MARK, PORT10_FN1), -	PINMUX_DATA(CPORT10_MARK, PORT11_FN1), -	PINMUX_DATA(CPORT11_MARK, PORT12_FN1), -	PINMUX_DATA(SIN2_MARK, PORT12_FN2), -	PINMUX_DATA(CPORT12_MARK, PORT13_FN1), -	PINMUX_DATA(XCTS2_MARK, PORT13_FN2), -	PINMUX_DATA(CPORT13_MARK, PORT14_FN1), -	PINMUX_DATA(RFSPO4_MARK, PORT14_FN2), -	PINMUX_DATA(CPORT14_MARK, PORT15_FN1), -	PINMUX_DATA(RFSPO5_MARK, PORT15_FN2), -	PINMUX_DATA(CPORT15_MARK, PORT16_FN1), -	PINMUX_DATA(CPORT16_MARK, PORT17_FN1), -	PINMUX_DATA(CPORT17_MARK, PORT18_FN1), -	PINMUX_DATA(SOUT2_MARK, PORT18_FN2), -	PINMUX_DATA(CPORT18_MARK, PORT19_FN1), -	PINMUX_DATA(XRTS2_MARK, PORT19_FN1), -	PINMUX_DATA(CPORT19_MARK, PORT20_FN1), -	PINMUX_DATA(CPORT20_MARK, PORT21_FN1), -	PINMUX_DATA(RFSPO6_MARK, PORT21_FN2), -	PINMUX_DATA(CPORT21_MARK, PORT22_FN1), -	PINMUX_DATA(STATUS0_MARK, PORT22_FN2), -	PINMUX_DATA(CPORT22_MARK, PORT23_FN1), -	PINMUX_DATA(STATUS1_MARK, PORT23_FN2), -	PINMUX_DATA(CPORT23_MARK, PORT24_FN1), -	PINMUX_DATA(STATUS2_MARK, PORT24_FN2), -	PINMUX_DATA(RFSPO7_MARK, PORT24_FN3), -	PINMUX_DATA(MPORT0_MARK, PORT25_FN1), -	PINMUX_DATA(MPORT1_MARK, PORT26_FN1), -	PINMUX_DATA(B_SYNLD1_MARK, PORT27_FN1), -	PINMUX_DATA(B_SYNLD2_MARK, PORT28_FN1), -	PINMUX_DATA(XMAINPS_MARK, PORT29_FN1), -	PINMUX_DATA(XDIVPS_MARK, PORT30_FN1), -	PINMUX_DATA(XIDRST_MARK, PORT31_FN1), -	PINMUX_DATA(IDCLK_MARK, PORT32_FN1), -	PINMUX_DATA(IDIO_MARK, PORT33_FN1), -	PINMUX_DATA(SOUT1_MARK, PORT34_FN1), -	PINMUX_DATA(SCIFA4_TXD_MARK, PORT34_FN2), -	PINMUX_DATA(M02_BERDAT_MARK, PORT34_FN3), -	PINMUX_DATA(SIN1_MARK, PORT35_FN1), -	PINMUX_DATA(SCIFA4_RXD_MARK, PORT35_FN2), -	PINMUX_DATA(XWUP_MARK, PORT35_FN3), -	PINMUX_DATA(XRTS1_MARK, PORT36_FN1), -	PINMUX_DATA(SCIFA4_RTS_MARK, PORT36_FN2), -	PINMUX_DATA(M03_BERCLK_MARK, PORT36_FN3), -	PINMUX_DATA(XCTS1_MARK, PORT37_FN1), -	PINMUX_DATA(SCIFA4_CTS_MARK, PORT37_FN2), - -	/* 49-2 (FN) */ -	PINMUX_DATA(HSU_IQ_AGC6_MARK, PORT38_FN1), -	PINMUX_DATA(MFG2_IN2_MARK, PORT38_FN2), -	PINMUX_DATA(MSIOF2_MCK0_MARK, PORT38_FN3), -	PINMUX_DATA(HSU_IQ_AGC5_MARK, PORT39_FN1), -	PINMUX_DATA(MFG2_IN1_MARK, PORT39_FN2), -	PINMUX_DATA(MSIOF2_MCK1_MARK, PORT39_FN3), -	PINMUX_DATA(HSU_IQ_AGC4_MARK, PORT40_FN1), -	PINMUX_DATA(MSIOF2_RSYNC_MARK, PORT40_FN3), -	PINMUX_DATA(HSU_IQ_AGC3_MARK, PORT41_FN1), -	PINMUX_DATA(MFG2_OUT1_MARK, PORT41_FN2), -	PINMUX_DATA(MSIOF2_RSCK_MARK, PORT41_FN3), -	PINMUX_DATA(HSU_IQ_AGC2_MARK, PORT42_FN1), -	PINMUX_DATA(PORT42_KEYOUT0_MARK, MSELBCR_MSEL2_1, PORT42_FN2), -	PINMUX_DATA(HSU_IQ_AGC1_MARK, PORT43_FN1), -	PINMUX_DATA(PORT43_KEYOUT1_MARK, MSELBCR_MSEL2_1, PORT43_FN2), -	PINMUX_DATA(HSU_IQ_AGC0_MARK, PORT44_FN1), -	PINMUX_DATA(PORT44_KEYOUT2_MARK, MSELBCR_MSEL2_1, PORT44_FN2), -	PINMUX_DATA(HSU_IQ_AGC_ST_MARK, PORT45_FN1), -	PINMUX_DATA(PORT45_KEYOUT3_MARK, MSELBCR_MSEL2_1, PORT45_FN2), -	PINMUX_DATA(HSU_IQ_PDO_MARK, PORT46_FN1), -	PINMUX_DATA(PORT46_KEYOUT4_MARK, MSELBCR_MSEL2_1, PORT46_FN2), -	PINMUX_DATA(HSU_IQ_PYO_MARK, PORT47_FN1), -	PINMUX_DATA(PORT47_KEYOUT5_MARK, MSELBCR_MSEL2_1, PORT47_FN2), -	PINMUX_DATA(HSU_EN_TXMUX_G3MO_MARK, PORT48_FN1), -	PINMUX_DATA(PORT48_KEYIN0_MARK, MSELBCR_MSEL2_1, PORT48_FN2), -	PINMUX_DATA(HSU_I_TXMUX_G3MO_MARK, PORT49_FN1), -	PINMUX_DATA(PORT49_KEYIN1_MARK, MSELBCR_MSEL2_1, PORT49_FN2), -	PINMUX_DATA(HSU_Q_TXMUX_G3MO_MARK, PORT50_FN1), -	PINMUX_DATA(PORT50_KEYIN2_MARK, MSELBCR_MSEL2_1, PORT50_FN2), -	PINMUX_DATA(HSU_SYO_MARK, PORT51_FN1), -	PINMUX_DATA(PORT51_MSIOF2_TSYNC_MARK, PORT51_FN2), -	PINMUX_DATA(HSU_SDO_MARK, PORT52_FN1), -	PINMUX_DATA(PORT52_MSIOF2_TSCK_MARK, PORT52_FN2), -	PINMUX_DATA(HSU_TGTTI_G3MO_MARK, PORT53_FN1), -	PINMUX_DATA(PORT53_MSIOF2_TXD_MARK, PORT53_FN2), -	PINMUX_DATA(B_TIME_STAMP_MARK, PORT54_FN1), -	PINMUX_DATA(PORT54_MSIOF2_RXD_MARK, PORT54_FN2), -	PINMUX_DATA(HSU_SDI_MARK, PORT55_FN1), -	PINMUX_DATA(PORT55_KEYIN3_MARK, MSELBCR_MSEL2_1, PORT55_FN2), -	PINMUX_DATA(HSU_SCO_MARK, PORT56_FN1), -	PINMUX_DATA(PORT56_KEYIN4_MARK, MSELBCR_MSEL2_1, PORT56_FN2), -	PINMUX_DATA(HSU_DREQ_MARK, PORT57_FN1), -	PINMUX_DATA(PORT57_KEYIN5_MARK, MSELBCR_MSEL2_1, PORT57_FN2), -	PINMUX_DATA(HSU_DACK_MARK, PORT58_FN1), -	PINMUX_DATA(PORT58_KEYIN6_MARK, MSELBCR_MSEL2_1, PORT58_FN2), -	PINMUX_DATA(HSU_CLK61M_MARK, PORT59_FN1), -	PINMUX_DATA(PORT59_MSIOF2_SS1_MARK, PORT59_FN2), -	PINMUX_DATA(HSU_XRST_MARK, PORT60_FN1), -	PINMUX_DATA(PORT60_MSIOF2_SS2_MARK, PORT60_FN2), -	PINMUX_DATA(PCMCLKO_MARK, PORT61_FN1), -	PINMUX_DATA(SYNC8KO_MARK, PORT62_FN1), -	PINMUX_DATA(DNPCM_A_MARK, PORT63_FN1), -	PINMUX_DATA(UPPCM_A_MARK, PORT64_FN1), -	PINMUX_DATA(XTALB1L_MARK, PORT65_FN1), -	PINMUX_DATA(GPS_AGC1_MARK, PORT66_FN1), -	PINMUX_DATA(SCIFA0_RTS_MARK, PORT66_FN2), -	PINMUX_DATA(GPS_AGC2_MARK, PORT67_FN1), -	PINMUX_DATA(SCIFA0_SCK_MARK, PORT67_FN2), -	PINMUX_DATA(GPS_AGC3_MARK, PORT68_FN1), -	PINMUX_DATA(SCIFA0_TXD_MARK, PORT68_FN2), -	PINMUX_DATA(GPS_AGC4_MARK, PORT69_FN1), -	PINMUX_DATA(SCIFA0_RXD_MARK, PORT69_FN2), -	PINMUX_DATA(GPS_PWRD_MARK, PORT70_FN1), -	PINMUX_DATA(SCIFA0_CTS_MARK, PORT70_FN2), -	PINMUX_DATA(GPS_IM_MARK, PORT71_FN1), -	PINMUX_DATA(GPS_IS_MARK, PORT72_FN1), -	PINMUX_DATA(GPS_QM_MARK, PORT73_FN1), -	PINMUX_DATA(GPS_QS_MARK, PORT74_FN1), -	PINMUX_DATA(SIUBOMC_MARK, PORT75_FN1), -	PINMUX_DATA(TPU2TO0_MARK, PORT75_FN3), -	PINMUX_DATA(SIUCKB_MARK, PORT76_FN1), -	PINMUX_DATA(TPU2TO1_MARK, PORT76_FN3), -	PINMUX_DATA(SIUBOLR_MARK, PORT77_FN1), -	PINMUX_DATA(BBIF2_TSYNC_MARK, PORT77_FN2), -	PINMUX_DATA(TPU2TO2_MARK, PORT77_FN3), -	PINMUX_DATA(SIUBOBT_MARK, PORT78_FN1), -	PINMUX_DATA(BBIF2_TSCK_MARK, PORT78_FN2), -	PINMUX_DATA(TPU2TO3_MARK, PORT78_FN3), -	PINMUX_DATA(SIUBOSLD_MARK, PORT79_FN1), -	PINMUX_DATA(BBIF2_TXD_MARK, PORT79_FN2), -	PINMUX_DATA(TPU3TO0_MARK, PORT79_FN3), -	PINMUX_DATA(SIUBILR_MARK, PORT80_FN1), -	PINMUX_DATA(TPU3TO1_MARK, PORT80_FN3), -	PINMUX_DATA(SIUBIBT_MARK, PORT81_FN1), -	PINMUX_DATA(TPU3TO2_MARK, PORT81_FN3), -	PINMUX_DATA(SIUBISLD_MARK, PORT82_FN1), -	PINMUX_DATA(TPU3TO3_MARK, PORT82_FN3), -	PINMUX_DATA(NMI_MARK, PORT83_FN1), -	PINMUX_DATA(TPU4TO0_MARK, PORT83_FN3), -	PINMUX_DATA(DNPCM_M_MARK, PORT84_FN1), -	PINMUX_DATA(TPU4TO1_MARK, PORT84_FN3), -	PINMUX_DATA(TPU4TO2_MARK, PORT85_FN3), -	PINMUX_DATA(TPU4TO3_MARK, PORT86_FN3), -	PINMUX_DATA(IRQ_TMPB_MARK, PORT87_FN1), -	PINMUX_DATA(PWEN_MARK, PORT88_FN1), -	PINMUX_DATA(MFG1_OUT1_MARK, PORT88_FN2), -	PINMUX_DATA(OVCN_MARK, PORT89_FN1), -	PINMUX_DATA(MFG1_IN1_MARK, PORT89_FN2), -	PINMUX_DATA(OVCN2_MARK, PORT90_FN1), -	PINMUX_DATA(MFG1_IN2_MARK, PORT90_FN2), - -	/* 49-3 (FN) */ -	PINMUX_DATA(RFSPO1_MARK, PORT91_FN1), -	PINMUX_DATA(RFSPO2_MARK, PORT92_FN1), -	PINMUX_DATA(RFSPO3_MARK, PORT93_FN1), -	PINMUX_DATA(PORT93_VIO_CKO2_MARK, PORT93_FN2), -	PINMUX_DATA(USBTERM_MARK, PORT94_FN1), -	PINMUX_DATA(EXTLP_MARK, PORT94_FN2), -	PINMUX_DATA(IDIN_MARK, PORT95_FN1), -	PINMUX_DATA(SCIFA5_CTS_MARK, PORT96_FN1), -	PINMUX_DATA(MFG0_IN1_MARK, PORT96_FN2), -	PINMUX_DATA(SCIFA5_RTS_MARK, PORT97_FN1), -	PINMUX_DATA(MFG0_IN2_MARK, PORT97_FN2), -	PINMUX_DATA(SCIFA5_RXD_MARK, PORT98_FN1), -	PINMUX_DATA(SCIFA5_TXD_MARK, PORT99_FN1), -	PINMUX_DATA(SCIFA5_SCK_MARK, PORT100_FN1), -	PINMUX_DATA(MFG0_OUT1_MARK, PORT100_FN2), -	PINMUX_DATA(A0_EA0_MARK, PORT101_FN1), -	PINMUX_DATA(BS_MARK, PORT101_FN2), -	PINMUX_DATA(A14_EA14_MARK, PORT102_FN1), -	PINMUX_DATA(PORT102_KEYOUT0_MARK, MSELBCR_MSEL2_0, PORT102_FN2), -	PINMUX_DATA(A15_EA15_MARK, PORT103_FN1), -	PINMUX_DATA(PORT103_KEYOUT1_MARK, MSELBCR_MSEL2_0, PORT103_FN2), -	PINMUX_DATA(DV_CLKOL_MARK, PORT103_FN3), -	PINMUX_DATA(A16_EA16_MARK, PORT104_FN1), -	PINMUX_DATA(PORT104_KEYOUT2_MARK, MSELBCR_MSEL2_0, PORT104_FN2), -	PINMUX_DATA(DV_VSYNCL_MARK, PORT104_FN3), -	PINMUX_DATA(MSIOF0_SS1_MARK, PORT104_FN4), -	PINMUX_DATA(A17_EA17_MARK, PORT105_FN1), -	PINMUX_DATA(PORT105_KEYOUT3_MARK, MSELBCR_MSEL2_0, PORT105_FN2), -	PINMUX_DATA(DV_HSYNCL_MARK, PORT105_FN3), -	PINMUX_DATA(MSIOF0_TSYNC_MARK, PORT105_FN4), -	PINMUX_DATA(A18_EA18_MARK, PORT106_FN1), -	PINMUX_DATA(PORT106_KEYOUT4_MARK, MSELBCR_MSEL2_0, PORT106_FN2), -	PINMUX_DATA(DV_DL0_MARK, PORT106_FN3), -	PINMUX_DATA(MSIOF0_TSCK_MARK, PORT106_FN4), -	PINMUX_DATA(A19_EA19_MARK, PORT107_FN1), -	PINMUX_DATA(PORT107_KEYOUT5_MARK, MSELBCR_MSEL2_0, PORT107_FN2), -	PINMUX_DATA(DV_DL1_MARK, PORT107_FN3), -	PINMUX_DATA(MSIOF0_TXD_MARK, PORT107_FN4), -	PINMUX_DATA(A20_EA20_MARK, PORT108_FN1), -	PINMUX_DATA(PORT108_KEYIN0_MARK, MSELBCR_MSEL2_0, PORT108_FN2), -	PINMUX_DATA(DV_DL2_MARK, PORT108_FN3), -	PINMUX_DATA(MSIOF0_RSCK_MARK, PORT108_FN4), -	PINMUX_DATA(A21_EA21_MARK, PORT109_FN1), -	PINMUX_DATA(PORT109_KEYIN1_MARK, MSELBCR_MSEL2_0, PORT109_FN2), -	PINMUX_DATA(DV_DL3_MARK, PORT109_FN3), -	PINMUX_DATA(MSIOF0_RSYNC_MARK, PORT109_FN4), -	PINMUX_DATA(A22_EA22_MARK, PORT110_FN1), -	PINMUX_DATA(PORT110_KEYIN2_MARK, MSELBCR_MSEL2_0, PORT110_FN2), -	PINMUX_DATA(DV_DL4_MARK, PORT110_FN3), -	PINMUX_DATA(MSIOF0_MCK0_MARK, PORT110_FN4), -	PINMUX_DATA(A23_EA23_MARK, PORT111_FN1), -	PINMUX_DATA(PORT111_KEYIN3_MARK, MSELBCR_MSEL2_0, PORT111_FN2), -	PINMUX_DATA(DV_DL5_MARK, PORT111_FN3), -	PINMUX_DATA(MSIOF0_MCK1_MARK, PORT111_FN4), -	PINMUX_DATA(A24_EA24_MARK, PORT112_FN1), -	PINMUX_DATA(PORT112_KEYIN4_MARK, MSELBCR_MSEL2_0, PORT112_FN2), -	PINMUX_DATA(DV_DL6_MARK, PORT112_FN3), -	PINMUX_DATA(MSIOF0_RXD_MARK, PORT112_FN4), -	PINMUX_DATA(A25_EA25_MARK, PORT113_FN1), -	PINMUX_DATA(PORT113_KEYIN5_MARK, MSELBCR_MSEL2_0, PORT113_FN2), -	PINMUX_DATA(DV_DL7_MARK, PORT113_FN3), -	PINMUX_DATA(MSIOF0_SS2_MARK, PORT113_FN4), -	PINMUX_DATA(A26_MARK, PORT114_FN1), -	PINMUX_DATA(PORT113_KEYIN6_MARK, MSELBCR_MSEL2_0, PORT114_FN2), -	PINMUX_DATA(DV_CLKIL_MARK, PORT114_FN3), -	PINMUX_DATA(D0_ED0_NAF0_MARK, PORT115_FN1), -	PINMUX_DATA(D1_ED1_NAF1_MARK, PORT116_FN1), -	PINMUX_DATA(D2_ED2_NAF2_MARK, PORT117_FN1), -	PINMUX_DATA(D3_ED3_NAF3_MARK, PORT118_FN1), -	PINMUX_DATA(D4_ED4_NAF4_MARK, PORT119_FN1), -	PINMUX_DATA(D5_ED5_NAF5_MARK, PORT120_FN1), -	PINMUX_DATA(D6_ED6_NAF6_MARK, PORT121_FN1), -	PINMUX_DATA(D7_ED7_NAF7_MARK, PORT122_FN1), -	PINMUX_DATA(D8_ED8_NAF8_MARK, PORT123_FN1), -	PINMUX_DATA(D9_ED9_NAF9_MARK, PORT124_FN1), -	PINMUX_DATA(D10_ED10_NAF10_MARK, PORT125_FN1), -	PINMUX_DATA(D11_ED11_NAF11_MARK, PORT126_FN1), -	PINMUX_DATA(D12_ED12_NAF12_MARK, PORT127_FN1), -	PINMUX_DATA(D13_ED13_NAF13_MARK, PORT128_FN1), -	PINMUX_DATA(D14_ED14_NAF14_MARK, PORT129_FN1), -	PINMUX_DATA(D15_ED15_NAF15_MARK, PORT130_FN1), -	PINMUX_DATA(CS4_MARK, PORT131_FN1), -	PINMUX_DATA(CS5A_MARK, PORT132_FN1), -	PINMUX_DATA(CS5B_MARK, PORT133_FN1), -	PINMUX_DATA(FCE1_MARK, PORT133_FN2), -	PINMUX_DATA(CS6B_MARK, PORT134_FN1), -	PINMUX_DATA(XCS2_MARK, PORT134_FN2), -	PINMUX_DATA(FCE0_MARK, PORT135_FN1), -	PINMUX_DATA(CS6A_MARK, PORT136_FN1), -	PINMUX_DATA(DACK0_MARK, PORT136_FN2), -	PINMUX_DATA(WAIT_MARK, PORT137_FN1), -	PINMUX_DATA(DREQ0_MARK, PORT137_FN2), -	PINMUX_DATA(RD_XRD_MARK, PORT138_FN1), -	PINMUX_DATA(A27_MARK, PORT139_FN1), -	PINMUX_DATA(RDWR_XWE_MARK, PORT139_FN2), -	PINMUX_DATA(WE0_XWR0_FWE_MARK, PORT140_FN1), -	PINMUX_DATA(WE1_XWR1_MARK, PORT141_FN1), -	PINMUX_DATA(FRB_MARK, PORT142_FN1), -	PINMUX_DATA(CKO_MARK, PORT143_FN1), -	PINMUX_DATA(NBRSTOUT_MARK, PORT144_FN1), -	PINMUX_DATA(NBRST_MARK, PORT145_FN1), - -	/* 49-4 (FN) */ -	PINMUX_DATA(RFSPO0_MARK, PORT146_FN1), -	PINMUX_DATA(PORT146_VIO_CKO2_MARK, PORT146_FN2), -	PINMUX_DATA(TSTMD_MARK, PORT147_FN1), -	PINMUX_DATA(VIO_VD_MARK, PORT148_FN1), -	PINMUX_DATA(VIO_HD_MARK, PORT149_FN1), -	PINMUX_DATA(VIO_D0_MARK, PORT150_FN1), -	PINMUX_DATA(VIO_D1_MARK, PORT151_FN1), -	PINMUX_DATA(VIO_D2_MARK, PORT152_FN1), -	PINMUX_DATA(VIO_D3_MARK, PORT153_FN1), -	PINMUX_DATA(VIO_D4_MARK, PORT154_FN1), -	PINMUX_DATA(VIO_D5_MARK, PORT155_FN1), -	PINMUX_DATA(VIO_D6_MARK, PORT156_FN1), -	PINMUX_DATA(VIO_D7_MARK, PORT157_FN1), -	PINMUX_DATA(VIO_D8_MARK, PORT158_FN1), -	PINMUX_DATA(VIO_D9_MARK, PORT159_FN1), -	PINMUX_DATA(VIO_D10_MARK, PORT160_FN1), -	PINMUX_DATA(VIO_D11_MARK, PORT161_FN1), -	PINMUX_DATA(VIO_D12_MARK, PORT162_FN1), -	PINMUX_DATA(VIO_D13_MARK, PORT163_FN1), -	PINMUX_DATA(VIO_D14_MARK, PORT164_FN1), -	PINMUX_DATA(VIO_D15_MARK, PORT165_FN1), -	PINMUX_DATA(VIO_CLK_MARK, PORT166_FN1), -	PINMUX_DATA(VIO_FIELD_MARK, PORT167_FN1), -	PINMUX_DATA(VIO_CKO_MARK, PORT168_FN1), -	PINMUX_DATA(MFG3_IN1_MARK, PORT169_FN2), -	PINMUX_DATA(MFG3_IN2_MARK, PORT170_FN2), -	PINMUX_DATA(M9_SLCD_A01_MARK, PORT171_FN1), -	PINMUX_DATA(MFG3_OUT1_MARK, PORT171_FN2), -	PINMUX_DATA(TPU0TO0_MARK, PORT171_FN3), -	PINMUX_DATA(M10_SLCD_CK1_MARK, PORT172_FN1), -	PINMUX_DATA(MFG4_IN1_MARK, PORT172_FN2), -	PINMUX_DATA(TPU0TO1_MARK, PORT172_FN3), -	PINMUX_DATA(M11_SLCD_SO1_MARK, PORT173_FN1), -	PINMUX_DATA(MFG4_IN2_MARK, PORT173_FN2), -	PINMUX_DATA(TPU0TO2_MARK, PORT173_FN3), -	PINMUX_DATA(M12_SLCD_CE1_MARK, PORT174_FN1), -	PINMUX_DATA(MFG4_OUT1_MARK, PORT174_FN2), -	PINMUX_DATA(TPU0TO3_MARK, PORT174_FN3), -	PINMUX_DATA(LCDD0_MARK, PORT175_FN1), -	PINMUX_DATA(PORT175_KEYOUT0_MARK, PORT175_FN2), -	PINMUX_DATA(DV_D0_MARK, PORT175_FN3), -	PINMUX_DATA(SIUCKA_MARK, PORT175_FN4), -	PINMUX_DATA(MFG0_OUT2_MARK, PORT175_FN5), -	PINMUX_DATA(LCDD1_MARK, PORT176_FN1), -	PINMUX_DATA(PORT176_KEYOUT1_MARK, PORT176_FN2), -	PINMUX_DATA(DV_D1_MARK, PORT176_FN3), -	PINMUX_DATA(SIUAOLR_MARK, PORT176_FN4), -	PINMUX_DATA(BBIF2_TSYNC1_MARK, PORT176_FN5), -	PINMUX_DATA(LCDD2_MARK, PORT177_FN1), -	PINMUX_DATA(PORT177_KEYOUT2_MARK, PORT177_FN2), -	PINMUX_DATA(DV_D2_MARK, PORT177_FN3), -	PINMUX_DATA(SIUAOBT_MARK, PORT177_FN4), -	PINMUX_DATA(BBIF2_TSCK1_MARK, PORT177_FN5), -	PINMUX_DATA(LCDD3_MARK, PORT178_FN1), -	PINMUX_DATA(PORT178_KEYOUT3_MARK, PORT178_FN2), -	PINMUX_DATA(DV_D3_MARK, PORT178_FN3), -	PINMUX_DATA(SIUAOSLD_MARK, PORT178_FN4), -	PINMUX_DATA(BBIF2_TXD1_MARK, PORT178_FN5), -	PINMUX_DATA(LCDD4_MARK, PORT179_FN1), -	PINMUX_DATA(PORT179_KEYOUT4_MARK, PORT179_FN2), -	PINMUX_DATA(DV_D4_MARK, PORT179_FN3), -	PINMUX_DATA(SIUAISPD_MARK, PORT179_FN4), -	PINMUX_DATA(MFG1_OUT2_MARK, PORT179_FN5), -	PINMUX_DATA(LCDD5_MARK, PORT180_FN1), -	PINMUX_DATA(PORT180_KEYOUT5_MARK, PORT180_FN2), -	PINMUX_DATA(DV_D5_MARK, PORT180_FN3), -	PINMUX_DATA(SIUAILR_MARK, PORT180_FN4), -	PINMUX_DATA(MFG2_OUT2_MARK, PORT180_FN5), -	PINMUX_DATA(LCDD6_MARK, PORT181_FN1), -	PINMUX_DATA(DV_D6_MARK, PORT181_FN3), -	PINMUX_DATA(SIUAIBT_MARK, PORT181_FN4), -	PINMUX_DATA(MFG3_OUT2_MARK, PORT181_FN5), -	PINMUX_DATA(XWR2_MARK, PORT181_FN7), -	PINMUX_DATA(LCDD7_MARK, PORT182_FN1), -	PINMUX_DATA(DV_D7_MARK, PORT182_FN3), -	PINMUX_DATA(SIUAISLD_MARK, PORT182_FN4), -	PINMUX_DATA(MFG4_OUT2_MARK, PORT182_FN5), -	PINMUX_DATA(XWR3_MARK, PORT182_FN7), -	PINMUX_DATA(LCDD8_MARK, PORT183_FN1), -	PINMUX_DATA(DV_D8_MARK, PORT183_FN3), -	PINMUX_DATA(D16_MARK, PORT183_FN6), -	PINMUX_DATA(ED16_MARK, PORT183_FN7), -	PINMUX_DATA(LCDD9_MARK, PORT184_FN1), -	PINMUX_DATA(DV_D9_MARK, PORT184_FN3), -	PINMUX_DATA(D17_MARK, PORT184_FN6), -	PINMUX_DATA(ED17_MARK, PORT184_FN7), -	PINMUX_DATA(LCDD10_MARK, PORT185_FN1), -	PINMUX_DATA(DV_D10_MARK, PORT185_FN3), -	PINMUX_DATA(D18_MARK, PORT185_FN6), -	PINMUX_DATA(ED18_MARK, PORT185_FN7), -	PINMUX_DATA(LCDD11_MARK, PORT186_FN1), -	PINMUX_DATA(DV_D11_MARK, PORT186_FN3), -	PINMUX_DATA(D19_MARK, PORT186_FN6), -	PINMUX_DATA(ED19_MARK, PORT186_FN7), -	PINMUX_DATA(LCDD12_MARK, PORT187_FN1), -	PINMUX_DATA(DV_D12_MARK, PORT187_FN3), -	PINMUX_DATA(D20_MARK, PORT187_FN6), -	PINMUX_DATA(ED20_MARK, PORT187_FN7), -	PINMUX_DATA(LCDD13_MARK, PORT188_FN1), -	PINMUX_DATA(DV_D13_MARK, PORT188_FN3), -	PINMUX_DATA(D21_MARK, PORT188_FN6), -	PINMUX_DATA(ED21_MARK, PORT188_FN7), -	PINMUX_DATA(LCDD14_MARK, PORT189_FN1), -	PINMUX_DATA(DV_D14_MARK, PORT189_FN3), -	PINMUX_DATA(D22_MARK, PORT189_FN6), -	PINMUX_DATA(ED22_MARK, PORT189_FN7), -	PINMUX_DATA(LCDD15_MARK, PORT190_FN1), -	PINMUX_DATA(DV_D15_MARK, PORT190_FN3), -	PINMUX_DATA(D23_MARK, PORT190_FN6), -	PINMUX_DATA(ED23_MARK, PORT190_FN7), -	PINMUX_DATA(LCDD16_MARK, PORT191_FN1), -	PINMUX_DATA(DV_HSYNC_MARK, PORT191_FN3), -	PINMUX_DATA(D24_MARK, PORT191_FN6), -	PINMUX_DATA(ED24_MARK, PORT191_FN7), -	PINMUX_DATA(LCDD17_MARK, PORT192_FN1), -	PINMUX_DATA(DV_VSYNC_MARK, PORT192_FN3), -	PINMUX_DATA(D25_MARK, PORT192_FN6), -	PINMUX_DATA(ED25_MARK, PORT192_FN7), -	PINMUX_DATA(LCDD18_MARK, PORT193_FN1), -	PINMUX_DATA(DREQ2_MARK, PORT193_FN2), -	PINMUX_DATA(MSIOF0L_TSCK_MARK, PORT193_FN5), -	PINMUX_DATA(D26_MARK, PORT193_FN6), -	PINMUX_DATA(ED26_MARK, PORT193_FN7), -	PINMUX_DATA(LCDD19_MARK, PORT194_FN1), -	PINMUX_DATA(MSIOF0L_TSYNC_MARK, PORT194_FN5), -	PINMUX_DATA(D27_MARK, PORT194_FN6), -	PINMUX_DATA(ED27_MARK, PORT194_FN7), -	PINMUX_DATA(LCDD20_MARK, PORT195_FN1), -	PINMUX_DATA(TS_SPSYNC1_MARK, PORT195_FN2), -	PINMUX_DATA(MSIOF0L_MCK0_MARK, PORT195_FN5), -	PINMUX_DATA(D28_MARK, PORT195_FN6), -	PINMUX_DATA(ED28_MARK, PORT195_FN7), -	PINMUX_DATA(LCDD21_MARK, PORT196_FN1), -	PINMUX_DATA(TS_SDAT1_MARK, PORT196_FN2), -	PINMUX_DATA(MSIOF0L_MCK1_MARK, PORT196_FN5), -	PINMUX_DATA(D29_MARK, PORT196_FN6), -	PINMUX_DATA(ED29_MARK, PORT196_FN7), -	PINMUX_DATA(LCDD22_MARK, PORT197_FN1), -	PINMUX_DATA(TS_SDEN1_MARK, PORT197_FN2), -	PINMUX_DATA(MSIOF0L_SS1_MARK, PORT197_FN5), -	PINMUX_DATA(D30_MARK, PORT197_FN6), -	PINMUX_DATA(ED30_MARK, PORT197_FN7), -	PINMUX_DATA(LCDD23_MARK, PORT198_FN1), -	PINMUX_DATA(TS_SCK1_MARK, PORT198_FN2), -	PINMUX_DATA(MSIOF0L_SS2_MARK, PORT198_FN5), -	PINMUX_DATA(D31_MARK, PORT198_FN6), -	PINMUX_DATA(ED31_MARK, PORT198_FN7), -	PINMUX_DATA(LCDDCK_MARK, PORT199_FN1), -	PINMUX_DATA(LCDWR_MARK, PORT199_FN2), -	PINMUX_DATA(DV_CKO_MARK, PORT199_FN3), -	PINMUX_DATA(SIUAOSPD_MARK, PORT199_FN4), -	PINMUX_DATA(LCDRD_MARK, PORT200_FN1), -	PINMUX_DATA(DACK2_MARK, PORT200_FN2), -	PINMUX_DATA(MSIOF0L_RSYNC_MARK, PORT200_FN5), - -	/* 49-5 (FN) */ -	PINMUX_DATA(LCDHSYN_MARK, PORT201_FN1), -	PINMUX_DATA(LCDCS_MARK, PORT201_FN2), -	PINMUX_DATA(LCDCS2_MARK, PORT201_FN3), -	PINMUX_DATA(DACK3_MARK, PORT201_FN4), -	PINMUX_DATA(LCDDISP_MARK, PORT202_FN1), -	PINMUX_DATA(LCDRS_MARK, PORT202_FN2), -	PINMUX_DATA(DREQ3_MARK, PORT202_FN4), -	PINMUX_DATA(MSIOF0L_RSCK_MARK, PORT202_FN5), -	PINMUX_DATA(LCDCSYN_MARK, PORT203_FN1), -	PINMUX_DATA(LCDCSYN2_MARK, PORT203_FN2), -	PINMUX_DATA(DV_CKI_MARK, PORT203_FN3), -	PINMUX_DATA(LCDLCLK_MARK, PORT204_FN1), -	PINMUX_DATA(DREQ1_MARK, PORT204_FN3), -	PINMUX_DATA(MSIOF0L_RXD_MARK, PORT204_FN5), -	PINMUX_DATA(LCDDON_MARK, PORT205_FN1), -	PINMUX_DATA(LCDDON2_MARK, PORT205_FN2), -	PINMUX_DATA(DACK1_MARK, PORT205_FN3), -	PINMUX_DATA(MSIOF0L_TXD_MARK, PORT205_FN5), -	PINMUX_DATA(VIO_DR0_MARK, PORT206_FN1), -	PINMUX_DATA(VIO_DR1_MARK, PORT207_FN1), -	PINMUX_DATA(VIO_DR2_MARK, PORT208_FN1), -	PINMUX_DATA(VIO_DR3_MARK, PORT209_FN1), -	PINMUX_DATA(VIO_DR4_MARK, PORT210_FN1), -	PINMUX_DATA(VIO_DR5_MARK, PORT211_FN1), -	PINMUX_DATA(VIO_DR6_MARK, PORT212_FN1), -	PINMUX_DATA(VIO_DR7_MARK, PORT213_FN1), -	PINMUX_DATA(VIO_VDR_MARK, PORT214_FN1), -	PINMUX_DATA(VIO_HDR_MARK, PORT215_FN1), -	PINMUX_DATA(VIO_CLKR_MARK, PORT216_FN1), -	PINMUX_DATA(VIO_CKOR_MARK, PORT217_FN1), -	PINMUX_DATA(SCIFA1_TXD_MARK, PORT220_FN2), -	PINMUX_DATA(GPS_PGFA0_MARK, PORT220_FN3), -	PINMUX_DATA(SCIFA1_SCK_MARK, PORT221_FN2), -	PINMUX_DATA(GPS_PGFA1_MARK, PORT221_FN3), -	PINMUX_DATA(SCIFA1_RTS_MARK, PORT222_FN2), -	PINMUX_DATA(GPS_EPPSINMON_MARK, PORT222_FN3), -	PINMUX_DATA(SCIFA1_RXD_MARK, PORT223_FN2), -	PINMUX_DATA(SCIFA1_CTS_MARK, PORT224_FN2), -	PINMUX_DATA(MSIOF1_TXD_MARK, PORT225_FN1), -	PINMUX_DATA(SCIFA1_TXD2_MARK, PORT225_FN2), -	PINMUX_DATA(GPS_TXD_MARK, PORT225_FN3), -	PINMUX_DATA(MSIOF1_TSYNC_MARK, PORT226_FN1), -	PINMUX_DATA(SCIFA1_CTS2_MARK, PORT226_FN2), -	PINMUX_DATA(I2C_SDA2_MARK, PORT226_FN3), -	PINMUX_DATA(MSIOF1_TSCK_MARK, PORT227_FN1), -	PINMUX_DATA(SCIFA1_SCK2_MARK, PORT227_FN2), -	PINMUX_DATA(MSIOF1_RXD_MARK, PORT228_FN1), -	PINMUX_DATA(SCIFA1_RXD2_MARK, PORT228_FN2), -	PINMUX_DATA(GPS_RXD_MARK, PORT228_FN3), -	PINMUX_DATA(MSIOF1_RSCK_MARK, PORT229_FN1), -	PINMUX_DATA(SCIFA1_RTS2_MARK, PORT229_FN2), -	PINMUX_DATA(MSIOF1_RSYNC_MARK, PORT230_FN1), -	PINMUX_DATA(I2C_SCL2_MARK, PORT230_FN3), -	PINMUX_DATA(MSIOF1_MCK0_MARK, PORT231_FN1), -	PINMUX_DATA(MSIOF1_MCK1_MARK, PORT232_FN1), -	PINMUX_DATA(MSIOF1_SS1_MARK, PORT233_FN1), -	PINMUX_DATA(EDBGREQ3_MARK, PORT233_FN2), -	PINMUX_DATA(MSIOF1_SS2_MARK, PORT234_FN1), -	PINMUX_DATA(PORT236_IROUT_MARK, PORT236_FN1), -	PINMUX_DATA(IRDA_OUT_MARK, PORT236_FN2), -	PINMUX_DATA(IRDA_IN_MARK, PORT237_FN2), -	PINMUX_DATA(IRDA_FIRSEL_MARK, PORT238_FN1), -	PINMUX_DATA(TPU1TO0_MARK, PORT239_FN3), -	PINMUX_DATA(TS_SPSYNC3_MARK, PORT239_FN4), -	PINMUX_DATA(TPU1TO1_MARK, PORT240_FN3), -	PINMUX_DATA(TS_SDAT3_MARK, PORT240_FN4), -	PINMUX_DATA(TPU1TO2_MARK, PORT241_FN3), -	PINMUX_DATA(TS_SDEN3_MARK, PORT241_FN4), -	PINMUX_DATA(PORT241_MSIOF2_SS1_MARK, PORT241_FN5), -	PINMUX_DATA(TPU1TO3_MARK, PORT242_FN3), -	PINMUX_DATA(PORT242_MSIOF2_TSCK_MARK, PORT242_FN5), -	PINMUX_DATA(M13_BSW_MARK, PORT243_FN2), -	PINMUX_DATA(PORT243_MSIOF2_TSYNC_MARK, PORT243_FN5), -	PINMUX_DATA(M14_GSW_MARK, PORT244_FN2), -	PINMUX_DATA(PORT244_MSIOF2_TXD_MARK, PORT244_FN5), -	PINMUX_DATA(PORT245_IROUT_MARK, PORT245_FN1), -	PINMUX_DATA(M15_RSW_MARK, PORT245_FN2), -	PINMUX_DATA(SOUT3_MARK, PORT246_FN1), -	PINMUX_DATA(SCIFA2_TXD1_MARK, PORT246_FN2), -	PINMUX_DATA(SIN3_MARK, PORT247_FN1), -	PINMUX_DATA(SCIFA2_RXD1_MARK, PORT247_FN2), -	PINMUX_DATA(XRTS3_MARK, PORT248_FN1), -	PINMUX_DATA(SCIFA2_RTS1_MARK, PORT248_FN2), -	PINMUX_DATA(PORT248_MSIOF2_SS2_MARK, PORT248_FN5), -	PINMUX_DATA(XCTS3_MARK, PORT249_FN1), -	PINMUX_DATA(SCIFA2_CTS1_MARK, PORT249_FN2), -	PINMUX_DATA(PORT249_MSIOF2_RXD_MARK, PORT249_FN5), -	PINMUX_DATA(DINT_MARK, PORT250_FN1), -	PINMUX_DATA(SCIFA2_SCK1_MARK, PORT250_FN2), -	PINMUX_DATA(TS_SCK3_MARK, PORT250_FN4), -	PINMUX_DATA(SDHICLK0_MARK, PORT251_FN1), -	PINMUX_DATA(TCK2_MARK, PORT251_FN2), -	PINMUX_DATA(SDHICD0_MARK, PORT252_FN1), -	PINMUX_DATA(SDHID0_0_MARK, PORT253_FN1), -	PINMUX_DATA(TMS2_MARK, PORT253_FN2), -	PINMUX_DATA(SDHID0_1_MARK, PORT254_FN1), -	PINMUX_DATA(TDO2_MARK, PORT254_FN2), -	PINMUX_DATA(SDHID0_2_MARK, PORT255_FN1), -	PINMUX_DATA(TDI2_MARK, PORT255_FN2), -	PINMUX_DATA(SDHID0_3_MARK, PORT256_FN1), -	PINMUX_DATA(RTCK2_MARK, PORT256_FN2), - -	/* 49-6 (FN) */ -	PINMUX_DATA(SDHICMD0_MARK, PORT257_FN1), -	PINMUX_DATA(TRST2_MARK, PORT257_FN2), -	PINMUX_DATA(SDHIWP0_MARK, PORT258_FN1), -	PINMUX_DATA(EDBGREQ2_MARK, PORT258_FN2), -	PINMUX_DATA(SDHICLK1_MARK, PORT259_FN1), -	PINMUX_DATA(TCK3_MARK, PORT259_FN4), -	PINMUX_DATA(SDHID1_0_MARK, PORT260_FN1), -	PINMUX_DATA(M11_SLCD_SO2_MARK, PORT260_FN2), -	PINMUX_DATA(TS_SPSYNC2_MARK, PORT260_FN3), -	PINMUX_DATA(TMS3_MARK, PORT260_FN4), -	PINMUX_DATA(SDHID1_1_MARK, PORT261_FN1), -	PINMUX_DATA(M9_SLCD_AO2_MARK, PORT261_FN2), -	PINMUX_DATA(TS_SDAT2_MARK, PORT261_FN3), -	PINMUX_DATA(TDO3_MARK, PORT261_FN4), -	PINMUX_DATA(SDHID1_2_MARK, PORT262_FN1), -	PINMUX_DATA(M10_SLCD_CK2_MARK, PORT262_FN2), -	PINMUX_DATA(TS_SDEN2_MARK, PORT262_FN3), -	PINMUX_DATA(TDI3_MARK, PORT262_FN4), -	PINMUX_DATA(SDHID1_3_MARK, PORT263_FN1), -	PINMUX_DATA(M12_SLCD_CE2_MARK, PORT263_FN2), -	PINMUX_DATA(TS_SCK2_MARK, PORT263_FN3), -	PINMUX_DATA(RTCK3_MARK, PORT263_FN4), -	PINMUX_DATA(SDHICMD1_MARK, PORT264_FN1), -	PINMUX_DATA(TRST3_MARK, PORT264_FN4), -	PINMUX_DATA(SDHICLK2_MARK, PORT265_FN1), -	PINMUX_DATA(SCIFB_SCK_MARK, PORT265_FN2), -	PINMUX_DATA(SDHID2_0_MARK, PORT266_FN1), -	PINMUX_DATA(SCIFB_TXD_MARK, PORT266_FN2), -	PINMUX_DATA(SDHID2_1_MARK, PORT267_FN1), -	PINMUX_DATA(SCIFB_CTS_MARK, PORT267_FN2), -	PINMUX_DATA(SDHID2_2_MARK, PORT268_FN1), -	PINMUX_DATA(SCIFB_RXD_MARK, PORT268_FN2), -	PINMUX_DATA(SDHID2_3_MARK, PORT269_FN1), -	PINMUX_DATA(SCIFB_RTS_MARK, PORT269_FN2), -	PINMUX_DATA(SDHICMD2_MARK, PORT270_FN1), -	PINMUX_DATA(RESETOUTS_MARK, PORT271_FN1), -	PINMUX_DATA(DIVLOCK_MARK, PORT272_FN1), -}; - -static struct pinmux_gpio pinmux_gpios[] = { -	/* 49-1 -> 49-6 (GPIO) */ -	GPIO_PORT_ALL(), - -	/* Special Pull-up / Pull-down Functions */ -	GPIO_FN(PORT48_KEYIN0_PU), GPIO_FN(PORT49_KEYIN1_PU), -	GPIO_FN(PORT50_KEYIN2_PU), GPIO_FN(PORT55_KEYIN3_PU), -	GPIO_FN(PORT56_KEYIN4_PU), GPIO_FN(PORT57_KEYIN5_PU), -	GPIO_FN(PORT58_KEYIN6_PU), - -	/* 49-1 (FN) */ -	GPIO_FN(VBUS0), GPIO_FN(CPORT0), GPIO_FN(CPORT1), GPIO_FN(CPORT2), -	GPIO_FN(CPORT3), GPIO_FN(CPORT4), GPIO_FN(CPORT5), GPIO_FN(CPORT6), -	GPIO_FN(CPORT7), GPIO_FN(CPORT8), GPIO_FN(CPORT9), GPIO_FN(CPORT10), -	GPIO_FN(CPORT11), GPIO_FN(SIN2), GPIO_FN(CPORT12), GPIO_FN(XCTS2), -	GPIO_FN(CPORT13), GPIO_FN(RFSPO4), GPIO_FN(CPORT14), GPIO_FN(RFSPO5), -	GPIO_FN(CPORT15), GPIO_FN(CPORT16), GPIO_FN(CPORT17), GPIO_FN(SOUT2), -	GPIO_FN(CPORT18), GPIO_FN(XRTS2), GPIO_FN(CPORT19), GPIO_FN(CPORT20), -	GPIO_FN(RFSPO6), GPIO_FN(CPORT21), GPIO_FN(STATUS0), GPIO_FN(CPORT22), -	GPIO_FN(STATUS1), GPIO_FN(CPORT23), GPIO_FN(STATUS2), GPIO_FN(RFSPO7), -	GPIO_FN(MPORT0), GPIO_FN(MPORT1), GPIO_FN(B_SYNLD1), GPIO_FN(B_SYNLD2), -	GPIO_FN(XMAINPS), GPIO_FN(XDIVPS), GPIO_FN(XIDRST), GPIO_FN(IDCLK), -	GPIO_FN(IDIO), GPIO_FN(SOUT1), GPIO_FN(SCIFA4_TXD), -	GPIO_FN(M02_BERDAT), GPIO_FN(SIN1), GPIO_FN(SCIFA4_RXD), GPIO_FN(XWUP), -	GPIO_FN(XRTS1), GPIO_FN(SCIFA4_RTS), GPIO_FN(M03_BERCLK), -	GPIO_FN(XCTS1), GPIO_FN(SCIFA4_CTS), - -	/* 49-2 (FN) */ -	GPIO_FN(HSU_IQ_AGC6), GPIO_FN(MFG2_IN2), GPIO_FN(MSIOF2_MCK0), -	GPIO_FN(HSU_IQ_AGC5), GPIO_FN(MFG2_IN1), GPIO_FN(MSIOF2_MCK1), -	GPIO_FN(HSU_IQ_AGC4), GPIO_FN(MSIOF2_RSYNC), -	GPIO_FN(HSU_IQ_AGC3), GPIO_FN(MFG2_OUT1), GPIO_FN(MSIOF2_RSCK), -	GPIO_FN(HSU_IQ_AGC2), GPIO_FN(PORT42_KEYOUT0), -	GPIO_FN(HSU_IQ_AGC1), GPIO_FN(PORT43_KEYOUT1), -	GPIO_FN(HSU_IQ_AGC0), GPIO_FN(PORT44_KEYOUT2), -	GPIO_FN(HSU_IQ_AGC_ST), GPIO_FN(PORT45_KEYOUT3), -	GPIO_FN(HSU_IQ_PDO), GPIO_FN(PORT46_KEYOUT4), -	GPIO_FN(HSU_IQ_PYO), GPIO_FN(PORT47_KEYOUT5), -	GPIO_FN(HSU_EN_TXMUX_G3MO), GPIO_FN(PORT48_KEYIN0), -	GPIO_FN(HSU_I_TXMUX_G3MO), GPIO_FN(PORT49_KEYIN1), -	GPIO_FN(HSU_Q_TXMUX_G3MO), GPIO_FN(PORT50_KEYIN2), -	GPIO_FN(HSU_SYO), GPIO_FN(PORT51_MSIOF2_TSYNC), -	GPIO_FN(HSU_SDO), GPIO_FN(PORT52_MSIOF2_TSCK), -	GPIO_FN(HSU_TGTTI_G3MO), GPIO_FN(PORT53_MSIOF2_TXD), -	GPIO_FN(B_TIME_STAMP), GPIO_FN(PORT54_MSIOF2_RXD), -	GPIO_FN(HSU_SDI), GPIO_FN(PORT55_KEYIN3), -	GPIO_FN(HSU_SCO), GPIO_FN(PORT56_KEYIN4), -	GPIO_FN(HSU_DREQ), GPIO_FN(PORT57_KEYIN5), -	GPIO_FN(HSU_DACK), GPIO_FN(PORT58_KEYIN6), -	GPIO_FN(HSU_CLK61M), GPIO_FN(PORT59_MSIOF2_SS1), -	GPIO_FN(HSU_XRST), GPIO_FN(PORT60_MSIOF2_SS2), -	GPIO_FN(PCMCLKO), GPIO_FN(SYNC8KO), GPIO_FN(DNPCM_A), GPIO_FN(UPPCM_A), -	GPIO_FN(XTALB1L), -	GPIO_FN(GPS_AGC1), GPIO_FN(SCIFA0_RTS), -	GPIO_FN(GPS_AGC2), GPIO_FN(SCIFA0_SCK), -	GPIO_FN(GPS_AGC3), GPIO_FN(SCIFA0_TXD), -	GPIO_FN(GPS_AGC4), GPIO_FN(SCIFA0_RXD), -	GPIO_FN(GPS_PWRD), GPIO_FN(SCIFA0_CTS), -	GPIO_FN(GPS_IM), GPIO_FN(GPS_IS), GPIO_FN(GPS_QM), GPIO_FN(GPS_QS), -	GPIO_FN(SIUBOMC), GPIO_FN(TPU2TO0), -	GPIO_FN(SIUCKB), GPIO_FN(TPU2TO1), -	GPIO_FN(SIUBOLR), GPIO_FN(BBIF2_TSYNC), GPIO_FN(TPU2TO2), -	GPIO_FN(SIUBOBT), GPIO_FN(BBIF2_TSCK), GPIO_FN(TPU2TO3), -	GPIO_FN(SIUBOSLD), GPIO_FN(BBIF2_TXD), GPIO_FN(TPU3TO0), -	GPIO_FN(SIUBILR), GPIO_FN(TPU3TO1), -	GPIO_FN(SIUBIBT), GPIO_FN(TPU3TO2), -	GPIO_FN(SIUBISLD), GPIO_FN(TPU3TO3), -	GPIO_FN(NMI), GPIO_FN(TPU4TO0), -	GPIO_FN(DNPCM_M), GPIO_FN(TPU4TO1), GPIO_FN(TPU4TO2), GPIO_FN(TPU4TO3), -	GPIO_FN(IRQ_TMPB), -	GPIO_FN(PWEN), GPIO_FN(MFG1_OUT1), -	GPIO_FN(OVCN), GPIO_FN(MFG1_IN1), -	GPIO_FN(OVCN2), GPIO_FN(MFG1_IN2), - -	/* 49-3 (FN) */ -	GPIO_FN(RFSPO1), GPIO_FN(RFSPO2), GPIO_FN(RFSPO3), -	GPIO_FN(PORT93_VIO_CKO2), -	GPIO_FN(USBTERM), GPIO_FN(EXTLP), GPIO_FN(IDIN), -	GPIO_FN(SCIFA5_CTS), GPIO_FN(MFG0_IN1), -	GPIO_FN(SCIFA5_RTS), GPIO_FN(MFG0_IN2), -	GPIO_FN(SCIFA5_RXD), -	GPIO_FN(SCIFA5_TXD), -	GPIO_FN(SCIFA5_SCK), GPIO_FN(MFG0_OUT1), -	GPIO_FN(A0_EA0), GPIO_FN(BS), -	GPIO_FN(A14_EA14), GPIO_FN(PORT102_KEYOUT0), -	GPIO_FN(A15_EA15), GPIO_FN(PORT103_KEYOUT1), GPIO_FN(DV_CLKOL), -	GPIO_FN(A16_EA16), GPIO_FN(PORT104_KEYOUT2), -	GPIO_FN(DV_VSYNCL), GPIO_FN(MSIOF0_SS1), -	GPIO_FN(A17_EA17), GPIO_FN(PORT105_KEYOUT3), -	GPIO_FN(DV_HSYNCL), GPIO_FN(MSIOF0_TSYNC), -	GPIO_FN(A18_EA18), GPIO_FN(PORT106_KEYOUT4), -	GPIO_FN(DV_DL0), GPIO_FN(MSIOF0_TSCK), -	GPIO_FN(A19_EA19), GPIO_FN(PORT107_KEYOUT5), -	GPIO_FN(DV_DL1), GPIO_FN(MSIOF0_TXD), -	GPIO_FN(A20_EA20), GPIO_FN(PORT108_KEYIN0), -	GPIO_FN(DV_DL2), GPIO_FN(MSIOF0_RSCK), -	GPIO_FN(A21_EA21), GPIO_FN(PORT109_KEYIN1), -	GPIO_FN(DV_DL3), GPIO_FN(MSIOF0_RSYNC), -	GPIO_FN(A22_EA22), GPIO_FN(PORT110_KEYIN2), -	GPIO_FN(DV_DL4), GPIO_FN(MSIOF0_MCK0), -	GPIO_FN(A23_EA23), GPIO_FN(PORT111_KEYIN3), -	GPIO_FN(DV_DL5), GPIO_FN(MSIOF0_MCK1), -	GPIO_FN(A24_EA24), GPIO_FN(PORT112_KEYIN4), -	GPIO_FN(DV_DL6), GPIO_FN(MSIOF0_RXD), -	GPIO_FN(A25_EA25), GPIO_FN(PORT113_KEYIN5), -	GPIO_FN(DV_DL7), GPIO_FN(MSIOF0_SS2), -	GPIO_FN(A26), GPIO_FN(PORT113_KEYIN6), GPIO_FN(DV_CLKIL), -	GPIO_FN(D0_ED0_NAF0), GPIO_FN(D1_ED1_NAF1), GPIO_FN(D2_ED2_NAF2), -	GPIO_FN(D3_ED3_NAF3), GPIO_FN(D4_ED4_NAF4), GPIO_FN(D5_ED5_NAF5), -	GPIO_FN(D6_ED6_NAF6), GPIO_FN(D7_ED7_NAF7), GPIO_FN(D8_ED8_NAF8), -	GPIO_FN(D9_ED9_NAF9), GPIO_FN(D10_ED10_NAF10), GPIO_FN(D11_ED11_NAF11), -	GPIO_FN(D12_ED12_NAF12), GPIO_FN(D13_ED13_NAF13), -	GPIO_FN(D14_ED14_NAF14), GPIO_FN(D15_ED15_NAF15), -	GPIO_FN(CS4), GPIO_FN(CS5A), GPIO_FN(CS5B), GPIO_FN(FCE1), -	GPIO_FN(CS6B), GPIO_FN(XCS2), GPIO_FN(FCE0), GPIO_FN(CS6A), -	GPIO_FN(DACK0), GPIO_FN(WAIT), GPIO_FN(DREQ0), GPIO_FN(RD_XRD), -	GPIO_FN(A27), GPIO_FN(RDWR_XWE), GPIO_FN(WE0_XWR0_FWE), -	GPIO_FN(WE1_XWR1), GPIO_FN(FRB), GPIO_FN(CKO), -	GPIO_FN(NBRSTOUT), GPIO_FN(NBRST), - -	/* 49-4 (FN) */ -	GPIO_FN(RFSPO0), GPIO_FN(PORT146_VIO_CKO2), GPIO_FN(TSTMD), -	GPIO_FN(VIO_VD), GPIO_FN(VIO_HD), -	GPIO_FN(VIO_D0), GPIO_FN(VIO_D1), GPIO_FN(VIO_D2), -	GPIO_FN(VIO_D3), GPIO_FN(VIO_D4), GPIO_FN(VIO_D5), -	GPIO_FN(VIO_D6), GPIO_FN(VIO_D7), GPIO_FN(VIO_D8), -	GPIO_FN(VIO_D9), GPIO_FN(VIO_D10), GPIO_FN(VIO_D11), -	GPIO_FN(VIO_D12), GPIO_FN(VIO_D13), GPIO_FN(VIO_D14), -	GPIO_FN(VIO_D15), GPIO_FN(VIO_CLK), GPIO_FN(VIO_FIELD), -	GPIO_FN(VIO_CKO), -	GPIO_FN(MFG3_IN1), GPIO_FN(MFG3_IN2), -	GPIO_FN(M9_SLCD_A01), GPIO_FN(MFG3_OUT1), GPIO_FN(TPU0TO0), -	GPIO_FN(M10_SLCD_CK1), GPIO_FN(MFG4_IN1), GPIO_FN(TPU0TO1), -	GPIO_FN(M11_SLCD_SO1), GPIO_FN(MFG4_IN2), GPIO_FN(TPU0TO2), -	GPIO_FN(M12_SLCD_CE1), GPIO_FN(MFG4_OUT1), GPIO_FN(TPU0TO3), -	GPIO_FN(LCDD0), GPIO_FN(PORT175_KEYOUT0), GPIO_FN(DV_D0), -	GPIO_FN(SIUCKA), GPIO_FN(MFG0_OUT2), -	GPIO_FN(LCDD1), GPIO_FN(PORT176_KEYOUT1), GPIO_FN(DV_D1), -	GPIO_FN(SIUAOLR), GPIO_FN(BBIF2_TSYNC1), -	GPIO_FN(LCDD2), GPIO_FN(PORT177_KEYOUT2), GPIO_FN(DV_D2), -	GPIO_FN(SIUAOBT), GPIO_FN(BBIF2_TSCK1), -	GPIO_FN(LCDD3), GPIO_FN(PORT178_KEYOUT3), GPIO_FN(DV_D3), -	GPIO_FN(SIUAOSLD), GPIO_FN(BBIF2_TXD1), -	GPIO_FN(LCDD4), GPIO_FN(PORT179_KEYOUT4), GPIO_FN(DV_D4), -	GPIO_FN(SIUAISPD), GPIO_FN(MFG1_OUT2), -	GPIO_FN(LCDD5), GPIO_FN(PORT180_KEYOUT5), GPIO_FN(DV_D5), -	GPIO_FN(SIUAILR), GPIO_FN(MFG2_OUT2), -	GPIO_FN(LCDD6), GPIO_FN(DV_D6), -	GPIO_FN(SIUAIBT), GPIO_FN(MFG3_OUT2), GPIO_FN(XWR2), -	GPIO_FN(LCDD7), GPIO_FN(DV_D7), -	GPIO_FN(SIUAISLD), GPIO_FN(MFG4_OUT2), GPIO_FN(XWR3), -	GPIO_FN(LCDD8), GPIO_FN(DV_D8), GPIO_FN(D16), GPIO_FN(ED16), -	GPIO_FN(LCDD9), GPIO_FN(DV_D9), GPIO_FN(D17), GPIO_FN(ED17), -	GPIO_FN(LCDD10), GPIO_FN(DV_D10), GPIO_FN(D18), GPIO_FN(ED18), -	GPIO_FN(LCDD11), GPIO_FN(DV_D11), GPIO_FN(D19), GPIO_FN(ED19), -	GPIO_FN(LCDD12), GPIO_FN(DV_D12), GPIO_FN(D20), GPIO_FN(ED20), -	GPIO_FN(LCDD13), GPIO_FN(DV_D13), GPIO_FN(D21), GPIO_FN(ED21), -	GPIO_FN(LCDD14), GPIO_FN(DV_D14), GPIO_FN(D22), GPIO_FN(ED22), -	GPIO_FN(LCDD15), GPIO_FN(DV_D15), GPIO_FN(D23), GPIO_FN(ED23), -	GPIO_FN(LCDD16), GPIO_FN(DV_HSYNC), GPIO_FN(D24), GPIO_FN(ED24), -	GPIO_FN(LCDD17), GPIO_FN(DV_VSYNC), GPIO_FN(D25), GPIO_FN(ED25), -	GPIO_FN(LCDD18), GPIO_FN(DREQ2), GPIO_FN(MSIOF0L_TSCK), -	GPIO_FN(D26), GPIO_FN(ED26), -	GPIO_FN(LCDD19), GPIO_FN(MSIOF0L_TSYNC), -	GPIO_FN(D27), GPIO_FN(ED27), -	GPIO_FN(LCDD20), GPIO_FN(TS_SPSYNC1), GPIO_FN(MSIOF0L_MCK0), -	GPIO_FN(D28), GPIO_FN(ED28), -	GPIO_FN(LCDD21), GPIO_FN(TS_SDAT1), GPIO_FN(MSIOF0L_MCK1), -	GPIO_FN(D29), GPIO_FN(ED29), -	GPIO_FN(LCDD22), GPIO_FN(TS_SDEN1), GPIO_FN(MSIOF0L_SS1), -	GPIO_FN(D30), GPIO_FN(ED30), -	GPIO_FN(LCDD23), GPIO_FN(TS_SCK1), GPIO_FN(MSIOF0L_SS2), -	GPIO_FN(D31), GPIO_FN(ED31), -	GPIO_FN(LCDDCK), GPIO_FN(LCDWR), GPIO_FN(DV_CKO), GPIO_FN(SIUAOSPD), -	GPIO_FN(LCDRD), GPIO_FN(DACK2), GPIO_FN(MSIOF0L_RSYNC), - -	/* 49-5 (FN) */ -	GPIO_FN(LCDHSYN), GPIO_FN(LCDCS), GPIO_FN(LCDCS2), GPIO_FN(DACK3), -	GPIO_FN(LCDDISP), GPIO_FN(LCDRS), GPIO_FN(DREQ3), GPIO_FN(MSIOF0L_RSCK), -	GPIO_FN(LCDCSYN), GPIO_FN(LCDCSYN2), GPIO_FN(DV_CKI), -	GPIO_FN(LCDLCLK), GPIO_FN(DREQ1), GPIO_FN(MSIOF0L_RXD), -	GPIO_FN(LCDDON), GPIO_FN(LCDDON2), GPIO_FN(DACK1), GPIO_FN(MSIOF0L_TXD), -	GPIO_FN(VIO_DR0), GPIO_FN(VIO_DR1), GPIO_FN(VIO_DR2), GPIO_FN(VIO_DR3), -	GPIO_FN(VIO_DR4), GPIO_FN(VIO_DR5), GPIO_FN(VIO_DR6), GPIO_FN(VIO_DR7), -	GPIO_FN(VIO_VDR), GPIO_FN(VIO_HDR), -	GPIO_FN(VIO_CLKR), GPIO_FN(VIO_CKOR), -	GPIO_FN(SCIFA1_TXD), GPIO_FN(GPS_PGFA0), -	GPIO_FN(SCIFA1_SCK), GPIO_FN(GPS_PGFA1), -	GPIO_FN(SCIFA1_RTS), GPIO_FN(GPS_EPPSINMON), -	GPIO_FN(SCIFA1_RXD), GPIO_FN(SCIFA1_CTS), -	GPIO_FN(MSIOF1_TXD), GPIO_FN(SCIFA1_TXD2), GPIO_FN(GPS_TXD), -	GPIO_FN(MSIOF1_TSYNC), GPIO_FN(SCIFA1_CTS2), GPIO_FN(I2C_SDA2), -	GPIO_FN(MSIOF1_TSCK), GPIO_FN(SCIFA1_SCK2), -	GPIO_FN(MSIOF1_RXD), GPIO_FN(SCIFA1_RXD2), GPIO_FN(GPS_RXD), -	GPIO_FN(MSIOF1_RSCK), GPIO_FN(SCIFA1_RTS2), -	GPIO_FN(MSIOF1_RSYNC), GPIO_FN(I2C_SCL2), -	GPIO_FN(MSIOF1_MCK0), GPIO_FN(MSIOF1_MCK1), -	GPIO_FN(MSIOF1_SS1), GPIO_FN(EDBGREQ3), -	GPIO_FN(MSIOF1_SS2), -	GPIO_FN(PORT236_IROUT), GPIO_FN(IRDA_OUT), -	GPIO_FN(IRDA_IN), GPIO_FN(IRDA_FIRSEL), -	GPIO_FN(TPU1TO0), GPIO_FN(TS_SPSYNC3), -	GPIO_FN(TPU1TO1), GPIO_FN(TS_SDAT3), -	GPIO_FN(TPU1TO2), GPIO_FN(TS_SDEN3), GPIO_FN(PORT241_MSIOF2_SS1), -	GPIO_FN(TPU1TO3), GPIO_FN(PORT242_MSIOF2_TSCK), -	GPIO_FN(M13_BSW), GPIO_FN(PORT243_MSIOF2_TSYNC), -	GPIO_FN(M14_GSW), GPIO_FN(PORT244_MSIOF2_TXD), -	GPIO_FN(PORT245_IROUT), GPIO_FN(M15_RSW), -	GPIO_FN(SOUT3), GPIO_FN(SCIFA2_TXD1), -	GPIO_FN(SIN3), GPIO_FN(SCIFA2_RXD1), -	GPIO_FN(XRTS3), GPIO_FN(SCIFA2_RTS1), GPIO_FN(PORT248_MSIOF2_SS2), -	GPIO_FN(XCTS3), GPIO_FN(SCIFA2_CTS1), GPIO_FN(PORT249_MSIOF2_RXD), -	GPIO_FN(DINT), GPIO_FN(SCIFA2_SCK1), GPIO_FN(TS_SCK3), -	GPIO_FN(SDHICLK0), GPIO_FN(TCK2), -	GPIO_FN(SDHICD0), -	GPIO_FN(SDHID0_0), GPIO_FN(TMS2), -	GPIO_FN(SDHID0_1), GPIO_FN(TDO2), -	GPIO_FN(SDHID0_2), GPIO_FN(TDI2), -	GPIO_FN(SDHID0_3), GPIO_FN(RTCK2), - -	/* 49-6 (FN) */ -	GPIO_FN(SDHICMD0), GPIO_FN(TRST2), -	GPIO_FN(SDHIWP0), GPIO_FN(EDBGREQ2), -	GPIO_FN(SDHICLK1), GPIO_FN(TCK3), -	GPIO_FN(SDHID1_0), GPIO_FN(M11_SLCD_SO2), -	GPIO_FN(TS_SPSYNC2), GPIO_FN(TMS3), -	GPIO_FN(SDHID1_1), GPIO_FN(M9_SLCD_AO2), -	GPIO_FN(TS_SDAT2), GPIO_FN(TDO3), -	GPIO_FN(SDHID1_2), GPIO_FN(M10_SLCD_CK2), -	GPIO_FN(TS_SDEN2), GPIO_FN(TDI3), -	GPIO_FN(SDHID1_3), GPIO_FN(M12_SLCD_CE2), -	GPIO_FN(TS_SCK2), GPIO_FN(RTCK3), -	GPIO_FN(SDHICMD1), GPIO_FN(TRST3), -	GPIO_FN(SDHICLK2), GPIO_FN(SCIFB_SCK), -	GPIO_FN(SDHID2_0), GPIO_FN(SCIFB_TXD), -	GPIO_FN(SDHID2_1), GPIO_FN(SCIFB_CTS), -	GPIO_FN(SDHID2_2), GPIO_FN(SCIFB_RXD), -	GPIO_FN(SDHID2_3), GPIO_FN(SCIFB_RTS), -	GPIO_FN(SDHICMD2), -	GPIO_FN(RESETOUTS), -	GPIO_FN(DIVLOCK), -}; - -static struct pinmux_cfg_reg pinmux_config_regs[] = { -	PORTCR(0, 0xe6050000), /* PORT0CR */ -	PORTCR(1, 0xe6050001), /* PORT1CR */ -	PORTCR(2, 0xe6050002), /* PORT2CR */ -	PORTCR(3, 0xe6050003), /* PORT3CR */ -	PORTCR(4, 0xe6050004), /* PORT4CR */ -	PORTCR(5, 0xe6050005), /* PORT5CR */ -	PORTCR(6, 0xe6050006), /* PORT6CR */ -	PORTCR(7, 0xe6050007), /* PORT7CR */ -	PORTCR(8, 0xe6050008), /* PORT8CR */ -	PORTCR(9, 0xe6050009), /* PORT9CR */ - -	PORTCR(10, 0xe605000a), /* PORT10CR */ -	PORTCR(11, 0xe605000b), /* PORT11CR */ -	PORTCR(12, 0xe605000c), /* PORT12CR */ -	PORTCR(13, 0xe605000d), /* PORT13CR */ -	PORTCR(14, 0xe605000e), /* PORT14CR */ -	PORTCR(15, 0xe605000f), /* PORT15CR */ -	PORTCR(16, 0xe6050010), /* PORT16CR */ -	PORTCR(17, 0xe6050011), /* PORT17CR */ -	PORTCR(18, 0xe6050012), /* PORT18CR */ -	PORTCR(19, 0xe6050013), /* PORT19CR */ - -	PORTCR(20, 0xe6050014), /* PORT20CR */ -	PORTCR(21, 0xe6050015), /* PORT21CR */ -	PORTCR(22, 0xe6050016), /* PORT22CR */ -	PORTCR(23, 0xe6050017), /* PORT23CR */ -	PORTCR(24, 0xe6050018), /* PORT24CR */ -	PORTCR(25, 0xe6050019), /* PORT25CR */ -	PORTCR(26, 0xe605001a), /* PORT26CR */ -	PORTCR(27, 0xe605001b), /* PORT27CR */ -	PORTCR(28, 0xe605001c), /* PORT28CR */ -	PORTCR(29, 0xe605001d), /* PORT29CR */ - -	PORTCR(30, 0xe605001e), /* PORT30CR */ -	PORTCR(31, 0xe605001f), /* PORT31CR */ -	PORTCR(32, 0xe6050020), /* PORT32CR */ -	PORTCR(33, 0xe6050021), /* PORT33CR */ -	PORTCR(34, 0xe6050022), /* PORT34CR */ -	PORTCR(35, 0xe6050023), /* PORT35CR */ -	PORTCR(36, 0xe6050024), /* PORT36CR */ -	PORTCR(37, 0xe6050025), /* PORT37CR */ -	PORTCR(38, 0xe6050026), /* PORT38CR */ -	PORTCR(39, 0xe6050027), /* PORT39CR */ - -	PORTCR(40, 0xe6050028), /* PORT40CR */ -	PORTCR(41, 0xe6050029), /* PORT41CR */ -	PORTCR(42, 0xe605002a), /* PORT42CR */ -	PORTCR(43, 0xe605002b), /* PORT43CR */ -	PORTCR(44, 0xe605002c), /* PORT44CR */ -	PORTCR(45, 0xe605002d), /* PORT45CR */ -	PORTCR(46, 0xe605002e), /* PORT46CR */ -	PORTCR(47, 0xe605002f), /* PORT47CR */ -	PORTCR(48, 0xe6050030), /* PORT48CR */ -	PORTCR(49, 0xe6050031), /* PORT49CR */ - -	PORTCR(50, 0xe6050032), /* PORT50CR */ -	PORTCR(51, 0xe6050033), /* PORT51CR */ -	PORTCR(52, 0xe6050034), /* PORT52CR */ -	PORTCR(53, 0xe6050035), /* PORT53CR */ -	PORTCR(54, 0xe6050036), /* PORT54CR */ -	PORTCR(55, 0xe6050037), /* PORT55CR */ -	PORTCR(56, 0xe6050038), /* PORT56CR */ -	PORTCR(57, 0xe6050039), /* PORT57CR */ -	PORTCR(58, 0xe605003a), /* PORT58CR */ -	PORTCR(59, 0xe605003b), /* PORT59CR */ - -	PORTCR(60, 0xe605003c), /* PORT60CR */ -	PORTCR(61, 0xe605003d), /* PORT61CR */ -	PORTCR(62, 0xe605003e), /* PORT62CR */ -	PORTCR(63, 0xe605003f), /* PORT63CR */ -	PORTCR(64, 0xe6050040), /* PORT64CR */ -	PORTCR(65, 0xe6050041), /* PORT65CR */ -	PORTCR(66, 0xe6050042), /* PORT66CR */ -	PORTCR(67, 0xe6050043), /* PORT67CR */ -	PORTCR(68, 0xe6050044), /* PORT68CR */ -	PORTCR(69, 0xe6050045), /* PORT69CR */ - -	PORTCR(70, 0xe6050046), /* PORT70CR */ -	PORTCR(71, 0xe6050047), /* PORT71CR */ -	PORTCR(72, 0xe6050048), /* PORT72CR */ -	PORTCR(73, 0xe6050049), /* PORT73CR */ -	PORTCR(74, 0xe605004a), /* PORT74CR */ -	PORTCR(75, 0xe605004b), /* PORT75CR */ -	PORTCR(76, 0xe605004c), /* PORT76CR */ -	PORTCR(77, 0xe605004d), /* PORT77CR */ -	PORTCR(78, 0xe605004e), /* PORT78CR */ -	PORTCR(79, 0xe605004f), /* PORT79CR */ - -	PORTCR(80, 0xe6050050), /* PORT80CR */ -	PORTCR(81, 0xe6050051), /* PORT81CR */ -	PORTCR(82, 0xe6050052), /* PORT82CR */ -	PORTCR(83, 0xe6050053), /* PORT83CR */ -	PORTCR(84, 0xe6050054), /* PORT84CR */ -	PORTCR(85, 0xe6050055), /* PORT85CR */ -	PORTCR(86, 0xe6050056), /* PORT86CR */ -	PORTCR(87, 0xe6050057), /* PORT87CR */ -	PORTCR(88, 0xe6051058), /* PORT88CR */ -	PORTCR(89, 0xe6051059), /* PORT89CR */ - -	PORTCR(90, 0xe605105a), /* PORT90CR */ -	PORTCR(91, 0xe605105b), /* PORT91CR */ -	PORTCR(92, 0xe605105c), /* PORT92CR */ -	PORTCR(93, 0xe605105d), /* PORT93CR */ -	PORTCR(94, 0xe605105e), /* PORT94CR */ -	PORTCR(95, 0xe605105f), /* PORT95CR */ -	PORTCR(96, 0xe6051060), /* PORT96CR */ -	PORTCR(97, 0xe6051061), /* PORT97CR */ -	PORTCR(98, 0xe6051062), /* PORT98CR */ -	PORTCR(99, 0xe6051063), /* PORT99CR */ - -	PORTCR(100, 0xe6051064), /* PORT100CR */ -	PORTCR(101, 0xe6051065), /* PORT101CR */ -	PORTCR(102, 0xe6051066), /* PORT102CR */ -	PORTCR(103, 0xe6051067), /* PORT103CR */ -	PORTCR(104, 0xe6051068), /* PORT104CR */ -	PORTCR(105, 0xe6051069), /* PORT105CR */ -	PORTCR(106, 0xe605106a), /* PORT106CR */ -	PORTCR(107, 0xe605106b), /* PORT107CR */ -	PORTCR(108, 0xe605106c), /* PORT108CR */ -	PORTCR(109, 0xe605106d), /* PORT109CR */ - -	PORTCR(110, 0xe605106e), /* PORT110CR */ -	PORTCR(111, 0xe605106f), /* PORT111CR */ -	PORTCR(112, 0xe6051070), /* PORT112CR */ -	PORTCR(113, 0xe6051071), /* PORT113CR */ -	PORTCR(114, 0xe6051072), /* PORT114CR */ -	PORTCR(115, 0xe6051073), /* PORT115CR */ -	PORTCR(116, 0xe6051074), /* PORT116CR */ -	PORTCR(117, 0xe6051075), /* PORT117CR */ -	PORTCR(118, 0xe6051076), /* PORT118CR */ -	PORTCR(119, 0xe6051077), /* PORT119CR */ - -	PORTCR(120, 0xe6051078), /* PORT120CR */ -	PORTCR(121, 0xe6051079), /* PORT121CR */ -	PORTCR(122, 0xe605107a), /* PORT122CR */ -	PORTCR(123, 0xe605107b), /* PORT123CR */ -	PORTCR(124, 0xe605107c), /* PORT124CR */ -	PORTCR(125, 0xe605107d), /* PORT125CR */ -	PORTCR(126, 0xe605107e), /* PORT126CR */ -	PORTCR(127, 0xe605107f), /* PORT127CR */ -	PORTCR(128, 0xe6051080), /* PORT128CR */ -	PORTCR(129, 0xe6051081), /* PORT129CR */ - -	PORTCR(130, 0xe6051082), /* PORT130CR */ -	PORTCR(131, 0xe6051083), /* PORT131CR */ -	PORTCR(132, 0xe6051084), /* PORT132CR */ -	PORTCR(133, 0xe6051085), /* PORT133CR */ -	PORTCR(134, 0xe6051086), /* PORT134CR */ -	PORTCR(135, 0xe6051087), /* PORT135CR */ -	PORTCR(136, 0xe6051088), /* PORT136CR */ -	PORTCR(137, 0xe6051089), /* PORT137CR */ -	PORTCR(138, 0xe605108a), /* PORT138CR */ -	PORTCR(139, 0xe605108b), /* PORT139CR */ - -	PORTCR(140, 0xe605108c), /* PORT140CR */ -	PORTCR(141, 0xe605108d), /* PORT141CR */ -	PORTCR(142, 0xe605108e), /* PORT142CR */ -	PORTCR(143, 0xe605108f), /* PORT143CR */ -	PORTCR(144, 0xe6051090), /* PORT144CR */ -	PORTCR(145, 0xe6051091), /* PORT145CR */ -	PORTCR(146, 0xe6051092), /* PORT146CR */ -	PORTCR(147, 0xe6051093), /* PORT147CR */ -	PORTCR(148, 0xe6051094), /* PORT148CR */ -	PORTCR(149, 0xe6051095), /* PORT149CR */ - -	PORTCR(150, 0xe6051096), /* PORT150CR */ -	PORTCR(151, 0xe6051097), /* PORT151CR */ -	PORTCR(152, 0xe6051098), /* PORT152CR */ -	PORTCR(153, 0xe6051099), /* PORT153CR */ -	PORTCR(154, 0xe605109a), /* PORT154CR */ -	PORTCR(155, 0xe605109b), /* PORT155CR */ -	PORTCR(156, 0xe605109c), /* PORT156CR */ -	PORTCR(157, 0xe605109d), /* PORT157CR */ -	PORTCR(158, 0xe605109e), /* PORT158CR */ -	PORTCR(159, 0xe605109f), /* PORT159CR */ - -	PORTCR(160, 0xe60510a0), /* PORT160CR */ -	PORTCR(161, 0xe60510a1), /* PORT161CR */ -	PORTCR(162, 0xe60510a2), /* PORT162CR */ -	PORTCR(163, 0xe60510a3), /* PORT163CR */ -	PORTCR(164, 0xe60510a4), /* PORT164CR */ -	PORTCR(165, 0xe60510a5), /* PORT165CR */ -	PORTCR(166, 0xe60510a6), /* PORT166CR */ -	PORTCR(167, 0xe60510a7), /* PORT167CR */ -	PORTCR(168, 0xe60510a8), /* PORT168CR */ -	PORTCR(169, 0xe60510a9), /* PORT169CR */ - -	PORTCR(170, 0xe60510aa), /* PORT170CR */ -	PORTCR(171, 0xe60510ab), /* PORT171CR */ -	PORTCR(172, 0xe60510ac), /* PORT172CR */ -	PORTCR(173, 0xe60510ad), /* PORT173CR */ -	PORTCR(174, 0xe60510ae), /* PORT174CR */ -	PORTCR(175, 0xe60520af), /* PORT175CR */ -	PORTCR(176, 0xe60520b0), /* PORT176CR */ -	PORTCR(177, 0xe60520b1), /* PORT177CR */ -	PORTCR(178, 0xe60520b2), /* PORT178CR */ -	PORTCR(179, 0xe60520b3), /* PORT179CR */ - -	PORTCR(180, 0xe60520b4), /* PORT180CR */ -	PORTCR(181, 0xe60520b5), /* PORT181CR */ -	PORTCR(182, 0xe60520b6), /* PORT182CR */ -	PORTCR(183, 0xe60520b7), /* PORT183CR */ -	PORTCR(184, 0xe60520b8), /* PORT184CR */ -	PORTCR(185, 0xe60520b9), /* PORT185CR */ -	PORTCR(186, 0xe60520ba), /* PORT186CR */ -	PORTCR(187, 0xe60520bb), /* PORT187CR */ -	PORTCR(188, 0xe60520bc), /* PORT188CR */ -	PORTCR(189, 0xe60520bd), /* PORT189CR */ - -	PORTCR(190, 0xe60520be), /* PORT190CR */ -	PORTCR(191, 0xe60520bf), /* PORT191CR */ -	PORTCR(192, 0xe60520c0), /* PORT192CR */ -	PORTCR(193, 0xe60520c1), /* PORT193CR */ -	PORTCR(194, 0xe60520c2), /* PORT194CR */ -	PORTCR(195, 0xe60520c3), /* PORT195CR */ -	PORTCR(196, 0xe60520c4), /* PORT196CR */ -	PORTCR(197, 0xe60520c5), /* PORT197CR */ -	PORTCR(198, 0xe60520c6), /* PORT198CR */ -	PORTCR(199, 0xe60520c7), /* PORT199CR */ - -	PORTCR(200, 0xe60520c8), /* PORT200CR */ -	PORTCR(201, 0xe60520c9), /* PORT201CR */ -	PORTCR(202, 0xe60520ca), /* PORT202CR */ -	PORTCR(203, 0xe60520cb), /* PORT203CR */ -	PORTCR(204, 0xe60520cc), /* PORT204CR */ -	PORTCR(205, 0xe60520cd), /* PORT205CR */ -	PORTCR(206, 0xe60520ce), /* PORT206CR */ -	PORTCR(207, 0xe60520cf), /* PORT207CR */ -	PORTCR(208, 0xe60520d0), /* PORT208CR */ -	PORTCR(209, 0xe60520d1), /* PORT209CR */ - -	PORTCR(210, 0xe60520d2), /* PORT210CR */ -	PORTCR(211, 0xe60520d3), /* PORT211CR */ -	PORTCR(212, 0xe60520d4), /* PORT212CR */ -	PORTCR(213, 0xe60520d5), /* PORT213CR */ -	PORTCR(214, 0xe60520d6), /* PORT214CR */ -	PORTCR(215, 0xe60520d7), /* PORT215CR */ -	PORTCR(216, 0xe60520d8), /* PORT216CR */ -	PORTCR(217, 0xe60520d9), /* PORT217CR */ -	PORTCR(218, 0xe60520da), /* PORT218CR */ -	PORTCR(219, 0xe60520db), /* PORT219CR */ - -	PORTCR(220, 0xe60520dc), /* PORT220CR */ -	PORTCR(221, 0xe60520dd), /* PORT221CR */ -	PORTCR(222, 0xe60520de), /* PORT222CR */ -	PORTCR(223, 0xe60520df), /* PORT223CR */ -	PORTCR(224, 0xe60520e0), /* PORT224CR */ -	PORTCR(225, 0xe60520e1), /* PORT225CR */ -	PORTCR(226, 0xe60520e2), /* PORT226CR */ -	PORTCR(227, 0xe60520e3), /* PORT227CR */ -	PORTCR(228, 0xe60520e4), /* PORT228CR */ -	PORTCR(229, 0xe60520e5), /* PORT229CR */ - -	PORTCR(230, 0xe60520e6), /* PORT230CR */ -	PORTCR(231, 0xe60520e7), /* PORT231CR */ -	PORTCR(232, 0xe60520e8), /* PORT232CR */ -	PORTCR(233, 0xe60520e9), /* PORT233CR */ -	PORTCR(234, 0xe60520ea), /* PORT234CR */ -	PORTCR(235, 0xe60520eb), /* PORT235CR */ -	PORTCR(236, 0xe60530ec), /* PORT236CR */ -	PORTCR(237, 0xe60530ed), /* PORT237CR */ -	PORTCR(238, 0xe60530ee), /* PORT238CR */ -	PORTCR(239, 0xe60530ef), /* PORT239CR */ - -	PORTCR(240, 0xe60530f0), /* PORT240CR */ -	PORTCR(241, 0xe60530f1), /* PORT241CR */ -	PORTCR(242, 0xe60530f2), /* PORT242CR */ -	PORTCR(243, 0xe60530f3), /* PORT243CR */ -	PORTCR(244, 0xe60530f4), /* PORT244CR */ -	PORTCR(245, 0xe60530f5), /* PORT245CR */ -	PORTCR(246, 0xe60530f6), /* PORT246CR */ -	PORTCR(247, 0xe60530f7), /* PORT247CR */ -	PORTCR(248, 0xe60530f8), /* PORT248CR */ -	PORTCR(249, 0xe60530f9), /* PORT249CR */ - -	PORTCR(250, 0xe60530fa), /* PORT250CR */ -	PORTCR(251, 0xe60530fb), /* PORT251CR */ -	PORTCR(252, 0xe60530fc), /* PORT252CR */ -	PORTCR(253, 0xe60530fd), /* PORT253CR */ -	PORTCR(254, 0xe60530fe), /* PORT254CR */ -	PORTCR(255, 0xe60530ff), /* PORT255CR */ -	PORTCR(256, 0xe6053100), /* PORT256CR */ -	PORTCR(257, 0xe6053101), /* PORT257CR */ -	PORTCR(258, 0xe6053102), /* PORT258CR */ -	PORTCR(259, 0xe6053103), /* PORT259CR */ - -	PORTCR(260, 0xe6053104), /* PORT260CR */ -	PORTCR(261, 0xe6053105), /* PORT261CR */ -	PORTCR(262, 0xe6053106), /* PORT262CR */ -	PORTCR(263, 0xe6053107), /* PORT263CR */ -	PORTCR(264, 0xe6053108), /* PORT264CR */ -	PORTCR(265, 0xe6053109), /* PORT265CR */ -	PORTCR(266, 0xe605310a), /* PORT266CR */ -	PORTCR(267, 0xe605310b), /* PORT267CR */ -	PORTCR(268, 0xe605310c), /* PORT268CR */ -	PORTCR(269, 0xe605310d), /* PORT269CR */ - -	PORTCR(270, 0xe605310e), /* PORT270CR */ -	PORTCR(271, 0xe605310f), /* PORT271CR */ -	PORTCR(272, 0xe6053110), /* PORT272CR */ - -	{ PINMUX_CFG_REG("MSELBCR", 0xe6058024, 32, 1) { -		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -		0, 0, -		0, 0, -		0, 0, -		0, 0, -		0, 0, -		MSELBCR_MSEL2_0, MSELBCR_MSEL2_1, -		0, 0, -		0, 0 } -	}, -	{ }, -}; - -static struct pinmux_data_reg pinmux_data_regs[] = { -	{ PINMUX_DATA_REG("PORTL031_000DR", 0xe6054000, 32) { -		PORT31_DATA, PORT30_DATA, PORT29_DATA, PORT28_DATA, -		PORT27_DATA, PORT26_DATA, PORT25_DATA, PORT24_DATA, -		PORT23_DATA, PORT22_DATA, PORT21_DATA, PORT20_DATA, -		PORT19_DATA, PORT18_DATA, PORT17_DATA, PORT16_DATA, -		PORT15_DATA, PORT14_DATA, PORT13_DATA, PORT12_DATA, -		PORT11_DATA, PORT10_DATA, PORT9_DATA, PORT8_DATA, -		PORT7_DATA, PORT6_DATA, PORT5_DATA, PORT4_DATA, -		PORT3_DATA, PORT2_DATA, PORT1_DATA, PORT0_DATA } -	}, -	{ PINMUX_DATA_REG("PORTL063_032DR", 0xe6054004, 32) { -		PORT63_DATA, PORT62_DATA, PORT61_DATA, PORT60_DATA, -		PORT59_DATA, PORT58_DATA, PORT57_DATA, PORT56_DATA, -		PORT55_DATA, PORT54_DATA, PORT53_DATA, PORT52_DATA, -		PORT51_DATA, PORT50_DATA, PORT49_DATA, PORT48_DATA, -		PORT47_DATA, PORT46_DATA, PORT45_DATA, PORT44_DATA, -		PORT43_DATA, PORT42_DATA, PORT41_DATA, PORT40_DATA, -		PORT39_DATA, PORT38_DATA, PORT37_DATA, PORT36_DATA, -		PORT35_DATA, PORT34_DATA, PORT33_DATA, PORT32_DATA } -	}, -	{ PINMUX_DATA_REG("PORTL095_064DR", 0xe6054008, 32) { -		PORT95_DATA, PORT94_DATA, PORT93_DATA, PORT92_DATA, -		PORT91_DATA, PORT90_DATA, PORT89_DATA, PORT88_DATA, -		PORT87_DATA, PORT86_DATA, PORT85_DATA, PORT84_DATA, -		PORT83_DATA, PORT82_DATA, PORT81_DATA, PORT80_DATA, -		PORT79_DATA, PORT78_DATA, PORT77_DATA, PORT76_DATA, -		PORT75_DATA, PORT74_DATA, PORT73_DATA, PORT72_DATA, -		PORT71_DATA, PORT70_DATA, PORT69_DATA, PORT68_DATA, -		PORT67_DATA, PORT66_DATA, PORT65_DATA, PORT64_DATA } -	}, -	{ PINMUX_DATA_REG("PORTD127_096DR", 0xe6055004, 32) { -		PORT127_DATA, PORT126_DATA, PORT125_DATA, PORT124_DATA, -		PORT123_DATA, PORT122_DATA, PORT121_DATA, PORT120_DATA, -		PORT119_DATA, PORT118_DATA, PORT117_DATA, PORT116_DATA, -		PORT115_DATA, PORT114_DATA, PORT113_DATA, PORT112_DATA, -		PORT111_DATA, PORT110_DATA, PORT109_DATA, PORT108_DATA, -		PORT107_DATA, PORT106_DATA, PORT105_DATA, PORT104_DATA, -		PORT103_DATA, PORT102_DATA, PORT101_DATA, PORT100_DATA, -		PORT99_DATA, PORT98_DATA, PORT97_DATA, PORT96_DATA } -	}, -	{ PINMUX_DATA_REG("PORTD159_128DR", 0xe6055008, 32) { -		PORT159_DATA, PORT158_DATA, PORT157_DATA, PORT156_DATA, -		PORT155_DATA, PORT154_DATA, PORT153_DATA, PORT152_DATA, -		PORT151_DATA, PORT150_DATA, PORT149_DATA, PORT148_DATA, -		PORT147_DATA, PORT146_DATA, PORT145_DATA, PORT144_DATA, -		PORT143_DATA, PORT142_DATA, PORT141_DATA, PORT140_DATA, -		PORT139_DATA, PORT138_DATA, PORT137_DATA, PORT136_DATA, -		PORT135_DATA, PORT134_DATA, PORT133_DATA, PORT132_DATA, -		PORT131_DATA, PORT130_DATA, PORT129_DATA, PORT128_DATA } -	}, -	{ PINMUX_DATA_REG("PORTR191_160DR", 0xe6056000, 32) { -		PORT191_DATA, PORT190_DATA, PORT189_DATA, PORT188_DATA, -		PORT187_DATA, PORT186_DATA, PORT185_DATA, PORT184_DATA, -		PORT183_DATA, PORT182_DATA, PORT181_DATA, PORT180_DATA, -		PORT179_DATA, PORT178_DATA, PORT177_DATA, PORT176_DATA, -		PORT175_DATA, PORT174_DATA, PORT173_DATA, PORT172_DATA, -		PORT171_DATA, PORT170_DATA, PORT169_DATA, PORT168_DATA, -		PORT167_DATA, PORT166_DATA, PORT165_DATA, PORT164_DATA, -		PORT163_DATA, PORT162_DATA, PORT161_DATA, PORT160_DATA } -	}, -	{ PINMUX_DATA_REG("PORTR223_192DR", 0xe6056004, 32) { -		PORT223_DATA, PORT222_DATA, PORT221_DATA, PORT220_DATA, -		PORT219_DATA, PORT218_DATA, PORT217_DATA, PORT216_DATA, -		PORT215_DATA, PORT214_DATA, PORT213_DATA, PORT212_DATA, -		PORT211_DATA, PORT210_DATA, PORT209_DATA, PORT208_DATA, -		PORT207_DATA, PORT206_DATA, PORT205_DATA, PORT204_DATA, -		PORT203_DATA, PORT202_DATA, PORT201_DATA, PORT200_DATA, -		PORT199_DATA, PORT198_DATA, PORT197_DATA, PORT196_DATA, -		PORT195_DATA, PORT194_DATA, PORT193_DATA, PORT192_DATA } -	}, -	{ PINMUX_DATA_REG("PORTU255_224DR", 0xe6057000, 32) { -		PORT255_DATA, PORT254_DATA, PORT253_DATA, PORT252_DATA, -		PORT251_DATA, PORT250_DATA, PORT249_DATA, PORT248_DATA, -		PORT247_DATA, PORT246_DATA, PORT245_DATA, PORT244_DATA, -		PORT243_DATA, PORT242_DATA, PORT241_DATA, PORT240_DATA, -		PORT239_DATA, PORT238_DATA, PORT237_DATA, PORT236_DATA, -		PORT235_DATA, PORT234_DATA, PORT233_DATA, PORT232_DATA, -		PORT231_DATA, PORT230_DATA, PORT229_DATA, PORT228_DATA, -		PORT227_DATA, PORT226_DATA, PORT225_DATA, PORT224_DATA } -	}, -	{ PINMUX_DATA_REG("PORTU287_256DR", 0xe6057004, 32) { -		0, 0, 0, 0, -		0, 0, 0, 0, -		0, 0, 0, 0, -		0, 0, 0, PORT272_DATA, -		PORT271_DATA, PORT270_DATA, PORT269_DATA, PORT268_DATA, -		PORT267_DATA, PORT266_DATA, PORT265_DATA, PORT264_DATA, -		PORT263_DATA, PORT262_DATA, PORT261_DATA, PORT260_DATA, -		PORT259_DATA, PORT258_DATA, PORT257_DATA, PORT256_DATA } -	}, -	{ }, -}; - -static struct pinmux_info sh7367_pinmux_info = { -	.name = "sh7367_pfc", -	.reserved_id = PINMUX_RESERVED, -	.data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END }, -	.input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END }, -	.input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END }, -	.input_pd = { PINMUX_INPUT_PULLDOWN_BEGIN, PINMUX_INPUT_PULLDOWN_END }, -	.output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END }, -	.mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END }, -	.function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END }, - -	.first_gpio = GPIO_PORT0, -	.last_gpio = GPIO_FN_DIVLOCK, - -	.gpios = pinmux_gpios, -	.cfg_regs = pinmux_config_regs, -	.data_regs = pinmux_data_regs, - -	.gpio_data = pinmux_data, -	.gpio_data_size = ARRAY_SIZE(pinmux_data), -}; - -void sh7367_pinmux_init(void) -{ -	register_pinmux(&sh7367_pinmux_info); -} diff --git a/arch/arm/mach-shmobile/pfc-sh7377.c b/arch/arm/mach-shmobile/pfc-sh7377.c deleted file mode 100644 index f3117f67fa2..00000000000 --- a/arch/arm/mach-shmobile/pfc-sh7377.c +++ /dev/null @@ -1,1688 +0,0 @@ -/* - * sh7377 processor support - PFC hardware block - * - * Copyright (C) 2010  NISHIMOTO Hiroki - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; version 2 of the - * License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/sh_pfc.h> -#include <mach/sh7377.h> - -#define CPU_ALL_PORT(fn, pfx, sfx)				\ -	PORT_10(fn, pfx, sfx), PORT_90(fn, pfx, sfx),		\ -	PORT_10(fn, pfx##10, sfx),				\ -	PORT_1(fn, pfx##110, sfx), PORT_1(fn, pfx##111, sfx),	\ -	PORT_1(fn, pfx##112, sfx), PORT_1(fn, pfx##113, sfx),	\ -	PORT_1(fn, pfx##114, sfx), PORT_1(fn, pfx##115, sfx),	\ -	PORT_1(fn, pfx##116, sfx), PORT_1(fn, pfx##117, sfx),	\ -	PORT_1(fn, pfx##118, sfx),				\ -	PORT_1(fn, pfx##128, sfx), PORT_1(fn, pfx##129, sfx),	\ -	PORT_10(fn, pfx##13, sfx), PORT_10(fn, pfx##14, sfx),	\ -	PORT_10(fn, pfx##15, sfx),				\ -	PORT_1(fn, pfx##160, sfx), PORT_1(fn, pfx##161, sfx),	\ -	PORT_1(fn, pfx##162, sfx), PORT_1(fn, pfx##163, sfx),	\ -	PORT_1(fn, pfx##164, sfx),				\ -	PORT_1(fn, pfx##192, sfx), PORT_1(fn, pfx##193, sfx),	\ -	PORT_1(fn, pfx##194, sfx), PORT_1(fn, pfx##195, sfx),	\ -	PORT_1(fn, pfx##196, sfx), PORT_1(fn, pfx##197, sfx),	\ -	PORT_1(fn, pfx##198, sfx), PORT_1(fn, pfx##199, sfx),	\ -	PORT_10(fn, pfx##20, sfx), PORT_10(fn, pfx##21, sfx),	\ -	PORT_10(fn, pfx##22, sfx), PORT_10(fn, pfx##23, sfx),	\ -	PORT_10(fn, pfx##24, sfx), PORT_10(fn, pfx##25, sfx),	\ -	PORT_1(fn, pfx##260, sfx), PORT_1(fn, pfx##261, sfx),	\ -	PORT_1(fn, pfx##262, sfx), PORT_1(fn, pfx##263, sfx),	\ -	PORT_1(fn, pfx##264, sfx) - -enum { -	PINMUX_RESERVED = 0, - -	PINMUX_DATA_BEGIN, -	PORT_ALL(DATA), /* PORT0_DATA -> PORT264_DATA */ -	PINMUX_DATA_END, - -	PINMUX_INPUT_BEGIN, -	PORT_ALL(IN), /* PORT0_IN -> PORT264_IN */ -	PINMUX_INPUT_END, - -	PINMUX_INPUT_PULLUP_BEGIN, -	PORT_ALL(IN_PU), /* PORT0_IN_PU -> PORT264_IN_PU */ -	PINMUX_INPUT_PULLUP_END, - -	PINMUX_INPUT_PULLDOWN_BEGIN, -	PORT_ALL(IN_PD), /* PORT0_IN_PD -> PORT264_IN_PD */ -	PINMUX_INPUT_PULLDOWN_END, - -	PINMUX_OUTPUT_BEGIN, -	PORT_ALL(OUT), /* PORT0_OUT -> PORT264_OUT */ -	PINMUX_OUTPUT_END, - -	PINMUX_FUNCTION_BEGIN, -	PORT_ALL(FN_IN), /* PORT0_FN_IN -> PORT264_FN_IN */ -	PORT_ALL(FN_OUT), /* PORT0_FN_OUT -> PORT264_FN_OUT */ -	PORT_ALL(FN0), /* PORT0_FN0 -> PORT264_FN0 */ -	PORT_ALL(FN1), /* PORT0_FN1 -> PORT264_FN1 */ -	PORT_ALL(FN2), /* PORT0_FN2 -> PORT264_FN2 */ -	PORT_ALL(FN3), /* PORT0_FN3 -> PORT264_FN3 */ -	PORT_ALL(FN4), /* PORT0_FN4 -> PORT264_FN4 */ -	PORT_ALL(FN5), /* PORT0_FN5 -> PORT264_FN5 */ -	PORT_ALL(FN6), /* PORT0_FN6 -> PORT264_FN6 */ -	PORT_ALL(FN7), /* PORT0_FN7 -> PORT264_FN7 */ - -	MSELBCR_MSEL17_1, MSELBCR_MSEL17_0, -	MSELBCR_MSEL16_1, MSELBCR_MSEL16_0, -	PINMUX_FUNCTION_END, - -	PINMUX_MARK_BEGIN, -	/* Special Pull-up / Pull-down Functions */ -	PORT66_KEYIN0_PU_MARK, PORT67_KEYIN1_PU_MARK, -	PORT68_KEYIN2_PU_MARK, PORT69_KEYIN3_PU_MARK, -	PORT70_KEYIN4_PU_MARK, PORT71_KEYIN5_PU_MARK, -	PORT72_KEYIN6_PU_MARK, - -	/* 55-1 */ -	VBUS_0_MARK, -	CPORT0_MARK, -	CPORT1_MARK, -	CPORT2_MARK, -	CPORT3_MARK, -	CPORT4_MARK, -	CPORT5_MARK, -	CPORT6_MARK, -	CPORT7_MARK, -	CPORT8_MARK, -	CPORT9_MARK, -	CPORT10_MARK, -	CPORT11_MARK, SIN2_MARK, -	CPORT12_MARK, XCTS2_MARK, -	CPORT13_MARK, RFSPO4_MARK, -	CPORT14_MARK, RFSPO5_MARK, -	CPORT15_MARK, SCIFA0_SCK_MARK, GPS_AGC2_MARK, -	CPORT16_MARK, SCIFA0_TXD_MARK, GPS_AGC3_MARK, -	CPORT17_IC_OE_MARK, SOUT2_MARK, -	CPORT18_MARK, XRTS2_MARK, PORT19_VIO_CKO2_MARK, -	CPORT19_MPORT1_MARK, -	CPORT20_MARK, RFSPO6_MARK, -	CPORT21_MARK, STATUS0_MARK, -	CPORT22_MARK, STATUS1_MARK, -	CPORT23_MARK, STATUS2_MARK, RFSPO7_MARK, -	B_SYNLD1_MARK, -	B_SYNLD2_MARK, SYSENMSK_MARK, -	XMAINPS_MARK, -	XDIVPS_MARK, -	XIDRST_MARK, -	IDCLK_MARK, IC_DP_MARK, -	IDIO_MARK, IC_DM_MARK, -	SOUT1_MARK, SCIFA4_TXD_MARK, M02_BERDAT_MARK, -	SIN1_MARK, SCIFA4_RXD_MARK, XWUP_MARK, -	XRTS1_MARK, SCIFA4_RTS_MARK, M03_BERCLK_MARK, -	XCTS1_MARK, SCIFA4_CTS_MARK, -	PCMCLKO_MARK, -	SYNC8KO_MARK, - -	/* 55-2 */ -	DNPCM_A_MARK, -	UPPCM_A_MARK, -	VACK_MARK, -	XTALB1L_MARK, -	GPS_AGC1_MARK, SCIFA0_RTS_MARK, -	GPS_AGC4_MARK, SCIFA0_RXD_MARK, -	GPS_PWRDOWN_MARK, SCIFA0_CTS_MARK, -	GPS_IM_MARK, -	GPS_IS_MARK, -	GPS_QM_MARK, -	GPS_QS_MARK, -	FMSOCK_MARK, PORT49_IRDA_OUT_MARK, PORT49_IROUT_MARK, -	FMSOOLR_MARK, BBIF2_TSYNC2_MARK, TPU2TO2_MARK, IPORT3_MARK, -	FMSIOLR_MARK, -	FMSOOBT_MARK, BBIF2_TSCK2_MARK, TPU2TO3_MARK, OPORT1_MARK, -	FMSIOBT_MARK, -	FMSOSLD_MARK, BBIF2_TXD2_MARK, OPORT2_MARK, -	FMSOILR_MARK, PORT53_IRDA_IN_MARK, TPU3TO3_MARK, OPORT3_MARK, -	FMSIILR_MARK, -	FMSOIBT_MARK, PORT54_IRDA_FIRSEL_MARK, TPU3TO2_MARK, FMSIIBT_MARK, -	FMSISLD_MARK, MFG0_OUT1_MARK, TPU0TO0_MARK, -	A0_EA0_MARK, BS_MARK, -	A12_EA12_MARK, PORT58_VIO_CKOR_MARK, TPU4TO2_MARK, -	A13_EA13_MARK, PORT59_IROUT_MARK, MFG0_OUT2_MARK, TPU0TO1_MARK, -	A14_EA14_MARK, PORT60_KEYOUT5_MARK, -	A15_EA15_MARK, PORT61_KEYOUT4_MARK, -	A16_EA16_MARK, PORT62_KEYOUT3_MARK, MSIOF0_SS1_MARK, -	A17_EA17_MARK, PORT63_KEYOUT2_MARK, MSIOF0_TSYNC_MARK, -	A18_EA18_MARK, PORT64_KEYOUT1_MARK, MSIOF0_TSCK_MARK, -	A19_EA19_MARK, PORT65_KEYOUT0_MARK, MSIOF0_TXD_MARK, -	A20_EA20_MARK, PORT66_KEYIN0_MARK, MSIOF0_RSCK_MARK, -	A21_EA21_MARK, PORT67_KEYIN1_MARK, MSIOF0_RSYNC_MARK, -	A22_EA22_MARK, PORT68_KEYIN2_MARK, MSIOF0_MCK0_MARK, -	A23_EA23_MARK, PORT69_KEYIN3_MARK, MSIOF0_MCK1_MARK, -	A24_EA24_MARK, PORT70_KEYIN4_MARK, MSIOF0_RXD_MARK, -	A25_EA25_MARK, PORT71_KEYIN5_MARK, MSIOF0_SS2_MARK, -	A26_MARK, PORT72_KEYIN6_MARK, -	D0_ED0_NAF0_MARK, -	D1_ED1_NAF1_MARK, -	D2_ED2_NAF2_MARK, -	D3_ED3_NAF3_MARK, -	D4_ED4_NAF4_MARK, -	D5_ED5_NAF5_MARK, -	D6_ED6_NAF6_MARK, -	D7_ED7_NAF7_MARK, -	D8_ED8_NAF8_MARK, -	D9_ED9_NAF9_MARK, -	D10_ED10_NAF10_MARK, -	D11_ED11_NAF11_MARK, -	D12_ED12_NAF12_MARK, -	D13_ED13_NAF13_MARK, -	D14_ED14_NAF14_MARK, -	D15_ED15_NAF15_MARK, -	CS4_MARK, -	CS5A_MARK, FMSICK_MARK, -	CS5B_MARK, FCE1_MARK, - -	/* 55-3 */ -	CS6B_MARK, XCS2_MARK, CS6A_MARK, DACK0_MARK, -	FCE0_MARK, -	WAIT_MARK, DREQ0_MARK, -	RD_XRD_MARK, -	WE0_XWR0_FWE_MARK, -	WE1_XWR1_MARK, -	FRB_MARK, -	CKO_MARK, -	NBRSTOUT_MARK, -	NBRST_MARK, -	GPS_EPPSIN_MARK, -	LATCHPULSE_MARK, -	LTESIGNAL_MARK, -	LEGACYSTATE_MARK, -	TCKON_MARK, -	VIO_VD_MARK, PORT128_KEYOUT0_MARK, IPORT0_MARK, -	VIO_HD_MARK, PORT129_KEYOUT1_MARK, IPORT1_MARK, -	VIO_D0_MARK, PORT130_KEYOUT2_MARK, PORT130_MSIOF2_RXD_MARK, -	VIO_D1_MARK, PORT131_KEYOUT3_MARK, PORT131_MSIOF2_SS1_MARK, -	VIO_D2_MARK, PORT132_KEYOUT4_MARK, PORT132_MSIOF2_SS2_MARK, -	VIO_D3_MARK, PORT133_KEYOUT5_MARK, PORT133_MSIOF2_TSYNC_MARK, -	VIO_D4_MARK, PORT134_KEYIN0_MARK, PORT134_MSIOF2_TXD_MARK, -	VIO_D5_MARK, PORT135_KEYIN1_MARK, PORT135_MSIOF2_TSCK_MARK, -	VIO_D6_MARK, PORT136_KEYIN2_MARK, -	VIO_D7_MARK, PORT137_KEYIN3_MARK, -	VIO_D8_MARK, M9_SLCD_A01_MARK, PORT138_FSIAOMC_MARK, -	VIO_D9_MARK, M10_SLCD_CK1_MARK, PORT139_FSIAOLR_MARK, -	VIO_D10_MARK, M11_SLCD_SO1_MARK, TPU0TO2_MARK, PORT140_FSIAOBT_MARK, -	VIO_D11_MARK, M12_SLCD_CE1_MARK, TPU0TO3_MARK, PORT141_FSIAOSLD_MARK, -	VIO_D12_MARK, M13_BSW_MARK, PORT142_FSIACK_MARK, -	VIO_D13_MARK, M14_GSW_MARK, PORT143_FSIAILR_MARK, -	VIO_D14_MARK, M15_RSW_MARK, PORT144_FSIAIBT_MARK, -	VIO_D15_MARK, TPU1TO3_MARK, PORT145_FSIAISLD_MARK, -	VIO_CLK_MARK, PORT146_KEYIN4_MARK, IPORT2_MARK, -	VIO_FIELD_MARK, PORT147_KEYIN5_MARK, -	VIO_CKO_MARK, PORT148_KEYIN6_MARK, -	A27_MARK, RDWR_XWE_MARK, MFG0_IN1_MARK, -	MFG0_IN2_MARK, -	TS_SPSYNC3_MARK, MSIOF2_RSCK_MARK, -	TS_SDAT3_MARK, MSIOF2_RSYNC_MARK, -	TPU1TO2_MARK, TS_SDEN3_MARK, PORT153_MSIOF2_SS1_MARK, -	SOUT3_MARK, SCIFA2_TXD1_MARK, MSIOF2_MCK0_MARK, -	SIN3_MARK, SCIFA2_RXD1_MARK, MSIOF2_MCK1_MARK, -	XRTS3_MARK, SCIFA2_RTS1_MARK, PORT156_MSIOF2_SS2_MARK, -	XCTS3_MARK, SCIFA2_CTS1_MARK, PORT157_MSIOF2_RXD_MARK, - -	/* 55-4 */ -	DINT_MARK, SCIFA2_SCK1_MARK, TS_SCK3_MARK, -	PORT159_SCIFB_SCK_MARK, PORT159_SCIFA5_SCK_MARK, NMI_MARK, -	PORT160_SCIFB_TXD_MARK, PORT160_SCIFA5_TXD_MARK, SOUT0_MARK, -	PORT161_SCIFB_CTS_MARK, PORT161_SCIFA5_CTS_MARK, XCTS0_MARK, -	MFG3_IN2_MARK, -	PORT162_SCIFB_RXD_MARK, PORT162_SCIFA5_RXD_MARK, SIN0_MARK, -	MFG3_IN1_MARK, -	PORT163_SCIFB_RTS_MARK, PORT163_SCIFA5_RTS_MARK, XRTS0_MARK, -	MFG3_OUT1_MARK, TPU3TO0_MARK, -	LCDD0_MARK, PORT192_KEYOUT0_MARK, EXT_CKI_MARK, -	LCDD1_MARK, PORT193_KEYOUT1_MARK, PORT193_SCIFA5_CTS_MARK, -	BBIF2_TSYNC1_MARK, -	LCDD2_MARK, PORT194_KEYOUT2_MARK, PORT194_SCIFA5_RTS_MARK, -	BBIF2_TSCK1_MARK, -	LCDD3_MARK, PORT195_KEYOUT3_MARK, PORT195_SCIFA5_RXD_MARK, -	BBIF2_TXD1_MARK, -	LCDD4_MARK, PORT196_KEYOUT4_MARK, PORT196_SCIFA5_TXD_MARK, -	LCDD5_MARK, PORT197_KEYOUT5_MARK, PORT197_SCIFA5_SCK_MARK, -	MFG2_OUT2_MARK, -	TPU2TO1_MARK, -	LCDD6_MARK, XWR2_MARK, -	LCDD7_MARK, TPU4TO1_MARK, MFG4_OUT2_MARK, XWR3_MARK, -	LCDD8_MARK, PORT200_KEYIN0_MARK, VIO_DR0_MARK, D16_MARK, ED16_MARK, -	LCDD9_MARK, PORT201_KEYIN1_MARK, VIO_DR1_MARK, D17_MARK, ED17_MARK, -	LCDD10_MARK, PORT202_KEYIN2_MARK, VIO_DR2_MARK, D18_MARK, ED18_MARK, -	LCDD11_MARK, PORT203_KEYIN3_MARK, VIO_DR3_MARK, D19_MARK, ED19_MARK, -	LCDD12_MARK, PORT204_KEYIN4_MARK, VIO_DR4_MARK, D20_MARK, ED20_MARK, -	LCDD13_MARK, PORT205_KEYIN5_MARK, VIO_DR5_MARK, D21_MARK, ED21_MARK, -	LCDD14_MARK, PORT206_KEYIN6_MARK, VIO_DR6_MARK, D22_MARK, ED22_MARK, -	LCDD15_MARK, PORT207_MSIOF0L_SS1_MARK, PORT207_KEYOUT0_MARK, -	VIO_DR7_MARK, D23_MARK, ED23_MARK, -	LCDD16_MARK, PORT208_MSIOF0L_SS2_MARK, PORT208_KEYOUT1_MARK, -	VIO_VDR_MARK, D24_MARK, ED24_MARK, -	LCDD17_MARK, PORT209_KEYOUT2_MARK, VIO_HDR_MARK, D25_MARK, ED25_MARK, -	LCDD18_MARK, DREQ2_MARK, PORT210_MSIOF0L_SS1_MARK, D26_MARK, ED26_MARK, -	LCDD19_MARK, PORT211_MSIOF0L_SS2_MARK, D27_MARK, ED27_MARK, -	LCDD20_MARK, TS_SPSYNC1_MARK, MSIOF0L_MCK0_MARK, D28_MARK, ED28_MARK, -	LCDD21_MARK, TS_SDAT1_MARK, MSIOF0L_MCK1_MARK, D29_MARK, ED29_MARK, -	LCDD22_MARK, TS_SDEN1_MARK, MSIOF0L_RSCK_MARK, D30_MARK, ED30_MARK, -	LCDD23_MARK, TS_SCK1_MARK, MSIOF0L_RSYNC_MARK, D31_MARK, ED31_MARK, -	LCDDCK_MARK, LCDWR_MARK, PORT216_KEYOUT3_MARK, VIO_CLKR_MARK, -	LCDRD_MARK, DACK2_MARK, MSIOF0L_TSYNC_MARK, -	LCDHSYN_MARK, LCDCS_MARK, LCDCS2_MARK, DACK3_MARK, -	PORT218_VIO_CKOR_MARK, PORT218_KEYOUT4_MARK, -	LCDDISP_MARK, LCDRS_MARK, DREQ3_MARK, MSIOF0L_TSCK_MARK, -	LCDVSYN_MARK, LCDVSYN2_MARK, PORT220_KEYOUT5_MARK, -	LCDLCLK_MARK, DREQ1_MARK, PWEN_MARK, MSIOF0L_RXD_MARK, -	LCDDON_MARK, LCDDON2_MARK, DACK1_MARK, OVCN_MARK, MSIOF0L_TXD_MARK, -	SCIFA1_TXD_MARK, OVCN2_MARK, -	EXTLP_MARK, SCIFA1_SCK_MARK, USBTERM_MARK, PORT226_VIO_CKO2_MARK, -	SCIFA1_RTS_MARK, IDIN_MARK, -	SCIFA1_RXD_MARK, -	SCIFA1_CTS_MARK, MFG1_IN1_MARK, -	MSIOF1_TXD_MARK, SCIFA2_TXD2_MARK, PORT230_FSIAOMC_MARK, -	MSIOF1_TSYNC_MARK, SCIFA2_CTS2_MARK, PORT231_FSIAOLR_MARK, -	MSIOF1_TSCK_MARK, SCIFA2_SCK2_MARK, PORT232_FSIAOBT_MARK, -	MSIOF1_RXD_MARK, SCIFA2_RXD2_MARK, GPS_VCOTRIG_MARK, -	PORT233_FSIACK_MARK, -	MSIOF1_RSCK_MARK, SCIFA2_RTS2_MARK, PORT234_FSIAOSLD_MARK, -	MSIOF1_RSYNC_MARK, OPORT0_MARK, MFG1_IN2_MARK, PORT235_FSIAILR_MARK, -	MSIOF1_MCK0_MARK, I2C_SDA2_MARK, PORT236_FSIAIBT_MARK, -	MSIOF1_MCK1_MARK, I2C_SCL2_MARK, PORT237_FSIAISLD_MARK, -	MSIOF1_SS1_MARK, EDBGREQ3_MARK, - -	/* 55-5 */ -	MSIOF1_SS2_MARK, -	SCIFA6_TXD_MARK, -	PORT241_IRDA_OUT_MARK, PORT241_IROUT_MARK, MFG4_OUT1_MARK, -	TPU4TO0_MARK, -	PORT242_IRDA_IN_MARK, MFG4_IN2_MARK, -	PORT243_IRDA_FIRSEL_MARK, PORT243_VIO_CKO2_MARK, -	PORT244_SCIFA5_CTS_MARK, MFG2_IN1_MARK, PORT244_SCIFB_CTS_MARK, -	PORT244_MSIOF2_RXD_MARK, -	PORT245_SCIFA5_RTS_MARK, MFG2_IN2_MARK, PORT245_SCIFB_RTS_MARK, -	PORT245_MSIOF2_TXD_MARK, -	PORT246_SCIFA5_RXD_MARK, MFG1_OUT1_MARK, PORT246_SCIFB_RXD_MARK, -	TPU1TO0_MARK, -	PORT247_SCIFA5_TXD_MARK, MFG3_OUT2_MARK, PORT247_SCIFB_TXD_MARK, -	TPU3TO1_MARK, -	PORT248_SCIFA5_SCK_MARK, MFG2_OUT1_MARK, PORT248_SCIFB_SCK_MARK, -	TPU2TO0_MARK, -	PORT248_MSIOF2_TSCK_MARK, -	PORT249_IROUT_MARK, MFG4_IN1_MARK, PORT249_MSIOF2_TSYNC_MARK, -	SDHICLK0_MARK, TCK2_SWCLK_MC0_MARK, -	SDHICD0_MARK, -	SDHID0_0_MARK, TMS2_SWDIO_MC0_MARK, -	SDHID0_1_MARK, TDO2_SWO0_MC0_MARK, -	SDHID0_2_MARK, TDI2_MARK, -	SDHID0_3_MARK, RTCK2_SWO1_MC0_MARK, -	SDHICMD0_MARK, TRST2_MARK, -	SDHIWP0_MARK, EDBGREQ2_MARK, -	SDHICLK1_MARK, TCK3_SWCLK_MC1_MARK, -	SDHID1_0_MARK, M11_SLCD_SO2_MARK, TS_SPSYNC2_MARK, -	TMS3_SWDIO_MC1_MARK, -	SDHID1_1_MARK, M9_SLCD_A02_MARK, TS_SDAT2_MARK, TDO3_SWO0_MC1_MARK, -	SDHID1_2_MARK, M10_SLCD_CK2_MARK, TS_SDEN2_MARK, TDI3_MARK, -	SDHID1_3_MARK, M12_SLCD_CE2_MARK, TS_SCK2_MARK, RTCK3_SWO1_MC1_MARK, -	SDHICMD1_MARK, TRST3_MARK, -	RESETOUTS_MARK, -	PINMUX_MARK_END, -}; - -static pinmux_enum_t pinmux_data[] = { -	/* specify valid pin states for each pin in GPIO mode */ -	/* 55-1 (GPIO) */ -	PORT_DATA_I_PD(0), PORT_DATA_I_PU(1), -	PORT_DATA_I_PU(2), PORT_DATA_I_PU(3), -	PORT_DATA_I_PU(4), PORT_DATA_I_PU(5), -	PORT_DATA_I_PU(6), PORT_DATA_I_PU(7), -	PORT_DATA_I_PU(8), PORT_DATA_I_PU(9), -	PORT_DATA_I_PU(10), PORT_DATA_I_PU(11), -	PORT_DATA_IO_PU(12), PORT_DATA_IO_PU(13), -	PORT_DATA_IO_PU_PD(14), PORT_DATA_IO_PU_PD(15), -	PORT_DATA_O(16), PORT_DATA_IO(17), -	PORT_DATA_O(18), PORT_DATA_O(19), -	PORT_DATA_O(20), PORT_DATA_O(21), -	PORT_DATA_O(22), PORT_DATA_O(23), -	PORT_DATA_O(24), PORT_DATA_I_PD(25), -	PORT_DATA_I_PD(26), PORT_DATA_O(27), -	PORT_DATA_O(28), PORT_DATA_O(29), -	PORT_DATA_IO(30), PORT_DATA_IO_PU(31), -	PORT_DATA_IO_PD(32), PORT_DATA_I_PU(33), -	PORT_DATA_IO_PD(34), PORT_DATA_I_PU_PD(35), -	PORT_DATA_O(36), PORT_DATA_IO(37), - -	/* 55-2 (GPIO) */ -	PORT_DATA_O(38), PORT_DATA_I_PU(39), -	PORT_DATA_I_PU_PD(40), PORT_DATA_O(41), -	PORT_DATA_IO_PD(42), PORT_DATA_IO_PD(43), -	PORT_DATA_IO_PD(44), PORT_DATA_I_PD(45), -	PORT_DATA_I_PD(46), PORT_DATA_I_PD(47), -	PORT_DATA_I_PD(48), PORT_DATA_IO_PU_PD(49), -	PORT_DATA_IO_PD(50), PORT_DATA_IO_PD(51), -	PORT_DATA_O(52), PORT_DATA_IO_PU_PD(53), -	PORT_DATA_IO_PU_PD(54), PORT_DATA_IO_PD(55), -	PORT_DATA_I_PU_PD(56), PORT_DATA_IO(57), -	PORT_DATA_IO(58), PORT_DATA_IO(59), -	PORT_DATA_IO(60), PORT_DATA_IO(61), -	PORT_DATA_IO_PD(62), PORT_DATA_IO_PD(63), -	PORT_DATA_IO_PD(64), PORT_DATA_IO_PD(65), -	PORT_DATA_IO_PU_PD(66), PORT_DATA_IO_PU_PD(67), -	PORT_DATA_IO_PU_PD(68), PORT_DATA_IO_PU_PD(69), -	PORT_DATA_IO_PU_PD(70), PORT_DATA_IO_PU_PD(71), -	PORT_DATA_IO_PU_PD(72), PORT_DATA_I_PU_PD(73), -	PORT_DATA_IO_PU(74), PORT_DATA_IO_PU(75), -	PORT_DATA_IO_PU(76), PORT_DATA_IO_PU(77), -	PORT_DATA_IO_PU(78), PORT_DATA_IO_PU(79), -	PORT_DATA_IO_PU(80), PORT_DATA_IO_PU(81), -	PORT_DATA_IO_PU(82), PORT_DATA_IO_PU(83), -	PORT_DATA_IO_PU(84), PORT_DATA_IO_PU(85), -	PORT_DATA_IO_PU(86), PORT_DATA_IO_PU(87), -	PORT_DATA_IO_PU(88), PORT_DATA_IO_PU(89), -	PORT_DATA_O(90), PORT_DATA_IO_PU(91), -	PORT_DATA_O(92), - -	/* 55-3 (GPIO) */ -	PORT_DATA_IO_PU(93), -	PORT_DATA_O(94), -	PORT_DATA_I_PU_PD(95), -	PORT_DATA_IO(96), PORT_DATA_IO(97), -	PORT_DATA_IO(98), PORT_DATA_I_PU(99), -	PORT_DATA_O(100), PORT_DATA_O(101), -	PORT_DATA_I_PU(102), PORT_DATA_IO_PD(103), -	PORT_DATA_I_PD(104), PORT_DATA_I_PD(105), -	PORT_DATA_I_PD(106), PORT_DATA_I_PD(107), -	PORT_DATA_I_PD(108), PORT_DATA_IO_PD(109), -	PORT_DATA_IO_PD(110), PORT_DATA_I_PD(111), -	PORT_DATA_IO_PD(112), PORT_DATA_IO_PD(113), -	PORT_DATA_IO_PD(114), PORT_DATA_I_PD(115), -	PORT_DATA_I_PD(116), PORT_DATA_IO_PD(117), -	PORT_DATA_I_PD(118), PORT_DATA_IO_PD(128), -	PORT_DATA_IO_PD(129), PORT_DATA_IO_PD(130), -	PORT_DATA_IO_PD(131), PORT_DATA_IO_PD(132), -	PORT_DATA_IO_PD(133), PORT_DATA_IO_PU_PD(134), -	PORT_DATA_IO_PU_PD(135), PORT_DATA_IO_PU_PD(136), -	PORT_DATA_IO_PU_PD(137), PORT_DATA_IO_PD(138), -	PORT_DATA_IO_PD(139), PORT_DATA_IO_PD(140), -	PORT_DATA_IO_PD(141), PORT_DATA_IO_PD(142), -	PORT_DATA_IO_PD(143), PORT_DATA_IO_PU_PD(144), -	PORT_DATA_IO_PD(145), PORT_DATA_IO_PU_PD(146), -	PORT_DATA_IO_PU_PD(147), PORT_DATA_IO_PU_PD(148), -	PORT_DATA_IO_PU_PD(149), PORT_DATA_I_PD(150), -	PORT_DATA_IO_PU_PD(151), PORT_DATA_IO_PD(152), -	PORT_DATA_IO_PD(153), PORT_DATA_IO_PD(154), -	PORT_DATA_I_PD(155), PORT_DATA_IO_PU_PD(156), -	PORT_DATA_I_PD(157), PORT_DATA_IO_PD(158), - -	/* 55-4 (GPIO) */ -	PORT_DATA_IO_PU_PD(159), PORT_DATA_IO_PU_PD(160), -	PORT_DATA_I_PU_PD(161), PORT_DATA_I_PU_PD(162), -	PORT_DATA_IO_PU_PD(163), PORT_DATA_I_PU_PD(164), -	PORT_DATA_IO_PD(192), PORT_DATA_IO_PD(193), -	PORT_DATA_IO_PD(194), PORT_DATA_IO_PD(195), -	PORT_DATA_IO_PD(196), PORT_DATA_IO_PD(197), -	PORT_DATA_IO_PD(198), PORT_DATA_IO_PD(199), -	PORT_DATA_IO_PU_PD(200), PORT_DATA_IO_PU_PD(201), -	PORT_DATA_IO_PU_PD(202), PORT_DATA_IO_PU_PD(203), -	PORT_DATA_IO_PU_PD(204), PORT_DATA_IO_PU_PD(205), -	PORT_DATA_IO_PU_PD(206), PORT_DATA_IO_PD(207), -	PORT_DATA_IO_PD(208), PORT_DATA_IO_PD(209), -	PORT_DATA_IO_PD(210), PORT_DATA_IO_PD(211), -	PORT_DATA_IO_PD(212), PORT_DATA_IO_PD(213), -	PORT_DATA_IO_PD(214), PORT_DATA_IO_PD(215), -	PORT_DATA_IO_PD(216), PORT_DATA_IO_PD(217), -	PORT_DATA_O(218), PORT_DATA_IO_PD(219), -	PORT_DATA_IO_PD(220), PORT_DATA_IO_PD(221), -	PORT_DATA_IO_PU_PD(222), -	PORT_DATA_I_PU_PD(223), PORT_DATA_I_PU_PD(224), -	PORT_DATA_IO_PU_PD(225), PORT_DATA_O(226), -	PORT_DATA_IO_PU_PD(227), PORT_DATA_I_PD(228), -	PORT_DATA_I_PD(229), PORT_DATA_IO(230), -	PORT_DATA_IO_PD(231), PORT_DATA_IO_PU_PD(232), -	PORT_DATA_I_PD(233), PORT_DATA_IO_PU_PD(234), -	PORT_DATA_IO_PU_PD(235), PORT_DATA_IO_PU_PD(236), -	PORT_DATA_IO_PD(237), PORT_DATA_IO_PU_PD(238), - -	/* 55-5 (GPIO) */ -	PORT_DATA_IO_PU_PD(239), PORT_DATA_IO_PU_PD(240), -	PORT_DATA_O(241), PORT_DATA_I_PD(242), -	PORT_DATA_IO_PU_PD(243), PORT_DATA_IO_PU_PD(244), -	PORT_DATA_IO_PU_PD(245), PORT_DATA_IO_PU_PD(246), -	PORT_DATA_IO_PU_PD(247), PORT_DATA_IO_PU_PD(248), -	PORT_DATA_IO_PU_PD(249), PORT_DATA_IO_PD(250), -	PORT_DATA_IO_PU_PD(251), PORT_DATA_IO_PU_PD(252), -	PORT_DATA_IO_PU_PD(253), PORT_DATA_IO_PU_PD(254), -	PORT_DATA_IO_PU_PD(255), PORT_DATA_IO_PU_PD(256), -	PORT_DATA_IO_PU_PD(257), PORT_DATA_IO_PD(258), -	PORT_DATA_IO_PU_PD(259), PORT_DATA_IO_PU_PD(260), -	PORT_DATA_IO_PU_PD(261), PORT_DATA_IO_PU_PD(262), -	PORT_DATA_IO_PU_PD(263), - -	/* Special Pull-up / Pull-down Functions */ -	PINMUX_DATA(PORT66_KEYIN0_PU_MARK, MSELBCR_MSEL17_0, MSELBCR_MSEL16_0, -				PORT66_FN2, PORT66_IN_PU), -	PINMUX_DATA(PORT67_KEYIN1_PU_MARK, MSELBCR_MSEL17_0, MSELBCR_MSEL16_0, -				PORT67_FN2, PORT67_IN_PU), -	PINMUX_DATA(PORT68_KEYIN2_PU_MARK, MSELBCR_MSEL17_0, MSELBCR_MSEL16_0, -				PORT68_FN2, PORT68_IN_PU), -	PINMUX_DATA(PORT69_KEYIN3_PU_MARK, MSELBCR_MSEL17_0, MSELBCR_MSEL16_0, -				PORT69_FN2, PORT69_IN_PU), -	PINMUX_DATA(PORT70_KEYIN4_PU_MARK, MSELBCR_MSEL17_0, MSELBCR_MSEL16_0, -				PORT70_FN2, PORT70_IN_PU), -	PINMUX_DATA(PORT71_KEYIN5_PU_MARK, MSELBCR_MSEL17_0, MSELBCR_MSEL16_0, -				PORT71_FN2, PORT71_IN_PU), -	PINMUX_DATA(PORT72_KEYIN6_PU_MARK, MSELBCR_MSEL17_0, MSELBCR_MSEL16_0, -				PORT72_FN2, PORT72_IN_PU), - - -	/* 55-1 (FN) */ -	PINMUX_DATA(VBUS_0_MARK, PORT0_FN1), -	PINMUX_DATA(CPORT0_MARK, PORT1_FN1), -	PINMUX_DATA(CPORT1_MARK, PORT2_FN1), -	PINMUX_DATA(CPORT2_MARK, PORT3_FN1), -	PINMUX_DATA(CPORT3_MARK, PORT4_FN1), -	PINMUX_DATA(CPORT4_MARK, PORT5_FN1), -	PINMUX_DATA(CPORT5_MARK, PORT6_FN1), -	PINMUX_DATA(CPORT6_MARK, PORT7_FN1), -	PINMUX_DATA(CPORT7_MARK, PORT8_FN1), -	PINMUX_DATA(CPORT8_MARK, PORT9_FN1), -	PINMUX_DATA(CPORT9_MARK, PORT10_FN1), -	PINMUX_DATA(CPORT10_MARK, PORT11_FN1), -	PINMUX_DATA(CPORT11_MARK, PORT12_FN1), -	PINMUX_DATA(SIN2_MARK, PORT12_FN2), -	PINMUX_DATA(CPORT12_MARK, PORT13_FN1), -	PINMUX_DATA(XCTS2_MARK, PORT13_FN2), -	PINMUX_DATA(CPORT13_MARK, PORT14_FN1), -	PINMUX_DATA(RFSPO4_MARK, PORT14_FN2), -	PINMUX_DATA(CPORT14_MARK, PORT15_FN1), -	PINMUX_DATA(RFSPO5_MARK, PORT15_FN2), -	PINMUX_DATA(CPORT15_MARK, PORT16_FN1), -	PINMUX_DATA(SCIFA0_SCK_MARK, PORT16_FN2), -	PINMUX_DATA(GPS_AGC2_MARK, PORT16_FN3), -	PINMUX_DATA(CPORT16_MARK, PORT17_FN1), -	PINMUX_DATA(SCIFA0_TXD_MARK, PORT17_FN2), -	PINMUX_DATA(GPS_AGC3_MARK, PORT17_FN3), -	PINMUX_DATA(CPORT17_IC_OE_MARK, PORT18_FN1), -	PINMUX_DATA(SOUT2_MARK, PORT18_FN2), -	PINMUX_DATA(CPORT18_MARK, PORT19_FN1), -	PINMUX_DATA(XRTS2_MARK, PORT19_FN2), -	PINMUX_DATA(PORT19_VIO_CKO2_MARK, PORT19_FN3), -	PINMUX_DATA(CPORT19_MPORT1_MARK, PORT20_FN1), -	PINMUX_DATA(CPORT20_MARK, PORT21_FN1), -	PINMUX_DATA(RFSPO6_MARK, PORT21_FN2), -	PINMUX_DATA(CPORT21_MARK, PORT22_FN1), -	PINMUX_DATA(STATUS0_MARK, PORT22_FN2), -	PINMUX_DATA(CPORT22_MARK, PORT23_FN1), -	PINMUX_DATA(STATUS1_MARK, PORT23_FN2), -	PINMUX_DATA(CPORT23_MARK, PORT24_FN1), -	PINMUX_DATA(STATUS2_MARK, PORT24_FN2), -	PINMUX_DATA(RFSPO7_MARK, PORT24_FN3), -	PINMUX_DATA(B_SYNLD1_MARK, PORT25_FN1), -	PINMUX_DATA(B_SYNLD2_MARK, PORT26_FN1), -	PINMUX_DATA(SYSENMSK_MARK, PORT26_FN2), -	PINMUX_DATA(XMAINPS_MARK, PORT27_FN1), -	PINMUX_DATA(XDIVPS_MARK, PORT28_FN1), -	PINMUX_DATA(XIDRST_MARK, PORT29_FN1), -	PINMUX_DATA(IDCLK_MARK, PORT30_FN1), -	PINMUX_DATA(IC_DP_MARK, PORT30_FN2), -	PINMUX_DATA(IDIO_MARK, PORT31_FN1), -	PINMUX_DATA(IC_DM_MARK, PORT31_FN2), -	PINMUX_DATA(SOUT1_MARK, PORT32_FN1), -	PINMUX_DATA(SCIFA4_TXD_MARK, PORT32_FN2), -	PINMUX_DATA(M02_BERDAT_MARK, PORT32_FN3), -	PINMUX_DATA(SIN1_MARK, PORT33_FN1), -	PINMUX_DATA(SCIFA4_RXD_MARK, PORT33_FN2), -	PINMUX_DATA(XWUP_MARK, PORT33_FN3), -	PINMUX_DATA(XRTS1_MARK, PORT34_FN1), -	PINMUX_DATA(SCIFA4_RTS_MARK, PORT34_FN2), -	PINMUX_DATA(M03_BERCLK_MARK, PORT34_FN3), -	PINMUX_DATA(XCTS1_MARK, PORT35_FN1), -	PINMUX_DATA(SCIFA4_CTS_MARK, PORT35_FN2), -	PINMUX_DATA(PCMCLKO_MARK, PORT36_FN1), -	PINMUX_DATA(SYNC8KO_MARK, PORT37_FN1), - -	/* 55-2 (FN) */ -	PINMUX_DATA(DNPCM_A_MARK, PORT38_FN1), -	PINMUX_DATA(UPPCM_A_MARK, PORT39_FN1), -	PINMUX_DATA(VACK_MARK, PORT40_FN1), -	PINMUX_DATA(XTALB1L_MARK, PORT41_FN1), -	PINMUX_DATA(GPS_AGC1_MARK, PORT42_FN1), -	PINMUX_DATA(SCIFA0_RTS_MARK, PORT42_FN2), -	PINMUX_DATA(GPS_AGC4_MARK, PORT43_FN1), -	PINMUX_DATA(SCIFA0_RXD_MARK, PORT43_FN2), -	PINMUX_DATA(GPS_PWRDOWN_MARK, PORT44_FN1), -	PINMUX_DATA(SCIFA0_CTS_MARK, PORT44_FN2), -	PINMUX_DATA(GPS_IM_MARK, PORT45_FN1), -	PINMUX_DATA(GPS_IS_MARK, PORT46_FN1), -	PINMUX_DATA(GPS_QM_MARK, PORT47_FN1), -	PINMUX_DATA(GPS_QS_MARK, PORT48_FN1), -	PINMUX_DATA(FMSOCK_MARK, PORT49_FN1), -	PINMUX_DATA(PORT49_IRDA_OUT_MARK, PORT49_FN2), -	PINMUX_DATA(PORT49_IROUT_MARK, PORT49_FN3), -	PINMUX_DATA(FMSOOLR_MARK, PORT50_FN1), -	PINMUX_DATA(BBIF2_TSYNC2_MARK, PORT50_FN2), -	PINMUX_DATA(TPU2TO2_MARK, PORT50_FN3), -	PINMUX_DATA(IPORT3_MARK, PORT50_FN4), -	PINMUX_DATA(FMSIOLR_MARK, PORT50_FN5), -	PINMUX_DATA(FMSOOBT_MARK, PORT51_FN1), -	PINMUX_DATA(BBIF2_TSCK2_MARK, PORT51_FN2), -	PINMUX_DATA(TPU2TO3_MARK, PORT51_FN3), -	PINMUX_DATA(OPORT1_MARK, PORT51_FN4), -	PINMUX_DATA(FMSIOBT_MARK, PORT51_FN5), -	PINMUX_DATA(FMSOSLD_MARK, PORT52_FN1), -	PINMUX_DATA(BBIF2_TXD2_MARK, PORT52_FN2), -	PINMUX_DATA(OPORT2_MARK, PORT52_FN3), -	PINMUX_DATA(FMSOILR_MARK, PORT53_FN1), -	PINMUX_DATA(PORT53_IRDA_IN_MARK, PORT53_FN2), -	PINMUX_DATA(TPU3TO3_MARK, PORT53_FN3), -	PINMUX_DATA(OPORT3_MARK, PORT53_FN4), -	PINMUX_DATA(FMSIILR_MARK, PORT53_FN5), -	PINMUX_DATA(FMSOIBT_MARK, PORT54_FN1), -	PINMUX_DATA(PORT54_IRDA_FIRSEL_MARK, PORT54_FN2), -	PINMUX_DATA(TPU3TO2_MARK, PORT54_FN3), -	PINMUX_DATA(FMSIIBT_MARK, PORT54_FN4), -	PINMUX_DATA(FMSISLD_MARK, PORT55_FN1), -	PINMUX_DATA(MFG0_OUT1_MARK, PORT55_FN2), -	PINMUX_DATA(TPU0TO0_MARK, PORT55_FN3), -	PINMUX_DATA(A0_EA0_MARK, PORT57_FN1), -	PINMUX_DATA(BS_MARK, PORT57_FN2), -	PINMUX_DATA(A12_EA12_MARK, PORT58_FN1), -	PINMUX_DATA(PORT58_VIO_CKOR_MARK, PORT58_FN2), -	PINMUX_DATA(TPU4TO2_MARK, PORT58_FN3), -	PINMUX_DATA(A13_EA13_MARK, PORT59_FN1), -	PINMUX_DATA(PORT59_IROUT_MARK, PORT59_FN2), -	PINMUX_DATA(MFG0_OUT2_MARK, PORT59_FN3), -	PINMUX_DATA(TPU0TO1_MARK, PORT59_FN4), -	PINMUX_DATA(A14_EA14_MARK, PORT60_FN1), -	PINMUX_DATA(PORT60_KEYOUT5_MARK, PORT60_FN2), -	PINMUX_DATA(A15_EA15_MARK, PORT61_FN1), -	PINMUX_DATA(PORT61_KEYOUT4_MARK, PORT61_FN2), -	PINMUX_DATA(A16_EA16_MARK, PORT62_FN1), -	PINMUX_DATA(PORT62_KEYOUT3_MARK, PORT62_FN2), -	PINMUX_DATA(MSIOF0_SS1_MARK, PORT62_FN3), -	PINMUX_DATA(A17_EA17_MARK, PORT63_FN1), -	PINMUX_DATA(PORT63_KEYOUT2_MARK, PORT63_FN2), -	PINMUX_DATA(MSIOF0_TSYNC_MARK, PORT63_FN3), -	PINMUX_DATA(A18_EA18_MARK, PORT64_FN1), -	PINMUX_DATA(PORT64_KEYOUT1_MARK, PORT64_FN2), -	PINMUX_DATA(MSIOF0_TSCK_MARK, PORT64_FN3), -	PINMUX_DATA(A19_EA19_MARK, PORT65_FN1), -	PINMUX_DATA(PORT65_KEYOUT0_MARK, PORT65_FN2), -	PINMUX_DATA(MSIOF0_TXD_MARK, PORT65_FN3), -	PINMUX_DATA(A20_EA20_MARK, PORT66_FN1), -	PINMUX_DATA(PORT66_KEYIN0_MARK, PORT66_FN2), -	PINMUX_DATA(MSIOF0_RSCK_MARK, PORT66_FN3), -	PINMUX_DATA(A21_EA21_MARK, PORT67_FN1), -	PINMUX_DATA(PORT67_KEYIN1_MARK, PORT67_FN2), -	PINMUX_DATA(MSIOF0_RSYNC_MARK, PORT67_FN3), -	PINMUX_DATA(A22_EA22_MARK, PORT68_FN1), -	PINMUX_DATA(PORT68_KEYIN2_MARK, PORT68_FN2), -	PINMUX_DATA(MSIOF0_MCK0_MARK, PORT68_FN3), -	PINMUX_DATA(A23_EA23_MARK, PORT69_FN1), -	PINMUX_DATA(PORT69_KEYIN3_MARK, PORT69_FN2), -	PINMUX_DATA(MSIOF0_MCK1_MARK, PORT69_FN3), -	PINMUX_DATA(A24_EA24_MARK, PORT70_FN1), -	PINMUX_DATA(PORT70_KEYIN4_MARK, PORT70_FN2), -	PINMUX_DATA(MSIOF0_RXD_MARK, PORT70_FN3), -	PINMUX_DATA(A25_EA25_MARK, PORT71_FN1), -	PINMUX_DATA(PORT71_KEYIN5_MARK, PORT71_FN2), -	PINMUX_DATA(MSIOF0_SS2_MARK, PORT71_FN3), -	PINMUX_DATA(A26_MARK, PORT72_FN1), -	PINMUX_DATA(PORT72_KEYIN6_MARK, PORT72_FN2), -	PINMUX_DATA(D0_ED0_NAF0_MARK, PORT74_FN1), -	PINMUX_DATA(D1_ED1_NAF1_MARK, PORT75_FN1), -	PINMUX_DATA(D2_ED2_NAF2_MARK, PORT76_FN1), -	PINMUX_DATA(D3_ED3_NAF3_MARK, PORT77_FN1), -	PINMUX_DATA(D4_ED4_NAF4_MARK, PORT78_FN1), -	PINMUX_DATA(D5_ED5_NAF5_MARK, PORT79_FN1), -	PINMUX_DATA(D6_ED6_NAF6_MARK, PORT80_FN1), -	PINMUX_DATA(D7_ED7_NAF7_MARK, PORT81_FN1), -	PINMUX_DATA(D8_ED8_NAF8_MARK, PORT82_FN1), -	PINMUX_DATA(D9_ED9_NAF9_MARK, PORT83_FN1), -	PINMUX_DATA(D10_ED10_NAF10_MARK, PORT84_FN1), -	PINMUX_DATA(D11_ED11_NAF11_MARK, PORT85_FN1), -	PINMUX_DATA(D12_ED12_NAF12_MARK, PORT86_FN1), -	PINMUX_DATA(D13_ED13_NAF13_MARK, PORT87_FN1), -	PINMUX_DATA(D14_ED14_NAF14_MARK, PORT88_FN1), -	PINMUX_DATA(D15_ED15_NAF15_MARK, PORT89_FN1), -	PINMUX_DATA(CS4_MARK, PORT90_FN1), -	PINMUX_DATA(CS5A_MARK, PORT91_FN1), -	PINMUX_DATA(FMSICK_MARK, PORT91_FN2), -	PINMUX_DATA(CS5B_MARK, PORT92_FN1), -	PINMUX_DATA(FCE1_MARK, PORT92_FN2), - -	/* 55-3 (FN) */ -	PINMUX_DATA(CS6B_MARK, PORT93_FN1), -	PINMUX_DATA(XCS2_MARK, PORT93_FN2), -	PINMUX_DATA(CS6A_MARK, PORT93_FN3), -	PINMUX_DATA(DACK0_MARK, PORT93_FN4), -	PINMUX_DATA(FCE0_MARK, PORT94_FN1), -	PINMUX_DATA(WAIT_MARK, PORT95_FN1), -	PINMUX_DATA(DREQ0_MARK, PORT95_FN2), -	PINMUX_DATA(RD_XRD_MARK, PORT96_FN1), -	PINMUX_DATA(WE0_XWR0_FWE_MARK, PORT97_FN1), -	PINMUX_DATA(WE1_XWR1_MARK, PORT98_FN1), -	PINMUX_DATA(FRB_MARK, PORT99_FN1), -	PINMUX_DATA(CKO_MARK, PORT100_FN1), -	PINMUX_DATA(NBRSTOUT_MARK, PORT101_FN1), -	PINMUX_DATA(NBRST_MARK, PORT102_FN1), -	PINMUX_DATA(GPS_EPPSIN_MARK, PORT106_FN1), -	PINMUX_DATA(LATCHPULSE_MARK, PORT110_FN1), -	PINMUX_DATA(LTESIGNAL_MARK, PORT111_FN1), -	PINMUX_DATA(LEGACYSTATE_MARK, PORT112_FN1), -	PINMUX_DATA(TCKON_MARK, PORT118_FN1), -	PINMUX_DATA(VIO_VD_MARK, PORT128_FN1), -	PINMUX_DATA(PORT128_KEYOUT0_MARK, PORT128_FN2), -	PINMUX_DATA(IPORT0_MARK, PORT128_FN3), -	PINMUX_DATA(VIO_HD_MARK, PORT129_FN1), -	PINMUX_DATA(PORT129_KEYOUT1_MARK, PORT129_FN2), -	PINMUX_DATA(IPORT1_MARK, PORT129_FN3), -	PINMUX_DATA(VIO_D0_MARK, PORT130_FN1), -	PINMUX_DATA(PORT130_KEYOUT2_MARK, PORT130_FN2), -	PINMUX_DATA(PORT130_MSIOF2_RXD_MARK, PORT130_FN3), -	PINMUX_DATA(VIO_D1_MARK, PORT131_FN1), -	PINMUX_DATA(PORT131_KEYOUT3_MARK, PORT131_FN2), -	PINMUX_DATA(PORT131_MSIOF2_SS1_MARK, PORT131_FN3), -	PINMUX_DATA(VIO_D2_MARK, PORT132_FN1), -	PINMUX_DATA(PORT132_KEYOUT4_MARK, PORT132_FN2), -	PINMUX_DATA(PORT132_MSIOF2_SS2_MARK, PORT132_FN3), -	PINMUX_DATA(VIO_D3_MARK, PORT133_FN1), -	PINMUX_DATA(PORT133_KEYOUT5_MARK, PORT133_FN2), -	PINMUX_DATA(PORT133_MSIOF2_TSYNC_MARK, PORT133_FN3), -	PINMUX_DATA(VIO_D4_MARK, PORT134_FN1), -	PINMUX_DATA(PORT134_KEYIN0_MARK, PORT134_FN2), -	PINMUX_DATA(PORT134_MSIOF2_TXD_MARK, PORT134_FN3), -	PINMUX_DATA(VIO_D5_MARK, PORT135_FN1), -	PINMUX_DATA(PORT135_KEYIN1_MARK, PORT135_FN2), -	PINMUX_DATA(PORT135_MSIOF2_TSCK_MARK, PORT135_FN3), -	PINMUX_DATA(VIO_D6_MARK, PORT136_FN1), -	PINMUX_DATA(PORT136_KEYIN2_MARK, PORT136_FN2), -	PINMUX_DATA(VIO_D7_MARK, PORT137_FN1), -	PINMUX_DATA(PORT137_KEYIN3_MARK, PORT137_FN2), -	PINMUX_DATA(VIO_D8_MARK, PORT138_FN1), -	PINMUX_DATA(M9_SLCD_A01_MARK, PORT138_FN2), -	PINMUX_DATA(PORT138_FSIAOMC_MARK, PORT138_FN3), -	PINMUX_DATA(VIO_D9_MARK, PORT139_FN1), -	PINMUX_DATA(M10_SLCD_CK1_MARK, PORT139_FN2), -	PINMUX_DATA(PORT139_FSIAOLR_MARK, PORT139_FN3), -	PINMUX_DATA(VIO_D10_MARK, PORT140_FN1), -	PINMUX_DATA(M11_SLCD_SO1_MARK, PORT140_FN2), -	PINMUX_DATA(TPU0TO2_MARK, PORT140_FN3), -	PINMUX_DATA(PORT140_FSIAOBT_MARK, PORT140_FN4), -	PINMUX_DATA(VIO_D11_MARK, PORT141_FN1), -	PINMUX_DATA(M12_SLCD_CE1_MARK, PORT141_FN2), -	PINMUX_DATA(TPU0TO3_MARK, PORT141_FN3), -	PINMUX_DATA(PORT141_FSIAOSLD_MARK, PORT141_FN4), -	PINMUX_DATA(VIO_D12_MARK, PORT142_FN1), -	PINMUX_DATA(M13_BSW_MARK, PORT142_FN2), -	PINMUX_DATA(PORT142_FSIACK_MARK, PORT142_FN3), -	PINMUX_DATA(VIO_D13_MARK, PORT143_FN1), -	PINMUX_DATA(M14_GSW_MARK, PORT143_FN2), -	PINMUX_DATA(PORT143_FSIAILR_MARK, PORT143_FN3), -	PINMUX_DATA(VIO_D14_MARK, PORT144_FN1), -	PINMUX_DATA(M15_RSW_MARK, PORT144_FN2), -	PINMUX_DATA(PORT144_FSIAIBT_MARK, PORT144_FN3), -	PINMUX_DATA(VIO_D15_MARK, PORT145_FN1), -	PINMUX_DATA(TPU1TO3_MARK, PORT145_FN2), -	PINMUX_DATA(PORT145_FSIAISLD_MARK, PORT145_FN3), -	PINMUX_DATA(VIO_CLK_MARK, PORT146_FN1), -	PINMUX_DATA(PORT146_KEYIN4_MARK, PORT146_FN2), -	PINMUX_DATA(IPORT2_MARK, PORT146_FN3), -	PINMUX_DATA(VIO_FIELD_MARK, PORT147_FN1), -	PINMUX_DATA(PORT147_KEYIN5_MARK, PORT147_FN2), -	PINMUX_DATA(VIO_CKO_MARK, PORT148_FN1), -	PINMUX_DATA(PORT148_KEYIN6_MARK, PORT148_FN2), -	PINMUX_DATA(A27_MARK, PORT149_FN1), -	PINMUX_DATA(RDWR_XWE_MARK, PORT149_FN2), -	PINMUX_DATA(MFG0_IN1_MARK, PORT149_FN3), -	PINMUX_DATA(MFG0_IN2_MARK, PORT150_FN1), -	PINMUX_DATA(TS_SPSYNC3_MARK, PORT151_FN1), -	PINMUX_DATA(MSIOF2_RSCK_MARK, PORT151_FN2), -	PINMUX_DATA(TS_SDAT3_MARK, PORT152_FN1), -	PINMUX_DATA(MSIOF2_RSYNC_MARK, PORT152_FN2), -	PINMUX_DATA(TPU1TO2_MARK, PORT153_FN1), -	PINMUX_DATA(TS_SDEN3_MARK, PORT153_FN2), -	PINMUX_DATA(PORT153_MSIOF2_SS1_MARK, PORT153_FN3), -	PINMUX_DATA(SOUT3_MARK, PORT154_FN1), -	PINMUX_DATA(SCIFA2_TXD1_MARK, PORT154_FN2), -	PINMUX_DATA(MSIOF2_MCK0_MARK, PORT154_FN3), -	PINMUX_DATA(SIN3_MARK, PORT155_FN1), -	PINMUX_DATA(SCIFA2_RXD1_MARK, PORT155_FN2), -	PINMUX_DATA(MSIOF2_MCK1_MARK, PORT155_FN3), -	PINMUX_DATA(XRTS3_MARK, PORT156_FN1), -	PINMUX_DATA(SCIFA2_RTS1_MARK, PORT156_FN2), -	PINMUX_DATA(PORT156_MSIOF2_SS2_MARK, PORT156_FN3), -	PINMUX_DATA(XCTS3_MARK, PORT157_FN1), -	PINMUX_DATA(SCIFA2_CTS1_MARK, PORT157_FN2), -	PINMUX_DATA(PORT157_MSIOF2_RXD_MARK, PORT157_FN3), - -	/* 55-4 (FN) */ -	PINMUX_DATA(DINT_MARK, PORT158_FN1), -	PINMUX_DATA(SCIFA2_SCK1_MARK, PORT158_FN2), -	PINMUX_DATA(TS_SCK3_MARK, PORT158_FN3), -	PINMUX_DATA(PORT159_SCIFB_SCK_MARK, PORT159_FN1), -	PINMUX_DATA(PORT159_SCIFA5_SCK_MARK, PORT159_FN2), -	PINMUX_DATA(NMI_MARK, PORT159_FN3), -	PINMUX_DATA(PORT160_SCIFB_TXD_MARK, PORT160_FN1), -	PINMUX_DATA(PORT160_SCIFA5_TXD_MARK, PORT160_FN2), -	PINMUX_DATA(SOUT0_MARK, PORT160_FN3), -	PINMUX_DATA(PORT161_SCIFB_CTS_MARK, PORT161_FN1), -	PINMUX_DATA(PORT161_SCIFA5_CTS_MARK, PORT161_FN2), -	PINMUX_DATA(XCTS0_MARK, PORT161_FN3), -	PINMUX_DATA(MFG3_IN2_MARK, PORT161_FN4), -	PINMUX_DATA(PORT162_SCIFB_RXD_MARK, PORT162_FN1), -	PINMUX_DATA(PORT162_SCIFA5_RXD_MARK, PORT162_FN2), -	PINMUX_DATA(SIN0_MARK, PORT162_FN3), -	PINMUX_DATA(MFG3_IN1_MARK, PORT162_FN4), -	PINMUX_DATA(PORT163_SCIFB_RTS_MARK, PORT163_FN1), -	PINMUX_DATA(PORT163_SCIFA5_RTS_MARK, PORT163_FN2), -	PINMUX_DATA(XRTS0_MARK, PORT163_FN3), -	PINMUX_DATA(MFG3_OUT1_MARK, PORT163_FN4), -	PINMUX_DATA(TPU3TO0_MARK, PORT163_FN5), -	PINMUX_DATA(LCDD0_MARK, PORT192_FN1), -	PINMUX_DATA(PORT192_KEYOUT0_MARK, PORT192_FN2), -	PINMUX_DATA(EXT_CKI_MARK, PORT192_FN3), -	PINMUX_DATA(LCDD1_MARK, PORT193_FN1), -	PINMUX_DATA(PORT193_KEYOUT1_MARK, PORT193_FN2), -	PINMUX_DATA(PORT193_SCIFA5_CTS_MARK, PORT193_FN3), -	PINMUX_DATA(BBIF2_TSYNC1_MARK, PORT193_FN4), -	PINMUX_DATA(LCDD2_MARK, PORT194_FN1), -	PINMUX_DATA(PORT194_KEYOUT2_MARK, PORT194_FN2), -	PINMUX_DATA(PORT194_SCIFA5_RTS_MARK, PORT194_FN3), -	PINMUX_DATA(BBIF2_TSCK1_MARK, PORT194_FN4), -	PINMUX_DATA(LCDD3_MARK, PORT195_FN1), -	PINMUX_DATA(PORT195_KEYOUT3_MARK, PORT195_FN2), -	PINMUX_DATA(PORT195_SCIFA5_RXD_MARK, PORT195_FN3), -	PINMUX_DATA(BBIF2_TXD1_MARK, PORT195_FN4), -	PINMUX_DATA(LCDD4_MARK, PORT196_FN1), -	PINMUX_DATA(PORT196_KEYOUT4_MARK, PORT196_FN2), -	PINMUX_DATA(PORT196_SCIFA5_TXD_MARK, PORT196_FN3), -	PINMUX_DATA(LCDD5_MARK, PORT197_FN1), -	PINMUX_DATA(PORT197_KEYOUT5_MARK, PORT197_FN2), -	PINMUX_DATA(PORT197_SCIFA5_SCK_MARK, PORT197_FN3), -	PINMUX_DATA(MFG2_OUT2_MARK, PORT197_FN4), -	PINMUX_DATA(LCDD6_MARK, PORT198_FN1), -	PINMUX_DATA(LCDD7_MARK, PORT199_FN1), -	PINMUX_DATA(TPU4TO1_MARK, PORT199_FN2), -	PINMUX_DATA(MFG4_OUT2_MARK, PORT199_FN3), -	PINMUX_DATA(LCDD8_MARK, PORT200_FN1), -	PINMUX_DATA(PORT200_KEYIN0_MARK, PORT200_FN2), -	PINMUX_DATA(VIO_DR0_MARK, PORT200_FN3), -	PINMUX_DATA(D16_MARK, PORT200_FN4), -	PINMUX_DATA(LCDD9_MARK, PORT201_FN1), -	PINMUX_DATA(PORT201_KEYIN1_MARK, PORT201_FN2), -	PINMUX_DATA(VIO_DR1_MARK, PORT201_FN3), -	PINMUX_DATA(D17_MARK, PORT201_FN4), -	PINMUX_DATA(LCDD10_MARK, PORT202_FN1), -	PINMUX_DATA(PORT202_KEYIN2_MARK, PORT202_FN2), -	PINMUX_DATA(VIO_DR2_MARK, PORT202_FN3), -	PINMUX_DATA(D18_MARK, PORT202_FN4), -	PINMUX_DATA(LCDD11_MARK, PORT203_FN1), -	PINMUX_DATA(PORT203_KEYIN3_MARK, PORT203_FN2), -	PINMUX_DATA(VIO_DR3_MARK, PORT203_FN3), -	PINMUX_DATA(D19_MARK, PORT203_FN4), -	PINMUX_DATA(LCDD12_MARK, PORT204_FN1), -	PINMUX_DATA(PORT204_KEYIN4_MARK, PORT204_FN2), -	PINMUX_DATA(VIO_DR4_MARK, PORT204_FN3), -	PINMUX_DATA(D20_MARK, PORT204_FN4), -	PINMUX_DATA(LCDD13_MARK, PORT205_FN1), -	PINMUX_DATA(PORT205_KEYIN5_MARK, PORT205_FN2), -	PINMUX_DATA(VIO_DR5_MARK, PORT205_FN3), -	PINMUX_DATA(D21_MARK, PORT205_FN4), -	PINMUX_DATA(LCDD14_MARK, PORT206_FN1), -	PINMUX_DATA(PORT206_KEYIN6_MARK, PORT206_FN2), -	PINMUX_DATA(VIO_DR6_MARK, PORT206_FN3), -	PINMUX_DATA(D22_MARK, PORT206_FN4), -	PINMUX_DATA(LCDD15_MARK, PORT207_FN1), -	PINMUX_DATA(PORT207_MSIOF0L_SS1_MARK, PORT207_FN2), -	PINMUX_DATA(PORT207_KEYOUT0_MARK, PORT207_FN3), -	PINMUX_DATA(VIO_DR7_MARK, PORT207_FN4), -	PINMUX_DATA(D23_MARK, PORT207_FN5), -	PINMUX_DATA(LCDD16_MARK, PORT208_FN1), -	PINMUX_DATA(PORT208_MSIOF0L_SS2_MARK, PORT208_FN2), -	PINMUX_DATA(PORT208_KEYOUT1_MARK, PORT208_FN3), -	PINMUX_DATA(VIO_VDR_MARK, PORT208_FN4), -	PINMUX_DATA(D24_MARK, PORT208_FN5), -	PINMUX_DATA(LCDD17_MARK, PORT209_FN1), -	PINMUX_DATA(PORT209_KEYOUT2_MARK, PORT209_FN2), -	PINMUX_DATA(VIO_HDR_MARK, PORT209_FN3), -	PINMUX_DATA(D25_MARK, PORT209_FN4), -	PINMUX_DATA(LCDD18_MARK, PORT210_FN1), -	PINMUX_DATA(DREQ2_MARK, PORT210_FN2), -	PINMUX_DATA(PORT210_MSIOF0L_SS1_MARK, PORT210_FN3), -	PINMUX_DATA(D26_MARK, PORT210_FN4), -	PINMUX_DATA(LCDD19_MARK, PORT211_FN1), -	PINMUX_DATA(PORT211_MSIOF0L_SS2_MARK, PORT211_FN2), -	PINMUX_DATA(D27_MARK, PORT211_FN3), -	PINMUX_DATA(LCDD20_MARK, PORT212_FN1), -	PINMUX_DATA(TS_SPSYNC1_MARK, PORT212_FN2), -	PINMUX_DATA(MSIOF0L_MCK0_MARK, PORT212_FN3), -	PINMUX_DATA(D28_MARK, PORT212_FN4), -	PINMUX_DATA(LCDD21_MARK, PORT213_FN1), -	PINMUX_DATA(TS_SDAT1_MARK, PORT213_FN2), -	PINMUX_DATA(MSIOF0L_MCK1_MARK, PORT213_FN3), -	PINMUX_DATA(D29_MARK, PORT213_FN4), -	PINMUX_DATA(LCDD22_MARK, PORT214_FN1), -	PINMUX_DATA(TS_SDEN1_MARK, PORT214_FN2), -	PINMUX_DATA(MSIOF0L_RSCK_MARK, PORT214_FN3), -	PINMUX_DATA(D30_MARK, PORT214_FN4), -	PINMUX_DATA(LCDD23_MARK, PORT215_FN1), -	PINMUX_DATA(TS_SCK1_MARK, PORT215_FN2), -	PINMUX_DATA(MSIOF0L_RSYNC_MARK, PORT215_FN3), -	PINMUX_DATA(D31_MARK, PORT215_FN4), -	PINMUX_DATA(LCDDCK_MARK, PORT216_FN1), -	PINMUX_DATA(LCDWR_MARK, PORT216_FN2), -	PINMUX_DATA(PORT216_KEYOUT3_MARK, PORT216_FN3), -	PINMUX_DATA(VIO_CLKR_MARK, PORT216_FN4), -	PINMUX_DATA(LCDRD_MARK, PORT217_FN1), -	PINMUX_DATA(DACK2_MARK, PORT217_FN2), -	PINMUX_DATA(MSIOF0L_TSYNC_MARK, PORT217_FN3), -	PINMUX_DATA(LCDHSYN_MARK, PORT218_FN1), -	PINMUX_DATA(LCDCS_MARK, PORT218_FN2), -	PINMUX_DATA(LCDCS2_MARK, PORT218_FN3), -	PINMUX_DATA(DACK3_MARK, PORT218_FN4), -	PINMUX_DATA(PORT218_VIO_CKOR_MARK, PORT218_FN5), -	PINMUX_DATA(PORT218_KEYOUT4_MARK, PORT218_FN6), -	PINMUX_DATA(LCDDISP_MARK, PORT219_FN1), -	PINMUX_DATA(LCDRS_MARK, PORT219_FN2), -	PINMUX_DATA(DREQ3_MARK, PORT219_FN3), -	PINMUX_DATA(MSIOF0L_TSCK_MARK, PORT219_FN4), -	PINMUX_DATA(LCDVSYN_MARK, PORT220_FN1), -	PINMUX_DATA(LCDVSYN2_MARK, PORT220_FN2), -	PINMUX_DATA(PORT220_KEYOUT5_MARK, PORT220_FN3), -	PINMUX_DATA(LCDLCLK_MARK, PORT221_FN1), -	PINMUX_DATA(DREQ1_MARK, PORT221_FN2), -	PINMUX_DATA(PWEN_MARK, PORT221_FN3), -	PINMUX_DATA(MSIOF0L_RXD_MARK, PORT221_FN4), -	PINMUX_DATA(LCDDON_MARK, PORT222_FN1), -	PINMUX_DATA(LCDDON2_MARK, PORT222_FN2), -	PINMUX_DATA(DACK1_MARK, PORT222_FN3), -	PINMUX_DATA(OVCN_MARK, PORT222_FN4), -	PINMUX_DATA(MSIOF0L_TXD_MARK, PORT222_FN5), -	PINMUX_DATA(SCIFA1_TXD_MARK, PORT225_FN1), -	PINMUX_DATA(OVCN2_MARK, PORT225_FN2), -	PINMUX_DATA(EXTLP_MARK, PORT226_FN1), -	PINMUX_DATA(SCIFA1_SCK_MARK, PORT226_FN2), -	PINMUX_DATA(USBTERM_MARK, PORT226_FN3), -	PINMUX_DATA(PORT226_VIO_CKO2_MARK, PORT226_FN4), -	PINMUX_DATA(SCIFA1_RTS_MARK, PORT227_FN1), -	PINMUX_DATA(IDIN_MARK, PORT227_FN2), -	PINMUX_DATA(SCIFA1_RXD_MARK, PORT228_FN1), -	PINMUX_DATA(SCIFA1_CTS_MARK, PORT229_FN1), -	PINMUX_DATA(MFG1_IN1_MARK, PORT229_FN2), -	PINMUX_DATA(MSIOF1_TXD_MARK, PORT230_FN1), -	PINMUX_DATA(SCIFA2_TXD2_MARK, PORT230_FN2), -	PINMUX_DATA(PORT230_FSIAOMC_MARK, PORT230_FN3), -	PINMUX_DATA(MSIOF1_TSYNC_MARK, PORT231_FN1), -	PINMUX_DATA(SCIFA2_CTS2_MARK, PORT231_FN2), -	PINMUX_DATA(PORT231_FSIAOLR_MARK, PORT231_FN3), -	PINMUX_DATA(MSIOF1_TSCK_MARK, PORT232_FN1), -	PINMUX_DATA(SCIFA2_SCK2_MARK, PORT232_FN2), -	PINMUX_DATA(PORT232_FSIAOBT_MARK, PORT232_FN3), -	PINMUX_DATA(MSIOF1_RXD_MARK, PORT233_FN1), -	PINMUX_DATA(SCIFA2_RXD2_MARK, PORT233_FN2), -	PINMUX_DATA(GPS_VCOTRIG_MARK, PORT233_FN3), -	PINMUX_DATA(PORT233_FSIACK_MARK, PORT233_FN4), -	PINMUX_DATA(MSIOF1_RSCK_MARK, PORT234_FN1), -	PINMUX_DATA(SCIFA2_RTS2_MARK, PORT234_FN2), -	PINMUX_DATA(PORT234_FSIAOSLD_MARK, PORT234_FN3), -	PINMUX_DATA(MSIOF1_RSYNC_MARK, PORT235_FN1), -	PINMUX_DATA(OPORT0_MARK, PORT235_FN2), -	PINMUX_DATA(MFG1_IN2_MARK, PORT235_FN3), -	PINMUX_DATA(PORT235_FSIAILR_MARK, PORT235_FN4), -	PINMUX_DATA(MSIOF1_MCK0_MARK, PORT236_FN1), -	PINMUX_DATA(I2C_SDA2_MARK, PORT236_FN2), -	PINMUX_DATA(PORT236_FSIAIBT_MARK, PORT236_FN3), -	PINMUX_DATA(MSIOF1_MCK1_MARK, PORT237_FN1), -	PINMUX_DATA(I2C_SCL2_MARK, PORT237_FN2), -	PINMUX_DATA(PORT237_FSIAISLD_MARK, PORT237_FN3), -	PINMUX_DATA(MSIOF1_SS1_MARK, PORT238_FN1), -	PINMUX_DATA(EDBGREQ3_MARK, PORT238_FN2), - -	/* 55-5 (FN) */ -	PINMUX_DATA(MSIOF1_SS2_MARK, PORT239_FN1), -	PINMUX_DATA(SCIFA6_TXD_MARK, PORT240_FN1), -	PINMUX_DATA(PORT241_IRDA_OUT_MARK, PORT241_FN1), -	PINMUX_DATA(PORT241_IROUT_MARK, PORT241_FN2), -	PINMUX_DATA(MFG4_OUT1_MARK, PORT241_FN3), -	PINMUX_DATA(TPU4TO0_MARK, PORT241_FN4), -	PINMUX_DATA(PORT242_IRDA_IN_MARK, PORT242_FN1), -	PINMUX_DATA(MFG4_IN2_MARK, PORT242_FN2), -	PINMUX_DATA(PORT243_IRDA_FIRSEL_MARK, PORT243_FN1), -	PINMUX_DATA(PORT243_VIO_CKO2_MARK, PORT243_FN2), -	PINMUX_DATA(PORT244_SCIFA5_CTS_MARK, PORT244_FN1), -	PINMUX_DATA(MFG2_IN1_MARK, PORT244_FN2), -	PINMUX_DATA(PORT244_SCIFB_CTS_MARK, PORT244_FN3), -	PINMUX_DATA(PORT245_SCIFA5_RTS_MARK, PORT245_FN1), -	PINMUX_DATA(MFG2_IN2_MARK, PORT245_FN2), -	PINMUX_DATA(PORT245_SCIFB_RTS_MARK, PORT245_FN3), -	PINMUX_DATA(PORT246_SCIFA5_RXD_MARK, PORT246_FN1), -	PINMUX_DATA(MFG1_OUT1_MARK, PORT246_FN2), -	PINMUX_DATA(PORT246_SCIFB_RXD_MARK, PORT246_FN3), -	PINMUX_DATA(TPU1TO0_MARK, PORT246_FN4), -	PINMUX_DATA(PORT247_SCIFA5_TXD_MARK, PORT247_FN1), -	PINMUX_DATA(MFG3_OUT2_MARK, PORT247_FN2), -	PINMUX_DATA(PORT247_SCIFB_TXD_MARK, PORT247_FN3), -	PINMUX_DATA(TPU3TO1_MARK, PORT247_FN4), -	PINMUX_DATA(PORT248_SCIFA5_SCK_MARK, PORT248_FN1), -	PINMUX_DATA(MFG2_OUT1_MARK, PORT248_FN2), -	PINMUX_DATA(PORT248_SCIFB_SCK_MARK, PORT248_FN3), -	PINMUX_DATA(TPU2TO0_MARK, PORT248_FN4), -	PINMUX_DATA(PORT249_IROUT_MARK, PORT249_FN1), -	PINMUX_DATA(MFG4_IN1_MARK, PORT249_FN2), -	PINMUX_DATA(SDHICLK0_MARK, PORT250_FN1), -	PINMUX_DATA(TCK2_SWCLK_MC0_MARK, PORT250_FN2), -	PINMUX_DATA(SDHICD0_MARK, PORT251_FN1), -	PINMUX_DATA(SDHID0_0_MARK, PORT252_FN1), -	PINMUX_DATA(TMS2_SWDIO_MC0_MARK, PORT252_FN2), -	PINMUX_DATA(SDHID0_1_MARK, PORT253_FN1), -	PINMUX_DATA(TDO2_SWO0_MC0_MARK, PORT253_FN2), -	PINMUX_DATA(SDHID0_2_MARK, PORT254_FN1), -	PINMUX_DATA(TDI2_MARK, PORT254_FN2), -	PINMUX_DATA(SDHID0_3_MARK, PORT255_FN1), -	PINMUX_DATA(RTCK2_SWO1_MC0_MARK, PORT255_FN2), -	PINMUX_DATA(SDHICMD0_MARK, PORT256_FN1), -	PINMUX_DATA(TRST2_MARK, PORT256_FN2), -	PINMUX_DATA(SDHIWP0_MARK, PORT257_FN1), -	PINMUX_DATA(EDBGREQ2_MARK, PORT257_FN2), -	PINMUX_DATA(SDHICLK1_MARK, PORT258_FN1), -	PINMUX_DATA(TCK3_SWCLK_MC1_MARK, PORT258_FN2), -	PINMUX_DATA(SDHID1_0_MARK, PORT259_FN1), -	PINMUX_DATA(M11_SLCD_SO2_MARK, PORT259_FN2), -	PINMUX_DATA(TS_SPSYNC2_MARK, PORT259_FN3), -	PINMUX_DATA(TMS3_SWDIO_MC1_MARK, PORT259_FN4), -	PINMUX_DATA(SDHID1_1_MARK, PORT260_FN1), -	PINMUX_DATA(M9_SLCD_A02_MARK, PORT260_FN2), -	PINMUX_DATA(TS_SDAT2_MARK, PORT260_FN3), -	PINMUX_DATA(TDO3_SWO0_MC1_MARK, PORT260_FN4), -	PINMUX_DATA(SDHID1_2_MARK, PORT261_FN1), -	PINMUX_DATA(M10_SLCD_CK2_MARK, PORT261_FN2), -	PINMUX_DATA(TS_SDEN2_MARK, PORT261_FN3), -	PINMUX_DATA(TDI3_MARK, PORT261_FN4), -	PINMUX_DATA(SDHID1_3_MARK, PORT262_FN1), -	PINMUX_DATA(M12_SLCD_CE2_MARK, PORT262_FN2), -	PINMUX_DATA(TS_SCK2_MARK, PORT262_FN3), -	PINMUX_DATA(RTCK3_SWO1_MC1_MARK, PORT262_FN4), -	PINMUX_DATA(SDHICMD1_MARK, PORT263_FN1), -	PINMUX_DATA(TRST3_MARK, PORT263_FN2), -	PINMUX_DATA(RESETOUTS_MARK, PORT264_FN1), -}; - -static struct pinmux_gpio pinmux_gpios[] = { -	/* 55-1 -> 55-5 (GPIO) */ -	GPIO_PORT_ALL(), - -	/* Special Pull-up / Pull-down Functions */ -	GPIO_FN(PORT66_KEYIN0_PU), GPIO_FN(PORT67_KEYIN1_PU), -	GPIO_FN(PORT68_KEYIN2_PU), GPIO_FN(PORT69_KEYIN3_PU), -	GPIO_FN(PORT70_KEYIN4_PU), GPIO_FN(PORT71_KEYIN5_PU), -	GPIO_FN(PORT72_KEYIN6_PU), - -	/* 55-1 (FN) */ -	GPIO_FN(VBUS_0), -	GPIO_FN(CPORT0), -	GPIO_FN(CPORT1), -	GPIO_FN(CPORT2), -	GPIO_FN(CPORT3), -	GPIO_FN(CPORT4), -	GPIO_FN(CPORT5), -	GPIO_FN(CPORT6), -	GPIO_FN(CPORT7), -	GPIO_FN(CPORT8), -	GPIO_FN(CPORT9), -	GPIO_FN(CPORT10), -	GPIO_FN(CPORT11), GPIO_FN(SIN2), -	GPIO_FN(CPORT12), GPIO_FN(XCTS2), -	GPIO_FN(CPORT13), GPIO_FN(RFSPO4), -	GPIO_FN(CPORT14), GPIO_FN(RFSPO5), -	GPIO_FN(CPORT15), GPIO_FN(SCIFA0_SCK), GPIO_FN(GPS_AGC2), -	GPIO_FN(CPORT16), GPIO_FN(SCIFA0_TXD), GPIO_FN(GPS_AGC3), -	GPIO_FN(CPORT17_IC_OE), GPIO_FN(SOUT2), -	GPIO_FN(CPORT18), GPIO_FN(XRTS2), GPIO_FN(PORT19_VIO_CKO2), -	GPIO_FN(CPORT19_MPORT1), -	GPIO_FN(CPORT20), GPIO_FN(RFSPO6), -	GPIO_FN(CPORT21), GPIO_FN(STATUS0), -	GPIO_FN(CPORT22), GPIO_FN(STATUS1), -	GPIO_FN(CPORT23), GPIO_FN(STATUS2), GPIO_FN(RFSPO7), -	GPIO_FN(B_SYNLD1), -	GPIO_FN(B_SYNLD2), GPIO_FN(SYSENMSK), -	GPIO_FN(XMAINPS), -	GPIO_FN(XDIVPS), -	GPIO_FN(XIDRST), -	GPIO_FN(IDCLK), GPIO_FN(IC_DP), -	GPIO_FN(IDIO), GPIO_FN(IC_DM), -	GPIO_FN(SOUT1), GPIO_FN(SCIFA4_TXD), GPIO_FN(M02_BERDAT), -	GPIO_FN(SIN1), GPIO_FN(SCIFA4_RXD), GPIO_FN(XWUP), -	GPIO_FN(XRTS1), GPIO_FN(SCIFA4_RTS), GPIO_FN(M03_BERCLK), -	GPIO_FN(XCTS1), GPIO_FN(SCIFA4_CTS), -	GPIO_FN(PCMCLKO), -	GPIO_FN(SYNC8KO), - -	/* 55-2 (FN) */ -	GPIO_FN(DNPCM_A), -	GPIO_FN(UPPCM_A), -	GPIO_FN(VACK), -	GPIO_FN(XTALB1L), -	GPIO_FN(GPS_AGC1), GPIO_FN(SCIFA0_RTS), -	GPIO_FN(GPS_AGC4), GPIO_FN(SCIFA0_RXD), -	GPIO_FN(GPS_PWRDOWN), GPIO_FN(SCIFA0_CTS), -	GPIO_FN(GPS_IM), -	GPIO_FN(GPS_IS), -	GPIO_FN(GPS_QM), -	GPIO_FN(GPS_QS), -	GPIO_FN(FMSOCK), GPIO_FN(PORT49_IRDA_OUT), GPIO_FN(PORT49_IROUT), -	GPIO_FN(FMSOOLR), GPIO_FN(BBIF2_TSYNC2), GPIO_FN(TPU2TO2), -	GPIO_FN(IPORT3), GPIO_FN(FMSIOLR), -	GPIO_FN(FMSOOBT), GPIO_FN(BBIF2_TSCK2), GPIO_FN(TPU2TO3), -	GPIO_FN(OPORT1), GPIO_FN(FMSIOBT), -	GPIO_FN(FMSOSLD), GPIO_FN(BBIF2_TXD2), GPIO_FN(OPORT2), -	GPIO_FN(FMSOILR), GPIO_FN(PORT53_IRDA_IN), GPIO_FN(TPU3TO3), -	GPIO_FN(OPORT3), GPIO_FN(FMSIILR), -	GPIO_FN(FMSOIBT), GPIO_FN(PORT54_IRDA_FIRSEL), GPIO_FN(TPU3TO2), -	GPIO_FN(FMSIIBT), -	GPIO_FN(FMSISLD), GPIO_FN(MFG0_OUT1), GPIO_FN(TPU0TO0), -	GPIO_FN(A0_EA0), GPIO_FN(BS), -	GPIO_FN(A12_EA12), GPIO_FN(PORT58_VIO_CKOR), GPIO_FN(TPU4TO2), -	GPIO_FN(A13_EA13), GPIO_FN(PORT59_IROUT), GPIO_FN(MFG0_OUT2), -	GPIO_FN(TPU0TO1), -	GPIO_FN(A14_EA14), GPIO_FN(PORT60_KEYOUT5), -	GPIO_FN(A15_EA15), GPIO_FN(PORT61_KEYOUT4), -	GPIO_FN(A16_EA16), GPIO_FN(PORT62_KEYOUT3), GPIO_FN(MSIOF0_SS1), -	GPIO_FN(A17_EA17), GPIO_FN(PORT63_KEYOUT2), GPIO_FN(MSIOF0_TSYNC), -	GPIO_FN(A18_EA18), GPIO_FN(PORT64_KEYOUT1), GPIO_FN(MSIOF0_TSCK), -	GPIO_FN(A19_EA19), GPIO_FN(PORT65_KEYOUT0), GPIO_FN(MSIOF0_TXD), -	GPIO_FN(A20_EA20), GPIO_FN(PORT66_KEYIN0), GPIO_FN(MSIOF0_RSCK), -	GPIO_FN(A21_EA21), GPIO_FN(PORT67_KEYIN1), GPIO_FN(MSIOF0_RSYNC), -	GPIO_FN(A22_EA22), GPIO_FN(PORT68_KEYIN2), GPIO_FN(MSIOF0_MCK0), -	GPIO_FN(A23_EA23), GPIO_FN(PORT69_KEYIN3), GPIO_FN(MSIOF0_MCK1), -	GPIO_FN(A24_EA24), GPIO_FN(PORT70_KEYIN4), GPIO_FN(MSIOF0_RXD), -	GPIO_FN(A25_EA25), GPIO_FN(PORT71_KEYIN5), GPIO_FN(MSIOF0_SS2), -	GPIO_FN(A26), GPIO_FN(PORT72_KEYIN6), -	GPIO_FN(D0_ED0_NAF0), -	GPIO_FN(D1_ED1_NAF1), -	GPIO_FN(D2_ED2_NAF2), -	GPIO_FN(D3_ED3_NAF3), -	GPIO_FN(D4_ED4_NAF4), -	GPIO_FN(D5_ED5_NAF5), -	GPIO_FN(D6_ED6_NAF6), -	GPIO_FN(D7_ED7_NAF7), -	GPIO_FN(D8_ED8_NAF8), -	GPIO_FN(D9_ED9_NAF9), -	GPIO_FN(D10_ED10_NAF10), -	GPIO_FN(D11_ED11_NAF11), -	GPIO_FN(D12_ED12_NAF12), -	GPIO_FN(D13_ED13_NAF13), -	GPIO_FN(D14_ED14_NAF14), -	GPIO_FN(D15_ED15_NAF15), -	GPIO_FN(CS4), -	GPIO_FN(CS5A), GPIO_FN(FMSICK), - -	/* 55-3 (FN) */ -	GPIO_FN(CS5B), GPIO_FN(FCE1), -	GPIO_FN(CS6B), GPIO_FN(XCS2), GPIO_FN(CS6A), GPIO_FN(DACK0), -	GPIO_FN(FCE0), -	GPIO_FN(WAIT), GPIO_FN(DREQ0), -	GPIO_FN(RD_XRD), -	GPIO_FN(WE0_XWR0_FWE), -	GPIO_FN(WE1_XWR1), -	GPIO_FN(FRB), -	GPIO_FN(CKO), -	GPIO_FN(NBRSTOUT), -	GPIO_FN(NBRST), -	GPIO_FN(GPS_EPPSIN), -	GPIO_FN(LATCHPULSE), -	GPIO_FN(LTESIGNAL), -	GPIO_FN(LEGACYSTATE), -	GPIO_FN(TCKON), -	GPIO_FN(VIO_VD), GPIO_FN(PORT128_KEYOUT0), GPIO_FN(IPORT0), -	GPIO_FN(VIO_HD), GPIO_FN(PORT129_KEYOUT1), GPIO_FN(IPORT1), -	GPIO_FN(VIO_D0), GPIO_FN(PORT130_KEYOUT2), GPIO_FN(PORT130_MSIOF2_RXD), -	GPIO_FN(VIO_D1), GPIO_FN(PORT131_KEYOUT3), GPIO_FN(PORT131_MSIOF2_SS1), -	GPIO_FN(VIO_D2), GPIO_FN(PORT132_KEYOUT4), GPIO_FN(PORT132_MSIOF2_SS2), -	GPIO_FN(VIO_D3), GPIO_FN(PORT133_KEYOUT5), -	GPIO_FN(PORT133_MSIOF2_TSYNC), -	GPIO_FN(VIO_D4), GPIO_FN(PORT134_KEYIN0), GPIO_FN(PORT134_MSIOF2_TXD), -	GPIO_FN(VIO_D5), GPIO_FN(PORT135_KEYIN1), GPIO_FN(PORT135_MSIOF2_TSCK), -	GPIO_FN(VIO_D6), GPIO_FN(PORT136_KEYIN2), -	GPIO_FN(VIO_D7), GPIO_FN(PORT137_KEYIN3), -	GPIO_FN(VIO_D8), GPIO_FN(M9_SLCD_A01), GPIO_FN(PORT138_FSIAOMC), -	GPIO_FN(VIO_D9), GPIO_FN(M10_SLCD_CK1), GPIO_FN(PORT139_FSIAOLR), -	GPIO_FN(VIO_D10), GPIO_FN(M11_SLCD_SO1), GPIO_FN(TPU0TO2), -	GPIO_FN(PORT140_FSIAOBT), -	GPIO_FN(VIO_D11), GPIO_FN(M12_SLCD_CE1), GPIO_FN(TPU0TO3), -	GPIO_FN(PORT141_FSIAOSLD), -	GPIO_FN(VIO_D12), GPIO_FN(M13_BSW), GPIO_FN(PORT142_FSIACK), -	GPIO_FN(VIO_D13), GPIO_FN(M14_GSW), GPIO_FN(PORT143_FSIAILR), -	GPIO_FN(VIO_D14), GPIO_FN(M15_RSW), GPIO_FN(PORT144_FSIAIBT), -	GPIO_FN(VIO_D15), GPIO_FN(TPU1TO3), GPIO_FN(PORT145_FSIAISLD), -	GPIO_FN(VIO_CLK), GPIO_FN(PORT146_KEYIN4), GPIO_FN(IPORT2), -	GPIO_FN(VIO_FIELD), GPIO_FN(PORT147_KEYIN5), -	GPIO_FN(VIO_CKO), GPIO_FN(PORT148_KEYIN6), -	GPIO_FN(A27), GPIO_FN(RDWR_XWE), GPIO_FN(MFG0_IN1), -	GPIO_FN(MFG0_IN2), -	GPIO_FN(TS_SPSYNC3), GPIO_FN(MSIOF2_RSCK), -	GPIO_FN(TS_SDAT3), GPIO_FN(MSIOF2_RSYNC), -	GPIO_FN(TPU1TO2), GPIO_FN(TS_SDEN3), GPIO_FN(PORT153_MSIOF2_SS1), -	GPIO_FN(SOUT3), GPIO_FN(SCIFA2_TXD1), GPIO_FN(MSIOF2_MCK0), -	GPIO_FN(SIN3), GPIO_FN(SCIFA2_RXD1), GPIO_FN(MSIOF2_MCK1), -	GPIO_FN(XRTS3), GPIO_FN(SCIFA2_RTS1), GPIO_FN(PORT156_MSIOF2_SS2), -	GPIO_FN(XCTS3), GPIO_FN(SCIFA2_CTS1), GPIO_FN(PORT157_MSIOF2_RXD), - -	/* 55-4 (FN) */ -	GPIO_FN(DINT), GPIO_FN(SCIFA2_SCK1), GPIO_FN(TS_SCK3), -	GPIO_FN(PORT159_SCIFB_SCK), GPIO_FN(PORT159_SCIFA5_SCK), GPIO_FN(NMI), -	GPIO_FN(PORT160_SCIFB_TXD), GPIO_FN(PORT160_SCIFA5_TXD), GPIO_FN(SOUT0), -	GPIO_FN(PORT161_SCIFB_CTS), GPIO_FN(PORT161_SCIFA5_CTS), GPIO_FN(XCTS0), -	GPIO_FN(MFG3_IN2), -	GPIO_FN(PORT162_SCIFB_RXD), GPIO_FN(PORT162_SCIFA5_RXD), GPIO_FN(SIN0), -	GPIO_FN(MFG3_IN1), -	GPIO_FN(PORT163_SCIFB_RTS), GPIO_FN(PORT163_SCIFA5_RTS), GPIO_FN(XRTS0), -	GPIO_FN(MFG3_OUT1), GPIO_FN(TPU3TO0), -	GPIO_FN(LCDD0), GPIO_FN(PORT192_KEYOUT0), GPIO_FN(EXT_CKI), -	GPIO_FN(LCDD1), GPIO_FN(PORT193_KEYOUT1), GPIO_FN(PORT193_SCIFA5_CTS), -	GPIO_FN(BBIF2_TSYNC1), -	GPIO_FN(LCDD2), GPIO_FN(PORT194_KEYOUT2), GPIO_FN(PORT194_SCIFA5_RTS), -	GPIO_FN(BBIF2_TSCK1), -	GPIO_FN(LCDD3), GPIO_FN(PORT195_KEYOUT3), GPIO_FN(PORT195_SCIFA5_RXD), -	GPIO_FN(BBIF2_TXD1), -	GPIO_FN(LCDD4), GPIO_FN(PORT196_KEYOUT4), GPIO_FN(PORT196_SCIFA5_TXD), -	GPIO_FN(LCDD5), GPIO_FN(PORT197_KEYOUT5), GPIO_FN(PORT197_SCIFA5_SCK), -	GPIO_FN(MFG2_OUT2), -	GPIO_FN(LCDD6), -	GPIO_FN(LCDD7), GPIO_FN(TPU4TO1), GPIO_FN(MFG4_OUT2), -	GPIO_FN(LCDD8), GPIO_FN(PORT200_KEYIN0), GPIO_FN(VIO_DR0), -	GPIO_FN(D16), -	GPIO_FN(LCDD9), GPIO_FN(PORT201_KEYIN1), GPIO_FN(VIO_DR1), -	GPIO_FN(D17), -	GPIO_FN(LCDD10), GPIO_FN(PORT202_KEYIN2), GPIO_FN(VIO_DR2), -	GPIO_FN(D18), -	GPIO_FN(LCDD11), GPIO_FN(PORT203_KEYIN3), GPIO_FN(VIO_DR3), -	GPIO_FN(D19), -	GPIO_FN(LCDD12), GPIO_FN(PORT204_KEYIN4), GPIO_FN(VIO_DR4), -	GPIO_FN(D20), -	GPIO_FN(LCDD13), GPIO_FN(PORT205_KEYIN5), GPIO_FN(VIO_DR5), -	GPIO_FN(D21), -	GPIO_FN(LCDD14), GPIO_FN(PORT206_KEYIN6), GPIO_FN(VIO_DR6), -	GPIO_FN(D22), -	GPIO_FN(LCDD15), GPIO_FN(PORT207_MSIOF0L_SS1), GPIO_FN(PORT207_KEYOUT0), -	GPIO_FN(VIO_DR7), GPIO_FN(D23), -	GPIO_FN(LCDD16), GPIO_FN(PORT208_MSIOF0L_SS2), GPIO_FN(PORT208_KEYOUT1), -	GPIO_FN(VIO_VDR), GPIO_FN(D24), -	GPIO_FN(LCDD17), GPIO_FN(PORT209_KEYOUT2), GPIO_FN(VIO_HDR), -	GPIO_FN(D25), -	GPIO_FN(LCDD18), GPIO_FN(DREQ2), GPIO_FN(PORT210_MSIOF0L_SS1), -	GPIO_FN(D26), -	GPIO_FN(LCDD19), GPIO_FN(PORT211_MSIOF0L_SS2), GPIO_FN(D27), -	GPIO_FN(LCDD20), GPIO_FN(TS_SPSYNC1), GPIO_FN(MSIOF0L_MCK0), -	GPIO_FN(D28), -	GPIO_FN(LCDD21), GPIO_FN(TS_SDAT1), GPIO_FN(MSIOF0L_MCK1), -	GPIO_FN(D29), -	GPIO_FN(LCDD22), GPIO_FN(TS_SDEN1), GPIO_FN(MSIOF0L_RSCK), -	GPIO_FN(D30), -	GPIO_FN(LCDD23), GPIO_FN(TS_SCK1), GPIO_FN(MSIOF0L_RSYNC), -	GPIO_FN(D31), -	GPIO_FN(LCDDCK), GPIO_FN(LCDWR), GPIO_FN(PORT216_KEYOUT3), -	GPIO_FN(VIO_CLKR), -	GPIO_FN(LCDRD), GPIO_FN(DACK2), GPIO_FN(MSIOF0L_TSYNC), -	GPIO_FN(LCDHSYN), GPIO_FN(LCDCS), GPIO_FN(LCDCS2), GPIO_FN(DACK3), -	GPIO_FN(PORT218_VIO_CKOR), GPIO_FN(PORT218_KEYOUT4), -	GPIO_FN(LCDDISP), GPIO_FN(LCDRS), GPIO_FN(DREQ3), GPIO_FN(MSIOF0L_TSCK), -	GPIO_FN(LCDVSYN), GPIO_FN(LCDVSYN2), GPIO_FN(PORT220_KEYOUT5), -	GPIO_FN(LCDLCLK), GPIO_FN(DREQ1), GPIO_FN(PWEN), GPIO_FN(MSIOF0L_RXD), -	GPIO_FN(LCDDON), GPIO_FN(LCDDON2), GPIO_FN(DACK1), GPIO_FN(OVCN), -	GPIO_FN(MSIOF0L_TXD), -	GPIO_FN(SCIFA1_TXD), GPIO_FN(OVCN2), -	GPIO_FN(EXTLP), GPIO_FN(SCIFA1_SCK), GPIO_FN(USBTERM), -	GPIO_FN(PORT226_VIO_CKO2), -	GPIO_FN(SCIFA1_RTS), GPIO_FN(IDIN), -	GPIO_FN(SCIFA1_RXD), -	GPIO_FN(SCIFA1_CTS), GPIO_FN(MFG1_IN1), -	GPIO_FN(MSIOF1_TXD), GPIO_FN(SCIFA2_TXD2), GPIO_FN(PORT230_FSIAOMC), -	GPIO_FN(MSIOF1_TSYNC), GPIO_FN(SCIFA2_CTS2), GPIO_FN(PORT231_FSIAOLR), -	GPIO_FN(MSIOF1_TSCK), GPIO_FN(SCIFA2_SCK2), GPIO_FN(PORT232_FSIAOBT), -	GPIO_FN(MSIOF1_RXD), GPIO_FN(SCIFA2_RXD2), GPIO_FN(GPS_VCOTRIG), -	GPIO_FN(PORT233_FSIACK), -	GPIO_FN(MSIOF1_RSCK), GPIO_FN(SCIFA2_RTS2), GPIO_FN(PORT234_FSIAOSLD), -	GPIO_FN(MSIOF1_RSYNC), GPIO_FN(OPORT0), GPIO_FN(MFG1_IN2), -	GPIO_FN(PORT235_FSIAILR), -	GPIO_FN(MSIOF1_MCK0), GPIO_FN(I2C_SDA2), GPIO_FN(PORT236_FSIAIBT), -	GPIO_FN(MSIOF1_MCK1), GPIO_FN(I2C_SCL2), GPIO_FN(PORT237_FSIAISLD), -	GPIO_FN(MSIOF1_SS1), GPIO_FN(EDBGREQ3), - -	/* 55-5 (FN) */ -	GPIO_FN(MSIOF1_SS2), -	GPIO_FN(SCIFA6_TXD), -	GPIO_FN(PORT241_IRDA_OUT), GPIO_FN(PORT241_IROUT), GPIO_FN(MFG4_OUT1), -	GPIO_FN(TPU4TO0), -	GPIO_FN(PORT242_IRDA_IN), GPIO_FN(MFG4_IN2), -	GPIO_FN(PORT243_IRDA_FIRSEL), GPIO_FN(PORT243_VIO_CKO2), -	GPIO_FN(PORT244_SCIFA5_CTS), GPIO_FN(MFG2_IN1), -	GPIO_FN(PORT244_SCIFB_CTS), -	GPIO_FN(PORT245_SCIFA5_RTS), GPIO_FN(MFG2_IN2), -	GPIO_FN(PORT245_SCIFB_RTS), -	GPIO_FN(PORT246_SCIFA5_RXD), GPIO_FN(MFG1_OUT1), -	GPIO_FN(PORT246_SCIFB_RXD), GPIO_FN(TPU1TO0), -	GPIO_FN(PORT247_SCIFA5_TXD), GPIO_FN(MFG3_OUT2), -	GPIO_FN(PORT247_SCIFB_TXD), GPIO_FN(TPU3TO1), -	GPIO_FN(PORT248_SCIFA5_SCK), GPIO_FN(MFG2_OUT1), -	GPIO_FN(PORT248_SCIFB_SCK), GPIO_FN(TPU2TO0), -	GPIO_FN(PORT249_IROUT), GPIO_FN(MFG4_IN1), -	GPIO_FN(SDHICLK0), GPIO_FN(TCK2_SWCLK_MC0), -	GPIO_FN(SDHICD0), -	GPIO_FN(SDHID0_0), GPIO_FN(TMS2_SWDIO_MC0), -	GPIO_FN(SDHID0_1), GPIO_FN(TDO2_SWO0_MC0), -	GPIO_FN(SDHID0_2), GPIO_FN(TDI2), -	GPIO_FN(SDHID0_3), GPIO_FN(RTCK2_SWO1_MC0), -	GPIO_FN(SDHICMD0), GPIO_FN(TRST2), -	GPIO_FN(SDHIWP0), GPIO_FN(EDBGREQ2), -	GPIO_FN(SDHICLK1), GPIO_FN(TCK3_SWCLK_MC1), -	GPIO_FN(SDHID1_0), GPIO_FN(M11_SLCD_SO2), GPIO_FN(TS_SPSYNC2), -	GPIO_FN(TMS3_SWDIO_MC1), -	GPIO_FN(SDHID1_1), GPIO_FN(M9_SLCD_A02), GPIO_FN(TS_SDAT2), -	GPIO_FN(TDO3_SWO0_MC1), -	GPIO_FN(SDHID1_2), GPIO_FN(M10_SLCD_CK2), GPIO_FN(TS_SDEN2), -	GPIO_FN(TDI3), -	GPIO_FN(SDHID1_3), GPIO_FN(M12_SLCD_CE2), GPIO_FN(TS_SCK2), -	GPIO_FN(RTCK3_SWO1_MC1), -	GPIO_FN(SDHICMD1), GPIO_FN(TRST3), -	GPIO_FN(RESETOUTS), -}; - -static struct pinmux_cfg_reg pinmux_config_regs[] = { -	PORTCR(0, 0xe6050000), /* PORT0CR */ -	PORTCR(1, 0xe6050001), /* PORT1CR */ -	PORTCR(2, 0xe6050002), /* PORT2CR */ -	PORTCR(3, 0xe6050003), /* PORT3CR */ -	PORTCR(4, 0xe6050004), /* PORT4CR */ -	PORTCR(5, 0xe6050005), /* PORT5CR */ -	PORTCR(6, 0xe6050006), /* PORT6CR */ -	PORTCR(7, 0xe6050007), /* PORT7CR */ -	PORTCR(8, 0xe6050008), /* PORT8CR */ -	PORTCR(9, 0xe6050009), /* PORT9CR */ - -	PORTCR(10, 0xe605000a), /* PORT10CR */ -	PORTCR(11, 0xe605000b), /* PORT11CR */ -	PORTCR(12, 0xe605000c), /* PORT12CR */ -	PORTCR(13, 0xe605000d), /* PORT13CR */ -	PORTCR(14, 0xe605000e), /* PORT14CR */ -	PORTCR(15, 0xe605000f), /* PORT15CR */ -	PORTCR(16, 0xe6050010), /* PORT16CR */ -	PORTCR(17, 0xe6050011), /* PORT17CR */ -	PORTCR(18, 0xe6050012), /* PORT18CR */ -	PORTCR(19, 0xe6050013), /* PORT19CR */ - -	PORTCR(20, 0xe6050014), /* PORT20CR */ -	PORTCR(21, 0xe6050015), /* PORT21CR */ -	PORTCR(22, 0xe6050016), /* PORT22CR */ -	PORTCR(23, 0xe6050017), /* PORT23CR */ -	PORTCR(24, 0xe6050018), /* PORT24CR */ -	PORTCR(25, 0xe6050019), /* PORT25CR */ -	PORTCR(26, 0xe605001a), /* PORT26CR */ -	PORTCR(27, 0xe605001b), /* PORT27CR */ -	PORTCR(28, 0xe605001c), /* PORT28CR */ -	PORTCR(29, 0xe605001d), /* PORT29CR */ - -	PORTCR(30, 0xe605001e), /* PORT30CR */ -	PORTCR(31, 0xe605001f), /* PORT31CR */ -	PORTCR(32, 0xe6050020), /* PORT32CR */ -	PORTCR(33, 0xe6050021), /* PORT33CR */ -	PORTCR(34, 0xe6050022), /* PORT34CR */ -	PORTCR(35, 0xe6050023), /* PORT35CR */ -	PORTCR(36, 0xe6050024), /* PORT36CR */ -	PORTCR(37, 0xe6050025), /* PORT37CR */ -	PORTCR(38, 0xe6050026), /* PORT38CR */ -	PORTCR(39, 0xe6050027), /* PORT39CR */ - -	PORTCR(40, 0xe6050028), /* PORT40CR */ -	PORTCR(41, 0xe6050029), /* PORT41CR */ -	PORTCR(42, 0xe605002a), /* PORT42CR */ -	PORTCR(43, 0xe605002b), /* PORT43CR */ -	PORTCR(44, 0xe605002c), /* PORT44CR */ -	PORTCR(45, 0xe605002d), /* PORT45CR */ -	PORTCR(46, 0xe605002e), /* PORT46CR */ -	PORTCR(47, 0xe605002f), /* PORT47CR */ -	PORTCR(48, 0xe6050030), /* PORT48CR */ -	PORTCR(49, 0xe6050031), /* PORT49CR */ - -	PORTCR(50, 0xe6050032), /* PORT50CR */ -	PORTCR(51, 0xe6050033), /* PORT51CR */ -	PORTCR(52, 0xe6050034), /* PORT52CR */ -	PORTCR(53, 0xe6050035), /* PORT53CR */ -	PORTCR(54, 0xe6050036), /* PORT54CR */ -	PORTCR(55, 0xe6050037), /* PORT55CR */ -	PORTCR(56, 0xe6050038), /* PORT56CR */ -	PORTCR(57, 0xe6050039), /* PORT57CR */ -	PORTCR(58, 0xe605003a), /* PORT58CR */ -	PORTCR(59, 0xe605003b), /* PORT59CR */ - -	PORTCR(60, 0xe605003c), /* PORT60CR */ -	PORTCR(61, 0xe605003d), /* PORT61CR */ -	PORTCR(62, 0xe605003e), /* PORT62CR */ -	PORTCR(63, 0xe605003f), /* PORT63CR */ -	PORTCR(64, 0xe6050040), /* PORT64CR */ -	PORTCR(65, 0xe6050041), /* PORT65CR */ -	PORTCR(66, 0xe6050042), /* PORT66CR */ -	PORTCR(67, 0xe6050043), /* PORT67CR */ -	PORTCR(68, 0xe6050044), /* PORT68CR */ -	PORTCR(69, 0xe6050045), /* PORT69CR */ - -	PORTCR(70, 0xe6050046), /* PORT70CR */ -	PORTCR(71, 0xe6050047), /* PORT71CR */ -	PORTCR(72, 0xe6050048), /* PORT72CR */ -	PORTCR(73, 0xe6050049), /* PORT73CR */ -	PORTCR(74, 0xe605004a), /* PORT74CR */ -	PORTCR(75, 0xe605004b), /* PORT75CR */ -	PORTCR(76, 0xe605004c), /* PORT76CR */ -	PORTCR(77, 0xe605004d), /* PORT77CR */ -	PORTCR(78, 0xe605004e), /* PORT78CR */ -	PORTCR(79, 0xe605004f), /* PORT79CR */ - -	PORTCR(80, 0xe6050050), /* PORT80CR */ -	PORTCR(81, 0xe6050051), /* PORT81CR */ -	PORTCR(82, 0xe6050052), /* PORT82CR */ -	PORTCR(83, 0xe6050053), /* PORT83CR */ -	PORTCR(84, 0xe6050054), /* PORT84CR */ -	PORTCR(85, 0xe6050055), /* PORT85CR */ -	PORTCR(86, 0xe6050056), /* PORT86CR */ -	PORTCR(87, 0xe6050057), /* PORT87CR */ -	PORTCR(88, 0xe6050058), /* PORT88CR */ -	PORTCR(89, 0xe6050059), /* PORT89CR */ - -	PORTCR(90, 0xe605005a), /* PORT90CR */ -	PORTCR(91, 0xe605005b), /* PORT91CR */ -	PORTCR(92, 0xe605005c), /* PORT92CR */ -	PORTCR(93, 0xe605005d), /* PORT93CR */ -	PORTCR(94, 0xe605005e), /* PORT94CR */ -	PORTCR(95, 0xe605005f), /* PORT95CR */ -	PORTCR(96, 0xe6050060), /* PORT96CR */ -	PORTCR(97, 0xe6050061), /* PORT97CR */ -	PORTCR(98, 0xe6050062), /* PORT98CR */ -	PORTCR(99, 0xe6050063), /* PORT99CR */ - -	PORTCR(100, 0xe6050064), /* PORT100CR */ -	PORTCR(101, 0xe6050065), /* PORT101CR */ -	PORTCR(102, 0xe6050066), /* PORT102CR */ -	PORTCR(103, 0xe6050067), /* PORT103CR */ -	PORTCR(104, 0xe6050068), /* PORT104CR */ -	PORTCR(105, 0xe6050069), /* PORT105CR */ -	PORTCR(106, 0xe605006a), /* PORT106CR */ -	PORTCR(107, 0xe605006b), /* PORT107CR */ -	PORTCR(108, 0xe605006c), /* PORT108CR */ -	PORTCR(109, 0xe605006d), /* PORT109CR */ - -	PORTCR(110, 0xe605006e), /* PORT110CR */ -	PORTCR(111, 0xe605006f), /* PORT111CR */ -	PORTCR(112, 0xe6050070), /* PORT112CR */ -	PORTCR(113, 0xe6050071), /* PORT113CR */ -	PORTCR(114, 0xe6050072), /* PORT114CR */ -	PORTCR(115, 0xe6050073), /* PORT115CR */ -	PORTCR(116, 0xe6050074), /* PORT116CR */ -	PORTCR(117, 0xe6050075), /* PORT117CR */ -	PORTCR(118, 0xe6050076), /* PORT118CR */ - -	PORTCR(128, 0xe6051080), /* PORT128CR */ -	PORTCR(129, 0xe6051081), /* PORT129CR */ - -	PORTCR(130, 0xe6051082), /* PORT130CR */ -	PORTCR(131, 0xe6051083), /* PORT131CR */ -	PORTCR(132, 0xe6051084), /* PORT132CR */ -	PORTCR(133, 0xe6051085), /* PORT133CR */ -	PORTCR(134, 0xe6051086), /* PORT134CR */ -	PORTCR(135, 0xe6051087), /* PORT135CR */ -	PORTCR(136, 0xe6051088), /* PORT136CR */ -	PORTCR(137, 0xe6051089), /* PORT137CR */ -	PORTCR(138, 0xe605108a), /* PORT138CR */ -	PORTCR(139, 0xe605108b), /* PORT139CR */ - -	PORTCR(140, 0xe605108c), /* PORT140CR */ -	PORTCR(141, 0xe605108d), /* PORT141CR */ -	PORTCR(142, 0xe605108e), /* PORT142CR */ -	PORTCR(143, 0xe605108f), /* PORT143CR */ -	PORTCR(144, 0xe6051090), /* PORT144CR */ -	PORTCR(145, 0xe6051091), /* PORT145CR */ -	PORTCR(146, 0xe6051092), /* PORT146CR */ -	PORTCR(147, 0xe6051093), /* PORT147CR */ -	PORTCR(148, 0xe6051094), /* PORT148CR */ -	PORTCR(149, 0xe6051095), /* PORT149CR */ - -	PORTCR(150, 0xe6051096), /* PORT150CR */ -	PORTCR(151, 0xe6051097), /* PORT151CR */ -	PORTCR(152, 0xe6051098), /* PORT152CR */ -	PORTCR(153, 0xe6051099), /* PORT153CR */ -	PORTCR(154, 0xe605109a), /* PORT154CR */ -	PORTCR(155, 0xe605109b), /* PORT155CR */ -	PORTCR(156, 0xe605109c), /* PORT156CR */ -	PORTCR(157, 0xe605109d), /* PORT157CR */ -	PORTCR(158, 0xe605109e), /* PORT158CR */ -	PORTCR(159, 0xe605109f), /* PORT159CR */ - -	PORTCR(160, 0xe60510a0), /* PORT160CR */ -	PORTCR(161, 0xe60510a1), /* PORT161CR */ -	PORTCR(162, 0xe60510a2), /* PORT162CR */ -	PORTCR(163, 0xe60510a3), /* PORT163CR */ -	PORTCR(164, 0xe60510a4), /* PORT164CR */ - -	PORTCR(192, 0xe60520c0), /* PORT192CR */ -	PORTCR(193, 0xe60520c1), /* PORT193CR */ -	PORTCR(194, 0xe60520c2), /* PORT194CR */ -	PORTCR(195, 0xe60520c3), /* PORT195CR */ -	PORTCR(196, 0xe60520c4), /* PORT196CR */ -	PORTCR(197, 0xe60520c5), /* PORT197CR */ -	PORTCR(198, 0xe60520c6), /* PORT198CR */ -	PORTCR(199, 0xe60520c7), /* PORT199CR */ - -	PORTCR(200, 0xe60520c8), /* PORT200CR */ -	PORTCR(201, 0xe60520c9), /* PORT201CR */ -	PORTCR(202, 0xe60520ca), /* PORT202CR */ -	PORTCR(203, 0xe60520cb), /* PORT203CR */ -	PORTCR(204, 0xe60520cc), /* PORT204CR */ -	PORTCR(205, 0xe60520cd), /* PORT205CR */ -	PORTCR(206, 0xe60520ce), /* PORT206CR */ -	PORTCR(207, 0xe60520cf), /* PORT207CR */ -	PORTCR(208, 0xe60520d0), /* PORT208CR */ -	PORTCR(209, 0xe60520d1), /* PORT209CR */ - -	PORTCR(210, 0xe60520d2), /* PORT210CR */ -	PORTCR(211, 0xe60520d3), /* PORT211CR */ -	PORTCR(212, 0xe60520d4), /* PORT212CR */ -	PORTCR(213, 0xe60520d5), /* PORT213CR */ -	PORTCR(214, 0xe60520d6), /* PORT214CR */ -	PORTCR(215, 0xe60520d7), /* PORT215CR */ -	PORTCR(216, 0xe60520d8), /* PORT216CR */ -	PORTCR(217, 0xe60520d9), /* PORT217CR */ -	PORTCR(218, 0xe60520da), /* PORT218CR */ -	PORTCR(219, 0xe60520db), /* PORT219CR */ - -	PORTCR(220, 0xe60520dc), /* PORT220CR */ -	PORTCR(221, 0xe60520dd), /* PORT221CR */ -	PORTCR(222, 0xe60520de), /* PORT222CR */ -	PORTCR(223, 0xe60520df), /* PORT223CR */ -	PORTCR(224, 0xe60520e0), /* PORT224CR */ -	PORTCR(225, 0xe60520e1), /* PORT225CR */ -	PORTCR(226, 0xe60520e2), /* PORT226CR */ -	PORTCR(227, 0xe60520e3), /* PORT227CR */ -	PORTCR(228, 0xe60520e4), /* PORT228CR */ -	PORTCR(229, 0xe60520e5), /* PORT229CR */ - -	PORTCR(230, 0xe60520e6), /* PORT230CR */ -	PORTCR(231, 0xe60520e7), /* PORT231CR */ -	PORTCR(232, 0xe60520e8), /* PORT232CR */ -	PORTCR(233, 0xe60520e9), /* PORT233CR */ -	PORTCR(234, 0xe60520ea), /* PORT234CR */ -	PORTCR(235, 0xe60520eb), /* PORT235CR */ -	PORTCR(236, 0xe60520ec), /* PORT236CR */ -	PORTCR(237, 0xe60520ed), /* PORT237CR */ -	PORTCR(238, 0xe60520ee), /* PORT238CR */ -	PORTCR(239, 0xe60520ef), /* PORT239CR */ - -	PORTCR(240, 0xe60520f0), /* PORT240CR */ -	PORTCR(241, 0xe60520f1), /* PORT241CR */ -	PORTCR(242, 0xe60520f2), /* PORT242CR */ -	PORTCR(243, 0xe60520f3), /* PORT243CR */ -	PORTCR(244, 0xe60520f4), /* PORT244CR */ -	PORTCR(245, 0xe60520f5), /* PORT245CR */ -	PORTCR(246, 0xe60520f6), /* PORT246CR */ -	PORTCR(247, 0xe60520f7), /* PORT247CR */ -	PORTCR(248, 0xe60520f8), /* PORT248CR */ -	PORTCR(249, 0xe60520f9), /* PORT249CR */ - -	PORTCR(250, 0xe60520fa), /* PORT250CR */ -	PORTCR(251, 0xe60520fb), /* PORT251CR */ -	PORTCR(252, 0xe60520fc), /* PORT252CR */ -	PORTCR(253, 0xe60520fd), /* PORT253CR */ -	PORTCR(254, 0xe60520fe), /* PORT254CR */ -	PORTCR(255, 0xe60520ff), /* PORT255CR */ -	PORTCR(256, 0xe6052100), /* PORT256CR */ -	PORTCR(257, 0xe6052101), /* PORT257CR */ -	PORTCR(258, 0xe6052102), /* PORT258CR */ -	PORTCR(259, 0xe6052103), /* PORT259CR */ - -	PORTCR(260, 0xe6052104), /* PORT260CR */ -	PORTCR(261, 0xe6052105), /* PORT261CR */ -	PORTCR(262, 0xe6052106), /* PORT262CR */ -	PORTCR(263, 0xe6052107), /* PORT263CR */ -	PORTCR(264, 0xe6052108), /* PORT264CR */ - -	{ PINMUX_CFG_REG("MSELBCR", 0xe6058024, 32, 1) { -			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -			MSELBCR_MSEL17_0, MSELBCR_MSEL17_1, -			MSELBCR_MSEL16_0, MSELBCR_MSEL16_1, -			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } -	}, -	{ }, -}; - -static struct pinmux_data_reg pinmux_data_regs[] = { -	{ PINMUX_DATA_REG("PORTL031_000DR", 0xe6054000, 32) { -			PORT31_DATA, PORT30_DATA, PORT29_DATA, PORT28_DATA, -			PORT27_DATA, PORT26_DATA, PORT25_DATA, PORT24_DATA, -			PORT23_DATA, PORT22_DATA, PORT21_DATA, PORT20_DATA, -			PORT19_DATA, PORT18_DATA, PORT17_DATA, PORT16_DATA, -			PORT15_DATA, PORT14_DATA, PORT13_DATA, PORT12_DATA, -			PORT11_DATA, PORT10_DATA, PORT9_DATA, PORT8_DATA, -			PORT7_DATA, PORT6_DATA, PORT5_DATA, PORT4_DATA, -			PORT3_DATA, PORT2_DATA, PORT1_DATA, PORT0_DATA } -	}, -	{ PINMUX_DATA_REG("PORTL063_032DR", 0xe6054004, 32) { -			PORT63_DATA, PORT62_DATA, PORT61_DATA, PORT60_DATA, -			PORT59_DATA, PORT58_DATA, PORT57_DATA, PORT56_DATA, -			PORT55_DATA, PORT54_DATA, PORT53_DATA, PORT52_DATA, -			PORT51_DATA, PORT50_DATA, PORT49_DATA, PORT48_DATA, -			PORT47_DATA, PORT46_DATA, PORT45_DATA, PORT44_DATA, -			PORT43_DATA, PORT42_DATA, PORT41_DATA, PORT40_DATA, -			PORT39_DATA, PORT38_DATA, PORT37_DATA, PORT36_DATA, -			PORT35_DATA, PORT34_DATA, PORT33_DATA, PORT32_DATA } -	}, -	{ PINMUX_DATA_REG("PORTL095_064DR", 0xe6054008, 32) { -			PORT95_DATA, PORT94_DATA, PORT93_DATA, PORT92_DATA, -			PORT91_DATA, PORT90_DATA, PORT89_DATA, PORT88_DATA, -			PORT87_DATA, PORT86_DATA, PORT85_DATA, PORT84_DATA, -			PORT83_DATA, PORT82_DATA, PORT81_DATA, PORT80_DATA, -			PORT79_DATA, PORT78_DATA, PORT77_DATA, PORT76_DATA, -			PORT75_DATA, PORT74_DATA, PORT73_DATA, PORT72_DATA, -			PORT71_DATA, PORT70_DATA, PORT69_DATA, PORT68_DATA, -			PORT67_DATA, PORT66_DATA, PORT65_DATA, PORT64_DATA } -	}, -	{ PINMUX_DATA_REG("PORTD127_096DR", 0xe605400C, 32) { -			0, 0, 0, 0, -			0, 0, 0, 0, -			0, PORT118_DATA, PORT117_DATA, PORT116_DATA, -			PORT115_DATA, PORT114_DATA, PORT113_DATA, PORT112_DATA, -			PORT111_DATA, PORT110_DATA, PORT109_DATA, PORT108_DATA, -			PORT107_DATA, PORT106_DATA, PORT105_DATA, PORT104_DATA, -			PORT103_DATA, PORT102_DATA, PORT101_DATA, PORT100_DATA, -			PORT99_DATA, PORT98_DATA, PORT97_DATA, PORT96_DATA } -	}, -	{ PINMUX_DATA_REG("PORTD159_128DR", 0xe6055000, 32) { -			PORT159_DATA, PORT158_DATA, PORT157_DATA, PORT156_DATA, -			PORT155_DATA, PORT154_DATA, PORT153_DATA, PORT152_DATA, -			PORT151_DATA, PORT150_DATA, PORT149_DATA, PORT148_DATA, -			PORT147_DATA, PORT146_DATA, PORT145_DATA, PORT144_DATA, -			PORT143_DATA, PORT142_DATA, PORT141_DATA, PORT140_DATA, -			PORT139_DATA, PORT138_DATA, PORT137_DATA, PORT136_DATA, -			PORT135_DATA, PORT134_DATA, PORT133_DATA, PORT132_DATA, -			PORT131_DATA, PORT130_DATA, PORT129_DATA, PORT128_DATA } -	}, -	{ PINMUX_DATA_REG("PORTR191_160DR", 0xe6055004, 32) { -			0, 0, 0, 0, -			0, 0, 0, 0, -			0, 0, 0, 0, -			0, 0, 0, 0, -			0, 0, 0, 0, -			0, 0, 0, 0, -			0, 0, 0, PORT164_DATA, -			PORT163_DATA, PORT162_DATA, PORT161_DATA, PORT160_DATA } -	}, -	{ PINMUX_DATA_REG("PORTR223_192DR", 0xe6056000, 32) { -			PORT223_DATA, PORT222_DATA, PORT221_DATA, PORT220_DATA, -			PORT219_DATA, PORT218_DATA, PORT217_DATA, PORT216_DATA, -			PORT215_DATA, PORT214_DATA, PORT213_DATA, PORT212_DATA, -			PORT211_DATA, PORT210_DATA, PORT209_DATA, PORT208_DATA, -			PORT207_DATA, PORT206_DATA, PORT205_DATA, PORT204_DATA, -			PORT203_DATA, PORT202_DATA, PORT201_DATA, PORT200_DATA, -			PORT199_DATA, PORT198_DATA, PORT197_DATA, PORT196_DATA, -			PORT195_DATA, PORT194_DATA, PORT193_DATA, PORT192_DATA } -	}, -	{ PINMUX_DATA_REG("PORTU255_224DR", 0xe6056004, 32) { -			PORT255_DATA, PORT254_DATA, PORT253_DATA, PORT252_DATA, -			PORT251_DATA, PORT250_DATA, PORT249_DATA, PORT248_DATA, -			PORT247_DATA, PORT246_DATA, PORT245_DATA, PORT244_DATA, -			PORT243_DATA, PORT242_DATA, PORT241_DATA, PORT240_DATA, -			PORT239_DATA, PORT238_DATA, PORT237_DATA, PORT236_DATA, -			PORT235_DATA, PORT234_DATA, PORT233_DATA, PORT232_DATA, -			PORT231_DATA, PORT230_DATA, PORT229_DATA, PORT228_DATA, -			PORT227_DATA, PORT226_DATA, PORT225_DATA, PORT224_DATA } -	}, -	{ PINMUX_DATA_REG("PORTU287_256DR", 0xe6056008, 32) { -			0, 0, 0, 0, -			0, 0, 0, 0, -			0, 0, 0, 0, -			0, 0, 0, 0, -			0, 0, 0, 0, -			0, 0, 0, PORT264_DATA, -			PORT263_DATA, PORT262_DATA, PORT261_DATA, PORT260_DATA, -			PORT259_DATA, PORT258_DATA, PORT257_DATA, PORT256_DATA } -	}, -	{ }, -}; - -static struct pinmux_info sh7377_pinmux_info = { -	.name = "sh7377_pfc", -	.reserved_id = PINMUX_RESERVED, -	.data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END }, -	.input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END }, -	.input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END }, -	.input_pd = { PINMUX_INPUT_PULLDOWN_BEGIN, PINMUX_INPUT_PULLDOWN_END }, -	.output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END }, -	.mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END }, -	.function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END }, - -	.first_gpio = GPIO_PORT0, -	.last_gpio = GPIO_FN_RESETOUTS, - -	.gpios = pinmux_gpios, -	.cfg_regs = pinmux_config_regs, -	.data_regs = pinmux_data_regs, - -	.gpio_data = pinmux_data, -	.gpio_data_size = ARRAY_SIZE(pinmux_data), -}; - -void sh7377_pinmux_init(void) -{ -	register_pinmux(&sh7377_pinmux_info); -} diff --git a/arch/arm/mach-shmobile/setup-r8a7740.c b/arch/arm/mach-shmobile/setup-r8a7740.c index 96f11394c7c..095222469d0 100644 --- a/arch/arm/mach-shmobile/setup-r8a7740.c +++ b/arch/arm/mach-shmobile/setup-r8a7740.c @@ -584,6 +584,21 @@ static struct platform_device i2c1_device = {  	.num_resources	= ARRAY_SIZE(i2c1_resources),  }; +static struct resource pmu_resources[] = { +	[0] = { +		.start	= evt2irq(0x19a0), +		.end	= evt2irq(0x19a0), +		.flags  = IORESOURCE_IRQ, +	}, +}; + +static struct platform_device pmu_device = { +	.name	= "arm-pmu", +	.id	= -1, +	.num_resources = ARRAY_SIZE(pmu_resources), +	.resource = pmu_resources, +}; +  static struct platform_device *r8a7740_late_devices[] __initdata = {  	&i2c0_device,  	&i2c1_device, @@ -591,6 +606,7 @@ static struct platform_device *r8a7740_late_devices[] __initdata = {  	&dma1_device,  	&dma2_device,  	&usb_dma_device, +	&pmu_device,  };  /* @@ -741,7 +757,7 @@ static const char *r8a7740_boards_compat_dt[] __initdata = {  	NULL,  }; -DT_MACHINE_START(SH7372_DT, "Generic R8A7740 (Flattened Device Tree)") +DT_MACHINE_START(R8A7740_DT, "Generic R8A7740 (Flattened Device Tree)")  	.map_io		= r8a7740_map_io,  	.init_early	= r8a7740_add_early_devices_dt,  	.init_irq	= r8a7740_init_irq, diff --git a/arch/arm/mach-shmobile/setup-r8a7779.c b/arch/arm/mach-shmobile/setup-r8a7779.c index ebbffc25f24..7a1ad4f3853 100644 --- a/arch/arm/mach-shmobile/setup-r8a7779.c +++ b/arch/arm/mach-shmobile/setup-r8a7779.c @@ -229,6 +229,79 @@ static struct platform_device tmu01_device = {  	.num_resources	= ARRAY_SIZE(tmu01_resources),  }; +/* I2C */ +static struct resource rcar_i2c0_res[] = { +	{ +		.start  = 0xffc70000, +		.end    = 0xffc70fff, +		.flags  = IORESOURCE_MEM, +	}, { +		.start  = gic_spi(79), +		.flags  = IORESOURCE_IRQ, +	}, +}; + +static struct platform_device i2c0_device = { +	.name		= "i2c-rcar", +	.id		= 0, +	.resource	= rcar_i2c0_res, +	.num_resources	= ARRAY_SIZE(rcar_i2c0_res), +}; + +static struct resource rcar_i2c1_res[] = { +	{ +		.start  = 0xffc71000, +		.end    = 0xffc71fff, +		.flags  = IORESOURCE_MEM, +	}, { +		.start  = gic_spi(82), +		.flags  = IORESOURCE_IRQ, +	}, +}; + +static struct platform_device i2c1_device = { +	.name		= "i2c-rcar", +	.id		= 1, +	.resource	= rcar_i2c1_res, +	.num_resources	= ARRAY_SIZE(rcar_i2c1_res), +}; + +static struct resource rcar_i2c2_res[] = { +	{ +		.start  = 0xffc72000, +		.end    = 0xffc72fff, +		.flags  = IORESOURCE_MEM, +	}, { +		.start  = gic_spi(80), +		.flags  = IORESOURCE_IRQ, +	}, +}; + +static struct platform_device i2c2_device = { +	.name		= "i2c-rcar", +	.id		= 2, +	.resource	= rcar_i2c2_res, +	.num_resources	= ARRAY_SIZE(rcar_i2c2_res), +}; + +static struct resource rcar_i2c3_res[] = { +	{ +		.start  = 0xffc73000, +		.end    = 0xffc73fff, +		.flags  = IORESOURCE_MEM, +	}, { +		.start  = gic_spi(81), +		.flags  = IORESOURCE_IRQ, +	}, +}; + +static struct platform_device i2c3_device = { +	.name		= "i2c-rcar", +	.id		= 3, +	.resource	= rcar_i2c3_res, +	.num_resources	= ARRAY_SIZE(rcar_i2c3_res), +}; +  static struct platform_device *r8a7779_early_devices[] __initdata = {  	&scif0_device,  	&scif1_device, @@ -238,6 +311,10 @@ static struct platform_device *r8a7779_early_devices[] __initdata = {  	&scif5_device,  	&tmu00_device,  	&tmu01_device, +	&i2c0_device, +	&i2c1_device, +	&i2c2_device, +	&i2c3_device,  };  static struct platform_device *r8a7779_late_devices[] __initdata = { diff --git a/arch/arm/mach-shmobile/setup-sh7367.c b/arch/arm/mach-shmobile/setup-sh7367.c deleted file mode 100644 index e647f541087..00000000000 --- a/arch/arm/mach-shmobile/setup-sh7367.c +++ /dev/null @@ -1,481 +0,0 @@ -/* - * sh7367 processor support - * - * Copyright (C) 2010  Magnus Damm - * Copyright (C) 2008  Yoshihiro Shimoda - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/platform_device.h> -#include <linux/uio_driver.h> -#include <linux/delay.h> -#include <linux/input.h> -#include <linux/io.h> -#include <linux/serial_sci.h> -#include <linux/sh_timer.h> -#include <mach/hardware.h> -#include <mach/common.h> -#include <mach/irqs.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> -#include <asm/mach/map.h> -#include <asm/mach/time.h> - -static struct map_desc sh7367_io_desc[] __initdata = { -	/* create a 1:1 entity map for 0xe6xxxxxx -	 * used by CPGA, INTC and PFC. -	 */ -	{ -		.virtual	= 0xe6000000, -		.pfn		= __phys_to_pfn(0xe6000000), -		.length		= 256 << 20, -		.type		= MT_DEVICE_NONSHARED -	}, -}; - -void __init sh7367_map_io(void) -{ -	iotable_init(sh7367_io_desc, ARRAY_SIZE(sh7367_io_desc)); -} - -/* SCIFA0 */ -static struct plat_sci_port scif0_platform_data = { -	.mapbase	= 0xe6c40000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xc00), evt2irq(0xc00), -			    evt2irq(0xc00), evt2irq(0xc00) }, -}; - -static struct platform_device scif0_device = { -	.name		= "sh-sci", -	.id		= 0, -	.dev		= { -		.platform_data	= &scif0_platform_data, -	}, -}; - -/* SCIFA1 */ -static struct plat_sci_port scif1_platform_data = { -	.mapbase	= 0xe6c50000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xc20), evt2irq(0xc20), -			    evt2irq(0xc20), evt2irq(0xc20) }, -}; - -static struct platform_device scif1_device = { -	.name		= "sh-sci", -	.id		= 1, -	.dev		= { -		.platform_data	= &scif1_platform_data, -	}, -}; - -/* SCIFA2 */ -static struct plat_sci_port scif2_platform_data = { -	.mapbase	= 0xe6c60000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xc40), evt2irq(0xc40), -			    evt2irq(0xc40), evt2irq(0xc40) }, -}; - -static struct platform_device scif2_device = { -	.name		= "sh-sci", -	.id		= 2, -	.dev		= { -		.platform_data	= &scif2_platform_data, -	}, -}; - -/* SCIFA3 */ -static struct plat_sci_port scif3_platform_data = { -	.mapbase	= 0xe6c70000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xc60), evt2irq(0xc60), -			    evt2irq(0xc60), evt2irq(0xc60) }, -}; - -static struct platform_device scif3_device = { -	.name		= "sh-sci", -	.id		= 3, -	.dev		= { -		.platform_data	= &scif3_platform_data, -	}, -}; - -/* SCIFA4 */ -static struct plat_sci_port scif4_platform_data = { -	.mapbase	= 0xe6c80000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xd20), evt2irq(0xd20), -			    evt2irq(0xd20), evt2irq(0xd20) }, -}; - -static struct platform_device scif4_device = { -	.name		= "sh-sci", -	.id		= 4, -	.dev		= { -		.platform_data	= &scif4_platform_data, -	}, -}; - -/* SCIFA5 */ -static struct plat_sci_port scif5_platform_data = { -	.mapbase	= 0xe6cb0000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xd40), evt2irq(0xd40), -			    evt2irq(0xd40), evt2irq(0xd40) }, -}; - -static struct platform_device scif5_device = { -	.name		= "sh-sci", -	.id		= 5, -	.dev		= { -		.platform_data	= &scif5_platform_data, -	}, -}; - -/* SCIFB */ -static struct plat_sci_port scif6_platform_data = { -	.mapbase	= 0xe6c30000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFB, -	.irqs		= { evt2irq(0xd60), evt2irq(0xd60), -			    evt2irq(0xd60), evt2irq(0xd60) }, -}; - -static struct platform_device scif6_device = { -	.name		= "sh-sci", -	.id		= 6, -	.dev		= { -		.platform_data	= &scif6_platform_data, -	}, -}; - -static struct sh_timer_config cmt10_platform_data = { -	.name = "CMT10", -	.channel_offset = 0x10, -	.timer_bit = 0, -	.clockevent_rating = 125, -	.clocksource_rating = 125, -}; - -static struct resource cmt10_resources[] = { -	[0] = { -		.name	= "CMT10", -		.start	= 0xe6138010, -		.end	= 0xe613801b, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= evt2irq(0xb00), /* CMT1_CMT10 */ -		.flags	= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device cmt10_device = { -	.name		= "sh_cmt", -	.id		= 10, -	.dev = { -		.platform_data	= &cmt10_platform_data, -	}, -	.resource	= cmt10_resources, -	.num_resources	= ARRAY_SIZE(cmt10_resources), -}; - -/* VPU */ -static struct uio_info vpu_platform_data = { -	.name = "VPU5", -	.version = "0", -	.irq = intcs_evt2irq(0x980), -}; - -static struct resource vpu_resources[] = { -	[0] = { -		.name	= "VPU", -		.start	= 0xfe900000, -		.end	= 0xfe902807, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device vpu_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 0, -	.dev = { -		.platform_data	= &vpu_platform_data, -	}, -	.resource	= vpu_resources, -	.num_resources	= ARRAY_SIZE(vpu_resources), -}; - -/* VEU0 */ -static struct uio_info veu0_platform_data = { -	.name = "VEU0", -	.version = "0", -	.irq = intcs_evt2irq(0x700), -}; - -static struct resource veu0_resources[] = { -	[0] = { -		.name	= "VEU0", -		.start	= 0xfe920000, -		.end	= 0xfe9200b7, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device veu0_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 1, -	.dev = { -		.platform_data	= &veu0_platform_data, -	}, -	.resource	= veu0_resources, -	.num_resources	= ARRAY_SIZE(veu0_resources), -}; - -/* VEU1 */ -static struct uio_info veu1_platform_data = { -	.name = "VEU1", -	.version = "0", -	.irq = intcs_evt2irq(0x720), -}; - -static struct resource veu1_resources[] = { -	[0] = { -		.name	= "VEU1", -		.start	= 0xfe924000, -		.end	= 0xfe9240b7, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device veu1_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 2, -	.dev = { -		.platform_data	= &veu1_platform_data, -	}, -	.resource	= veu1_resources, -	.num_resources	= ARRAY_SIZE(veu1_resources), -}; - -/* VEU2 */ -static struct uio_info veu2_platform_data = { -	.name = "VEU2", -	.version = "0", -	.irq = intcs_evt2irq(0x740), -}; - -static struct resource veu2_resources[] = { -	[0] = { -		.name	= "VEU2", -		.start	= 0xfe928000, -		.end	= 0xfe9280b7, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device veu2_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 3, -	.dev = { -		.platform_data	= &veu2_platform_data, -	}, -	.resource	= veu2_resources, -	.num_resources	= ARRAY_SIZE(veu2_resources), -}; - -/* VEU3 */ -static struct uio_info veu3_platform_data = { -	.name = "VEU3", -	.version = "0", -	.irq = intcs_evt2irq(0x760), -}; - -static struct resource veu3_resources[] = { -	[0] = { -		.name	= "VEU3", -		.start	= 0xfe92c000, -		.end	= 0xfe92c0b7, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device veu3_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 4, -	.dev = { -		.platform_data	= &veu3_platform_data, -	}, -	.resource	= veu3_resources, -	.num_resources	= ARRAY_SIZE(veu3_resources), -}; - -/* VEU2H */ -static struct uio_info veu2h_platform_data = { -	.name = "VEU2H", -	.version = "0", -	.irq = intcs_evt2irq(0x520), -}; - -static struct resource veu2h_resources[] = { -	[0] = { -		.name	= "VEU2H", -		.start	= 0xfe93c000, -		.end	= 0xfe93c27b, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device veu2h_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 5, -	.dev = { -		.platform_data	= &veu2h_platform_data, -	}, -	.resource	= veu2h_resources, -	.num_resources	= ARRAY_SIZE(veu2h_resources), -}; - -/* JPU */ -static struct uio_info jpu_platform_data = { -	.name = "JPU", -	.version = "0", -	.irq = intcs_evt2irq(0x560), -}; - -static struct resource jpu_resources[] = { -	[0] = { -		.name	= "JPU", -		.start	= 0xfe980000, -		.end	= 0xfe9902d3, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device jpu_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 6, -	.dev = { -		.platform_data	= &jpu_platform_data, -	}, -	.resource	= jpu_resources, -	.num_resources	= ARRAY_SIZE(jpu_resources), -}; - -/* SPU1 */ -static struct uio_info spu1_platform_data = { -	.name = "SPU1", -	.version = "0", -	.irq = evt2irq(0xfc0), -}; - -static struct resource spu1_resources[] = { -	[0] = { -		.name	= "SPU1", -		.start	= 0xfe300000, -		.end	= 0xfe3fffff, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device spu1_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 7, -	.dev = { -		.platform_data	= &spu1_platform_data, -	}, -	.resource	= spu1_resources, -	.num_resources	= ARRAY_SIZE(spu1_resources), -}; - -static struct platform_device *sh7367_early_devices[] __initdata = { -	&scif0_device, -	&scif1_device, -	&scif2_device, -	&scif3_device, -	&scif4_device, -	&scif5_device, -	&scif6_device, -	&cmt10_device, -}; - -static struct platform_device *sh7367_devices[] __initdata = { -	&vpu_device, -	&veu0_device, -	&veu1_device, -	&veu2_device, -	&veu3_device, -	&veu2h_device, -	&jpu_device, -	&spu1_device, -}; - -void __init sh7367_add_standard_devices(void) -{ -	platform_add_devices(sh7367_early_devices, -			     ARRAY_SIZE(sh7367_early_devices)); - -	platform_add_devices(sh7367_devices, -			    ARRAY_SIZE(sh7367_devices)); -} - -static void __init sh7367_earlytimer_init(void) -{ -	sh7367_clock_init(); -	shmobile_earlytimer_init(); -} - -#define SYMSTPCR2 IOMEM(0xe6158048) -#define SYMSTPCR2_CMT1 (1 << 29) - -void __init sh7367_add_early_devices(void) -{ -	/* enable clock to CMT1 */ -	__raw_writel(__raw_readl(SYMSTPCR2) & ~SYMSTPCR2_CMT1, SYMSTPCR2); - -	early_platform_add_devices(sh7367_early_devices, -				   ARRAY_SIZE(sh7367_early_devices)); - -	/* setup early console here as well */ -	shmobile_setup_console(); - -	/* override timer setup with soc-specific code */ -	shmobile_timer.init = sh7367_earlytimer_init; -} diff --git a/arch/arm/mach-shmobile/setup-sh7372.c b/arch/arm/mach-shmobile/setup-sh7372.c index be6f746c97f..c917882424a 100644 --- a/arch/arm/mach-shmobile/setup-sh7372.c +++ b/arch/arm/mach-shmobile/setup-sh7372.c @@ -402,6 +402,26 @@ static const struct sh_dmae_slave_config sh7372_dmae_slaves[] = {  		.chcr		= CHCR_RX(XMIT_SZ_8BIT),  		.mid_rid	= 0x3e,  	}, { +		.slave_id	= SHDMA_SLAVE_FLCTL0_TX, +		.addr		= 0xe6a30050, +		.chcr		= CHCR_TX(XMIT_SZ_32BIT), +		.mid_rid	= 0x83, +	}, { +		.slave_id	= SHDMA_SLAVE_FLCTL0_RX, +		.addr		= 0xe6a30050, +		.chcr		= CHCR_RX(XMIT_SZ_32BIT), +		.mid_rid	= 0x83, +	}, { +		.slave_id	= SHDMA_SLAVE_FLCTL1_TX, +		.addr		= 0xe6a30060, +		.chcr		= CHCR_TX(XMIT_SZ_32BIT), +		.mid_rid	= 0x87, +	}, { +		.slave_id	= SHDMA_SLAVE_FLCTL1_RX, +		.addr		= 0xe6a30060, +		.chcr		= CHCR_RX(XMIT_SZ_32BIT), +		.mid_rid	= 0x87, +	}, {  		.slave_id	= SHDMA_SLAVE_SDHI0_TX,  		.addr		= 0xe6850030,  		.chcr		= CHCR_TX(XMIT_SZ_16BIT), diff --git a/arch/arm/mach-shmobile/setup-sh7377.c b/arch/arm/mach-shmobile/setup-sh7377.c deleted file mode 100644 index edcf98bb701..00000000000 --- a/arch/arm/mach-shmobile/setup-sh7377.c +++ /dev/null @@ -1,549 +0,0 @@ -/* - * sh7377 processor support - * - * Copyright (C) 2010  Magnus Damm - * Copyright (C) 2008  Yoshihiro Shimoda - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/platform_device.h> -#include <linux/of_platform.h> -#include <linux/uio_driver.h> -#include <linux/delay.h> -#include <linux/input.h> -#include <linux/io.h> -#include <linux/serial_sci.h> -#include <linux/sh_intc.h> -#include <linux/sh_timer.h> -#include <mach/hardware.h> -#include <mach/common.h> -#include <asm/mach/map.h> -#include <mach/irqs.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> -#include <asm/mach/time.h> - -static struct map_desc sh7377_io_desc[] __initdata = { -	/* create a 1:1 entity map for 0xe6xxxxxx -	 * used by CPGA, INTC and PFC. -	 */ -	{ -		.virtual	= 0xe6000000, -		.pfn		= __phys_to_pfn(0xe6000000), -		.length		= 256 << 20, -		.type		= MT_DEVICE_NONSHARED -	}, -}; - -void __init sh7377_map_io(void) -{ -	iotable_init(sh7377_io_desc, ARRAY_SIZE(sh7377_io_desc)); -} - -/* SCIFA0 */ -static struct plat_sci_port scif0_platform_data = { -	.mapbase	= 0xe6c40000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xc00), evt2irq(0xc00), -			    evt2irq(0xc00), evt2irq(0xc00) }, -}; - -static struct platform_device scif0_device = { -	.name		= "sh-sci", -	.id		= 0, -	.dev		= { -		.platform_data	= &scif0_platform_data, -	}, -}; - -/* SCIFA1 */ -static struct plat_sci_port scif1_platform_data = { -	.mapbase	= 0xe6c50000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xc20), evt2irq(0xc20), -			    evt2irq(0xc20), evt2irq(0xc20) }, -}; - -static struct platform_device scif1_device = { -	.name		= "sh-sci", -	.id		= 1, -	.dev		= { -		.platform_data	= &scif1_platform_data, -	}, -}; - -/* SCIFA2 */ -static struct plat_sci_port scif2_platform_data = { -	.mapbase	= 0xe6c60000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xc40), evt2irq(0xc40), -			    evt2irq(0xc40), evt2irq(0xc40) }, -}; - -static struct platform_device scif2_device = { -	.name		= "sh-sci", -	.id		= 2, -	.dev		= { -		.platform_data	= &scif2_platform_data, -	}, -}; - -/* SCIFA3 */ -static struct plat_sci_port scif3_platform_data = { -	.mapbase	= 0xe6c70000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xc60), evt2irq(0xc60), -			    evt2irq(0xc60), evt2irq(0xc60) }, -}; - -static struct platform_device scif3_device = { -	.name		= "sh-sci", -	.id		= 3, -	.dev		= { -		.platform_data	= &scif3_platform_data, -	}, -}; - -/* SCIFA4 */ -static struct plat_sci_port scif4_platform_data = { -	.mapbase	= 0xe6c80000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xd20), evt2irq(0xd20), -			    evt2irq(0xd20), evt2irq(0xd20) }, -}; - -static struct platform_device scif4_device = { -	.name		= "sh-sci", -	.id		= 4, -	.dev		= { -		.platform_data	= &scif4_platform_data, -	}, -}; - -/* SCIFA5 */ -static struct plat_sci_port scif5_platform_data = { -	.mapbase	= 0xe6cb0000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { evt2irq(0xd40), evt2irq(0xd40), -			    evt2irq(0xd40), evt2irq(0xd40) }, -}; - -static struct platform_device scif5_device = { -	.name		= "sh-sci", -	.id		= 5, -	.dev		= { -		.platform_data	= &scif5_platform_data, -	}, -}; - -/* SCIFA6 */ -static struct plat_sci_port scif6_platform_data = { -	.mapbase	= 0xe6cc0000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFA, -	.irqs		= { intcs_evt2irq(0x1a80), intcs_evt2irq(0x1a80), -			    intcs_evt2irq(0x1a80), intcs_evt2irq(0x1a80) }, -}; - -static struct platform_device scif6_device = { -	.name		= "sh-sci", -	.id		= 6, -	.dev		= { -		.platform_data	= &scif6_platform_data, -	}, -}; - -/* SCIFB */ -static struct plat_sci_port scif7_platform_data = { -	.mapbase	= 0xe6c30000, -	.flags		= UPF_BOOT_AUTOCONF, -	.scscr		= SCSCR_RE | SCSCR_TE, -	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIFB, -	.irqs		= { evt2irq(0xd60), evt2irq(0xd60), -			    evt2irq(0xd60), evt2irq(0xd60) }, -}; - -static struct platform_device scif7_device = { -	.name		= "sh-sci", -	.id		= 7, -	.dev		= { -		.platform_data	= &scif7_platform_data, -	}, -}; - -static struct sh_timer_config cmt10_platform_data = { -	.name = "CMT10", -	.channel_offset = 0x10, -	.timer_bit = 0, -	.clockevent_rating = 125, -	.clocksource_rating = 125, -}; - -static struct resource cmt10_resources[] = { -	[0] = { -		.name	= "CMT10", -		.start	= 0xe6138010, -		.end	= 0xe613801b, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= evt2irq(0xb00), /* CMT1_CMT10 */ -		.flags	= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device cmt10_device = { -	.name		= "sh_cmt", -	.id		= 10, -	.dev = { -		.platform_data	= &cmt10_platform_data, -	}, -	.resource	= cmt10_resources, -	.num_resources	= ARRAY_SIZE(cmt10_resources), -}; - -/* VPU */ -static struct uio_info vpu_platform_data = { -	.name = "VPU5HG", -	.version = "0", -	.irq = intcs_evt2irq(0x980), -}; - -static struct resource vpu_resources[] = { -	[0] = { -		.name	= "VPU", -		.start	= 0xfe900000, -		.end	= 0xfe900157, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device vpu_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 0, -	.dev = { -		.platform_data	= &vpu_platform_data, -	}, -	.resource	= vpu_resources, -	.num_resources	= ARRAY_SIZE(vpu_resources), -}; - -/* VEU0 */ -static struct uio_info veu0_platform_data = { -	.name = "VEU0", -	.version = "0", -	.irq = intcs_evt2irq(0x700), -}; - -static struct resource veu0_resources[] = { -	[0] = { -		.name	= "VEU0", -		.start	= 0xfe920000, -		.end	= 0xfe9200cb, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device veu0_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 1, -	.dev = { -		.platform_data	= &veu0_platform_data, -	}, -	.resource	= veu0_resources, -	.num_resources	= ARRAY_SIZE(veu0_resources), -}; - -/* VEU1 */ -static struct uio_info veu1_platform_data = { -	.name = "VEU1", -	.version = "0", -	.irq = intcs_evt2irq(0x720), -}; - -static struct resource veu1_resources[] = { -	[0] = { -		.name	= "VEU1", -		.start	= 0xfe924000, -		.end	= 0xfe9240cb, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device veu1_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 2, -	.dev = { -		.platform_data	= &veu1_platform_data, -	}, -	.resource	= veu1_resources, -	.num_resources	= ARRAY_SIZE(veu1_resources), -}; - -/* VEU2 */ -static struct uio_info veu2_platform_data = { -	.name = "VEU2", -	.version = "0", -	.irq = intcs_evt2irq(0x740), -}; - -static struct resource veu2_resources[] = { -	[0] = { -		.name	= "VEU2", -		.start	= 0xfe928000, -		.end	= 0xfe928307, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device veu2_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 3, -	.dev = { -		.platform_data	= &veu2_platform_data, -	}, -	.resource	= veu2_resources, -	.num_resources	= ARRAY_SIZE(veu2_resources), -}; - -/* VEU3 */ -static struct uio_info veu3_platform_data = { -	.name = "VEU3", -	.version = "0", -	.irq = intcs_evt2irq(0x760), -}; - -static struct resource veu3_resources[] = { -	[0] = { -		.name	= "VEU3", -		.start	= 0xfe92c000, -		.end	= 0xfe92c307, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device veu3_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 4, -	.dev = { -		.platform_data	= &veu3_platform_data, -	}, -	.resource	= veu3_resources, -	.num_resources	= ARRAY_SIZE(veu3_resources), -}; - -/* JPU */ -static struct uio_info jpu_platform_data = { -	.name = "JPU", -	.version = "0", -	.irq = intcs_evt2irq(0x560), -}; - -static struct resource jpu_resources[] = { -	[0] = { -		.name	= "JPU", -		.start	= 0xfe980000, -		.end	= 0xfe9902d3, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device jpu_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 5, -	.dev = { -		.platform_data	= &jpu_platform_data, -	}, -	.resource	= jpu_resources, -	.num_resources	= ARRAY_SIZE(jpu_resources), -}; - -/* SPU2DSP0 */ -static struct uio_info spu0_platform_data = { -	.name = "SPU2DSP0", -	.version = "0", -	.irq = evt2irq(0x1800), -}; - -static struct resource spu0_resources[] = { -	[0] = { -		.name	= "SPU2DSP0", -		.start	= 0xfe200000, -		.end	= 0xfe2fffff, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device spu0_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 6, -	.dev = { -		.platform_data	= &spu0_platform_data, -	}, -	.resource	= spu0_resources, -	.num_resources	= ARRAY_SIZE(spu0_resources), -}; - -/* SPU2DSP1 */ -static struct uio_info spu1_platform_data = { -	.name = "SPU2DSP1", -	.version = "0", -	.irq = evt2irq(0x1820), -}; - -static struct resource spu1_resources[] = { -	[0] = { -		.name	= "SPU2DSP1", -		.start	= 0xfe300000, -		.end	= 0xfe3fffff, -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device spu1_device = { -	.name		= "uio_pdrv_genirq", -	.id		= 7, -	.dev = { -		.platform_data	= &spu1_platform_data, -	}, -	.resource	= spu1_resources, -	.num_resources	= ARRAY_SIZE(spu1_resources), -}; - -static struct platform_device *sh7377_early_devices[] __initdata = { -	&scif0_device, -	&scif1_device, -	&scif2_device, -	&scif3_device, -	&scif4_device, -	&scif5_device, -	&scif6_device, -	&scif7_device, -	&cmt10_device, -}; - -static struct platform_device *sh7377_devices[] __initdata = { -	&vpu_device, -	&veu0_device, -	&veu1_device, -	&veu2_device, -	&veu3_device, -	&jpu_device, -	&spu0_device, -	&spu1_device, -}; - -void __init sh7377_add_standard_devices(void) -{ -	platform_add_devices(sh7377_early_devices, -			    ARRAY_SIZE(sh7377_early_devices)); - -	platform_add_devices(sh7377_devices, -			    ARRAY_SIZE(sh7377_devices)); -} - -static void __init sh7377_earlytimer_init(void) -{ -	sh7377_clock_init(); -	shmobile_earlytimer_init(); -} - -#define SMSTPCR3 IOMEM(0xe615013c) -#define SMSTPCR3_CMT1 (1 << 29) - -void __init sh7377_add_early_devices(void) -{ -	/* enable clock to CMT1 */ -	__raw_writel(__raw_readl(SMSTPCR3) & ~SMSTPCR3_CMT1, SMSTPCR3); - -	early_platform_add_devices(sh7377_early_devices, -				   ARRAY_SIZE(sh7377_early_devices)); - -	/* setup early console here as well */ -	shmobile_setup_console(); - -	/* override timer setup with soc-specific code */ -	shmobile_timer.init = sh7377_earlytimer_init; -} - -#ifdef CONFIG_USE_OF - -void __init sh7377_add_early_devices_dt(void) -{ -	shmobile_setup_delay(600, 1, 3); /* Cortex-A8 @ 600MHz */ - -	early_platform_add_devices(sh7377_early_devices, -				   ARRAY_SIZE(sh7377_early_devices)); - -	/* setup early console here as well */ -	shmobile_setup_console(); -} - -static const struct of_dev_auxdata sh7377_auxdata_lookup[] __initconst = { -	{ } -}; - -void __init sh7377_add_standard_devices_dt(void) -{ -	/* clocks are setup late during boot in the case of DT */ -	sh7377_clock_init(); - -	platform_add_devices(sh7377_early_devices, -			    ARRAY_SIZE(sh7377_early_devices)); - -	of_platform_populate(NULL, of_default_bus_match_table, -			     sh7377_auxdata_lookup, NULL); -} - -static const char *sh7377_boards_compat_dt[] __initdata = { -	"renesas,sh7377", -	NULL, -}; - -DT_MACHINE_START(SH7377_DT, "Generic SH7377 (Flattened Device Tree)") -	.map_io		= sh7377_map_io, -	.init_early	= sh7377_add_early_devices_dt, -	.init_irq	= sh7377_init_irq, -	.handle_irq	= shmobile_handle_irq_intc, -	.init_machine	= sh7377_add_standard_devices_dt, -	.timer		= &shmobile_timer, -	.dt_compat	= sh7377_boards_compat_dt, -MACHINE_END - -#endif /* CONFIG_USE_OF */ diff --git a/arch/arm/mach-shmobile/smp-emev2.c b/arch/arm/mach-shmobile/smp-emev2.c index f6745628628..535426c306b 100644 --- a/arch/arm/mach-shmobile/smp-emev2.c +++ b/arch/arm/mach-shmobile/smp-emev2.c @@ -32,24 +32,8 @@  #define EMEV2_SCU_BASE 0x1e000000 -static DEFINE_SPINLOCK(scu_lock);  static void __iomem *scu_base; -static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) -{ -	unsigned long tmp; - -	/* we assume this code is running on a different cpu -	 * than the one that is changing coherency setting */ -	spin_lock(&scu_lock); -	tmp = readl(scu_base + 8); -	tmp &= ~clr; -	tmp |= set; -	writel(tmp, scu_base + 8); -	spin_unlock(&scu_lock); - -} -  static unsigned int __init emev2_get_core_count(void)  {  	if (!scu_base) { @@ -95,7 +79,7 @@ static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *  	cpu = cpu_logical_map(cpu);  	/* enable cache coherency */ -	modify_scu_cpu_psr(0, 3 << (cpu * 8)); +	scu_power_mode(scu_base, 0);  	/* Tell ROM loader about our vector (in headsmp.S) */  	emev2_set_boot_vector(__pa(shmobile_secondary_vector)); @@ -106,12 +90,10 @@ static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *  static void __init emev2_smp_prepare_cpus(unsigned int max_cpus)  { -	int cpu = cpu_logical_map(0); -  	scu_enable(scu_base);  	/* enable cache coherency on CPU0 */ -	modify_scu_cpu_psr(0, 3 << (cpu * 8)); +	scu_power_mode(scu_base, 0);  }  static void __init emev2_smp_init_cpus(void) diff --git a/arch/arm/mach-shmobile/smp-r8a7779.c b/arch/arm/mach-shmobile/smp-r8a7779.c index 2ce6af9a6a3..9def0f22bf2 100644 --- a/arch/arm/mach-shmobile/smp-r8a7779.c +++ b/arch/arm/mach-shmobile/smp-r8a7779.c @@ -61,9 +61,6 @@ static void __iomem *scu_base_addr(void)  	return (void __iomem *)0xf0000000;  } -static DEFINE_SPINLOCK(scu_lock); -static unsigned long tmp; -  #ifdef CONFIG_HAVE_ARM_TWD  static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); @@ -73,20 +70,6 @@ void __init r8a7779_register_twd(void)  }  #endif -static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) -{ -	void __iomem *scu_base = scu_base_addr(); - -	spin_lock(&scu_lock); -	tmp = __raw_readl(scu_base + 8); -	tmp &= ~clr; -	tmp |= set; -	spin_unlock(&scu_lock); - -	/* disable cache coherency after releasing the lock */ -	__raw_writel(tmp, scu_base + 8); -} -  static unsigned int __init r8a7779_get_core_count(void)  {  	void __iomem *scu_base = scu_base_addr(); @@ -102,7 +85,7 @@ static int r8a7779_platform_cpu_kill(unsigned int cpu)  	cpu = cpu_logical_map(cpu);  	/* disable cache coherency */ -	modify_scu_cpu_psr(3 << (cpu * 8), 0); +	scu_power_mode(scu_base_addr(), 3);  	if (cpu < ARRAY_SIZE(r8a7779_ch_cpu))  		ch = r8a7779_ch_cpu[cpu]; @@ -145,7 +128,7 @@ static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct  	cpu = cpu_logical_map(cpu);  	/* enable cache coherency */ -	modify_scu_cpu_psr(0, 3 << (cpu * 8)); +	scu_power_mode(scu_base_addr(), 0);  	if (cpu < ARRAY_SIZE(r8a7779_ch_cpu))  		ch = r8a7779_ch_cpu[cpu]; @@ -158,15 +141,13 @@ static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct  static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus)  { -	int cpu = cpu_logical_map(0); -  	scu_enable(scu_base_addr());  	/* Map the reset vector (in headsmp.S) */  	__raw_writel(__pa(shmobile_secondary_vector), AVECR);  	/* enable cache coherency on CPU0 */ -	modify_scu_cpu_psr(0, 3 << (cpu * 8)); +	scu_power_mode(scu_base_addr(), 0);  	r8a7779_pm_init(); diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index 624f00f70ab..96ddb97babb 100644 --- a/arch/arm/mach-shmobile/smp-sh73a0.c +++ b/arch/arm/mach-shmobile/smp-sh73a0.c @@ -41,9 +41,6 @@ static void __iomem *scu_base_addr(void)  	return (void __iomem *)0xf0000000;  } -static DEFINE_SPINLOCK(scu_lock); -static unsigned long tmp; -  #ifdef CONFIG_HAVE_ARM_TWD  static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29);  void __init sh73a0_register_twd(void) @@ -52,20 +49,6 @@ void __init sh73a0_register_twd(void)  }  #endif -static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) -{ -	void __iomem *scu_base = scu_base_addr(); - -	spin_lock(&scu_lock); -	tmp = __raw_readl(scu_base + 8); -	tmp &= ~clr; -	tmp |= set; -	spin_unlock(&scu_lock); - -	/* disable cache coherency after releasing the lock */ -	__raw_writel(tmp, scu_base + 8); -} -  static unsigned int __init sh73a0_get_core_count(void)  {  	void __iomem *scu_base = scu_base_addr(); @@ -83,7 +66,7 @@ static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct  	cpu = cpu_logical_map(cpu);  	/* enable cache coherency */ -	modify_scu_cpu_psr(0, 3 << (cpu * 8)); +	scu_power_mode(scu_base_addr(), 0);  	if (((__raw_readl(PSTR) >> (4 * cpu)) & 3) == 3)  		__raw_writel(1 << cpu, WUPCR);	/* wake up */ @@ -95,8 +78,6 @@ static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct  static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus)  { -	int cpu = cpu_logical_map(0); -  	scu_enable(scu_base_addr());  	/* Map the reset vector (in headsmp.S) */ @@ -104,7 +85,7 @@ static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus)  	__raw_writel(__pa(shmobile_secondary_vector), SBAR);  	/* enable cache coherency on CPU0 */ -	modify_scu_cpu_psr(0, 3 << (cpu * 8)); +	scu_power_mode(scu_base_addr(), 0);  }  static void __init sh73a0_smp_init_cpus(void) diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig new file mode 100644 index 00000000000..3fdd0085e30 --- /dev/null +++ b/arch/arm/mach-sunxi/Kconfig @@ -0,0 +1,9 @@ +config ARCH_SUNXI +	bool "Allwinner A1X SOCs" if ARCH_MULTI_V7 +	select CLKSRC_MMIO +	select COMMON_CLK +	select GENERIC_CLOCKEVENTS +	select GENERIC_IRQ_CHIP +	select PINCTRL +	select SPARSE_IRQ +	select SUNXI_TIMER diff --git a/arch/arm/mach-sunxi/Makefile b/arch/arm/mach-sunxi/Makefile new file mode 100644 index 00000000000..93bebfc3ff9 --- /dev/null +++ b/arch/arm/mach-sunxi/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_ARCH_SUNXI) += sunxi.o diff --git a/arch/arm/mach-sunxi/Makefile.boot b/arch/arm/mach-sunxi/Makefile.boot new file mode 100644 index 00000000000..46d4cf0841c --- /dev/null +++ b/arch/arm/mach-sunxi/Makefile.boot @@ -0,0 +1 @@ +zreladdr-$(CONFIG_ARCH_SUNXI)	+= 0x40008000 diff --git a/arch/arm/mach-sunxi/sunxi.c b/arch/arm/mach-sunxi/sunxi.c new file mode 100644 index 00000000000..9be910f7920 --- /dev/null +++ b/arch/arm/mach-sunxi/sunxi.c @@ -0,0 +1,96 @@ +/* + * Device Tree support for Allwinner A1X SoCs + * + * Copyright (C) 2012 Maxime Ripard + * + * Maxime Ripard <maxime.ripard@free-electrons.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/delay.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> +#include <linux/io.h> +#include <linux/sunxi_timer.h> + +#include <linux/irqchip/sunxi.h> + +#include <asm/hardware/vic.h> + +#include <asm/mach/arch.h> +#include <asm/mach/map.h> + +#include "sunxi.h" + +#define WATCHDOG_CTRL_REG	0x00 +#define WATCHDOG_MODE_REG	0x04 + +static void __iomem *wdt_base; + +static void sunxi_setup_restart(void) +{ +	struct device_node *np = of_find_compatible_node(NULL, NULL, +						"allwinner,sunxi-wdt"); +	if (WARN(!np, "unable to setup watchdog restart")) +		return; + +	wdt_base = of_iomap(np, 0); +	WARN(!wdt_base, "failed to map watchdog base address"); +} + +static void sunxi_restart(char mode, const char *cmd) +{ +	if (!wdt_base) +		return; + +	/* Enable timer and set reset bit in the watchdog */ +	writel(3, wdt_base + WATCHDOG_MODE_REG); +	writel(0xa57 << 1 | 1, wdt_base + WATCHDOG_CTRL_REG); +	while(1) { +		mdelay(5); +		writel(3, wdt_base + WATCHDOG_MODE_REG); +	} +} + +static struct map_desc sunxi_io_desc[] __initdata = { +	{ +		.virtual	= (unsigned long) SUNXI_REGS_VIRT_BASE, +		.pfn		= __phys_to_pfn(SUNXI_REGS_PHYS_BASE), +		.length		= SUNXI_REGS_SIZE, +		.type		= MT_DEVICE, +	}, +}; + +void __init sunxi_map_io(void) +{ +	iotable_init(sunxi_io_desc, ARRAY_SIZE(sunxi_io_desc)); +} + +static void __init sunxi_dt_init(void) +{ +	sunxi_setup_restart(); + +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); +} + +static const char * const sunxi_board_dt_compat[] = { +	"allwinner,sun4i", +	"allwinner,sun5i", +	NULL, +}; + +DT_MACHINE_START(SUNXI_DT, "Allwinner A1X (Device Tree)") +	.init_machine	= sunxi_dt_init, +	.map_io		= sunxi_map_io, +	.init_irq	= sunxi_init_irq, +	.handle_irq	= sunxi_handle_irq, +	.restart	= sunxi_restart, +	.timer		= &sunxi_timer, +	.dt_compat	= sunxi_board_dt_compat, +MACHINE_END diff --git a/arch/arm/mach-sunxi/sunxi.h b/arch/arm/mach-sunxi/sunxi.h new file mode 100644 index 00000000000..33b58712ade --- /dev/null +++ b/arch/arm/mach-sunxi/sunxi.h @@ -0,0 +1,20 @@ +/* + * Generic definitions for Allwinner SunXi SoCs + * + * Copyright (C) 2012 Maxime Ripard + * + * Maxime Ripard <maxime.ripard@free-electrons.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. + */ + +#ifndef __MACH_SUNXI_H +#define __MACH_SUNXI_H + +#define SUNXI_REGS_PHYS_BASE	0x01c00000 +#define SUNXI_REGS_VIRT_BASE	IOMEM(0xf1c00000) +#define SUNXI_REGS_SIZE		(SZ_2M + SZ_1M) + +#endif /* __MACH_SUNXI_H */ diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index 9ff6f6ea361..e426d1b7747 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -57,57 +57,6 @@ config TEGRA_AHB  	  which controls AHB bus master arbitration and some  	  perfomance parameters(priority, prefech size). -choice -        prompt "Default low-level debug console UART" -        default TEGRA_DEBUG_UART_NONE - -config TEGRA_DEBUG_UART_NONE -        bool "None" - -config TEGRA_DEBUG_UARTA -        bool "UART-A" - -config TEGRA_DEBUG_UARTB -        bool "UART-B" - -config TEGRA_DEBUG_UARTC -        bool "UART-C" - -config TEGRA_DEBUG_UARTD -        bool "UART-D" - -config TEGRA_DEBUG_UARTE -        bool "UART-E" - -endchoice - -choice -	prompt "Automatic low-level debug console UART" -	default TEGRA_DEBUG_UART_AUTO_NONE - -config TEGRA_DEBUG_UART_AUTO_NONE -	bool "None" - -config TEGRA_DEBUG_UART_AUTO_ODMDATA -	bool "Via ODMDATA" -	help -	  Automatically determines which UART to use for low-level debug based -	  on the ODMDATA value. This value is part of the BCT, and is written -	  to the boot memory device using nvflash, or other flashing tool. -	  When bits 19:18 are 3, then bits 17:15 indicate which UART to use; -	  0/1/2/3/4 are UART A/B/C/D/E. - -config TEGRA_DEBUG_UART_AUTO_SCRATCH -	bool "Via UART scratch register" -	help -	  Automatically determines which UART to use for low-level debug based -	  on the UART scratch register value. Some bootloaders put ASCII 'D' -	  in this register when they initialize their own console UART output. -	  Using this option allows the kernel to automatically pick the same -	  UART. - -endchoice -  config TEGRA_EMC_SCALING_ENABLE  	bool "Enable scaling the memory frequency" diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile index 6cc23cc8350..0979e8bba78 100644 --- a/arch/arm/mach-tegra/Makefile +++ b/arch/arm/mach-tegra/Makefile @@ -8,17 +8,24 @@ obj-y					+= pmc.o  obj-y					+= flowctrl.o  obj-y					+= powergate.o  obj-y					+= apbio.o +obj-y					+= pm.o  obj-$(CONFIG_CPU_IDLE)			+= cpuidle.o  obj-$(CONFIG_CPU_IDLE)			+= sleep.o  obj-$(CONFIG_ARCH_TEGRA_2x_SOC)         += tegra20_clocks.o  obj-$(CONFIG_ARCH_TEGRA_2x_SOC)         += tegra20_clocks_data.o  obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= tegra20_speedo.o  obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= tegra2_emc.o -obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= sleep-t20.o +obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= sleep-tegra20.o +ifeq ($(CONFIG_CPU_IDLE),y) +obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= cpuidle-tegra20.o +endif  obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= tegra30_clocks.o  obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= tegra30_clocks_data.o  obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= tegra30_speedo.o -obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= sleep-t30.o +obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= sleep-tegra30.o +ifeq ($(CONFIG_CPU_IDLE),y) +obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= cpuidle-tegra30.o +endif  obj-$(CONFIG_SMP)			+= platsmp.o headsmp.o  obj-$(CONFIG_SMP)                       += reset.o  obj-$(CONFIG_HOTPLUG_CPU)               += hotplug.o diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 3e03e5f15c1..0816562725f 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c @@ -36,6 +36,7 @@  #include "pmc.h"  #include "apbio.h"  #include "sleep.h" +#include "pm.h"  /*   * Storage for debug-macro.S's state. @@ -44,14 +45,15 @@   * kernel is loaded. The data is declared here rather than debug-macro.S so   * that multiple inclusions of debug-macro.S point at the same data.   */ -#define TEGRA_DEBUG_UART_OFFSET (TEGRA_DEBUG_UART_BASE & 0xFFFF) -u32 tegra_uart_config[3] = { +u32 tegra_uart_config[4] = {  	/* Debug UART initialization required */  	1,  	/* Debug UART physical address */ -	(u32)(IO_APB_PHYS + TEGRA_DEBUG_UART_OFFSET), +	0,  	/* Debug UART virtual address */ -	(u32)(IO_APB_VIRT + TEGRA_DEBUG_UART_OFFSET), +	0, +	/* Scratch space for debug macro */ +	0,  };  #ifdef CONFIG_OF @@ -108,6 +110,7 @@ static __initdata struct tegra_clk_init_table tegra30_clk_init_table[] = {  	{ "sclk",	"pll_p_out4",	102000000,	true },  	{ "hclk",	"sclk",		102000000,	true },  	{ "pclk",	"hclk",		51000000,	true }, +	{ "csite",	NULL,		0,		true },  	{ NULL,		NULL,		0,		0},  };  #endif @@ -116,6 +119,7 @@ static __initdata struct tegra_clk_init_table tegra30_clk_init_table[] = {  static void __init tegra_init_cache(void)  {  #ifdef CONFIG_CACHE_L2X0 +	int ret;  	void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000;  	u32 aux_ctrl, cache_type; @@ -123,7 +127,9 @@ static void __init tegra_init_cache(void)  	aux_ctrl = (cache_type & 0x700) << (17-8);  	aux_ctrl |= 0x7C400001; -	l2x0_of_init(aux_ctrl, 0x8200c3fe); +	ret = l2x0_of_init(aux_ctrl, 0x8200c3fe); +	if (!ret) +		l2x0_saved_regs_addr = virt_to_phys(&l2x0_saved_regs);  #endif  } diff --git a/arch/arm/mach-tegra/cpuidle-tegra20.c b/arch/arm/mach-tegra/cpuidle-tegra20.c new file mode 100644 index 00000000000..d32e8b0dbd4 --- /dev/null +++ b/arch/arm/mach-tegra/cpuidle-tegra20.c @@ -0,0 +1,66 @@ +/* + * CPU idle driver for Tegra CPUs + * + * Copyright (c) 2010-2012, NVIDIA Corporation. + * Copyright (c) 2011 Google, Inc. + * Author: Colin Cross <ccross@android.com> + *         Gary King <gking@nvidia.com> + * + * Rework for 3.3 by Peter De Schrijver <pdeschrijver@nvidia.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/cpuidle.h> + +#include <asm/cpuidle.h> + +static struct cpuidle_driver tegra_idle_driver = { +	.name = "tegra_idle", +	.owner = THIS_MODULE, +	.en_core_tk_irqen = 1, +	.state_count = 1, +	.states = { +		[0] = ARM_CPUIDLE_WFI_STATE_PWR(600), +	}, +}; + +static DEFINE_PER_CPU(struct cpuidle_device, tegra_idle_device); + +int __init tegra20_cpuidle_init(void) +{ +	int ret; +	unsigned int cpu; +	struct cpuidle_device *dev; +	struct cpuidle_driver *drv = &tegra_idle_driver; + +	ret = cpuidle_register_driver(&tegra_idle_driver); +	if (ret) { +		pr_err("CPUidle driver registration failed\n"); +		return ret; +	} + +	for_each_possible_cpu(cpu) { +		dev = &per_cpu(tegra_idle_device, cpu); +		dev->cpu = cpu; + +		dev->state_count = drv->state_count; +		ret = cpuidle_register_device(dev); +		if (ret) { +			pr_err("CPU%u: CPUidle device registration failed\n", +				cpu); +			return ret; +		} +	} +	return 0; +} diff --git a/arch/arm/mach-tegra/cpuidle-tegra30.c b/arch/arm/mach-tegra/cpuidle-tegra30.c new file mode 100644 index 00000000000..5e8cbf5b799 --- /dev/null +++ b/arch/arm/mach-tegra/cpuidle-tegra30.c @@ -0,0 +1,188 @@ +/* + * CPU idle driver for Tegra CPUs + * + * Copyright (c) 2010-2012, NVIDIA Corporation. + * Copyright (c) 2011 Google, Inc. + * Author: Colin Cross <ccross@android.com> + *         Gary King <gking@nvidia.com> + * + * Rework for 3.3 by Peter De Schrijver <pdeschrijver@nvidia.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/cpuidle.h> +#include <linux/cpu_pm.h> +#include <linux/clockchips.h> + +#include <asm/cpuidle.h> +#include <asm/proc-fns.h> +#include <asm/suspend.h> +#include <asm/smp_plat.h> + +#include "pm.h" +#include "sleep.h" +#include "tegra_cpu_car.h" + +#ifdef CONFIG_PM_SLEEP +static int tegra30_idle_lp2(struct cpuidle_device *dev, +			    struct cpuidle_driver *drv, +			    int index); +#endif + +static struct cpuidle_driver tegra_idle_driver = { +	.name = "tegra_idle", +	.owner = THIS_MODULE, +	.en_core_tk_irqen = 1, +#ifdef CONFIG_PM_SLEEP +	.state_count = 2, +#else +	.state_count = 1, +#endif +	.states = { +		[0] = ARM_CPUIDLE_WFI_STATE_PWR(600), +#ifdef CONFIG_PM_SLEEP +		[1] = { +			.enter			= tegra30_idle_lp2, +			.exit_latency		= 2000, +			.target_residency	= 2200, +			.power_usage		= 0, +			.flags			= CPUIDLE_FLAG_TIME_VALID, +			.name			= "powered-down", +			.desc			= "CPU power gated", +		}, +#endif +	}, +}; + +static DEFINE_PER_CPU(struct cpuidle_device, tegra_idle_device); + +#ifdef CONFIG_PM_SLEEP +static bool tegra30_cpu_cluster_power_down(struct cpuidle_device *dev, +					   struct cpuidle_driver *drv, +					   int index) +{ +	struct cpuidle_state *state = &drv->states[index]; +	u32 cpu_on_time = state->exit_latency; +	u32 cpu_off_time = state->target_residency - state->exit_latency; + +	/* All CPUs entering LP2 is not working. +	 * Don't let CPU0 enter LP2 when any secondary CPU is online. +	 */ +	if (num_online_cpus() > 1 || !tegra_cpu_rail_off_ready()) { +		cpu_do_idle(); +		return false; +	} + +	clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &dev->cpu); + +	tegra_idle_lp2_last(cpu_on_time, cpu_off_time); + +	clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &dev->cpu); + +	return true; +} + +#ifdef CONFIG_SMP +static bool tegra30_cpu_core_power_down(struct cpuidle_device *dev, +					struct cpuidle_driver *drv, +					int index) +{ +	clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &dev->cpu); + +	smp_wmb(); + +	save_cpu_arch_register(); + +	cpu_suspend(0, tegra30_sleep_cpu_secondary_finish); + +	restore_cpu_arch_register(); + +	clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &dev->cpu); + +	return true; +} +#else +static inline bool tegra30_cpu_core_power_down(struct cpuidle_device *dev, +					       struct cpuidle_driver *drv, +					       int index) +{ +	return true; +} +#endif + +static int __cpuinit tegra30_idle_lp2(struct cpuidle_device *dev, +				      struct cpuidle_driver *drv, +				      int index) +{ +	u32 cpu = is_smp() ? cpu_logical_map(dev->cpu) : dev->cpu; +	bool entered_lp2 = false; +	bool last_cpu; + +	local_fiq_disable(); + +	last_cpu = tegra_set_cpu_in_lp2(cpu); +	cpu_pm_enter(); + +	if (cpu == 0) { +		if (last_cpu) +			entered_lp2 = tegra30_cpu_cluster_power_down(dev, drv, +								     index); +		else +			cpu_do_idle(); +	} else { +		entered_lp2 = tegra30_cpu_core_power_down(dev, drv, index); +	} + +	cpu_pm_exit(); +	tegra_clear_cpu_in_lp2(cpu); + +	local_fiq_enable(); + +	smp_rmb(); + +	return (entered_lp2) ? index : 0; +} +#endif + +int __init tegra30_cpuidle_init(void) +{ +	int ret; +	unsigned int cpu; +	struct cpuidle_device *dev; +	struct cpuidle_driver *drv = &tegra_idle_driver; + +#ifdef CONFIG_PM_SLEEP +	tegra_tear_down_cpu = tegra30_tear_down_cpu; +#endif + +	ret = cpuidle_register_driver(&tegra_idle_driver); +	if (ret) { +		pr_err("CPUidle driver registration failed\n"); +		return ret; +	} + +	for_each_possible_cpu(cpu) { +		dev = &per_cpu(tegra_idle_device, cpu); +		dev->cpu = cpu; + +		dev->state_count = drv->state_count; +		ret = cpuidle_register_device(dev); +		if (ret) { +			pr_err("CPU%u: CPUidle device registration failed\n", +				cpu); +			return ret; +		} +	} +	return 0; +} diff --git a/arch/arm/mach-tegra/cpuidle.c b/arch/arm/mach-tegra/cpuidle.c index 9a6f051b382..d0651397aec 100644 --- a/arch/arm/mach-tegra/cpuidle.c +++ b/arch/arm/mach-tegra/cpuidle.c @@ -23,83 +23,26 @@  #include <linux/kernel.h>  #include <linux/module.h> -#include <linux/cpu.h> -#include <linux/cpuidle.h> -#include <linux/hrtimer.h> -#include <asm/proc-fns.h> - -static int tegra_idle_enter_lp3(struct cpuidle_device *dev, -				struct cpuidle_driver *drv, int index); - -struct cpuidle_driver tegra_idle_driver = { -	.name = "tegra_idle", -	.owner = THIS_MODULE, -	.state_count = 1, -	.states = { -		[0] = { -			.enter			= tegra_idle_enter_lp3, -			.exit_latency		= 10, -			.target_residency	= 10, -			.power_usage		= 600, -			.flags			= CPUIDLE_FLAG_TIME_VALID, -			.name			= "LP3", -			.desc			= "CPU flow-controlled", -		}, -	}, -}; - -static DEFINE_PER_CPU(struct cpuidle_device, tegra_idle_device); - -static int tegra_idle_enter_lp3(struct cpuidle_device *dev, -	struct cpuidle_driver *drv, int index) -{ -	ktime_t enter, exit; -	s64 us; - -	local_irq_disable(); -	local_fiq_disable(); - -	enter = ktime_get(); - -	cpu_do_idle(); - -	exit = ktime_sub(ktime_get(), enter); -	us = ktime_to_us(exit); - -	local_fiq_enable(); -	local_irq_enable(); - -	dev->last_residency = us; - -	return index; -} +#include "fuse.h" +#include "cpuidle.h"  static int __init tegra_cpuidle_init(void)  {  	int ret; -	unsigned int cpu; -	struct cpuidle_device *dev; -	struct cpuidle_driver *drv = &tegra_idle_driver; -	ret = cpuidle_register_driver(&tegra_idle_driver); -	if (ret) { -		pr_err("CPUidle driver registration failed\n"); -		return ret; +	switch (tegra_chip_id) { +	case TEGRA20: +		ret = tegra20_cpuidle_init(); +		break; +	case TEGRA30: +		ret = tegra30_cpuidle_init(); +		break; +	default: +		ret = -ENODEV; +		break;  	} -	for_each_possible_cpu(cpu) { -		dev = &per_cpu(tegra_idle_device, cpu); -		dev->cpu = cpu; - -		dev->state_count = drv->state_count; -		ret = cpuidle_register_device(dev); -		if (ret) { -			pr_err("CPU%u: CPUidle device registration failed\n", -				cpu); -			return ret; -		} -	} -	return 0; +	return ret;  }  device_initcall(tegra_cpuidle_init); diff --git a/arch/arm/mach-tegra/cpuidle.h b/arch/arm/mach-tegra/cpuidle.h new file mode 100644 index 00000000000..496204d34e5 --- /dev/null +++ b/arch/arm/mach-tegra/cpuidle.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2012, NVIDIA Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __MACH_TEGRA_CPUIDLE_H +#define __MACH_TEGRA_CPUIDLE_H + +#ifdef CONFIG_ARCH_TEGRA_2x_SOC +int tegra20_cpuidle_init(void); +#else +static inline int tegra20_cpuidle_init(void) { return -ENODEV; } +#endif + +#ifdef CONFIG_ARCH_TEGRA_3x_SOC +int tegra30_cpuidle_init(void); +#else +static inline int tegra30_cpuidle_init(void) { return -ENODEV; } +#endif + +#endif diff --git a/arch/arm/mach-tegra/flowctrl.c b/arch/arm/mach-tegra/flowctrl.c index ffaa286a71e..a2250ddae79 100644 --- a/arch/arm/mach-tegra/flowctrl.c +++ b/arch/arm/mach-tegra/flowctrl.c @@ -21,6 +21,7 @@  #include <linux/init.h>  #include <linux/kernel.h>  #include <linux/io.h> +#include <linux/cpumask.h>  #include "flowctrl.h"  #include "iomap.h" @@ -50,6 +51,14 @@ static void flowctrl_update(u8 offset, u32 value)  	readl_relaxed(addr);  } +u32 flowctrl_read_cpu_csr(unsigned int cpuid) +{ +	u8 offset = flowctrl_offset_cpu_csr[cpuid]; +	void __iomem *addr = IO_ADDRESS(TEGRA_FLOW_CTRL_BASE) + offset; + +	return readl(addr); +} +  void flowctrl_write_cpu_csr(unsigned int cpuid, u32 value)  {  	return flowctrl_update(flowctrl_offset_cpu_csr[cpuid], value); @@ -59,3 +68,41 @@ void flowctrl_write_cpu_halt(unsigned int cpuid, u32 value)  {  	return flowctrl_update(flowctrl_offset_halt_cpu[cpuid], value);  } + +void flowctrl_cpu_suspend_enter(unsigned int cpuid) +{ +	unsigned int reg; +	int i; + +	reg = flowctrl_read_cpu_csr(cpuid); +	reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP;	/* clear wfe bitmap */ +	reg &= ~TEGRA30_FLOW_CTRL_CSR_WFI_BITMAP;	/* clear wfi bitmap */ +	reg |= FLOW_CTRL_CSR_INTR_FLAG;			/* clear intr flag */ +	reg |= FLOW_CTRL_CSR_EVENT_FLAG;		/* clear event flag */ +	reg |= TEGRA30_FLOW_CTRL_CSR_WFI_CPU0 << cpuid;	/* pwr gating on wfi */ +	reg |= FLOW_CTRL_CSR_ENABLE;			/* pwr gating */ +	flowctrl_write_cpu_csr(cpuid, reg); + +	for (i = 0; i < num_possible_cpus(); i++) { +		if (i == cpuid) +			continue; +		reg = flowctrl_read_cpu_csr(i); +		reg |= FLOW_CTRL_CSR_EVENT_FLAG; +		reg |= FLOW_CTRL_CSR_INTR_FLAG; +		flowctrl_write_cpu_csr(i, reg); +	} +} + +void flowctrl_cpu_suspend_exit(unsigned int cpuid) +{ +	unsigned int reg; + +	/* Disable powergating via flow controller for CPU0 */ +	reg = flowctrl_read_cpu_csr(cpuid); +	reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP;	/* clear wfe bitmap */ +	reg &= ~TEGRA30_FLOW_CTRL_CSR_WFI_BITMAP;	/* clear wfi bitmap */ +	reg &= ~FLOW_CTRL_CSR_ENABLE;			/* clear enable */ +	reg |= FLOW_CTRL_CSR_INTR_FLAG;			/* clear intr */ +	reg |= FLOW_CTRL_CSR_EVENT_FLAG;		/* clear event */ +	flowctrl_write_cpu_csr(cpuid, reg); +} diff --git a/arch/arm/mach-tegra/flowctrl.h b/arch/arm/mach-tegra/flowctrl.h index 19428173855..0798dec1832 100644 --- a/arch/arm/mach-tegra/flowctrl.h +++ b/arch/arm/mach-tegra/flowctrl.h @@ -34,9 +34,17 @@  #define FLOW_CTRL_HALT_CPU1_EVENTS	0x14  #define FLOW_CTRL_CPU1_CSR		0x18 +#define TEGRA30_FLOW_CTRL_CSR_WFI_CPU0		(1 << 8) +#define TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP	(0xF << 4) +#define TEGRA30_FLOW_CTRL_CSR_WFI_BITMAP	(0xF << 8) +  #ifndef __ASSEMBLY__ +u32 flowctrl_read_cpu_csr(unsigned int cpuid);  void flowctrl_write_cpu_csr(unsigned int cpuid, u32 value);  void flowctrl_write_cpu_halt(unsigned int cpuid, u32 value); + +void flowctrl_cpu_suspend_enter(unsigned int cpuid); +void flowctrl_cpu_suspend_exit(unsigned int cpuid);  #endif  #endif diff --git a/arch/arm/mach-tegra/headsmp.S b/arch/arm/mach-tegra/headsmp.S index 93f0370cc95..4a317fae686 100644 --- a/arch/arm/mach-tegra/headsmp.S +++ b/arch/arm/mach-tegra/headsmp.S @@ -2,6 +2,8 @@  #include <linux/init.h>  #include <asm/cache.h> +#include <asm/asm-offsets.h> +#include <asm/hardware/cache-l2x0.h>  #include "flowctrl.h"  #include "iomap.h" @@ -68,6 +70,64 @@ ENTRY(tegra_secondary_startup)          b       secondary_startup  ENDPROC(tegra_secondary_startup) +#ifdef CONFIG_PM_SLEEP +/* + *	tegra_resume + * + *	  CPU boot vector when restarting the a CPU following + *	  an LP2 transition. Also branched to by LP0 and LP1 resume after + *	  re-enabling sdram. + */ +ENTRY(tegra_resume) +	bl	v7_invalidate_l1 +	/* Enable coresight */ +	mov32	r0, 0xC5ACCE55 +	mcr	p14, 0, r0, c7, c12, 6 + +	cpu_id	r0 +	cmp	r0, #0				@ CPU0? +	bne	cpu_resume			@ no + +#ifdef CONFIG_ARCH_TEGRA_3x_SOC +	/* Are we on Tegra20? */ +	mov32	r6, TEGRA_APB_MISC_BASE +	ldr	r0, [r6, #APB_MISC_GP_HIDREV] +	and	r0, r0, #0xff00 +	cmp	r0, #(0x20 << 8) +	beq	1f				@ Yes +	/* Clear the flow controller flags for this CPU. */ +	mov32	r2, TEGRA_FLOW_CTRL_BASE + FLOW_CTRL_CPU0_CSR	@ CPU0 CSR +	ldr	r1, [r2] +	/* Clear event & intr flag */ +	orr	r1, r1, \ +		#FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG +	movw	r0, #0x0FFD	@ enable, cluster_switch, immed, & bitmaps +	bic	r1, r1, r0 +	str	r1, [r2] +1: +#endif + +#ifdef CONFIG_HAVE_ARM_SCU +	/* enable SCU */ +	mov32	r0, TEGRA_ARM_PERIF_BASE +	ldr	r1, [r0] +	orr	r1, r1, #1 +	str	r1, [r0] +#endif + +	/* L2 cache resume & re-enable */ +	l2_cache_resume r0, r1, r2, l2x0_saved_regs_addr + +	b	cpu_resume +ENDPROC(tegra_resume) +#endif + +#ifdef CONFIG_CACHE_L2X0 +	.globl	l2x0_saved_regs_addr +l2x0_saved_regs_addr: +	.long	0 +#endif +  	.align L1_CACHE_SHIFT  ENTRY(__tegra_cpu_reset_handler_start) @@ -121,6 +181,17 @@ ENTRY(__tegra_cpu_reset_handler)  1:  #endif +	/* Waking up from LP2? */ +	ldr	r9, [r12, #RESET_DATA(MASK_LP2)] +	tst	r9, r11				@ if in_lp2 +	beq	__is_not_lp2 +	ldr	lr, [r12, #RESET_DATA(STARTUP_LP2)] +	cmp	lr, #0 +	bleq	__die				@ no LP2 startup handler +	bx	lr + +__is_not_lp2: +  #ifdef CONFIG_SMP  	/*  	 * Can only be secondary boot (initial or hotplug) but CPU 0 diff --git a/arch/arm/mach-tegra/include/mach/debug-macro.S b/arch/arm/mach-tegra/include/mach/debug-macro.S deleted file mode 100644 index 44ca7b1d8b8..00000000000 --- a/arch/arm/mach-tegra/include/mach/debug-macro.S +++ /dev/null @@ -1,100 +0,0 @@ -/* - * arch/arm/mach-tegra/include/mach/debug-macro.S - * - * Copyright (C) 2010,2011 Google, Inc. - * Copyright (C) 2011-2012 NVIDIA CORPORATION. All Rights Reserved. - * - * Author: - *	Colin Cross <ccross@google.com> - *	Erik Gilling <konkers@google.com> - *	Doug Anderson <dianders@chromium.org> - *	Stephen Warren <swarren@nvidia.com> - * - * Portions based on mach-omap2's debug-macro.S - * Copyright (C) 1994-1999 Russell King - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - */ - -#include <linux/serial_reg.h> - -#include "../../iomap.h" -#include "../../irammap.h" - -		.macro  addruart, rp, rv, tmp -		adr	\rp, 99f		@ actual addr of 99f -		ldr	\rv, [\rp]		@ linked addr is stored there -		sub	\rv, \rv, \rp		@ offset between the two -		ldr	\rp, [\rp, #4]		@ linked tegra_uart_config -		sub	\tmp, \rp, \rv		@ actual tegra_uart_config -		ldr	\rp, [\tmp]		@ Load tegra_uart_config -		cmp	\rp, #1			@ needs intitialization? -		bne	100f			@ no; go load the addresses -		mov	\rv, #0			@ yes; record init is done -		str	\rv, [\tmp] -		mov	\rp, #TEGRA_IRAM_BASE	@ See if cookie is in IRAM -		ldr	\rv, [\rp, #TEGRA_IRAM_DEBUG_UART_OFFSET] -		movw	\rp, #TEGRA_IRAM_DEBUG_UART_COOKIE & 0xffff -		movt	\rp, #TEGRA_IRAM_DEBUG_UART_COOKIE >> 16 -		cmp	\rv, \rp		@ Cookie present? -		bne	100f			@ No, use default UART -		mov	\rp, #TEGRA_IRAM_BASE	@ Load UART address from IRAM -		ldr	\rv, [\rp, #TEGRA_IRAM_DEBUG_UART_OFFSET + 4] -		str	\rv, [\tmp, #4]		@ Store in tegra_uart_phys -		sub	\rv, \rv, #IO_APB_PHYS	@ Calculate virt address -		add	\rv, \rv, #IO_APB_VIRT -		str	\rv, [\tmp, #8]		@ Store in tegra_uart_virt -		b	100f - -		.align -99:		.word	. -		.word	tegra_uart_config -		.ltorg - -100:		ldr	\rp, [\tmp, #4]		@ Load tegra_uart_phys -		ldr	\rv, [\tmp, #8]		@ Load tegra_uart_virt -		.endm - -#define UART_SHIFT 2 - -/* - * Code below is swiped from <asm/hardware/debug-8250.S>, but add an extra - * check to make sure that we aren't in the CONFIG_TEGRA_DEBUG_UART_NONE case. - * We use the fact that all 5 valid UART addresses all have something in the - * 2nd-to-lowest byte. - */ - -		.macro	senduart, rd, rx -		tst	\rx, #0x0000ff00 -		strneb	\rd, [\rx, #UART_TX << UART_SHIFT] -1001: -		.endm - -		.macro	busyuart, rd, rx -		tst	\rx, #0x0000ff00 -		beq	1002f -1001:		ldrb	\rd, [\rx, #UART_LSR << UART_SHIFT] -		and	\rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE -		teq	\rd, #UART_LSR_TEMT | UART_LSR_THRE -		bne	1001b -1002: -		.endm - -		.macro	waituart, rd, rx -#ifdef FLOW_CONTROL -		tst	\rx, #0x0000ff00 -		beq	1002f -1001:		ldrb	\rd, [\rx, #UART_MSR << UART_SHIFT] -		tst	\rd, #UART_MSR_CTS -		beq	1001b -1002: -#endif -		.endm diff --git a/arch/arm/mach-tegra/include/mach/irqs.h b/arch/arm/mach-tegra/include/mach/irqs.h deleted file mode 100644 index aad1a2c1d71..00000000000 --- a/arch/arm/mach-tegra/include/mach/irqs.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * arch/arm/mach-tegra/include/mach/irqs.h - * - * Copyright (C) 2010 Google, Inc. - * - * Author: - *	Colin Cross <ccross@google.com> - *	Erik Gilling <konkers@google.com> - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - */ - -#ifndef __MACH_TEGRA_IRQS_H -#define __MACH_TEGRA_IRQS_H - -#define INT_GIC_BASE			0 - -#define IRQ_LOCALTIMER                  29 - -/* Primary Interrupt Controller */ -#define INT_PRI_BASE			(INT_GIC_BASE + 32) -#define INT_TMR1			(INT_PRI_BASE + 0) -#define INT_TMR2			(INT_PRI_BASE + 1) -#define INT_RTC				(INT_PRI_BASE + 2) -#define INT_I2S2			(INT_PRI_BASE + 3) -#define INT_SHR_SEM_INBOX_IBF		(INT_PRI_BASE + 4) -#define INT_SHR_SEM_INBOX_IBE		(INT_PRI_BASE + 5) -#define INT_SHR_SEM_OUTBOX_IBF		(INT_PRI_BASE + 6) -#define INT_SHR_SEM_OUTBOX_IBE		(INT_PRI_BASE + 7) -#define INT_VDE_UCQ_ERROR		(INT_PRI_BASE + 8) -#define INT_VDE_SYNC_TOKEN		(INT_PRI_BASE + 9) -#define INT_VDE_BSE_V			(INT_PRI_BASE + 10) -#define INT_VDE_BSE_A			(INT_PRI_BASE + 11) -#define INT_VDE_SXE			(INT_PRI_BASE + 12) -#define INT_I2S1			(INT_PRI_BASE + 13) -#define INT_SDMMC1			(INT_PRI_BASE + 14) -#define INT_SDMMC2			(INT_PRI_BASE + 15) -#define INT_XIO				(INT_PRI_BASE + 16) -#define INT_VDE				(INT_PRI_BASE + 17) -#define INT_AVP_UCQ			(INT_PRI_BASE + 18) -#define INT_SDMMC3			(INT_PRI_BASE + 19) -#define INT_USB				(INT_PRI_BASE + 20) -#define INT_USB2			(INT_PRI_BASE + 21) -#define INT_PRI_RES_22			(INT_PRI_BASE + 22) -#define INT_EIDE			(INT_PRI_BASE + 23) -#define INT_NANDFLASH			(INT_PRI_BASE + 24) -#define INT_VCP				(INT_PRI_BASE + 25) -#define INT_APB_DMA			(INT_PRI_BASE + 26) -#define INT_AHB_DMA			(INT_PRI_BASE + 27) -#define INT_GNT_0			(INT_PRI_BASE + 28) -#define INT_GNT_1			(INT_PRI_BASE + 29) -#define INT_OWR				(INT_PRI_BASE + 30) -#define INT_SDMMC4			(INT_PRI_BASE + 31) - -/* Secondary Interrupt Controller */ -#define INT_SEC_BASE			(INT_PRI_BASE + 32) -#define INT_GPIO1			(INT_SEC_BASE + 0) -#define INT_GPIO2			(INT_SEC_BASE + 1) -#define INT_GPIO3			(INT_SEC_BASE + 2) -#define INT_GPIO4			(INT_SEC_BASE + 3) -#define INT_UARTA			(INT_SEC_BASE + 4) -#define INT_UARTB			(INT_SEC_BASE + 5) -#define INT_I2C				(INT_SEC_BASE + 6) -#define INT_SPI				(INT_SEC_BASE + 7) -#define INT_TWC				(INT_SEC_BASE + 8) -#define INT_TMR3			(INT_SEC_BASE + 9) -#define INT_TMR4			(INT_SEC_BASE + 10) -#define INT_FLOW_RSM0			(INT_SEC_BASE + 11) -#define INT_FLOW_RSM1			(INT_SEC_BASE + 12) -#define INT_SPDIF			(INT_SEC_BASE + 13) -#define INT_UARTC			(INT_SEC_BASE + 14) -#define INT_MIPI			(INT_SEC_BASE + 15) -#define INT_EVENTA			(INT_SEC_BASE + 16) -#define INT_EVENTB			(INT_SEC_BASE + 17) -#define INT_EVENTC			(INT_SEC_BASE + 18) -#define INT_EVENTD			(INT_SEC_BASE + 19) -#define INT_VFIR			(INT_SEC_BASE + 20) -#define INT_DVC				(INT_SEC_BASE + 21) -#define INT_SYS_STATS_MON		(INT_SEC_BASE + 22) -#define INT_GPIO5			(INT_SEC_BASE + 23) -#define INT_CPU0_PMU_INTR		(INT_SEC_BASE + 24) -#define INT_CPU1_PMU_INTR		(INT_SEC_BASE + 25) -#define INT_SEC_RES_26			(INT_SEC_BASE + 26) -#define INT_S_LINK1			(INT_SEC_BASE + 27) -#define INT_APB_DMA_COP			(INT_SEC_BASE + 28) -#define INT_AHB_DMA_COP			(INT_SEC_BASE + 29) -#define INT_DMA_TX			(INT_SEC_BASE + 30) -#define INT_DMA_RX			(INT_SEC_BASE + 31) - -/* Tertiary Interrupt Controller */ -#define INT_TRI_BASE			(INT_SEC_BASE + 32) -#define INT_HOST1X_COP_SYNCPT		(INT_TRI_BASE + 0) -#define INT_HOST1X_MPCORE_SYNCPT	(INT_TRI_BASE + 1) -#define INT_HOST1X_COP_GENERAL		(INT_TRI_BASE + 2) -#define INT_HOST1X_MPCORE_GENERAL	(INT_TRI_BASE + 3) -#define INT_MPE_GENERAL			(INT_TRI_BASE + 4) -#define INT_VI_GENERAL			(INT_TRI_BASE + 5) -#define INT_EPP_GENERAL			(INT_TRI_BASE + 6) -#define INT_ISP_GENERAL			(INT_TRI_BASE + 7) -#define INT_2D_GENERAL			(INT_TRI_BASE + 8) -#define INT_DISPLAY_GENERAL		(INT_TRI_BASE + 9) -#define INT_DISPLAY_B_GENERAL		(INT_TRI_BASE + 10) -#define INT_HDMI			(INT_TRI_BASE + 11) -#define INT_TVO_GENERAL			(INT_TRI_BASE + 12) -#define INT_MC_GENERAL			(INT_TRI_BASE + 13) -#define INT_EMC_GENERAL			(INT_TRI_BASE + 14) -#define INT_TRI_RES_15			(INT_TRI_BASE + 15) -#define INT_TRI_RES_16			(INT_TRI_BASE + 16) -#define INT_AC97			(INT_TRI_BASE + 17) -#define INT_SPI_2			(INT_TRI_BASE + 18) -#define INT_SPI_3			(INT_TRI_BASE + 19) -#define INT_I2C2			(INT_TRI_BASE + 20) -#define INT_KBC				(INT_TRI_BASE + 21) -#define INT_EXTERNAL_PMU		(INT_TRI_BASE + 22) -#define INT_GPIO6			(INT_TRI_BASE + 23) -#define INT_TVDAC			(INT_TRI_BASE + 24) -#define INT_GPIO7			(INT_TRI_BASE + 25) -#define INT_UARTD			(INT_TRI_BASE + 26) -#define INT_UARTE			(INT_TRI_BASE + 27) -#define INT_I2C3			(INT_TRI_BASE + 28) -#define INT_SPI_4			(INT_TRI_BASE + 29) -#define INT_TRI_RES_30			(INT_TRI_BASE + 30) -#define INT_SW_RESERVED			(INT_TRI_BASE + 31) - -/* Quaternary Interrupt Controller */ -#define INT_QUAD_BASE			(INT_TRI_BASE + 32) -#define INT_SNOR			(INT_QUAD_BASE + 0) -#define INT_USB3			(INT_QUAD_BASE + 1) -#define INT_PCIE_INTR			(INT_QUAD_BASE + 2) -#define INT_PCIE_MSI			(INT_QUAD_BASE + 3) -#define INT_QUAD_RES_4			(INT_QUAD_BASE + 4) -#define INT_QUAD_RES_5			(INT_QUAD_BASE + 5) -#define INT_QUAD_RES_6			(INT_QUAD_BASE + 6) -#define INT_QUAD_RES_7			(INT_QUAD_BASE + 7) -#define INT_APB_DMA_CH0			(INT_QUAD_BASE + 8) -#define INT_APB_DMA_CH1			(INT_QUAD_BASE + 9) -#define INT_APB_DMA_CH2			(INT_QUAD_BASE + 10) -#define INT_APB_DMA_CH3			(INT_QUAD_BASE + 11) -#define INT_APB_DMA_CH4			(INT_QUAD_BASE + 12) -#define INT_APB_DMA_CH5			(INT_QUAD_BASE + 13) -#define INT_APB_DMA_CH6			(INT_QUAD_BASE + 14) -#define INT_APB_DMA_CH7			(INT_QUAD_BASE + 15) -#define INT_APB_DMA_CH8			(INT_QUAD_BASE + 16) -#define INT_APB_DMA_CH9			(INT_QUAD_BASE + 17) -#define INT_APB_DMA_CH10		(INT_QUAD_BASE + 18) -#define INT_APB_DMA_CH11		(INT_QUAD_BASE + 19) -#define INT_APB_DMA_CH12		(INT_QUAD_BASE + 20) -#define INT_APB_DMA_CH13		(INT_QUAD_BASE + 21) -#define INT_APB_DMA_CH14		(INT_QUAD_BASE + 22) -#define INT_APB_DMA_CH15		(INT_QUAD_BASE + 23) -#define INT_QUAD_RES_24			(INT_QUAD_BASE + 24) -#define INT_QUAD_RES_25			(INT_QUAD_BASE + 25) -#define INT_QUAD_RES_26			(INT_QUAD_BASE + 26) -#define INT_QUAD_RES_27			(INT_QUAD_BASE + 27) -#define INT_QUAD_RES_28			(INT_QUAD_BASE + 28) -#define INT_QUAD_RES_29			(INT_QUAD_BASE + 29) -#define INT_QUAD_RES_30			(INT_QUAD_BASE + 30) -#define INT_QUAD_RES_31			(INT_QUAD_BASE + 31) - -/* Tegra30 has 5 banks of 32 IRQs */ -#define INT_MAIN_NR			(32 * 5) -#define INT_GPIO_BASE			(INT_PRI_BASE + INT_MAIN_NR) - -/* Tegra30 has 8 banks of 32 GPIOs */ -#define INT_GPIO_NR			(32 * 8) - -#define TEGRA_NR_IRQS			(INT_GPIO_BASE + INT_GPIO_NR) - -#define INT_BOARD_BASE			TEGRA_NR_IRQS -#define NR_BOARD_IRQS			32 - -#define NR_IRQS				(INT_BOARD_BASE + NR_BOARD_IRQS) - -#endif diff --git a/arch/arm/mach-tegra/include/mach/uncompress.h b/arch/arm/mach-tegra/include/mach/uncompress.h index 27725750ca3..485003f9b63 100644 --- a/arch/arm/mach-tegra/include/mach/uncompress.h +++ b/arch/arm/mach-tegra/include/mach/uncompress.h @@ -29,7 +29,6 @@  #include <linux/serial_reg.h>  #include "../../iomap.h" -#include "../../irammap.h"  #define BIT(x) (1 << (x))  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) @@ -52,17 +51,6 @@ static inline void flush(void)  {  } -static inline void save_uart_address(void) -{ -	u32 *buf = (u32 *)(TEGRA_IRAM_BASE + TEGRA_IRAM_DEBUG_UART_OFFSET); - -	if (uart) { -		buf[0] = TEGRA_IRAM_DEBUG_UART_COOKIE; -		buf[1] = (u32)uart; -	} else -		buf[0] = 0; -} -  static const struct {  	u32 base;  	u32 reset_reg; @@ -139,51 +127,19 @@ int auto_odmdata(void)  }  #endif -#ifdef CONFIG_TEGRA_DEBUG_UART_AUTO_SCRATCH -int auto_scratch(void) -{ -	int i; - -	/* -	 * Look for the first UART that: -	 * a) Is not in reset. -	 * b) Is clocked. -	 * c) Has a 'D' in the scratchpad register. -	 * -	 * Note that on Tegra30, the first two conditions are required, since -	 * if not true, accesses to the UART scratch register will hang. -	 * Tegra20 doesn't have this issue. -	 * -	 * The intent is that the bootloader will tell the kernel which UART -	 * to use by setting up those conditions. If nothing found, we'll fall -	 * back to what's specified in TEGRA_DEBUG_UART_BASE. -	 */ -	for (i = 0; i < ARRAY_SIZE(uarts); i++) { -		if (!uart_clocked(i)) -			continue; - -		uart = (volatile u8 *)uarts[i].base; -		if (uart[UART_SCR << DEBUG_UART_SHIFT] != 'D') -			continue; - -		return i; -	} - -	return -1; -} -#endif -  /*   * Setup before decompression.  This is where we do UART selection for   * earlyprintk and init the uart_base register.   */  static inline void arch_decomp_setup(void)  { -	int uart_id, auto_uart_id; +	int uart_id;  	volatile u32 *apb_misc = (volatile u32 *)TEGRA_APB_MISC_BASE;  	u32 chip, div; -#if defined(CONFIG_TEGRA_DEBUG_UARTA) +#if defined(CONFIG_TEGRA_DEBUG_UART_AUTO_ODMDATA) +	uart_id = auto_odmdata(); +#elif defined(CONFIG_TEGRA_DEBUG_UARTA)  	uart_id = 0;  #elif defined(CONFIG_TEGRA_DEBUG_UARTB)  	uart_id = 1; @@ -193,19 +149,7 @@ static inline void arch_decomp_setup(void)  	uart_id = 3;  #elif defined(CONFIG_TEGRA_DEBUG_UARTE)  	uart_id = 4; -#else -	uart_id = -1; -#endif - -#if defined(CONFIG_TEGRA_DEBUG_UART_AUTO_ODMDATA) -	auto_uart_id = auto_odmdata(); -#elif defined(CONFIG_TEGRA_DEBUG_UART_AUTO_SCRATCH) -	auto_uart_id = auto_scratch(); -#else -	auto_uart_id = -1;  #endif -	if (auto_uart_id != -1) -		uart_id = auto_uart_id;  	if (uart_id < 0 || uart_id >= ARRAY_SIZE(uarts) ||  	    !uart_clocked(uart_id)) @@ -213,7 +157,6 @@ static inline void arch_decomp_setup(void)  	else  		uart = (volatile u8 *)uarts[uart_id].base; -	save_uart_address();  	if (uart == NULL)  		return; diff --git a/arch/arm/mach-tegra/io.c b/arch/arm/mach-tegra/io.c index 7d09f301b3a..bb9c9c29d18 100644 --- a/arch/arm/mach-tegra/io.c +++ b/arch/arm/mach-tegra/io.c @@ -59,5 +59,6 @@ static struct map_desc tegra_io_desc[] __initdata = {  void __init tegra_map_common_io(void)  { +	debug_ll_io_init();  	iotable_init(tegra_io_desc, ARRAY_SIZE(tegra_io_desc));  } diff --git a/arch/arm/mach-tegra/iomap.h b/arch/arm/mach-tegra/iomap.h index 53151030a07..db8be51cad8 100644 --- a/arch/arm/mach-tegra/iomap.h +++ b/arch/arm/mach-tegra/iomap.h @@ -261,20 +261,6 @@  #define TEGRA_SDMMC4_BASE		0xC8000600  #define TEGRA_SDMMC4_SIZE		SZ_512 -#if defined(CONFIG_TEGRA_DEBUG_UART_NONE) -# define TEGRA_DEBUG_UART_BASE 0 -#elif defined(CONFIG_TEGRA_DEBUG_UARTA) -# define TEGRA_DEBUG_UART_BASE TEGRA_UARTA_BASE -#elif defined(CONFIG_TEGRA_DEBUG_UARTB) -# define TEGRA_DEBUG_UART_BASE TEGRA_UARTB_BASE -#elif defined(CONFIG_TEGRA_DEBUG_UARTC) -# define TEGRA_DEBUG_UART_BASE TEGRA_UARTC_BASE -#elif defined(CONFIG_TEGRA_DEBUG_UARTD) -# define TEGRA_DEBUG_UART_BASE TEGRA_UARTD_BASE -#elif defined(CONFIG_TEGRA_DEBUG_UARTE) -# define TEGRA_DEBUG_UART_BASE TEGRA_UARTE_BASE -#endif -  /* On TEGRA, many peripherals are very closely packed in   * two 256MB io windows (that actually only use about 64KB   * at the start of each). diff --git a/arch/arm/mach-tegra/irammap.h b/arch/arm/mach-tegra/irammap.h index 0cbe6326185..501952a8434 100644 --- a/arch/arm/mach-tegra/irammap.h +++ b/arch/arm/mach-tegra/irammap.h @@ -23,13 +23,4 @@  #define TEGRA_IRAM_RESET_HANDLER_OFFSET	0  #define TEGRA_IRAM_RESET_HANDLER_SIZE	SZ_1K -/* - * These locations are written to by uncompress.h, and read by debug-macro.S. - * The first word holds the cookie value if the data is valid. The second - * word holds the UART physical address. - */ -#define TEGRA_IRAM_DEBUG_UART_OFFSET	SZ_1K -#define TEGRA_IRAM_DEBUG_UART_SIZE	8 -#define TEGRA_IRAM_DEBUG_UART_COOKIE	0x55415254 -  #endif diff --git a/arch/arm/mach-tegra/pcie.c b/arch/arm/mach-tegra/pcie.c index f18fc3ab4e5..53d08587179 100644 --- a/arch/arm/mach-tegra/pcie.c +++ b/arch/arm/mach-tegra/pcie.c @@ -43,6 +43,9 @@  #include "board.h"  #include "iomap.h" +/* Hack - need to parse this from DT */ +#define INT_PCIE_INTR 130 +  /* register definitions */  #define AFI_OFFSET	0x3800  #define PADS_OFFSET	0x3000 diff --git a/arch/arm/mach-tegra/pm.c b/arch/arm/mach-tegra/pm.c new file mode 100644 index 00000000000..1b11707eaca --- /dev/null +++ b/arch/arm/mach-tegra/pm.c @@ -0,0 +1,216 @@ +/* + * CPU complex suspend & resume functions for Tegra SoCs + * + * Copyright (c) 2009-2012, NVIDIA Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/kernel.h> +#include <linux/spinlock.h> +#include <linux/io.h> +#include <linux/cpumask.h> +#include <linux/delay.h> +#include <linux/cpu_pm.h> +#include <linux/clk.h> +#include <linux/err.h> + +#include <asm/smp_plat.h> +#include <asm/cacheflush.h> +#include <asm/suspend.h> +#include <asm/idmap.h> +#include <asm/proc-fns.h> +#include <asm/tlbflush.h> + +#include "iomap.h" +#include "reset.h" +#include "flowctrl.h" +#include "sleep.h" +#include "tegra_cpu_car.h" + +#define TEGRA_POWER_CPU_PWRREQ_OE	(1 << 16)  /* CPU pwr req enable */ + +#define PMC_CTRL		0x0 +#define PMC_CPUPWRGOOD_TIMER	0xc8 +#define PMC_CPUPWROFF_TIMER	0xcc + +#ifdef CONFIG_PM_SLEEP +static unsigned int g_diag_reg; +static DEFINE_SPINLOCK(tegra_lp2_lock); +static void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE); +static struct clk *tegra_pclk; +void (*tegra_tear_down_cpu)(void); + +void save_cpu_arch_register(void) +{ +	/* read diagnostic register */ +	asm("mrc p15, 0, %0, c15, c0, 1" : "=r"(g_diag_reg) : : "cc"); +	return; +} + +void restore_cpu_arch_register(void) +{ +	/* write diagnostic register */ +	asm("mcr p15, 0, %0, c15, c0, 1" : : "r"(g_diag_reg) : "cc"); +	return; +} + +static void set_power_timers(unsigned long us_on, unsigned long us_off) +{ +	unsigned long long ticks; +	unsigned long long pclk; +	unsigned long rate; +	static unsigned long tegra_last_pclk; + +	if (tegra_pclk == NULL) { +		tegra_pclk = clk_get_sys(NULL, "pclk"); +		WARN_ON(IS_ERR(tegra_pclk)); +	} + +	rate = clk_get_rate(tegra_pclk); + +	if (WARN_ON_ONCE(rate <= 0)) +		pclk = 100000000; +	else +		pclk = rate; + +	if ((rate != tegra_last_pclk)) { +		ticks = (us_on * pclk) + 999999ull; +		do_div(ticks, 1000000); +		writel((unsigned long)ticks, pmc + PMC_CPUPWRGOOD_TIMER); + +		ticks = (us_off * pclk) + 999999ull; +		do_div(ticks, 1000000); +		writel((unsigned long)ticks, pmc + PMC_CPUPWROFF_TIMER); +		wmb(); +	} +	tegra_last_pclk = pclk; +} + +/* + * restore_cpu_complex + * + * restores cpu clock setting, clears flow controller + * + * Always called on CPU 0. + */ +static void restore_cpu_complex(void) +{ +	int cpu = smp_processor_id(); + +	BUG_ON(cpu != 0); + +#ifdef CONFIG_SMP +	cpu = cpu_logical_map(cpu); +#endif + +	/* Restore the CPU clock settings */ +	tegra_cpu_clock_resume(); + +	flowctrl_cpu_suspend_exit(cpu); + +	restore_cpu_arch_register(); +} + +/* + * suspend_cpu_complex + * + * saves pll state for use by restart_plls, prepares flow controller for + * transition to suspend state + * + * Must always be called on cpu 0. + */ +static void suspend_cpu_complex(void) +{ +	int cpu = smp_processor_id(); + +	BUG_ON(cpu != 0); + +#ifdef CONFIG_SMP +	cpu = cpu_logical_map(cpu); +#endif + +	/* Save the CPU clock settings */ +	tegra_cpu_clock_suspend(); + +	flowctrl_cpu_suspend_enter(cpu); + +	save_cpu_arch_register(); +} + +void __cpuinit tegra_clear_cpu_in_lp2(int phy_cpu_id) +{ +	u32 *cpu_in_lp2 = tegra_cpu_lp2_mask; + +	spin_lock(&tegra_lp2_lock); + +	BUG_ON(!(*cpu_in_lp2 & BIT(phy_cpu_id))); +	*cpu_in_lp2 &= ~BIT(phy_cpu_id); + +	spin_unlock(&tegra_lp2_lock); +} + +bool __cpuinit tegra_set_cpu_in_lp2(int phy_cpu_id) +{ +	bool last_cpu = false; +	cpumask_t *cpu_lp2_mask = tegra_cpu_lp2_mask; +	u32 *cpu_in_lp2 = tegra_cpu_lp2_mask; + +	spin_lock(&tegra_lp2_lock); + +	BUG_ON((*cpu_in_lp2 & BIT(phy_cpu_id))); +	*cpu_in_lp2 |= BIT(phy_cpu_id); + +	if ((phy_cpu_id == 0) && cpumask_equal(cpu_lp2_mask, cpu_online_mask)) +		last_cpu = true; + +	spin_unlock(&tegra_lp2_lock); +	return last_cpu; +} + +static int tegra_sleep_cpu(unsigned long v2p) +{ +	/* Switch to the identity mapping. */ +	cpu_switch_mm(idmap_pgd, &init_mm); + +	/* Flush the TLB. */ +	local_flush_tlb_all(); + +	tegra_sleep_cpu_finish(v2p); + +	/* should never here */ +	BUG(); + +	return 0; +} + +void tegra_idle_lp2_last(u32 cpu_on_time, u32 cpu_off_time) +{ +	u32 mode; + +	/* Only the last cpu down does the final suspend steps */ +	mode = readl(pmc + PMC_CTRL); +	mode |= TEGRA_POWER_CPU_PWRREQ_OE; +	writel(mode, pmc + PMC_CTRL); + +	set_power_timers(cpu_on_time, cpu_off_time); + +	cpu_cluster_pm_enter(); +	suspend_cpu_complex(); + +	cpu_suspend(PHYS_OFFSET - PAGE_OFFSET, &tegra_sleep_cpu); + +	restore_cpu_complex(); +	cpu_cluster_pm_exit(); +} +#endif diff --git a/arch/arm/mach-tegra/pm.h b/arch/arm/mach-tegra/pm.h new file mode 100644 index 00000000000..787335cc964 --- /dev/null +++ b/arch/arm/mach-tegra/pm.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2010 Google, Inc. + * Copyright (c) 2010-2012 NVIDIA Corporation. All rights reserved. + * + * Author: + *	Colin Cross <ccross@google.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef _MACH_TEGRA_PM_H_ +#define _MACH_TEGRA_PM_H_ + +extern unsigned long l2x0_saved_regs_addr; + +void save_cpu_arch_register(void); +void restore_cpu_arch_register(void); + +void tegra_clear_cpu_in_lp2(int phy_cpu_id); +bool tegra_set_cpu_in_lp2(int phy_cpu_id); + +void tegra_idle_lp2_last(u32 cpu_on_time, u32 cpu_off_time); +extern void (*tegra_tear_down_cpu)(void); + +#endif /* _MACH_TEGRA_PM_H_ */ diff --git a/arch/arm/mach-tegra/reset.c b/arch/arm/mach-tegra/reset.c index e05da7d10c3..3fd89ecd158 100644 --- a/arch/arm/mach-tegra/reset.c +++ b/arch/arm/mach-tegra/reset.c @@ -25,6 +25,7 @@  #include "iomap.h"  #include "irammap.h"  #include "reset.h" +#include "sleep.h"  #include "fuse.h"  #define TEGRA_IRAM_RESET_BASE (TEGRA_IRAM_BASE + \ @@ -79,5 +80,10 @@ void __init tegra_cpu_reset_handler_init(void)  		virt_to_phys((void *)tegra_secondary_startup);  #endif +#ifdef CONFIG_PM_SLEEP +	__tegra_cpu_reset_handler_data[TEGRA_RESET_STARTUP_LP2] = +		virt_to_phys((void *)tegra_resume); +#endif +  	tegra_cpu_reset_handler_enable();  } diff --git a/arch/arm/mach-tegra/reset.h b/arch/arm/mach-tegra/reset.h index de88bf851dd..c90d8e9c4ad 100644 --- a/arch/arm/mach-tegra/reset.h +++ b/arch/arm/mach-tegra/reset.h @@ -29,6 +29,8 @@  #ifndef __ASSEMBLY__ +#include "irammap.h" +  extern unsigned long __tegra_cpu_reset_handler_data[TEGRA_RESET_DATA_SIZE];  void __tegra_cpu_reset_handler_start(void); @@ -36,6 +38,13 @@ void __tegra_cpu_reset_handler(void);  void __tegra_cpu_reset_handler_end(void);  void tegra_secondary_startup(void); +#ifdef CONFIG_PM_SLEEP +#define tegra_cpu_lp2_mask \ +	(IO_ADDRESS(TEGRA_IRAM_BASE + TEGRA_IRAM_RESET_HANDLER_OFFSET + \ +	((u32)&__tegra_cpu_reset_handler_data[TEGRA_RESET_MASK_LP2] - \ +	 (u32)__tegra_cpu_reset_handler_start))) +#endif +  #define tegra_cpu_reset_handler_offset \  		((u32)__tegra_cpu_reset_handler - \  		 (u32)__tegra_cpu_reset_handler_start) diff --git a/arch/arm/mach-tegra/sleep-t20.S b/arch/arm/mach-tegra/sleep-tegra20.S index 72ce709799d..72ce709799d 100644 --- a/arch/arm/mach-tegra/sleep-t20.S +++ b/arch/arm/mach-tegra/sleep-tegra20.S diff --git a/arch/arm/mach-tegra/sleep-t30.S b/arch/arm/mach-tegra/sleep-tegra30.S index be7614b7c5c..562a8e7e413 100644 --- a/arch/arm/mach-tegra/sleep-t30.S +++ b/arch/arm/mach-tegra/sleep-tegra30.S @@ -17,6 +17,7 @@  #include <linux/linkage.h>  #include <asm/assembler.h> +#include <asm/asm-offsets.h>  #include "sleep.h"  #include "flowctrl.h" @@ -80,6 +81,7 @@ delay_1:  	ldr	r3, [r1]			@ read CSR  	str	r3, [r1]			@ clear CSR  	tst	r0, #TEGRA30_POWER_HOTPLUG_SHUTDOWN +	moveq   r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT	@ For LP2  	movne	r3, #FLOW_CTRL_WAITEVENT		@ For hotplug  	str	r3, [r2]  	ldr	r0, [r2] @@ -103,3 +105,67 @@ wfe_war:  ENDPROC(tegra30_cpu_shutdown)  #endif + +#ifdef CONFIG_PM_SLEEP +/* + * tegra30_sleep_cpu_secondary_finish(unsigned long v2p) + * + * Enters LP2 on secondary CPU by exiting coherency and powergating the CPU. + */ +ENTRY(tegra30_sleep_cpu_secondary_finish) +	mov	r7, lr + +	/* Flush and disable the L1 data cache */ +	bl	tegra_disable_clean_inv_dcache + +	/* Powergate this CPU. */ +	mov	r0, #0                          @ power mode flags (!hotplug) +	bl	tegra30_cpu_shutdown +	mov	r0, #1                          @ never return here +	mov	pc, r7 +ENDPROC(tegra30_sleep_cpu_secondary_finish) + +/* + * tegra30_tear_down_cpu + * + * Switches the CPU to enter sleep. + */ +ENTRY(tegra30_tear_down_cpu) +	mov32	r6, TEGRA_FLOW_CTRL_BASE + +	b	tegra30_enter_sleep +ENDPROC(tegra30_tear_down_cpu) + +/* + * tegra30_enter_sleep + * + * uses flow controller to enter sleep state + * executes from IRAM with SDRAM in selfrefresh when target state is LP0 or LP1 + * executes from SDRAM with target state is LP2 + * r6 = TEGRA_FLOW_CTRL_BASE + */ +tegra30_enter_sleep: +	cpu_id	r1 + +	cpu_to_csr_reg	r2, r1 +	ldr	r0, [r6, r2] +	orr	r0, r0, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG +	orr	r0, r0, #FLOW_CTRL_CSR_ENABLE +	str	r0, [r6, r2] + +	mov	r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT +	orr	r0, r0, #FLOW_CTRL_HALT_CPU_IRQ | FLOW_CTRL_HALT_CPU_FIQ +	cpu_to_halt_reg r2, r1 +	str	r0, [r6, r2] +	dsb +	ldr	r0, [r6, r2] /* memory barrier */ + +halted: +	isb +	dsb +	wfi	/* CPU should be power gated here */ + +	/* !!!FIXME!!! Implement halt failure handler */ +	b	halted + +#endif diff --git a/arch/arm/mach-tegra/sleep.S b/arch/arm/mach-tegra/sleep.S index 08e9481c049..26afa7cbed1 100644 --- a/arch/arm/mach-tegra/sleep.S +++ b/arch/arm/mach-tegra/sleep.S @@ -25,9 +25,87 @@  #include <linux/linkage.h>  #include <asm/assembler.h> +#include <asm/cache.h> +#include <asm/cp15.h> +#include <asm/hardware/cache-l2x0.h>  #include "iomap.h"  #include "flowctrl.h"  #include "sleep.h" +#ifdef CONFIG_PM_SLEEP +/* + * tegra_disable_clean_inv_dcache + * + * disable, clean & invalidate the D-cache + * + * Corrupted registers: r1-r3, r6, r8, r9-r11 + */ +ENTRY(tegra_disable_clean_inv_dcache) +	stmfd	sp!, {r0, r4-r5, r7, r9-r11, lr} +	dmb					@ ensure ordering + +	/* Disable the D-cache */ +	mrc	p15, 0, r2, c1, c0, 0 +	bic	r2, r2, #CR_C +	mcr	p15, 0, r2, c1, c0, 0 +	isb + +	/* Flush the D-cache */ +	bl	v7_flush_dcache_louis + +	/* Trun off coherency */ +	exit_smp r4, r5 + +	ldmfd	sp!, {r0, r4-r5, r7, r9-r11, pc} +ENDPROC(tegra_disable_clean_inv_dcache) + +/* + * tegra_sleep_cpu_finish(unsigned long v2p) + * + * enters suspend in LP2 by turning off the mmu and jumping to + * tegra?_tear_down_cpu + */ +ENTRY(tegra_sleep_cpu_finish) +	/* Flush and disable the L1 data cache */ +	bl	tegra_disable_clean_inv_dcache + +	mov32	r6, tegra_tear_down_cpu +	ldr	r1, [r6] +	add	r1, r1, r0 + +	mov32	r3, tegra_shut_off_mmu +	add	r3, r3, r0 +	mov	r0, r1 + +	mov	pc, r3 +ENDPROC(tegra_sleep_cpu_finish) + +/* + * tegra_shut_off_mmu + * + * r0 = physical address to jump to with mmu off + * + * called with VA=PA mapping + * turns off MMU, icache, dcache and branch prediction + */ +	.align	L1_CACHE_SHIFT +	.pushsection	.idmap.text, "ax" +ENTRY(tegra_shut_off_mmu) +	mrc	p15, 0, r3, c1, c0, 0 +	movw	r2, #CR_I | CR_Z | CR_C | CR_M +	bic	r3, r3, r2 +	dsb +	mcr	p15, 0, r3, c1, c0, 0 +	isb +#ifdef CONFIG_CACHE_L2X0 +	/* Disable L2 cache */ +	mov32	r4, TEGRA_ARM_PERIF_BASE + 0x3000 +	mov	r5, #0 +	str	r5, [r4, #L2X0_CTRL] +#endif +	mov	pc, r0 +ENDPROC(tegra_shut_off_mmu) +	.popsection +#endif diff --git a/arch/arm/mach-tegra/sleep.h b/arch/arm/mach-tegra/sleep.h index 4889b281c5f..9821ee72542 100644 --- a/arch/arm/mach-tegra/sleep.h +++ b/arch/arm/mach-tegra/sleep.h @@ -71,7 +71,41 @@  	str	\tmp2, [\tmp1]			@ invalidate SCU tags for CPU  	dsb  .endm + +/* Macro to resume & re-enable L2 cache */ +#ifndef L2X0_CTRL_EN +#define L2X0_CTRL_EN	1 +#endif + +#ifdef CONFIG_CACHE_L2X0 +.macro l2_cache_resume, tmp1, tmp2, tmp3, phys_l2x0_saved_regs +	adr	\tmp1, \phys_l2x0_saved_regs +	ldr	\tmp1, [\tmp1] +	ldr	\tmp2, [\tmp1, #L2X0_R_PHY_BASE] +	ldr	\tmp3, [\tmp2, #L2X0_CTRL] +	tst	\tmp3, #L2X0_CTRL_EN +	bne	exit_l2_resume +	ldr	\tmp3, [\tmp1, #L2X0_R_TAG_LATENCY] +	str	\tmp3, [\tmp2, #L2X0_TAG_LATENCY_CTRL] +	ldr	\tmp3, [\tmp1, #L2X0_R_DATA_LATENCY] +	str	\tmp3, [\tmp2, #L2X0_DATA_LATENCY_CTRL] +	ldr	\tmp3, [\tmp1, #L2X0_R_PREFETCH_CTRL] +	str	\tmp3, [\tmp2, #L2X0_PREFETCH_CTRL] +	ldr	\tmp3, [\tmp1, #L2X0_R_PWR_CTRL] +	str	\tmp3, [\tmp2, #L2X0_POWER_CTRL] +	ldr	\tmp3, [\tmp1, #L2X0_R_AUX_CTRL] +	str	\tmp3, [\tmp2, #L2X0_AUX_CTRL] +	mov	\tmp3, #L2X0_CTRL_EN +	str	\tmp3, [\tmp2, #L2X0_CTRL] +exit_l2_resume: +.endm +#else /* CONFIG_CACHE_L2X0 */ +.macro l2_cache_resume, tmp1, tmp2, tmp3, phys_l2x0_saved_regs +.endm +#endif /* CONFIG_CACHE_L2X0 */  #else +void tegra_resume(void); +int tegra_sleep_cpu_finish(unsigned long);  #ifdef CONFIG_HOTPLUG_CPU  void tegra20_hotplug_init(void); @@ -81,5 +115,8 @@ static inline void tegra20_hotplug_init(void) {}  static inline void tegra30_hotplug_init(void) {}  #endif +int tegra30_sleep_cpu_secondary_finish(unsigned long); +void tegra30_tear_down_cpu(void); +  #endif  #endif diff --git a/arch/arm/mach-tegra/tegra30_clocks.c b/arch/arm/mach-tegra/tegra30_clocks.c index f5b453f4bf4..efc000e32e1 100644 --- a/arch/arm/mach-tegra/tegra30_clocks.c +++ b/arch/arm/mach-tegra/tegra30_clocks.c @@ -31,6 +31,8 @@  #include <asm/clkdev.h> +#include <mach/powergate.h> +  #include "clock.h"  #include "fuse.h"  #include "iomap.h" @@ -309,6 +311,31 @@  #define CPU_CLOCK(cpu)	(0x1 << (8 + cpu))  #define CPU_RESET(cpu)	(0x1111ul << (cpu)) +#define CLK_RESET_CCLK_BURST	0x20 +#define CLK_RESET_CCLK_DIVIDER  0x24 +#define CLK_RESET_PLLX_BASE	0xe0 +#define CLK_RESET_PLLX_MISC	0xe4 + +#define CLK_RESET_SOURCE_CSITE	0x1d4 + +#define CLK_RESET_CCLK_BURST_POLICY_SHIFT	28 +#define CLK_RESET_CCLK_RUN_POLICY_SHIFT		4 +#define CLK_RESET_CCLK_IDLE_POLICY_SHIFT	0 +#define CLK_RESET_CCLK_IDLE_POLICY		1 +#define CLK_RESET_CCLK_RUN_POLICY		2 +#define CLK_RESET_CCLK_BURST_POLICY_PLLX	8 + +#ifdef CONFIG_PM_SLEEP +static struct cpu_clk_suspend_context { +	u32 pllx_misc; +	u32 pllx_base; + +	u32 cpu_burst; +	u32 clk_csite_src; +	u32 cclk_divider; +} tegra30_cpu_clk_sctx; +#endif +  /**  * Structure defining the fields for USB UTMI clocks Parameters.  */ @@ -2386,12 +2413,93 @@ static void tegra30_disable_cpu_clock(u32 cpu)  	       reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);  } +#ifdef CONFIG_PM_SLEEP +static bool tegra30_cpu_rail_off_ready(void) +{ +	unsigned int cpu_rst_status; +	int cpu_pwr_status; + +	cpu_rst_status = readl(reg_clk_base + +			       TEGRA30_CLK_RST_CONTROLLER_CPU_CMPLX_STATUS); +	cpu_pwr_status = tegra_powergate_is_powered(TEGRA_POWERGATE_CPU1) || +			 tegra_powergate_is_powered(TEGRA_POWERGATE_CPU2) || +			 tegra_powergate_is_powered(TEGRA_POWERGATE_CPU3); + +	if (((cpu_rst_status & 0xE) != 0xE) || cpu_pwr_status) +		return false; + +	return true; +} + +static void tegra30_cpu_clock_suspend(void) +{ +	/* switch coresite to clk_m, save off original source */ +	tegra30_cpu_clk_sctx.clk_csite_src = +				readl(reg_clk_base + CLK_RESET_SOURCE_CSITE); +	writel(3<<30, reg_clk_base + CLK_RESET_SOURCE_CSITE); + +	tegra30_cpu_clk_sctx.cpu_burst = +				readl(reg_clk_base + CLK_RESET_CCLK_BURST); +	tegra30_cpu_clk_sctx.pllx_base = +				readl(reg_clk_base + CLK_RESET_PLLX_BASE); +	tegra30_cpu_clk_sctx.pllx_misc = +				readl(reg_clk_base + CLK_RESET_PLLX_MISC); +	tegra30_cpu_clk_sctx.cclk_divider = +				readl(reg_clk_base + CLK_RESET_CCLK_DIVIDER); +} + +static void tegra30_cpu_clock_resume(void) +{ +	unsigned int reg, policy; + +	/* Is CPU complex already running on PLLX? */ +	reg = readl(reg_clk_base + CLK_RESET_CCLK_BURST); +	policy = (reg >> CLK_RESET_CCLK_BURST_POLICY_SHIFT) & 0xF; + +	if (policy == CLK_RESET_CCLK_IDLE_POLICY) +		reg = (reg >> CLK_RESET_CCLK_IDLE_POLICY_SHIFT) & 0xF; +	else if (policy == CLK_RESET_CCLK_RUN_POLICY) +		reg = (reg >> CLK_RESET_CCLK_RUN_POLICY_SHIFT) & 0xF; +	else +		BUG(); + +	if (reg != CLK_RESET_CCLK_BURST_POLICY_PLLX) { +		/* restore PLLX settings if CPU is on different PLL */ +		writel(tegra30_cpu_clk_sctx.pllx_misc, +					reg_clk_base + CLK_RESET_PLLX_MISC); +		writel(tegra30_cpu_clk_sctx.pllx_base, +					reg_clk_base + CLK_RESET_PLLX_BASE); + +		/* wait for PLL stabilization if PLLX was enabled */ +		if (tegra30_cpu_clk_sctx.pllx_base & (1 << 30)) +			udelay(300); +	} + +	/* +	 * Restore original burst policy setting for calls resulting from CPU +	 * LP2 in idle or system suspend. +	 */ +	writel(tegra30_cpu_clk_sctx.cclk_divider, +					reg_clk_base + CLK_RESET_CCLK_DIVIDER); +	writel(tegra30_cpu_clk_sctx.cpu_burst, +					reg_clk_base + CLK_RESET_CCLK_BURST); + +	writel(tegra30_cpu_clk_sctx.clk_csite_src, +					reg_clk_base + CLK_RESET_SOURCE_CSITE); +} +#endif +  static struct tegra_cpu_car_ops tegra30_cpu_car_ops = {  	.wait_for_reset	= tegra30_wait_cpu_in_reset,  	.put_in_reset	= tegra30_put_cpu_in_reset,  	.out_of_reset	= tegra30_cpu_out_of_reset,  	.enable_clock	= tegra30_enable_cpu_clock,  	.disable_clock	= tegra30_disable_cpu_clock, +#ifdef CONFIG_PM_SLEEP +	.rail_off_ready	= tegra30_cpu_rail_off_ready, +	.suspend	= tegra30_cpu_clock_suspend, +	.resume		= tegra30_cpu_clock_resume, +#endif  };  void __init tegra30_cpu_car_ops_init(void) diff --git a/arch/arm/mach-tegra/tegra_cpu_car.h b/arch/arm/mach-tegra/tegra_cpu_car.h index 30d063ad2be..9764d31032b 100644 --- a/arch/arm/mach-tegra/tegra_cpu_car.h +++ b/arch/arm/mach-tegra/tegra_cpu_car.h @@ -30,6 +30,12 @@   *	CPU clock un-gate   * disable_clock:   *	CPU clock gate + * rail_off_ready: + *	CPU is ready for rail off + * suspend: + *	save the clock settings when CPU go into low-power state + * resume: + *	restore the clock settings when CPU exit low-power state   */  struct tegra_cpu_car_ops {  	void (*wait_for_reset)(u32 cpu); @@ -37,6 +43,11 @@ struct tegra_cpu_car_ops {  	void (*out_of_reset)(u32 cpu);  	void (*enable_clock)(u32 cpu);  	void (*disable_clock)(u32 cpu); +#ifdef CONFIG_PM_SLEEP +	bool (*rail_off_ready)(void); +	void (*suspend)(void); +	void (*resume)(void); +#endif  };  extern struct tegra_cpu_car_ops *tegra_cpu_car_ops; @@ -81,6 +92,32 @@ static inline void tegra_disable_cpu_clock(u32 cpu)  	tegra_cpu_car_ops->disable_clock(cpu);  } +#ifdef CONFIG_PM_SLEEP +static inline bool tegra_cpu_rail_off_ready(void) +{ +	if (WARN_ON(!tegra_cpu_car_ops->rail_off_ready)) +		return false; + +	return tegra_cpu_car_ops->rail_off_ready(); +} + +static inline void tegra_cpu_clock_suspend(void) +{ +	if (WARN_ON(!tegra_cpu_car_ops->suspend)) +		return; + +	tegra_cpu_car_ops->suspend(); +} + +static inline void tegra_cpu_clock_resume(void) +{ +	if (WARN_ON(!tegra_cpu_car_ops->resume)) +		return; + +	tegra_cpu_car_ops->resume(); +} +#endif +  void tegra20_cpu_car_ops_init(void);  void tegra30_cpu_car_ops_init(void); diff --git a/arch/arm/mach-tegra/timer.c b/arch/arm/mach-tegra/timer.c index 6ff50353651..e4863f3e9ee 100644 --- a/arch/arm/mach-tegra/timer.c +++ b/arch/arm/mach-tegra/timer.c @@ -26,16 +26,14 @@  #include <linux/clocksource.h>  #include <linux/clk.h>  #include <linux/io.h> +#include <linux/of_address.h> +#include <linux/of_irq.h>  #include <asm/mach/time.h>  #include <asm/smp_twd.h>  #include <asm/sched_clock.h> -#include <mach/irqs.h> -  #include "board.h" -#include "clock.h" -#include "iomap.h"  #define RTC_SECONDS            0x08  #define RTC_SHADOW_SECONDS     0x0c @@ -53,8 +51,8 @@  #define TIMER_PTV 0x0  #define TIMER_PCR 0x4 -static void __iomem *timer_reg_base = IO_ADDRESS(TEGRA_TMR1_BASE); -static void __iomem *rtc_base = IO_ADDRESS(TEGRA_RTC_BASE); +static void __iomem *timer_reg_base; +static void __iomem *rtc_base;  static struct timespec persistent_ts;  static u64 persistent_ms, last_persistent_ms; @@ -158,40 +156,66 @@ static struct irqaction tegra_timer_irq = {  	.flags		= IRQF_DISABLED | IRQF_TIMER | IRQF_TRIGGER_HIGH,  	.handler	= tegra_timer_interrupt,  	.dev_id		= &tegra_clockevent, -	.irq		= INT_TMR3,  }; -#ifdef CONFIG_HAVE_ARM_TWD -static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, -			      TEGRA_ARM_PERIF_BASE + 0x600, -			      IRQ_LOCALTIMER); +static const struct of_device_id timer_match[] __initconst = { +	{ .compatible = "nvidia,tegra20-timer" }, +	{} +}; -static void __init tegra_twd_init(void) -{ -	int err = twd_local_timer_register(&twd_local_timer); -	if (err) -		pr_err("twd_local_timer_register failed %d\n", err); -} -#else -#define tegra_twd_init()	do {} while(0) -#endif +static const struct of_device_id rtc_match[] __initconst = { +	{ .compatible = "nvidia,tegra20-rtc" }, +	{} +};  static void __init tegra_init_timer(void)  { +	struct device_node *np;  	struct clk *clk;  	unsigned long rate;  	int ret; +	np = of_find_matching_node(NULL, timer_match); +	if (!np) { +		pr_err("Failed to find timer DT node\n"); +		BUG(); +	} + +	timer_reg_base = of_iomap(np, 0); +	if (!timer_reg_base) { +		pr_err("Can't map timer registers"); +		BUG(); +	} + +	tegra_timer_irq.irq = irq_of_parse_and_map(np, 2); +	if (tegra_timer_irq.irq <= 0) { +		pr_err("Failed to map timer IRQ\n"); +		BUG(); +	} +  	clk = clk_get_sys("timer", NULL);  	if (IS_ERR(clk)) { -		pr_warn("Unable to get timer clock." -			" Assuming 12Mhz input clock.\n"); +		pr_warn("Unable to get timer clock. Assuming 12Mhz input clock.\n");  		rate = 12000000;  	} else {  		clk_prepare_enable(clk);  		rate = clk_get_rate(clk);  	} +	of_node_put(np); + +	np = of_find_matching_node(NULL, rtc_match); +	if (!np) { +		pr_err("Failed to find RTC DT node\n"); +		BUG(); +	} + +	rtc_base = of_iomap(np, 0); +	if (!rtc_base) { +		pr_err("Can't map RTC registers"); +		BUG(); +	} +  	/*  	 * rtc registers are used by read_persistent_clock, keep the rtc clock  	 * enabled @@ -202,6 +226,8 @@ static void __init tegra_init_timer(void)  	else  		clk_prepare_enable(clk); +	of_node_put(np); +  	switch (rate) {  	case 12000000:  		timer_writel(0x000b, TIMERUS_USEC_CFG); @@ -223,13 +249,13 @@ static void __init tegra_init_timer(void)  	if (clocksource_mmio_init(timer_reg_base + TIMERUS_CNTR_1US,  		"timer_us", 1000000, 300, 32, clocksource_mmio_readl_up)) { -		printk(KERN_ERR "Failed to register clocksource\n"); +		pr_err("Failed to register clocksource\n");  		BUG();  	}  	ret = setup_irq(tegra_timer_irq.irq, &tegra_timer_irq);  	if (ret) { -		printk(KERN_ERR "Failed to register timer IRQ: %d\n", ret); +		pr_err("Failed to register timer IRQ: %d\n", ret);  		BUG();  	} @@ -241,7 +267,9 @@ static void __init tegra_init_timer(void)  	tegra_clockevent.cpumask = cpu_all_mask;  	tegra_clockevent.irq = tegra_timer_irq.irq;  	clockevents_register_device(&tegra_clockevent); -	tegra_twd_init(); +#ifdef CONFIG_HAVE_ARM_TWD +	twd_local_timer_of_register(); +#endif  	register_persistent_clock(NULL, tegra_read_persistent_clock);  } diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c index d8632ebb1ea..12f3994c43d 100644 --- a/arch/arm/mach-u300/core.c +++ b/arch/arm/mach-u300/core.c @@ -1443,8 +1443,6 @@ static struct platform_device pinctrl_device = {  static struct u300_gpio_platform u300_gpio_plat = {  	.ports = 7,  	.gpio_base = 0, -	.gpio_irq_base = IRQ_U300_GPIO_BASE, -	.pinctrl_device = &pinctrl_device,  };  static struct platform_device gpio_device = { @@ -1588,6 +1586,7 @@ static struct platform_device *platform_devs[] __initdata = {  	&i2c1_device,  	&keypad_device,  	&rtc_device, +	&pinctrl_device,  	&gpio_device,  	&nand_device,  	&wdog_device, @@ -1802,7 +1801,7 @@ MACHINE_START(U300, "Ericsson AB U335 S335/B335 Prototype Board")  	/* Maintainer: Linus Walleij <linus.walleij@stericsson.com> */  	.atag_offset	= 0x100,  	.map_io		= u300_map_io, -	.nr_irqs	= NR_IRQS_U300, +	.nr_irqs	= 0,  	.init_irq	= u300_init_irq,  	.handle_irq	= vic_handle_irq,  	.timer		= &u300_timer, diff --git a/arch/arm/mach-u300/include/mach/irqs.h b/arch/arm/mach-u300/include/mach/irqs.h index e27425a63fa..21d5e76a6cd 100644 --- a/arch/arm/mach-u300/include/mach/irqs.h +++ b/arch/arm/mach-u300/include/mach/irqs.h @@ -12,79 +12,69 @@  #ifndef __MACH_IRQS_H  #define __MACH_IRQS_H -#define IRQ_U300_INTCON0_START		1 -#define IRQ_U300_INTCON1_START		33 +#define IRQ_U300_INTCON0_START		32 +#define IRQ_U300_INTCON1_START		64  /* These are on INTCON0 - 30 lines */ -#define IRQ_U300_IRQ0_EXT		1 -#define IRQ_U300_IRQ1_EXT		2 -#define IRQ_U300_DMA			3 -#define IRQ_U300_VIDEO_ENC_0		4 -#define IRQ_U300_VIDEO_ENC_1		5 -#define IRQ_U300_AAIF_RX		6 -#define IRQ_U300_AAIF_TX		7 -#define IRQ_U300_AAIF_VGPIO		8 -#define IRQ_U300_AAIF_WAKEUP		9 -#define IRQ_U300_PCM_I2S0_FRAME		10 -#define IRQ_U300_PCM_I2S0_FIFO		11 -#define IRQ_U300_PCM_I2S1_FRAME		12 -#define IRQ_U300_PCM_I2S1_FIFO		13 -#define IRQ_U300_XGAM_GAMCON		14 -#define IRQ_U300_XGAM_CDI		15 -#define IRQ_U300_XGAM_CDICON		16 -#define IRQ_U300_XGAM_PDI		18 -#define IRQ_U300_XGAM_PDICON		19 -#define IRQ_U300_XGAM_GAMEACC		20 -#define IRQ_U300_XGAM_MCIDCT		21 -#define IRQ_U300_APEX			22 -#define IRQ_U300_UART0			23 -#define IRQ_U300_SPI			24 -#define IRQ_U300_TIMER_APP_OS		25 -#define IRQ_U300_TIMER_APP_DD		26 -#define IRQ_U300_TIMER_APP_GP1		27 -#define IRQ_U300_TIMER_APP_GP2		28 -#define IRQ_U300_TIMER_OS		29 -#define IRQ_U300_TIMER_MS		30 -#define IRQ_U300_KEYPAD_KEYBF		31 -#define IRQ_U300_KEYPAD_KEYBR		32 +#define IRQ_U300_IRQ0_EXT		32 +#define IRQ_U300_IRQ1_EXT		33 +#define IRQ_U300_DMA			34 +#define IRQ_U300_VIDEO_ENC_0		35 +#define IRQ_U300_VIDEO_ENC_1		36 +#define IRQ_U300_AAIF_RX		37 +#define IRQ_U300_AAIF_TX		38 +#define IRQ_U300_AAIF_VGPIO		39 +#define IRQ_U300_AAIF_WAKEUP		40 +#define IRQ_U300_PCM_I2S0_FRAME		41 +#define IRQ_U300_PCM_I2S0_FIFO		42 +#define IRQ_U300_PCM_I2S1_FRAME		43 +#define IRQ_U300_PCM_I2S1_FIFO		44 +#define IRQ_U300_XGAM_GAMCON		45 +#define IRQ_U300_XGAM_CDI		46 +#define IRQ_U300_XGAM_CDICON		47 +#define IRQ_U300_XGAM_PDI		49 +#define IRQ_U300_XGAM_PDICON		50 +#define IRQ_U300_XGAM_GAMEACC		51 +#define IRQ_U300_XGAM_MCIDCT		52 +#define IRQ_U300_APEX			53 +#define IRQ_U300_UART0			54 +#define IRQ_U300_SPI			55 +#define IRQ_U300_TIMER_APP_OS		56 +#define IRQ_U300_TIMER_APP_DD		57 +#define IRQ_U300_TIMER_APP_GP1		58 +#define IRQ_U300_TIMER_APP_GP2		59 +#define IRQ_U300_TIMER_OS		60 +#define IRQ_U300_TIMER_MS		61 +#define IRQ_U300_KEYPAD_KEYBF		62 +#define IRQ_U300_KEYPAD_KEYBR		63  /* These are on INTCON1 - 32 lines */ -#define IRQ_U300_GPIO_PORT0		33 -#define IRQ_U300_GPIO_PORT1		34 -#define IRQ_U300_GPIO_PORT2		35 +#define IRQ_U300_GPIO_PORT0		64 +#define IRQ_U300_GPIO_PORT1		65 +#define IRQ_U300_GPIO_PORT2		66  /* These are for DB3150, DB3200 and DB3350 */ -#define IRQ_U300_WDOG			36 -#define IRQ_U300_EVHIST			37 -#define IRQ_U300_MSPRO			38 -#define IRQ_U300_MMCSD_MCIINTR0		39 -#define IRQ_U300_MMCSD_MCIINTR1		40 -#define IRQ_U300_I2C0			41 -#define IRQ_U300_I2C1			42 -#define IRQ_U300_RTC			43 -#define IRQ_U300_NFIF			44 -#define IRQ_U300_NFIF2			45 +#define IRQ_U300_WDOG			67 +#define IRQ_U300_EVHIST			68 +#define IRQ_U300_MSPRO			69 +#define IRQ_U300_MMCSD_MCIINTR0		70 +#define IRQ_U300_MMCSD_MCIINTR1		71 +#define IRQ_U300_I2C0			72 +#define IRQ_U300_I2C1			73 +#define IRQ_U300_RTC			74 +#define IRQ_U300_NFIF			75 +#define IRQ_U300_NFIF2			76  /* The DB3350-specific interrupt lines */ -#define IRQ_U300_ISP_F0			46 -#define IRQ_U300_ISP_F1			47 -#define IRQ_U300_ISP_F2			48 -#define IRQ_U300_ISP_F3			49 -#define IRQ_U300_ISP_F4			50 -#define IRQ_U300_GPIO_PORT3		51 -#define IRQ_U300_SYSCON_PLL_LOCK	52 -#define IRQ_U300_UART1			53 -#define IRQ_U300_GPIO_PORT4		54 -#define IRQ_U300_GPIO_PORT5		55 -#define IRQ_U300_GPIO_PORT6		56 -#define U300_VIC_IRQS_END		57 - -/* Maximum 8*7 GPIO lines */ -#ifdef CONFIG_PINCTRL_COH901 -#define IRQ_U300_GPIO_BASE		(U300_VIC_IRQS_END) -#define IRQ_U300_GPIO_END		(IRQ_U300_GPIO_BASE + 56) -#else -#define IRQ_U300_GPIO_END		(U300_VIC_IRQS_END) -#endif - -#define NR_IRQS_U300			(IRQ_U300_GPIO_END - IRQ_U300_INTCON0_START) +#define IRQ_U300_ISP_F0			77 +#define IRQ_U300_ISP_F1			78 +#define IRQ_U300_ISP_F2			79 +#define IRQ_U300_ISP_F3			80 +#define IRQ_U300_ISP_F4			81 +#define IRQ_U300_GPIO_PORT3		82 +#define IRQ_U300_SYSCON_PLL_LOCK	83 +#define IRQ_U300_UART1			84 +#define IRQ_U300_GPIO_PORT4		85 +#define IRQ_U300_GPIO_PORT5		86 +#define IRQ_U300_GPIO_PORT6		87 +#define U300_VIC_IRQS_END		88  #endif diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index e8c3f0d70ca..5dea90636d9 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig @@ -7,8 +7,8 @@ config UX500_SOC_COMMON  	select ARM_ERRATA_764369 if SMP  	select ARM_GIC  	select CACHE_L2X0 +	select CLKSRC_NOMADIK_MTU  	select COMMON_CLK -	select HAS_MTU  	select PINCTRL  	select PINCTRL_NOMADIK  	select PL310_ERRATA_753970 if CACHE_PL310 diff --git a/arch/arm/mach-ux500/board-mop500-audio.c b/arch/arm/mach-ux500/board-mop500-audio.c index 7adbed5df8a..7209db7cdc7 100644 --- a/arch/arm/mach-ux500/board-mop500-audio.c +++ b/arch/arm/mach-ux500/board-mop500-audio.c @@ -7,10 +7,8 @@  #include <linux/platform_device.h>  #include <linux/init.h>  #include <linux/gpio.h> - -#include <plat/gpio-nomadik.h> -#include <plat/pincfg.h> -#include <plat/ste_dma40.h> +#include <linux/platform_data/pinctrl-nomadik.h> +#include <linux/platform_data/dma-ste-dma40.h>  #include <mach/devices.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-ux500/board-mop500-pins.c b/arch/arm/mach-ux500/board-mop500-pins.c index a267c6d30e3..c34d4efd0d5 100644 --- a/arch/arm/mach-ux500/board-mop500-pins.c +++ b/arch/arm/mach-ux500/board-mop500-pins.c @@ -9,10 +9,9 @@  #include <linux/bug.h>  #include <linux/string.h>  #include <linux/pinctrl/machine.h> +#include <linux/platform_data/pinctrl-nomadik.h>  #include <asm/mach-types.h> -#include <plat/pincfg.h> -#include <plat/gpio-nomadik.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c index 9c8e4a9e83e..051b62c2710 100644 --- a/arch/arm/mach-ux500/board-mop500-sdi.c +++ b/arch/arm/mach-ux500/board-mop500-sdi.c @@ -11,9 +11,9 @@  #include <linux/amba/mmci.h>  #include <linux/mmc/host.h>  #include <linux/platform_device.h> +#include <linux/platform_data/dma-ste-dma40.h>  #include <asm/mach-types.h> -#include <plat/ste_dma40.h>  #include <mach/devices.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index daa4237ac0d..d453522edb0 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -1,6 +1,5 @@ -  /* - * Copyright (C) 2008-2009 ST-Ericsson + * Copyright (C) 2008-2012 ST-Ericsson   *   * Author: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>   * @@ -16,6 +15,7 @@  #include <linux/io.h>  #include <linux/i2c.h>  #include <linux/platform_data/i2c-nomadik.h> +#include <linux/platform_data/db8500_thermal.h>  #include <linux/gpio.h>  #include <linux/amba/bus.h>  #include <linux/amba/pl022.h> @@ -35,14 +35,13 @@  #include <linux/delay.h>  #include <linux/leds.h>  #include <linux/pinctrl/consumer.h> +#include <linux/platform_data/pinctrl-nomadik.h> +#include <linux/platform_data/dma-ste-dma40.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/hardware/gic.h> -#include <plat/ste_dma40.h> -#include <plat/gpio-nomadik.h> -  #include <mach/hardware.h>  #include <mach/setup.h>  #include <mach/devices.h> @@ -227,6 +226,67 @@ static struct ab8500_platform_data ab8500_platdata = {  };  /* + * Thermal Sensor + */ + +static struct resource db8500_thsens_resources[] = { +	{ +		.name = "IRQ_HOTMON_LOW", +		.start  = IRQ_PRCMU_HOTMON_LOW, +		.end    = IRQ_PRCMU_HOTMON_LOW, +		.flags  = IORESOURCE_IRQ, +	}, +	{ +		.name = "IRQ_HOTMON_HIGH", +		.start  = IRQ_PRCMU_HOTMON_HIGH, +		.end    = IRQ_PRCMU_HOTMON_HIGH, +		.flags  = IORESOURCE_IRQ, +	}, +}; + +static struct db8500_thsens_platform_data db8500_thsens_data = { +	.trip_points[0] = { +		.temp = 70000, +		.type = THERMAL_TRIP_ACTIVE, +		.cdev_name = { +			[0] = "thermal-cpufreq-0", +		}, +	}, +	.trip_points[1] = { +		.temp = 75000, +		.type = THERMAL_TRIP_ACTIVE, +		.cdev_name = { +			[0] = "thermal-cpufreq-0", +		}, +	}, +	.trip_points[2] = { +		.temp = 80000, +		.type = THERMAL_TRIP_ACTIVE, +		.cdev_name = { +			[0] = "thermal-cpufreq-0", +		}, +	}, +	.trip_points[3] = { +		.temp = 85000, +		.type = THERMAL_TRIP_CRITICAL, +	}, +	.num_trips = 4, +}; + +static struct platform_device u8500_thsens_device = { +	.name           = "db8500-thermal", +	.resource       = db8500_thsens_resources, +	.num_resources  = ARRAY_SIZE(db8500_thsens_resources), +	.dev	= { +		.platform_data	= &db8500_thsens_data, +	}, +}; + +static struct platform_device u8500_cpufreq_cooling_device = { +	.name           = "db8500-cpufreq-cooling", +}; + +/*   * TPS61052   */ @@ -581,6 +641,8 @@ static struct platform_device *snowball_platform_devs[] __initdata = {  	&snowball_key_dev,  	&snowball_sbnet_dev,  	&snowball_gpio_en_3v3_regulator_dev, +	&u8500_thsens_device, +	&u8500_cpufreq_cooling_device,  };  static void __init mop500_init_machine(void) @@ -695,6 +757,16 @@ MACHINE_START(U8500, "ST-Ericsson MOP500 platform")  	.init_late	= ux500_init_late,  MACHINE_END +MACHINE_START(U8520, "ST-Ericsson U8520 Platform HREFP520") +	.atag_offset	= 0x100, +	.map_io		= u8500_map_io, +	.init_irq	= ux500_init_irq, +	.timer		= &ux500_timer, +	.handle_irq	= gic_handle_irq, +	.init_machine	= mop500_init_machine, +	.init_late	= ux500_init_late, +MACHINE_END +  MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")  	.atag_offset	= 0x100,  	.smp		= smp_ops(ux500_smp_ops), diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 4c6ce012dae..db0bb75e2c7 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c @@ -21,17 +21,19 @@  #include <linux/of.h>  #include <linux/of_platform.h>  #include <linux/regulator/machine.h> +#include <linux/platform_data/pinctrl-nomadik.h> +#include <linux/random.h>  #include <asm/pmu.h>  #include <asm/mach/map.h>  #include <asm/mach/arch.h>  #include <asm/hardware/gic.h> -#include <plat/gpio-nomadik.h> +  #include <mach/hardware.h>  #include <mach/setup.h>  #include <mach/devices.h> -#include <linux/platform_data/usb-musb-ux500.h>  #include <mach/db8500-regs.h> +#include <mach/irqs.h>  #include "devices-db8500.h"  #include "ste-dma40-db8500.h" @@ -165,7 +167,7 @@ static void __init db8500_add_gpios(struct device *parent)  	dbx500_add_gpios(parent, ARRAY_AND_SIZE(db8500_gpio_base),  			 IRQ_DB8500_GPIO0, &pdata); -	dbx500_add_pinctrl(parent, "pinctrl-db8500"); +	dbx500_add_pinctrl(parent, "pinctrl-db8500", U8500_PRCMU_BASE);  }  static int usb_db8500_rx_dma_cfg[] = { @@ -194,6 +196,8 @@ static const char *db8500_read_soc_id(void)  {  	void __iomem *uid = __io_address(U8500_BB_UID_BASE); +	/* Throw these device-specific numbers into the entropy pool */ +	add_device_randomness(uid, 0x14);  	return kasprintf(GFP_KERNEL, "%08x%08x%08x%08x%08x",  			 readl((u32 *)uid+1),  			 readl((u32 *)uid+1), readl((u32 *)uid+2), @@ -221,9 +225,6 @@ struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500)  	db8500_add_gpios(parent);  	db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); -	platform_device_register_data(parent, -		"cpufreq-ux500", -1, NULL, 0); -  	for (i = 0; i < ARRAY_SIZE(platform_devs); i++)  		platform_devs[i]->dev.parent = parent; @@ -243,9 +244,6 @@ static struct device * __init u8500_of_init_devices(void)  	db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); -	platform_device_register_data(parent, -		"cpufreq-ux500", -1, NULL, 0); -  	u8500_dma40_device.dev.parent = parent;  	/* diff --git a/arch/arm/mach-ux500/devices-common.c b/arch/arm/mach-ux500/devices-common.c index dfdd4a54668..16b5f71e697 100644 --- a/arch/arm/mach-ux500/devices-common.c +++ b/arch/arm/mach-ux500/devices-common.c @@ -11,10 +11,10 @@  #include <linux/irq.h>  #include <linux/slab.h>  #include <linux/platform_device.h> - -#include <plat/gpio-nomadik.h> +#include <linux/platform_data/pinctrl-nomadik.h>  #include <mach/hardware.h> +#include <mach/irqs.h>  #include "devices-common.h" diff --git a/arch/arm/mach-ux500/devices-common.h b/arch/arm/mach-ux500/devices-common.h index 7fbf0ba336e..96fa4ac89e2 100644 --- a/arch/arm/mach-ux500/devices-common.h +++ b/arch/arm/mach-ux500/devices-common.h @@ -129,12 +129,18 @@ void dbx500_add_gpios(struct device *parent, resource_size_t *base, int num,  		      int irq, struct nmk_gpio_platform_data *pdata);  static inline void -dbx500_add_pinctrl(struct device *parent, const char *name) +dbx500_add_pinctrl(struct device *parent, const char *name, +		   resource_size_t base)  { +	struct resource res[] = { +		DEFINE_RES_MEM(base, SZ_8K), +	};  	struct platform_device_info pdevinfo = {  		.parent = parent,  		.name = name,  		.id = -1, +		.res = res, +		.num_res = ARRAY_SIZE(res),  	};  	platform_device_register_full(&pdevinfo); diff --git a/arch/arm/mach-ux500/devices-db8500.c b/arch/arm/mach-ux500/devices-db8500.c index 91754a8a0d4..318d4902089 100644 --- a/arch/arm/mach-ux500/devices-db8500.c +++ b/arch/arm/mach-ux500/devices-db8500.c @@ -12,11 +12,11 @@  #include <linux/gpio.h>  #include <linux/amba/bus.h>  #include <linux/amba/pl022.h> - -#include <plat/ste_dma40.h> +#include <linux/platform_data/dma-ste-dma40.h>  #include <mach/hardware.h>  #include <mach/setup.h> +#include <mach/irqs.h>  #include "ste-dma40-db8500.h" diff --git a/arch/arm/mach-ux500/devices-db8500.h b/arch/arm/mach-ux500/devices-db8500.h index 3c8010f4fb3..4b24c999265 100644 --- a/arch/arm/mach-ux500/devices-db8500.h +++ b/arch/arm/mach-ux500/devices-db8500.h @@ -8,6 +8,7 @@  #ifndef __DEVICES_DB8500_H  #define __DEVICES_DB8500_H +#include <mach/irqs.h>  #include "devices-common.h"  struct ske_keypad_platform_data; diff --git a/arch/arm/mach-ux500/include/mach/irqs.h b/arch/arm/mach-ux500/include/mach/irqs.h index e8928548b6a..fc77b4274c8 100644 --- a/arch/arm/mach-ux500/include/mach/irqs.h +++ b/arch/arm/mach-ux500/include/mach/irqs.h @@ -46,6 +46,6 @@  #include <mach/irqs-board-mop500.h>  #endif -#define NR_IRQS			IRQ_BOARD_END +#define UX500_NR_IRQS		IRQ_BOARD_END  #endif /* ASM_ARCH_IRQS_H */ diff --git a/arch/arm/mach-ux500/include/mach/msp.h b/arch/arm/mach-ux500/include/mach/msp.h index 3cc7142eee0..9991aea3d57 100644 --- a/arch/arm/mach-ux500/include/mach/msp.h +++ b/arch/arm/mach-ux500/include/mach/msp.h @@ -8,7 +8,7 @@  #ifndef __MSP_H  #define __MSP_H -#include <plat/ste_dma40.h> +#include <linux/platform_data/dma-ste-dma40.h>  enum msp_i2s_id {  	MSP_I2S_0 = 0, diff --git a/arch/arm/mach-ux500/timer.c b/arch/arm/mach-ux500/timer.c index 6f39731951b..875309acb02 100644 --- a/arch/arm/mach-ux500/timer.c +++ b/arch/arm/mach-ux500/timer.c @@ -9,11 +9,10 @@  #include <linux/clksrc-dbx500-prcmu.h>  #include <linux/of.h>  #include <linux/of_address.h> +#include <linux/platform_data/clocksource-nomadik-mtu.h>  #include <asm/smp_twd.h> -#include <plat/mtu.h> -  #include <mach/setup.h>  #include <mach/hardware.h>  #include <mach/irqs.h> @@ -96,7 +95,7 @@ dt_fail:  	 *  	 */ -	nmdk_timer_init(mtu_timer_base); +	nmdk_timer_init(mtu_timer_base, IRQ_MTU0);  	clksrc_dbx500_prcmu_init(prcmu_timer_base);  	ux500_twd_init();  } diff --git a/arch/arm/mach-ux500/usb.c b/arch/arm/mach-ux500/usb.c index 145482e7441..78ac65f62e8 100644 --- a/arch/arm/mach-ux500/usb.c +++ b/arch/arm/mach-ux500/usb.c @@ -7,10 +7,10 @@  #include <linux/platform_device.h>  #include <linux/usb/musb.h>  #include <linux/dma-mapping.h> +#include <linux/platform_data/usb-musb-ux500.h> +#include <linux/platform_data/dma-ste-dma40.h> -#include <plat/ste_dma40.h>  #include <mach/hardware.h> -#include <linux/platform_data/usb-musb-ux500.h>  #define MUSB_DMA40_RX_CH { \  		.mode = STEDMA40_MODE_LOGICAL, \ diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index 5b5c1eeb5b5..5d592945036 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c @@ -32,6 +32,7 @@  #include <linux/amba/mmci.h>  #include <linux/amba/pl022.h>  #include <linux/io.h> +#include <linux/irqchip/versatile-fpga.h>  #include <linux/gfp.h>  #include <linux/clkdev.h>  #include <linux/mtd/physmap.h> @@ -51,7 +52,6 @@  #include <asm/hardware/timer-sp.h>  #include <plat/clcd.h> -#include <plat/fpga-irq.h>  #include <plat/sched_clock.h>  #include "core.h" diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig index c9529606620..99e63f5f99d 100644 --- a/arch/arm/mach-vexpress/Kconfig +++ b/arch/arm/mach-vexpress/Kconfig @@ -1,11 +1,12 @@  config ARCH_VEXPRESS  	bool "ARM Ltd. Versatile Express family" if ARCH_MULTI_V7 -	select ARCH_WANT_OPTIONAL_GPIOLIB +	select ARCH_REQUIRE_GPIOLIB  	select ARM_AMBA  	select ARM_GIC  	select ARM_TIMER_SP804  	select CLKDEV_LOOKUP  	select COMMON_CLK +	select COMMON_CLK_VERSATILE  	select CPU_V7  	select GENERIC_CLOCKEVENTS  	select HAVE_CLK @@ -17,6 +18,7 @@ config ARCH_VEXPRESS  	select PLAT_VERSATILE  	select PLAT_VERSATILE_CLCD  	select REGULATOR_FIXED_VOLTAGE if REGULATOR +	select VEXPRESS_CONFIG  	help  	  This option enables support for systems using Cortex processor based  	  ARM core and logic (FPGA) tiles on the Versatile Express motherboard, diff --git a/arch/arm/mach-vexpress/Makefile b/arch/arm/mach-vexpress/Makefile index 42703e8b4d3..80b64971fbd 100644 --- a/arch/arm/mach-vexpress/Makefile +++ b/arch/arm/mach-vexpress/Makefile @@ -4,7 +4,7 @@  ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \  	-I$(srctree)/arch/arm/plat-versatile/include -obj-y					:= v2m.o +obj-y					:= v2m.o reset.o  obj-$(CONFIG_ARCH_VEXPRESS_CA9X4)	+= ct-ca9x4.o  obj-$(CONFIG_SMP)			+= platsmp.o  obj-$(CONFIG_HOTPLUG_CPU)		+= hotplug.o diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c index 4f471fa3e3c..60838ddb856 100644 --- a/arch/arm/mach-vexpress/ct-ca9x4.c +++ b/arch/arm/mach-vexpress/ct-ca9x4.c @@ -9,6 +9,7 @@  #include <linux/amba/bus.h>  #include <linux/amba/clcd.h>  #include <linux/clkdev.h> +#include <linux/vexpress.h>  #include <asm/hardware/arm_timer.h>  #include <asm/hardware/cache-l2x0.h> @@ -64,19 +65,6 @@ static void __init ct_ca9x4_init_irq(void)  	ca9x4_twd_init();  } -static void ct_ca9x4_clcd_enable(struct clcd_fb *fb) -{ -	u32 site = v2m_get_master_site(); - -	/* -	 * Old firmware was using the "site" component of the command -	 * to control the DVI muxer (while it should be always 0 ie. MB). -	 * Newer firmware uses the data register. Keep both for compatibility. -	 */ -	v2m_cfg_write(SYS_CFG_MUXFPGA | SYS_CFG_SITE(site), site); -	v2m_cfg_write(SYS_CFG_DVIMODE | SYS_CFG_SITE(SYS_CFG_SITE_MB), 2); -} -  static int ct_ca9x4_clcd_setup(struct clcd_fb *fb)  {  	unsigned long framesize = 1024 * 768 * 2; @@ -93,7 +81,6 @@ static struct clcd_board ct_ca9x4_clcd_data = {  	.caps		= CLCD_CAP_5551 | CLCD_CAP_565,  	.check		= clcdfb_check,  	.decode		= clcdfb_decode, -	.enable		= ct_ca9x4_clcd_enable,  	.setup		= ct_ca9x4_clcd_setup,  	.mmap		= versatile_clcd_mmap_dma,  	.remove		= versatile_clcd_remove_dma, @@ -111,14 +98,6 @@ static struct amba_device *ct_ca9x4_amba_devs[] __initdata = {  	&gpio_device,  }; - -static struct v2m_osc ct_osc1 = { -	.osc = 1, -	.rate_min = 10000000, -	.rate_max = 80000000, -	.rate_default = 23750000, -}; -  static struct resource pmu_resources[] = {  	[0] = {  		.start	= IRQ_CT_CA9X4_PMU_CPU0, @@ -149,10 +128,18 @@ static struct platform_device pmu_device = {  	.resource	= pmu_resources,  }; +static struct platform_device osc1_device = { +	.name		= "vexpress-osc", +	.id		= 1, +	.num_resources	= 1, +	.resource	= (struct resource []) { +		VEXPRESS_RES_FUNC(0xf, 1), +	}, +}; +  static void __init ct_ca9x4_init(void)  {  	int i; -	struct clk *clk;  #ifdef CONFIG_CACHE_L2X0  	void __iomem *l2x0_base = ioremap(CT_CA9X4_L2CC, SZ_4K); @@ -164,14 +151,14 @@ static void __init ct_ca9x4_init(void)  	l2x0_init(l2x0_base, 0x00400000, 0xfe0fffff);  #endif -	ct_osc1.site = v2m_get_master_site(); -	clk = v2m_osc_register("ct:osc1", &ct_osc1); -	clk_register_clkdev(clk, NULL, "ct:clcd"); -  	for (i = 0; i < ARRAY_SIZE(ct_ca9x4_amba_devs); i++)  		amba_device_register(ct_ca9x4_amba_devs[i], &iomem_resource);  	platform_device_register(&pmu_device); +	platform_device_register(&osc1_device); + +	WARN_ON(clk_register_clkdev(vexpress_osc_setup(&osc1_device.dev), +			NULL, "ct:clcd"));  }  #ifdef CONFIG_SMP diff --git a/arch/arm/mach-vexpress/include/mach/motherboard.h b/arch/arm/mach-vexpress/include/mach/motherboard.h index 1e388c7bf4d..68abc8b7278 100644 --- a/arch/arm/mach-vexpress/include/mach/motherboard.h +++ b/arch/arm/mach-vexpress/include/mach/motherboard.h @@ -1,8 +1,6 @@  #ifndef __MACH_MOTHERBOARD_H  #define __MACH_MOTHERBOARD_H -#include <linux/clk-provider.h> -  /*   * Physical addresses, offset from V2M_PA_CS0-3   */ @@ -41,31 +39,6 @@  #define V2M_CF			(V2M_PA_CS7 + 0x0001a000)  #define V2M_CLCD		(V2M_PA_CS7 + 0x0001f000) -/* - * Offsets from SYSREGS base - */ -#define V2M_SYS_ID		0x000 -#define V2M_SYS_SW		0x004 -#define V2M_SYS_LED		0x008 -#define V2M_SYS_100HZ		0x024 -#define V2M_SYS_FLAGS		0x030 -#define V2M_SYS_FLAGSSET	0x030 -#define V2M_SYS_FLAGSCLR	0x034 -#define V2M_SYS_NVFLAGS		0x038 -#define V2M_SYS_NVFLAGSSET	0x038 -#define V2M_SYS_NVFLAGSCLR	0x03c -#define V2M_SYS_MCI		0x048 -#define V2M_SYS_FLASH		0x03c -#define V2M_SYS_CFGSW		0x058 -#define V2M_SYS_24MHZ		0x05c -#define V2M_SYS_MISC		0x060 -#define V2M_SYS_DMA		0x064 -#define V2M_SYS_PROCID0		0x084 -#define V2M_SYS_PROCID1		0x088 -#define V2M_SYS_CFGDATA		0x0a0 -#define V2M_SYS_CFGCTRL		0x0a4 -#define V2M_SYS_CFGSTAT		0x0a8 -  /*   * Interrupts.  Those in {} are for AMBA devices @@ -91,43 +64,6 @@  /* - * Configuration - */ -#define SYS_CFG_START		(1 << 31) -#define SYS_CFG_WRITE		(1 << 30) -#define SYS_CFG_OSC		(1 << 20) -#define SYS_CFG_VOLT		(2 << 20) -#define SYS_CFG_AMP		(3 << 20) -#define SYS_CFG_TEMP		(4 << 20) -#define SYS_CFG_RESET		(5 << 20) -#define SYS_CFG_SCC		(6 << 20) -#define SYS_CFG_MUXFPGA		(7 << 20) -#define SYS_CFG_SHUTDOWN	(8 << 20) -#define SYS_CFG_REBOOT		(9 << 20) -#define SYS_CFG_DVIMODE		(11 << 20) -#define SYS_CFG_POWER		(12 << 20) -#define SYS_CFG_SITE(n)		((n) << 16) -#define SYS_CFG_SITE_MB		0 -#define SYS_CFG_SITE_DB1	1 -#define SYS_CFG_SITE_DB2	2 -#define SYS_CFG_STACK(n)	((n) << 12) - -#define SYS_CFG_ERR		(1 << 1) -#define SYS_CFG_COMPLETE	(1 << 0) - -int v2m_cfg_write(u32 devfn, u32 data); -int v2m_cfg_read(u32 devfn, u32 *data); -void v2m_flags_set(u32 data); - -/* - * Miscellaneous - */ -#define SYS_MISC_MASTERSITE	(1 << 14) -#define SYS_PROCIDx_HBI_MASK	0xfff - -int v2m_get_master_site(void); - -/*   * Core tile IDs   */  #define V2M_CT_ID_CA9		0x0c000191 @@ -149,21 +85,4 @@ struct ct_desc {  extern struct ct_desc *ct_desc; -/* - * OSC clock provider - */ -struct v2m_osc { -	struct clk_hw hw; -	u8 site; /* 0 = motherboard, 1 = site 1, 2 = site 2 */ -	u8 stack; /* board stack position */ -	u16 osc; -	unsigned long rate_min; -	unsigned long rate_max; -	unsigned long rate_default; -}; - -#define to_v2m_osc(osc) container_of(osc, struct v2m_osc, hw) - -struct clk *v2m_osc_register(const char *name, struct v2m_osc *osc); -  #endif diff --git a/arch/arm/mach-vexpress/platsmp.c b/arch/arm/mach-vexpress/platsmp.c index 7db27c8c05c..c5d70de9bb4 100644 --- a/arch/arm/mach-vexpress/platsmp.c +++ b/arch/arm/mach-vexpress/platsmp.c @@ -13,6 +13,7 @@  #include <linux/smp.h>  #include <linux/io.h>  #include <linux/of_fdt.h> +#include <linux/vexpress.h>  #include <asm/smp_scu.h>  #include <asm/hardware/gic.h> @@ -193,7 +194,7 @@ static void __init vexpress_smp_prepare_cpus(unsigned int max_cpus)  	 * until it receives a soft interrupt, and then the  	 * secondary CPU branches to this address.  	 */ -	v2m_flags_set(virt_to_phys(versatile_secondary_startup)); +	vexpress_flags_set(virt_to_phys(versatile_secondary_startup));  }  struct smp_operations __initdata vexpress_smp_ops = { diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 560e0df728f..011661a6c5c 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c @@ -16,11 +16,10 @@  #include <linux/smsc911x.h>  #include <linux/spinlock.h>  #include <linux/usb/isp1760.h> -#include <linux/clkdev.h> -#include <linux/clk-provider.h>  #include <linux/mtd/physmap.h>  #include <linux/regulator/fixed.h>  #include <linux/regulator/machine.h> +#include <linux/vexpress.h>  #include <asm/arch_timer.h>  #include <asm/mach-types.h> @@ -33,7 +32,6 @@  #include <asm/hardware/cache-l2x0.h>  #include <asm/hardware/gic.h>  #include <asm/hardware/timer-sp.h> -#include <asm/hardware/sp810.h>  #include <mach/ct-ca9x4.h>  #include <mach/motherboard.h> @@ -58,22 +56,6 @@ static struct map_desc v2m_io_desc[] __initdata = {  	},  }; -static void __iomem *v2m_sysreg_base; - -static void __init v2m_sysctl_init(void __iomem *base) -{ -	u32 scctrl; - -	if (WARN_ON(!base)) -		return; - -	/* Select 1MHz TIMCLK as the reference clock for SP804 timers */ -	scctrl = readl(base + SCCTRL); -	scctrl |= SCCTRL_TIMEREN0SEL_TIMCLK; -	scctrl |= SCCTRL_TIMEREN1SEL_TIMCLK; -	writel(scctrl, base + SCCTRL); -} -  static void __init v2m_sp804_init(void __iomem *base, unsigned int irq)  {  	if (WARN_ON(!base || irq == NO_IRQ)) @@ -87,69 +69,6 @@ static void __init v2m_sp804_init(void __iomem *base, unsigned int irq)  } -static DEFINE_SPINLOCK(v2m_cfg_lock); - -int v2m_cfg_write(u32 devfn, u32 data) -{ -	/* Configuration interface broken? */ -	u32 val; - -	printk("%s: writing %08x to %08x\n", __func__, data, devfn); - -	devfn |= SYS_CFG_START | SYS_CFG_WRITE; - -	spin_lock(&v2m_cfg_lock); -	val = readl(v2m_sysreg_base + V2M_SYS_CFGSTAT); -	writel(val & ~SYS_CFG_COMPLETE, v2m_sysreg_base + V2M_SYS_CFGSTAT); - -	writel(data, v2m_sysreg_base +  V2M_SYS_CFGDATA); -	writel(devfn, v2m_sysreg_base + V2M_SYS_CFGCTRL); - -	do { -		val = readl(v2m_sysreg_base + V2M_SYS_CFGSTAT); -	} while (val == 0); -	spin_unlock(&v2m_cfg_lock); - -	return !!(val & SYS_CFG_ERR); -} - -int v2m_cfg_read(u32 devfn, u32 *data) -{ -	u32 val; - -	devfn |= SYS_CFG_START; - -	spin_lock(&v2m_cfg_lock); -	writel(0, v2m_sysreg_base + V2M_SYS_CFGSTAT); -	writel(devfn, v2m_sysreg_base + V2M_SYS_CFGCTRL); - -	mb(); - -	do { -		cpu_relax(); -		val = readl(v2m_sysreg_base + V2M_SYS_CFGSTAT); -	} while (val == 0); - -	*data = readl(v2m_sysreg_base + V2M_SYS_CFGDATA); -	spin_unlock(&v2m_cfg_lock); - -	return !!(val & SYS_CFG_ERR); -} - -void __init v2m_flags_set(u32 data) -{ -	writel(~0, v2m_sysreg_base + V2M_SYS_FLAGSCLR); -	writel(data, v2m_sysreg_base + V2M_SYS_FLAGSSET); -} - -int v2m_get_master_site(void) -{ -	u32 misc = readl(v2m_sysreg_base + V2M_SYS_MISC); - -	return misc & SYS_MISC_MASTERSITE ? SYS_CFG_SITE_DB2 : SYS_CFG_SITE_DB1; -} - -  static struct resource v2m_pcie_i2c_resource = {  	.start	= V2M_SERIAL_BUS_PCI,  	.end	= V2M_SERIAL_BUS_PCI + SZ_4K - 1, @@ -237,14 +156,8 @@ static struct platform_device v2m_usb_device = {  	.dev.platform_data = &v2m_usb_config,  }; -static void v2m_flash_set_vpp(struct platform_device *pdev, int on) -{ -	writel(on != 0, v2m_sysreg_base + V2M_SYS_FLASH); -} -  static struct physmap_flash_data v2m_flash_data = {  	.width		= 4, -	.set_vpp	= v2m_flash_set_vpp,  };  static struct resource v2m_flash_resources[] = { @@ -291,14 +204,61 @@ static struct platform_device v2m_cf_device = {  	.dev.platform_data = &v2m_pata_data,  }; -static unsigned int v2m_mmci_status(struct device *dev) -{ -	return readl(v2m_sysreg_base + V2M_SYS_MCI) & (1 << 0); -} -  static struct mmci_platform_data v2m_mmci_data = {  	.ocr_mask	= MMC_VDD_32_33|MMC_VDD_33_34, -	.status		= v2m_mmci_status, +	.gpio_wp	= VEXPRESS_GPIO_MMC_WPROT, +	.gpio_cd	= VEXPRESS_GPIO_MMC_CARDIN, +}; + +static struct resource v2m_sysreg_resources[] = { +	{ +		.start	= V2M_SYSREGS, +		.end	= V2M_SYSREGS + 0xfff, +		.flags	= IORESOURCE_MEM, +	}, +}; + +static struct platform_device v2m_sysreg_device = { +	.name		= "vexpress-sysreg", +	.id		= -1, +	.resource	= v2m_sysreg_resources, +	.num_resources	= ARRAY_SIZE(v2m_sysreg_resources), +}; + +static struct platform_device v2m_muxfpga_device = { +	.name		= "vexpress-muxfpga", +	.id		= 0, +	.num_resources	= 1, +	.resource	= (struct resource []) { +		VEXPRESS_RES_FUNC(0, 7), +	} +}; + +static struct platform_device v2m_shutdown_device = { +	.name		= "vexpress-shutdown", +	.id		= 0, +	.num_resources	= 1, +	.resource	= (struct resource []) { +		VEXPRESS_RES_FUNC(0, 8), +	} +}; + +static struct platform_device v2m_reboot_device = { +	.name		= "vexpress-reboot", +	.id		= 0, +	.num_resources	= 1, +	.resource	= (struct resource []) { +		VEXPRESS_RES_FUNC(0, 9), +	} +}; + +static struct platform_device v2m_dvimode_device = { +	.name		= "vexpress-dvimode", +	.id		= 0, +	.num_resources	= 1, +	.resource	= (struct resource []) { +		VEXPRESS_RES_FUNC(0, 11), +	}  };  static AMBA_APB_DEVICE(aaci,  "mb:aaci",  0, V2M_AACI, IRQ_V2M_AACI, NULL); @@ -325,123 +285,9 @@ static struct amba_device *v2m_amba_devs[] __initdata = {  	&rtc_device,  }; - -static unsigned long v2m_osc_recalc_rate(struct clk_hw *hw, -		unsigned long parent_rate) -{ -	struct v2m_osc *osc = to_v2m_osc(hw); - -	return !parent_rate ? osc->rate_default : parent_rate; -} - -static long v2m_osc_round_rate(struct clk_hw *hw, unsigned long rate, -		unsigned long *parent_rate) -{ -	struct v2m_osc *osc = to_v2m_osc(hw); - -	if (WARN_ON(rate < osc->rate_min)) -		rate = osc->rate_min; - -	if (WARN_ON(rate > osc->rate_max)) -		rate = osc->rate_max; - -	return rate; -} - -static int v2m_osc_set_rate(struct clk_hw *hw, unsigned long rate, -		unsigned long parent_rate) -{ -	struct v2m_osc *osc = to_v2m_osc(hw); - -	v2m_cfg_write(SYS_CFG_OSC | SYS_CFG_SITE(osc->site) | -			SYS_CFG_STACK(osc->stack) | osc->osc, rate); - -	return 0; -} - -static struct clk_ops v2m_osc_ops = { -	.recalc_rate = v2m_osc_recalc_rate, -	.round_rate = v2m_osc_round_rate, -	.set_rate = v2m_osc_set_rate, -}; - -struct clk * __init v2m_osc_register(const char *name, struct v2m_osc *osc) -{ -	struct clk_init_data init; - -	WARN_ON(osc->site > 2); -	WARN_ON(osc->stack > 15); -	WARN_ON(osc->osc > 4095); - -	init.name = name; -	init.ops = &v2m_osc_ops; -	init.flags = CLK_IS_ROOT; -	init.num_parents = 0; - -	osc->hw.init = &init; - -	return clk_register(NULL, &osc->hw); -} - -static struct v2m_osc v2m_mb_osc1 = { -	.site = SYS_CFG_SITE_MB, -	.osc = 1, -	.rate_min = 23750000, -	.rate_max = 63500000, -	.rate_default = 23750000, -}; - -static const char *v2m_ref_clk_periphs[] __initconst = { -	"mb:wdt",   "1000f000.wdt",  "1c0f0000.wdt",	/* SP805 WDT */ -}; - -static const char *v2m_osc1_periphs[] __initconst = { -	"mb:clcd",  "1001f000.clcd", "1c1f0000.clcd",	/* PL111 CLCD */ -}; - -static const char *v2m_osc2_periphs[] __initconst = { -	"mb:mmci",  "10005000.mmci", "1c050000.mmci",	/* PL180 MMCI */ -	"mb:kmi0",  "10006000.kmi",  "1c060000.kmi",	/* PL050 KMI0 */ -	"mb:kmi1",  "10007000.kmi",  "1c070000.kmi",	/* PL050 KMI1 */ -	"mb:uart0", "10009000.uart", "1c090000.uart",	/* PL011 UART0 */ -	"mb:uart1", "1000a000.uart", "1c0a0000.uart",	/* PL011 UART1 */ -	"mb:uart2", "1000b000.uart", "1c0b0000.uart",	/* PL011 UART2 */ -	"mb:uart3", "1000c000.uart", "1c0c0000.uart",	/* PL011 UART3 */ -}; - -static void __init v2m_clk_init(void) -{ -	struct clk *clk; -	int i; - -	clk = clk_register_fixed_rate(NULL, "dummy_apb_pclk", NULL, -			CLK_IS_ROOT, 0); -	WARN_ON(clk_register_clkdev(clk, "apb_pclk", NULL)); - -	clk = clk_register_fixed_rate(NULL, "mb:ref_clk", NULL, -			CLK_IS_ROOT, 32768); -	for (i = 0; i < ARRAY_SIZE(v2m_ref_clk_periphs); i++) -		WARN_ON(clk_register_clkdev(clk, NULL, v2m_ref_clk_periphs[i])); - -	clk = clk_register_fixed_rate(NULL, "mb:sp804_clk", NULL, -			CLK_IS_ROOT, 1000000); -	WARN_ON(clk_register_clkdev(clk, "v2m-timer0", "sp804")); -	WARN_ON(clk_register_clkdev(clk, "v2m-timer1", "sp804")); - -	clk = v2m_osc_register("mb:osc1", &v2m_mb_osc1); -	for (i = 0; i < ARRAY_SIZE(v2m_osc1_periphs); i++) -		WARN_ON(clk_register_clkdev(clk, NULL, v2m_osc1_periphs[i])); - -	clk = clk_register_fixed_rate(NULL, "mb:osc2", NULL, -			CLK_IS_ROOT, 24000000); -	for (i = 0; i < ARRAY_SIZE(v2m_osc2_periphs); i++) -		WARN_ON(clk_register_clkdev(clk, NULL, v2m_osc2_periphs[i])); -} -  static void __init v2m_timer_init(void)  { -	v2m_sysctl_init(ioremap(V2M_SYSCTL, SZ_4K)); -	v2m_clk_init(); +	vexpress_clk_init(ioremap(V2M_SYSCTL, SZ_4K));  	v2m_sp804_init(ioremap(V2M_TIMER01, SZ_4K), IRQ_V2M_TIMER0);  } @@ -453,19 +299,7 @@ static void __init v2m_init_early(void)  {  	if (ct_desc->init_early)  		ct_desc->init_early(); -	versatile_sched_clock_init(v2m_sysreg_base + V2M_SYS_24MHZ, 24000000); -} - -static void v2m_power_off(void) -{ -	if (v2m_cfg_write(SYS_CFG_SHUTDOWN | SYS_CFG_SITE(SYS_CFG_SITE_MB), 0)) -		printk(KERN_EMERG "Unable to shutdown\n"); -} - -static void v2m_restart(char str, const char *cmd) -{ -	if (v2m_cfg_write(SYS_CFG_REBOOT | SYS_CFG_SITE(SYS_CFG_SITE_MB), 0)) -		printk(KERN_EMERG "Unable to reboot\n"); +	versatile_sched_clock_init(vexpress_get_24mhz_clock_base(), 24000000);  }  struct ct_desc *ct_desc; @@ -482,7 +316,7 @@ static void __init v2m_populate_ct_desc(void)  	u32 current_tile_id;  	ct_desc = NULL; -	current_tile_id = readl(v2m_sysreg_base + V2M_SYS_PROCID0) +	current_tile_id = vexpress_get_procid(VEXPRESS_SITE_MASTER)  				& V2M_CT_ID_MASK;  	for (i = 0; i < ARRAY_SIZE(ct_descs) && !ct_desc; ++i) @@ -498,7 +332,7 @@ static void __init v2m_populate_ct_desc(void)  static void __init v2m_map_io(void)  {  	iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc)); -	v2m_sysreg_base = ioremap(V2M_SYSREGS, SZ_4K); +	vexpress_sysreg_early_init(ioremap(V2M_SYSREGS, SZ_4K));  	v2m_populate_ct_desc();  	ct_desc->map_io();  } @@ -515,6 +349,12 @@ static void __init v2m_init(void)  	regulator_register_fixed(0, v2m_eth_supplies,  			ARRAY_SIZE(v2m_eth_supplies)); +	platform_device_register(&v2m_muxfpga_device); +	platform_device_register(&v2m_shutdown_device); +	platform_device_register(&v2m_reboot_device); +	platform_device_register(&v2m_dvimode_device); + +	platform_device_register(&v2m_sysreg_device);  	platform_device_register(&v2m_pcie_i2c_device);  	platform_device_register(&v2m_ddc_i2c_device);  	platform_device_register(&v2m_flash_device); @@ -525,7 +365,7 @@ static void __init v2m_init(void)  	for (i = 0; i < ARRAY_SIZE(v2m_amba_devs); i++)  		amba_device_register(v2m_amba_devs[i], &iomem_resource); -	pm_power_off = v2m_power_off; +	pm_power_off = vexpress_power_off;  	ct_desc->init_tile();  } @@ -539,7 +379,7 @@ MACHINE_START(VEXPRESS, "ARM-Versatile Express")  	.timer		= &v2m_timer,  	.handle_irq	= gic_handle_irq,  	.init_machine	= v2m_init, -	.restart	= v2m_restart, +	.restart	= vexpress_restart,  MACHINE_END  static struct map_desc v2m_rs1_io_desc __initdata = { @@ -580,20 +420,13 @@ void __init v2m_dt_map_io(void)  void __init v2m_dt_init_early(void)  { -	struct device_node *node;  	u32 dt_hbi; -	node = of_find_compatible_node(NULL, NULL, "arm,vexpress-sysreg"); -	v2m_sysreg_base = of_iomap(node, 0); -	if (WARN_ON(!v2m_sysreg_base)) -		return; +	vexpress_sysreg_of_early_init();  	/* Confirm board type against DT property, if available */ -	if (of_property_read_u32(allnodes, "arm,hbi", &dt_hbi) == 0) { -		int site = v2m_get_master_site(); -		u32 id = readl(v2m_sysreg_base + (site == SYS_CFG_SITE_DB2 ? -				V2M_SYS_PROCID1 : V2M_SYS_PROCID0)); -		u32 hbi = id & SYS_PROCIDx_HBI_MASK; +	if (of_property_read_u32(of_allnodes, "arm,hbi", &dt_hbi) == 0) { +		u32 hbi = vexpress_get_hbi(VEXPRESS_SITE_MASTER);  		if (WARN_ON(dt_hbi != hbi))  			pr_warning("vexpress: DT HBI (%x) is not matching " @@ -613,51 +446,47 @@ static void __init v2m_dt_init_irq(void)  static void __init v2m_dt_timer_init(void)  { -	struct device_node *node; -	const char *path; -	int err; +	struct device_node *node = NULL; -	node = of_find_compatible_node(NULL, NULL, "arm,sp810"); -	v2m_sysctl_init(of_iomap(node, 0)); +	vexpress_clk_of_init(); -	v2m_clk_init(); +	do { +		node = of_find_compatible_node(node, NULL, "arm,sp804"); +	} while (node && vexpress_get_site_by_node(node) != VEXPRESS_SITE_MB); +	if (node) { +		pr_info("Using SP804 '%s' as a clock & events source\n", +				node->full_name); +		v2m_sp804_init(of_iomap(node, 0), +				irq_of_parse_and_map(node, 0)); +	} -	err = of_property_read_string(of_aliases, "arm,v2m_timer", &path); -	if (WARN_ON(err)) -		return; -	node = of_find_node_by_path(path); -	v2m_sp804_init(of_iomap(node, 0), irq_of_parse_and_map(node, 0));  	if (arch_timer_of_register() != 0)  		twd_local_timer_of_register();  	if (arch_timer_sched_clock_init() != 0) -		versatile_sched_clock_init(v2m_sysreg_base + V2M_SYS_24MHZ, 24000000); +		versatile_sched_clock_init(vexpress_get_24mhz_clock_base(), +				24000000);  }  static struct sys_timer v2m_dt_timer = {  	.init = v2m_dt_timer_init,  }; -static struct of_dev_auxdata v2m_dt_auxdata_lookup[] __initdata = { -	OF_DEV_AUXDATA("arm,vexpress-flash", V2M_NOR0, "physmap-flash", -			&v2m_flash_data), -	OF_DEV_AUXDATA("arm,primecell", V2M_MMCI, "mb:mmci", &v2m_mmci_data), -	/* RS1 memory map */ -	OF_DEV_AUXDATA("arm,vexpress-flash", 0x08000000, "physmap-flash", -			&v2m_flash_data), -	OF_DEV_AUXDATA("arm,primecell", 0x1c050000, "mb:mmci", &v2m_mmci_data), +static const struct of_device_id v2m_dt_bus_match[] __initconst = { +	{ .compatible = "simple-bus", }, +	{ .compatible = "arm,amba-bus", }, +	{ .compatible = "arm,vexpress,config-bus", },  	{}  };  static void __init v2m_dt_init(void)  {  	l2x0_of_init(0x00400000, 0xfe0fffff); -	of_platform_populate(NULL, of_default_bus_match_table, -			v2m_dt_auxdata_lookup, NULL); -	pm_power_off = v2m_power_off; +	of_platform_populate(NULL, v2m_dt_bus_match, NULL, NULL); +	pm_power_off = vexpress_power_off;  } -const static char *v2m_dt_match[] __initconst = { +static const char * const v2m_dt_match[] __initconst = {  	"arm,vexpress",  	"xen,xenvm",  	NULL, @@ -672,5 +501,5 @@ DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express")  	.timer		= &v2m_dt_timer,  	.init_machine	= v2m_dt_init,  	.handle_irq	= gic_handle_irq, -	.restart	= v2m_restart, +	.restart	= vexpress_restart,  MACHINE_END diff --git a/arch/arm/mach-vt8500/Kconfig b/arch/arm/mach-vt8500/Kconfig new file mode 100644 index 00000000000..2ed0b7d95db --- /dev/null +++ b/arch/arm/mach-vt8500/Kconfig @@ -0,0 +1,12 @@ +config ARCH_VT8500 +	bool "VIA/WonderMedia 85xx" if ARCH_MULTI_V5 +	default ARCH_VT8500_SINGLE +	select ARCH_HAS_CPUFREQ +	select ARCH_REQUIRE_GPIOLIB +	select CLKDEV_LOOKUP +	select CPU_ARM926T +	select GENERIC_CLOCKEVENTS +	select GENERIC_GPIO +	select HAVE_CLK +	help +	  Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip. diff --git a/arch/arm/mach-vt8500/common.h b/arch/arm/mach-vt8500/common.h index 2b2419646e9..6f2b843115d 100644 --- a/arch/arm/mach-vt8500/common.h +++ b/arch/arm/mach-vt8500/common.h @@ -25,4 +25,7 @@ int __init vt8500_irq_init(struct device_node *node,  /* defined in drivers/clk/clk-vt8500.c */  void __init vtwm_clk_init(void __iomem *pmc_base); +/* defined in irq.c */ +asmlinkage void vt8500_handle_irq(struct pt_regs *regs); +  #endif diff --git a/arch/arm/mach-vt8500/include/mach/entry-macro.S b/arch/arm/mach-vt8500/include/mach/entry-macro.S deleted file mode 100644 index 367d1b55fb9..00000000000 --- a/arch/arm/mach-vt8500/include/mach/entry-macro.S +++ /dev/null @@ -1,26 +0,0 @@ -/* - * arch/arm/mach-vt8500/include/mach/entry-macro.S - * - * Low-level IRQ helper macros for VIA VT8500 - * - * 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. - */ - -	.macro  get_irqnr_preamble, base, tmp -	@ physical 0xd8140000 is virtual 0xf8140000 -	mov	\base, #0xf8000000 -	orr	\base, \base, #0x00140000 -	.endm - -	.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp -	ldr	\irqnr, [\base] -	cmp	\irqnr, #63 @ may be false positive, check interrupt status -	bne	1001f -	ldr	\irqstat, [\base, #0x84] -	ands	\irqstat, #0x80000000 -	moveq	\irqnr, #0 -1001: -	.endm - diff --git a/arch/arm/mach-vt8500/include/mach/irqs.h b/arch/arm/mach-vt8500/include/mach/irqs.h deleted file mode 100644 index a129fd1222f..00000000000 --- a/arch/arm/mach-vt8500/include/mach/irqs.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - *  arch/arm/mach-vt8500/include/mach/irqs.h - * - *  Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ - -/* This value is just to make the core happy, never used otherwise */ -#define NR_IRQS 128 diff --git a/arch/arm/mach-vt8500/irq.c b/arch/arm/mach-vt8500/irq.c index f8f9ab9bc56..b9cf5ce9efb 100644 --- a/arch/arm/mach-vt8500/irq.c +++ b/arch/arm/mach-vt8500/irq.c @@ -36,7 +36,7 @@  #include <linux/of_address.h>  #include <asm/irq.h> - +#include <asm/exception.h>  #define VT8500_ICPC_IRQ		0x20  #define VT8500_ICPC_FIQ		0x24 @@ -66,30 +66,34 @@  #define VT8500_EDGE		( VT8500_TRIGGER_RISING \  				| VT8500_TRIGGER_FALLING) -static int irq_cnt; +/* vt8500 has 1 intc, wm8505 and wm8650 have 2 */ +#define VT8500_INTC_MAX		2 -struct vt8500_irq_priv { -	void __iomem *base; +struct vt8500_irq_data { +	void __iomem 		*base;		/* IO Memory base address */ +	struct irq_domain	*domain;	/* Domain for this controller */  }; +/* Global variable for accessing io-mem addresses */ +static struct vt8500_irq_data intc[VT8500_INTC_MAX]; +static u32 active_cnt = 0; +  static void vt8500_irq_mask(struct irq_data *d)  { -	struct vt8500_irq_priv *priv = -			(struct vt8500_irq_priv *)(d->domain->host_data); +	struct vt8500_irq_data *priv = d->domain->host_data;  	void __iomem *base = priv->base; -	u8 edge; +	void __iomem *stat_reg = base + VT8500_ICIS + (d->hwirq < 32 ? 0 : 4); +	u8 edge, dctr; +	u32 status;  	edge = readb(base + VT8500_ICDC + d->hwirq) & VT8500_EDGE;  	if (edge) { -		void __iomem *stat_reg = base + VT8500_ICIS -						+ (d->hwirq < 32 ? 0 : 4); -		unsigned status = readl(stat_reg); +		status = readl(stat_reg);  		status |= (1 << (d->hwirq & 0x1f));  		writel(status, stat_reg);  	} else { -		u8 dctr = readb(base + VT8500_ICDC + d->hwirq); - +		dctr = readb(base + VT8500_ICDC + d->hwirq);  		dctr &= ~VT8500_INT_ENABLE;  		writeb(dctr, base + VT8500_ICDC + d->hwirq);  	} @@ -97,8 +101,7 @@ static void vt8500_irq_mask(struct irq_data *d)  static void vt8500_irq_unmask(struct irq_data *d)  { -	struct vt8500_irq_priv *priv = -			(struct vt8500_irq_priv *)(d->domain->host_data); +	struct vt8500_irq_data *priv = d->domain->host_data;  	void __iomem *base = priv->base;  	u8 dctr; @@ -109,8 +112,7 @@ static void vt8500_irq_unmask(struct irq_data *d)  static int vt8500_irq_set_type(struct irq_data *d, unsigned int flow_type)  { -	struct vt8500_irq_priv *priv = -			(struct vt8500_irq_priv *)(d->domain->host_data); +	struct vt8500_irq_data *priv = d->domain->host_data;  	void __iomem *base = priv->base;  	u8 dctr; @@ -148,17 +150,15 @@ static struct irq_chip vt8500_irq_chip = {  static void __init vt8500_init_irq_hw(void __iomem *base)  { -	unsigned int i; +	u32 i;  	/* Enable rotating priority for IRQ */  	writel(ICPC_ROTATE, base + VT8500_ICPC_IRQ);  	writel(0x00, base + VT8500_ICPC_FIQ); -	for (i = 0; i < 64; i++) { -		/* Disable all interrupts and route them to IRQ */ -		writeb(VT8500_INT_DISABLE | ICDC_IRQ, -						base + VT8500_ICDC + i); -	} +	/* Disable all interrupts and route them to IRQ */ +	for (i = 0; i < 64; i++) +		writeb(VT8500_INT_DISABLE | ICDC_IRQ, base + VT8500_ICDC + i);  }  static int vt8500_irq_map(struct irq_domain *h, unsigned int virq, @@ -175,33 +175,67 @@ static struct irq_domain_ops vt8500_irq_domain_ops = {  	.xlate = irq_domain_xlate_onecell,  }; +asmlinkage void __exception_irq_entry vt8500_handle_irq(struct pt_regs *regs) +{ +	u32 stat, i; +	int irqnr, virq; +	void __iomem *base; + +	/* Loop through each active controller */ +	for (i=0; i<active_cnt; i++) { +		base = intc[i].base; +		irqnr = readl_relaxed(base) & 0x3F; +		/* +		  Highest Priority register default = 63, so check that this +		  is a real interrupt by checking the status register +		*/ +		if (irqnr == 63) { +			stat = readl_relaxed(base + VT8500_ICIS + 4); +			if (!(stat & BIT(31))) +				continue; +		} + +		virq = irq_find_mapping(intc[i].domain, irqnr); +		handle_IRQ(virq, regs); +	} +} +  int __init vt8500_irq_init(struct device_node *node, struct device_node *parent)  { -	struct irq_domain *vt8500_irq_domain; -	struct vt8500_irq_priv *priv;  	int irq, i;  	struct device_node *np = node; -	priv = kzalloc(sizeof(struct vt8500_irq_priv), GFP_KERNEL); -	priv->base = of_iomap(np, 0); +	if (active_cnt == VT8500_INTC_MAX) { +		pr_err("%s: Interrupt controllers > VT8500_INTC_MAX\n", +								__func__); +		goto out; +	} + +	intc[active_cnt].base = of_iomap(np, 0); +	intc[active_cnt].domain = irq_domain_add_linear(node, 64, +			&vt8500_irq_domain_ops,	&intc[active_cnt]); -	vt8500_irq_domain = irq_domain_add_legacy(node, 64, irq_cnt, 0, -				&vt8500_irq_domain_ops, priv); -	if (!vt8500_irq_domain) -		pr_err("%s: Unable to add wmt irq domain!\n", __func__); +	if (!intc[active_cnt].base) { +		pr_err("%s: Unable to map IO memory\n", __func__); +		goto out; +	} + +	if (!intc[active_cnt].domain) { +		pr_err("%s: Unable to add irq domain!\n", __func__); +		goto out; +	} -	irq_set_default_host(vt8500_irq_domain); +	vt8500_init_irq_hw(intc[active_cnt].base); -	vt8500_init_irq_hw(priv->base); +	pr_info("vt8500-irq: Added interrupt controller\n"); -	pr_info("Added IRQ Controller @ %x [virq_base = %d]\n", -						(u32)(priv->base), irq_cnt); +	active_cnt++;  	/* check if this is a slaved controller */  	if (of_irq_count(np) != 0) {  		/* check that we have the correct number of interrupts */  		if (of_irq_count(np) != 8) { -			pr_err("%s: Incorrect IRQ map for slave controller\n", +			pr_err("%s: Incorrect IRQ map for slaved controller\n",  					__func__);  			return -EINVAL;  		} @@ -213,9 +247,7 @@ int __init vt8500_irq_init(struct device_node *node, struct device_node *parent)  		pr_info("vt8500-irq: Enabled slave->parent interrupts\n");  	} - -	irq_cnt += 64; - +out:  	return 0;  } diff --git a/arch/arm/mach-vt8500/vt8500.c b/arch/arm/mach-vt8500/vt8500.c index a5bd28692b0..3c66d48ea08 100644 --- a/arch/arm/mach-vt8500/vt8500.c +++ b/arch/arm/mach-vt8500/vt8500.c @@ -192,5 +192,6 @@ DT_MACHINE_START(WMT_DT, "VIA/Wondermedia SoC (Device Tree Support)")  	.timer		= &vt8500_timer,  	.init_machine	= vt8500_init,  	.restart	= vt8500_restart, +	.handle_irq	= vt8500_handle_irq,  MACHINE_END diff --git a/arch/arm/mach-zynq/Kconfig b/arch/arm/mach-zynq/Kconfig new file mode 100644 index 00000000000..adb6c0ea0e5 --- /dev/null +++ b/arch/arm/mach-zynq/Kconfig @@ -0,0 +1,13 @@ +config ARCH_ZYNQ +	bool "Xilinx Zynq ARM Cortex A9 Platform" if ARCH_MULTI_V7 +	select ARM_AMBA +	select ARM_GIC +	select COMMON_CLK +	select CPU_V7 +	select GENERIC_CLOCKEVENTS +	select ICST +	select MIGHT_HAVE_CACHE_L2X0 +	select USE_OF +	select SPARSE_IRQ +	help +	  Support for Xilinx Zynq ARM Cortex A9 Platform diff --git a/arch/arm/mach-zynq/common.c b/arch/arm/mach-zynq/common.c index 79bf5fb4dad..e16d4bed0f7 100644 --- a/arch/arm/mach-zynq/common.c +++ b/arch/arm/mach-zynq/common.c @@ -30,10 +30,10 @@  #include <asm/mach/time.h>  #include <asm/mach-types.h>  #include <asm/page.h> +#include <asm/pgtable.h>  #include <asm/hardware/gic.h>  #include <asm/hardware/cache-l2x0.h> -#include <mach/zynq_soc.h>  #include "common.h"  static struct of_device_id zynq_of_bus_ids[] __initdata = { @@ -68,32 +68,15 @@ static void __init xilinx_irq_init(void)  	of_irq_init(irq_match);  } -/* The minimum devices needed to be mapped before the VM system is up and - * running include the GIC, UART and Timer Counter. - */ - -static struct map_desc io_desc[] __initdata = { -	{ -		.virtual	= TTC0_VIRT, -		.pfn		= __phys_to_pfn(TTC0_PHYS), -		.length		= TTC0_SIZE, -		.type		= MT_DEVICE, -	}, { -		.virtual	= SCU_PERIPH_VIRT, -		.pfn		= __phys_to_pfn(SCU_PERIPH_PHYS), -		.length		= SCU_PERIPH_SIZE, -		.type		= MT_DEVICE, -	}, - -#ifdef CONFIG_DEBUG_LL -	{ -		.virtual	= LL_UART_VADDR, -		.pfn		= __phys_to_pfn(LL_UART_PADDR), -		.length		= UART_SIZE, -		.type		= MT_DEVICE, -	}, -#endif +#define SCU_PERIPH_PHYS		0xF8F00000 +#define SCU_PERIPH_SIZE		SZ_8K +#define SCU_PERIPH_VIRT		(VMALLOC_END - SCU_PERIPH_SIZE) +static struct map_desc scu_desc __initdata = { +	.virtual	= SCU_PERIPH_VIRT, +	.pfn		= __phys_to_pfn(SCU_PERIPH_PHYS), +	.length		= SCU_PERIPH_SIZE, +	.type		= MT_DEVICE,  };  static void __init xilinx_zynq_timer_init(void) @@ -122,7 +105,8 @@ static struct sys_timer xttcpss_sys_timer = {   */  static void __init xilinx_map_io(void)  { -	iotable_init(io_desc, ARRAY_SIZE(io_desc)); +	debug_ll_io_init(); +	iotable_init(&scu_desc, 1);  }  static const char *xilinx_dt_match[] = { diff --git a/arch/arm/mach-zynq/include/mach/hardware.h b/arch/arm/mach-zynq/include/mach/hardware.h deleted file mode 100644 index d558d8a94be..00000000000 --- a/arch/arm/mach-zynq/include/mach/hardware.h +++ /dev/null @@ -1,18 +0,0 @@ -/* arch/arm/mach-zynq/include/mach/hardware.h - * - *  Copyright (C) 2011 Xilinx - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - */ - -#ifndef __MACH_HARDWARE_H__ -#define __MACH_HARDWARE_H__ - -#endif diff --git a/arch/arm/mach-zynq/include/mach/irqs.h b/arch/arm/mach-zynq/include/mach/irqs.h deleted file mode 100644 index 5fb04fd3bac..00000000000 --- a/arch/arm/mach-zynq/include/mach/irqs.h +++ /dev/null @@ -1,21 +0,0 @@ -/* arch/arm/mach-zynq/include/mach/irqs.h - * - *  Copyright (C) 2011 Xilinx - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - */ - -#ifndef __MACH_IRQS_H -#define __MACH_IRQS_H - -#define ARCH_NR_GPIOS	118 -#define NR_IRQS		(128 + ARCH_NR_GPIOS) - -#endif diff --git a/arch/arm/mach-zynq/include/mach/timex.h b/arch/arm/mach-zynq/include/mach/timex.h deleted file mode 100644 index 6c0245e42a5..00000000000 --- a/arch/arm/mach-zynq/include/mach/timex.h +++ /dev/null @@ -1,23 +0,0 @@ -/* arch/arm/mach-zynq/include/mach/timex.h - * - *  Copyright (C) 2011 Xilinx - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - */ - -#ifndef __MACH_TIMEX_H__ -#define __MACH_TIMEX_H__ - -/* the following is needed for the system to build but will be removed -   in the future, the value is not important but won't hurt -*/ -#define CLOCK_TICK_RATE	(100 * HZ) - -#endif diff --git a/arch/arm/mach-zynq/include/mach/uart.h b/arch/arm/mach-zynq/include/mach/uart.h deleted file mode 100644 index 5c47c97156f..00000000000 --- a/arch/arm/mach-zynq/include/mach/uart.h +++ /dev/null @@ -1,25 +0,0 @@ -/* arch/arm/mach-zynq/include/mach/uart.h - * - *  Copyright (C) 2011 Xilinx - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - */ - -#ifndef __MACH_UART_H__ -#define __MACH_UART_H__ - -#define UART_CR_OFFSET		0x00  /* Control Register [8:0] */ -#define UART_SR_OFFSET		0x2C  /* Channel Status [11:0] */ -#define UART_FIFO_OFFSET	0x30  /* FIFO [15:0] or [7:0] */ - -#define UART_SR_TXFULL		0x00000010	/* TX FIFO full */ -#define UART_SR_TXEMPTY		0x00000008	/* TX FIFO empty */ - -#endif diff --git a/arch/arm/mach-zynq/include/mach/uncompress.h b/arch/arm/mach-zynq/include/mach/uncompress.h deleted file mode 100644 index af4e8447bfa..00000000000 --- a/arch/arm/mach-zynq/include/mach/uncompress.h +++ /dev/null @@ -1,51 +0,0 @@ -/* arch/arm/mach-zynq/include/mach/uncompress.h - * - *  Copyright (C) 2011 Xilinx - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - */ - -#ifndef __MACH_UNCOMPRESS_H__ -#define __MACH_UNCOMPRESS_H__ - -#include <linux/io.h> -#include <asm/processor.h> -#include <mach/zynq_soc.h> -#include <mach/uart.h> - -void arch_decomp_setup(void) -{ -} - -static inline void flush(void) -{ -	/* -	 * Wait while the FIFO is not empty -	 */ -	while (!(__raw_readl(IOMEM(LL_UART_PADDR + UART_SR_OFFSET)) & -		UART_SR_TXEMPTY)) -		cpu_relax(); -} - -#define arch_decomp_wdog() - -static void putc(char ch) -{ -	/* -	 * Wait for room in the FIFO, then write the char into the FIFO -	 */ -	while (__raw_readl(IOMEM(LL_UART_PADDR + UART_SR_OFFSET)) & -		UART_SR_TXFULL) -		cpu_relax(); - -	__raw_writel(ch, IOMEM(LL_UART_PADDR + UART_FIFO_OFFSET)); -} - -#endif diff --git a/arch/arm/mach-zynq/include/mach/zynq_soc.h b/arch/arm/mach-zynq/include/mach/zynq_soc.h deleted file mode 100644 index 5ebbd8e6eee..00000000000 --- a/arch/arm/mach-zynq/include/mach/zynq_soc.h +++ /dev/null @@ -1,53 +0,0 @@ -/* arch/arm/mach-zynq/include/mach/zynq_soc.h - * - *  Copyright (C) 2011 Xilinx - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - */ - -#ifndef __MACH_XILINX_SOC_H__ -#define __MACH_XILINX_SOC_H__ - -#include <asm/pgtable.h> - -#define PERIPHERAL_CLOCK_RATE		2500000 - -/* Static peripheral mappings are mapped at the top of the vmalloc region.  The - * early uart mapping causes intermediate problems/failure at certain - * addresses, including the very top of the vmalloc region.  Map it at an - * address that is known to work. - */ -#define UART0_PHYS		0xE0000000 -#define UART1_PHYS		0xE0001000 -#define UART_SIZE		SZ_4K -#define UART_VIRT		0xF0001000 - -#define TTC0_PHYS		0xF8001000 -#define TTC0_SIZE		SZ_4K -#define TTC0_VIRT		(VMALLOC_END - TTC0_SIZE) - -#define SCU_PERIPH_PHYS		0xF8F00000 -#define SCU_PERIPH_SIZE		SZ_8K -#define SCU_PERIPH_VIRT		(TTC0_VIRT - SCU_PERIPH_SIZE) - -#if IS_ENABLED(CONFIG_DEBUG_ZYNQ_UART1) -# define LL_UART_PADDR		UART1_PHYS -#else -# define LL_UART_PADDR		UART0_PHYS -#endif - -#define LL_UART_VADDR		UART_VIRT - -/* The following are intended for the devices that are mapped early */ - -#define TTC0_BASE			IOMEM(TTC0_VIRT) -#define SCU_PERIPH_BASE			IOMEM(SCU_PERIPH_VIRT) - -#endif diff --git a/arch/arm/mach-zynq/timer.c b/arch/arm/mach-zynq/timer.c index 9662306aa12..de3df283da7 100644 --- a/arch/arm/mach-zynq/timer.c +++ b/arch/arm/mach-zynq/timer.c @@ -29,7 +29,6 @@  #include <linux/slab.h>  #include <linux/clk-provider.h> -#include <mach/zynq_soc.h>  #include "common.h"  /* diff --git a/arch/arm/mm/cache-aurora-l2.h b/arch/arm/mm/cache-aurora-l2.h new file mode 100644 index 00000000000..c8612476983 --- /dev/null +++ b/arch/arm/mm/cache-aurora-l2.h @@ -0,0 +1,55 @@ +/* + * AURORA shared L2 cache controller support + * + * Copyright (C) 2012 Marvell + * + * Yehuda Yitschak <yehuday@marvell.com> + * Gregory CLEMENT <gregory.clement@free-electrons.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. + */ + +#ifndef __ASM_ARM_HARDWARE_AURORA_L2_H +#define __ASM_ARM_HARDWARE_AURORA_L2_H + +#define AURORA_SYNC_REG		    0x700 +#define AURORA_RANGE_BASE_ADDR_REG  0x720 +#define AURORA_FLUSH_PHY_ADDR_REG   0x7f0 +#define AURORA_INVAL_RANGE_REG	    0x774 +#define AURORA_CLEAN_RANGE_REG	    0x7b4 +#define AURORA_FLUSH_RANGE_REG	    0x7f4 + +#define AURORA_ACR_REPLACEMENT_OFFSET	    27 +#define AURORA_ACR_REPLACEMENT_MASK	     \ +	(0x3 << AURORA_ACR_REPLACEMENT_OFFSET) +#define AURORA_ACR_REPLACEMENT_TYPE_WAYRR    \ +	(0 << AURORA_ACR_REPLACEMENT_OFFSET) +#define AURORA_ACR_REPLACEMENT_TYPE_LFSR     \ +	(1 << AURORA_ACR_REPLACEMENT_OFFSET) +#define AURORA_ACR_REPLACEMENT_TYPE_SEMIPLRU \ +	(3 << AURORA_ACR_REPLACEMENT_OFFSET) + +#define AURORA_ACR_FORCE_WRITE_POLICY_OFFSET	0 +#define AURORA_ACR_FORCE_WRITE_POLICY_MASK	\ +	(0x3 << AURORA_ACR_FORCE_WRITE_POLICY_OFFSET) +#define AURORA_ACR_FORCE_WRITE_POLICY_DIS	\ +	(0 << AURORA_ACR_FORCE_WRITE_POLICY_OFFSET) +#define AURORA_ACR_FORCE_WRITE_BACK_POLICY	\ +	(1 << AURORA_ACR_FORCE_WRITE_POLICY_OFFSET) +#define AURORA_ACR_FORCE_WRITE_THRO_POLICY	\ +	(2 << AURORA_ACR_FORCE_WRITE_POLICY_OFFSET) + +#define MAX_RANGE_SIZE		1024 + +#define AURORA_WAY_SIZE_SHIFT	2 + +#define AURORA_CTRL_FW		0x100 + +/* chose a number outside L2X0_CACHE_ID_PART_MASK to be sure to make + * the distinction between a number coming from hardware and a number + * coming from the device tree */ +#define AURORA_CACHE_ID	       0x100 + +#endif /* __ASM_ARM_HARDWARE_AURORA_L2_H */ diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index 8a97e6443c6..6911b8b2745 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c @@ -25,6 +25,7 @@  #include <asm/cacheflush.h>  #include <asm/hardware/cache-l2x0.h> +#include "cache-aurora-l2.h"  #define CACHE_LINE_SIZE		32 @@ -34,14 +35,20 @@ static u32 l2x0_way_mask;	/* Bitmask of active ways */  static u32 l2x0_size;  static unsigned long sync_reg_offset = L2X0_CACHE_SYNC; +/* Aurora don't have the cache ID register available, so we have to + * pass it though the device tree */ +static u32  cache_id_part_number_from_dt; +  struct l2x0_regs l2x0_saved_regs;  struct l2x0_of_data {  	void (*setup)(const struct device_node *, u32 *, u32 *);  	void (*save)(void); -	void (*resume)(void); +	struct outer_cache_fns outer_cache;  }; +static bool of_init = false; +  static inline void cache_wait_way(void __iomem *reg, unsigned long mask)  {  	/* wait for cache operation by line or way to complete */ @@ -168,7 +175,7 @@ static void l2x0_inv_all(void)  	/* invalidate all ways */  	raw_spin_lock_irqsave(&l2x0_lock, flags);  	/* Invalidating when L2 is enabled is a nono */ -	BUG_ON(readl(l2x0_base + L2X0_CTRL) & 1); +	BUG_ON(readl(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN);  	writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_INV_WAY);  	cache_wait_way(l2x0_base + L2X0_INV_WAY, l2x0_way_mask);  	cache_sync(); @@ -292,11 +299,18 @@ static void l2x0_unlock(u32 cache_id)  	int lockregs;  	int i; -	if (cache_id == L2X0_CACHE_ID_PART_L310) +	switch (cache_id) { +	case L2X0_CACHE_ID_PART_L310:  		lockregs = 8; -	else +		break; +	case AURORA_CACHE_ID: +		lockregs = 4; +		break; +	default:  		/* L210 and unknown types */  		lockregs = 1; +		break; +	}  	for (i = 0; i < lockregs; i++) {  		writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_D_BASE + @@ -312,18 +326,22 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)  	u32 cache_id;  	u32 way_size = 0;  	int ways; +	int way_size_shift = L2X0_WAY_SIZE_SHIFT;  	const char *type;  	l2x0_base = base; - -	cache_id = readl_relaxed(l2x0_base + L2X0_CACHE_ID); +	if (cache_id_part_number_from_dt) +		cache_id = cache_id_part_number_from_dt; +	else +		cache_id = readl_relaxed(l2x0_base + L2X0_CACHE_ID) +			& L2X0_CACHE_ID_PART_MASK;  	aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL);  	aux &= aux_mask;  	aux |= aux_val;  	/* Determine the number of ways */ -	switch (cache_id & L2X0_CACHE_ID_PART_MASK) { +	switch (cache_id) {  	case L2X0_CACHE_ID_PART_L310:  		if (aux & (1 << 16))  			ways = 16; @@ -340,6 +358,14 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)  		ways = (aux >> 13) & 0xf;  		type = "L210";  		break; + +	case AURORA_CACHE_ID: +		sync_reg_offset = AURORA_SYNC_REG; +		ways = (aux >> 13) & 0xf; +		ways = 2 << ((ways + 1) >> 2); +		way_size_shift = AURORA_WAY_SIZE_SHIFT; +		type = "Aurora"; +		break;  	default:  		/* Assume unknown chips have 8 ways */  		ways = 8; @@ -353,7 +379,8 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)  	 * L2 cache Size =  Way size * Number of ways  	 */  	way_size = (aux & L2X0_AUX_CTRL_WAY_SIZE_MASK) >> 17; -	way_size = 1 << (way_size + 3); +	way_size = 1 << (way_size + way_size_shift); +  	l2x0_size = ways * way_size * SZ_1K;  	/* @@ -361,7 +388,7 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)  	 * If you are booting from non-secure mode  	 * accessing the below registers will fault.  	 */ -	if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & 1)) { +	if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN)) {  		/* Make sure that I&D is not locked down when starting */  		l2x0_unlock(cache_id); @@ -371,7 +398,7 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)  		l2x0_inv_all();  		/* enable L2X0 */ -		writel_relaxed(1, l2x0_base + L2X0_CTRL); +		writel_relaxed(L2X0_CTRL_EN, l2x0_base + L2X0_CTRL);  	}  	/* Re-read it in case some bits are reserved. */ @@ -380,13 +407,15 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)  	/* Save the value for resuming. */  	l2x0_saved_regs.aux_ctrl = aux; -	outer_cache.inv_range = l2x0_inv_range; -	outer_cache.clean_range = l2x0_clean_range; -	outer_cache.flush_range = l2x0_flush_range; -	outer_cache.sync = l2x0_cache_sync; -	outer_cache.flush_all = l2x0_flush_all; -	outer_cache.inv_all = l2x0_inv_all; -	outer_cache.disable = l2x0_disable; +	if (!of_init) { +		outer_cache.inv_range = l2x0_inv_range; +		outer_cache.clean_range = l2x0_clean_range; +		outer_cache.flush_range = l2x0_flush_range; +		outer_cache.sync = l2x0_cache_sync; +		outer_cache.flush_all = l2x0_flush_all; +		outer_cache.inv_all = l2x0_inv_all; +		outer_cache.disable = l2x0_disable; +	}  	printk(KERN_INFO "%s cache controller enabled\n", type);  	printk(KERN_INFO "l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d B\n", @@ -394,6 +423,100 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)  }  #ifdef CONFIG_OF +static int l2_wt_override; + +/* + * Note that the end addresses passed to Linux primitives are + * noninclusive, while the hardware cache range operations use + * inclusive start and end addresses. + */ +static unsigned long calc_range_end(unsigned long start, unsigned long end) +{ +	/* +	 * Limit the number of cache lines processed at once, +	 * since cache range operations stall the CPU pipeline +	 * until completion. +	 */ +	if (end > start + MAX_RANGE_SIZE) +		end = start + MAX_RANGE_SIZE; + +	/* +	 * Cache range operations can't straddle a page boundary. +	 */ +	if (end > PAGE_ALIGN(start+1)) +		end = PAGE_ALIGN(start+1); + +	return end; +} + +/* + * Make sure 'start' and 'end' reference the same page, as L2 is PIPT + * and range operations only do a TLB lookup on the start address. + */ +static void aurora_pa_range(unsigned long start, unsigned long end, +			unsigned long offset) +{ +	unsigned long flags; + +	raw_spin_lock_irqsave(&l2x0_lock, flags); +	writel(start, l2x0_base + AURORA_RANGE_BASE_ADDR_REG); +	writel(end, l2x0_base + offset); +	raw_spin_unlock_irqrestore(&l2x0_lock, flags); + +	cache_sync(); +} + +static void aurora_inv_range(unsigned long start, unsigned long end) +{ +	/* +	 * round start and end adresses up to cache line size +	 */ +	start &= ~(CACHE_LINE_SIZE - 1); +	end = ALIGN(end, CACHE_LINE_SIZE); + +	/* +	 * Invalidate all full cache lines between 'start' and 'end'. +	 */ +	while (start < end) { +		unsigned long range_end = calc_range_end(start, end); +		aurora_pa_range(start, range_end - CACHE_LINE_SIZE, +				AURORA_INVAL_RANGE_REG); +		start = range_end; +	} +} + +static void aurora_clean_range(unsigned long start, unsigned long end) +{ +	/* +	 * If L2 is forced to WT, the L2 will always be clean and we +	 * don't need to do anything here. +	 */ +	if (!l2_wt_override) { +		start &= ~(CACHE_LINE_SIZE - 1); +		end = ALIGN(end, CACHE_LINE_SIZE); +		while (start != end) { +			unsigned long range_end = calc_range_end(start, end); +			aurora_pa_range(start, range_end - CACHE_LINE_SIZE, +					AURORA_CLEAN_RANGE_REG); +			start = range_end; +		} +	} +} + +static void aurora_flush_range(unsigned long start, unsigned long end) +{ +	if (!l2_wt_override) { +		start &= ~(CACHE_LINE_SIZE - 1); +		end = ALIGN(end, CACHE_LINE_SIZE); +		while (start != end) { +			unsigned long range_end = calc_range_end(start, end); +			aurora_pa_range(start, range_end - CACHE_LINE_SIZE, +					AURORA_FLUSH_RANGE_REG); +			start = range_end; +		} +	} +} +  static void __init l2x0_of_setup(const struct device_node *np,  				 u32 *aux_val, u32 *aux_mask)  { @@ -491,9 +614,15 @@ static void __init pl310_save(void)  	}  } +static void aurora_save(void) +{ +	l2x0_saved_regs.ctrl = readl_relaxed(l2x0_base + L2X0_CTRL); +	l2x0_saved_regs.aux_ctrl = readl_relaxed(l2x0_base + L2X0_AUX_CTRL); +} +  static void l2x0_resume(void)  { -	if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & 1)) { +	if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN)) {  		/* restore aux ctrl and enable l2 */  		l2x0_unlock(readl_relaxed(l2x0_base + L2X0_CACHE_ID)); @@ -502,7 +631,7 @@ static void l2x0_resume(void)  		l2x0_inv_all(); -		writel_relaxed(1, l2x0_base + L2X0_CTRL); +		writel_relaxed(L2X0_CTRL_EN, l2x0_base + L2X0_CTRL);  	}  } @@ -510,7 +639,7 @@ static void pl310_resume(void)  {  	u32 l2x0_revision; -	if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & 1)) { +	if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN)) {  		/* restore pl310 setup */  		writel_relaxed(l2x0_saved_regs.tag_latency,  			l2x0_base + L2X0_TAG_LATENCY_CTRL); @@ -536,22 +665,108 @@ static void pl310_resume(void)  	l2x0_resume();  } +static void aurora_resume(void) +{ +	if (!(readl(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN)) { +		writel(l2x0_saved_regs.aux_ctrl, l2x0_base + L2X0_AUX_CTRL); +		writel(l2x0_saved_regs.ctrl, l2x0_base + L2X0_CTRL); +	} +} + +static void __init aurora_broadcast_l2_commands(void) +{ +	__u32 u; +	/* Enable Broadcasting of cache commands to L2*/ +	__asm__ __volatile__("mrc p15, 1, %0, c15, c2, 0" : "=r"(u)); +	u |= AURORA_CTRL_FW;		/* Set the FW bit */ +	__asm__ __volatile__("mcr p15, 1, %0, c15, c2, 0\n" : : "r"(u)); +	isb(); +} + +static void __init aurora_of_setup(const struct device_node *np, +				u32 *aux_val, u32 *aux_mask) +{ +	u32 val = AURORA_ACR_REPLACEMENT_TYPE_SEMIPLRU; +	u32 mask =  AURORA_ACR_REPLACEMENT_MASK; + +	of_property_read_u32(np, "cache-id-part", +			&cache_id_part_number_from_dt); + +	/* Determine and save the write policy */ +	l2_wt_override = of_property_read_bool(np, "wt-override"); + +	if (l2_wt_override) { +		val |= AURORA_ACR_FORCE_WRITE_THRO_POLICY; +		mask |= AURORA_ACR_FORCE_WRITE_POLICY_MASK; +	} + +	*aux_val &= ~mask; +	*aux_val |= val; +	*aux_mask &= ~mask; +} +  static const struct l2x0_of_data pl310_data = { -	pl310_of_setup, -	pl310_save, -	pl310_resume, +	.setup = pl310_of_setup, +	.save  = pl310_save, +	.outer_cache = { +		.resume      = pl310_resume, +		.inv_range   = l2x0_inv_range, +		.clean_range = l2x0_clean_range, +		.flush_range = l2x0_flush_range, +		.sync        = l2x0_cache_sync, +		.flush_all   = l2x0_flush_all, +		.inv_all     = l2x0_inv_all, +		.disable     = l2x0_disable, +		.set_debug   = pl310_set_debug, +	},  };  static const struct l2x0_of_data l2x0_data = { -	l2x0_of_setup, -	NULL, -	l2x0_resume, +	.setup = l2x0_of_setup, +	.save  = NULL, +	.outer_cache = { +		.resume      = l2x0_resume, +		.inv_range   = l2x0_inv_range, +		.clean_range = l2x0_clean_range, +		.flush_range = l2x0_flush_range, +		.sync        = l2x0_cache_sync, +		.flush_all   = l2x0_flush_all, +		.inv_all     = l2x0_inv_all, +		.disable     = l2x0_disable, +	}, +}; + +static const struct l2x0_of_data aurora_with_outer_data = { +	.setup = aurora_of_setup, +	.save  = aurora_save, +	.outer_cache = { +		.resume      = aurora_resume, +		.inv_range   = aurora_inv_range, +		.clean_range = aurora_clean_range, +		.flush_range = aurora_flush_range, +		.sync        = l2x0_cache_sync, +		.flush_all   = l2x0_flush_all, +		.inv_all     = l2x0_inv_all, +		.disable     = l2x0_disable, +	}, +}; + +static const struct l2x0_of_data aurora_no_outer_data = { +	.setup = aurora_of_setup, +	.save  = aurora_save, +	.outer_cache = { +		.resume      = aurora_resume, +	},  };  static const struct of_device_id l2x0_ids[] __initconst = {  	{ .compatible = "arm,pl310-cache", .data = (void *)&pl310_data },  	{ .compatible = "arm,l220-cache", .data = (void *)&l2x0_data },  	{ .compatible = "arm,l210-cache", .data = (void *)&l2x0_data }, +	{ .compatible = "marvell,aurora-system-cache", +	  .data = (void *)&aurora_no_outer_data}, +	{ .compatible = "marvell,aurora-outer-cache", +	  .data = (void *)&aurora_with_outer_data},  	{}  }; @@ -577,17 +792,24 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask)  	data = of_match_node(l2x0_ids, np)->data;  	/* L2 configuration can only be changed if the cache is disabled */ -	if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & 1)) { +	if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN)) {  		if (data->setup)  			data->setup(np, &aux_val, &aux_mask); + +		/* For aurora cache in no outer mode select the +		 * correct mode using the coprocessor*/ +		if (data == &aurora_no_outer_data) +			aurora_broadcast_l2_commands();  	}  	if (data->save)  		data->save(); +	of_init = true;  	l2x0_init(l2x0_base, aux_val, aux_mask); -	outer_cache.resume = data->resume; +	memcpy(&outer_cache, &data->outer_cache, sizeof(outer_cache)); +  	return 0;  }  #endif diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 4e07eec1270..bc4a5e9ebb7 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c @@ -2,6 +2,9 @@   *  linux/arch/arm/mm/context.c   *   *  Copyright (C) 2002-2003 Deep Blue Solutions Ltd, all rights reserved. + *  Copyright (C) 2012 ARM Limited + * + *  Author: Will Deacon <will.deacon@arm.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 @@ -14,14 +17,40 @@  #include <linux/percpu.h>  #include <asm/mmu_context.h> +#include <asm/smp_plat.h>  #include <asm/thread_notify.h>  #include <asm/tlbflush.h> +/* + * On ARMv6, we have the following structure in the Context ID: + * + * 31                         7          0 + * +-------------------------+-----------+ + * |      process ID         |   ASID    | + * +-------------------------+-----------+ + * |              context ID             | + * +-------------------------------------+ + * + * The ASID is used to tag entries in the CPU caches and TLBs. + * The context ID is used by debuggers and trace logic, and + * should be unique within all running processes. + */ +#define ASID_FIRST_VERSION	(1ULL << ASID_BITS) +#define NUM_USER_ASIDS		(ASID_FIRST_VERSION - 1) + +#define ASID_TO_IDX(asid)	((asid & ~ASID_MASK) - 1) +#define IDX_TO_ASID(idx)	((idx + 1) & ~ASID_MASK) +  static DEFINE_RAW_SPINLOCK(cpu_asid_lock); -unsigned int cpu_last_asid = ASID_FIRST_VERSION; +static atomic64_t asid_generation = ATOMIC64_INIT(ASID_FIRST_VERSION); +static DECLARE_BITMAP(asid_map, NUM_USER_ASIDS); + +static DEFINE_PER_CPU(atomic64_t, active_asids); +static DEFINE_PER_CPU(u64, reserved_asids); +static cpumask_t tlb_flush_pending;  #ifdef CONFIG_ARM_LPAE -void cpu_set_reserved_ttbr0(void) +static void cpu_set_reserved_ttbr0(void)  {  	unsigned long ttbl = __pa(swapper_pg_dir);  	unsigned long ttbh = 0; @@ -37,7 +66,7 @@ void cpu_set_reserved_ttbr0(void)  	isb();  }  #else -void cpu_set_reserved_ttbr0(void) +static void cpu_set_reserved_ttbr0(void)  {  	u32 ttb;  	/* Copy TTBR1 into TTBR0 */ @@ -84,124 +113,104 @@ static int __init contextidr_notifier_init(void)  arch_initcall(contextidr_notifier_init);  #endif -/* - * We fork()ed a process, and we need a new context for the child - * to run in. - */ -void __init_new_context(struct task_struct *tsk, struct mm_struct *mm) +static void flush_context(unsigned int cpu)  { -	mm->context.id = 0; -	raw_spin_lock_init(&mm->context.id_lock); -} +	int i; +	u64 asid; -static void flush_context(void) -{ -	cpu_set_reserved_ttbr0(); -	local_flush_tlb_all(); -	if (icache_is_vivt_asid_tagged()) { -		__flush_icache_all(); -		dsb(); +	/* Update the list of reserved ASIDs and the ASID bitmap. */ +	bitmap_clear(asid_map, 0, NUM_USER_ASIDS); +	for_each_possible_cpu(i) { +		if (i == cpu) { +			asid = 0; +		} else { +			asid = atomic64_xchg(&per_cpu(active_asids, i), 0); +			__set_bit(ASID_TO_IDX(asid), asid_map); +		} +		per_cpu(reserved_asids, i) = asid;  	} + +	/* Queue a TLB invalidate and flush the I-cache if necessary. */ +	if (!tlb_ops_need_broadcast()) +		cpumask_set_cpu(cpu, &tlb_flush_pending); +	else +		cpumask_setall(&tlb_flush_pending); + +	if (icache_is_vivt_asid_tagged()) +		__flush_icache_all();  } -#ifdef CONFIG_SMP +static int is_reserved_asid(u64 asid) +{ +	int cpu; +	for_each_possible_cpu(cpu) +		if (per_cpu(reserved_asids, cpu) == asid) +			return 1; +	return 0; +} -static void set_mm_context(struct mm_struct *mm, unsigned int asid) +static void new_context(struct mm_struct *mm, unsigned int cpu)  { -	unsigned long flags; +	u64 asid = mm->context.id; +	u64 generation = atomic64_read(&asid_generation); -	/* -	 * Locking needed for multi-threaded applications where the -	 * same mm->context.id could be set from different CPUs during -	 * the broadcast. This function is also called via IPI so the -	 * mm->context.id_lock has to be IRQ-safe. -	 */ -	raw_spin_lock_irqsave(&mm->context.id_lock, flags); -	if (likely((mm->context.id ^ cpu_last_asid) >> ASID_BITS)) { +	if (asid != 0 && is_reserved_asid(asid)) { +		/* +		 * Our current ASID was active during a rollover, we can +		 * continue to use it and this was just a false alarm. +		 */ +		asid = generation | (asid & ~ASID_MASK); +	} else {  		/* -		 * Old version of ASID found. Set the new one and -		 * reset mm_cpumask(mm). +		 * Allocate a free ASID. If we can't find one, take a +		 * note of the currently active ASIDs and mark the TLBs +		 * as requiring flushes.  		 */ -		mm->context.id = asid; +		asid = find_first_zero_bit(asid_map, NUM_USER_ASIDS); +		if (asid == NUM_USER_ASIDS) { +			generation = atomic64_add_return(ASID_FIRST_VERSION, +							 &asid_generation); +			flush_context(cpu); +			asid = find_first_zero_bit(asid_map, NUM_USER_ASIDS); +		} +		__set_bit(asid, asid_map); +		asid = generation | IDX_TO_ASID(asid);  		cpumask_clear(mm_cpumask(mm));  	} -	raw_spin_unlock_irqrestore(&mm->context.id_lock, flags); -	/* -	 * Set the mm_cpumask(mm) bit for the current CPU. -	 */ -	cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm)); +	mm->context.id = asid;  } -/* - * Reset the ASID on the current CPU. This function call is broadcast - * from the CPU handling the ASID rollover and holding cpu_asid_lock. - */ -static void reset_context(void *info) +void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk)  { -	unsigned int asid; +	unsigned long flags;  	unsigned int cpu = smp_processor_id(); -	struct mm_struct *mm = current->active_mm; -	smp_rmb(); -	asid = cpu_last_asid + cpu + 1; +	if (unlikely(mm->context.vmalloc_seq != init_mm.context.vmalloc_seq)) +		__check_vmalloc_seq(mm); -	flush_context(); -	set_mm_context(mm, asid); - -	/* set the new ASID */ -	cpu_switch_mm(mm->pgd, mm); -} +	/* +	 * Required during context switch to avoid speculative page table +	 * walking with the wrong TTBR. +	 */ +	cpu_set_reserved_ttbr0(); -#else +	if (!((mm->context.id ^ atomic64_read(&asid_generation)) >> ASID_BITS) +	    && atomic64_xchg(&per_cpu(active_asids, cpu), mm->context.id)) +		goto switch_mm_fastpath; -static inline void set_mm_context(struct mm_struct *mm, unsigned int asid) -{ -	mm->context.id = asid; -	cpumask_copy(mm_cpumask(mm), cpumask_of(smp_processor_id())); -} +	raw_spin_lock_irqsave(&cpu_asid_lock, flags); +	/* Check that our ASID belongs to the current generation. */ +	if ((mm->context.id ^ atomic64_read(&asid_generation)) >> ASID_BITS) +		new_context(mm, cpu); -#endif +	atomic64_set(&per_cpu(active_asids, cpu), mm->context.id); +	cpumask_set_cpu(cpu, mm_cpumask(mm)); -void __new_context(struct mm_struct *mm) -{ -	unsigned int asid; +	if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) +		local_flush_tlb_all(); +	raw_spin_unlock_irqrestore(&cpu_asid_lock, flags); -	raw_spin_lock(&cpu_asid_lock); -#ifdef CONFIG_SMP -	/* -	 * Check the ASID again, in case the change was broadcast from -	 * another CPU before we acquired the lock. -	 */ -	if (unlikely(((mm->context.id ^ cpu_last_asid) >> ASID_BITS) == 0)) { -		cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm)); -		raw_spin_unlock(&cpu_asid_lock); -		return; -	} -#endif -	/* -	 * At this point, it is guaranteed that the current mm (with -	 * an old ASID) isn't active on any other CPU since the ASIDs -	 * are changed simultaneously via IPI. -	 */ -	asid = ++cpu_last_asid; -	if (asid == 0) -		asid = cpu_last_asid = ASID_FIRST_VERSION; - -	/* -	 * If we've used up all our ASIDs, we need -	 * to start a new version and flush the TLB. -	 */ -	if (unlikely((asid & ~ASID_MASK) == 0)) { -		asid = cpu_last_asid + smp_processor_id() + 1; -		flush_context(); -#ifdef CONFIG_SMP -		smp_wmb(); -		smp_call_function(reset_context, NULL, 1); -#endif -		cpu_last_asid += NR_CPUS; -	} - -	set_mm_context(mm, asid); -	raw_spin_unlock(&cpu_asid_lock); +switch_mm_fastpath: +	cpu_switch_mm(mm->pgd, mm);  } diff --git a/arch/arm/mm/idmap.c b/arch/arm/mm/idmap.c index ab88ed4f8e0..99db769307e 100644 --- a/arch/arm/mm/idmap.c +++ b/arch/arm/mm/idmap.c @@ -92,6 +92,9 @@ static int __init init_static_idmap(void)  		(long long)idmap_start, (long long)idmap_end);  	identity_mapping_add(idmap_pgd, idmap_start, idmap_end); +	/* Flush L1 for the hardware to see this page table content */ +	flush_cache_louis(); +  	return 0;  }  early_initcall(init_static_idmap); @@ -103,12 +106,15 @@ early_initcall(init_static_idmap);   */  void setup_mm_for_reboot(void)  { -	/* Clean and invalidate L1. */ -	flush_cache_all(); -  	/* Switch to the identity mapping. */  	cpu_switch_mm(idmap_pgd, &init_mm); -	/* Flush the TLB. */ +#ifdef CONFIG_CPU_HAS_ASID +	/* +	 * We don't have a clean ASID for the identity mapping, which +	 * may clash with virtual addresses of the previous page tables +	 * and therefore potentially in the TLB. +	 */  	local_flush_tlb_all(); +#endif  } diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index 5dcc2fd46c4..88fd86cf3d9 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c @@ -47,18 +47,18 @@ int ioremap_page(unsigned long virt, unsigned long phys,  }  EXPORT_SYMBOL(ioremap_page); -void __check_kvm_seq(struct mm_struct *mm) +void __check_vmalloc_seq(struct mm_struct *mm)  {  	unsigned int seq;  	do { -		seq = init_mm.context.kvm_seq; +		seq = init_mm.context.vmalloc_seq;  		memcpy(pgd_offset(mm, VMALLOC_START),  		       pgd_offset_k(VMALLOC_START),  		       sizeof(pgd_t) * (pgd_index(VMALLOC_END) -  					pgd_index(VMALLOC_START))); -		mm->context.kvm_seq = seq; -	} while (seq != init_mm.context.kvm_seq); +		mm->context.vmalloc_seq = seq; +	} while (seq != init_mm.context.vmalloc_seq);  }  #if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE) @@ -89,13 +89,13 @@ static void unmap_area_sections(unsigned long virt, unsigned long size)  		if (!pmd_none(pmd)) {  			/*  			 * Clear the PMD from the page table, and -			 * increment the kvm sequence so others +			 * increment the vmalloc sequence so others  			 * notice this change.  			 *  			 * Note: this is still racy on SMP machines.  			 */  			pmd_clear(pmdp); -			init_mm.context.kvm_seq++; +			init_mm.context.vmalloc_seq++;  			/*  			 * Free the page table, if there was one. @@ -112,8 +112,8 @@ static void unmap_area_sections(unsigned long virt, unsigned long size)  	 * Ensure that the active_mm is up to date - we want to  	 * catch any use-after-iounmap cases.  	 */ -	if (current->active_mm->context.kvm_seq != init_mm.context.kvm_seq) -		__check_kvm_seq(current->active_mm); +	if (current->active_mm->context.vmalloc_seq != init_mm.context.vmalloc_seq) +		__check_vmalloc_seq(current->active_mm);  	flush_tlb_kernel_range(virt, end);  } diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index ce8cb1970d7..10062ceadd1 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c @@ -11,18 +11,6 @@  #include <linux/random.h>  #include <asm/cachetype.h> -static inline unsigned long COLOUR_ALIGN_DOWN(unsigned long addr, -					      unsigned long pgoff) -{ -	unsigned long base = addr & ~(SHMLBA-1); -	unsigned long off = (pgoff << PAGE_SHIFT) & (SHMLBA-1); - -	if (base + off <= addr) -		return base + off; - -	return base - off; -} -  #define COLOUR_ALIGN(addr,pgoff)		\  	((((addr)+SHMLBA-1)&~(SHMLBA-1)) +	\  	 (((pgoff)<<PAGE_SHIFT) & (SHMLBA-1))) @@ -69,9 +57,9 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,  {  	struct mm_struct *mm = current->mm;  	struct vm_area_struct *vma; -	unsigned long start_addr;  	int do_align = 0;  	int aliasing = cache_is_vipt_aliasing(); +	struct vm_unmapped_area_info info;  	/*  	 * We only need to do colour alignment if either the I or D @@ -104,46 +92,14 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,  		    (!vma || addr + len <= vma->vm_start))  			return addr;  	} -	if (len > mm->cached_hole_size) { -	        start_addr = addr = mm->free_area_cache; -	} else { -	        start_addr = addr = mm->mmap_base; -	        mm->cached_hole_size = 0; -	} -full_search: -	if (do_align) -		addr = COLOUR_ALIGN(addr, pgoff); -	else -		addr = PAGE_ALIGN(addr); - -	for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { -		/* At this point:  (!vma || addr < vma->vm_end). */ -		if (TASK_SIZE - len < addr) { -			/* -			 * Start a new search - just in case we missed -			 * some holes. -			 */ -			if (start_addr != TASK_UNMAPPED_BASE) { -				start_addr = addr = TASK_UNMAPPED_BASE; -				mm->cached_hole_size = 0; -				goto full_search; -			} -			return -ENOMEM; -		} -		if (!vma || addr + len <= vma->vm_start) { -			/* -			 * Remember the place where we stopped the search: -			 */ -			mm->free_area_cache = addr + len; -			return addr; -		} -		if (addr + mm->cached_hole_size < vma->vm_start) -		        mm->cached_hole_size = vma->vm_start - addr; -		addr = vma->vm_end; -		if (do_align) -			addr = COLOUR_ALIGN(addr, pgoff); -	} +	info.flags = 0; +	info.length = len; +	info.low_limit = mm->mmap_base; +	info.high_limit = TASK_SIZE; +	info.align_mask = do_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; +	info.align_offset = pgoff << PAGE_SHIFT; +	return vm_unmapped_area(&info);  }  unsigned long @@ -156,6 +112,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  	unsigned long addr = addr0;  	int do_align = 0;  	int aliasing = cache_is_vipt_aliasing(); +	struct vm_unmapped_area_info info;  	/*  	 * We only need to do colour alignment if either the I or D @@ -187,70 +144,27 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  			return addr;  	} -	/* check if free_area_cache is useful for us */ -	if (len <= mm->cached_hole_size) { -		mm->cached_hole_size = 0; -		mm->free_area_cache = mm->mmap_base; -	} +	info.flags = VM_UNMAPPED_AREA_TOPDOWN; +	info.length = len; +	info.low_limit = PAGE_SIZE; +	info.high_limit = mm->mmap_base; +	info.align_mask = do_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; +	info.align_offset = pgoff << PAGE_SHIFT; +	addr = vm_unmapped_area(&info); -	/* either no address requested or can't fit in requested address hole */ -	addr = mm->free_area_cache; -	if (do_align) { -		unsigned long base = COLOUR_ALIGN_DOWN(addr - len, pgoff); -		addr = base + len; -	} - -	/* make sure it can fit in the remaining address space */ -	if (addr > len) { -		vma = find_vma(mm, addr-len); -		if (!vma || addr <= vma->vm_start) -			/* remember the address as a hint for next time */ -			return (mm->free_area_cache = addr-len); -	} - -	if (mm->mmap_base < len) -		goto bottomup; - -	addr = mm->mmap_base - len; -	if (do_align) -		addr = COLOUR_ALIGN_DOWN(addr, pgoff); - -	do { -		/* -		 * Lookup failure means no vma is above this address, -		 * else if new region fits below vma->vm_start, -		 * return with success: -		 */ -		vma = find_vma(mm, addr); -		if (!vma || addr+len <= vma->vm_start) -			/* remember the address as a hint for next time */ -			return (mm->free_area_cache = addr); - -		/* remember the largest hole we saw so far */ -		if (addr + mm->cached_hole_size < vma->vm_start) -			mm->cached_hole_size = vma->vm_start - addr; - -		/* try just below the current vma->vm_start */ -		addr = vma->vm_start - len; -		if (do_align) -			addr = COLOUR_ALIGN_DOWN(addr, pgoff); -	} while (len < vma->vm_start); - -bottomup:  	/*  	 * A failed mmap() very likely causes application failure,  	 * so fall back to the bottom-up function here. This scenario  	 * can happen with large stack limits and large mmap()  	 * allocations.  	 */ -	mm->cached_hole_size = ~0UL; -	mm->free_area_cache = TASK_UNMAPPED_BASE; -	addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags); -	/* -	 * Restore the topdown base: -	 */ -	mm->free_area_cache = mm->mmap_base; -	mm->cached_hole_size = ~0UL; +	if (addr & ~PAGE_MASK) { +		VM_BUG_ON(addr != -ENOMEM); +		info.flags = 0; +		info.low_limit = mm->mmap_base; +		info.high_limit = TASK_SIZE; +		addr = vm_unmapped_area(&info); +	}  	return addr;  } @@ -279,7 +193,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm)   * You really shouldn't be using read() or write() on /dev/mem.  This   * might go away in the future.   */ -int valid_phys_addr_range(unsigned long addr, size_t size) +int valid_phys_addr_range(phys_addr_t addr, size_t size)  {  	if (addr < PHYS_OFFSET)  		return 0; diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 941dfb9e9a7..9f0610243bd 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -488,7 +488,7 @@ static void __init build_mem_type_table(void)  #endif  	for (i = 0; i < 16; i++) { -		unsigned long v = pgprot_val(protection_map[i]); +		pteval_t v = pgprot_val(protection_map[i]);  		protection_map[i] = __pgprot(v | user_pgprot);  	} @@ -876,6 +876,22 @@ static void __init pci_reserve_io(void)  #define pci_reserve_io() do { } while (0)  #endif +#ifdef CONFIG_DEBUG_LL +void __init debug_ll_io_init(void) +{ +	struct map_desc map; + +	debug_ll_addr(&map.pfn, &map.virtual); +	if (!map.pfn || !map.virtual) +		return; +	map.pfn = __phys_to_pfn(map.pfn); +	map.virtual &= PAGE_MASK; +	map.length = PAGE_SIZE; +	map.type = MT_DEVICE; +	create_mapping(&map); +} +#endif +  static void * __initdata vmalloc_min =  	(void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET); diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S index b29a2265af0..eb6aa73bc8b 100644 --- a/arch/arm/mm/proc-macros.S +++ b/arch/arm/mm/proc-macros.S @@ -167,6 +167,10 @@  	tst	r1, #L_PTE_YOUNG  	tstne	r1, #L_PTE_PRESENT  	moveq	r3, #0 +#ifndef CONFIG_CPU_USE_DOMAINS +	tstne	r1, #L_PTE_NONE +	movne	r3, #0 +#endif  	str	r3, [r0]  	mcr	p15, 0, r0, c7, c10, 1		@ flush_pte diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 86b8b480634..09c5233f4df 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S @@ -89,7 +89,7 @@ ENTRY(cpu_v6_dcache_clean_area)  	mov	pc, lr  /* - *	cpu_arm926_switch_mm(pgd_phys, tsk) + *	cpu_v6_switch_mm(pgd_phys, tsk)   *   *	Set the translation table base pointer to be pgd_phys   * diff --git a/arch/arm/mm/proc-v7-2level.S b/arch/arm/mm/proc-v7-2level.S index fd045e70639..6d98c13ab82 100644 --- a/arch/arm/mm/proc-v7-2level.S +++ b/arch/arm/mm/proc-v7-2level.S @@ -100,7 +100,11 @@ ENTRY(cpu_v7_set_pte_ext)  	orrne	r3, r3, #PTE_EXT_XN  	tst	r1, #L_PTE_YOUNG -	tstne	r1, #L_PTE_PRESENT +	tstne	r1, #L_PTE_VALID +#ifndef CONFIG_CPU_USE_DOMAINS +	eorne	r1, r1, #L_PTE_NONE +	tstne	r1, #L_PTE_NONE +#endif  	moveq	r3, #0   ARM(	str	r3, [r0, #2048]! ) @@ -161,11 +165,11 @@ ENDPROC(cpu_v7_set_pte_ext)  	 *  TFR   EV X F   I D LR    S  	 * .EEE ..EE PUI. .T.T 4RVI ZWRS BLDP WCAM  	 * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced -	 *    1    0 110       0011 1100 .111 1101 < we want +	 *   01    0 110       0011 1100 .111 1101 < we want  	 */  	.align	2  	.type	v7_crval, #object  v7_crval: -	crval	clear=0x0120c302, mmuset=0x10c03c7d, ucset=0x00c01c7c +	crval	clear=0x2120c302, mmuset=0x10c03c7d, ucset=0x00c01c7c  	.previous diff --git a/arch/arm/mm/proc-v7-3level.S b/arch/arm/mm/proc-v7-3level.S index 8de0f1dd154..7b56386f949 100644 --- a/arch/arm/mm/proc-v7-3level.S +++ b/arch/arm/mm/proc-v7-3level.S @@ -65,8 +65,11 @@ ENDPROC(cpu_v7_switch_mm)   */  ENTRY(cpu_v7_set_pte_ext)  #ifdef CONFIG_MMU -	tst	r2, #L_PTE_PRESENT +	tst	r2, #L_PTE_VALID  	beq	1f +	tst	r3, #1 << (57 - 32)		@ L_PTE_NONE +	bicne	r2, #L_PTE_VALID +	bne	1f  	tst	r3, #1 << (55 - 32)		@ L_PTE_DIRTY  	orreq	r2, #L_PTE_RDONLY  1:	strd	r2, r3, [r0] diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 846d279f317..42cc833aa02 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S @@ -57,7 +57,7 @@ ENTRY(cpu_v7_reset)   THUMB(	bic	r1, r1, #1 << 30 )		@ SCTLR.TE (Thumb exceptions)  	mcr	p15, 0, r1, c1, c0, 0		@ disable MMU  	isb -	mov	pc, r0 +	bx	r0  ENDPROC(cpu_v7_reset)  	.popsection diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c index c641fb68501..a34f1e21411 100644 --- a/arch/arm/net/bpf_jit_32.c +++ b/arch/arm/net/bpf_jit_32.c @@ -16,6 +16,7 @@  #include <linux/netdevice.h>  #include <linux/string.h>  #include <linux/slab.h> +#include <linux/if_vlan.h>  #include <asm/cacheflush.h>  #include <asm/hwcap.h> @@ -42,7 +43,7 @@  #define r_skb_hl	ARM_R8  #define SCRATCH_SP_OFFSET	0 -#define SCRATCH_OFF(k)		(SCRATCH_SP_OFFSET + (k)) +#define SCRATCH_OFF(k)		(SCRATCH_SP_OFFSET + 4 * (k))  #define SEEN_MEM		((1 << BPF_MEMWORDS) - 1)  #define SEEN_MEM_WORD(k)	(1 << (k)) @@ -168,6 +169,8 @@ static inline bool is_load_to_a(u16 inst)  	case BPF_S_ANC_MARK:  	case BPF_S_ANC_PROTOCOL:  	case BPF_S_ANC_RXHASH: +	case BPF_S_ANC_VLAN_TAG: +	case BPF_S_ANC_VLAN_TAG_PRESENT:  	case BPF_S_ANC_QUEUE:  		return true;  	default: @@ -646,6 +649,16 @@ load_ind:  			update_on_xread(ctx);  			emit(ARM_ORR_R(r_A, r_A, r_X), ctx);  			break; +		case BPF_S_ALU_XOR_K: +			/* A ^= K; */ +			OP_IMM3(ARM_EOR, r_A, r_A, k, ctx); +			break; +		case BPF_S_ANC_ALU_XOR_X: +		case BPF_S_ALU_XOR_X: +			/* A ^= X */ +			update_on_xread(ctx); +			emit(ARM_EOR_R(r_A, r_A, r_X), ctx); +			break;  		case BPF_S_ALU_AND_K:  			/* A &= K */  			OP_IMM3(ARM_AND, r_A, r_A, k, ctx); @@ -762,11 +775,6 @@ b_epilogue:  			update_on_xread(ctx);  			emit(ARM_MOV_R(r_A, r_X), ctx);  			break; -		case BPF_S_ANC_ALU_XOR_X: -			/* A ^= X */ -			update_on_xread(ctx); -			emit(ARM_EOR_R(r_A, r_A, r_X), ctx); -			break;  		case BPF_S_ANC_PROTOCOL:  			/* A = ntohs(skb->protocol) */  			ctx->seen |= SEEN_SKB; @@ -810,6 +818,17 @@ b_epilogue:  			off = offsetof(struct sk_buff, rxhash);  			emit(ARM_LDR_I(r_A, r_skb, off), ctx);  			break; +		case BPF_S_ANC_VLAN_TAG: +		case BPF_S_ANC_VLAN_TAG_PRESENT: +			ctx->seen |= SEEN_SKB; +			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, vlan_tci) != 2); +			off = offsetof(struct sk_buff, vlan_tci); +			emit(ARM_LDRH_I(r_A, r_skb, off), ctx); +			if (inst->code == BPF_S_ANC_VLAN_TAG) +				OP_IMM3(ARM_AND, r_A, r_A, VLAN_VID_MASK, ctx); +			else +				OP_IMM3(ARM_AND, r_A, r_A, VLAN_TAG_PRESENT, ctx); +			break;  		case BPF_S_ANC_QUEUE:  			ctx->seen |= SEEN_SKB;  			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, @@ -845,7 +864,7 @@ void bpf_jit_compile(struct sk_filter *fp)  	ctx.skf		= fp;  	ctx.ret0_fp_idx = -1; -	ctx.offsets = kzalloc(GFP_KERNEL, 4 * (ctx.skf->len + 1)); +	ctx.offsets = kzalloc(4 * (ctx.skf->len + 1), GFP_KERNEL);  	if (ctx.offsets == NULL)  		return; @@ -864,7 +883,7 @@ void bpf_jit_compile(struct sk_filter *fp)  	ctx.idx += ctx.imm_count;  	if (ctx.imm_count) { -		ctx.imms = kzalloc(GFP_KERNEL, 4 * ctx.imm_count); +		ctx.imms = kzalloc(4 * ctx.imm_count, GFP_KERNEL);  		if (ctx.imms == NULL)  			goto out;  	} diff --git a/arch/arm/net/bpf_jit_32.h b/arch/arm/net/bpf_jit_32.h index 7fa2f7d3cb9..afb84621ff6 100644 --- a/arch/arm/net/bpf_jit_32.h +++ b/arch/arm/net/bpf_jit_32.h @@ -69,6 +69,7 @@  #define ARM_INST_CMP_I		0x03500000  #define ARM_INST_EOR_R		0x00200000 +#define ARM_INST_EOR_I		0x02200000  #define ARM_INST_LDRB_I		0x05d00000  #define ARM_INST_LDRB_R		0x07d00000 @@ -135,6 +136,7 @@  #define ARM_CMP_I(rn, imm)	_AL3_I(ARM_INST_CMP, 0, rn, imm)  #define ARM_EOR_R(rd, rn, rm)	_AL3_R(ARM_INST_EOR, rd, rn, rm) +#define ARM_EOR_I(rd, rn, imm)	_AL3_I(ARM_INST_EOR, rd, rn, imm)  #define ARM_LDR_I(rt, rn, off)	(ARM_INST_LDR_I | (rt) << 12 | (rn) << 16 \  				 | (off)) diff --git a/arch/arm/plat-mxc/devices/platform-mx2-emma.c b/arch/arm/plat-mxc/devices/platform-mx2-emma.c new file mode 100644 index 00000000000..508404ddd4e --- /dev/null +++ b/arch/arm/plat-mxc/devices/platform-mx2-emma.c @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2010 Pengutronix + * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.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 <mach/hardware.h> +#include <mach/devices-common.h> + +#define imx_mx2_emmaprp_data_entry_single(soc)				\ +	{								\ +		.iobase = soc ## _EMMAPRP_BASE_ADDR,			\ +		.iosize = SZ_32,					\ +		.irq = soc ## _INT_EMMAPRP,				\ +	} + +#ifdef CONFIG_SOC_IMX27 +const struct imx_mx2_emma_data imx27_mx2_emmaprp_data __initconst = +	imx_mx2_emmaprp_data_entry_single(MX27); +#endif /* ifdef CONFIG_SOC_IMX27 */ + +struct platform_device *__init imx_add_mx2_emmaprp( +		const struct imx_mx2_emma_data *data) +{ +	struct resource res[] = { +		{ +			.start = data->iobase, +			.end = data->iobase + data->iosize - 1, +			.flags = IORESOURCE_MEM, +		}, { +			.start = data->irq, +			.end = data->irq, +			.flags = IORESOURCE_IRQ, +		}, +	}; +	return imx_add_platform_device_dmamask("m2m-emmaprp", 0, +			res, 2, NULL, 0, DMA_BIT_MASK(32)); +} diff --git a/arch/arm/plat-nomadik/Kconfig b/arch/arm/plat-nomadik/Kconfig deleted file mode 100644 index 19f55cae5d7..00000000000 --- a/arch/arm/plat-nomadik/Kconfig +++ /dev/null @@ -1,29 +0,0 @@ -# We keep common IP's here for Nomadik and other similar -# familiy of processors from ST-Ericsson. At the moment we have -# just MTU, others to follow soon. - -config PLAT_NOMADIK -	bool -	depends on ARCH_NOMADIK || ARCH_U8500 -	default y -	select CLKSRC_MMIO -	help -	  Common platform code for Nomadik and other ST-Ericsson -	  platforms. - -if PLAT_NOMADIK - -config HAS_MTU -	bool -	help -	  Support for Multi Timer Unit. MTU provides access -	  to multiple interrupt generating programmable -	  32-bit free running decrementing counters. - -config NOMADIK_MTU_SCHED_CLOCK -	bool -	depends on HAS_MTU -	help -	  Use the Multi Timer Unit as the sched_clock. - -endif diff --git a/arch/arm/plat-nomadik/Makefile b/arch/arm/plat-nomadik/Makefile deleted file mode 100644 index 37c7cdd0f8f..00000000000 --- a/arch/arm/plat-nomadik/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# arch/arm/plat-nomadik/Makefile -# Copyright 2009 ST-Ericsson -# Licensed under GPLv2 - -obj-$(CONFIG_HAS_MTU)	+= timer.o diff --git a/arch/arm/plat-nomadik/include/plat/gpio-nomadik.h b/arch/arm/plat-nomadik/include/plat/gpio-nomadik.h deleted file mode 100644 index c08a54d9d88..00000000000 --- a/arch/arm/plat-nomadik/include/plat/gpio-nomadik.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Structures and registers for GPIO access in the Nomadik SoC - * - * Copyright (C) 2008 STMicroelectronics - *     Author: Prafulla WADASKAR <prafulla.wadaskar@st.com> - * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it> - * - * 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_NOMADIK_GPIO -#define __PLAT_NOMADIK_GPIO - -/* - * "nmk_gpio" and "NMK_GPIO" stand for "Nomadik GPIO", leaving - * the "gpio" namespace for generic and cross-machine functions - */ - -/* Register in the logic block */ -#define NMK_GPIO_DAT	0x00 -#define NMK_GPIO_DATS	0x04 -#define NMK_GPIO_DATC	0x08 -#define NMK_GPIO_PDIS	0x0c -#define NMK_GPIO_DIR	0x10 -#define NMK_GPIO_DIRS	0x14 -#define NMK_GPIO_DIRC	0x18 -#define NMK_GPIO_SLPC	0x1c -#define NMK_GPIO_AFSLA	0x20 -#define NMK_GPIO_AFSLB	0x24 -#define NMK_GPIO_LOWEMI	0x28 - -#define NMK_GPIO_RIMSC	0x40 -#define NMK_GPIO_FIMSC	0x44 -#define NMK_GPIO_IS	0x48 -#define NMK_GPIO_IC	0x4c -#define NMK_GPIO_RWIMSC	0x50 -#define NMK_GPIO_FWIMSC	0x54 -#define NMK_GPIO_WKS	0x58 - -/* Alternate functions: function C is set in hw by setting both A and B */ -#define NMK_GPIO_ALT_GPIO	0 -#define NMK_GPIO_ALT_A	1 -#define NMK_GPIO_ALT_B	2 -#define NMK_GPIO_ALT_C	(NMK_GPIO_ALT_A | NMK_GPIO_ALT_B) - -#define NMK_GPIO_ALT_CX_SHIFT 2 -#define NMK_GPIO_ALT_C1	((1<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) -#define NMK_GPIO_ALT_C2	((2<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) -#define NMK_GPIO_ALT_C3	((3<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) -#define NMK_GPIO_ALT_C4	((4<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) - -/* Pull up/down values */ -enum nmk_gpio_pull { -	NMK_GPIO_PULL_NONE, -	NMK_GPIO_PULL_UP, -	NMK_GPIO_PULL_DOWN, -}; - -/* Sleep mode */ -enum nmk_gpio_slpm { -	NMK_GPIO_SLPM_INPUT, -	NMK_GPIO_SLPM_WAKEUP_ENABLE = NMK_GPIO_SLPM_INPUT, -	NMK_GPIO_SLPM_NOCHANGE, -	NMK_GPIO_SLPM_WAKEUP_DISABLE = NMK_GPIO_SLPM_NOCHANGE, -}; - -extern int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode); -extern int nmk_gpio_set_pull(int gpio, enum nmk_gpio_pull pull); -#ifdef CONFIG_PINCTRL_NOMADIK -extern int nmk_gpio_set_mode(int gpio, int gpio_mode); -#else -static inline int nmk_gpio_set_mode(int gpio, int gpio_mode) -{ -	return -ENODEV; -} -#endif -extern int nmk_gpio_get_mode(int gpio); - -extern void nmk_gpio_wakeups_suspend(void); -extern void nmk_gpio_wakeups_resume(void); - -extern void nmk_gpio_clocks_enable(void); -extern void nmk_gpio_clocks_disable(void); - -extern void nmk_gpio_read_pull(int gpio_bank, u32 *pull_up); - -/* - * Platform data to register a block: only the initial gpio/irq number. - */ -struct nmk_gpio_platform_data { -	char *name; -	int first_gpio; -	int first_irq; -	int num_gpio; -	u32 (*get_secondary_status)(unsigned int bank); -	void (*set_ioforce)(bool enable); -	bool supports_sleepmode; -}; - -#endif /* __PLAT_NOMADIK_GPIO */ diff --git a/arch/arm/plat-nomadik/include/plat/mtu.h b/arch/arm/plat-nomadik/include/plat/mtu.h deleted file mode 100644 index 582641f3dc0..00000000000 --- a/arch/arm/plat-nomadik/include/plat/mtu.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __PLAT_MTU_H -#define __PLAT_MTU_H - -void nmdk_timer_init(void __iomem *base); -void nmdk_clkevt_reset(void); -void nmdk_clksrc_reset(void); - -#endif /* __PLAT_MTU_H */ - diff --git a/arch/arm/plat-nomadik/include/plat/pincfg.h b/arch/arm/plat-nomadik/include/plat/pincfg.h deleted file mode 100644 index 3b8ec60af35..00000000000 --- a/arch/arm/plat-nomadik/include/plat/pincfg.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * License terms: GNU General Public License, version 2 - * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson - * - * Based on arch/arm/mach-pxa/include/mach/mfp.h: - *   Copyright (C) 2007 Marvell International Ltd. - *   eric miao <eric.miao@marvell.com> - */ - -#ifndef __PLAT_PINCFG_H -#define __PLAT_PINCFG_H - -/* - * pin configurations are represented by 32-bit integers: - * - *	bit  0.. 8 - Pin Number (512 Pins Maximum) - *	bit  9..10 - Alternate Function Selection - *	bit 11..12 - Pull up/down state - *	bit     13 - Sleep mode behaviour - *	bit     14 - Direction - *	bit     15 - Value (if output) - *	bit 16..18 - SLPM pull up/down state - *	bit 19..20 - SLPM direction - *	bit 21..22 - SLPM Value (if output) - *	bit 23..25 - PDIS value (if input) - *	bit	26 - Gpio mode - *	bit	27 - Sleep mode - * - * to facilitate the definition, the following macros are provided - * - * PIN_CFG_DEFAULT - default config (0): - *		     pull up/down = disabled - *		     sleep mode = input/wakeup - *		     direction = input - *		     value = low - *		     SLPM direction = same as normal - *		     SLPM pull = same as normal - *		     SLPM value = same as normal - * - * PIN_CFG	   - default config with alternate function - */ - -typedef unsigned long pin_cfg_t; - -#define PIN_NUM_MASK		0x1ff -#define PIN_NUM(x)		((x) & PIN_NUM_MASK) - -#define PIN_ALT_SHIFT		9 -#define PIN_ALT_MASK		(0x3 << PIN_ALT_SHIFT) -#define PIN_ALT(x)		(((x) & PIN_ALT_MASK) >> PIN_ALT_SHIFT) -#define PIN_GPIO		(NMK_GPIO_ALT_GPIO << PIN_ALT_SHIFT) -#define PIN_ALT_A		(NMK_GPIO_ALT_A << PIN_ALT_SHIFT) -#define PIN_ALT_B		(NMK_GPIO_ALT_B << PIN_ALT_SHIFT) -#define PIN_ALT_C		(NMK_GPIO_ALT_C << PIN_ALT_SHIFT) - -#define PIN_PULL_SHIFT		11 -#define PIN_PULL_MASK		(0x3 << PIN_PULL_SHIFT) -#define PIN_PULL(x)		(((x) & PIN_PULL_MASK) >> PIN_PULL_SHIFT) -#define PIN_PULL_NONE		(NMK_GPIO_PULL_NONE << PIN_PULL_SHIFT) -#define PIN_PULL_UP		(NMK_GPIO_PULL_UP << PIN_PULL_SHIFT) -#define PIN_PULL_DOWN		(NMK_GPIO_PULL_DOWN << PIN_PULL_SHIFT) - -#define PIN_SLPM_SHIFT		13 -#define PIN_SLPM_MASK		(0x1 << PIN_SLPM_SHIFT) -#define PIN_SLPM(x)		(((x) & PIN_SLPM_MASK) >> PIN_SLPM_SHIFT) -#define PIN_SLPM_MAKE_INPUT	(NMK_GPIO_SLPM_INPUT << PIN_SLPM_SHIFT) -#define PIN_SLPM_NOCHANGE	(NMK_GPIO_SLPM_NOCHANGE << PIN_SLPM_SHIFT) -/* These two replace the above in DB8500v2+ */ -#define PIN_SLPM_WAKEUP_ENABLE	(NMK_GPIO_SLPM_WAKEUP_ENABLE << PIN_SLPM_SHIFT) -#define PIN_SLPM_WAKEUP_DISABLE	(NMK_GPIO_SLPM_WAKEUP_DISABLE << PIN_SLPM_SHIFT) -#define PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP PIN_SLPM_WAKEUP_DISABLE - -#define PIN_SLPM_GPIO  PIN_SLPM_WAKEUP_ENABLE /* In SLPM, pin is a gpio */ -#define PIN_SLPM_ALTFUNC PIN_SLPM_WAKEUP_DISABLE /* In SLPM, pin is altfunc */ - -#define PIN_DIR_SHIFT		14 -#define PIN_DIR_MASK		(0x1 << PIN_DIR_SHIFT) -#define PIN_DIR(x)		(((x) & PIN_DIR_MASK) >> PIN_DIR_SHIFT) -#define PIN_DIR_INPUT		(0 << PIN_DIR_SHIFT) -#define PIN_DIR_OUTPUT		(1 << PIN_DIR_SHIFT) - -#define PIN_VAL_SHIFT		15 -#define PIN_VAL_MASK		(0x1 << PIN_VAL_SHIFT) -#define PIN_VAL(x)		(((x) & PIN_VAL_MASK) >> PIN_VAL_SHIFT) -#define PIN_VAL_LOW		(0 << PIN_VAL_SHIFT) -#define PIN_VAL_HIGH		(1 << PIN_VAL_SHIFT) - -#define PIN_SLPM_PULL_SHIFT	16 -#define PIN_SLPM_PULL_MASK	(0x7 << PIN_SLPM_PULL_SHIFT) -#define PIN_SLPM_PULL(x)	\ -	(((x) & PIN_SLPM_PULL_MASK) >> PIN_SLPM_PULL_SHIFT) -#define PIN_SLPM_PULL_NONE	\ -	((1 + NMK_GPIO_PULL_NONE) << PIN_SLPM_PULL_SHIFT) -#define PIN_SLPM_PULL_UP	\ -	((1 + NMK_GPIO_PULL_UP) << PIN_SLPM_PULL_SHIFT) -#define PIN_SLPM_PULL_DOWN	\ -	((1 + NMK_GPIO_PULL_DOWN) << PIN_SLPM_PULL_SHIFT) - -#define PIN_SLPM_DIR_SHIFT	19 -#define PIN_SLPM_DIR_MASK	(0x3 << PIN_SLPM_DIR_SHIFT) -#define PIN_SLPM_DIR(x)		\ -	(((x) & PIN_SLPM_DIR_MASK) >> PIN_SLPM_DIR_SHIFT) -#define PIN_SLPM_DIR_INPUT	((1 + 0) << PIN_SLPM_DIR_SHIFT) -#define PIN_SLPM_DIR_OUTPUT	((1 + 1) << PIN_SLPM_DIR_SHIFT) - -#define PIN_SLPM_VAL_SHIFT	21 -#define PIN_SLPM_VAL_MASK	(0x3 << PIN_SLPM_VAL_SHIFT) -#define PIN_SLPM_VAL(x)		\ -	(((x) & PIN_SLPM_VAL_MASK) >> PIN_SLPM_VAL_SHIFT) -#define PIN_SLPM_VAL_LOW	((1 + 0) << PIN_SLPM_VAL_SHIFT) -#define PIN_SLPM_VAL_HIGH	((1 + 1) << PIN_SLPM_VAL_SHIFT) - -#define PIN_SLPM_PDIS_SHIFT		23 -#define PIN_SLPM_PDIS_MASK		(0x3 << PIN_SLPM_PDIS_SHIFT) -#define PIN_SLPM_PDIS(x)	\ -	(((x) & PIN_SLPM_PDIS_MASK) >> PIN_SLPM_PDIS_SHIFT) -#define PIN_SLPM_PDIS_NO_CHANGE		(0 << PIN_SLPM_PDIS_SHIFT) -#define PIN_SLPM_PDIS_DISABLED		(1 << PIN_SLPM_PDIS_SHIFT) -#define PIN_SLPM_PDIS_ENABLED		(2 << PIN_SLPM_PDIS_SHIFT) - -#define PIN_LOWEMI_SHIFT	25 -#define PIN_LOWEMI_MASK		(0x1 << PIN_LOWEMI_SHIFT) -#define PIN_LOWEMI(x)		(((x) & PIN_LOWEMI_MASK) >> PIN_LOWEMI_SHIFT) -#define PIN_LOWEMI_DISABLED	(0 << PIN_LOWEMI_SHIFT) -#define PIN_LOWEMI_ENABLED	(1 << PIN_LOWEMI_SHIFT) - -#define PIN_GPIOMODE_SHIFT	26 -#define PIN_GPIOMODE_MASK	(0x1 << PIN_GPIOMODE_SHIFT) -#define PIN_GPIOMODE(x)		(((x) & PIN_GPIOMODE_MASK) >> PIN_GPIOMODE_SHIFT) -#define PIN_GPIOMODE_DISABLED	(0 << PIN_GPIOMODE_SHIFT) -#define PIN_GPIOMODE_ENABLED	(1 << PIN_GPIOMODE_SHIFT) - -#define PIN_SLEEPMODE_SHIFT	27 -#define PIN_SLEEPMODE_MASK	(0x1 << PIN_SLEEPMODE_SHIFT) -#define PIN_SLEEPMODE(x)	(((x) & PIN_SLEEPMODE_MASK) >> PIN_SLEEPMODE_SHIFT) -#define PIN_SLEEPMODE_DISABLED	(0 << PIN_SLEEPMODE_SHIFT) -#define PIN_SLEEPMODE_ENABLED	(1 << PIN_SLEEPMODE_SHIFT) - - -/* Shortcuts.  Use these instead of separate DIR, PULL, and VAL.  */ -#define PIN_INPUT_PULLDOWN	(PIN_DIR_INPUT | PIN_PULL_DOWN) -#define PIN_INPUT_PULLUP	(PIN_DIR_INPUT | PIN_PULL_UP) -#define PIN_INPUT_NOPULL	(PIN_DIR_INPUT | PIN_PULL_NONE) -#define PIN_OUTPUT_LOW		(PIN_DIR_OUTPUT | PIN_VAL_LOW) -#define PIN_OUTPUT_HIGH		(PIN_DIR_OUTPUT | PIN_VAL_HIGH) - -#define PIN_SLPM_INPUT_PULLDOWN	(PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_DOWN) -#define PIN_SLPM_INPUT_PULLUP	(PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_UP) -#define PIN_SLPM_INPUT_NOPULL	(PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_NONE) -#define PIN_SLPM_OUTPUT_LOW	(PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_LOW) -#define PIN_SLPM_OUTPUT_HIGH	(PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_HIGH) - -#define PIN_CFG_DEFAULT		(0) - -#define PIN_CFG(num, alt)		\ -	(PIN_CFG_DEFAULT |\ -	 (PIN_NUM(num) | PIN_##alt)) - -#define PIN_CFG_INPUT(num, alt, pull)		\ -	(PIN_CFG_DEFAULT |\ -	 (PIN_NUM(num) | PIN_##alt | PIN_INPUT_##pull)) - -#define PIN_CFG_OUTPUT(num, alt, val)		\ -	(PIN_CFG_DEFAULT |\ -	 (PIN_NUM(num) | PIN_##alt | PIN_OUTPUT_##val)) - -extern int nmk_config_pin(pin_cfg_t cfg, bool sleep); -extern int nmk_config_pins(pin_cfg_t *cfgs, int num); -extern int nmk_config_pins_sleep(pin_cfg_t *cfgs, int num); - -#endif diff --git a/arch/arm/plat-nomadik/include/plat/ste_dma40.h b/arch/arm/plat-nomadik/include/plat/ste_dma40.h deleted file mode 100644 index 9ff93b06568..00000000000 --- a/arch/arm/plat-nomadik/include/plat/ste_dma40.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2007-2010 - * Author: Per Forlin <per.forlin@stericsson.com> for ST-Ericsson - * Author: Jonas Aaberg <jonas.aberg@stericsson.com> for ST-Ericsson - * License terms: GNU General Public License (GPL) version 2 - */ - - -#ifndef STE_DMA40_H -#define STE_DMA40_H - -#include <linux/dmaengine.h> -#include <linux/scatterlist.h> -#include <linux/workqueue.h> -#include <linux/interrupt.h> - -/* - * Maxium size for a single dma descriptor - * Size is limited to 16 bits. - * Size is in the units of addr-widths (1,2,4,8 bytes) - * Larger transfers will be split up to multiple linked desc - */ -#define STEDMA40_MAX_SEG_SIZE 0xFFFF - -/* dev types for memcpy */ -#define STEDMA40_DEV_DST_MEMORY (-1) -#define	STEDMA40_DEV_SRC_MEMORY (-1) - -enum stedma40_mode { -	STEDMA40_MODE_LOGICAL = 0, -	STEDMA40_MODE_PHYSICAL, -	STEDMA40_MODE_OPERATION, -}; - -enum stedma40_mode_opt { -	STEDMA40_PCHAN_BASIC_MODE = 0, -	STEDMA40_LCHAN_SRC_LOG_DST_LOG = 0, -	STEDMA40_PCHAN_MODULO_MODE, -	STEDMA40_PCHAN_DOUBLE_DST_MODE, -	STEDMA40_LCHAN_SRC_PHY_DST_LOG, -	STEDMA40_LCHAN_SRC_LOG_DST_PHY, -}; - -#define STEDMA40_ESIZE_8_BIT  0x0 -#define STEDMA40_ESIZE_16_BIT 0x1 -#define STEDMA40_ESIZE_32_BIT 0x2 -#define STEDMA40_ESIZE_64_BIT 0x3 - -/* The value 4 indicates that PEN-reg shall be set to 0 */ -#define STEDMA40_PSIZE_PHY_1  0x4 -#define STEDMA40_PSIZE_PHY_2  0x0 -#define STEDMA40_PSIZE_PHY_4  0x1 -#define STEDMA40_PSIZE_PHY_8  0x2 -#define STEDMA40_PSIZE_PHY_16 0x3 - -/* - * The number of elements differ in logical and - * physical mode - */ -#define STEDMA40_PSIZE_LOG_1  STEDMA40_PSIZE_PHY_2 -#define STEDMA40_PSIZE_LOG_4  STEDMA40_PSIZE_PHY_4 -#define STEDMA40_PSIZE_LOG_8  STEDMA40_PSIZE_PHY_8 -#define STEDMA40_PSIZE_LOG_16 STEDMA40_PSIZE_PHY_16 - -/* Maximum number of possible physical channels */ -#define STEDMA40_MAX_PHYS 32 - -enum stedma40_flow_ctrl { -	STEDMA40_NO_FLOW_CTRL, -	STEDMA40_FLOW_CTRL, -}; - -enum stedma40_periph_data_width { -	STEDMA40_BYTE_WIDTH = STEDMA40_ESIZE_8_BIT, -	STEDMA40_HALFWORD_WIDTH = STEDMA40_ESIZE_16_BIT, -	STEDMA40_WORD_WIDTH = STEDMA40_ESIZE_32_BIT, -	STEDMA40_DOUBLEWORD_WIDTH = STEDMA40_ESIZE_64_BIT -}; - -enum stedma40_xfer_dir { -	STEDMA40_MEM_TO_MEM = 1, -	STEDMA40_MEM_TO_PERIPH, -	STEDMA40_PERIPH_TO_MEM, -	STEDMA40_PERIPH_TO_PERIPH -}; - - -/** - * struct stedma40_chan_cfg - dst/src channel configuration - * - * @big_endian: true if the src/dst should be read as big endian - * @data_width: Data width of the src/dst hardware - * @p_size: Burst size - * @flow_ctrl: Flow control on/off. - */ -struct stedma40_half_channel_info { -	bool big_endian; -	enum stedma40_periph_data_width data_width; -	int psize; -	enum stedma40_flow_ctrl flow_ctrl; -}; - -/** - * struct stedma40_chan_cfg - Structure to be filled by client drivers. - * - * @dir: MEM 2 MEM, PERIPH 2 MEM , MEM 2 PERIPH, PERIPH 2 PERIPH - * @high_priority: true if high-priority - * @realtime: true if realtime mode is to be enabled.  Only available on DMA40 - * version 3+, i.e DB8500v2+ - * @mode: channel mode: physical, logical, or operation - * @mode_opt: options for the chosen channel mode - * @src_dev_type: Src device type - * @dst_dev_type: Dst device type - * @src_info: Parameters for dst half channel - * @dst_info: Parameters for dst half channel - * @use_fixed_channel: if true, use physical channel specified by phy_channel - * @phy_channel: physical channel to use, only if use_fixed_channel is true - * - * This structure has to be filled by the client drivers. - * It is recommended to do all dma configurations for clients in the machine. - * - */ -struct stedma40_chan_cfg { -	enum stedma40_xfer_dir			 dir; -	bool					 high_priority; -	bool					 realtime; -	enum stedma40_mode			 mode; -	enum stedma40_mode_opt			 mode_opt; -	int					 src_dev_type; -	int					 dst_dev_type; -	struct stedma40_half_channel_info	 src_info; -	struct stedma40_half_channel_info	 dst_info; - -	bool					 use_fixed_channel; -	int					 phy_channel; -}; - -/** - * struct stedma40_platform_data - Configuration struct for the dma device. - * - * @dev_len: length of dev_tx and dev_rx - * @dev_tx: mapping between destination event line and io address - * @dev_rx: mapping between source event line and io address - * @memcpy: list of memcpy event lines - * @memcpy_len: length of memcpy - * @memcpy_conf_phy: default configuration of physical channel memcpy - * @memcpy_conf_log: default configuration of logical channel memcpy - * @disabled_channels: A vector, ending with -1, that marks physical channels - * that are for different reasons not available for the driver. - */ -struct stedma40_platform_data { -	u32				 dev_len; -	const dma_addr_t		*dev_tx; -	const dma_addr_t		*dev_rx; -	int				*memcpy; -	u32				 memcpy_len; -	struct stedma40_chan_cfg	*memcpy_conf_phy; -	struct stedma40_chan_cfg	*memcpy_conf_log; -	int				 disabled_channels[STEDMA40_MAX_PHYS]; -	bool				 use_esram_lcla; -}; - -#ifdef CONFIG_STE_DMA40 - -/** - * stedma40_filter() - Provides stedma40_chan_cfg to the - * ste_dma40 dma driver via the dmaengine framework. - * does some checking of what's provided. - * - * Never directly called by client. It used by dmaengine. - * @chan: dmaengine handle. - * @data: Must be of type: struct stedma40_chan_cfg and is - * the configuration of the framework. - * - * - */ - -bool stedma40_filter(struct dma_chan *chan, void *data); - -/** - * stedma40_slave_mem() - Transfers a raw data buffer to or from a slave - * (=device) - * - * @chan: dmaengine handle - * @addr: source or destination physicall address. - * @size: bytes to transfer - * @direction: direction of transfer - * @flags: is actually enum dma_ctrl_flags. See dmaengine.h - */ - -static inline struct -dma_async_tx_descriptor *stedma40_slave_mem(struct dma_chan *chan, -					    dma_addr_t addr, -					    unsigned int size, -					    enum dma_transfer_direction direction, -					    unsigned long flags) -{ -	struct scatterlist sg; -	sg_init_table(&sg, 1); -	sg.dma_address = addr; -	sg.length = size; - -	return dmaengine_prep_slave_sg(chan, &sg, 1, direction, flags); -} - -#else -static inline bool stedma40_filter(struct dma_chan *chan, void *data) -{ -	return false; -} - -static inline struct -dma_async_tx_descriptor *stedma40_slave_mem(struct dma_chan *chan, -					    dma_addr_t addr, -					    unsigned int size, -					    enum dma_transfer_direction direction, -					    unsigned long flags) -{ -	return NULL; -} -#endif - -#endif diff --git a/arch/arm/plat-nomadik/timer.c b/arch/arm/plat-nomadik/timer.c deleted file mode 100644 index 9222e5522a4..00000000000 --- a/arch/arm/plat-nomadik/timer.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - *  linux/arch/arm/plat-nomadik/timer.c - * - * Copyright (C) 2008 STMicroelectronics - * Copyright (C) 2010 Alessandro Rubini - * Copyright (C) 2010 Linus Walleij for ST-Ericsson - * - * 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/interrupt.h> -#include <linux/irq.h> -#include <linux/io.h> -#include <linux/clockchips.h> -#include <linux/clk.h> -#include <linux/jiffies.h> -#include <linux/err.h> -#include <asm/mach/time.h> -#include <asm/sched_clock.h> - -/* - * The MTU device hosts four different counters, with 4 set of - * registers. These are register names. - */ - -#define MTU_IMSC	0x00	/* Interrupt mask set/clear */ -#define MTU_RIS		0x04	/* Raw interrupt status */ -#define MTU_MIS		0x08	/* Masked interrupt status */ -#define MTU_ICR		0x0C	/* Interrupt clear register */ - -/* per-timer registers take 0..3 as argument */ -#define MTU_LR(x)	(0x10 + 0x10 * (x) + 0x00)	/* Load value */ -#define MTU_VAL(x)	(0x10 + 0x10 * (x) + 0x04)	/* Current value */ -#define MTU_CR(x)	(0x10 + 0x10 * (x) + 0x08)	/* Control reg */ -#define MTU_BGLR(x)	(0x10 + 0x10 * (x) + 0x0c)	/* At next overflow */ - -/* bits for the control register */ -#define MTU_CRn_ENA		0x80 -#define MTU_CRn_PERIODIC	0x40	/* if 0 = free-running */ -#define MTU_CRn_PRESCALE_MASK	0x0c -#define MTU_CRn_PRESCALE_1		0x00 -#define MTU_CRn_PRESCALE_16		0x04 -#define MTU_CRn_PRESCALE_256		0x08 -#define MTU_CRn_32BITS		0x02 -#define MTU_CRn_ONESHOT		0x01	/* if 0 = wraps reloading from BGLR*/ - -/* Other registers are usual amba/primecell registers, currently not used */ -#define MTU_ITCR	0xff0 -#define MTU_ITOP	0xff4 - -#define MTU_PERIPH_ID0	0xfe0 -#define MTU_PERIPH_ID1	0xfe4 -#define MTU_PERIPH_ID2	0xfe8 -#define MTU_PERIPH_ID3	0xfeC - -#define MTU_PCELL0	0xff0 -#define MTU_PCELL1	0xff4 -#define MTU_PCELL2	0xff8 -#define MTU_PCELL3	0xffC - -static void __iomem *mtu_base; -static bool clkevt_periodic; -static u32 clk_prescale; -static u32 nmdk_cycle;		/* write-once */ - -#ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK -/* - * Override the global weak sched_clock symbol with this - * local implementation which uses the clocksource to get some - * better resolution when scheduling the kernel. - */ -static u32 notrace nomadik_read_sched_clock(void) -{ -	if (unlikely(!mtu_base)) -		return 0; - -	return -readl(mtu_base + MTU_VAL(0)); -} -#endif - -/* Clockevent device: use one-shot mode */ -static int nmdk_clkevt_next(unsigned long evt, struct clock_event_device *ev) -{ -	writel(1 << 1, mtu_base + MTU_IMSC); -	writel(evt, mtu_base + MTU_LR(1)); -	/* Load highest value, enable device, enable interrupts */ -	writel(MTU_CRn_ONESHOT | clk_prescale | -	       MTU_CRn_32BITS | MTU_CRn_ENA, -	       mtu_base + MTU_CR(1)); - -	return 0; -} - -void nmdk_clkevt_reset(void) -{ -	if (clkevt_periodic) { -		/* Timer: configure load and background-load, and fire it up */ -		writel(nmdk_cycle, mtu_base + MTU_LR(1)); -		writel(nmdk_cycle, mtu_base + MTU_BGLR(1)); - -		writel(MTU_CRn_PERIODIC | clk_prescale | -		       MTU_CRn_32BITS | MTU_CRn_ENA, -		       mtu_base + MTU_CR(1)); -		writel(1 << 1, mtu_base + MTU_IMSC); -	} else { -		/* Generate an interrupt to start the clockevent again */ -		(void) nmdk_clkevt_next(nmdk_cycle, NULL); -	} -} - -static void nmdk_clkevt_mode(enum clock_event_mode mode, -			     struct clock_event_device *dev) -{ -	switch (mode) { -	case CLOCK_EVT_MODE_PERIODIC: -		clkevt_periodic = true; -		nmdk_clkevt_reset(); -		break; -	case CLOCK_EVT_MODE_ONESHOT: -		clkevt_periodic = false; -		break; -	case CLOCK_EVT_MODE_SHUTDOWN: -	case CLOCK_EVT_MODE_UNUSED: -		writel(0, mtu_base + MTU_IMSC); -		/* disable timer */ -		writel(0, mtu_base + MTU_CR(1)); -		/* load some high default value */ -		writel(0xffffffff, mtu_base + MTU_LR(1)); -		break; -	case CLOCK_EVT_MODE_RESUME: -		break; -	} -} - -static struct clock_event_device nmdk_clkevt = { -	.name		= "mtu_1", -	.features	= CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC, -	.rating		= 200, -	.set_mode	= nmdk_clkevt_mode, -	.set_next_event	= nmdk_clkevt_next, -}; - -/* - * IRQ Handler for timer 1 of the MTU block. - */ -static irqreturn_t nmdk_timer_interrupt(int irq, void *dev_id) -{ -	struct clock_event_device *evdev = dev_id; - -	writel(1 << 1, mtu_base + MTU_ICR); /* Interrupt clear reg */ -	evdev->event_handler(evdev); -	return IRQ_HANDLED; -} - -static struct irqaction nmdk_timer_irq = { -	.name		= "Nomadik Timer Tick", -	.flags		= IRQF_DISABLED | IRQF_TIMER, -	.handler	= nmdk_timer_interrupt, -	.dev_id		= &nmdk_clkevt, -}; - -void nmdk_clksrc_reset(void) -{ -	/* Disable */ -	writel(0, mtu_base + MTU_CR(0)); - -	/* ClockSource: configure load and background-load, and fire it up */ -	writel(nmdk_cycle, mtu_base + MTU_LR(0)); -	writel(nmdk_cycle, mtu_base + MTU_BGLR(0)); - -	writel(clk_prescale | MTU_CRn_32BITS | MTU_CRn_ENA, -	       mtu_base + MTU_CR(0)); -} - -void __init nmdk_timer_init(void __iomem *base) -{ -	unsigned long rate; -	struct clk *clk0; - -	mtu_base = base; -	clk0 = clk_get_sys("mtu0", NULL); -	BUG_ON(IS_ERR(clk0)); -	BUG_ON(clk_prepare(clk0) < 0); -	BUG_ON(clk_enable(clk0) < 0); - -	/* -	 * Tick rate is 2.4MHz for Nomadik and 2.4Mhz, 100MHz or 133 MHz -	 * for ux500. -	 * Use a divide-by-16 counter if the tick rate is more than 32MHz. -	 * At 32 MHz, the timer (with 32 bit counter) can be programmed -	 * to wake-up at a max 127s a head in time. Dividing a 2.4 MHz timer -	 * with 16 gives too low timer resolution. -	 */ -	rate = clk_get_rate(clk0); -	if (rate > 32000000) { -		rate /= 16; -		clk_prescale = MTU_CRn_PRESCALE_16; -	} else { -		clk_prescale = MTU_CRn_PRESCALE_1; -	} - -	nmdk_cycle = (rate + HZ/2) / HZ; - - -	/* Timer 0 is the free running clocksource */ -	nmdk_clksrc_reset(); - -	if (clocksource_mmio_init(mtu_base + MTU_VAL(0), "mtu_0", -			rate, 200, 32, clocksource_mmio_readl_down)) -		pr_err("timer: failed to initialize clock source %s\n", -		       "mtu_0"); - -#ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK -	setup_sched_clock(nomadik_read_sched_clock, 32, rate); -#endif - -	/* Timer 1 is used for events, register irq and clockevents */ -	setup_irq(IRQ_MTU0, &nmdk_timer_irq); -	nmdk_clkevt.cpumask = cpumask_of(0); -	clockevents_config_and_register(&nmdk_clkevt, rate, 2, 0xffffffffU); -} diff --git a/arch/arm/plat-omap/include/plat/iommu.h b/arch/arm/plat-omap/include/plat/iommu.h deleted file mode 100644 index 68b5f0362f3..00000000000 --- a/arch/arm/plat-omap/include/plat/iommu.h +++ /dev/null @@ -1,221 +0,0 @@ -/* - * omap iommu: main structures - * - * Copyright (C) 2008-2009 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.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 __MACH_IOMMU_H -#define __MACH_IOMMU_H - -struct iotlb_entry { -	u32 da; -	u32 pa; -	u32 pgsz, prsvd, valid; -	union { -		u16 ap; -		struct { -			u32 endian, elsz, mixed; -		}; -	}; -}; - -struct omap_iommu { -	const char	*name; -	struct module	*owner; -	struct clk	*clk; -	void __iomem	*regbase; -	struct device	*dev; -	void		*isr_priv; -	struct iommu_domain *domain; - -	unsigned int	refcount; -	spinlock_t	iommu_lock;	/* global for this whole object */ - -	/* -	 * We don't change iopgd for a situation like pgd for a task, -	 * but share it globally for each iommu. -	 */ -	u32		*iopgd; -	spinlock_t	page_table_lock; /* protect iopgd */ - -	int		nr_tlb_entries; - -	struct list_head	mmap; -	struct mutex		mmap_lock; /* protect mmap */ - -	void *ctx; /* iommu context: registres saved area */ -	u32 da_start; -	u32 da_end; -}; - -struct cr_regs { -	union { -		struct { -			u16 cam_l; -			u16 cam_h; -		}; -		u32 cam; -	}; -	union { -		struct { -			u16 ram_l; -			u16 ram_h; -		}; -		u32 ram; -	}; -}; - -struct iotlb_lock { -	short base; -	short vict; -}; - -/* architecture specific functions */ -struct iommu_functions { -	unsigned long	version; - -	int (*enable)(struct omap_iommu *obj); -	void (*disable)(struct omap_iommu *obj); -	void (*set_twl)(struct omap_iommu *obj, bool on); -	u32 (*fault_isr)(struct omap_iommu *obj, u32 *ra); - -	void (*tlb_read_cr)(struct omap_iommu *obj, struct cr_regs *cr); -	void (*tlb_load_cr)(struct omap_iommu *obj, struct cr_regs *cr); - -	struct cr_regs *(*alloc_cr)(struct omap_iommu *obj, -							struct iotlb_entry *e); -	int (*cr_valid)(struct cr_regs *cr); -	u32 (*cr_to_virt)(struct cr_regs *cr); -	void (*cr_to_e)(struct cr_regs *cr, struct iotlb_entry *e); -	ssize_t (*dump_cr)(struct omap_iommu *obj, struct cr_regs *cr, -							char *buf); - -	u32 (*get_pte_attr)(struct iotlb_entry *e); - -	void (*save_ctx)(struct omap_iommu *obj); -	void (*restore_ctx)(struct omap_iommu *obj); -	ssize_t (*dump_ctx)(struct omap_iommu *obj, char *buf, ssize_t len); -}; - -/** - * struct omap_mmu_dev_attr - OMAP mmu device attributes for omap_hwmod - * @da_start:		device address where the va space starts. - * @da_end:		device address where the va space ends. - * @nr_tlb_entries:	number of entries supported by the translation - *			look-aside buffer (TLB). - */ -struct omap_mmu_dev_attr { -	u32 da_start; -	u32 da_end; -	int nr_tlb_entries; -}; - -struct iommu_platform_data { -	const char *name; -	const char *clk_name; -	const int nr_tlb_entries; -	u32 da_start; -	u32 da_end; -}; - -/** - * struct iommu_arch_data - omap iommu private data - * @name: name of the iommu device - * @iommu_dev: handle of the iommu device - * - * This is an omap iommu private data object, which binds an iommu user - * to its iommu device. This object should be placed at the iommu user's - * dev_archdata so generic IOMMU API can be used without having to - * utilize omap-specific plumbing anymore. - */ -struct omap_iommu_arch_data { -	const char *name; -	struct omap_iommu *iommu_dev; -}; - -#ifdef CONFIG_IOMMU_API -/** - * dev_to_omap_iommu() - retrieves an omap iommu object from a user device - * @dev: iommu client device - */ -static inline struct omap_iommu *dev_to_omap_iommu(struct device *dev) -{ -	struct omap_iommu_arch_data *arch_data = dev->archdata.iommu; - -	return arch_data->iommu_dev; -} -#endif - -/* IOMMU errors */ -#define OMAP_IOMMU_ERR_TLB_MISS		(1 << 0) -#define OMAP_IOMMU_ERR_TRANS_FAULT	(1 << 1) -#define OMAP_IOMMU_ERR_EMU_MISS		(1 << 2) -#define OMAP_IOMMU_ERR_TBLWALK_FAULT	(1 << 3) -#define OMAP_IOMMU_ERR_MULTIHIT_FAULT	(1 << 4) - -#if defined(CONFIG_ARCH_OMAP1) -#error "iommu for this processor not implemented yet" -#else -#include <plat/iommu2.h> -#endif - -/* - * utilities for super page(16MB, 1MB, 64KB and 4KB) - */ - -#define iopgsz_max(bytes)			\ -	(((bytes) >= SZ_16M) ? SZ_16M :		\ -	 ((bytes) >= SZ_1M)  ? SZ_1M  :		\ -	 ((bytes) >= SZ_64K) ? SZ_64K :		\ -	 ((bytes) >= SZ_4K)  ? SZ_4K  :	0) - -#define bytes_to_iopgsz(bytes)				\ -	(((bytes) == SZ_16M) ? MMU_CAM_PGSZ_16M :	\ -	 ((bytes) == SZ_1M)  ? MMU_CAM_PGSZ_1M  :	\ -	 ((bytes) == SZ_64K) ? MMU_CAM_PGSZ_64K :	\ -	 ((bytes) == SZ_4K)  ? MMU_CAM_PGSZ_4K  : -1) - -#define iopgsz_to_bytes(iopgsz)				\ -	(((iopgsz) == MMU_CAM_PGSZ_16M)	? SZ_16M :	\ -	 ((iopgsz) == MMU_CAM_PGSZ_1M)	? SZ_1M  :	\ -	 ((iopgsz) == MMU_CAM_PGSZ_64K)	? SZ_64K :	\ -	 ((iopgsz) == MMU_CAM_PGSZ_4K)	? SZ_4K  : 0) - -#define iopgsz_ok(bytes) (bytes_to_iopgsz(bytes) >= 0) - -/* - * global functions - */ -extern u32 omap_iommu_arch_version(void); - -extern void omap_iotlb_cr_to_e(struct cr_regs *cr, struct iotlb_entry *e); - -extern int -omap_iopgtable_store_entry(struct omap_iommu *obj, struct iotlb_entry *e); - -extern int omap_iommu_set_isr(const char *name, -		 int (*isr)(struct omap_iommu *obj, u32 da, u32 iommu_errs, -				    void *priv), -			 void *isr_priv); - -extern void omap_iommu_save_ctx(struct device *dev); -extern void omap_iommu_restore_ctx(struct device *dev); - -extern int omap_install_iommu_arch(const struct iommu_functions *ops); -extern void omap_uninstall_iommu_arch(const struct iommu_functions *ops); - -extern int omap_foreach_iommu_device(void *data, -				int (*fn)(struct device *, void *)); - -extern ssize_t -omap_iommu_dump_ctx(struct omap_iommu *obj, char *buf, ssize_t len); -extern size_t -omap_dump_tlb_entries(struct omap_iommu *obj, char *buf, ssize_t len); - -#endif /* __MACH_IOMMU_H */ diff --git a/arch/arm/plat-omap/include/plat/iommu2.h b/arch/arm/plat-omap/include/plat/iommu2.h deleted file mode 100644 index d4116b595e4..00000000000 --- a/arch/arm/plat-omap/include/plat/iommu2.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * omap iommu: omap2 architecture specific definitions - * - * Copyright (C) 2008-2009 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.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 __MACH_IOMMU2_H -#define __MACH_IOMMU2_H - -#include <linux/io.h> - -/* - * MMU Register offsets - */ -#define MMU_REVISION		0x00 -#define MMU_SYSCONFIG		0x10 -#define MMU_SYSSTATUS		0x14 -#define MMU_IRQSTATUS		0x18 -#define MMU_IRQENABLE		0x1c -#define MMU_WALKING_ST		0x40 -#define MMU_CNTL		0x44 -#define MMU_FAULT_AD		0x48 -#define MMU_TTB			0x4c -#define MMU_LOCK		0x50 -#define MMU_LD_TLB		0x54 -#define MMU_CAM			0x58 -#define MMU_RAM			0x5c -#define MMU_GFLUSH		0x60 -#define MMU_FLUSH_ENTRY		0x64 -#define MMU_READ_CAM		0x68 -#define MMU_READ_RAM		0x6c -#define MMU_EMU_FAULT_AD	0x70 - -#define MMU_REG_SIZE		256 - -/* - * MMU Register bit definitions - */ -#define MMU_LOCK_BASE_SHIFT	10 -#define MMU_LOCK_BASE_MASK	(0x1f << MMU_LOCK_BASE_SHIFT) -#define MMU_LOCK_BASE(x)	\ -	((x & MMU_LOCK_BASE_MASK) >> MMU_LOCK_BASE_SHIFT) - -#define MMU_LOCK_VICT_SHIFT	4 -#define MMU_LOCK_VICT_MASK	(0x1f << MMU_LOCK_VICT_SHIFT) -#define MMU_LOCK_VICT(x)	\ -	((x & MMU_LOCK_VICT_MASK) >> MMU_LOCK_VICT_SHIFT) - -#define MMU_CAM_VATAG_SHIFT	12 -#define MMU_CAM_VATAG_MASK \ -	((~0UL >> MMU_CAM_VATAG_SHIFT) << MMU_CAM_VATAG_SHIFT) -#define MMU_CAM_P		(1 << 3) -#define MMU_CAM_V		(1 << 2) -#define MMU_CAM_PGSZ_MASK	3 -#define MMU_CAM_PGSZ_1M		(0 << 0) -#define MMU_CAM_PGSZ_64K	(1 << 0) -#define MMU_CAM_PGSZ_4K		(2 << 0) -#define MMU_CAM_PGSZ_16M	(3 << 0) - -#define MMU_RAM_PADDR_SHIFT	12 -#define MMU_RAM_PADDR_MASK \ -	((~0UL >> MMU_RAM_PADDR_SHIFT) << MMU_RAM_PADDR_SHIFT) -#define MMU_RAM_ENDIAN_SHIFT	9 -#define MMU_RAM_ENDIAN_MASK	(1 << MMU_RAM_ENDIAN_SHIFT) -#define MMU_RAM_ENDIAN_BIG	(1 << MMU_RAM_ENDIAN_SHIFT) -#define MMU_RAM_ENDIAN_LITTLE	(0 << MMU_RAM_ENDIAN_SHIFT) -#define MMU_RAM_ELSZ_SHIFT	7 -#define MMU_RAM_ELSZ_MASK	(3 << MMU_RAM_ELSZ_SHIFT) -#define MMU_RAM_ELSZ_8		(0 << MMU_RAM_ELSZ_SHIFT) -#define MMU_RAM_ELSZ_16		(1 << MMU_RAM_ELSZ_SHIFT) -#define MMU_RAM_ELSZ_32		(2 << MMU_RAM_ELSZ_SHIFT) -#define MMU_RAM_ELSZ_NONE	(3 << MMU_RAM_ELSZ_SHIFT) -#define MMU_RAM_MIXED_SHIFT	6 -#define MMU_RAM_MIXED_MASK	(1 << MMU_RAM_MIXED_SHIFT) -#define MMU_RAM_MIXED		MMU_RAM_MIXED_MASK - -/* - * register accessors - */ -static inline u32 iommu_read_reg(struct omap_iommu *obj, size_t offs) -{ -	return __raw_readl(obj->regbase + offs); -} - -static inline void iommu_write_reg(struct omap_iommu *obj, u32 val, size_t offs) -{ -	__raw_writel(val, obj->regbase + offs); -} - -#endif /* __MACH_IOMMU2_H */ diff --git a/arch/arm/plat-omap/include/plat/iopgtable.h b/arch/arm/plat-omap/include/plat/iopgtable.h deleted file mode 100644 index 66a813977d5..00000000000 --- a/arch/arm/plat-omap/include/plat/iopgtable.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * omap iommu: pagetable definitions - * - * Copyright (C) 2008-2010 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.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_OMAP_IOMMU_H -#define __PLAT_OMAP_IOMMU_H - -/* - * "L2 table" address mask and size definitions. - */ -#define IOPGD_SHIFT		20 -#define IOPGD_SIZE		(1UL << IOPGD_SHIFT) -#define IOPGD_MASK		(~(IOPGD_SIZE - 1)) - -/* - * "section" address mask and size definitions. - */ -#define IOSECTION_SHIFT		20 -#define IOSECTION_SIZE		(1UL << IOSECTION_SHIFT) -#define IOSECTION_MASK		(~(IOSECTION_SIZE - 1)) - -/* - * "supersection" address mask and size definitions. - */ -#define IOSUPER_SHIFT		24 -#define IOSUPER_SIZE		(1UL << IOSUPER_SHIFT) -#define IOSUPER_MASK		(~(IOSUPER_SIZE - 1)) - -#define PTRS_PER_IOPGD		(1UL << (32 - IOPGD_SHIFT)) -#define IOPGD_TABLE_SIZE	(PTRS_PER_IOPGD * sizeof(u32)) - -/* - * "small page" address mask and size definitions. - */ -#define IOPTE_SHIFT		12 -#define IOPTE_SIZE		(1UL << IOPTE_SHIFT) -#define IOPTE_MASK		(~(IOPTE_SIZE - 1)) - -/* - * "large page" address mask and size definitions. - */ -#define IOLARGE_SHIFT		16 -#define IOLARGE_SIZE		(1UL << IOLARGE_SHIFT) -#define IOLARGE_MASK		(~(IOLARGE_SIZE - 1)) - -#define PTRS_PER_IOPTE		(1UL << (IOPGD_SHIFT - IOPTE_SHIFT)) -#define IOPTE_TABLE_SIZE	(PTRS_PER_IOPTE * sizeof(u32)) - -#define IOPAGE_MASK		IOPTE_MASK - -/** - * omap_iommu_translate() - va to pa translation - * @d:		omap iommu descriptor - * @va:		virtual address - * @mask:	omap iommu descriptor mask - * - * va to pa translation - */ -static inline phys_addr_t omap_iommu_translate(u32 d, u32 va, u32 mask) -{ -	return (d & mask) | (va & (~mask)); -} - -/* - * some descriptor attributes. - */ -#define IOPGD_TABLE		(1 << 0) -#define IOPGD_SECTION		(2 << 0) -#define IOPGD_SUPER		(1 << 18 | 2 << 0) - -#define iopgd_is_table(x)	(((x) & 3) == IOPGD_TABLE) -#define iopgd_is_section(x)	(((x) & (1 << 18 | 3)) == IOPGD_SECTION) -#define iopgd_is_super(x)	(((x) & (1 << 18 | 3)) == IOPGD_SUPER) - -#define IOPTE_SMALL		(2 << 0) -#define IOPTE_LARGE		(1 << 0) - -#define iopte_is_small(x)	(((x) & 2) == IOPTE_SMALL) -#define iopte_is_large(x)	(((x) & 3) == IOPTE_LARGE) - -/* to find an entry in a page-table-directory */ -#define iopgd_index(da)		(((da) >> IOPGD_SHIFT) & (PTRS_PER_IOPGD - 1)) -#define iopgd_offset(obj, da)	((obj)->iopgd + iopgd_index(da)) - -#define iopgd_page_paddr(iopgd)	(*iopgd & ~((1 << 10) - 1)) -#define iopgd_page_vaddr(iopgd)	((u32 *)phys_to_virt(iopgd_page_paddr(iopgd))) - -/* to find an entry in the second-level page table. */ -#define iopte_index(da)		(((da) >> IOPTE_SHIFT) & (PTRS_PER_IOPTE - 1)) -#define iopte_offset(iopgd, da)	(iopgd_page_vaddr(iopgd) + iopte_index(da)) - -static inline u32 iotlb_init_entry(struct iotlb_entry *e, u32 da, u32 pa, -				   u32 flags) -{ -	memset(e, 0, sizeof(*e)); - -	e->da		= da; -	e->pa		= pa; -	e->valid	= 1; -	/* FIXME: add OMAP1 support */ -	e->pgsz		= flags & MMU_CAM_PGSZ_MASK; -	e->endian	= flags & MMU_RAM_ENDIAN_MASK; -	e->elsz		= flags & MMU_RAM_ELSZ_MASK; -	e->mixed	= flags & MMU_RAM_MIXED_MASK; - -	return iopgsz_to_bytes(e->pgsz); -} - -#define to_iommu(dev)							\ -	(struct omap_iommu *)platform_get_drvdata(to_platform_device(dev)) - -#endif /* __PLAT_OMAP_IOMMU_H */ diff --git a/arch/arm/plat-omap/include/plat/iovmm.h b/arch/arm/plat-omap/include/plat/iovmm.h deleted file mode 100644 index 498e57cda6c..00000000000 --- a/arch/arm/plat-omap/include/plat/iovmm.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * omap iommu: simple virtual address space management - * - * Copyright (C) 2008-2009 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.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 __IOMMU_MMAP_H -#define __IOMMU_MMAP_H - -#include <linux/iommu.h> - -struct iovm_struct { -	struct omap_iommu	*iommu;	/* iommu object which this belongs to */ -	u32			da_start; /* area definition */ -	u32			da_end; -	u32			flags; /* IOVMF_: see below */ -	struct list_head	list; /* linked in ascending order */ -	const struct sg_table	*sgt; /* keep 'page' <-> 'da' mapping */ -	void			*va; /* mpu side mapped address */ -}; - -/* - * IOVMF_FLAGS: attribute for iommu virtual memory area(iovma) - * - * lower 16 bit is used for h/w and upper 16 bit is for s/w. - */ -#define IOVMF_SW_SHIFT		16 - -/* - * iovma: h/w flags derived from cam and ram attribute - */ -#define IOVMF_CAM_MASK		(~((1 << 10) - 1)) -#define IOVMF_RAM_MASK		(~IOVMF_CAM_MASK) - -#define IOVMF_PGSZ_MASK		(3 << 0) -#define IOVMF_PGSZ_1M		MMU_CAM_PGSZ_1M -#define IOVMF_PGSZ_64K		MMU_CAM_PGSZ_64K -#define IOVMF_PGSZ_4K		MMU_CAM_PGSZ_4K -#define IOVMF_PGSZ_16M		MMU_CAM_PGSZ_16M - -#define IOVMF_ENDIAN_MASK	(1 << 9) -#define IOVMF_ENDIAN_BIG	MMU_RAM_ENDIAN_BIG -#define IOVMF_ENDIAN_LITTLE	MMU_RAM_ENDIAN_LITTLE - -#define IOVMF_ELSZ_MASK		(3 << 7) -#define IOVMF_ELSZ_8		MMU_RAM_ELSZ_8 -#define IOVMF_ELSZ_16		MMU_RAM_ELSZ_16 -#define IOVMF_ELSZ_32		MMU_RAM_ELSZ_32 -#define IOVMF_ELSZ_NONE		MMU_RAM_ELSZ_NONE - -#define IOVMF_MIXED_MASK	(1 << 6) -#define IOVMF_MIXED		MMU_RAM_MIXED - -/* - * iovma: s/w flags, used for mapping and umapping internally. - */ -#define IOVMF_MMIO		(1 << IOVMF_SW_SHIFT) -#define IOVMF_ALLOC		(2 << IOVMF_SW_SHIFT) -#define IOVMF_ALLOC_MASK	(3 << IOVMF_SW_SHIFT) - -/* "superpages" is supported just with physically linear pages */ -#define IOVMF_DISCONT		(1 << (2 + IOVMF_SW_SHIFT)) -#define IOVMF_LINEAR		(2 << (2 + IOVMF_SW_SHIFT)) -#define IOVMF_LINEAR_MASK	(3 << (2 + IOVMF_SW_SHIFT)) - -#define IOVMF_DA_FIXED		(1 << (4 + IOVMF_SW_SHIFT)) - - -extern struct iovm_struct *omap_find_iovm_area(struct device *dev, u32 da); -extern u32 -omap_iommu_vmap(struct iommu_domain *domain, struct device *dev, u32 da, -			const struct sg_table *sgt, u32 flags); -extern struct sg_table *omap_iommu_vunmap(struct iommu_domain *domain, -				struct device *dev, u32 da); -extern u32 -omap_iommu_vmalloc(struct iommu_domain *domain, struct device *dev, -				u32 da, size_t bytes, u32 flags); -extern void -omap_iommu_vfree(struct iommu_domain *domain, struct device *dev, -				const u32 da); -extern void *omap_da_to_va(struct device *dev, u32 da); - -#endif /* __IOMMU_MMAP_H */ diff --git a/arch/arm/plat-omap/include/plat/omap-serial.h b/arch/arm/plat-omap/include/plat/omap-serial.h index 1957a8516e9..ff9b0aab528 100644 --- a/arch/arm/plat-omap/include/plat/omap-serial.h +++ b/arch/arm/plat-omap/include/plat/omap-serial.h @@ -30,35 +30,6 @@   */  #define OMAP_SERIAL_NAME	"ttyO" -#define OMAP_MODE13X_SPEED	230400 - -#define OMAP_UART_SCR_TX_EMPTY	0x08 - -/* WER = 0x7F - * Enable module level wakeup in WER reg - */ -#define OMAP_UART_WER_MOD_WKUP	0X7F - -/* Enable XON/XOFF flow control on output */ -#define OMAP_UART_SW_TX		0x04 - -/* Enable XON/XOFF flow control on input */ -#define OMAP_UART_SW_RX		0x04 - -#define OMAP_UART_SYSC_RESET	0X07 -#define OMAP_UART_TCR_TRIG	0X0F -#define OMAP_UART_SW_CLR	0XF0 -#define OMAP_UART_FIFO_CLR	0X06 - -#define OMAP_UART_DMA_CH_FREE	-1 - -#define OMAP_MAX_HSUART_PORTS	6 - -#define MSR_SAVE_FLAGS		UART_MSR_ANY_DELTA - -#define UART_ERRATA_i202_MDR1_ACCESS	BIT(0) -#define UART_ERRATA_i291_DMA_FORCEIDLE	BIT(1) -  struct omap_uart_port_info {  	bool			dma_enabled;	/* To specify DMA Mode */  	unsigned int		uartclk;	/* UART clock rate */ @@ -77,30 +48,4 @@ struct omap_uart_port_info {  	void (*enable_wakeup)(struct device *, bool);  }; -struct uart_omap_dma { -	u8			uart_dma_tx; -	u8			uart_dma_rx; -	int			rx_dma_channel; -	int			tx_dma_channel; -	dma_addr_t		rx_buf_dma_phys; -	dma_addr_t		tx_buf_dma_phys; -	unsigned int		uart_base; -	/* -	 * Buffer for rx dma.It is not required for tx because the buffer -	 * comes from port structure. -	 */ -	unsigned char		*rx_buf; -	unsigned int		prev_rx_dma_pos; -	int			tx_buf_size; -	int			tx_dma_used; -	int			rx_dma_used; -	spinlock_t		tx_lock; -	spinlock_t		rx_lock; -	/* timer to poll activity on rx dma */ -	struct timer_list	rx_timer; -	unsigned int		rx_buf_size; -	unsigned int		rx_poll_rate; -	unsigned int		rx_timeout; -}; -  #endif /* __OMAP_SERIAL_H__ */ diff --git a/arch/arm/plat-s3c24xx/dma.c b/arch/arm/plat-s3c24xx/dma.c index db98e7021f0..0abd1c46988 100644 --- a/arch/arm/plat-s3c24xx/dma.c +++ b/arch/arm/plat-s3c24xx/dma.c @@ -473,12 +473,13 @@ int s3c2410_dma_enqueue(enum dma_ch channel, void *id,  		pr_debug("dma%d: %s: buffer %p queued onto non-empty channel\n",  			 chan->number, __func__, buf); -		if (chan->end == NULL) +		if (chan->end == NULL) {  			pr_debug("dma%d: %s: %p not empty, and chan->end==NULL?\n",  				 chan->number, __func__, chan); - -		chan->end->next = buf; -		chan->end = buf; +		} else { +			chan->end->next = buf; +			chan->end = buf; +		}  	}  	/* if necessary, update the next buffer field */ diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig index 59401e1cc53..a9d52167e16 100644 --- a/arch/arm/plat-samsung/Kconfig +++ b/arch/arm/plat-samsung/Kconfig @@ -414,6 +414,11 @@ config S5P_SETUP_MIPIPHY  	help  	  Compile in common setup code for MIPI-CSIS and MIPI-DSIM devices +config S3C_SETUP_CAMIF +	bool +	help +	  Compile in common setup code for S3C CAMIF devices +  # DMA  config S3C_DMA @@ -502,5 +507,6 @@ config DEBUG_S3C_UART  	default "0" if DEBUG_S3C_UART0  	default "1" if DEBUG_S3C_UART1  	default "2" if DEBUG_S3C_UART2 +	default "3" if DEBUG_S3C_UART3  endif diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-samsung/Makefile index 9e40e8d0074..3a7c64d1814 100644 --- a/arch/arm/plat-samsung/Makefile +++ b/arch/arm/plat-samsung/Makefile @@ -41,6 +41,7 @@ obj-$(CONFIG_S5P_DEV_UART)	+= s5p-dev-uart.o  obj-$(CONFIG_SAMSUNG_DEV_BACKLIGHT)	+= dev-backlight.o +obj-$(CONFIG_S3C_SETUP_CAMIF)	+= setup-camif.o  obj-$(CONFIG_S5P_SETUP_MIPIPHY)	+= setup-mipiphy.o  # DMA support diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h index ace4451b765..e0072ce8d6e 100644 --- a/arch/arm/plat-samsung/include/plat/cpu.h +++ b/arch/arm/plat-samsung/include/plat/cpu.h @@ -43,6 +43,7 @@ extern unsigned long samsung_cpu_id;  #define EXYNOS4_CPU_MASK	0xFFFE0000  #define EXYNOS5250_SOC_ID	0x43520000 +#define EXYNOS5440_SOC_ID	0x54400000  #define EXYNOS5_SOC_MASK	0xFFFFF000  #define IS_SAMSUNG_CPU(name, id, mask)		\ @@ -62,6 +63,7 @@ IS_SAMSUNG_CPU(exynos4210, EXYNOS4210_CPU_ID, EXYNOS4_CPU_MASK)  IS_SAMSUNG_CPU(exynos4212, EXYNOS4212_CPU_ID, EXYNOS4_CPU_MASK)  IS_SAMSUNG_CPU(exynos4412, EXYNOS4412_CPU_ID, EXYNOS4_CPU_MASK)  IS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS5_SOC_MASK) +IS_SAMSUNG_CPU(exynos5440, EXYNOS5440_SOC_ID, EXYNOS5_SOC_MASK)  #if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2412) || \      defined(CONFIG_CPU_S3C2416) || defined(CONFIG_CPU_S3C2440) || \ @@ -130,6 +132,12 @@ IS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS5_SOC_MASK)  # define soc_is_exynos5250()	0  #endif +#if defined(CONFIG_SOC_EXYNOS5440) +# define soc_is_exynos5440()	is_samsung_exynos5440() +#else +# define soc_is_exynos5440()	0 +#endif +  #define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE }  #ifndef KHZ diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h index 133e3e4170f..f53beba2b63 100644 --- a/arch/arm/plat-samsung/include/plat/devs.h +++ b/arch/arm/plat-samsung/include/plat/devs.h @@ -123,7 +123,6 @@ extern struct platform_device s5pv210_device_spdif;  extern struct platform_device exynos4_device_ac97;  extern struct platform_device exynos4_device_ahci; -extern struct platform_device exynos4_device_dwmci;  extern struct platform_device exynos4_device_i2s0;  extern struct platform_device exynos4_device_i2s1;  extern struct platform_device exynos4_device_i2s2; diff --git a/arch/arm/plat-samsung/setup-camif.c b/arch/arm/plat-samsung/setup-camif.c new file mode 100644 index 00000000000..e01bf760af2 --- /dev/null +++ b/arch/arm/plat-samsung/setup-camif.c @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2012 Sylwester Nawrocki <sylvester.nawrocki@gmail.com> + * + * Helper functions for S3C24XX/S3C64XX SoC series CAMIF driver + * + * 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/gpio.h> +#include <plat/gpio-cfg.h> + +/* Number of camera port pins, without FIELD */ +#define S3C_CAMIF_NUM_GPIOS	13 + +/* Default camera port configuration helpers. */ + +static void camif_get_gpios(int *gpio_start, int *gpio_reset) +{ +#ifdef CONFIG_ARCH_S3C24XX +	*gpio_start = S3C2410_GPJ(0); +	*gpio_reset = S3C2410_GPJ(12); +#else +	/* s3c64xx */ +	*gpio_start = S3C64XX_GPF(0); +	*gpio_reset = S3C64XX_GPF(3); +#endif +} + +int s3c_camif_gpio_get(void) +{ +	int gpio_start, gpio_reset; +	int ret, i; + +	camif_get_gpios(&gpio_start, &gpio_reset); + +	for (i = 0; i < S3C_CAMIF_NUM_GPIOS; i++) { +		int gpio = gpio_start + i; + +		if (gpio == gpio_reset) +			continue; + +		ret = gpio_request(gpio, "camif"); +		if (!ret) +			ret = s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); +		if (ret) { +			pr_err("failed to configure GPIO %d\n", gpio); +			for (--i; i >= 0; i--) +				gpio_free(gpio--); +			return ret; +		} +		s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); +	} + +	return 0; +} + +void s3c_camif_gpio_put(void) +{ +	int i, gpio_start, gpio_reset; + +	camif_get_gpios(&gpio_start, &gpio_reset); + +	for (i = 0; i < S3C_CAMIF_NUM_GPIOS; i++) { +		int gpio = gpio_start + i; +		if (gpio != gpio_reset) +			gpio_free(gpio); +	} +} diff --git a/arch/arm/plat-spear/Kconfig b/arch/arm/plat-spear/Kconfig index f8db7b2deb3..87dbd81bdf5 100644 --- a/arch/arm/plat-spear/Kconfig +++ b/arch/arm/plat-spear/Kconfig @@ -12,6 +12,7 @@ config ARCH_SPEAR13XX  	bool "ST SPEAr13xx with Device Tree"  	select ARM_GIC  	select CPU_V7 +	select GPIO_SPEAR_SPICS  	select HAVE_SMP  	select MIGHT_HAVE_CACHE_L2X0  	select PINCTRL diff --git a/arch/arm/plat-versatile/Kconfig b/arch/arm/plat-versatile/Kconfig index 2a4ae8a6a08..2c4332b9f94 100644 --- a/arch/arm/plat-versatile/Kconfig +++ b/arch/arm/plat-versatile/Kconfig @@ -6,20 +6,11 @@ config PLAT_VERSATILE_CLOCK  config PLAT_VERSATILE_CLCD  	bool -config PLAT_VERSATILE_FPGA_IRQ -	bool -	select IRQ_DOMAIN - -config PLAT_VERSATILE_FPGA_IRQ_NR -       int -       default 4 -       depends on PLAT_VERSATILE_FPGA_IRQ -  config PLAT_VERSATILE_LEDS  	def_bool y if NEW_LEDS  	depends on ARCH_REALVIEW || ARCH_VERSATILE  	select LEDS_CLASS -	select LEDS_TRIGGER +	select LEDS_TRIGGERS  config PLAT_VERSATILE_SCHED_CLOCK  	def_bool y diff --git a/arch/arm/plat-versatile/Makefile b/arch/arm/plat-versatile/Makefile index 74cfd94cbf8..f88d448b629 100644 --- a/arch/arm/plat-versatile/Makefile +++ b/arch/arm/plat-versatile/Makefile @@ -2,7 +2,6 @@ ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include  obj-$(CONFIG_PLAT_VERSATILE_CLOCK) += clock.o  obj-$(CONFIG_PLAT_VERSATILE_CLCD) += clcd.o -obj-$(CONFIG_PLAT_VERSATILE_FPGA_IRQ) += fpga-irq.o  obj-$(CONFIG_PLAT_VERSATILE_LEDS) += leds.o  obj-$(CONFIG_PLAT_VERSATILE_SCHED_CLOCK) += sched-clock.o  obj-$(CONFIG_SMP) += headsmp.o platsmp.o diff --git a/arch/arm/plat-versatile/fpga-irq.c b/arch/arm/plat-versatile/fpga-irq.c deleted file mode 100644 index 091ae103004..00000000000 --- a/arch/arm/plat-versatile/fpga-irq.c +++ /dev/null @@ -1,210 +0,0 @@ -/* - *  Support for Versatile FPGA-based IRQ controllers - */ -#include <linux/irq.h> -#include <linux/io.h> -#include <linux/irqdomain.h> -#include <linux/module.h> -#include <linux/of.h> -#include <linux/of_address.h> - -#include <asm/exception.h> -#include <asm/mach/irq.h> -#include <plat/fpga-irq.h> - -#define IRQ_STATUS		0x00 -#define IRQ_RAW_STATUS		0x04 -#define IRQ_ENABLE_SET		0x08 -#define IRQ_ENABLE_CLEAR	0x0c -#define INT_SOFT_SET		0x10 -#define INT_SOFT_CLEAR		0x14 -#define FIQ_STATUS		0x20 -#define FIQ_RAW_STATUS		0x24 -#define FIQ_ENABLE		0x28 -#define FIQ_ENABLE_SET		0x28 -#define FIQ_ENABLE_CLEAR	0x2C - -/** - * struct fpga_irq_data - irq data container for the FPGA IRQ controller - * @base: memory offset in virtual memory - * @chip: chip container for this instance - * @domain: IRQ domain for this instance - * @valid: mask for valid IRQs on this controller - * @used_irqs: number of active IRQs on this controller - */ -struct fpga_irq_data { -	void __iomem *base; -	struct irq_chip chip; -	u32 valid; -	struct irq_domain *domain; -	u8 used_irqs; -}; - -/* we cannot allocate memory when the controllers are initially registered */ -static struct fpga_irq_data fpga_irq_devices[CONFIG_PLAT_VERSATILE_FPGA_IRQ_NR]; -static int fpga_irq_id; - -static void fpga_irq_mask(struct irq_data *d) -{ -	struct fpga_irq_data *f = irq_data_get_irq_chip_data(d); -	u32 mask = 1 << d->hwirq; - -	writel(mask, f->base + IRQ_ENABLE_CLEAR); -} - -static void fpga_irq_unmask(struct irq_data *d) -{ -	struct fpga_irq_data *f = irq_data_get_irq_chip_data(d); -	u32 mask = 1 << d->hwirq; - -	writel(mask, f->base + IRQ_ENABLE_SET); -} - -static void fpga_irq_handle(unsigned int irq, struct irq_desc *desc) -{ -	struct fpga_irq_data *f = irq_desc_get_handler_data(desc); -	u32 status = readl(f->base + IRQ_STATUS); - -	if (status == 0) { -		do_bad_IRQ(irq, desc); -		return; -	} - -	do { -		irq = ffs(status) - 1; -		status &= ~(1 << irq); -		generic_handle_irq(irq_find_mapping(f->domain, irq)); -	} while (status); -} - -/* - * Handle each interrupt in a single FPGA IRQ controller.  Returns non-zero - * if we've handled at least one interrupt.  This does a single read of the - * status register and handles all interrupts in order from LSB first. - */ -static int handle_one_fpga(struct fpga_irq_data *f, struct pt_regs *regs) -{ -	int handled = 0; -	int irq; -	u32 status; - -	while ((status  = readl(f->base + IRQ_STATUS))) { -		irq = ffs(status) - 1; -		handle_IRQ(irq_find_mapping(f->domain, irq), regs); -		handled = 1; -	} - -	return handled; -} - -/* - * Keep iterating over all registered FPGA IRQ controllers until there are - * no pending interrupts. - */ -asmlinkage void __exception_irq_entry fpga_handle_irq(struct pt_regs *regs) -{ -	int i, handled; - -	do { -		for (i = 0, handled = 0; i < fpga_irq_id; ++i) -			handled |= handle_one_fpga(&fpga_irq_devices[i], regs); -	} while (handled); -} - -static int fpga_irqdomain_map(struct irq_domain *d, unsigned int irq, -		irq_hw_number_t hwirq) -{ -	struct fpga_irq_data *f = d->host_data; - -	/* Skip invalid IRQs, only register handlers for the real ones */ -	if (!(f->valid & (1 << hwirq))) -		return -ENOTSUPP; -	irq_set_chip_data(irq, f); -	irq_set_chip_and_handler(irq, &f->chip, -				handle_level_irq); -	set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); -	f->used_irqs++; -	return 0; -} - -static struct irq_domain_ops fpga_irqdomain_ops = { -	.map = fpga_irqdomain_map, -	.xlate = irq_domain_xlate_onetwocell, -}; - -static __init struct fpga_irq_data * -fpga_irq_prep_struct(void __iomem *base, const char *name, u32 valid) { -	struct fpga_irq_data *f; - -	if (fpga_irq_id >= ARRAY_SIZE(fpga_irq_devices)) { -		printk(KERN_ERR "%s: too few FPGA IRQ controllers, increase CONFIG_PLAT_VERSATILE_FPGA_IRQ_NR\n", __func__); -		return NULL; -	} -	f = &fpga_irq_devices[fpga_irq_id]; -	f->base = base; -	f->chip.name = name; -	f->chip.irq_ack = fpga_irq_mask; -	f->chip.irq_mask = fpga_irq_mask; -	f->chip.irq_unmask = fpga_irq_unmask; -	f->valid = valid; -	fpga_irq_id++; - -	return f; -} - -void __init fpga_irq_init(void __iomem *base, const char *name, int irq_start, -			  int parent_irq, u32 valid, struct device_node *node) -{ -	struct fpga_irq_data *f; - -	f = fpga_irq_prep_struct(base, name, valid); -	if (!f) -		return; - -	if (parent_irq != -1) { -		irq_set_handler_data(parent_irq, f); -		irq_set_chained_handler(parent_irq, fpga_irq_handle); -	} - -	f->domain = irq_domain_add_legacy(node, fls(valid), irq_start, 0, -					  &fpga_irqdomain_ops, f); -	pr_info("FPGA IRQ chip %d \"%s\" @ %p, %u irqs\n", -		fpga_irq_id, name, base, f->used_irqs); -} - -#ifdef CONFIG_OF -int __init fpga_irq_of_init(struct device_node *node, -			    struct device_node *parent) -{ -	struct fpga_irq_data *f; -	void __iomem *base; -	u32 clear_mask; -	u32 valid_mask; - -	if (WARN_ON(!node)) -		return -ENODEV; - -	base = of_iomap(node, 0); -	WARN(!base, "unable to map fpga irq registers\n"); - -	if (of_property_read_u32(node, "clear-mask", &clear_mask)) -		clear_mask = 0; - -	if (of_property_read_u32(node, "valid-mask", &valid_mask)) -		valid_mask = 0; - -	f = fpga_irq_prep_struct(base, node->name, valid_mask); -	if (!f) -		return -ENOMEM; - -	writel(clear_mask, base + IRQ_ENABLE_CLEAR); -	writel(clear_mask, base + FIQ_ENABLE_CLEAR); - -	f->domain = irq_domain_add_linear(node, fls(valid_mask), &fpga_irqdomain_ops, f); -	f->used_irqs = hweight32(valid_mask); - -	pr_info("FPGA IRQ chip %d \"%s\" @ %p, %u irqs\n", -		fpga_irq_id, node->name, base, f->used_irqs); -	return 0; -} -#endif diff --git a/arch/arm/plat-versatile/include/plat/fpga-irq.h b/arch/arm/plat-versatile/include/plat/fpga-irq.h deleted file mode 100644 index 1fac9651d3c..00000000000 --- a/arch/arm/plat-versatile/include/plat/fpga-irq.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef PLAT_FPGA_IRQ_H -#define PLAT_FPGA_IRQ_H - -struct device_node; -struct pt_regs; - -void fpga_handle_irq(struct pt_regs *regs); -void fpga_irq_init(void __iomem *, const char *, int, int, u32, -		struct device_node *node); -int fpga_irq_of_init(struct device_node *node, -		     struct device_node *parent); - -#endif diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 15ac18a56c9..f9ccff91591 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -2,11 +2,14 @@ config ARM64  	def_bool y  	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE  	select ARCH_WANT_COMPAT_IPC_PARSE_VERSION +	select COMMON_CLK  	select GENERIC_CLOCKEVENTS  	select GENERIC_HARDIRQS_NO_DEPRECATED  	select GENERIC_IOMAP  	select GENERIC_IRQ_PROBE  	select GENERIC_IRQ_SHOW +	select GENERIC_KERNEL_EXECVE +	select GENERIC_KERNEL_THREAD  	select GENERIC_SMP_IDLE_THREAD  	select GENERIC_TIME_VSYSCALL  	select HARDIRQS_SW_RESEND @@ -21,7 +24,6 @@ config ARM64  	select HAVE_IRQ_WORK  	select HAVE_MEMBLOCK  	select HAVE_PERF_EVENTS -	select HAVE_SPARSE_IRQ  	select IRQ_DOMAIN  	select MODULES_USE_ELF_RELA  	select NO_BOOTMEM @@ -31,6 +33,7 @@ config ARM64  	select RTC_LIB  	select SPARSE_IRQ  	select SYSCTL_EXCEPTION_TRACE +	select CLONE_BACKWARDS  	help  	  ARM 64-bit (AArch64) Linux support. diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 364191f3be4..c95c5cb212f 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -41,20 +41,24 @@ libs-y		:= arch/arm64/lib/ $(libs-y)  libs-y		+= $(LIBGCC)  # Default target when executing plain make -KBUILD_IMAGE := Image.gz +KBUILD_IMAGE	:= Image.gz +KBUILD_DTBS	:= dtbs -all:	$(KBUILD_IMAGE) +all:	$(KBUILD_IMAGE) $(KBUILD_DTBS)  boot := arch/arm64/boot  Image Image.gz: vmlinux -	$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ +	$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@  zinstall install: vmlinux -	$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@ +	$(Q)$(MAKE) $(build)=$(boot) $@ -%.dtb: -	$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ +%.dtb: scripts +	$(Q)$(MAKE) $(build)=$(boot)/dts $(boot)/dts/$@ + +dtbs: scripts +	$(Q)$(MAKE) $(build)=$(boot)/dts dtbs  # We use MRPROPER_FILES and CLEAN_FILES now  archclean: @@ -63,6 +67,7 @@ archclean:  define archhelp    echo  '* Image.gz      - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)'    echo  '  Image         - Uncompressed kernel image (arch/$(ARCH)/boot/Image)' +  echo  '* dtbs          - Build device tree blobs for enabled boards'    echo  '  install       - Install uncompressed kernel'    echo  '  zinstall      - Install compressed kernel'    echo  '                  Install using (your) ~/bin/installkernel or' diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile index eca209b2b0b..5a0e3ab854a 100644 --- a/arch/arm64/boot/Makefile +++ b/arch/arm64/boot/Makefile @@ -22,9 +22,6 @@ $(obj)/Image: vmlinux FORCE  $(obj)/Image.gz: $(obj)/Image FORCE  	$(call if_changed,gzip) -$(obj)/%.dtb: $(src)/dts/%.dts -	$(call cmd,dtc) -  install: $(obj)/Image  	$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \  	$(obj)/Image System.map "$(INSTALL_PATH)" @@ -32,5 +29,3 @@ install: $(obj)/Image  zinstall: $(obj)/Image.gz  	$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \  	$(obj)/Image.gz System.map "$(INSTALL_PATH)" - -clean-files += *.dtb diff --git a/arch/arm64/boot/dts/.gitignore b/arch/arm64/boot/dts/.gitignore new file mode 100644 index 00000000000..b60ed208c77 --- /dev/null +++ b/arch/arm64/boot/dts/.gitignore @@ -0,0 +1 @@ +*.dtb diff --git a/arch/arm64/boot/dts/Makefile b/arch/arm64/boot/dts/Makefile new file mode 100644 index 00000000000..801e2d7fcbc --- /dev/null +++ b/arch/arm64/boot/dts/Makefile @@ -0,0 +1,5 @@ +targets += dtbs + +dtbs: $(addprefix $(obj)/, $(dtb-y)) + +clean-files := *.dtb diff --git a/arch/arm64/include/asm/Kbuild b/arch/arm64/include/asm/Kbuild index a581a220593..14a9d5a2b85 100644 --- a/arch/arm64/include/asm/Kbuild +++ b/arch/arm64/include/asm/Kbuild @@ -3,6 +3,7 @@  generic-y += bug.h  generic-y += bugs.h  generic-y += checksum.h +generic-y += clkdev.h  generic-y += cputime.h  generic-y += current.h  generic-y += delay.h @@ -43,6 +44,7 @@ generic-y += swab.h  generic-y += termbits.h  generic-y += termios.h  generic-y += topology.h +generic-y += trace_clock.h  generic-y += types.h  generic-y += unaligned.h  generic-y += user.h diff --git a/arch/arm64/include/asm/arm_generic.h b/arch/arm64/include/asm/arm_generic.h index e4cec9d30f2..df2aeb82f74 100644 --- a/arch/arm64/include/asm/arm_generic.h +++ b/arch/arm64/include/asm/arm_generic.h @@ -70,12 +70,12 @@ static inline void __cpuinit arch_counter_enable_user_access(void)  {  	u32 cntkctl; -	/* Disable user access to the timers and the virtual counter. */ +	/* Disable user access to the timers and the physical counter. */  	asm volatile("mrs	%0, cntkctl_el1" : "=r" (cntkctl)); -	cntkctl &= ~((3 << 8) | (1 << 1)); +	cntkctl &= ~((3 << 8) | (1 << 0)); -	/* Enable user access to the physical counter and frequency. */ -	cntkctl |= 1; +	/* Enable user access to the virtual counter and frequency. */ +	cntkctl |= (1 << 1);  	asm volatile("msr	cntkctl_el1, %0" : : "r" (cntkctl));  } diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h index da2a13e8f1e..c8eedc60498 100644 --- a/arch/arm64/include/asm/assembler.h +++ b/arch/arm64/include/asm/assembler.h @@ -107,3 +107,11 @@   * Register aliases.   */  lr	.req	x30		// link register + +/* + * Vector entry + */ +	 .macro	ventry	label +	.align	7 +	b	\label +	.endm diff --git a/arch/arm64/include/asm/cacheflush.h b/arch/arm64/include/asm/cacheflush.h index aa3132ab7f2..3300cbd18a8 100644 --- a/arch/arm64/include/asm/cacheflush.h +++ b/arch/arm64/include/asm/cacheflush.h @@ -70,13 +70,20 @@   *		- size   - region size   */  extern void flush_cache_all(void); -extern void flush_cache_mm(struct mm_struct *mm);  extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end); -extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn);  extern void flush_icache_range(unsigned long start, unsigned long end);  extern void __flush_dcache_area(void *addr, size_t len);  extern void __flush_cache_user_range(unsigned long start, unsigned long end); +static inline void flush_cache_mm(struct mm_struct *mm) +{ +} + +static inline void flush_cache_page(struct vm_area_struct *vma, +				    unsigned long user_addr, unsigned long pfn) +{ +} +  /*   * Copy user data from/to a page which is mapped into a different   * processes address space.  Really, we want to allow our "user diff --git a/arch/arm64/include/asm/fpsimdmacros.h b/arch/arm64/include/asm/fpsimdmacros.h new file mode 100644 index 00000000000..bbec599c96b --- /dev/null +++ b/arch/arm64/include/asm/fpsimdmacros.h @@ -0,0 +1,64 @@ +/* + * FP/SIMD state saving and restoring macros + * + * Copyright (C) 2012 ARM Ltd. + * Author: Catalin Marinas <catalin.marinas@arm.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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +.macro fpsimd_save state, tmpnr +	stp	q0, q1, [\state, #16 * 0] +	stp	q2, q3, [\state, #16 * 2] +	stp	q4, q5, [\state, #16 * 4] +	stp	q6, q7, [\state, #16 * 6] +	stp	q8, q9, [\state, #16 * 8] +	stp	q10, q11, [\state, #16 * 10] +	stp	q12, q13, [\state, #16 * 12] +	stp	q14, q15, [\state, #16 * 14] +	stp	q16, q17, [\state, #16 * 16] +	stp	q18, q19, [\state, #16 * 18] +	stp	q20, q21, [\state, #16 * 20] +	stp	q22, q23, [\state, #16 * 22] +	stp	q24, q25, [\state, #16 * 24] +	stp	q26, q27, [\state, #16 * 26] +	stp	q28, q29, [\state, #16 * 28] +	stp	q30, q31, [\state, #16 * 30]! +	mrs	x\tmpnr, fpsr +	str	w\tmpnr, [\state, #16 * 2] +	mrs	x\tmpnr, fpcr +	str	w\tmpnr, [\state, #16 * 2 + 4] +.endm + +.macro fpsimd_restore state, tmpnr +	ldp	q0, q1, [\state, #16 * 0] +	ldp	q2, q3, [\state, #16 * 2] +	ldp	q4, q5, [\state, #16 * 4] +	ldp	q6, q7, [\state, #16 * 6] +	ldp	q8, q9, [\state, #16 * 8] +	ldp	q10, q11, [\state, #16 * 10] +	ldp	q12, q13, [\state, #16 * 12] +	ldp	q14, q15, [\state, #16 * 14] +	ldp	q16, q17, [\state, #16 * 16] +	ldp	q18, q19, [\state, #16 * 18] +	ldp	q20, q21, [\state, #16 * 20] +	ldp	q22, q23, [\state, #16 * 22] +	ldp	q24, q25, [\state, #16 * 24] +	ldp	q26, q27, [\state, #16 * 26] +	ldp	q28, q29, [\state, #16 * 28] +	ldp	q30, q31, [\state, #16 * 30]! +	ldr	w\tmpnr, [\state, #16 * 2] +	msr	fpsr, x\tmpnr +	ldr	w\tmpnr, [\state, #16 * 2 + 4] +	msr	fpcr, x\tmpnr +.endm diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index 14aba2db677..64b13394950 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -159,6 +159,8 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,  {  	if (pte_present_exec_user(pte))  		__sync_icache_dcache(pte, addr); +	if (!pte_dirty(pte)) +		pte = pte_wrprotect(pte);  	set_pte(ptep, pte);  } diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 77f696c1433..ab239b2c456 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -128,11 +128,6 @@ unsigned long get_wchan(struct task_struct *p);  extern struct task_struct *cpu_switch_to(struct task_struct *prev,  					 struct task_struct *next); -/* - * Create a new kernel thread - */ -extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -  #define task_pt_regs(p) \  	((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1) diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h index b04d3404f0d..4ce845f8ee1 100644 --- a/arch/arm64/include/asm/ptrace.h +++ b/arch/arm64/include/asm/ptrace.h @@ -30,7 +30,17 @@  #define COMPAT_PTRACE_SETVFPREGS	28  #define COMPAT_PTRACE_GETHBPREGS	29  #define COMPAT_PTRACE_SETHBPREGS	30 + +/* AArch32 CPSR bits */ +#define COMPAT_PSR_MODE_MASK	0x0000001f  #define COMPAT_PSR_MODE_USR	0x00000010 +#define COMPAT_PSR_MODE_FIQ	0x00000011 +#define COMPAT_PSR_MODE_IRQ	0x00000012 +#define COMPAT_PSR_MODE_SVC	0x00000013 +#define COMPAT_PSR_MODE_ABT	0x00000017 +#define COMPAT_PSR_MODE_HYP	0x0000001a +#define COMPAT_PSR_MODE_UND	0x0000001b +#define COMPAT_PSR_MODE_SYS	0x0000001f  #define COMPAT_PSR_T_BIT	0x00000020  #define COMPAT_PSR_IT_MASK	0x0600fc00	/* If-Then execution state mask */  /* @@ -44,10 +54,27 @@  /* sizeof(struct user) for AArch32 */  #define COMPAT_USER_SZ	296 -/* AArch32 uses x13 as the stack pointer... */ + +/* Architecturally defined mapping between AArch32 and AArch64 registers */ +#define compat_usr(x)	regs[(x)]  #define compat_sp	regs[13] -/* ... and x14 as the link register. */  #define compat_lr	regs[14] +#define compat_sp_hyp	regs[15] +#define compat_sp_irq	regs[16] +#define compat_lr_irq	regs[17] +#define compat_sp_svc	regs[18] +#define compat_lr_svc	regs[19] +#define compat_sp_abt	regs[20] +#define compat_lr_abt	regs[21] +#define compat_sp_und	regs[22] +#define compat_lr_und	regs[23] +#define compat_r8_fiq	regs[24] +#define compat_r9_fiq	regs[25] +#define compat_r10_fiq	regs[26] +#define compat_r11_fiq	regs[27] +#define compat_r12_fiq	regs[28] +#define compat_sp_fiq	regs[29] +#define compat_lr_fiq	regs[30]  /*   * This struct defines the way the registers are stored on the stack during an diff --git a/arch/arm64/include/asm/syscalls.h b/arch/arm64/include/asm/syscalls.h index 09ff33572aa..20d63b29066 100644 --- a/arch/arm64/include/asm/syscalls.h +++ b/arch/arm64/include/asm/syscalls.h @@ -23,14 +23,6 @@  /*   * System call wrappers implemented in kernel/entry.S.   */ -asmlinkage long sys_execve_wrapper(const char __user *filename, -				   const char __user *const __user *argv, -				   const char __user *const __user *envp); -asmlinkage long sys_clone_wrapper(unsigned long clone_flags, -				  unsigned long newsp, -				  void __user *parent_tid, -				  unsigned long tls_val, -				  void __user *child_tid);  asmlinkage long sys_rt_sigreturn_wrapper(void);  asmlinkage long sys_sigaltstack_wrapper(const stack_t __user *uss,  					stack_t __user *uoss); diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index 68aff2816e8..d69aeea6da1 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -24,5 +24,9 @@  #define __ARCH_WANT_SYS_SIGPROCMASK  #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND  #define __ARCH_WANT_COMPAT_SYS_SENDFILE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK  #endif +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_CLONE  #include <uapi/asm/unistd.h> diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 6d909faebf2..58432625fdb 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h @@ -23,7 +23,7 @@  __SYSCALL(0,   sys_restart_syscall)  __SYSCALL(1,   sys_exit) -__SYSCALL(2,   compat_sys_fork_wrapper) +__SYSCALL(2,   sys_fork)  __SYSCALL(3,   sys_read)  __SYSCALL(4,   sys_write)  __SYSCALL(5,   compat_sys_open) @@ -32,7 +32,7 @@ __SYSCALL(7,   sys_ni_syscall)			/* 7 was sys_waitpid */  __SYSCALL(8,   sys_creat)  __SYSCALL(9,   sys_link)  __SYSCALL(10,  sys_unlink) -__SYSCALL(11,  compat_sys_execve_wrapper) +__SYSCALL(11,  compat_sys_execve)  __SYSCALL(12,  sys_chdir)  __SYSCALL(13,  sys_ni_syscall)			/* 13 was sys_time */  __SYSCALL(14,  sys_mknod) @@ -141,7 +141,7 @@ __SYSCALL(116, compat_sys_sysinfo)  __SYSCALL(117, sys_ni_syscall)			/* 117 was sys_ipc */  __SYSCALL(118, sys_fsync)  __SYSCALL(119, compat_sys_sigreturn_wrapper) -__SYSCALL(120, compat_sys_clone_wrapper) +__SYSCALL(120, sys_clone)  __SYSCALL(121, sys_setdomainname)  __SYSCALL(122, sys_newuname)  __SYSCALL(123, sys_ni_syscall)			/* 123 was sys_modify_ldt */ @@ -211,7 +211,7 @@ __SYSCALL(186, compat_sys_sigaltstack_wrapper)  __SYSCALL(187, compat_sys_sendfile)  __SYSCALL(188, sys_ni_syscall)			/* 188 reserved */  __SYSCALL(189, sys_ni_syscall)			/* 189 reserved */ -__SYSCALL(190, compat_sys_vfork_wrapper) +__SYSCALL(190, sys_vfork)  __SYSCALL(191, compat_sys_getrlimit)		/* SuS compliant getrlimit */  __SYSCALL(192, sys_mmap_pgoff)  __SYSCALL(193, compat_sys_truncate64_wrapper) @@ -392,8 +392,8 @@ __SYSCALL(367, sys_fanotify_init)  __SYSCALL(368, compat_sys_fanotify_mark_wrapper)  __SYSCALL(369, sys_prlimit64)  __SYSCALL(370, sys_name_to_handle_at) -__SYSCALL(371, sys_open_by_handle_at) -__SYSCALL(372, sys_clock_adjtime) +__SYSCALL(371, compat_sys_open_by_handle_at) +__SYSCALL(372, compat_sys_clock_adjtime)  __SYSCALL(373, sys_syncfs)  #define __NR_compat_syscalls		374 diff --git a/arch/arm64/include/asm/virt.h b/arch/arm64/include/asm/virt.h new file mode 100644 index 00000000000..439827271e3 --- /dev/null +++ b/arch/arm64/include/asm/virt.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2012 ARM Ltd. + * Author: Marc Zyngier <marc.zyngier@arm.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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __ASM__VIRT_H +#define __ASM__VIRT_H + +#define BOOT_CPU_MODE_EL2	(0x0e12b007) + +#ifndef __ASSEMBLY__ + +/* + * __boot_cpu_mode records what mode CPUs were booted in. + * A correctly-implemented bootloader must start all CPUs in the same mode: + * In this case, both 32bit halves of __boot_cpu_mode will contain the + * same value (either 0 if booted in EL1, BOOT_CPU_MODE_EL2 if booted in EL2). + * + * Should the bootloader fail to do this, the two values will be different. + * This allows the kernel to flag an error when the secondaries have come up. + */ +extern u32 __boot_cpu_mode[2]; + +void __hyp_set_vectors(phys_addr_t phys_vector_base); +phys_addr_t __hyp_get_vectors(void); + +/* Reports the availability of HYP mode */ +static inline bool is_hyp_mode_available(void) +{ +	return (__boot_cpu_mode[0] == BOOT_CPU_MODE_EL2 && +		__boot_cpu_mode[1] == BOOT_CPU_MODE_EL2); +} + +/* Check if the bootloader has booted CPUs in different modes */ +static inline bool is_hyp_mode_mismatched(void) +{ +	return __boot_cpu_mode[0] != __boot_cpu_mode[1]; +} + +#endif /* __ASSEMBLY__ */ + +#endif /* ! __ASM__VIRT_H */ diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index e2caff1b812..74239c31e25 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -8,7 +8,8 @@ AFLAGS_head.o		:= -DTEXT_OFFSET=$(TEXT_OFFSET)  # Object file lists.  arm64-obj-y		:= cputable.o debug-monitors.o entry.o irq.o fpsimd.o	\  			   entry-fpsimd.o process.o ptrace.o setup.o signal.o	\ -			   sys.o stacktrace.o time.o traps.o io.o vdso.o +			   sys.o stacktrace.o time.o traps.o io.o vdso.o	\ +			   hyp-stub.o  arm64-obj-$(CONFIG_COMPAT)		+= sys32.o kuser32.o signal32.o 	\  					   sys_compat.o diff --git a/arch/arm64/kernel/entry-fpsimd.S b/arch/arm64/kernel/entry-fpsimd.S index 17988a6e7ea..6a27cd6dbfa 100644 --- a/arch/arm64/kernel/entry-fpsimd.S +++ b/arch/arm64/kernel/entry-fpsimd.S @@ -20,6 +20,7 @@  #include <linux/linkage.h>  #include <asm/assembler.h> +#include <asm/fpsimdmacros.h>  /*   * Save the FP registers. @@ -27,26 +28,7 @@   * x0 - pointer to struct fpsimd_state   */  ENTRY(fpsimd_save_state) -	stp	q0, q1, [x0, #16 * 0] -	stp	q2, q3, [x0, #16 * 2] -	stp	q4, q5, [x0, #16 * 4] -	stp	q6, q7, [x0, #16 * 6] -	stp	q8, q9, [x0, #16 * 8] -	stp	q10, q11, [x0, #16 * 10] -	stp	q12, q13, [x0, #16 * 12] -	stp	q14, q15, [x0, #16 * 14] -	stp	q16, q17, [x0, #16 * 16] -	stp	q18, q19, [x0, #16 * 18] -	stp	q20, q21, [x0, #16 * 20] -	stp	q22, q23, [x0, #16 * 22] -	stp	q24, q25, [x0, #16 * 24] -	stp	q26, q27, [x0, #16 * 26] -	stp	q28, q29, [x0, #16 * 28] -	stp	q30, q31, [x0, #16 * 30]! -	mrs	x8, fpsr -	str	w8, [x0, #16 * 2] -	mrs	x8, fpcr -	str	w8, [x0, #16 * 2 + 4] +	fpsimd_save x0, 8  	ret  ENDPROC(fpsimd_save_state) @@ -56,25 +38,6 @@ ENDPROC(fpsimd_save_state)   * x0 - pointer to struct fpsimd_state   */  ENTRY(fpsimd_load_state) -	ldp	q0, q1, [x0, #16 * 0] -	ldp	q2, q3, [x0, #16 * 2] -	ldp	q4, q5, [x0, #16 * 4] -	ldp	q6, q7, [x0, #16 * 6] -	ldp	q8, q9, [x0, #16 * 8] -	ldp	q10, q11, [x0, #16 * 10] -	ldp	q12, q13, [x0, #16 * 12] -	ldp	q14, q15, [x0, #16 * 14] -	ldp	q16, q17, [x0, #16 * 16] -	ldp	q18, q19, [x0, #16 * 18] -	ldp	q20, q21, [x0, #16 * 20] -	ldp	q22, q23, [x0, #16 * 22] -	ldp	q24, q25, [x0, #16 * 24] -	ldp	q26, q27, [x0, #16 * 26] -	ldp	q28, q29, [x0, #16 * 28] -	ldp	q30, q31, [x0, #16 * 30]! -	ldr	w8, [x0, #16 * 2] -	ldr	w9, [x0, #16 * 2 + 4] -	msr	fpsr, x8 -	msr	fpcr, x9 +	fpsimd_restore x0, 8  	ret  ENDPROC(fpsimd_load_state) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index a6f3f7da688..9c94f404ded 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -148,10 +148,6 @@ tsk	.req	x28		// current thread_info  /*   * Exception vectors.   */ -	.macro	ventry	label -	.align	7 -	b	\label -	.endm  	.align	11  ENTRY(vectors) @@ -594,7 +590,7 @@ work_resched:  /*   * "slow" syscall return path.   */ -ENTRY(ret_to_user) +ret_to_user:  	disable_irq				// disable interrupts  	ldr	x1, [tsk, #TI_FLAGS]  	and	x2, x1, #_TIF_WORK_MASK @@ -611,7 +607,10 @@ ENDPROC(ret_to_user)   */  ENTRY(ret_from_fork)  	bl	schedule_tail -	get_thread_info tsk +	cbz	x19, 1f				// not a kernel thread +	mov	x0, x20 +	blr	x19 +1:	get_thread_info tsk  	b	ret_to_user  ENDPROC(ret_from_fork) @@ -673,16 +672,6 @@ __sys_trace_return:  /*   * Special system call wrappers.   */ -ENTRY(sys_execve_wrapper) -	mov	x3, sp -	b	sys_execve -ENDPROC(sys_execve_wrapper) - -ENTRY(sys_clone_wrapper) -	mov	x5, sp -	b	sys_clone -ENDPROC(sys_clone_wrapper) -  ENTRY(sys_rt_sigreturn_wrapper)  	mov	x0, sp  	b	sys_rt_sigreturn diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index a2f02b63eae..368ad1f7c36 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S @@ -31,6 +31,7 @@  #include <asm/pgtable-hwdef.h>  #include <asm/pgtable.h>  #include <asm/page.h> +#include <asm/virt.h>  /*   * swapper_pg_dir is the virtual address of the initial page table. We place @@ -115,13 +116,13 @@  ENTRY(stext)  	mov	x21, x0				// x21=FDT +	bl	__calc_phys_offset		// x24=PHYS_OFFSET, x28=PHYS_OFFSET-PAGE_OFFSET  	bl	el2_setup			// Drop to EL1  	mrs	x22, midr_el1			// x22=cpuid  	mov	x0, x22  	bl	lookup_processor_type  	mov	x23, x0				// x23=current cpu_table  	cbz	x23, __error_p			// invalid processor (x23=0)? -	bl	__calc_phys_offset		// x24=PHYS_OFFSET, x28=PHYS_OFFSET-PAGE_OFFSET  	bl	__vet_fdt  	bl	__create_page_tables		// x25=TTBR0, x26=TTBR1  	/* @@ -147,17 +148,23 @@ ENTRY(el2_setup)  	mrs	x0, CurrentEL  	cmp	x0, #PSR_MODE_EL2t  	ccmp	x0, #PSR_MODE_EL2h, #0x4, ne +	ldr	x0, =__boot_cpu_mode		// Compute __boot_cpu_mode +	add	x0, x0, x28  	b.eq	1f +	str	wzr, [x0]			// Remember we don't have EL2...  	ret  	/* Hyp configuration. */ -1:	mov	x0, #(1 << 31)			// 64-bit EL1 +1:	ldr	w1, =BOOT_CPU_MODE_EL2 +	str	w1, [x0, #4]			// This CPU has EL2 +	mov	x0, #(1 << 31)			// 64-bit EL1  	msr	hcr_el2, x0  	/* Generic timers. */  	mrs	x0, cnthctl_el2  	orr	x0, x0, #3			// Enable EL1 physical timers  	msr	cnthctl_el2, x0 +	msr	cntvoff_el2, xzr		// Clear virtual offset  	/* Populate ID registers. */  	mrs	x0, midr_el1 @@ -178,6 +185,13 @@ ENTRY(el2_setup)  	msr	hstr_el2, xzr			// Disable CP15 traps to EL2  #endif +	/* Stage-2 translation */ +	msr	vttbr_el2, xzr + +	/* Hypervisor stub */ +	adr	x0, __hyp_stub_vectors +	msr	vbar_el2, x0 +  	/* spsr */  	mov	x0, #(PSR_F_BIT | PSR_I_BIT | PSR_A_BIT | PSR_D_BIT |\  		      PSR_MODE_EL1h) @@ -186,6 +200,19 @@ ENTRY(el2_setup)  	eret  ENDPROC(el2_setup) +/* + * We need to find out the CPU boot mode long after boot, so we need to + * store it in a writable variable. + * + * This is not in .bss, because we set it sufficiently early that the boot-time + * zeroing of .bss would clobber it. + */ +	.pushsection	.data +ENTRY(__boot_cpu_mode) +	.long	BOOT_CPU_MODE_EL2 +	.long	0 +	.popsection +  	.align	3  2:	.quad	.  	.quad	PAGE_OFFSET @@ -201,6 +228,7 @@ ENDPROC(el2_setup)  	 * cores are held until we're ready for them to initialise.  	 */  ENTRY(secondary_holding_pen) +	bl	__calc_phys_offset		// x24=phys offset  	bl	el2_setup			// Drop to EL1  	mrs	x0, mpidr_el1  	and	x0, x0, #15			// CPU number @@ -226,7 +254,6 @@ ENTRY(secondary_startup)  	mov	x23, x0				// x23=current cpu_table  	cbz	x23, __error_p			// invalid processor (x23=0)? -	bl	__calc_phys_offset		// x24=phys offset  	pgtbl	x25, x26, x24			// x25=TTBR0, x26=TTBR1  	ldr	x12, [x23, #CPU_INFO_SETUP]  	add	x12, x12, x28			// __virt_to_phys diff --git a/arch/arm64/kernel/hyp-stub.S b/arch/arm64/kernel/hyp-stub.S new file mode 100644 index 00000000000..0959611d9ff --- /dev/null +++ b/arch/arm64/kernel/hyp-stub.S @@ -0,0 +1,109 @@ +/* + * Hypervisor stub + * + * Copyright (C) 2012 ARM Ltd. + * Author:	Marc Zyngier <marc.zyngier@arm.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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/init.h> +#include <linux/linkage.h> + +#include <asm/assembler.h> +#include <asm/ptrace.h> +#include <asm/virt.h> + +	.text +	.align 11 + +ENTRY(__hyp_stub_vectors) +	ventry	el2_sync_invalid		// Synchronous EL2t +	ventry	el2_irq_invalid			// IRQ EL2t +	ventry	el2_fiq_invalid			// FIQ EL2t +	ventry	el2_error_invalid		// Error EL2t + +	ventry	el2_sync_invalid		// Synchronous EL2h +	ventry	el2_irq_invalid			// IRQ EL2h +	ventry	el2_fiq_invalid			// FIQ EL2h +	ventry	el2_error_invalid		// Error EL2h + +	ventry	el1_sync			// Synchronous 64-bit EL1 +	ventry	el1_irq_invalid			// IRQ 64-bit EL1 +	ventry	el1_fiq_invalid			// FIQ 64-bit EL1 +	ventry	el1_error_invalid		// Error 64-bit EL1 + +	ventry	el1_sync_invalid		// Synchronous 32-bit EL1 +	ventry	el1_irq_invalid			// IRQ 32-bit EL1 +	ventry	el1_fiq_invalid			// FIQ 32-bit EL1 +	ventry	el1_error_invalid		// Error 32-bit EL1 +ENDPROC(__hyp_stub_vectors) + +	.align 11 + +el1_sync: +	mrs	x1, esr_el2 +	lsr	x1, x1, #26 +	cmp	x1, #0x16 +	b.ne	2f				// Not an HVC trap +	cbz	x0, 1f +	msr	vbar_el2, x0			// Set vbar_el2 +	b	2f +1:	mrs	x0, vbar_el2			// Return vbar_el2 +2:	eret +ENDPROC(el1_sync) + +.macro invalid_vector	label +\label: +	b \label +ENDPROC(\label) +.endm + +	invalid_vector	el2_sync_invalid +	invalid_vector	el2_irq_invalid +	invalid_vector	el2_fiq_invalid +	invalid_vector	el2_error_invalid +	invalid_vector	el1_sync_invalid +	invalid_vector	el1_irq_invalid +	invalid_vector	el1_fiq_invalid +	invalid_vector	el1_error_invalid + +/* + * __hyp_set_vectors: Call this after boot to set the initial hypervisor + * vectors as part of hypervisor installation.  On an SMP system, this should + * be called on each CPU. + * + * x0 must be the physical address of the new vector table, and must be + * 2KB aligned. + * + * Before calling this, you must check that the stub hypervisor is installed + * everywhere, by waiting for any secondary CPUs to be brought up and then + * checking that is_hyp_mode_available() is true. + * + * If not, there is a pre-existing hypervisor, some CPUs failed to boot, or + * something else went wrong... in such cases, trying to install a new + * hypervisor is unlikely to work as desired. + * + * When you call into your shiny new hypervisor, sp_el2 will contain junk, + * so you will need to set that to something sensible at the new hypervisor's + * initialisation entry point. + */ + +ENTRY(__hyp_get_vectors) +	mov	x0, xzr +	// fall through +ENTRY(__hyp_set_vectors) +	hvc	#0 +	ret +ENDPROC(__hyp_get_vectors) +ENDPROC(__hyp_set_vectors) diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index e04cebdbb47..cb0956bc96e 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -234,33 +234,46 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)  asmlinkage void ret_from_fork(void) asm("ret_from_fork");  int copy_thread(unsigned long clone_flags, unsigned long stack_start, -		unsigned long stk_sz, struct task_struct *p, -		struct pt_regs *regs) +		unsigned long stk_sz, struct task_struct *p)  {  	struct pt_regs *childregs = task_pt_regs(p);  	unsigned long tls = p->thread.tp_value; -	*childregs = *regs; -	childregs->regs[0] = 0; +	memset(&p->thread.cpu_context, 0, sizeof(struct cpu_context)); -	if (is_compat_thread(task_thread_info(p))) -		childregs->compat_sp = stack_start; -	else { +	if (likely(!(p->flags & PF_KTHREAD))) { +		*childregs = *current_pt_regs(); +		childregs->regs[0] = 0; +		if (is_compat_thread(task_thread_info(p))) { +			if (stack_start) +				childregs->compat_sp = stack_start; +		} else { +			/* +			 * Read the current TLS pointer from tpidr_el0 as it may be +			 * out-of-sync with the saved value. +			 */ +			asm("mrs %0, tpidr_el0" : "=r" (tls)); +			if (stack_start) { +				/* 16-byte aligned stack mandatory on AArch64 */ +				if (stack_start & 15) +					return -EINVAL; +				childregs->sp = stack_start; +			} +		}  		/* -		 * Read the current TLS pointer from tpidr_el0 as it may be -		 * out-of-sync with the saved value. +		 * If a TLS pointer was passed to clone (4th argument), use it +		 * for the new thread.  		 */ -		asm("mrs %0, tpidr_el0" : "=r" (tls)); -		childregs->sp = stack_start; +		if (clone_flags & CLONE_SETTLS) +			tls = childregs->regs[3]; +	} else { +		memset(childregs, 0, sizeof(struct pt_regs)); +		childregs->pstate = PSR_MODE_EL1h; +		p->thread.cpu_context.x19 = stack_start; +		p->thread.cpu_context.x20 = stk_sz;  	} - -	memset(&p->thread.cpu_context, 0, sizeof(struct cpu_context)); -	p->thread.cpu_context.sp = (unsigned long)childregs;  	p->thread.cpu_context.pc = (unsigned long)ret_from_fork; - -	/* If a TLS pointer was passed to clone, use that for the new thread. */ -	if (clone_flags & CLONE_SETTLS) -		tls = regs->regs[3]; +	p->thread.cpu_context.sp = (unsigned long)childregs;  	p->thread.tp_value = tls;  	ptrace_hw_copy_thread(p); @@ -309,43 +322,6 @@ struct task_struct *__switch_to(struct task_struct *prev,  	return last;  } -/* - * Shuffle the argument into the correct register before calling the - * thread function.  x1 is the thread argument, x2 is the pointer to - * the thread function, and x3 points to the exit function. - */ -extern void kernel_thread_helper(void); -asm(	".section .text\n" -"	.align\n" -"	.type	kernel_thread_helper, #function\n" -"kernel_thread_helper:\n" -"	mov	x0, x1\n" -"	mov	x30, x3\n" -"	br	x2\n" -"	.size	kernel_thread_helper, . - kernel_thread_helper\n" -"	.previous"); - -#define kernel_thread_exit	do_exit - -/* - * Create a kernel thread. - */ -pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); - -	regs.regs[1] = (unsigned long)arg; -	regs.regs[2] = (unsigned long)fn; -	regs.regs[3] = (unsigned long)kernel_thread_exit; -	regs.pc = (unsigned long)kernel_thread_helper; -	regs.pstate = PSR_MODE_EL1h; - -	return do_fork(flags|CLONE_VM|CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); -} -EXPORT_SYMBOL(kernel_thread); -  unsigned long get_wchan(struct task_struct *p)  {  	struct stackframe frame; diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 8807ba2cf26..abd756315cb 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -41,6 +41,8 @@  struct rt_sigframe {  	struct siginfo info;  	struct ucontext uc; +	u64 fp; +	u64 lr;  };  static int preserve_fpsimd_context(struct fpsimd_context __user *ctx) @@ -175,6 +177,10 @@ static int setup_sigframe(struct rt_sigframe __user *sf,  	struct aux_context __user *aux =  		(struct aux_context __user *)sf->uc.uc_mcontext.__reserved; +	/* set up the stack frame for unwinding */ +	__put_user_error(regs->regs[29], &sf->fp, err); +	__put_user_error(regs->regs[30], &sf->lr, err); +  	for (i = 0; i < 31; i++)  		__put_user_error(regs->regs[i], &sf->uc.uc_mcontext.regs[i],  				 err); @@ -196,11 +202,11 @@ static int setup_sigframe(struct rt_sigframe __user *sf,  	return err;  } -static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, -				 int framesize) +static struct rt_sigframe __user *get_sigframe(struct k_sigaction *ka, +					       struct pt_regs *regs)  {  	unsigned long sp, sp_top; -	void __user *frame; +	struct rt_sigframe __user *frame;  	sp = sp_top = regs->sp; @@ -210,11 +216,8 @@ static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,  	if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))  		sp = sp_top = current->sas_ss_sp + current->sas_ss_size; -	/* room for stack frame (FP, LR) */ -	sp -= 16; - -	sp = (sp - framesize) & ~15; -	frame = (void __user *)sp; +	sp = (sp - sizeof(struct rt_sigframe)) & ~15; +	frame = (struct rt_sigframe __user *)sp;  	/*  	 * Check that we can actually write to the signal frame. @@ -225,20 +228,14 @@ static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,  	return frame;  } -static int setup_return(struct pt_regs *regs, struct k_sigaction *ka, -			void __user *frame, int usig) +static void setup_return(struct pt_regs *regs, struct k_sigaction *ka, +			 void __user *frame, int usig)  { -	int err = 0;  	__sigrestore_t sigtramp; -	unsigned long __user *sp = (unsigned long __user *)regs->sp; - -	/* set up the stack frame */ -	__put_user_error(regs->regs[29], sp - 2, err); -	__put_user_error(regs->regs[30], sp - 1, err);  	regs->regs[0] = usig; -	regs->regs[29] = regs->sp - 16;  	regs->sp = (unsigned long)frame; +	regs->regs[29] = regs->sp + offsetof(struct rt_sigframe, fp);  	regs->pc = (unsigned long)ka->sa.sa_handler;  	if (ka->sa.sa_flags & SA_RESTORER) @@ -247,8 +244,6 @@ static int setup_return(struct pt_regs *regs, struct k_sigaction *ka,  		sigtramp = VDSO_SYMBOL(current->mm->context.vdso, sigtramp);  	regs->regs[30] = (unsigned long)sigtramp; - -	return err;  }  static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, @@ -258,7 +253,7 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,  	stack_t stack;  	int err = 0; -	frame = get_sigframe(ka, regs, sizeof(*frame)); +	frame = get_sigframe(ka, regs);  	if (!frame)  		return 1; @@ -272,13 +267,13 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,  	err |= __copy_to_user(&frame->uc.uc_stack, &stack, sizeof(stack));  	err |= setup_sigframe(frame, regs, set); -	if (err == 0) -		err = setup_return(regs, ka, frame, usig); - -	if (err == 0 && ka->sa.sa_flags & SA_SIGINFO) { -		err |= copy_siginfo_to_user(&frame->info, info); -		regs->regs[1] = (unsigned long)&frame->info; -		regs->regs[2] = (unsigned long)&frame->uc; +	if (err == 0) { +		setup_return(regs, ka, frame, usig); +		if (ka->sa.sa_flags & SA_SIGINFO) { +			err |= copy_siginfo_to_user(&frame->info, info); +			regs->regs[1] = (unsigned long)&frame->info; +			regs->regs[2] = (unsigned long)&frame->uc; +		}  	}  	return err; diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c index 4654824747a..a4db3d22aac 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c @@ -578,9 +578,9 @@ badframe:  	return 0;  } -static inline void __user *compat_get_sigframe(struct k_sigaction *ka, -					       struct pt_regs *regs, -					       int framesize) +static void __user *compat_get_sigframe(struct k_sigaction *ka, +					struct pt_regs *regs, +					int framesize)  {  	compat_ulong_t sp = regs->compat_sp;  	void __user *frame; @@ -605,9 +605,9 @@ static inline void __user *compat_get_sigframe(struct k_sigaction *ka,  	return frame;  } -static int compat_setup_return(struct pt_regs *regs, struct k_sigaction *ka, -			       compat_ulong_t __user *rc, void __user *frame, -			       int usig) +static void compat_setup_return(struct pt_regs *regs, struct k_sigaction *ka, +				compat_ulong_t __user *rc, void __user *frame, +				int usig)  {  	compat_ulong_t handler = ptr_to_compat(ka->sa.sa_handler);  	compat_ulong_t retcode; @@ -643,8 +643,6 @@ static int compat_setup_return(struct pt_regs *regs, struct k_sigaction *ka,  	regs->compat_lr	= retcode;  	regs->pc	= handler;  	regs->pstate	= spsr; - -	return 0;  }  static int compat_setup_sigframe(struct compat_sigframe __user *sf, @@ -714,11 +712,9 @@ int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,  	err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack));  	err |= compat_setup_sigframe(&frame->sig, regs, set); -	if (err == 0) -		err = compat_setup_return(regs, ka, frame->sig.retcode, frame, -					  usig);  	if (err == 0) { +		compat_setup_return(regs, ka, frame->sig.retcode, frame, usig);  		regs->regs[1] = (compat_ulong_t)(unsigned long)&frame->info;  		regs->regs[2] = (compat_ulong_t)(unsigned long)&frame->sig.uc;  	} @@ -741,7 +737,7 @@ int compat_setup_frame(int usig, struct k_sigaction *ka, sigset_t *set,  	err |= compat_setup_sigframe(frame, regs, set);  	if (err == 0) -		err = compat_setup_return(regs, ka, frame->retcode, frame, usig); +		compat_setup_return(regs, ka, frame->retcode, frame, usig);  	return err;  } diff --git a/arch/arm64/kernel/sys.c b/arch/arm64/kernel/sys.c index b120df37de3..8292a9b090f 100644 --- a/arch/arm64/kernel/sys.c +++ b/arch/arm64/kernel/sys.c @@ -26,85 +26,6 @@  #include <linux/slab.h>  #include <linux/syscalls.h> -/* - * Clone a task - this clones the calling program thread. - */ -asmlinkage long sys_clone(unsigned long clone_flags, unsigned long newsp, -			  int __user *parent_tidptr, unsigned long tls_val, -			  int __user *child_tidptr, struct pt_regs *regs) -{ -	if (!newsp) -		newsp = regs->sp; -	/* 16-byte aligned stack mandatory on AArch64 */ -	if (newsp & 15) -		return -EINVAL; -	return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr); -} - -/* - * sys_execve() executes a new program. - */ -asmlinkage long sys_execve(const char __user *filenamei, -			   const char __user *const __user *argv, -			   const char __user *const __user *envp, -			   struct pt_regs *regs) -{ -	long error; -	struct filename *filename; - -	filename = getname(filenamei); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = do_execve(filename->name, argv, envp, regs); -	putname(filename); -out: -	return error; -} - -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	struct pt_regs regs; -	int ret; - -	memset(®s, 0, sizeof(struct pt_regs)); -	ret = do_execve(filename, -			(const char __user *const __user *)argv, -			(const char __user *const __user *)envp, ®s); -	if (ret < 0) -		goto out; - -	/* -	 * Save argc to the register structure for userspace. -	 */ -	regs.regs[0] = ret; - -	/* -	 * We were successful.  We won't be returning to our caller, but -	 * instead to user space by manipulating the kernel stack. -	 */ -	asm(	"add	x0, %0, %1\n\t" -		"mov	x1, %2\n\t" -		"mov	x2, %3\n\t" -		"bl	memmove\n\t"	/* copy regs to top of stack */ -		"mov	x27, #0\n\t"	/* not a syscall */ -		"mov	x28, %0\n\t"	/* thread structure */ -		"mov	sp, x0\n\t"	/* reposition stack pointer */ -		"b	ret_to_user" -		: -		: "r" (current_thread_info()), -		  "Ir" (THREAD_START_SP - sizeof(regs)), -		  "r" (®s), -		  "Ir" (sizeof(regs)) -		: "x0", "x1", "x2", "x27", "x28", "x30", "memory"); - - out: -	return ret; -} -EXPORT_SYMBOL(kernel_execve); -  asmlinkage long sys_mmap(unsigned long addr, unsigned long len,  			 unsigned long prot, unsigned long flags,  			 unsigned long fd, off_t off) @@ -118,8 +39,6 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,  /*   * Wrappers to pass the pt_regs argument.   */ -#define sys_execve		sys_execve_wrapper -#define sys_clone		sys_clone_wrapper  #define sys_rt_sigreturn	sys_rt_sigreturn_wrapper  #define sys_sigaltstack		sys_sigaltstack_wrapper diff --git a/arch/arm64/kernel/sys32.S b/arch/arm64/kernel/sys32.S index 54c4aec47a0..7ef59e9245e 100644 --- a/arch/arm64/kernel/sys32.S +++ b/arch/arm64/kernel/sys32.S @@ -26,25 +26,6 @@  /*   * System call wrappers for the AArch32 compatibility layer.   */ -compat_sys_fork_wrapper: -	mov	x0, sp -	b	compat_sys_fork -ENDPROC(compat_sys_fork_wrapper) - -compat_sys_vfork_wrapper: -	mov	x0, sp -	b	compat_sys_vfork -ENDPROC(compat_sys_vfork_wrapper) - -compat_sys_execve_wrapper: -	mov	x3, sp -	b	compat_sys_execve -ENDPROC(compat_sys_execve_wrapper) - -compat_sys_clone_wrapper: -	mov	x5, sp -	b	compat_sys_clone -ENDPROC(compat_sys_clone_wrapper)  compat_sys_sigreturn_wrapper:  	mov	x0, sp diff --git a/arch/arm64/kernel/sys_compat.c b/arch/arm64/kernel/sys_compat.c index 906e3bd270b..f7b05edf8ce 100644 --- a/arch/arm64/kernel/sys_compat.c +++ b/arch/arm64/kernel/sys_compat.c @@ -28,45 +28,6 @@  #include <asm/cacheflush.h>  #include <asm/unistd32.h> -asmlinkage int compat_sys_fork(struct pt_regs *regs) -{ -	return do_fork(SIGCHLD, regs->compat_sp, regs, 0, NULL, NULL); -} - -asmlinkage int compat_sys_clone(unsigned long clone_flags, unsigned long newsp, -			  int __user *parent_tidptr, int tls_val, -			  int __user *child_tidptr, struct pt_regs *regs) -{ -	if (!newsp) -		newsp = regs->compat_sp; - -	return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr); -} - -asmlinkage int compat_sys_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->compat_sp, -		       regs, 0, NULL, NULL); -} - -asmlinkage int compat_sys_execve(const char __user *filenamei, -				 compat_uptr_t argv, compat_uptr_t envp, -				 struct pt_regs *regs) -{ -	int error; -	struct filename *filename; - -	filename = getname(filenamei); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = compat_do_execve(filename->name, compat_ptr(argv), -					compat_ptr(envp), regs); -	putname(filename); -out: -	return error; -} -  asmlinkage int compat_sys_sched_rr_get_interval(compat_pid_t pid,  						struct compat_timespec __user *interval)  { diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index ba457943a16..c958cb84d75 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -239,7 +239,7 @@ void update_vsyscall(struct timekeeper *tk)  	if (!use_syscall) {  		vdso_data->cs_cycle_last	= tk->clock->cycle_last;  		vdso_data->xtime_clock_sec	= tk->xtime_sec; -		vdso_data->xtime_clock_nsec	= tk->xtime_nsec >> tk->shift; +		vdso_data->xtime_clock_nsec	= tk->xtime_nsec;  		vdso_data->cs_mult		= tk->mult;  		vdso_data->cs_shift		= tk->shift;  		vdso_data->wtm_clock_sec	= tk->wall_to_monotonic.tv_sec; diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S index dcb8c203a3b..8bf658d974f 100644 --- a/arch/arm64/kernel/vdso/gettimeofday.S +++ b/arch/arm64/kernel/vdso/gettimeofday.S @@ -62,18 +62,19 @@ ENTRY(__kernel_gettimeofday)  	/* If tv is NULL, skip to the timezone code. */  	cbz	x0, 2f  	bl	__do_get_tspec -	seqcnt_check w13, 1b +	seqcnt_check w9, 1b  	/* Convert ns to us. */ -	mov	x11, #1000 -	udiv	x10, x10, x11 -	stp	x9, x10, [x0, #TVAL_TV_SEC] +	mov	x13, #1000 +	lsl	x13, x13, x12 +	udiv	x11, x11, x13 +	stp	x10, x11, [x0, #TVAL_TV_SEC]  2:  	/* If tz is NULL, return 0. */  	cbz	x1, 3f  	ldp	w4, w5, [vdso_data, #VDSO_TZ_MINWEST] -	seqcnt_read w13 -	seqcnt_check w13, 1b +	seqcnt_read w9 +	seqcnt_check w9, 1b  	stp	w4, w5, [x1, #TZ_MINWEST]  3:  	mov	x0, xzr @@ -102,17 +103,17 @@ ENTRY(__kernel_clock_gettime)  	cbnz	use_syscall, 7f  	bl	__do_get_tspec -	seqcnt_check w13, 1b +	seqcnt_check w9, 1b  	cmp	w0, #CLOCK_MONOTONIC  	b.ne	6f  	/* Get wtm timespec. */ -	ldp	x14, x15, [vdso_data, #VDSO_WTM_CLK_SEC] +	ldp	x13, x14, [vdso_data, #VDSO_WTM_CLK_SEC]  	/* Check the sequence counter. */ -	seqcnt_read w13 -	seqcnt_check w13, 1b +	seqcnt_read w9 +	seqcnt_check w9, 1b  	b	4f  2:  	cmp	w0, #CLOCK_REALTIME_COARSE @@ -122,37 +123,40 @@ ENTRY(__kernel_clock_gettime)  	/* Get coarse timespec. */  	adr	vdso_data, _vdso_data  3:	seqcnt_acquire -	ldp	x9, x10, [vdso_data, #VDSO_XTIME_CRS_SEC] - -	cmp	w0, #CLOCK_MONOTONIC_COARSE -	b.ne	6f +	ldp	x10, x11, [vdso_data, #VDSO_XTIME_CRS_SEC]  	/* Get wtm timespec. */ -	ldp	x14, x15, [vdso_data, #VDSO_WTM_CLK_SEC] +	ldp	x13, x14, [vdso_data, #VDSO_WTM_CLK_SEC]  	/* Check the sequence counter. */ -	seqcnt_read w13 -	seqcnt_check w13, 3b +	seqcnt_read w9 +	seqcnt_check w9, 3b + +	cmp	w0, #CLOCK_MONOTONIC_COARSE +	b.ne	6f  4:  	/* Add on wtm timespec. */ -	add	x9, x9, x14 -	add	x10, x10, x15 +	add	x10, x10, x13 +	lsl	x14, x14, x12 +	add	x11, x11, x14  	/* Normalise the new timespec. */ -	mov	x14, #NSEC_PER_SEC_LO16 -	movk	x14, #NSEC_PER_SEC_HI16, lsl #16 -	cmp	x10, x14 +	mov	x15, #NSEC_PER_SEC_LO16 +	movk	x15, #NSEC_PER_SEC_HI16, lsl #16 +	lsl	x15, x15, x12 +	cmp	x11, x15  	b.lt	5f -	sub	x10, x10, x14 -	add	x9, x9, #1 +	sub	x11, x11, x15 +	add	x10, x10, #1  5: -	cmp	x10, #0 +	cmp	x11, #0  	b.ge	6f -	add	x10, x10, x14 -	sub	x9, x9, #1 +	add	x11, x11, x15 +	sub	x10, x10, #1  6:	/* Store to the user timespec. */ -	stp	x9, x10, [x1, #TSPEC_TV_SEC] +	lsr	x11, x11, x12 +	stp	x10, x11, [x1, #TSPEC_TV_SEC]  	mov	x0, xzr  	ret	x2  7: @@ -203,39 +207,39 @@ ENDPROC(__kernel_clock_getres)   * Expects vdso_data to be initialised.   * Clobbers the temporary registers (x9 - x15).   * Returns: - *  - (x9, x10) = (ts->tv_sec, ts->tv_nsec) - *  - (x11, x12) = (xtime->tv_sec, xtime->tv_nsec) - *  - w13 = vDSO sequence counter + *  - w9		= vDSO sequence counter + *  - (x10, x11)	= (ts->tv_sec, shifted ts->tv_nsec) + *  - w12		= cs_shift   */  ENTRY(__do_get_tspec)  	.cfi_startproc  	/* Read from the vDSO data page. */  	ldr	x10, [vdso_data, #VDSO_CS_CYCLE_LAST] -	ldp	x11, x12, [vdso_data, #VDSO_XTIME_CLK_SEC] -	ldp	w14, w15, [vdso_data, #VDSO_CS_MULT] -	seqcnt_read w13 +	ldp	x13, x14, [vdso_data, #VDSO_XTIME_CLK_SEC] +	ldp	w11, w12, [vdso_data, #VDSO_CS_MULT] +	seqcnt_read w9 -	/* Read the physical counter. */ +	/* Read the virtual counter. */  	isb -	mrs	x9, cntpct_el0 +	mrs	x15, cntvct_el0  	/* Calculate cycle delta and convert to ns. */ -	sub	x10, x9, x10 +	sub	x10, x15, x10  	/* We can only guarantee 56 bits of precision. */ -	movn	x9, #0xff0, lsl #48 -	and	x10, x9, x10 -	mul	x10, x10, x14 -	lsr	x10, x10, x15 +	movn	x15, #0xff00, lsl #48 +	and	x10, x15, x10 +	mul	x10, x10, x11  	/* Use the kernel time to calculate the new timespec. */ -	add	x10, x12, x10 -	mov	x14, #NSEC_PER_SEC_LO16 -	movk	x14, #NSEC_PER_SEC_HI16, lsl #16 -	udiv	x15, x10, x14 -	add	x9, x15, x11 -	mul	x14, x14, x15 -	sub	x10, x10, x14 +	mov	x11, #NSEC_PER_SEC_LO16 +	movk	x11, #NSEC_PER_SEC_HI16, lsl #16 +	lsl	x11, x11, x12 +	add	x15, x10, x14 +	udiv	x14, x15, x11 +	add	x10, x13, x14 +	mul	x13, x14, x11 +	sub	x11, x15, x13  	ret  	.cfi_endproc diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 1909a69983c..afadae6682e 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -36,6 +36,8 @@  #include <asm/pgtable.h>  #include <asm/tlbflush.h> +static const char *fault_name(unsigned int esr); +  /*   * Dump out the page tables associated with 'addr' in mm 'mm'.   */ @@ -112,8 +114,9 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr,  	struct siginfo si;  	if (show_unhandled_signals) { -		pr_info("%s[%d]: unhandled page fault (%d) at 0x%08lx, code 0x%03x\n", -			tsk->comm, task_pid_nr(tsk), sig, addr, esr); +		pr_info("%s[%d]: unhandled %s (%d) at 0x%08lx, esr 0x%03x\n", +			tsk->comm, task_pid_nr(tsk), fault_name(esr), sig, +			addr, esr);  		show_pte(tsk->mm, addr);  		show_regs(regs);  	} @@ -450,6 +453,12 @@ static struct fault_info {  	{ do_bad,		SIGBUS,  0,		"unknown 63"			},  }; +static const char *fault_name(unsigned int esr) +{ +	const struct fault_info *inf = fault_info + (esr & 63); +	return inf->name; +} +  /*   * Dispatch a data abort to the relevant handler.   */ diff --git a/arch/arm64/mm/flush.c b/arch/arm64/mm/flush.c index c144adb1682..88611c3a421 100644 --- a/arch/arm64/mm/flush.c +++ b/arch/arm64/mm/flush.c @@ -27,10 +27,6 @@  #include "mm.h" -void flush_cache_mm(struct mm_struct *mm) -{ -} -  void flush_cache_range(struct vm_area_struct *vma, unsigned long start,  		       unsigned long end)  { @@ -38,11 +34,6 @@ void flush_cache_range(struct vm_area_struct *vma, unsigned long start,  		__flush_icache_all();  } -void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, -		      unsigned long pfn) -{ -} -  static void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,  				unsigned long uaddr, void *kaddr,  				unsigned long len) diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 4cd28931dba..800aac306a0 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -79,8 +79,8 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max)  #ifdef CONFIG_ZONE_DMA32  	/* 4GB maximum for 32-bit only capable devices */ -	max_dma32 = min(max, MAX_DMA32_PFN); -	zone_size[ZONE_DMA32] = max(min, max_dma32) - min; +	max_dma32 = max(min, min(max, MAX_DMA32_PFN)); +	zone_size[ZONE_DMA32] = max_dma32 - min;  #endif  	zone_size[ZONE_NORMAL] = max - max_dma32; diff --git a/arch/avr32/Kconfig b/arch/avr32/Kconfig index 06e73bf665e..e40c9bd7914 100644 --- a/arch/avr32/Kconfig +++ b/arch/avr32/Kconfig @@ -17,6 +17,8 @@ config AVR32  	select GENERIC_CLOCKEVENTS  	select HAVE_MOD_ARCH_SPECIFIC  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  	help  	  AVR32 is a high-performance 32-bit RISC microprocessor core,  	  designed for cost-sensitive embedded applications, with particular @@ -80,7 +82,6 @@ config PLATFORM_AT32AP  	select ARCH_REQUIRE_GPIOLIB  	select GENERIC_ALLOCATOR  	select HAVE_FB_ATMEL -	select HAVE_NET_MACB  #  # CPU types @@ -193,9 +194,6 @@ source "kernel/Kconfig.preempt"  config QUICKLIST  	def_bool y -config HAVE_ARCH_BOOTMEM -	def_bool n -  config ARCH_HAVE_MEMORY_PRESENT  	def_bool n diff --git a/arch/avr32/configs/atngw100_defconfig b/arch/avr32/configs/atngw100_defconfig index a06bfccc284..f4025db184f 100644 --- a/arch/avr32/configs/atngw100_defconfig +++ b/arch/avr32/configs/atngw100_defconfig @@ -109,7 +109,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/avr32/configs/atngw100_evklcd100_defconfig b/arch/avr32/configs/atngw100_evklcd100_defconfig index d8f1fe80d21..c76a49b9e9d 100644 --- a/arch/avr32/configs/atngw100_evklcd100_defconfig +++ b/arch/avr32/configs/atngw100_evklcd100_defconfig @@ -125,7 +125,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/avr32/configs/atngw100_evklcd101_defconfig b/arch/avr32/configs/atngw100_evklcd101_defconfig index d4c5b19ec95..2d8ab089a64 100644 --- a/arch/avr32/configs/atngw100_evklcd101_defconfig +++ b/arch/avr32/configs/atngw100_evklcd101_defconfig @@ -124,7 +124,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/avr32/configs/atngw100_mrmt_defconfig b/arch/avr32/configs/atngw100_mrmt_defconfig index 77ca4f905d2..b189e0cab04 100644 --- a/arch/avr32/configs/atngw100_mrmt_defconfig +++ b/arch/avr32/configs/atngw100_mrmt_defconfig @@ -99,7 +99,7 @@ CONFIG_SND_ATMEL_AC97C=m  # CONFIG_SND_SPI is not set  CONFIG_USB_GADGET=m  CONFIG_USB_GADGET_DEBUG_FILES=y -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_MMC=y  CONFIG_MMC_ATMELMCI=y diff --git a/arch/avr32/configs/atngw100mkii_defconfig b/arch/avr32/configs/atngw100mkii_defconfig index 6e0dca4d313..2e4de42a53c 100644 --- a/arch/avr32/configs/atngw100mkii_defconfig +++ b/arch/avr32/configs/atngw100mkii_defconfig @@ -111,7 +111,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/avr32/configs/atngw100mkii_evklcd100_defconfig b/arch/avr32/configs/atngw100mkii_evklcd100_defconfig index 7f2a344a5fa..fad3cd22dfd 100644 --- a/arch/avr32/configs/atngw100mkii_evklcd100_defconfig +++ b/arch/avr32/configs/atngw100mkii_evklcd100_defconfig @@ -128,7 +128,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/avr32/configs/atngw100mkii_evklcd101_defconfig b/arch/avr32/configs/atngw100mkii_evklcd101_defconfig index 085eeba88f6..29986230aaa 100644 --- a/arch/avr32/configs/atngw100mkii_evklcd101_defconfig +++ b/arch/avr32/configs/atngw100mkii_evklcd101_defconfig @@ -127,7 +127,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/avr32/configs/atstk1002_defconfig b/arch/avr32/configs/atstk1002_defconfig index d1a887e6405..a582465e1ce 100644 --- a/arch/avr32/configs/atstk1002_defconfig +++ b/arch/avr32/configs/atstk1002_defconfig @@ -126,7 +126,7 @@ CONFIG_USB_GADGET=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/avr32/configs/atstk1003_defconfig b/arch/avr32/configs/atstk1003_defconfig index 956f2819ad4..57a79df2ce5 100644 --- a/arch/avr32/configs/atstk1003_defconfig +++ b/arch/avr32/configs/atstk1003_defconfig @@ -105,7 +105,7 @@ CONFIG_USB_GADGET=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/avr32/configs/atstk1004_defconfig b/arch/avr32/configs/atstk1004_defconfig index 40c69f38c61..1a49bd8c634 100644 --- a/arch/avr32/configs/atstk1004_defconfig +++ b/arch/avr32/configs/atstk1004_defconfig @@ -104,7 +104,7 @@ CONFIG_USB_GADGET=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/avr32/configs/atstk1006_defconfig b/arch/avr32/configs/atstk1006_defconfig index 511eb8af356..206a1b67f76 100644 --- a/arch/avr32/configs/atstk1006_defconfig +++ b/arch/avr32/configs/atstk1006_defconfig @@ -129,7 +129,7 @@ CONFIG_USB_GADGET=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/avr32/configs/favr-32_defconfig b/arch/avr32/configs/favr-32_defconfig index 19973b06170..0421498d666 100644 --- a/arch/avr32/configs/favr-32_defconfig +++ b/arch/avr32/configs/favr-32_defconfig @@ -117,7 +117,7 @@ CONFIG_USB_GADGET=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_CDC_COMPOSITE=m  CONFIG_MMC=y diff --git a/arch/avr32/configs/hammerhead_defconfig b/arch/avr32/configs/hammerhead_defconfig index 6f45681196d..82f24eb251b 100644 --- a/arch/avr32/configs/hammerhead_defconfig +++ b/arch/avr32/configs/hammerhead_defconfig @@ -127,7 +127,7 @@ CONFIG_USB_GADGET=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_MMC=m  CONFIG_MMC_ATMELMCI=m diff --git a/arch/avr32/include/asm/Kbuild b/arch/avr32/include/asm/Kbuild index 4807ded352c..4dd4f78d3dc 100644 --- a/arch/avr32/include/asm/Kbuild +++ b/arch/avr32/include/asm/Kbuild @@ -1,3 +1,4 @@  generic-y	+= clkdev.h  generic-y	+= exec.h +generic-y	+= trace_clock.h diff --git a/arch/avr32/include/asm/mach/serial_at91.h b/arch/avr32/include/asm/mach/serial_at91.h deleted file mode 100644 index 55b317a8906..00000000000 --- a/arch/avr32/include/asm/mach/serial_at91.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - *  linux/include/asm-arm/mach/serial_at91.h - * - *  Based on serial_sa1100.h  by Nicolas Pitre - * - *  Copyright (C) 2002 ATMEL Rousset - * - *  Low level machine dependent UART functions. - */ - -struct uart_port; - -/* - * This is a temporary structure for registering these - * functions; it is intended to be discarded after boot. - */ -struct atmel_port_fns { -	void	(*set_mctrl)(struct uart_port *, u_int); -	u_int	(*get_mctrl)(struct uart_port *); -	void	(*enable_ms)(struct uart_port *); -	void	(*pm)(struct uart_port *, u_int, u_int); -	int	(*set_wake)(struct uart_port *, u_int); -	int	(*open)(struct uart_port *); -	void	(*close)(struct uart_port *); -}; - -#if defined(CONFIG_SERIAL_ATMEL) -void atmel_register_uart_fns(struct atmel_port_fns *fns); -#else -#define atmel_register_uart_fns(fns) do { } while (0) -#endif - - diff --git a/arch/avr32/include/asm/processor.h b/arch/avr32/include/asm/processor.h index 87d8baccc60..48d71c5c898 100644 --- a/arch/avr32/include/asm/processor.h +++ b/arch/avr32/include/asm/processor.h @@ -142,9 +142,6 @@ struct task_struct;  /* Free all resources held by a thread */  extern void release_thread(struct task_struct *); -/* Create a kernel thread without removing it from tasklists */ -extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -  /* Return saved PC of a blocked thread */  #define thread_saved_pc(tsk)    ((tsk)->thread.cpu_context.pc) diff --git a/arch/avr32/include/asm/signal.h b/arch/avr32/include/asm/signal.h index 4d502fd6bad..9326d182e9e 100644 --- a/arch/avr32/include/asm/signal.h +++ b/arch/avr32/include/asm/signal.h @@ -37,6 +37,4 @@ struct k_sigaction {  #include <asm/sigcontext.h>  #undef __HAVE_ARCH_SIG_BITOPS -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -  #endif diff --git a/arch/avr32/include/asm/unistd.h b/arch/avr32/include/asm/unistd.h index 157b4bd3d5e..f05a9804e8e 100644 --- a/arch/avr32/include/asm/unistd.h +++ b/arch/avr32/include/asm/unistd.h @@ -39,6 +39,10 @@  #define __ARCH_WANT_SYS_GETPGRP  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/avr32/include/uapi/asm/socket.h b/arch/avr32/include/uapi/asm/socket.h index a473f8c6a9a..486df68abee 100644 --- a/arch/avr32/include/uapi/asm/socket.h +++ b/arch/avr32/include/uapi/asm/socket.h @@ -40,6 +40,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER        26  #define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		28  #define SO_TIMESTAMP		29 diff --git a/arch/avr32/kernel/Makefile b/arch/avr32/kernel/Makefile index 9e2c465ef3a..119a2e41def 100644 --- a/arch/avr32/kernel/Makefile +++ b/arch/avr32/kernel/Makefile @@ -7,7 +7,7 @@ extra-y				:= head.o vmlinux.lds  obj-$(CONFIG_SUBARCH_AVR32B)	+= entry-avr32b.o  obj-y				+= syscall_table.o syscall-stubs.o irq.o  obj-y				+= setup.o traps.o ocd.o ptrace.o -obj-y				+= signal.o sys_avr32.o process.o time.o +obj-y				+= signal.o process.o time.o  obj-y				+= switch_to.o cpu.o  obj-$(CONFIG_MODULES)		+= module.o avr32_ksyms.o  obj-$(CONFIG_KPROBES)		+= kprobes.o diff --git a/arch/avr32/kernel/entry-avr32b.S b/arch/avr32/kernel/entry-avr32b.S index df288418131..9899d3cc6f0 100644 --- a/arch/avr32/kernel/entry-avr32b.S +++ b/arch/avr32/kernel/entry-avr32b.S @@ -251,13 +251,15 @@ syscall_badsys:  	.global ret_from_fork  ret_from_fork:  	call   schedule_tail +	mov	r12, 0 +	rjmp	syscall_return -	/* check for syscall tracing */ -	get_thread_info r0 -	ld.w	r1, r0[TI_flags] -	andl	r1, _TIF_ALLWORK_MASK, COH -	brne	syscall_exit_work -	rjmp    syscall_exit_cont +	.global ret_from_kernel_thread +ret_from_kernel_thread: +	call   schedule_tail +	mov	r12, r0 +	mov	lr, r2	/* syscall_return */ +	mov	pc, r1  syscall_trace_enter:  	pushm	r8-r12 diff --git a/arch/avr32/kernel/process.c b/arch/avr32/kernel/process.c index 1bb0a8abd79..fd78f58ea79 100644 --- a/arch/avr32/kernel/process.c +++ b/arch/avr32/kernel/process.c @@ -69,44 +69,6 @@ void machine_restart(char *cmd)  }  /* - * PC is actually discarded when returning from a system call -- the - * return address must be stored in LR. This function will make sure - * LR points to do_exit before starting the thread. - * - * Also, when returning from fork(), r12 is 0, so we must copy the - * argument as well. - * - *  r0 : The argument to the main thread function - *  r1 : The address of do_exit - *  r2 : The address of the main thread function - */ -asmlinkage extern void kernel_thread_helper(void); -__asm__("	.type	kernel_thread_helper, @function\n" -	"kernel_thread_helper:\n" -	"	mov	r12, r0\n" -	"	mov	lr, r2\n" -	"	mov	pc, r1\n" -	"	.size	kernel_thread_helper, . - kernel_thread_helper"); - -int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); - -	regs.r0 = (unsigned long)arg; -	regs.r1 = (unsigned long)fn; -	regs.r2 = (unsigned long)do_exit; -	regs.lr = (unsigned long)kernel_thread_helper; -	regs.pc = (unsigned long)kernel_thread_helper; -	regs.sr = MODE_SUPERVISOR; - -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, -		       0, ®s, 0, NULL, NULL); -} -EXPORT_SYMBOL(kernel_thread); - -/*   * Free current thread data structures etc   */  void exit_thread(void) @@ -332,26 +294,32 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)  }  asmlinkage void ret_from_fork(void); +asmlinkage void ret_from_kernel_thread(void); +asmlinkage void syscall_return(void);  int copy_thread(unsigned long clone_flags, unsigned long usp, -		unsigned long unused, -		struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, +		struct task_struct *p)  { -	struct pt_regs *childregs; - -	childregs = ((struct pt_regs *)(THREAD_SIZE + (unsigned long)task_stack_page(p))) - 1; -	*childregs = *regs; +	struct pt_regs *childregs = task_pt_regs(p); -	if (user_mode(regs)) -		childregs->sp = usp; -	else -		childregs->sp = (unsigned long)task_stack_page(p) + THREAD_SIZE; - -	childregs->r12 = 0; /* Set return value for child */ +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(childregs, 0, sizeof(struct pt_regs)); +		p->thread.cpu_context.r0 = arg; +		p->thread.cpu_context.r1 = usp; /* fn */ +		p->thread.cpu_context.r2 = syscall_return; +		p->thread.cpu_context.pc = (unsigned long)ret_from_kernel_thread; +		childregs->sr = MODE_SUPERVISOR; +	} else { +		*childregs = *current_pt_regs(); +		if (usp) +			childregs->sp = usp; +		childregs->r12 = 0; /* Set return value for child */ +		p->thread.cpu_context.pc = (unsigned long)ret_from_fork; +	}  	p->thread.cpu_context.sr = MODE_SUPERVISOR | SR_GM;  	p->thread.cpu_context.ksp = (unsigned long)childregs; -	p->thread.cpu_context.pc = (unsigned long)ret_from_fork;  	clear_tsk_thread_flag(p, TIF_DEBUG);  	if ((clone_flags & CLONE_PTRACE) && test_thread_flag(TIF_DEBUG)) @@ -360,49 +328,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	return 0;  } -/* r12-r8 are dummy parameters to force the compiler to use the stack */ -asmlinkage int sys_fork(struct pt_regs *regs) -{ -	return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL); -} - -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, -		void __user *parent_tidptr, void __user *child_tidptr, -		struct pt_regs *regs) -{ -	if (!newsp) -		newsp = regs->sp; -	return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, -			child_tidptr); -} - -asmlinkage int sys_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->sp, regs, -		       0, NULL, NULL); -} - -asmlinkage int sys_execve(const char __user *ufilename, -			  const char __user *const __user *uargv, -			  const char __user *const __user *uenvp, -			  struct pt_regs *regs) -{ -	int error; -	struct filename *filename; - -	filename = getname(ufilename); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; - -	error = do_execve(filename->name, uargv, uenvp, regs); -	putname(filename); - -out: -	return error; -} - -  /*   * This function is supposed to answer the question "who called   * schedule()?" diff --git a/arch/avr32/kernel/sys_avr32.c b/arch/avr32/kernel/sys_avr32.c deleted file mode 100644 index 62635a09ae3..00000000000 --- a/arch/avr32/kernel/sys_avr32.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2004-2006 Atmel Corporation - * - * 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/unistd.h> - -int kernel_execve(const char *file, -		  const char *const *argv, -		  const char *const *envp) -{ -	register long scno asm("r8") = __NR_execve; -	register long sc1 asm("r12") = (long)file; -	register long sc2 asm("r11") = (long)argv; -	register long sc3 asm("r10") = (long)envp; - -	asm volatile("scall" -		     : "=r"(sc1) -		     : "r"(scno), "0"(sc1), "r"(sc2), "r"(sc3) -		     : "cc", "memory"); -	return sc1; -} diff --git a/arch/avr32/kernel/syscall-stubs.S b/arch/avr32/kernel/syscall-stubs.S index 0447a3e2ba6..275aab9731f 100644 --- a/arch/avr32/kernel/syscall-stubs.S +++ b/arch/avr32/kernel/syscall-stubs.S @@ -32,30 +32,6 @@ __sys_rt_sigreturn:  	mov	r12, sp  	rjmp	sys_rt_sigreturn -	.global	__sys_fork -	.type	__sys_fork,@function -__sys_fork: -	mov	r12, sp -	rjmp	sys_fork - -	.global	__sys_clone -	.type	__sys_clone,@function -__sys_clone: -	mov	r8, sp -	rjmp	sys_clone - -	.global	__sys_vfork -	.type	__sys_vfork,@function -__sys_vfork: -	mov	r12, sp -	rjmp	sys_vfork - -	.global	__sys_execve -	.type	__sys_execve,@function -__sys_execve: -	mov	r9, sp -	rjmp	sys_execve -  	.global	__sys_mmap2  	.type	__sys_mmap2,@function  __sys_mmap2: diff --git a/arch/avr32/kernel/syscall_table.S b/arch/avr32/kernel/syscall_table.S index 6eba53530d1..f27bb878da6 100644 --- a/arch/avr32/kernel/syscall_table.S +++ b/arch/avr32/kernel/syscall_table.S @@ -15,7 +15,7 @@  sys_call_table:  	.long	sys_restart_syscall  	.long	sys_exit -	.long	__sys_fork +	.long	sys_fork  	.long	sys_read  	.long	sys_write  	.long	sys_open		/* 5 */ @@ -24,7 +24,7 @@ sys_call_table:  	.long	sys_creat  	.long	sys_link  	.long	sys_unlink		/* 10 */ -	.long	__sys_execve +	.long	sys_execve  	.long	sys_chdir  	.long	sys_time  	.long	sys_mknod @@ -57,7 +57,7 @@ sys_call_table:  	.long	sys_dup  	.long	sys_pipe  	.long	sys_times -	.long	__sys_clone +	.long	sys_clone  	.long	sys_brk			/* 45 */  	.long	sys_setgid  	.long	sys_getgid @@ -127,7 +127,7 @@ sys_call_table:  	.long	sys_newuname  	.long	sys_adjtimex  	.long	sys_mprotect -	.long	__sys_vfork +	.long	sys_vfork  	.long	sys_init_module		/* 115 */  	.long	sys_delete_module  	.long	sys_quotactl diff --git a/arch/avr32/mach-at32ap/include/mach/board.h b/arch/avr32/mach-at32ap/include/mach/board.h index 70742ec997f..d485b039135 100644 --- a/arch/avr32/mach-at32ap/include/mach/board.h +++ b/arch/avr32/mach-at32ap/include/mach/board.h @@ -26,7 +26,6 @@ static inline void __deprecated at32_add_system_devices(void)  } -#define ATMEL_MAX_UART	4  extern struct platform_device *atmel_default_console_device;  /* Flags for selecting USART extra pins */ @@ -34,13 +33,6 @@ extern struct platform_device *atmel_default_console_device;  #define	ATMEL_USART_CTS		0x02  #define	ATMEL_USART_CLK		0x04 -struct atmel_uart_data { -	int		num;		/* port num */ -	short		use_dma_tx;	/* use transmit DMA? */ -	short		use_dma_rx;	/* use receive DMA? */ -	void __iomem	*regs;		/* virtual base address, if any */ -	struct serial_rs485	rs485;		/* rs485 settings */ -};  void at32_map_usart(unsigned int hw_id, unsigned int line, int flags);  struct platform_device *at32_add_device_usart(unsigned int id); diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index b6f3ad5441c..ab9ff4075f4 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig @@ -45,6 +45,8 @@ config BLACKFIN  	select ARCH_USES_GETTIMEOFFSET if !GENERIC_CLOCKEVENTS  	select HAVE_MOD_ARCH_SPECIFIC  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  config GENERIC_CSUM  	def_bool y diff --git a/arch/blackfin/configs/CM-BF527_defconfig b/arch/blackfin/configs/CM-BF527_defconfig index c280a50e794..f59c80ee78e 100644 --- a/arch/blackfin/configs/CM-BF527_defconfig +++ b/arch/blackfin/configs/CM-BF527_defconfig @@ -106,7 +106,7 @@ CONFIG_MUSB_PIO_ONLY=y  CONFIG_USB_STORAGE=m  CONFIG_USB_GADGET=m  CONFIG_USB_ETH=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_G_PRINTER=m  CONFIG_RTC_CLASS=y diff --git a/arch/blackfin/configs/CM-BF548_defconfig b/arch/blackfin/configs/CM-BF548_defconfig index 349922be01f..e961483f187 100644 --- a/arch/blackfin/configs/CM-BF548_defconfig +++ b/arch/blackfin/configs/CM-BF548_defconfig @@ -107,7 +107,7 @@ CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  # CONFIG_USB_ETH_RNDIS is not set  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_G_PRINTER=m  CONFIG_MMC=m diff --git a/arch/blackfin/configs/CM-BF561_defconfig b/arch/blackfin/configs/CM-BF561_defconfig index 0456deaa2d6..24936b91a6e 100644 --- a/arch/blackfin/configs/CM-BF561_defconfig +++ b/arch/blackfin/configs/CM-BF561_defconfig @@ -83,7 +83,7 @@ CONFIG_GPIOLIB=y  CONFIG_GPIO_SYSFS=y  CONFIG_USB_GADGET=m  CONFIG_USB_ETH=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_G_PRINTER=m  CONFIG_MMC=y diff --git a/arch/blackfin/include/asm/Kbuild b/arch/blackfin/include/asm/Kbuild index 5a0625aad6a..27d70759474 100644 --- a/arch/blackfin/include/asm/Kbuild +++ b/arch/blackfin/include/asm/Kbuild @@ -38,6 +38,7 @@ generic-y += statfs.h  generic-y += termbits.h  generic-y += termios.h  generic-y += topology.h +generic-y += trace_clock.h  generic-y += types.h  generic-y += ucontext.h  generic-y += unaligned.h diff --git a/arch/blackfin/include/asm/processor.h b/arch/blackfin/include/asm/processor.h index 4ef7cfe43ce..d0e72e9475a 100644 --- a/arch/blackfin/include/asm/processor.h +++ b/arch/blackfin/include/asm/processor.h @@ -75,8 +75,6 @@ static inline void release_thread(struct task_struct *dead_task)  {  } -extern int kernel_thread(int (*fn) (void *), void *arg, unsigned long flags); -  /*   * Free current thread data structures etc..   */ diff --git a/arch/blackfin/include/asm/unistd.h b/arch/blackfin/include/asm/unistd.h index 5b2a0748d7d..460514a1a4e 100644 --- a/arch/blackfin/include/asm/unistd.h +++ b/arch/blackfin/include/asm/unistd.h @@ -446,6 +446,8 @@  #define __ARCH_WANT_SYS_NICE  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_VFORK  /*   * "Conditional" syscalls diff --git a/arch/blackfin/kernel/entry.S b/arch/blackfin/kernel/entry.S index f33792cc1a0..4071265fc4f 100644 --- a/arch/blackfin/kernel/entry.S +++ b/arch/blackfin/kernel/entry.S @@ -46,53 +46,14 @@ ENTRY(_ret_from_fork)  	SP += -12;  	pseudo_long_call _schedule_tail, p5;  	SP += 12; -	r0 = [sp + PT_IPEND]; -	cc = bittst(r0,1); -	if cc jump .Lin_kernel; +	p1 = [sp++]; +	r0 = [sp++]; +	cc = p1 == 0; +	if cc jump .Lfork; +	sp += -12; +	call (p1); +	sp += 12; +.Lfork:  	RESTORE_CONTEXT  	rti; -.Lin_kernel: -	bitclr(r0,1); -	[sp + PT_IPEND] = r0; -	/* do a 'fake' RTI by jumping to [RETI] -	 * to avoid clearing supervisor mode in child -	 */ -	r0 = [sp + PT_PC]; -	[sp + PT_P0] = r0; - -	RESTORE_ALL_SYS -	jump (p0);  ENDPROC(_ret_from_fork) - -ENTRY(_sys_vfork) -	r0 = sp; -	r0 += 24; -	[--sp] = rets; -	SP += -12; -	pseudo_long_call _bfin_vfork, p2; -	SP += 12; -	rets = [sp++]; -	rts; -ENDPROC(_sys_vfork) - -ENTRY(_sys_clone) -	r0 = sp; -	r0 += 24; -	[--sp] = rets; -	SP += -12; -	pseudo_long_call _bfin_clone, p2; -	SP += 12; -	rets = [sp++]; -	rts; -ENDPROC(_sys_clone) - -ENTRY(_sys_rt_sigreturn) -	r0 = sp; -	r0 += 24; -	[--sp] = rets; -	SP += -12; -	pseudo_long_call _do_rt_sigreturn, p2; -	SP += 12; -	rets = [sp++]; -	rts; -ENDPROC(_sys_rt_sigreturn) diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c index bb1cc721fcf..3e16ad9b0a9 100644 --- a/arch/blackfin/kernel/process.c +++ b/arch/blackfin/kernel/process.c @@ -102,40 +102,6 @@ void cpu_idle(void)  }  /* - * This gets run with P1 containing the - * function to call, and R1 containing - * the "args".  Note P0 is clobbered on the way here. - */ -void kernel_thread_helper(void); -__asm__(".section .text\n" -	".align 4\n" -	"_kernel_thread_helper:\n\t" -	"\tsp += -12;\n\t" -	"\tr0 = r1;\n\t" "\tcall (p1);\n\t" "\tcall _do_exit;\n" ".previous"); - -/* - * Create a kernel thread. - */ -pid_t kernel_thread(int (*fn) (void *), void *arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); - -	regs.r1 = (unsigned long)arg; -	regs.p1 = (unsigned long)fn; -	regs.pc = (unsigned long)kernel_thread_helper; -	regs.orig_p0 = -1; -	/* Set bit 2 to tell ret_from_fork we should be returning to kernel -	   mode.  */ -	regs.ipend = 0x8002; -	__asm__ __volatile__("%0 = syscfg;":"=da"(regs.syscfg):); -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, -		       NULL); -} -EXPORT_SYMBOL(kernel_thread); - -/*   * Do necessary setup to start up a newly executed thread.   *   * pass the data segment into user programs if it exists, @@ -161,70 +127,48 @@ void flush_thread(void)  {  } -asmlinkage int bfin_vfork(struct pt_regs *regs) +asmlinkage int bfin_clone(unsigned long clone_flags, unsigned long newsp)  { -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), regs, 0, NULL, -		       NULL); -} - -asmlinkage int bfin_clone(struct pt_regs *regs) -{ -	unsigned long clone_flags; -	unsigned long newsp; -  #ifdef __ARCH_SYNC_CORE_DCACHE  	if (current->nr_cpus_allowed == num_possible_cpus())  		set_cpus_allowed_ptr(current, cpumask_of(smp_processor_id()));  #endif - -	/* syscall2 puts clone_flags in r0 and usp in r1 */ -	clone_flags = regs->r0; -	newsp = regs->r1; -	if (!newsp) -		newsp = rdusp(); -	else +	if (newsp)  		newsp -= 12; -	return do_fork(clone_flags, newsp, regs, 0, NULL, NULL); +	return do_fork(clone_flags, newsp, 0, NULL, NULL);  }  int  copy_thread(unsigned long clone_flags,  	    unsigned long usp, unsigned long topstk, -	    struct task_struct *p, struct pt_regs *regs) +	    struct task_struct *p)  {  	struct pt_regs *childregs; +	unsigned long *v;  	childregs = (struct pt_regs *) (task_stack_page(p) + THREAD_SIZE) - 1; -	*childregs = *regs; -	childregs->r0 = 0; +	v = ((unsigned long *)childregs) - 2; +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(childregs, 0, sizeof(struct pt_regs)); +		v[0] = usp; +		v[1] = topstk; +		childregs->orig_p0 = -1; +		childregs->ipend = 0x8000; +		__asm__ __volatile__("%0 = syscfg;":"=da"(childregs->syscfg):); +		p->thread.usp = 0; +	} else { +		*childregs = *current_pt_regs(); +		childregs->r0 = 0; +		p->thread.usp = usp ? : rdusp(); +		v[0] = v[1] = 0; +	} -	p->thread.usp = usp; -	p->thread.ksp = (unsigned long)childregs; +	p->thread.ksp = (unsigned long)v;  	p->thread.pc = (unsigned long)ret_from_fork;  	return 0;  } -/* - * sys_execve() executes a new program. - */ -asmlinkage int sys_execve(const char __user *name, -			  const char __user *const __user *argv, -			  const char __user *const __user *envp) -{ -	int error; -	struct filename *filename; -	struct pt_regs *regs = (struct pt_regs *)((&name) + 6); - -	filename = getname(name); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		return error; -	error = do_execve(filename->name, argv, envp, regs); -	putname(filename); -	return error; -} -  unsigned long get_wchan(struct task_struct *p)  {  	unsigned long fp, pc; diff --git a/arch/blackfin/kernel/signal.c b/arch/blackfin/kernel/signal.c index 6ed20a1a4af..84b4be05840 100644 --- a/arch/blackfin/kernel/signal.c +++ b/arch/blackfin/kernel/signal.c @@ -82,9 +82,9 @@ rt_restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *p  	return err;  } -asmlinkage int do_rt_sigreturn(unsigned long __unused) +asmlinkage int sys_rt_sigreturn(void)  { -	struct pt_regs *regs = (struct pt_regs *)__unused; +	struct pt_regs *regs = current_pt_regs();  	unsigned long usp = rdusp();  	struct rt_sigframe *frame = (struct rt_sigframe *)(usp);  	sigset_t set; diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index 1c3d2c5bb0b..86b5a095c5a 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S @@ -530,61 +530,6 @@ ENTRY(_trap) /* Exception: 4th entry into system event table(supervisor mode)*/  	jump .Lsyscall_really_exit;  ENDPROC(_trap) -ENTRY(_kernel_execve) -	link SIZEOF_PTREGS; -	p0 = sp; -	r3 = SIZEOF_PTREGS / 4; -	r4 = 0(x); -.Lclear_regs: -	[p0++] = r4; -	r3 += -1; -	cc = r3 == 0; -	if !cc jump .Lclear_regs (bp); - -	p0 = sp; -	sp += -16; -	[sp + 12] = p0; -	pseudo_long_call _do_execve, p5; -	SP += 16; -	cc = r0 == 0; -	if ! cc jump .Lexecve_failed; -	/* Success.  Copy our temporary pt_regs to the top of the kernel -	 * stack and do a normal exception return. -	 */ -	r1 = sp; -	r0 = (-KERNEL_STACK_SIZE) (x); -	r1 = r1 & r0; -	p2 = r1; -	p3 = [p2]; -	r0 = KERNEL_STACK_SIZE - 4 (z); -	p1 = r0; -	p1 = p1 + p2; - -	p0 = fp; -	r4 = [p0--]; -	r3 = SIZEOF_PTREGS / 4; -.Lcopy_regs: -	r4 = [p0--]; -	[p1--] = r4; -	r3 += -1; -	cc = r3 == 0; -	if ! cc jump .Lcopy_regs (bp); - -	r0 = (KERNEL_STACK_SIZE - SIZEOF_PTREGS) (z); -	p1 = r0; -	p1 = p1 + p2; -	sp = p1; -	r0 = syscfg; -	[SP + PT_SYSCFG] = r0; -	[p3 + (TASK_THREAD + THREAD_KSP)] = sp; - -	RESTORE_CONTEXT; -	rti; -.Lexecve_failed: -	unlink; -	rts; -ENDPROC(_kernel_execve) -  ENTRY(_system_call)  	/* Store IPEND */  	p2.l = lo(IPEND); @@ -1486,7 +1431,7 @@ ENTRY(_sys_call_table)  	.long _sys_ni_syscall	/* old sys_ipc */  	.long _sys_fsync  	.long _sys_ni_syscall	/* old sys_sigreturn */ -	.long _sys_clone		/* 120 */ +	.long _bfin_clone		/* 120 */  	.long _sys_setdomainname  	.long _sys_newuname  	.long _sys_ni_syscall	/* old sys_modify_ldt */ diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig index aee1b569ee6..66eab3703c7 100644 --- a/arch/c6x/Kconfig +++ b/arch/c6x/Kconfig @@ -18,6 +18,7 @@ config C6X  	select OF_EARLY_FLATTREE  	select GENERIC_CLOCKEVENTS  	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  	select MODULES_USE_ELF_RELA  config MMU diff --git a/arch/c6x/Makefile b/arch/c6x/Makefile index a9eb9597e03..e72eb341723 100644 --- a/arch/c6x/Makefile +++ b/arch/c6x/Makefile @@ -41,7 +41,7 @@ DTB:=$(subst dtbImage.,,$(filter dtbImage.%, $(MAKECMDGOALS)))  export DTB  ifneq ($(DTB),) -core-y	+= $(boot)/ +core-y	+= $(boot)/dts/  endif  # With make 3.82 we cannot mix normal and wildcard targets diff --git a/arch/c6x/boot/Makefile b/arch/c6x/boot/Makefile index 6891257d514..8734abee548 100644 --- a/arch/c6x/boot/Makefile +++ b/arch/c6x/boot/Makefile @@ -6,25 +6,5 @@ OBJCOPYFLAGS_vmlinux.bin := -O binary  $(obj)/vmlinux.bin: vmlinux FORCE  	$(call if_changed,objcopy) -DTC_FLAGS ?= -p 1024 - -ifneq ($(DTB),) -obj-y += linked_dtb.o -endif - -$(obj)/%.dtb: $(src)/dts/%.dts FORCE -	$(call if_changed_dep,dtc) - -quiet_cmd_cp = CP      $< $@$2 -	cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) - -# Generate builtin.dtb from $(DTB).dtb -$(obj)/builtin.dtb: $(obj)/$(DTB).dtb -	$(call if_changed,cp) - -$(obj)/linked_dtb.o: $(obj)/builtin.dtb -  $(obj)/dtbImage.%: vmlinux  	$(call if_changed,objcopy) - -clean-files := $(obj)/*.dtb diff --git a/arch/c6x/boot/dts/Makefile b/arch/c6x/boot/dts/Makefile new file mode 100644 index 00000000000..c7528b02d06 --- /dev/null +++ b/arch/c6x/boot/dts/Makefile @@ -0,0 +1,20 @@ +# +# Makefile for device trees +# + +DTC_FLAGS ?= -p 1024 + +ifneq ($(DTB),) +obj-y += linked_dtb.o +endif + +quiet_cmd_cp = CP      $< $@$2 +	cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) + +# Generate builtin.dtb from $(DTB).dtb +$(obj)/builtin.dtb: $(obj)/$(DTB).dtb +	$(call if_changed,cp) + +$(obj)/linked_dtb.o: $(obj)/builtin.dtb + +clean-files := *.dtb diff --git a/arch/c6x/boot/dts/linked_dtb.S b/arch/c6x/boot/dts/linked_dtb.S new file mode 100644 index 00000000000..cf347f1d16c --- /dev/null +++ b/arch/c6x/boot/dts/linked_dtb.S @@ -0,0 +1,2 @@ +.section __fdt_blob,"a" +.incbin "arch/c6x/boot/dts/builtin.dtb" diff --git a/arch/c6x/boot/linked_dtb.S b/arch/c6x/boot/linked_dtb.S deleted file mode 100644 index 57a4454eaec..00000000000 --- a/arch/c6x/boot/linked_dtb.S +++ /dev/null @@ -1,2 +0,0 @@ -.section __fdt_blob,"a" -.incbin "arch/c6x/boot/builtin.dtb" diff --git a/arch/c6x/include/asm/Kbuild b/arch/c6x/include/asm/Kbuild index 112a496d835..eae7b5963e8 100644 --- a/arch/c6x/include/asm/Kbuild +++ b/arch/c6x/include/asm/Kbuild @@ -49,6 +49,7 @@ generic-y += termbits.h  generic-y += termios.h  generic-y += tlbflush.h  generic-y += topology.h +generic-y += trace_clock.h  generic-y += types.h  generic-y += ucontext.h  generic-y += user.h diff --git a/arch/c6x/include/asm/setup.h b/arch/c6x/include/asm/setup.h new file mode 100644 index 00000000000..ecead15872a --- /dev/null +++ b/arch/c6x/include/asm/setup.h @@ -0,0 +1,33 @@ +/* + *  Port on Texas Instruments TMS320C6x architecture + * + *  Copyright (C) 2004, 2009, 2010 2011 Texas Instruments Incorporated + *  Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.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 _ASM_C6X_SETUP_H +#define _ASM_C6X_SETUP_H + +#include <uapi/asm/setup.h> + +#ifndef __ASSEMBLY__ +extern char c6x_command_line[COMMAND_LINE_SIZE]; + +extern int c6x_add_memory(phys_addr_t start, unsigned long size); + +extern unsigned long ram_start; +extern unsigned long ram_end; + +extern int c6x_num_cores; +extern unsigned int c6x_silicon_rev; +extern unsigned int c6x_devstat; +extern unsigned char c6x_fuse_mac[6]; + +extern void machine_init(unsigned long dt_ptr); +extern void time_init(void); + +#endif /* !__ASSEMBLY__ */ +#endif /* _ASM_C6X_SETUP_H */ diff --git a/arch/c6x/include/asm/syscalls.h b/arch/c6x/include/asm/syscalls.h index e7b8991dc07..df3d05feb15 100644 --- a/arch/c6x/include/asm/syscalls.h +++ b/arch/c6x/include/asm/syscalls.h @@ -41,10 +41,6 @@ extern long sys_fallocate_c6x(int fd, int mode,  			      u32 len_lo, u32 len_hi);  extern int sys_cache_sync(unsigned long s, unsigned long e); -struct pt_regs; - -extern asmlinkage long sys_c6x_clone(struct pt_regs *regs); -  #include <asm-generic/syscalls.h>  #endif /* __ASM_C6X_SYSCALLS_H */ diff --git a/arch/c6x/include/uapi/asm/Kbuild b/arch/c6x/include/uapi/asm/Kbuild index c312b424c43..e9bc2b2b814 100644 --- a/arch/c6x/include/uapi/asm/Kbuild +++ b/arch/c6x/include/uapi/asm/Kbuild @@ -1,6 +1,8 @@  # UAPI Header export list  include include/uapi/asm-generic/Kbuild.asm +generic-y += kvm_para.h +  header-y += byteorder.h  header-y += kvm_para.h  header-y += ptrace.h diff --git a/arch/c6x/include/uapi/asm/kvm_para.h b/arch/c6x/include/uapi/asm/kvm_para.h deleted file mode 100644 index 14fab8f0b95..00000000000 --- a/arch/c6x/include/uapi/asm/kvm_para.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/kvm_para.h> diff --git a/arch/c6x/include/uapi/asm/setup.h b/arch/c6x/include/uapi/asm/setup.h index a01e31896fa..ad9ac97a8da 100644 --- a/arch/c6x/include/uapi/asm/setup.h +++ b/arch/c6x/include/uapi/asm/setup.h @@ -1,33 +1,6 @@ -/* - *  Port on Texas Instruments TMS320C6x architecture - * - *  Copyright (C) 2004, 2009, 2010 2011 Texas Instruments Incorporated - *  Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.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 _ASM_C6X_SETUP_H -#define _ASM_C6X_SETUP_H +#ifndef _UAPI_ASM_C6X_SETUP_H +#define _UAPI_ASM_C6X_SETUP_H  #define COMMAND_LINE_SIZE   1024 -#ifndef __ASSEMBLY__ -extern char c6x_command_line[COMMAND_LINE_SIZE]; - -extern int c6x_add_memory(phys_addr_t start, unsigned long size); - -extern unsigned long ram_start; -extern unsigned long ram_end; - -extern int c6x_num_cores; -extern unsigned int c6x_silicon_rev; -extern unsigned int c6x_devstat; -extern unsigned char c6x_fuse_mac[6]; - -extern void machine_init(unsigned long dt_ptr); -extern void time_init(void); - -#endif /* !__ASSEMBLY__ */ -#endif /* _ASM_C6X_SETUP_H */ +#endif /* _UAPI_ASM_C6X_SETUP_H */ diff --git a/arch/c6x/include/uapi/asm/unistd.h b/arch/c6x/include/uapi/asm/unistd.h index 4ff747d12da..f3987a8703d 100644 --- a/arch/c6x/include/uapi/asm/unistd.h +++ b/arch/c6x/include/uapi/asm/unistd.h @@ -14,8 +14,8 @@   *   more details.   */ -#define __ARCH_WANT_KERNEL_EXECVE  #define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_CLONE  /* Use the standard ABI for syscalls. */  #include <asm-generic/unistd.h> diff --git a/arch/c6x/kernel/entry.S b/arch/c6x/kernel/entry.S index 5449c36018f..5239057de4c 100644 --- a/arch/c6x/kernel/entry.S +++ b/arch/c6x/kernel/entry.S @@ -277,6 +277,8 @@ work_rescheduled:   [A1]	BNOP	.S1	work_resched,5  work_notifysig: +	;; enable interrupts for do_notify_resume() +	UNMASK_INT B2  	B	.S2	do_notify_resume  	LDW	.D2T1	*+SP(REGS__END+8),A6 ; syscall flag  	ADDKPC	.S2	resume_userspace,B3,1 @@ -413,22 +415,11 @@ ENTRY(ret_from_kernel_thread)  0:  	B	.S2	B10		   /* call fn */  	LDW	.D2T1	*+SP(REGS_A1+8),A4 /* get arg */ -	MVKL	.S2	sys_exit,B11 -	MVKH	.S2	sys_exit,B11 -	ADDKPC	.S2	0f,B3,1 -0: -	BNOP	.S2	B11,5	/* jump to sys_exit */ +	ADDKPC	.S2	ret_from_fork_2,B3,3  ENDPROC(ret_from_kernel_thread) -ENTRY(ret_from_kernel_execve) -	GET_THREAD_INFO A12 -	BNOP	.S2	syscall_exit,4 -	ADD	.D2X	A4,-8,SP -ENDPROC(ret_from_kernel_execve) -  	;; -	;; These are the interrupt handlers, responsible for calling __do_IRQ() -	;; int6 is used for syscalls (see _system_call entry) +	;; These are the interrupt handlers, responsible for calling c6x_do_IRQ()  	;;  	.macro SAVE_ALL_INT  	SAVE_ALL IRP,ITSR @@ -623,18 +614,6 @@ ENDPROC(sys_sigaltstack)  	;; Special system calls  	;; return address is in B3  	;; -ENTRY(sys_clone) -	ADD	.D1X	SP,8,A4 -#ifdef CONFIG_C6X_BIG_KERNEL - ||	MVKL	.S1	sys_c6x_clone,A0 -	MVKH	.S1	sys_c6x_clone,A0 -	BNOP	.S2X	A0,5 -#else - ||	B	.S2	sys_c6x_clone -	NOP	5 -#endif -ENDPROC(sys_clone) -  ENTRY(sys_rt_sigreturn)  	ADD	.D1X	SP,8,A4  #ifdef CONFIG_C6X_BIG_KERNEL diff --git a/arch/c6x/kernel/process.c b/arch/c6x/kernel/process.c index 2770d9a9a84..6434df476f7 100644 --- a/arch/c6x/kernel/process.c +++ b/arch/c6x/kernel/process.c @@ -112,22 +112,6 @@ void exit_thread(void)  {  } -SYSCALL_DEFINE1(c6x_clone, struct pt_regs *, regs) -{ -	unsigned long clone_flags; -	unsigned long newsp; - -	/* syscall puts clone_flags in A4 and usp in B4 */ -	clone_flags = regs->orig_a4; -	if (regs->b4) -		newsp = regs->b4; -	else -		newsp = regs->sp; - -	return do_fork(clone_flags, newsp, regs, 0, (int __user *)regs->a6, -		       (int __user *)regs->b6); -} -  /*   * Do necessary setup to start up a newly executed thread.   */ @@ -155,13 +139,13 @@ void start_thread(struct pt_regs *regs, unsigned int pc, unsigned long usp)   */  int copy_thread(unsigned long clone_flags, unsigned long usp,  		unsigned long ustk_size, -		struct task_struct *p, struct pt_regs *regs) +		struct task_struct *p)  {  	struct pt_regs *childregs;  	childregs = task_pt_regs(p); -	if (!regs) { +	if (unlikely(p->flags & PF_KTHREAD)) {  		/* case of  __kernel_thread: we return to supervisor space */  		memset(childregs, 0, sizeof(struct pt_regs));  		childregs->sp = (unsigned long)(childregs + 1); @@ -170,8 +154,9 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  		childregs->a1 = ustk_size;	/* argument */  	} else {  		/* Otherwise use the given stack */ -		*childregs = *regs; -		childregs->sp = usp; +		*childregs = *current_pt_regs(); +		if (usp) +			childregs->sp = usp;  		p->thread.pc = (unsigned long) ret_from_fork;  	} diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index a67244473a3..0cac6a49f23 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig @@ -49,6 +49,9 @@ config CRIS  	select GENERIC_SMP_IDLE_THREAD if ETRAX_ARCH_V32  	select GENERIC_CMOS_UPDATE  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE +	select CLONE_BACKWARDS2  config HZ  	int diff --git a/arch/cris/arch-v10/kernel/entry.S b/arch/cris/arch-v10/kernel/entry.S index 592fbe9dfb6..897bba67bf7 100644 --- a/arch/cris/arch-v10/kernel/entry.S +++ b/arch/cris/arch-v10/kernel/entry.S @@ -35,6 +35,7 @@  	.globl system_call  	.globl ret_from_intr  	.globl ret_from_fork +	.globl ret_from_kernel_thread  	.globl resume  	.globl multiple_interrupt  	.globl hwbreakpoint @@ -81,7 +82,14 @@ ret_from_fork:  	jsr schedule_tail  	ba  ret_from_sys_call  	nop -		 + +ret_from_kernel_thread: +	jsr schedule_tail +	move.d	$r2, $r10	; argument is here +	jsr	$r1		; call the payload +	moveq	0, $r9		; no syscall restarts, TYVM... +	ba  ret_from_sys_call +  ret_from_intr:  	;; check for resched if preemptive kernel or if we're going back to user-mode   	;; this test matches the user_regs(regs) macro @@ -586,13 +594,6 @@ _ugdb_handle_breakpoint:  	ba	do_sigtrap		; SIGTRAP the offending process.   	pop	$dccr			; Restore dccr in delay slot. -	.global kernel_execve -kernel_execve: -	move.d __NR_execve, $r9 -	break 13 -	ret -	nop -  	.data  hw_bp_trigs: diff --git a/arch/cris/arch-v10/kernel/process.c b/arch/cris/arch-v10/kernel/process.c index 15ac7150371..b1018750cff 100644 --- a/arch/cris/arch-v10/kernel/process.c +++ b/arch/cris/arch-v10/kernel/process.c @@ -17,6 +17,7 @@  #include <arch/svinto.h>  #include <linux/init.h>  #include <arch/system.h> +#include <linux/ptrace.h>  #ifdef CONFIG_ETRAX_GPIO  void etrax_gpio_wake_up_check(void); /* drivers/gpio.c */ @@ -81,31 +82,6 @@ unsigned long thread_saved_pc(struct task_struct *t)  	return task_pt_regs(t)->irp;  } -static void kernel_thread_helper(void* dummy, int (*fn)(void *), void * arg) -{ -  fn(arg); -  do_exit(-1); /* Should never be called, return bad exit value */ -} - -/* - * Create a kernel thread - */ -int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); - -        /* Don't use r10 since that is set to 0 in copy_thread */ -	regs.r11 = (unsigned long)fn; -	regs.r12 = (unsigned long)arg; -	regs.irp = (unsigned long)kernel_thread_helper; -	regs.dccr = 1 << I_DCCR_BITNR; - -	/* Ok, create the new process.. */ -        return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); -} -  /* setup the child's kernel stack with a pt_regs and switch_stack on it.   * it will be un-nested during _resume and _ret_from_sys_call when the   * new thread is scheduled. @@ -115,29 +91,34 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)   *   */  asmlinkage void ret_from_fork(void); +asmlinkage void ret_from_kernel_thread(void);  int copy_thread(unsigned long clone_flags, unsigned long usp, -		unsigned long unused, -		struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  { -	struct pt_regs * childregs; -	struct switch_stack *swstack; +	struct pt_regs *childregs = task_pt_regs(p); +	struct switch_stack *swstack = ((struct switch_stack *)childregs) - 1;  	/* put the pt_regs structure at the end of the new kernel stack page and fix it up  	 * remember that the task_struct doubles as the kernel stack for the task  	 */ -	childregs = task_pt_regs(p); -         -	*childregs = *regs;  /* struct copy of pt_regs */ -         -        p->set_child_tid = p->clear_child_tid = NULL; +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(swstack, 0, +			sizeof(struct switch_stack) + sizeof(struct pt_regs)); +		swstack->r1 = usp; +		swstack->r2 = arg; +		childregs->dccr = 1 << I_DCCR_BITNR; +		swstack->return_ip = (unsigned long) ret_from_kernel_thread; +		p->thread.ksp = (unsigned long) swstack; +		p->thread.usp = 0; +		return 0; +	} +	*childregs = *current_pt_regs();  /* struct copy of pt_regs */          childregs->r10 = 0;  /* child returns 0 after a fork/clone */ -	 -	/* put the switch stack right below the pt_regs */ -	swstack = ((struct switch_stack *)childregs) - 1; +	/* put the switch stack right below the pt_regs */  	swstack->r9 = 0; /* parameter to ret_from_sys_call, 0 == dont restart the syscall */ @@ -147,7 +128,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	/* fix the user-mode stackpointer */ -	p->thread.usp = usp;	 +	p->thread.usp = usp ?: rdusp();  	/* and the kernel-mode one */ @@ -161,70 +142,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	return 0;  } -/*  - * Be aware of the "magic" 7th argument in the four system-calls below. - * They need the latest stackframe, which is put as the 7th argument by - * entry.S. The previous arguments are dummies or actually used, but need - * to be defined to reach the 7th argument. - * - * N.B.: Another method to get the stackframe is to use current_regs(). But - * it returns the latest stack-frame stacked when going from _user mode_ and - * some of these (at least sys_clone) are called from kernel-mode sometimes - * (for example during kernel_thread, above) and thus cannot use it. Thus, - * to be sure not to get any surprises, we use the method for the other calls - * as well. - */ - -asmlinkage int sys_fork(long r10, long r11, long r12, long r13, long mof, long srp, -			struct pt_regs *regs) -{ -	return do_fork(SIGCHLD, rdusp(), regs, 0, NULL, NULL); -} - -/* if newusp is 0, we just grab the old usp */ -/* FIXME: Is parent_tid/child_tid really third/fourth argument? Update lib? */ -asmlinkage int sys_clone(unsigned long newusp, unsigned long flags, -			 int* parent_tid, int* child_tid, long mof, long srp, -			 struct pt_regs *regs) -{ -	if (!newusp) -		newusp = rdusp(); -	return do_fork(flags, newusp, regs, 0, parent_tid, child_tid); -} - -/* vfork is a system call in i386 because of register-pressure - maybe - * we can remove it and handle it in libc but we put it here until then. - */ - -asmlinkage int sys_vfork(long r10, long r11, long r12, long r13, long mof, long srp, -			 struct pt_regs *regs) -{ -        return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), regs, 0, NULL, NULL); -} - -/* - * sys_execve() executes a new program. - */ -asmlinkage int sys_execve(const char *fname, -			  const char *const *argv, -			  const char *const *envp, -			  long r13, long mof, long srp,  -			  struct pt_regs *regs) -{ -	int error; -	struct filename *filename; - -	filename = getname(fname); -	error = PTR_ERR(filename); - -	if (IS_ERR(filename)) -	        goto out; -	error = do_execve(filename->name, argv, envp, regs); -	putname(filename); - out: -	return error; -} -  unsigned long get_wchan(struct task_struct *p)  {  #if 0 diff --git a/arch/cris/arch-v32/kernel/entry.S b/arch/cris/arch-v32/kernel/entry.S index c3ea4694fba..faa644111fe 100644 --- a/arch/cris/arch-v32/kernel/entry.S +++ b/arch/cris/arch-v32/kernel/entry.S @@ -31,6 +31,7 @@  	.globl system_call  	.globl ret_from_intr  	.globl ret_from_fork +	.globl ret_from_kernel_thread  	.globl resume  	.globl multiple_interrupt  	.globl nmi_interrupt @@ -84,6 +85,18 @@ ret_from_fork:  	nop  	.size	ret_from_fork, . - ret_from_fork +	.type	ret_from_kernel_thread,@function +ret_from_kernel_thread: +	jsr schedule_tail +	nop +	move.d	$r2, $r10 +	jsr	$r1 +	nop +	moveq	0, $r9			; no syscall restarts, TYVM... +	ba  ret_from_sys_call +	nop +	.size	ret_from_kernel_thread, . - ret_from_kernel_thread +  	.type	ret_from_intr,@function  ret_from_intr:  	;; Check for resched if preemptive kernel, or if we're going back to @@ -531,15 +544,6 @@ _ugdb_handle_exception:  	ba	do_sigtrap		; SIGTRAP the offending process.  	move.d	[$sp+], $r0		; Restore R0 in delay slot. -	.global kernel_execve -	.type	kernel_execve,@function -kernel_execve: -	move.d __NR_execve, $r9 -	break 13 -	ret -	nop -	.size	kernel_execve, . - kernel_execve -  	.data  	.section .rodata,"a" diff --git a/arch/cris/arch-v32/kernel/process.c b/arch/cris/arch-v32/kernel/process.c index 4e999224635..2b23ef0e445 100644 --- a/arch/cris/arch-v32/kernel/process.c +++ b/arch/cris/arch-v32/kernel/process.c @@ -16,6 +16,7 @@  #include <hwregs/reg_map.h>  #include <hwregs/timer_defs.h>  #include <hwregs/intr_vect_defs.h> +#include <linux/ptrace.h>  extern void stop_watchdog(void); @@ -94,31 +95,6 @@ unsigned long thread_saved_pc(struct task_struct *t)  	return task_pt_regs(t)->erp;  } -static void -kernel_thread_helper(void* dummy, int (*fn)(void *), void * arg) -{ -	fn(arg); -	do_exit(-1); /* Should never be called, return bad exit value. */ -} - -/* Create a kernel thread. */ -int -kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); - -        /* Don't use r10 since that is set to 0 in copy_thread. */ -	regs.r11 = (unsigned long) fn; -	regs.r12 = (unsigned long) arg; -	regs.erp = (unsigned long) kernel_thread_helper; -	regs.ccs = 1 << (I_CCS_BITNR + CCS_SHIFT); - -	/* Create the new process. */ -        return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); -} -  /*   * Setup the child's kernel stack with a pt_regs and call switch_stack() on it.   * It will be unnested during _resume and _ret_from_sys_call when the new thread @@ -129,34 +105,42 @@ kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)   */  extern asmlinkage void ret_from_fork(void); +extern asmlinkage void ret_from_kernel_thread(void);  int  copy_thread(unsigned long clone_flags, unsigned long usp, -	unsigned long unused, -	struct task_struct *p, struct pt_regs *regs) +	unsigned long arg, struct task_struct *p)  { -	struct pt_regs *childregs; -	struct switch_stack *swstack; +	struct pt_regs *childregs = task_pt_regs(p); +	struct switch_stack *swstack = ((struct switch_stack *) childregs) - 1;  	/*  	 * Put the pt_regs structure at the end of the new kernel stack page and  	 * fix it up. Note: the task_struct doubles as the kernel stack for the  	 * task.  	 */ -	childregs = task_pt_regs(p); -	*childregs = *regs;	/* Struct copy of pt_regs. */ -        p->set_child_tid = p->clear_child_tid = NULL; +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(swstack, 0, +			sizeof(struct switch_stack) + sizeof(struct pt_regs)); +		swstack->r1 = usp; +		swstack->r2 = arg; +		childregs->ccs = 1 << (I_CCS_BITNR + CCS_SHIFT); +		swstack->return_ip = (unsigned long) ret_from_kernel_thread; +		p->thread.ksp = (unsigned long) swstack; +		p->thread.usp = 0; +		return 0; +	} +	*childregs = *current_pt_regs();	/* Struct copy of pt_regs. */          childregs->r10 = 0;	/* Child returns 0 after a fork/clone. */  	/* Set a new TLS ?  	 * The TLS is in $mof because it is the 5th argument to sys_clone.  	 */  	if (p->mm && (clone_flags & CLONE_SETTLS)) { -		task_thread_info(p)->tls = regs->mof; +		task_thread_info(p)->tls = childregs->mof;  	}  	/* Put the switch stack right below the pt_regs. */ -	swstack = ((struct switch_stack *) childregs) - 1;  	/* Parameter to ret_from_sys_call. 0 is don't restart the syscall. */  	swstack->r9 = 0; @@ -168,76 +152,12 @@ copy_thread(unsigned long clone_flags, unsigned long usp,  	swstack->return_ip = (unsigned long) ret_from_fork;  	/* Fix the user-mode and kernel-mode stackpointer. */ -	p->thread.usp = usp; +	p->thread.usp = usp ?: rdusp();  	p->thread.ksp = (unsigned long) swstack;  	return 0;  } -/* - * Be aware of the "magic" 7th argument in the four system-calls below. - * They need the latest stackframe, which is put as the 7th argument by - * entry.S. The previous arguments are dummies or actually used, but need - * to be defined to reach the 7th argument. - * - * N.B.: Another method to get the stackframe is to use current_regs(). But - * it returns the latest stack-frame stacked when going from _user mode_ and - * some of these (at least sys_clone) are called from kernel-mode sometimes - * (for example during kernel_thread, above) and thus cannot use it. Thus, - * to be sure not to get any surprises, we use the method for the other calls - * as well. - */ -asmlinkage int -sys_fork(long r10, long r11, long r12, long r13, long mof, long srp, -	struct pt_regs *regs) -{ -	return do_fork(SIGCHLD, rdusp(), regs, 0, NULL, NULL); -} - -/* FIXME: Is parent_tid/child_tid really third/fourth argument? Update lib? */ -asmlinkage int -sys_clone(unsigned long newusp, unsigned long flags, int *parent_tid, int *child_tid, -	unsigned long tls, long srp, struct pt_regs *regs) -{ -	if (!newusp) -		newusp = rdusp(); - -	return do_fork(flags, newusp, regs, 0, parent_tid, child_tid); -} - -/* - * vfork is a system call in i386 because of register-pressure - maybe - * we can remove it and handle it in libc but we put it here until then. - */ -asmlinkage int -sys_vfork(long r10, long r11, long r12, long r13, long mof, long srp, -	struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), regs, 0, NULL, NULL); -} - -/* sys_execve() executes a new program. */ -asmlinkage int -sys_execve(const char *fname, -	   const char *const *argv, -	   const char *const *envp, long r13, long mof, long srp, -	   struct pt_regs *regs) -{ -	int error; -	struct filename *filename; - -	filename = getname(fname); -	error = PTR_ERR(filename); - -	if (IS_ERR(filename)) -	        goto out; - -	error = do_execve(filename->name, argv, envp, regs); -	putname(filename); - out: -	return error; -} -  unsigned long  get_wchan(struct task_struct *p)  { diff --git a/arch/cris/include/asm/Kbuild b/arch/cris/include/asm/Kbuild index 6d43a951b5e..15a122c3767 100644 --- a/arch/cris/include/asm/Kbuild +++ b/arch/cris/include/asm/Kbuild @@ -11,3 +11,4 @@ header-y += sync_serial.h  generic-y += clkdev.h  generic-y += exec.h  generic-y += module.h +generic-y += trace_clock.h diff --git a/arch/cris/include/asm/processor.h b/arch/cris/include/asm/processor.h index ef4e1bc3efc..675823f70c0 100644 --- a/arch/cris/include/asm/processor.h +++ b/arch/cris/include/asm/processor.h @@ -49,8 +49,6 @@ struct task_struct;  #define task_pt_regs(task) user_regs(task_thread_info(task))  #define current_regs() task_pt_regs(current) -extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); -  unsigned long get_wchan(struct task_struct *p);  #define KSTK_ESP(tsk)   ((tsk) == current ? rdusp() : (tsk)->thread.usp) diff --git a/arch/cris/include/asm/signal.h b/arch/cris/include/asm/signal.h index ea6af9aad76..72dbbf59dfa 100644 --- a/arch/cris/include/asm/signal.h +++ b/arch/cris/include/asm/signal.h @@ -152,12 +152,6 @@ typedef struct sigaltstack {  #ifdef __KERNEL__  #include <asm/sigcontext.h> - -/* here we could define asm-optimized sigaddset, sigdelset etc. operations.  - * if we don't, generic ones are used from linux/signal.h - */ -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -  #endif /* __KERNEL__ */  #endif diff --git a/arch/cris/include/asm/socket.h b/arch/cris/include/asm/socket.h index ae52825021a..b681b043f6c 100644 --- a/arch/cris/include/asm/socket.h +++ b/arch/cris/include/asm/socket.h @@ -42,6 +42,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER        26  #define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		28  #define SO_TIMESTAMP           29 diff --git a/arch/cris/include/asm/unistd.h b/arch/cris/include/asm/unistd.h index 51873a446f8..f27b542e0eb 100644 --- a/arch/cris/include/asm/unistd.h +++ b/arch/cris/include/asm/unistd.h @@ -371,6 +371,10 @@  #define __ARCH_WANT_SYS_SIGPROCMASK  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/cris/kernel/crisksyms.c b/arch/cris/kernel/crisksyms.c index 7ac000f6a88..5868cee20eb 100644 --- a/arch/cris/kernel/crisksyms.c +++ b/arch/cris/kernel/crisksyms.c @@ -30,7 +30,6 @@ extern void __negdi2(void);  extern void iounmap(volatile void * __iomem);  /* Platform dependent support */ -EXPORT_SYMBOL(kernel_thread);  EXPORT_SYMBOL(get_cmos_time);  EXPORT_SYMBOL(loops_per_usec); diff --git a/arch/frv/include/asm/Kbuild b/arch/frv/include/asm/Kbuild index 4a159da2363..c5d76702830 100644 --- a/arch/frv/include/asm/Kbuild +++ b/arch/frv/include/asm/Kbuild @@ -1,3 +1,4 @@  generic-y += clkdev.h  generic-y += exec.h +generic-y += trace_clock.h diff --git a/arch/frv/include/asm/unistd.h b/arch/frv/include/asm/unistd.h index 2358634cacc..1807d8ea8cb 100644 --- a/arch/frv/include/asm/unistd.h +++ b/arch/frv/include/asm/unistd.h @@ -30,6 +30,9 @@  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND  #define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/frv/include/uapi/asm/socket.h b/arch/frv/include/uapi/asm/socket.h index a5b1d7dbb20..871f89b7fbd 100644 --- a/arch/frv/include/uapi/asm/socket.h +++ b/arch/frv/include/uapi/asm/socket.h @@ -40,6 +40,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER        26  #define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME             28  #define SO_TIMESTAMP		29 diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c index 7e33215f1d8..23916b2a12a 100644 --- a/arch/frv/kernel/process.c +++ b/arch/frv/kernel/process.c @@ -139,42 +139,12 @@ inline unsigned long user_stack(const struct pt_regs *regs)  	return user_mode(regs) ? regs->sp : 0;  } -asmlinkage int sys_fork(void) -{ -#ifndef CONFIG_MMU -	/* fork almost works, enough to trick you into looking elsewhere:-( */ -	return -EINVAL; -#else -	return do_fork(SIGCHLD, user_stack(__frame), __frame, 0, NULL, NULL); -#endif -} - -asmlinkage int sys_vfork(void) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, user_stack(__frame), __frame, 0, -		       NULL, NULL); -} - -/*****************************************************************************/ -/* - * clone a process - * - tlsptr is retrieved by copy_thread() - */ -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, -			 int __user *parent_tidptr, int __user *child_tidptr, -			 int __user *tlsptr) -{ -	if (!newsp) -		newsp = user_stack(__frame); -	return do_fork(clone_flags, newsp, __frame, 0, parent_tidptr, child_tidptr); -} /* end sys_clone() */ -  /*   * set up the kernel stack and exception frames for a new process   */  int copy_thread(unsigned long clone_flags,  		unsigned long usp, unsigned long arg, -		struct task_struct *p, struct pt_regs *regs) +		struct task_struct *p)  {  	struct pt_regs *childregs; @@ -182,9 +152,7 @@ int copy_thread(unsigned long clone_flags,  		(task_stack_page(p) + THREAD_SIZE - FRV_FRAME0_SIZE);  	/* set up the userspace frame (the only place that the USP is stored) */ -	*childregs = *__kernel_frame0_ptr; - -	p->set_child_tid = p->clear_child_tid = NULL; +	*childregs = *current_pt_regs();  	p->thread.frame	 = childregs;  	p->thread.curr	 = p; @@ -193,18 +161,15 @@ int copy_thread(unsigned long clone_flags,  	p->thread.lr	 = 0;  	p->thread.frame0 = childregs; -	if (unlikely(!regs)) { +	if (unlikely(p->flags & PF_KTHREAD)) {  		childregs->gr9 = usp; /* function */  		childregs->gr8 = arg;  		p->thread.pc = (unsigned long) ret_from_kernel_thread;  		save_user_regs(p->thread.user);  		return 0;  	} - -	/* set up the userspace frame (the only place that the USP is stored) */ -	*childregs = *regs; - -	childregs->sp		= usp; +	if (usp) +		childregs->sp = usp;  	childregs->next_frame	= NULL;  	p->thread.pc = (unsigned long) ret_from_fork; diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig index 98fabd10e95..04bef4d25b4 100644 --- a/arch/h8300/Kconfig +++ b/arch/h8300/Kconfig @@ -8,6 +8,8 @@ config H8300  	select GENERIC_IRQ_SHOW  	select GENERIC_CPU_DEVICES  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  config SYMBOL_PREFIX  	string diff --git a/arch/h8300/include/asm/Kbuild b/arch/h8300/include/asm/Kbuild index 50bbf387b2f..4bc8ae73e08 100644 --- a/arch/h8300/include/asm/Kbuild +++ b/arch/h8300/include/asm/Kbuild @@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm  generic-y += clkdev.h  generic-y += exec.h  generic-y += module.h +generic-y += trace_clock.h diff --git a/arch/h8300/include/asm/processor.h b/arch/h8300/include/asm/processor.h index 4c9f6f87b61..4b0ca49bb46 100644 --- a/arch/h8300/include/asm/processor.h +++ b/arch/h8300/include/asm/processor.h @@ -107,8 +107,6 @@ static inline void release_thread(struct task_struct *dead_task)  {  } -extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); -  /*   * Free current thread data structures etc..   */ diff --git a/arch/h8300/include/asm/ptrace.h b/arch/h8300/include/asm/ptrace.h index d09c440bdba..7468589a128 100644 --- a/arch/h8300/include/asm/ptrace.h +++ b/arch/h8300/include/asm/ptrace.h @@ -60,6 +60,9 @@ struct pt_regs {  #define user_mode(regs) (!((regs)->ccr & PS_S))  #define instruction_pointer(regs) ((regs)->pc)  #define profile_pc(regs) instruction_pointer(regs) +#define current_pt_regs() ((struct pt_regs *) \ +	(THREAD_SIZE + (unsigned long)current_thread_info()) - 1) +#define signal_pt_regs() ((struct pt_regs *)current->thread.esp0)  #endif /* __KERNEL__ */  #endif /* __ASSEMBLY__ */  #endif /* _H8300_PTRACE_H */ diff --git a/arch/h8300/include/asm/signal.h b/arch/h8300/include/asm/signal.h index fd8b66e40dc..c43c0a7d2c2 100644 --- a/arch/h8300/include/asm/signal.h +++ b/arch/h8300/include/asm/signal.h @@ -154,8 +154,6 @@ typedef struct sigaltstack {  #include <asm/sigcontext.h>  #undef __HAVE_ARCH_SIG_BITOPS -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -  #endif /* __KERNEL__ */  #endif /* _H8300_SIGNAL_H */ diff --git a/arch/h8300/include/asm/socket.h b/arch/h8300/include/asm/socket.h index ec4554e7b04..90a2e573c7e 100644 --- a/arch/h8300/include/asm/socket.h +++ b/arch/h8300/include/asm/socket.h @@ -40,6 +40,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER        26  #define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME             28  #define SO_TIMESTAMP		29 diff --git a/arch/h8300/include/asm/unistd.h b/arch/h8300/include/asm/unistd.h index 5cd882801d7..c2c2f5c7d6b 100644 --- a/arch/h8300/include/asm/unistd.h +++ b/arch/h8300/include/asm/unistd.h @@ -356,6 +356,10 @@  #define __ARCH_WANT_SYS_SIGPROCMASK  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/h8300/kernel/entry.S b/arch/h8300/kernel/entry.S index ca743169030..617a6878787 100644 --- a/arch/h8300/kernel/entry.S +++ b/arch/h8300/kernel/entry.S @@ -158,6 +158,7 @@ INTERRUPTS = 128  .globl SYMBOL_NAME(system_call)  .globl SYMBOL_NAME(ret_from_exception)  .globl SYMBOL_NAME(ret_from_fork) +.globl SYMBOL_NAME(ret_from_kernel_thread)  .globl SYMBOL_NAME(ret_from_interrupt)  .globl SYMBOL_NAME(interrupt_redirect_table)  .globl SYMBOL_NAME(sw_ksp),SYMBOL_NAME(sw_usp) @@ -330,6 +331,14 @@ SYMBOL_NAME_LABEL(ret_from_fork)  	jsr	@SYMBOL_NAME(schedule_tail)  	jmp	@SYMBOL_NAME(ret_from_exception) +SYMBOL_NAME_LABEL(ret_from_kernel_thread) +	mov.l	er2,er0 +	jsr	@SYMBOL_NAME(schedule_tail) +	mov.l	@(LER4:16,sp),er0 +	mov.l	@(LER5:16,sp),er1 +	jsr	@er1 +	jmp	@SYMBOL_NAME(ret_from_exception) +  SYMBOL_NAME_LABEL(resume)  	/*  	 * Beware - when entering resume, offset of tss is in d1, diff --git a/arch/h8300/kernel/h8300_ksyms.c b/arch/h8300/kernel/h8300_ksyms.c index 6866bd9c7fb..53d7c0e4bd8 100644 --- a/arch/h8300/kernel/h8300_ksyms.c +++ b/arch/h8300/kernel/h8300_ksyms.c @@ -33,7 +33,6 @@ EXPORT_SYMBOL(strncmp);  EXPORT_SYMBOL(ip_fast_csum); -EXPORT_SYMBOL(kernel_thread);  EXPORT_SYMBOL(enable_irq);  EXPORT_SYMBOL(disable_irq); diff --git a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c index e8dc1393a13..b609f63f159 100644 --- a/arch/h8300/kernel/process.c +++ b/arch/h8300/kernel/process.c @@ -47,6 +47,7 @@ void (*pm_power_off)(void) = NULL;  EXPORT_SYMBOL(pm_power_off);  asmlinkage void ret_from_fork(void); +asmlinkage void ret_from_kernel_thread(void);  /*   * The idle loop on an H8/300.. @@ -122,113 +123,34 @@ void show_regs(struct pt_regs * regs)  		printk("\n");  } -/* - * Create a kernel thread - */ -int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) -{ -	long retval; -	long clone_arg; -	mm_segment_t fs; - -	fs = get_fs(); -	set_fs (KERNEL_DS); -	clone_arg = flags | CLONE_VM; -	__asm__("mov.l sp,er3\n\t" -		"sub.l er2,er2\n\t" -		"mov.l %2,er1\n\t" -		"mov.l %1,er0\n\t" -		"trapa #0\n\t" -		"cmp.l sp,er3\n\t" -		"beq 1f\n\t" -		"mov.l %4,er0\n\t" -		"mov.l %3,er1\n\t" -		"jsr @er1\n\t" -		"mov.l %5,er0\n\t" -		"trapa #0\n" -		"1:\n\t" -		"mov.l er0,%0" -		:"=r"(retval) -		:"i"(__NR_clone),"g"(clone_arg),"g"(fn),"g"(arg),"i"(__NR_exit) -		:"er0","er1","er2","er3"); -	set_fs (fs); -	return retval; -} -  void flush_thread(void)  {  } -/* - * "h8300_fork()".. By the time we get here, the - * non-volatile registers have also been saved on the - * stack. We do some ugly pointer stuff here.. (see - * also copy_thread) - */ - -asmlinkage int h8300_fork(struct pt_regs *regs) -{ -	return -EINVAL; -} - -asmlinkage int h8300_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), regs, 0, NULL, NULL); -} - -asmlinkage int h8300_clone(struct pt_regs *regs) -{ -	unsigned long clone_flags; -	unsigned long newsp; - -	/* syscall2 puts clone_flags in er1 and usp in er2 */ -	clone_flags = regs->er1; -	newsp = regs->er2; -	if (!newsp) -		newsp  = rdusp(); -	return do_fork(clone_flags, newsp, regs, 0, NULL, NULL); - -} -  int copy_thread(unsigned long clone_flags,                  unsigned long usp, unsigned long topstk, -		 struct task_struct * p, struct pt_regs * regs) +		 struct task_struct * p)  {  	struct pt_regs * childregs;  	childregs = (struct pt_regs *) (THREAD_SIZE + task_stack_page(p)) - 1; -	*childregs = *regs; +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(childregs, 0, sizeof(struct pt_regs)); +		childregs->retpc = (unsigned long) ret_from_kernel_thread; +		childregs->er4 = topstk; /* arg */ +		childregs->er5 = usp; /* fn */ +		p->thread.ksp = (unsigned long)childregs; +	} +	*childregs = *current_pt_regs();  	childregs->retpc = (unsigned long) ret_from_fork;  	childregs->er0 = 0; - -	p->thread.usp = usp; +	p->thread.usp = usp ?: rdusp();  	p->thread.ksp = (unsigned long)childregs;  	return 0;  } -/* - * sys_execve() executes a new program. - */ -asmlinkage int sys_execve(const char *name, -			  const char *const *argv, -			  const char *const *envp, -			  int dummy, ...) -{ -	int error; -	struct filename *filename; -	struct pt_regs *regs = (struct pt_regs *) ((unsigned char *)&dummy-4); - -	filename = getname(name); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		return error; -	error = do_execve(filename->name, argv, envp, regs); -	putname(filename); -	return error; -} -  unsigned long thread_saved_pc(struct task_struct *tsk)  {  	return ((struct pt_regs *)tsk->thread.esp0)->pc; diff --git a/arch/h8300/kernel/sys_h8300.c b/arch/h8300/kernel/sys_h8300.c index 4bdc7311784..bf350cb7f59 100644 --- a/arch/h8300/kernel/sys_h8300.c +++ b/arch/h8300/kernel/sys_h8300.c @@ -46,29 +46,3 @@ asmlinkage void syscall_print(void *dummy,...)                 ((regs->pc)&0xffffff)-2,regs->orig_er0,regs->er1,regs->er2,regs->er3,regs->er0);  }  #endif - -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -asmlinkage -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	register long res __asm__("er0"); -	register const char *const *_c __asm__("er3") = envp; -	register const char *const *_b __asm__("er2") = argv; -	register const char * _a __asm__("er1") = filename; -	__asm__ __volatile__ ("mov.l %1,er0\n\t" -			"trapa	#0\n\t" -			: "=r" (res) -			: "g" (__NR_execve), -			  "g" (_a), -			  "g" (_b), -			  "g" (_c) -			: "cc", "memory"); -	return res; -} - - diff --git a/arch/h8300/kernel/syscalls.S b/arch/h8300/kernel/syscalls.S index 9d77e715a2e..b74dd0ade58 100644 --- a/arch/h8300/kernel/syscalls.S +++ b/arch/h8300/kernel/syscalls.S @@ -340,21 +340,12 @@ SYMBOL_NAME_LABEL(sys_call_table)  	bra	SYMBOL_NAME(syscall_trampoline):8  	.endm -SYMBOL_NAME_LABEL(sys_clone)	 -	call_sp	h8300_clone -	  SYMBOL_NAME_LABEL(sys_sigreturn)  	call_sp	do_sigreturn  SYMBOL_NAME_LABEL(sys_rt_sigreturn)  	call_sp	do_rt_sigreturn -SYMBOL_NAME_LABEL(sys_fork) -	call_sp	h8300_fork - -SYMBOL_NAME_LABEL(sys_vfork) -	call_sp	h8300_vfork -  SYMBOL_NAME_LABEL(syscall_trampoline)  	mov.l	sp,er0  	jmp	@er6 diff --git a/arch/hexagon/Kconfig b/arch/hexagon/Kconfig index 0744f7d7b1f..e418803b6c8 100644 --- a/arch/hexagon/Kconfig +++ b/arch/hexagon/Kconfig @@ -31,6 +31,8 @@ config HEXAGON  	select GENERIC_CLOCKEVENTS  	select GENERIC_CLOCKEVENTS_BROADCAST  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  	---help---  	  Qualcomm Hexagon is a processor architecture designed for high  	  performance and low power across a wide variety of applications. diff --git a/arch/hexagon/include/asm/Kbuild b/arch/hexagon/include/asm/Kbuild index 3bfa9b30f44..bdb54ceb53b 100644 --- a/arch/hexagon/include/asm/Kbuild +++ b/arch/hexagon/include/asm/Kbuild @@ -48,6 +48,7 @@ generic-y += stat.h  generic-y += termbits.h  generic-y += termios.h  generic-y += topology.h +generic-y += trace_clock.h  generic-y += types.h  generic-y += ucontext.h  generic-y += unaligned.h diff --git a/arch/hexagon/include/asm/processor.h b/arch/hexagon/include/asm/processor.h index a03323ab9d4..6dd5d370686 100644 --- a/arch/hexagon/include/asm/processor.h +++ b/arch/hexagon/include/asm/processor.h @@ -34,7 +34,6 @@  struct task_struct;  /*  this is defined in arch/process.c  */ -extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);  extern unsigned long thread_saved_pc(struct task_struct *tsk);  extern void start_thread(struct pt_regs *, unsigned long, unsigned long); diff --git a/arch/hexagon/include/asm/syscall.h b/arch/hexagon/include/asm/syscall.h index fb0e9d48faa..4af9c7b6f13 100644 --- a/arch/hexagon/include/asm/syscall.h +++ b/arch/hexagon/include/asm/syscall.h @@ -25,14 +25,6 @@ typedef long (*syscall_fn)(unsigned long, unsigned long,  	unsigned long, unsigned long,  	unsigned long, unsigned long); -asmlinkage int sys_execve(char __user *ufilename, char __user * __user *argv, -			  char __user * __user *envp); -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, -			 unsigned long parent_tidp, unsigned long child_tidp); - -#define sys_execve	sys_execve -#define sys_clone	sys_clone -  #include <asm-generic/syscalls.h>  extern void *sys_call_table[]; diff --git a/arch/hexagon/include/uapi/asm/ptrace.h b/arch/hexagon/include/uapi/asm/ptrace.h index 8ef784047a7..1ffce0c6ee0 100644 --- a/arch/hexagon/include/uapi/asm/ptrace.h +++ b/arch/hexagon/include/uapi/asm/ptrace.h @@ -32,4 +32,8 @@  extern int regs_query_register_offset(const char *name);  extern const char *regs_query_register_name(unsigned int offset); +#define current_pt_regs() \ +	((struct pt_regs *) \ +	 ((unsigned long)current_thread_info() + THREAD_SIZE) - 1) +  #endif diff --git a/arch/hexagon/include/uapi/asm/unistd.h b/arch/hexagon/include/uapi/asm/unistd.h index 81312d6a52e..2af81533bd0 100644 --- a/arch/hexagon/include/uapi/asm/unistd.h +++ b/arch/hexagon/include/uapi/asm/unistd.h @@ -27,5 +27,7 @@   */  #define sys_mmap2 sys_mmap_pgoff +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_CLONE  #include <asm-generic/unistd.h> diff --git a/arch/hexagon/kernel/Makefile b/arch/hexagon/kernel/Makefile index 536aec093e6..6c19501b487 100644 --- a/arch/hexagon/kernel/Makefile +++ b/arch/hexagon/kernel/Makefile @@ -3,8 +3,7 @@ extra-y := head.o vmlinux.lds  obj-$(CONFIG_SMP) += smp.o topology.o  obj-y += setup.o irq_cpu.o traps.o syscalltab.o signal.o time.o -obj-y += process.o syscall.o trampoline.o reset.o ptrace.o -obj-y += vdso.o +obj-y += process.o trampoline.o reset.o ptrace.o vdso.o  obj-$(CONFIG_KGDB)    += kgdb.o  obj-$(CONFIG_MODULES) += module.o hexagon_ksyms.o diff --git a/arch/hexagon/kernel/process.c b/arch/hexagon/kernel/process.c index 9f6d7411b57..06ae9ffcabd 100644 --- a/arch/hexagon/kernel/process.c +++ b/arch/hexagon/kernel/process.c @@ -26,33 +26,6 @@  #include <linux/slab.h>  /* - * Kernel thread creation.  The desired kernel function is "wrapped" - * in the kernel_thread_helper function, which does cleanup - * afterwards. - */ -static void __noreturn kernel_thread_helper(void *arg, int (*fn)(void *)) -{ -	do_exit(fn(arg)); -} - -int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); -	/* -	 * Yes, we're exploting illicit knowledge of the ABI here. -	 */ -	regs.r00 = (unsigned long) arg; -	regs.r01 = (unsigned long) fn; -	pt_set_elr(®s, (unsigned long)kernel_thread_helper); -	pt_set_kmode(®s); - -	return do_fork(flags|CLONE_VM|CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); -} -EXPORT_SYMBOL(kernel_thread); - -/*   * Program thread launch.  Often defined as a macro in processor.h,   * but we're shooting for a small footprint and it's not an inner-loop   * performance-critical operation. @@ -114,8 +87,7 @@ unsigned long thread_saved_pc(struct task_struct *tsk)   * Copy architecture-specific thread state   */  int copy_thread(unsigned long clone_flags, unsigned long usp, -		unsigned long unused, struct task_struct *p, -		struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  {  	struct thread_info *ti = task_thread_info(p);  	struct hexagon_switch_stack *ss; @@ -125,61 +97,51 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	childregs = (struct pt_regs *) (((unsigned long) ti + THREAD_SIZE) -  					sizeof(*childregs)); -	memcpy(childregs, regs, sizeof(*childregs));  	ti->regs = childregs;  	/*  	 * Establish kernel stack pointer and initial PC for new thread +	 * Note that unlike the usual situation, we do not copy the +	 * parent's callee-saved here; those are in pt_regs and whatever +	 * we leave here will be overridden on return to userland.  	 */  	ss = (struct hexagon_switch_stack *) ((unsigned long) childregs -  						    sizeof(*ss));  	ss->lr = (unsigned long)ret_from_fork;  	p->thread.switch_sp = ss; +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(childregs, 0, sizeof(struct pt_regs)); +		/* r24 <- fn, r25 <- arg */ +		ss->r2524 = usp | ((u64)arg << 32); +		pt_set_kmode(childregs); +		return 0; +	} +	memcpy(childregs, current_pt_regs(), sizeof(*childregs)); +	ss->r2524 = 0; -	/* If User mode thread, set pt_reg stack pointer as per parameter */ -	if (user_mode(childregs)) { +	if (usp)  		pt_set_rte_sp(childregs, usp); -		/* Child sees zero return value */ -		childregs->r00 = 0; +	/* Child sees zero return value */ +	childregs->r00 = 0; -		/* -		 * The clone syscall has the C signature: -		 * int [r0] clone(int flags [r0], -		 *           void *child_frame [r1], -		 *           void *parent_tid [r2], -		 *           void *child_tid [r3], -		 *           void *thread_control_block [r4]); -		 * ugp is used to provide TLS support. -		 */ -		if (clone_flags & CLONE_SETTLS) -			childregs->ugp = childregs->r04; - -		/* -		 * Parent sees new pid -- not necessary, not even possible at -		 * this point in the fork process -		 * Might also want to set things like ti->addr_limit -		 */ -	} else { -		/* -		 * If kernel thread, resume stack is kernel stack base. -		 * Note that this is pointer arithmetic on pt_regs * -		 */ -		pt_set_rte_sp(childregs, (unsigned long)(childregs + 1)); -		/* -		 * We need the current thread_info fast path pointer -		 * set up in pt_regs.  The register to be used is -		 * parametric for assembler code, but the mechanism -		 * doesn't drop neatly into C.  Needs to be fixed. -		 */ -		childregs->THREADINFO_REG = (unsigned long) ti; -	} +	/* +	 * The clone syscall has the C signature: +	 * int [r0] clone(int flags [r0], +	 *           void *child_frame [r1], +	 *           void *parent_tid [r2], +	 *           void *child_tid [r3], +	 *           void *thread_control_block [r4]); +	 * ugp is used to provide TLS support. +	 */ +	if (clone_flags & CLONE_SETTLS) +		childregs->ugp = childregs->r04;  	/* -	 * thread_info pointer is pulled out of task_struct "stack" -	 * field on switch_to. +	 * Parent sees new pid -- not necessary, not even possible at +	 * this point in the fork process +	 * Might also want to set things like ti->addr_limit  	 */ -	p->stack = (void *)ti;  	return 0;  } diff --git a/arch/hexagon/kernel/signal.c b/arch/hexagon/kernel/signal.c index 5047b8b879c..fe0d1373165 100644 --- a/arch/hexagon/kernel/signal.c +++ b/arch/hexagon/kernel/signal.c @@ -249,14 +249,14 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)   */  asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)  { -	struct pt_regs *regs = current_thread_info()->regs; +	struct pt_regs *regs = current_pt_regs();  	return do_sigaltstack(uss, uoss, regs->r29);  }  asmlinkage int sys_rt_sigreturn(void)  { -	struct pt_regs *regs = current_thread_info()->regs; +	struct pt_regs *regs = current_pt_regs();  	struct rt_sigframe __user *frame;  	sigset_t blocked; diff --git a/arch/hexagon/kernel/syscall.c b/arch/hexagon/kernel/syscall.c deleted file mode 100644 index 319fa6494f5..00000000000 --- a/arch/hexagon/kernel/syscall.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Hexagon system calls - * - * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -#include <linux/file.h> -#include <linux/fs.h> -#include <linux/linkage.h> -#include <linux/mm.h> -#include <linux/module.h> -#include <linux/sched.h> -#include <linux/slab.h> -#include <linux/syscalls.h> -#include <linux/unistd.h> -#include <asm/mman.h> -#include <asm/registers.h> - -/* - * System calls with architecture-specific wrappers. - * See signal.c for signal-related system call wrappers. - */ - -asmlinkage int sys_execve(char __user *ufilename, -			  const char __user *const __user *argv, -			  const char __user *const __user *envp) -{ -	struct pt_regs *pregs = current_thread_info()->regs; -	struct filename *filename; -	int retval; - -	filename = getname(ufilename); -	retval = PTR_ERR(filename); -	if (IS_ERR(filename)) -		return retval; - -	retval = do_execve(filename->name, argv, envp, pregs); -	putname(filename); - -	return retval; -} - -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, -			 unsigned long parent_tidp, unsigned long child_tidp) -{ -	struct pt_regs *pregs = current_thread_info()->regs; - -	if (!newsp) -		newsp = pregs->SP; -	return do_fork(clone_flags, newsp, pregs, 0, (int __user *)parent_tidp, -		       (int __user *)child_tidp); -} - -/* - * Do a system call from the kernel, so as to have a proper pt_regs - * and recycle the sys_execvpe infrustructure. - */ -int kernel_execve(const char *filename, -		  const char *const argv[], const char *const envp[]) -{ -	register unsigned long __a0 asm("r0") = (unsigned long) filename; -	register unsigned long __a1 asm("r1") = (unsigned long) argv; -	register unsigned long __a2 asm("r2") = (unsigned long) envp; -	int retval; - -	__asm__ volatile( -		"	R6 = #%4;\n" -		"	trap0(#1);\n" -		"	%0 = R0;\n" -		: "=r" (retval) -		: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_execve) -	); - -	return retval; -} diff --git a/arch/hexagon/kernel/vm_entry.S b/arch/hexagon/kernel/vm_entry.S index cd71673ac25..425e50c694f 100644 --- a/arch/hexagon/kernel/vm_entry.S +++ b/arch/hexagon/kernel/vm_entry.S @@ -266,4 +266,8 @@ _K_enter_machcheck:  	.globl ret_from_fork  ret_from_fork:  	call schedule_tail +	P0 = cmp.eq(R24, #0); +	if P0 jump return_from_syscall +	R0 = R25; +	callr R24  	jump return_from_syscall diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 3279646120e..67060046812 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig @@ -42,6 +42,8 @@ config IA64  	select GENERIC_TIME_VSYSCALL_OLD  	select HAVE_MOD_ARCH_SPECIFIC  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  	default y  	help  	  The Itanium Processor Family is Intel's 64-bit successor to diff --git a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c index ec536e4e36c..fc3924d18c1 100644 --- a/arch/ia64/hp/sim/simserial.c +++ b/arch/ia64/hp/sim/simserial.c @@ -555,6 +555,7 @@ static int __init simrs_init(void)  	return 0;  err_free_tty:  	put_tty_driver(hp_simserial_driver); +	tty_port_destroy(&state->port);  	return retval;  } diff --git a/arch/ia64/include/asm/Kbuild b/arch/ia64/include/asm/Kbuild index dd02f09b6ed..05b03ecd793 100644 --- a/arch/ia64/include/asm/Kbuild +++ b/arch/ia64/include/asm/Kbuild @@ -2,3 +2,4 @@  generic-y += clkdev.h  generic-y += exec.h  generic-y += kvm_para.h +generic-y += trace_clock.h diff --git a/arch/ia64/include/asm/cputime.h b/arch/ia64/include/asm/cputime.h index 3deac956d32..7fcf7f08ab0 100644 --- a/arch/ia64/include/asm/cputime.h +++ b/arch/ia64/include/asm/cputime.h @@ -103,5 +103,7 @@ static inline void cputime_to_timeval(const cputime_t ct, struct timeval *val)  #define cputime64_to_clock_t(__ct)	\  	cputime_to_clock_t((__force cputime_t)__ct) +extern void arch_vtime_task_switch(struct task_struct *tsk); +  #endif /* CONFIG_VIRT_CPU_ACCOUNTING */  #endif /* __IA64_CPUTIME_H */ diff --git a/arch/ia64/include/asm/device.h b/arch/ia64/include/asm/device.h index d05e78f6db9..f69c32ffbe6 100644 --- a/arch/ia64/include/asm/device.h +++ b/arch/ia64/include/asm/device.h @@ -7,9 +7,6 @@  #define _ASM_IA64_DEVICE_H  struct dev_archdata { -#ifdef CONFIG_ACPI -	void	*acpi_handle; -#endif  #ifdef CONFIG_INTEL_IOMMU  	void *iommu; /* hook for IOMMU specific extension */  #endif diff --git a/arch/ia64/include/asm/io.h b/arch/ia64/include/asm/io.h index 2c26321c28c..74a7cc3293b 100644 --- a/arch/ia64/include/asm/io.h +++ b/arch/ia64/include/asm/io.h @@ -90,7 +90,7 @@ phys_to_virt (unsigned long address)  #define ARCH_HAS_VALID_PHYS_ADDR_RANGE  extern u64 kern_mem_attribute (unsigned long phys_addr, unsigned long size); -extern int valid_phys_addr_range (unsigned long addr, size_t count); /* efi.c */ +extern int valid_phys_addr_range (phys_addr_t addr, size_t count); /* efi.c */  extern int valid_mmap_phys_addr_range (unsigned long pfn, size_t count);  /* diff --git a/arch/ia64/include/asm/processor.h b/arch/ia64/include/asm/processor.h index 944152a5091..e0a899a1a8a 100644 --- a/arch/ia64/include/asm/processor.h +++ b/arch/ia64/include/asm/processor.h @@ -340,22 +340,6 @@ struct task_struct;   */  #define release_thread(dead_task) -/* - * This is the mechanism for creating a new kernel thread. - * - * NOTE 1: Only a kernel-only process (ie the swapper or direct - * descendants who haven't done an "execve()") should use this: it - * will work within a system call from a "real" process, but the - * process memory space will not be free'd until both the parent and - * the child have exited. - * - * NOTE 2: This MUST NOT be an inlined function.  Otherwise, we get - * into trouble in init/main.c when the child thread returns to - * do_basic_setup() and the timing is such that free_initmem() has - * been called already. - */ -extern pid_t kernel_thread (int (*fn)(void *), void *arg, unsigned long flags); -  /* Get wait channel for task P.  */  extern unsigned long get_wchan (struct task_struct *p); diff --git a/arch/ia64/include/asm/signal.h b/arch/ia64/include/asm/signal.h index aecda5b9eb4..3a1b20e74c5 100644 --- a/arch/ia64/include/asm/signal.h +++ b/arch/ia64/include/asm/signal.h @@ -38,7 +38,5 @@ struct k_sigaction {  #  include <asm/sigcontext.h> -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -  # endif /* !__ASSEMBLY__ */  #endif /* _ASM_IA64_SIGNAL_H */ diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h index 8b3ff2f5b86..1574bca8613 100644 --- a/arch/ia64/include/asm/unistd.h +++ b/arch/ia64/include/asm/unistd.h @@ -29,6 +29,7 @@  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND +#define __ARCH_WANT_SYS_EXECVE  #if !defined(__ASSEMBLY__) && !defined(ASSEMBLER) diff --git a/arch/ia64/include/uapi/asm/socket.h b/arch/ia64/include/uapi/asm/socket.h index 41fc28a4a18..23d6759bb57 100644 --- a/arch/ia64/include/uapi/asm/socket.h +++ b/arch/ia64/include/uapi/asm/socket.h @@ -49,6 +49,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER	26  #define SO_DETACH_FILTER	27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		28  #define SO_TIMESTAMP		29 diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 440578850ae..e9682f5be34 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c @@ -633,6 +633,7 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int triggering, int polarity)  				      ACPI_EDGE_SENSITIVE) ? IOSAPIC_EDGE :  				     IOSAPIC_LEVEL);  } +EXPORT_SYMBOL_GPL(acpi_register_gsi);  void acpi_unregister_gsi(u32 gsi)  { @@ -644,6 +645,7 @@ void acpi_unregister_gsi(u32 gsi)  	iosapic_unregister_intr(gsi);  } +EXPORT_SYMBOL_GPL(acpi_unregister_gsi);  static int __init acpi_parse_fadt(struct acpi_table_header *table)  { diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index d37bbd48637..f034563aeae 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c @@ -870,7 +870,7 @@ kern_mem_attribute (unsigned long phys_addr, unsigned long size)  EXPORT_SYMBOL(kern_mem_attribute);  int -valid_phys_addr_range (unsigned long phys_addr, unsigned long size) +valid_phys_addr_range (phys_addr_t phys_addr, unsigned long size)  {  	u64 attr; diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 1ccbe12a4d8..e25b784a2b7 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S @@ -61,14 +61,13 @@ ENTRY(ia64_execve)  	 * Allocate 8 input registers since ptrace() may clobber them  	 */  	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8) -	alloc loc1=ar.pfs,8,2,4,0 +	alloc loc1=ar.pfs,8,2,3,0  	mov loc0=rp  	.body  	mov out0=in0			// filename  	;;				// stop bit between alloc and call  	mov out1=in1			// argv  	mov out2=in2			// envp -	add out3=16,sp			// regs  	br.call.sptk.many rp=sys_execve  .ret0:  	cmp4.ge p6,p7=r8,r0 @@ -76,7 +75,6 @@ ENTRY(ia64_execve)  	sxt4 r8=r8			// return 64-bit result  	;;  	stf.spill [sp]=f0 -(p6)	cmp.ne pKStk,pUStk=r0,r0	// a successful execve() lands us in user-mode...  	mov rp=loc0  (p6)	mov ar.pfs=r0			// clear ar.pfs on success  (p7)	br.ret.sptk.many rp @@ -118,13 +116,12 @@ GLOBAL_ENTRY(sys_clone2)  	mov loc1=r16				// save ar.pfs across do_fork  	.body  	mov out1=in1 -	mov out3=in2 +	mov out2=in2  	tbit.nz p6,p0=in0,CLONE_SETTLS_BIT -	mov out4=in3	// parent_tidptr: valid only w/CLONE_PARENT_SETTID +	mov out3=in3	// parent_tidptr: valid only w/CLONE_PARENT_SETTID  	;;  (p6)	st8 [r2]=in5				// store TLS in r16 for copy_thread() -	mov out5=in4	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID -	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = ®s +	mov out4=in4	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID  	mov out0=in0				// out0 = clone_flags  	br.call.sptk.many rp=do_fork  .ret1:	.restore sp @@ -150,13 +147,12 @@ GLOBAL_ENTRY(sys_clone)  	mov loc1=r16				// save ar.pfs across do_fork  	.body  	mov out1=in1 -	mov out3=16				// stacksize (compensates for 16-byte scratch area) +	mov out2=16				// stacksize (compensates for 16-byte scratch area)  	tbit.nz p6,p0=in0,CLONE_SETTLS_BIT -	mov out4=in2	// parent_tidptr: valid only w/CLONE_PARENT_SETTID +	mov out3=in2	// parent_tidptr: valid only w/CLONE_PARENT_SETTID  	;;  (p6)	st8 [r2]=in4				// store TLS in r13 (tp) -	mov out5=in3	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID -	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = ®s +	mov out4=in3	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID  	mov out0=in0				// out0 = clone_flags  	br.call.sptk.many rp=do_fork  .ret2:	.restore sp @@ -484,19 +480,6 @@ GLOBAL_ENTRY(prefetch_stack)  	br.ret.sptk.many rp  END(prefetch_stack) -GLOBAL_ENTRY(kernel_execve) -	rum psr.ac -	mov r15=__NR_execve			// put syscall number in place -	break __BREAK_SYSCALL -	br.ret.sptk.many rp -END(kernel_execve) - -GLOBAL_ENTRY(clone) -	mov r15=__NR_clone			// put syscall number in place -	break __BREAK_SYSCALL -	br.ret.sptk.many rp -END(clone) -  	/*  	 * Invoke a system call, but do some tracing before and after the call.  	 * We MUST preserve the current register frame throughout this routine @@ -600,6 +583,27 @@ GLOBAL_ENTRY(ia64_strace_leave_kernel)  .ret4:	br.cond.sptk ia64_leave_kernel  END(ia64_strace_leave_kernel) +ENTRY(call_payload) +	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0) +	/* call the kernel_thread payload; fn is in r4, arg - in r5 */ +	alloc loc1=ar.pfs,0,3,1,0 +	mov loc0=rp +	mov loc2=gp +	mov out0=r5		// arg +	ld8 r14 = [r4], 8	// fn.address +	;; +	mov b6 = r14 +	ld8 gp = [r4]		// fn.gp +	;; +	br.call.sptk.many rp=b6	// fn(arg) +.ret12:	mov gp=loc2 +	mov rp=loc0 +	mov ar.pfs=loc1 +	/* ... and if it has returned, we are going to userland */ +	cmp.ne pKStk,pUStk=r0,r0 +	br.ret.sptk.many rp +END(call_payload) +  GLOBAL_ENTRY(ia64_ret_from_clone)  	PT_REGS_UNWIND_INFO(0)  {	/* @@ -616,6 +620,7 @@ GLOBAL_ENTRY(ia64_ret_from_clone)  	br.call.sptk.many rp=ia64_invoke_schedule_tail  }  .ret8: +(pKStk)	br.call.sptk.many rp=call_payload  	adds r2=TI_FLAGS+IA64_TASK_SIZE,r13  	;;  	ld4 r2=[r2] diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 629a250f7c1..4738ff7bd66 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S @@ -1093,19 +1093,6 @@ GLOBAL_ENTRY(cycle_to_cputime)  END(cycle_to_cputime)  #endif /* CONFIG_VIRT_CPU_ACCOUNTING */ -GLOBAL_ENTRY(start_kernel_thread) -	.prologue -	.save rp, r0				// this is the end of the call-chain -	.body -	alloc r2 = ar.pfs, 0, 0, 2, 0 -	mov out0 = r9 -	mov out1 = r11;; -	br.call.sptk.many rp = kernel_thread_helper;; -	mov out0 = r8 -	br.call.sptk.many rp = sys_exit;; -1:	br.sptk.few 1b				// not reached -END(start_kernel_thread) -  #ifdef CONFIG_IA64_BRL_EMU  /* diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c index 35e106f2ed1..31360cbbd5f 100644 --- a/arch/ia64/kernel/process.c +++ b/arch/ia64/kernel/process.c @@ -393,72 +393,24 @@ ia64_load_extra (struct task_struct *task)  int  copy_thread(unsigned long clone_flags,  	     unsigned long user_stack_base, unsigned long user_stack_size, -	     struct task_struct *p, struct pt_regs *regs) +	     struct task_struct *p)  {  	extern char ia64_ret_from_clone;  	struct switch_stack *child_stack, *stack;  	unsigned long rbs, child_rbs, rbs_size;  	struct pt_regs *child_ptregs; +	struct pt_regs *regs = current_pt_regs();  	int retval = 0; -#ifdef CONFIG_SMP -	/* -	 * For SMP idle threads, fork_by_hand() calls do_fork with -	 * NULL regs. -	 */ -	if (!regs) -		return 0; -#endif - -	stack = ((struct switch_stack *) regs) - 1; -  	child_ptregs = (struct pt_regs *) ((unsigned long) p + IA64_STK_OFFSET) - 1;  	child_stack = (struct switch_stack *) child_ptregs - 1; -	/* copy parent's switch_stack & pt_regs to child: */ -	memcpy(child_stack, stack, sizeof(*child_ptregs) + sizeof(*child_stack)); -  	rbs = (unsigned long) current + IA64_RBS_OFFSET;  	child_rbs = (unsigned long) p + IA64_RBS_OFFSET; -	rbs_size = stack->ar_bspstore - rbs; - -	/* copy the parent's register backing store to the child: */ -	memcpy((void *) child_rbs, (void *) rbs, rbs_size); - -	if (likely(user_mode(child_ptregs))) { -		if (clone_flags & CLONE_SETTLS) -			child_ptregs->r13 = regs->r16;	/* see sys_clone2() in entry.S */ -		if (user_stack_base) { -			child_ptregs->r12 = user_stack_base + user_stack_size - 16; -			child_ptregs->ar_bspstore = user_stack_base; -			child_ptregs->ar_rnat = 0; -			child_ptregs->loadrs = 0; -		} -	} else { -		/* -		 * Note: we simply preserve the relative position of -		 * the stack pointer here.  There is no need to -		 * allocate a scratch area here, since that will have -		 * been taken care of by the caller of sys_clone() -		 * already. -		 */ -		child_ptregs->r12 = (unsigned long) child_ptregs - 16; /* kernel sp */ -		child_ptregs->r13 = (unsigned long) p;		/* set `current' pointer */ -	} -	child_stack->ar_bspstore = child_rbs + rbs_size; -	child_stack->b0 = (unsigned long) &ia64_ret_from_clone;  	/* copy parts of thread_struct: */  	p->thread.ksp = (unsigned long) child_stack - 16; -	/* stop some PSR bits from being inherited. -	 * the psr.up/psr.pp bits must be cleared on fork but inherited on execve() -	 * therefore we must specify them explicitly here and not include them in -	 * IA64_PSR_BITS_TO_CLEAR. -	 */ -	child_ptregs->cr_ipsr = ((child_ptregs->cr_ipsr | IA64_PSR_BITS_TO_SET) -				 & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_PP | IA64_PSR_UP)); -  	/*  	 * NOTE: The calling convention considers all floating point  	 * registers in the high partition (fph) to be scratch.  Since @@ -480,8 +432,66 @@ copy_thread(unsigned long clone_flags,  #	define THREAD_FLAGS_TO_SET	0  	p->thread.flags = ((current->thread.flags & ~THREAD_FLAGS_TO_CLEAR)  			   | THREAD_FLAGS_TO_SET); +  	ia64_drop_fpu(p);	/* don't pick up stale state from a CPU's fph */ +	if (unlikely(p->flags & PF_KTHREAD)) { +		if (unlikely(!user_stack_base)) { +			/* fork_idle() called us */ +			return 0; +		} +		memset(child_stack, 0, sizeof(*child_ptregs) + sizeof(*child_stack)); +		child_stack->r4 = user_stack_base;	/* payload */ +		child_stack->r5 = user_stack_size;	/* argument */ +		/* +		 * Preserve PSR bits, except for bits 32-34 and 37-45, +		 * which we can't read. +		 */ +		child_ptregs->cr_ipsr = ia64_getreg(_IA64_REG_PSR) | IA64_PSR_BN; +		/* mark as valid, empty frame */ +		child_ptregs->cr_ifs = 1UL << 63; +		child_stack->ar_fpsr = child_ptregs->ar_fpsr +			= ia64_getreg(_IA64_REG_AR_FPSR); +		child_stack->pr = (1 << PRED_KERNEL_STACK); +		child_stack->ar_bspstore = child_rbs; +		child_stack->b0 = (unsigned long) &ia64_ret_from_clone; + +		/* stop some PSR bits from being inherited. +		 * the psr.up/psr.pp bits must be cleared on fork but inherited on execve() +		 * therefore we must specify them explicitly here and not include them in +		 * IA64_PSR_BITS_TO_CLEAR. +		 */ +		child_ptregs->cr_ipsr = ((child_ptregs->cr_ipsr | IA64_PSR_BITS_TO_SET) +				 & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_PP | IA64_PSR_UP)); + +		return 0; +	} +	stack = ((struct switch_stack *) regs) - 1; +	/* copy parent's switch_stack & pt_regs to child: */ +	memcpy(child_stack, stack, sizeof(*child_ptregs) + sizeof(*child_stack)); + +	/* copy the parent's register backing store to the child: */ +	rbs_size = stack->ar_bspstore - rbs; +	memcpy((void *) child_rbs, (void *) rbs, rbs_size); +	if (clone_flags & CLONE_SETTLS) +		child_ptregs->r13 = regs->r16;	/* see sys_clone2() in entry.S */ +	if (user_stack_base) { +		child_ptregs->r12 = user_stack_base + user_stack_size - 16; +		child_ptregs->ar_bspstore = user_stack_base; +		child_ptregs->ar_rnat = 0; +		child_ptregs->loadrs = 0; +	} +	child_stack->ar_bspstore = child_rbs + rbs_size; +	child_stack->b0 = (unsigned long) &ia64_ret_from_clone; + +	/* stop some PSR bits from being inherited. +	 * the psr.up/psr.pp bits must be cleared on fork but inherited on execve() +	 * therefore we must specify them explicitly here and not include them in +	 * IA64_PSR_BITS_TO_CLEAR. +	 */ +	child_ptregs->cr_ipsr = ((child_ptregs->cr_ipsr | IA64_PSR_BITS_TO_SET) +				 & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_PP | IA64_PSR_UP)); +  #ifdef CONFIG_PERFMON  	if (current->thread.pfm_context)  		pfm_inherit(p, child_ptregs); @@ -608,57 +618,6 @@ dump_fpu (struct pt_regs *pt, elf_fpregset_t dst)  	return 1;	/* f0-f31 are always valid so we always return 1 */  } -long -sys_execve (const char __user *filename, -	    const char __user *const __user *argv, -	    const char __user *const __user *envp, -	    struct pt_regs *regs) -{ -	struct filename *fname; -	int error; - -	fname = getname(filename); -	error = PTR_ERR(fname); -	if (IS_ERR(fname)) -		goto out; -	error = do_execve(fname->name, argv, envp, regs); -	putname(fname); -out: -	return error; -} - -pid_t -kernel_thread (int (*fn)(void *), void *arg, unsigned long flags) -{ -	extern void start_kernel_thread (void); -	unsigned long *helper_fptr = (unsigned long *) &start_kernel_thread; -	struct { -		struct switch_stack sw; -		struct pt_regs pt; -	} regs; - -	memset(®s, 0, sizeof(regs)); -	regs.pt.cr_iip = helper_fptr[0];	/* set entry point (IP) */ -	regs.pt.r1 = helper_fptr[1];		/* set GP */ -	regs.pt.r9 = (unsigned long) fn;	/* 1st argument */ -	regs.pt.r11 = (unsigned long) arg;	/* 2nd argument */ -	/* Preserve PSR bits, except for bits 32-34 and 37-45, which we can't read.  */ -	regs.pt.cr_ipsr = ia64_getreg(_IA64_REG_PSR) | IA64_PSR_BN; -	regs.pt.cr_ifs = 1UL << 63;		/* mark as valid, empty frame */ -	regs.sw.ar_fpsr = regs.pt.ar_fpsr = ia64_getreg(_IA64_REG_AR_FPSR); -	regs.sw.ar_bspstore = (unsigned long) current + IA64_RBS_OFFSET; -	regs.sw.pr = (1 << PRED_KERNEL_STACK); -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s.pt, 0, NULL, NULL); -} -EXPORT_SYMBOL(kernel_thread); - -/* This gets called from kernel_thread() via ia64_invoke_thread_helper().  */ -int -kernel_thread_helper (int (*fn)(void *), void *arg) -{ -	return (*fn)(arg); -} -  /*   * Flush thread state.  This is called when a thread does an execve().   */ diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c index 963d2db53bf..6a368cb2043 100644 --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c @@ -460,11 +460,6 @@ start_secondary (void *unused)  	return 0;  } -struct pt_regs * __cpuinit idle_regs(struct pt_regs *regs) -{ -	return NULL; -} -  static int __cpuinit  do_boot_cpu (int sapicid, int cpu, struct task_struct *idle)  { diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index f6388216080..b1995efbfd2 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c @@ -83,7 +83,7 @@ static struct clocksource *itc_clocksource;  extern cputime_t cycle_to_cputime(u64 cyc); -static void vtime_account_user(struct task_struct *tsk) +void vtime_account_user(struct task_struct *tsk)  {  	cputime_t delta_utime;  	struct thread_info *ti = task_thread_info(tsk); @@ -100,18 +100,11 @@ static void vtime_account_user(struct task_struct *tsk)   * accumulated times to the current process, and to prepare accounting on   * the next process.   */ -void vtime_task_switch(struct task_struct *prev) +void arch_vtime_task_switch(struct task_struct *prev)  {  	struct thread_info *pi = task_thread_info(prev);  	struct thread_info *ni = task_thread_info(current); -	if (idle_task(smp_processor_id()) != prev) -		vtime_account_system(prev); -	else -		vtime_account_idle(prev); - -	vtime_account_user(prev); -  	pi->ac_stamp = ni->ac_stamp;  	ni->ac_stime = ni->ac_utime = 0;  } @@ -126,6 +119,8 @@ static cputime_t vtime_delta(struct task_struct *tsk)  	cputime_t delta_stime;  	__u64 now; +	WARN_ON_ONCE(!irqs_disabled()); +  	now = ia64_get_itc();  	delta_stime = cycle_to_cputime(ti->ac_stime + (now - ti->ac_stamp)); @@ -147,15 +142,6 @@ void vtime_account_idle(struct task_struct *tsk)  	account_idle_time(vtime_delta(tsk));  } -/* - * Called from the timer interrupt handler to charge accumulated user time - * to the current process.  Must be called with interrupts disabled. - */ -void account_process_tick(struct task_struct *p, int user_tick) -{ -	vtime_account_user(p); -} -  #endif /* CONFIG_VIRT_CPU_ACCOUNTING */  static irqreturn_t diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c index c64460b9c70..dc00b2c1b42 100644 --- a/arch/ia64/kernel/topology.c +++ b/arch/ia64/kernel/topology.c @@ -275,7 +275,7 @@ static struct attribute * cache_default_attrs[] = {  #define to_object(k) container_of(k, struct cache_info, kobj)  #define to_attr(a) container_of(a, struct cache_attr, attr) -static ssize_t cache_show(struct kobject * kobj, struct attribute * attr, char * buf) +static ssize_t ia64_cache_show(struct kobject * kobj, struct attribute * attr, char * buf)  {  	struct cache_attr *fattr = to_attr(attr);  	struct cache_info *this_leaf = to_object(kobj); @@ -286,7 +286,7 @@ static ssize_t cache_show(struct kobject * kobj, struct attribute * attr, char *  }  static const struct sysfs_ops cache_sysfs_ops = { -	.show   = cache_show +	.show   = ia64_cache_show  };  static struct kobj_type cache_ktype = { diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig index f807721e19a..5183f43a2cf 100644 --- a/arch/m32r/Kconfig +++ b/arch/m32r/Kconfig @@ -15,6 +15,8 @@ config M32R  	select GENERIC_ATOMIC64  	select ARCH_USES_GETTIMEOFFSET  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  config SBUS  	bool diff --git a/arch/m32r/include/asm/Kbuild b/arch/m32r/include/asm/Kbuild index 50bbf387b2f..4bc8ae73e08 100644 --- a/arch/m32r/include/asm/Kbuild +++ b/arch/m32r/include/asm/Kbuild @@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm  generic-y += clkdev.h  generic-y += exec.h  generic-y += module.h +generic-y += trace_clock.h diff --git a/arch/m32r/include/asm/processor.h b/arch/m32r/include/asm/processor.h index da17253b573..5767367550c 100644 --- a/arch/m32r/include/asm/processor.h +++ b/arch/m32r/include/asm/processor.h @@ -118,11 +118,6 @@ struct mm_struct;  /* Free all resources held by a thread. */  extern void release_thread(struct task_struct *); -/* - * create a kernel thread without removing it from tasklists - */ -extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); -  /* Copy and release all segment info associated with a VM */  extern void copy_segments(struct task_struct *p, struct mm_struct * mm);  extern void release_segments(struct mm_struct * mm); diff --git a/arch/m32r/include/asm/ptrace.h b/arch/m32r/include/asm/ptrace.h index 4313aa62b51..c4432f1fb2c 100644 --- a/arch/m32r/include/asm/ptrace.h +++ b/arch/m32r/include/asm/ptrace.h @@ -139,6 +139,8 @@ extern void withdraw_debug_trap(struct pt_regs *regs);  #define task_pt_regs(task) \          ((struct pt_regs *)(task_stack_page(task) + THREAD_SIZE) - 1) +#define current_pt_regs() ((struct pt_regs *) \ +	((unsigned long)current_thread_info() + THREAD_SIZE) - 1)  #endif /* __KERNEL */ diff --git a/arch/m32r/include/asm/signal.h b/arch/m32r/include/asm/signal.h index ea5f95e4079..e4d2e2ad5f1 100644 --- a/arch/m32r/include/asm/signal.h +++ b/arch/m32r/include/asm/signal.h @@ -149,10 +149,6 @@ typedef struct sigaltstack {  #undef __HAVE_ARCH_SIG_BITOPS -struct pt_regs; - -#define ptrace_signal_deliver(regs, cookie)	do { } while (0) -  #endif /* __KERNEL__ */  #endif  /* _ASM_M32R_SIGNAL_H */ diff --git a/arch/m32r/include/asm/socket.h b/arch/m32r/include/asm/socket.h index a15f40b5278..5e7088a2672 100644 --- a/arch/m32r/include/asm/socket.h +++ b/arch/m32r/include/asm/socket.h @@ -40,6 +40,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER        26  #define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		28  #define SO_TIMESTAMP		29 diff --git a/arch/m32r/include/asm/unistd.h b/arch/m32r/include/asm/unistd.h index d5e66a48078..d9e7351af2a 100644 --- a/arch/m32r/include/asm/unistd.h +++ b/arch/m32r/include/asm/unistd.h @@ -352,6 +352,10 @@  #define __ARCH_WANT_SYS_OLDUMOUNT  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_CLONE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK  #define __IGNORE_lchown  #define __IGNORE_setuid diff --git a/arch/m32r/kernel/entry.S b/arch/m32r/kernel/entry.S index 225412bc227..0c01543f10c 100644 --- a/arch/m32r/kernel/entry.S +++ b/arch/m32r/kernel/entry.S @@ -125,6 +125,15 @@  	and	\reg, sp  	.endm +ENTRY(ret_from_kernel_thread) +	pop	r0 +	bl	schedule_tail +	GET_THREAD_INFO(r8) +	ld	r0, R0(r8) +	ld	r1, R1(r8) +	jl	r1 +	bra	syscall_exit +  ENTRY(ret_from_fork)  	pop	r0  	bl	schedule_tail diff --git a/arch/m32r/kernel/m32r_ksyms.c b/arch/m32r/kernel/m32r_ksyms.c index 700570747a9..b727e693c80 100644 --- a/arch/m32r/kernel/m32r_ksyms.c +++ b/arch/m32r/kernel/m32r_ksyms.c @@ -21,7 +21,6 @@ EXPORT_SYMBOL(boot_cpu_data);  EXPORT_SYMBOL(dump_fpu);  EXPORT_SYMBOL(__ioremap);  EXPORT_SYMBOL(iounmap); -EXPORT_SYMBOL(kernel_thread);  EXPORT_SYMBOL(strncpy_from_user);  EXPORT_SYMBOL(__strncpy_from_user); diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c index e7366276ef3..765d0f57c78 100644 --- a/arch/m32r/kernel/process.c +++ b/arch/m32r/kernel/process.c @@ -165,41 +165,6 @@ void show_regs(struct pt_regs * regs)  }  /* - * Create a kernel thread - */ - -/* - * This is the mechanism for creating a new kernel thread. - * - * NOTE! Only a kernel-only process(ie the swapper or direct descendants - * who haven't done an "execve()") should use this: it will work within - * a system call from a "real" process, but the process memory space will - * not be free'd until both the parent and the child have exited. - */ -static void kernel_thread_helper(void *nouse, int (*fn)(void *), void *arg) -{ -	fn(arg); -	do_exit(-1); -} - -int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof (regs)); -	regs.r1 = (unsigned long)fn; -	regs.r2 = (unsigned long)arg; - -	regs.bpc = (unsigned long)kernel_thread_helper; - -	regs.psw = M32R_PSW_BIE; - -	/* Ok, create the new process. */ -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, -		NULL); -} - -/*   * Free current thread data structures etc..   */  void exit_thread(void) @@ -227,88 +192,31 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)  }  int copy_thread(unsigned long clone_flags, unsigned long spu, -	unsigned long unused, struct task_struct *tsk, struct pt_regs *regs) +	unsigned long arg, struct task_struct *tsk)  {  	struct pt_regs *childregs = task_pt_regs(tsk);  	extern void ret_from_fork(void); +	extern void ret_from_kernel_thread(void); -	/* Copy registers */ -	*childregs = *regs; - -	childregs->spu = spu; -	childregs->r0 = 0;	/* Child gets zero as return value */ -	regs->r0 = tsk->pid; +	if (unlikely(tsk->flags & PF_KTHREAD)) { +		memset(childregs, 0, sizeof(struct pt_regs)); +		childregs->psw = M32R_PSW_BIE; +		childregs->r1 = spu;	/* fn */ +		childregs->r0 = arg; +		tsk->thread.lr = (unsigned long)ret_from_kernel_thread; +	} else { +		/* Copy registers */ +		*childregs = *current_pt_regs(); +		if (spu) +			childregs->spu = spu; +		childregs->r0 = 0;	/* Child gets zero as return value */ +		tsk->thread.lr = (unsigned long)ret_from_fork; +	}  	tsk->thread.sp = (unsigned long)childregs; -	tsk->thread.lr = (unsigned long)ret_from_fork;  	return 0;  } -asmlinkage int sys_fork(unsigned long r0, unsigned long r1, unsigned long r2, -	unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6, -	struct pt_regs regs) -{ -#ifdef CONFIG_MMU -	return do_fork(SIGCHLD, regs.spu, ®s, 0, NULL, NULL); -#else -	return -EINVAL; -#endif /* CONFIG_MMU */ -} - -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, -			 unsigned long parent_tidptr, -			 unsigned long child_tidptr, -			 unsigned long r4, unsigned long r5, unsigned long r6, -			 struct pt_regs regs) -{ -	if (!newsp) -		newsp = regs.spu; - -	return do_fork(clone_flags, newsp, ®s, 0, -		       (int __user *)parent_tidptr, (int __user *)child_tidptr); -} - -/* - * This is trivial, and on the face of it looks like it - * could equally well be done in user mode. - * - * Not so, for quite unobvious reasons - register pressure. - * In user mode vfork() cannot have a stack frame, and if - * done by calling the "clone()" system call directly, you - * do not have enough call-clobbered registers to hold all - * the information you need. - */ -asmlinkage int sys_vfork(unsigned long r0, unsigned long r1, unsigned long r2, -	unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6, -	struct pt_regs regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.spu, ®s, 0, -			NULL, NULL); -} - -/* - * sys_execve() executes a new program. - */ -asmlinkage int sys_execve(const char __user *ufilename, -			  const char __user *const __user *uargv, -			  const char __user *const __user *uenvp, -			  unsigned long r3, unsigned long r4, unsigned long r5, -			  unsigned long r6, struct pt_regs regs) -{ -	int error; -	struct filename *filename; - -	filename = getname(ufilename); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; - -	error = do_execve(filename->name, uargv, uenvp, ®s); -	putname(filename); -out: -	return error; -} -  /*   * These bracket the sleeping functions..   */ diff --git a/arch/m32r/kernel/sys_m32r.c b/arch/m32r/kernel/sys_m32r.c index d841fb6cc70..c3fdd632fba 100644 --- a/arch/m32r/kernel/sys_m32r.c +++ b/arch/m32r/kernel/sys_m32r.c @@ -88,24 +88,3 @@ asmlinkage int sys_cachectl(char *addr, int nbytes, int op)  	/* Not implemented yet. */  	return -ENOSYS;  } - -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	register long __scno __asm__ ("r7") = __NR_execve; -	register long __arg3 __asm__ ("r2") = (long)(envp); -	register long __arg2 __asm__ ("r1") = (long)(argv); -	register long __res __asm__ ("r0") = (long)(filename); -	__asm__ __volatile__ ( -		"trap #" SYSCALL_VECTOR "|| nop" -		: "=r" (__res) -		: "r" (__scno), "0" (__res), "r" (__arg2), -			"r" (__arg3) -		: "memory"); -	return __res; -} diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index e7c161433ea..953a7ba5d05 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -16,6 +16,7 @@ config M68K  	select ARCH_WANT_IPC_PARSE_VERSION  	select ARCH_USES_GETTIMEOFFSET if MMU && !COLDFIRE  	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  	select HAVE_MOD_ARCH_SPECIFIC  	select MODULES_USE_ELF_REL  	select MODULES_USE_ELF_RELA diff --git a/arch/m68k/emu/nfcon.c b/arch/m68k/emu/nfcon.c index 16d170f53bf..6685bf45c2c 100644 --- a/arch/m68k/emu/nfcon.c +++ b/arch/m68k/emu/nfcon.c @@ -120,8 +120,6 @@ static int __init nfcon_init(void)  {  	int res; -	tty_port_init(&nfcon_tty_port); -  	stderr_id = nf_get_id("NF_STDERR");  	if (!stderr_id)  		return -ENODEV; @@ -130,6 +128,8 @@ static int __init nfcon_init(void)  	if (!nfcon_tty_driver)  		return -ENOMEM; +	tty_port_init(&nfcon_tty_port); +  	nfcon_tty_driver->driver_name = "nfcon";  	nfcon_tty_driver->name = "nfcon";  	nfcon_tty_driver->type = TTY_DRIVER_TYPE_SYSTEM; @@ -143,6 +143,7 @@ static int __init nfcon_init(void)  	if (res) {  		pr_err("failed to register nfcon tty driver\n");  		put_tty_driver(nfcon_tty_driver); +		tty_port_destroy(&nfcon_tty_port);  		return res;  	} @@ -157,6 +158,7 @@ static void __exit nfcon_exit(void)  	unregister_console(&nf_console);  	tty_unregister_driver(nfcon_tty_driver);  	put_tty_driver(nfcon_tty_driver); +	tty_port_destroy(&nfcon_tty_port);  }  module_init(nfcon_init); diff --git a/arch/m68k/include/asm/Kbuild b/arch/m68k/include/asm/Kbuild index 88fa3ac86fa..7f1949c0e08 100644 --- a/arch/m68k/include/asm/Kbuild +++ b/arch/m68k/include/asm/Kbuild @@ -24,6 +24,7 @@ generic-y += sections.h  generic-y += siginfo.h  generic-y += statfs.h  generic-y += topology.h +generic-y += trace_clock.h  generic-y += types.h  generic-y += word-at-a-time.h  generic-y += xor.h diff --git a/arch/m68k/include/asm/signal.h b/arch/m68k/include/asm/signal.h index 2df26b57c26..9c8c46b06b0 100644 --- a/arch/m68k/include/asm/signal.h +++ b/arch/m68k/include/asm/signal.h @@ -86,11 +86,9 @@ static inline int sigfindinword(unsigned long word)  #endif /* !CONFIG_CPU_HAS_NO_BITFIELDS */ -#ifdef __uClinux__ -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -#else -struct pt_regs; -extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie); +#ifndef __uClinux__ +extern void ptrace_signal_deliver(void); +#define ptrace_signal_deliver ptrace_signal_deliver  #endif /* __uClinux__ */  #endif /* _M68K_SIGNAL_H */ diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h index 5fc7f7bec1c..a021d67cdd7 100644 --- a/arch/m68k/include/asm/unistd.h +++ b/arch/m68k/include/asm/unistd.h @@ -32,7 +32,8 @@  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND  #define __ARCH_WANT_SYS_EXECVE -#define __ARCH_WANT_KERNEL_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK  /*   * "Conditional" syscalls diff --git a/arch/m68k/include/uapi/asm/socket.h b/arch/m68k/include/uapi/asm/socket.h index d1be684edf9..285da3b6ad9 100644 --- a/arch/m68k/include/uapi/asm/socket.h +++ b/arch/m68k/include/uapi/asm/socket.h @@ -40,6 +40,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER        26  #define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME             28  #define SO_TIMESTAMP		29 diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S index 946cb018775..a78f5649e8d 100644 --- a/arch/m68k/kernel/entry.S +++ b/arch/m68k/kernel/entry.S @@ -44,34 +44,29 @@  .globl system_call, buserr, trap, resume  .globl sys_call_table -.globl sys_fork, sys_clone, sys_vfork +.globl __sys_fork, __sys_clone, __sys_vfork  .globl ret_from_interrupt, bad_interrupt  .globl auto_irqhandler_fixup  .globl user_irqvec_fixup  .text -ENTRY(sys_fork) +ENTRY(__sys_fork)  	SAVE_SWITCH_STACK -	pea	%sp@(SWITCH_STACK_SIZE) -	jbsr	m68k_fork -	addql	#4,%sp -	RESTORE_SWITCH_STACK +	jbsr	sys_fork +	lea     %sp@(24),%sp  	rts -ENTRY(sys_clone) +ENTRY(__sys_clone)  	SAVE_SWITCH_STACK  	pea	%sp@(SWITCH_STACK_SIZE)  	jbsr	m68k_clone -	addql	#4,%sp -	RESTORE_SWITCH_STACK +	lea     %sp@(28),%sp  	rts -ENTRY(sys_vfork) +ENTRY(__sys_vfork)  	SAVE_SWITCH_STACK -	pea	%sp@(SWITCH_STACK_SIZE) -	jbsr	m68k_vfork -	addql	#4,%sp -	RESTORE_SWITCH_STACK +	jbsr	sys_vfork +	lea     %sp@(24),%sp  	rts  ENTRY(sys_sigreturn) @@ -115,16 +110,9 @@ ENTRY(ret_from_kernel_thread)  	| a3 contains the kernel thread payload, d7 - its argument  	movel	%d1,%sp@-  	jsr	schedule_tail -	GET_CURRENT(%d0)  	movel	%d7,(%sp)  	jsr	%a3@  	addql	#4,%sp -	movel	%d0,(%sp) -	jra	sys_exit - -ENTRY(ret_from_kernel_execve) -	movel	4(%sp), %sp -	GET_CURRENT(%d0)  	jra	ret_from_exception  #if defined(CONFIG_COLDFIRE) || !defined(CONFIG_MMU) diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c index c51bb172e14..d538694ad20 100644 --- a/arch/m68k/kernel/process.c +++ b/arch/m68k/kernel/process.c @@ -136,57 +136,35 @@ void flush_thread(void)  }  /* - * "m68k_fork()".. By the time we get here, the - * non-volatile registers have also been saved on the - * stack. We do some ugly pointer stuff here.. (see - * also copy_thread) + * Why not generic sys_clone, you ask?  m68k passes all arguments on stack. + * And we need all registers saved, which means a bunch of stuff pushed + * on top of pt_regs, which means that sys_clone() arguments would be + * buried.  We could, of course, copy them, but it's too costly for no + * good reason - generic clone() would have to copy them *again* for + * do_fork() anyway.  So in this case it's actually better to pass pt_regs * + * and extract arguments for do_fork() from there.  Eventually we might + * go for calling do_fork() directly from the wrapper, but only after we + * are finished with do_fork() prototype conversion.   */ - -asmlinkage int m68k_fork(struct pt_regs *regs) -{ -#ifdef CONFIG_MMU -	return do_fork(SIGCHLD, rdusp(), regs, 0, NULL, NULL); -#else -	return -EINVAL; -#endif -} - -asmlinkage int m68k_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), regs, 0, -		       NULL, NULL); -} -  asmlinkage int m68k_clone(struct pt_regs *regs)  { -	unsigned long clone_flags; -	unsigned long newsp; -	int __user *parent_tidptr, *child_tidptr; - -	/* syscall2 puts clone_flags in d1 and usp in d2 */ -	clone_flags = regs->d1; -	newsp = regs->d2; -	parent_tidptr = (int __user *)regs->d3; -	child_tidptr = (int __user *)regs->d4; -	if (!newsp) -		newsp = rdusp(); -	return do_fork(clone_flags, newsp, regs, 0, -		       parent_tidptr, child_tidptr); +	/* regs will be equal to current_pt_regs() */ +	return do_fork(regs->d1, regs->d2, 0, +		       (int __user *)regs->d3, (int __user *)regs->d4);  }  int copy_thread(unsigned long clone_flags, unsigned long usp, -		 unsigned long arg, -		 struct task_struct * p, struct pt_regs * regs) +		 unsigned long arg, struct task_struct *p)  { -	struct pt_regs * childregs; -	struct switch_stack *childstack; +	struct fork_frame { +		struct switch_stack sw; +		struct pt_regs regs; +	} *frame; -	childregs = (struct pt_regs *) (task_stack_page(p) + THREAD_SIZE) - 1; -	childstack = ((struct switch_stack *) childregs) - 1; +	frame = (struct fork_frame *) (task_stack_page(p) + THREAD_SIZE) - 1; -	p->thread.usp = usp; -	p->thread.ksp = (unsigned long)childstack; -	p->thread.esp0 = (unsigned long)childregs; +	p->thread.ksp = (unsigned long)frame; +	p->thread.esp0 = (unsigned long)&frame->regs;  	/*  	 * Must save the current SFC/DFC value, NOT the value when @@ -194,25 +172,24 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	 */  	p->thread.fs = get_fs().seg; -	if (unlikely(!regs)) { +	if (unlikely(p->flags & PF_KTHREAD)) {  		/* kernel thread */ -		memset(childstack, 0, -			sizeof(struct switch_stack) + sizeof(struct pt_regs)); -		childregs->sr = PS_S; -		childstack->a3 = usp; /* function */ -		childstack->d7 = arg; -		childstack->retpc = (unsigned long)ret_from_kernel_thread; +		memset(frame, 0, sizeof(struct fork_frame)); +		frame->regs.sr = PS_S; +		frame->sw.a3 = usp; /* function */ +		frame->sw.d7 = arg; +		frame->sw.retpc = (unsigned long)ret_from_kernel_thread;  		p->thread.usp = 0;  		return 0;  	} -	*childregs = *regs; -	childregs->d0 = 0; - -	*childstack = ((struct switch_stack *) regs)[-1]; -	childstack->retpc = (unsigned long)ret_from_fork; +	memcpy(frame, container_of(current_pt_regs(), struct fork_frame, regs), +		sizeof(struct fork_frame)); +	frame->regs.d0 = 0; +	frame->sw.retpc = (unsigned long)ret_from_fork; +	p->thread.usp = usp ?: rdusp();  	if (clone_flags & CLONE_SETTLS) -		task_thread_info(p)->tp_value = regs->d5; +		task_thread_info(p)->tp_value = frame->regs.d5;  #ifdef CONFIG_FPU  	if (!FPU_IS_EMU) { diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c index 710a528b928..9a396cda314 100644 --- a/arch/m68k/kernel/signal.c +++ b/arch/m68k/kernel/signal.c @@ -108,8 +108,9 @@ int handle_kernel_fault(struct pt_regs *regs)  	return 1;  } -void ptrace_signal_deliver(struct pt_regs *regs, void *cookie) +void ptrace_signal_deliver(void)  { +	struct pt_regs *regs = signal_pt_regs();  	if (regs->orig_d0 < 0)  		return;  	switch (regs->d0) { diff --git a/arch/m68k/kernel/syscalltable.S b/arch/m68k/kernel/syscalltable.S index 4fc2e29b771..c30da5b3f2d 100644 --- a/arch/m68k/kernel/syscalltable.S +++ b/arch/m68k/kernel/syscalltable.S @@ -22,7 +22,7 @@ ALIGN  ENTRY(sys_call_table)  	.long sys_restart_syscall	/* 0 - old "setup()" system call, used for restarting */  	.long sys_exit -	.long sys_fork +	.long __sys_fork  	.long sys_read  	.long sys_write  	.long sys_open			/* 5 */ @@ -140,7 +140,7 @@ ENTRY(sys_call_table)  	.long sys_ipc  	.long sys_fsync  	.long sys_sigreturn -	.long sys_clone			/* 120 */ +	.long __sys_clone		/* 120 */  	.long sys_setdomainname  	.long sys_newuname  	.long sys_cacheflush		/* modify_ldt for i386 */ @@ -210,7 +210,7 @@ ENTRY(sys_call_table)  	.long sys_sendfile  	.long sys_ni_syscall		/* streams1 */  	.long sys_ni_syscall		/* streams2 */ -	.long sys_vfork			/* 190 */ +	.long __sys_vfork		/* 190 */  	.long sys_getrlimit  	.long sys_mmap2  	.long sys_truncate64 diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 4cba7439f9d..4bcf89148f3 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -26,6 +26,9 @@ config MICROBLAZE  	select GENERIC_ATOMIC64  	select GENERIC_CLOCKEVENTS  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE +	select CLONE_BACKWARDS  config SWAP  	def_bool n diff --git a/arch/microblaze/Makefile b/arch/microblaze/Makefile index b23c40eb7a5..d26fb905ee0 100644 --- a/arch/microblaze/Makefile +++ b/arch/microblaze/Makefile @@ -57,7 +57,7 @@ boot := arch/microblaze/boot  DTB:=$(subst simpleImage.,,$(filter simpleImage.%, $(MAKECMDGOALS)))  ifneq ($(DTB),) -	core-y	+= $(boot)/ +	core-y	+= $(boot)/dts/  endif  # defines filename extension depending memory management type diff --git a/arch/microblaze/boot/Makefile b/arch/microblaze/boot/Makefile index fa83ea497db..80fe54fb7ca 100644 --- a/arch/microblaze/boot/Makefile +++ b/arch/microblaze/boot/Makefile @@ -2,21 +2,10 @@  # arch/microblaze/boot/Makefile  # -obj-y += linked_dtb.o -  targets := linux.bin linux.bin.gz simpleImage.%  OBJCOPYFLAGS := -R .note -R .comment -R .note.gnu.build-id -O binary -# Ensure system.dtb exists -$(obj)/linked_dtb.o: $(obj)/system.dtb - -# Generate system.dtb from $(DTB).dtb -ifneq ($(DTB),system) -$(obj)/system.dtb: $(obj)/$(DTB).dtb -	$(call if_changed,cp) -endif -  $(obj)/linux.bin: vmlinux FORCE  	$(call if_changed,objcopy)  	$(call if_changed,uimage) @@ -45,10 +34,4 @@ $(obj)/simpleImage.%: vmlinux FORCE  	@echo 'Kernel: $@ is ready' ' (#'`cat .version`')' -# Rule to build device tree blobs -DTC_FLAGS := -p 1024 - -$(obj)/%.dtb: $(src)/dts/%.dts FORCE -	$(call if_changed_dep,dtc) - -clean-files += *.dtb simpleImage.*.unstrip linux.bin.ub +clean-files += simpleImage.*.unstrip linux.bin.ub diff --git a/arch/microblaze/boot/dts/Makefile b/arch/microblaze/boot/dts/Makefile new file mode 100644 index 00000000000..c3b3a5d67b8 --- /dev/null +++ b/arch/microblaze/boot/dts/Makefile @@ -0,0 +1,22 @@ +# +# arch/microblaze/boot/Makefile +# + +obj-y += linked_dtb.o + +# Ensure system.dtb exists +$(obj)/linked_dtb.o: $(obj)/system.dtb + +# Generate system.dtb from $(DTB).dtb +ifneq ($(DTB),system) +$(obj)/system.dtb: $(obj)/$(DTB).dtb +	$(call if_changed,cp) +endif + +quiet_cmd_cp = CP      $< $@$2 +	cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) + +# Rule to build device tree blobs +DTC_FLAGS := -p 1024 + +clean-files += *.dtb diff --git a/arch/microblaze/boot/dts/linked_dtb.S b/arch/microblaze/boot/dts/linked_dtb.S new file mode 100644 index 00000000000..23345af3721 --- /dev/null +++ b/arch/microblaze/boot/dts/linked_dtb.S @@ -0,0 +1,2 @@ +.section __fdt_blob,"a" +.incbin "arch/microblaze/boot/dts/system.dtb" diff --git a/arch/microblaze/boot/linked_dtb.S b/arch/microblaze/boot/linked_dtb.S deleted file mode 100644 index cb2b537aebe..00000000000 --- a/arch/microblaze/boot/linked_dtb.S +++ /dev/null @@ -1,3 +0,0 @@ -.section __fdt_blob,"a" -.incbin "arch/microblaze/boot/system.dtb" - diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild index 8653072d7e9..eb3a46c096f 100644 --- a/arch/microblaze/include/asm/Kbuild +++ b/arch/microblaze/include/asm/Kbuild @@ -3,3 +3,5 @@ include include/asm-generic/Kbuild.asm  header-y  += elf.h  generic-y += clkdev.h  generic-y += exec.h +generic-y += trace_clock.h +generic-y += syscalls.h diff --git a/arch/microblaze/include/asm/processor.h b/arch/microblaze/include/asm/processor.h index af2bb965239..0759153e811 100644 --- a/arch/microblaze/include/asm/processor.h +++ b/arch/microblaze/include/asm/processor.h @@ -31,6 +31,7 @@ extern const struct seq_operations cpuinfo_op;  void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long usp);  extern void ret_from_fork(void); +extern void ret_from_kernel_thread(void);  # endif /* __ASSEMBLY__ */ @@ -78,11 +79,6 @@ extern unsigned long thread_saved_pc(struct task_struct *t);  extern unsigned long get_wchan(struct task_struct *p); -/* - * create a kernel thread without removing it from tasklists - */ -extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -  # define KSTK_EIP(tsk)	(0)  # define KSTK_ESP(tsk)	(0) @@ -131,8 +127,6 @@ extern inline void release_thread(struct task_struct *dead_task)  {  } -extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -  /* Free current thread data structures etc.  */  static inline void exit_thread(void)  { diff --git a/arch/microblaze/include/asm/syscalls.h b/arch/microblaze/include/asm/syscalls.h deleted file mode 100644 index 27f2f4c0f39..00000000000 --- a/arch/microblaze/include/asm/syscalls.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __ASM_MICROBLAZE_SYSCALLS_H - -asmlinkage long microblaze_vfork(struct pt_regs *regs); -asmlinkage long microblaze_clone(int flags, unsigned long stack, -							struct pt_regs *regs); -asmlinkage long microblaze_execve(const char __user *filenamei, -				  const char __user *const __user *argv, -				  const char __user *const __user *envp, -				  struct pt_regs *regs); - -asmlinkage long sys_clone(int flags, unsigned long stack, struct pt_regs *regs); -#define sys_clone sys_clone - -#include <asm-generic/syscalls.h> - -#endif /* __ASM_MICROBLAZE_SYSCALLS_H */ diff --git a/arch/microblaze/include/asm/unistd.h b/arch/microblaze/include/asm/unistd.h index 6985e6e9d82..94d978986b7 100644 --- a/arch/microblaze/include/asm/unistd.h +++ b/arch/microblaze/include/asm/unistd.h @@ -422,6 +422,12 @@  #define __ARCH_WANT_SYS_SIGPROCMASK  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_CLONE +#define __ARCH_WANT_SYS_VFORK +#ifdef CONFIG_MMU +#define __ARCH_WANT_SYS_FORK +#endif  /*   * "Conditional" syscalls diff --git a/arch/microblaze/kernel/entry-nommu.S b/arch/microblaze/kernel/entry-nommu.S index 75c3ea1f48a..cb0327f204a 100644 --- a/arch/microblaze/kernel/entry-nommu.S +++ b/arch/microblaze/kernel/entry-nommu.S @@ -474,6 +474,14 @@ ENTRY(ret_from_fork)  	brid	ret_to_user  	nop +ENTRY(ret_from_kernel_thread) +	brlid	r15, schedule_tail +	addk	r5, r0, r3 +	brald	r15, r20 +	addk	r5, r0, r19 +	brid	ret_to_user +	addk	r3, r0, r0 +  work_pending:  	enable_irq @@ -551,18 +559,6 @@ no_work_pending:  	rtid	r14, 0  	nop -sys_vfork: -	brid	microblaze_vfork -	addk	r5, r1, r0 - -sys_clone: -	brid	microblaze_clone -	addk	r7, r1, r0 - -sys_execve: -	brid	microblaze_execve -	addk	r8, r1, r0 -  sys_rt_sigreturn_wrapper:  	brid	sys_rt_sigreturn  	addk	r5, r1, r0 diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index 03f7b8ce6b6..c217367dfc7 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S @@ -293,24 +293,6 @@ C_ENTRY(_user_exception):  	swi	r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */  	addi	r14, r14, 4	/* return address is 4 byte after call */ -	mfs	r1, rmsr -	nop -	andi	r1, r1, MSR_UMS -	bnei	r1, 1f - -/* Kernel-mode state save - kernel execve */ -	lwi	r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* Reload kernel stack-ptr*/ -	tophys(r1,r1); - -	addik	r1, r1, -PT_SIZE; /* Make room on the stack. */ -	SAVE_REGS - -	swi	r1, r1, PT_MODE; /* pt_regs -> kernel mode */ -	brid	2f; -	nop;				/* Fill delay slot */ - -/* User-mode state save.  */ -1:  	lwi	r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */  	tophys(r1,r1);  	lwi	r1, r1, TS_THREAD_INFO;	/* get stack from task_struct */ @@ -460,18 +442,6 @@ TRAP_return:		/* Make global symbol for debugging */  	nop; -/* These syscalls need access to the struct pt_regs on the stack, so we -   implement them in assembly (they're basically all wrappers anyway).  */ - -C_ENTRY(sys_fork_wrapper): -	addi	r5, r0, SIGCHLD			/* Arg 0: flags */ -	lwi	r6, r1, PT_R1	/* Arg 1: child SP (use parent's) */ -	addik	r7, r1, 0			/* Arg 2: parent context */ -	add	r8, r0, r0			/* Arg 3: (unused) */ -	add	r9, r0, r0;			/* Arg 4: (unused) */ -	brid	do_fork		/* Do real work (tail-call) */ -	add	r10, r0, r0;			/* Arg 5: (unused) */ -  /* This the initial entry point for a new child thread, with an appropriate     stack in place that makes it look the the child is in the middle of an     syscall.  This function is actually `returned to' from switch_thread @@ -479,28 +449,19 @@ C_ENTRY(sys_fork_wrapper):     saved context).  */  C_ENTRY(ret_from_fork):  	bralid	r15, schedule_tail; /* ...which is schedule_tail's arg */ -	add	r3, r5, r0;	/* switch_thread returns the prev task */ +	add	r5, r3, r0;	/* switch_thread returns the prev task */  				/* ( in the delay slot ) */  	brid	ret_from_trap;	/* Do normal trap return */  	add	r3, r0, r0;	/* Child's fork call should return 0. */ -C_ENTRY(sys_vfork): -	brid	microblaze_vfork	/* Do real work (tail-call) */ -	addik	r5, r1, 0 - -C_ENTRY(sys_clone): -	bnei	r6, 1f;			/* See if child SP arg (arg 1) is 0. */ -	lwi	r6, r1, PT_R1;	/* If so, use paret's stack ptr */ -1:	addik	r7, r1, 0;			/* Arg 2: parent context */ -	lwi     r9, r1, PT_R8;          /* parent tid.  */ -	lwi     r10, r1, PT_R9;         /* child tid.  */ -	/* do_fork will pick up TLS from regs->r10.  */ -	brid	do_fork		/* Do real work (tail-call) */ -	add     r8, r0, r0;             /* Arg 3: (unused) */ - -C_ENTRY(sys_execve): -	brid	microblaze_execve;	/* Do real work (tail-call).*/ -	addik	r8, r1, 0;		/* add user context as 4th arg */ +C_ENTRY(ret_from_kernel_thread): +	bralid	r15, schedule_tail; /* ...which is schedule_tail's arg */ +	add	r5, r3, r0;	/* switch_thread returns the prev task */ +				/* ( in the delay slot ) */ +	brald	r15, r20	/* fn was left in r20 */ +	addk	r5, r0, r19	/* ... and argument - in r19 */ +	brid	ret_from_trap +	add	r3, r0, r0  C_ENTRY(sys_rt_sigreturn_wrapper):  	brid	sys_rt_sigreturn	/* Do real work */ diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c index 1944e00f07e..40823fd1db0 100644 --- a/arch/microblaze/kernel/process.c +++ b/arch/microblaze/kernel/process.c @@ -13,6 +13,7 @@  #include <linux/pm.h>  #include <linux/tick.h>  #include <linux/bitops.h> +#include <linux/ptrace.h>  #include <asm/pgalloc.h>  #include <asm/uaccess.h> /* for USER_DS macros */  #include <asm/cacheflush.h> @@ -119,46 +120,38 @@ void flush_thread(void)  }  int copy_thread(unsigned long clone_flags, unsigned long usp, -		unsigned long unused, -		struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  {  	struct pt_regs *childregs = task_pt_regs(p);  	struct thread_info *ti = task_thread_info(p); -	*childregs = *regs; -	if (user_mode(regs)) +	if (unlikely(p->flags & PF_KTHREAD)) { +		/* if we're creating a new kernel thread then just zeroing all +		 * the registers. That's OK for a brand new thread.*/ +		memset(childregs, 0, sizeof(struct pt_regs)); +		memset(&ti->cpu_context, 0, sizeof(struct cpu_context)); +		ti->cpu_context.r1  = (unsigned long)childregs; +		ti->cpu_context.r20 = (unsigned long)usp; /* fn */ +		ti->cpu_context.r19 = (unsigned long)arg; +		childregs->pt_mode = 1; +		local_save_flags(childregs->msr); +#ifdef CONFIG_MMU +		ti->cpu_context.msr = childregs->msr & ~MSR_IE; +#endif +		ti->cpu_context.r15 = (unsigned long)ret_from_kernel_thread - 8; +		return 0; +	} +	*childregs = *current_pt_regs(); +	if (usp)  		childregs->r1 = usp; -	else -		childregs->r1 = ((unsigned long) ti) + THREAD_SIZE; -#ifndef CONFIG_MMU  	memset(&ti->cpu_context, 0, sizeof(struct cpu_context));  	ti->cpu_context.r1 = (unsigned long)childregs; +#ifndef CONFIG_MMU  	ti->cpu_context.msr = (unsigned long)childregs->msr;  #else +	childregs->msr |= MSR_UMS; -	/* if creating a kernel thread then update the current reg (we don't -	 * want to use the parent's value when restoring by POP_STATE) */ -	if (kernel_mode(regs)) -		/* save new current on stack to use POP_STATE */ -		childregs->CURRENT_TASK = (unsigned long)p; -	/* if returning to user then use the parent's value of this register */ - -	/* if we're creating a new kernel thread then just zeroing all -	 * the registers. That's OK for a brand new thread.*/ -	/* Pls. note that some of them will be restored in POP_STATE */ -	if (kernel_mode(regs)) -		memset(&ti->cpu_context, 0, sizeof(struct cpu_context)); -	/* if this thread is created for fork/vfork/clone, then we want to -	 * restore all the parent's context */ -	/* in addition to the registers which will be restored by POP_STATE */ -	else { -		ti->cpu_context = *(struct cpu_context *)regs; -		childregs->msr |= MSR_UMS; -	} - -	/* FIXME STATE_SAVE_PT_OFFSET; */ -	ti->cpu_context.r1  = (unsigned long)childregs;  	/* we should consider the fact that childregs is a copy of the parent  	 * regs which were saved immediately after entering the kernel state  	 * before enabling VM. This MSR will be restored in switch_to and @@ -209,29 +202,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk)  }  #endif -static void kernel_thread_helper(int (*fn)(void *), void *arg) -{ -	fn(arg); -	do_exit(-1); -} - -int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); -	/* store them in non-volatile registers */ -	regs.r5 = (unsigned long)fn; -	regs.r6 = (unsigned long)arg; -	local_save_flags(regs.msr); -	regs.pc = (unsigned long)kernel_thread_helper; -	regs.pt_mode = 1; - -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, -			®s, 0, NULL, NULL); -} -EXPORT_SYMBOL_GPL(kernel_thread); -  unsigned long get_wchan(struct task_struct *p)  {  /* TBD (used by procfs) */ @@ -246,6 +216,7 @@ void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long usp)  	regs->pt_mode = 0;  #ifdef CONFIG_MMU  	regs->msr |= MSR_UMS; +	regs->msr &= ~MSR_VM;  #endif  } diff --git a/arch/microblaze/kernel/signal.c b/arch/microblaze/kernel/signal.c index 3847e5b9c60..3903e3d11f5 100644 --- a/arch/microblaze/kernel/signal.c +++ b/arch/microblaze/kernel/signal.c @@ -111,7 +111,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)  	/* It is more difficult to avoid calling this function than to  	 call it and ignore errors. */ -	if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->r1)) +	if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->r1) == -EFAULT)  		goto badframe;  	return rval; diff --git a/arch/microblaze/kernel/sys_microblaze.c b/arch/microblaze/kernel/sys_microblaze.c index 404c0f24bd4..63647c586b4 100644 --- a/arch/microblaze/kernel/sys_microblaze.c +++ b/arch/microblaze/kernel/sys_microblaze.c @@ -34,38 +34,6 @@  #include <asm/syscalls.h> -asmlinkage long microblaze_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->r1, -						regs, 0, NULL, NULL); -} - -asmlinkage long microblaze_clone(int flags, unsigned long stack, -							struct pt_regs *regs) -{ -	if (!stack) -		stack = regs->r1; -	return do_fork(flags, stack, regs, 0, NULL, NULL); -} - -asmlinkage long microblaze_execve(const char __user *filenamei, -				  const char __user *const __user *argv, -				  const char __user *const __user *envp, -				  struct pt_regs *regs) -{ -	int error; -	struct filename *filename; - -	filename = getname(filenamei); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = do_execve(filename->name, argv, envp, regs); -	putname(filename); -out: -	return error; -} -  asmlinkage long sys_mmap(unsigned long addr, unsigned long len,  			unsigned long prot, unsigned long flags,  			unsigned long fd, off_t pgoff) @@ -75,24 +43,3 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,  	return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT);  } - -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	register const char *__a __asm__("r5") = filename; -	register const void *__b __asm__("r6") = argv; -	register const void *__c __asm__("r7") = envp; -	register unsigned long __syscall __asm__("r12") = __NR_execve; -	register unsigned long __ret __asm__("r3"); -	__asm__ __volatile__ ("brki r14, 0x8" -			: "=r" (__ret), "=r" (__syscall) -			: "1" (__syscall), "r" (__a), "r" (__b), "r" (__c) -			: "r4", "r8", "r9", -			"r10", "r11", "r14", "cc", "memory"); -	return __ret; -} diff --git a/arch/microblaze/kernel/syscall_table.S b/arch/microblaze/kernel/syscall_table.S index 6a2b294ef6d..ff6431e5468 100644 --- a/arch/microblaze/kernel/syscall_table.S +++ b/arch/microblaze/kernel/syscall_table.S @@ -2,11 +2,7 @@ ENTRY(sys_call_table)  	.long sys_restart_syscall	/* 0 - old "setup()" system call,  					 * used for restarting */  	.long sys_exit -#ifdef CONFIG_MMU -	.long sys_fork_wrapper -#else -	.long sys_ni_syscall -#endif +	.long sys_fork  	.long sys_read  	.long sys_write  	.long sys_open			/* 5 */ diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index 4dbb5055d04..a1c5b996d66 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -1346,8 +1346,6 @@ void __init pcibios_resource_survey(void)  	pci_assign_unassigned_resources();  } -#ifdef CONFIG_HOTPLUG -  /* This is used by the PCI hotplug driver to allocate resource   * of newly plugged busses. We can try to consolidate with the   * rest of the code later, for now, keep it as-is as our main @@ -1407,8 +1405,6 @@ void pcibios_finish_adding_to_bus(struct pci_bus *bus)  }  EXPORT_SYMBOL_GPL(pcibios_finish_adding_to_bus); -#endif /* CONFIG_HOTPLUG */ -  int pcibios_enable_device(struct pci_dev *dev, int mask)  {  	return pci_enable_resources(dev, mask); diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index dba9390d37c..4183e62f178 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -40,6 +40,8 @@ config MIPS  	select HAVE_MOD_ARCH_SPECIFIC  	select MODULES_USE_ELF_REL  	select MODULES_USE_ELF_RELA if 64BIT +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  menu "Machine selection" diff --git a/arch/mips/alchemy/common/Makefile b/arch/mips/alchemy/common/Makefile index 407ebc00e66..cb83d8d21ae 100644 --- a/arch/mips/alchemy/common/Makefile +++ b/arch/mips/alchemy/common/Makefile @@ -6,7 +6,7 @@  #  obj-y += prom.o time.o clocks.o platform.o power.o setup.o \ -	sleeper.o dma.o dbdma.o vss.o irq.o +	sleeper.o dma.o dbdma.o vss.o irq.o usb.o  # optional gpiolib support  ifeq ($(CONFIG_ALCHEMY_GPIO_INDIRECT),) diff --git a/arch/mips/alchemy/common/platform.c b/arch/mips/alchemy/common/platform.c index c0f3ce6dcb5..7af941d8e71 100644 --- a/arch/mips/alchemy/common/platform.c +++ b/arch/mips/alchemy/common/platform.c @@ -17,6 +17,8 @@  #include <linux/platform_device.h>  #include <linux/serial_8250.h>  #include <linux/slab.h> +#include <linux/usb/ehci_pdriver.h> +#include <linux/usb/ohci_pdriver.h>  #include <asm/mach-au1x00/au1000.h>  #include <asm/mach-au1x00/au1xxx_dbdma.h> @@ -122,6 +124,53 @@ static void __init alchemy_setup_uarts(int ctype)  static u64 alchemy_ohci_dmamask = DMA_BIT_MASK(32);  static u64 __maybe_unused alchemy_ehci_dmamask = DMA_BIT_MASK(32); +/* Power on callback for the ehci platform driver */ +static int alchemy_ehci_power_on(struct platform_device *pdev) +{ +	return alchemy_usb_control(ALCHEMY_USB_EHCI0, 1); +} + +/* Power off/suspend callback for the ehci platform driver */ +static void alchemy_ehci_power_off(struct platform_device *pdev) +{ +	alchemy_usb_control(ALCHEMY_USB_EHCI0, 0); +} + +static struct usb_ehci_pdata alchemy_ehci_pdata = { +	.no_io_watchdog	= 1, +	.power_on	= alchemy_ehci_power_on, +	.power_off	= alchemy_ehci_power_off, +	.power_suspend	= alchemy_ehci_power_off, +}; + +/* Power on callback for the ohci platform driver */ +static int alchemy_ohci_power_on(struct platform_device *pdev) +{ +	int unit; + +	unit = (pdev->id == 1) ? +		ALCHEMY_USB_OHCI1 : ALCHEMY_USB_OHCI0; + +	return alchemy_usb_control(unit, 1); +} + +/* Power off/suspend callback for the ohci platform driver */ +static void alchemy_ohci_power_off(struct platform_device *pdev) +{ +	int unit; + +	unit = (pdev->id == 1) ? +		ALCHEMY_USB_OHCI1 : ALCHEMY_USB_OHCI0; + +	alchemy_usb_control(unit, 0); +} + +static struct usb_ohci_pdata alchemy_ohci_pdata = { +	.power_on		= alchemy_ohci_power_on, +	.power_off		= alchemy_ohci_power_off, +	.power_suspend		= alchemy_ohci_power_off, +}; +  static unsigned long alchemy_ohci_data[][2] __initdata = {  	[ALCHEMY_CPU_AU1000] = { AU1000_USB_OHCI_PHYS_ADDR, AU1000_USB_HOST_INT },  	[ALCHEMY_CPU_AU1500] = { AU1000_USB_OHCI_PHYS_ADDR, AU1500_USB_HOST_INT }, @@ -169,9 +218,10 @@ static void __init alchemy_setup_usb(int ctype)  	res[1].start = alchemy_ohci_data[ctype][1];  	res[1].end = res[1].start;  	res[1].flags = IORESOURCE_IRQ; -	pdev->name = "au1xxx-ohci"; +	pdev->name = "ohci-platform";  	pdev->id = 0;  	pdev->dev.dma_mask = &alchemy_ohci_dmamask; +	pdev->dev.platform_data = &alchemy_ohci_pdata;  	if (platform_device_register(pdev))  		printk(KERN_INFO "Alchemy USB: cannot add OHCI0\n"); @@ -188,9 +238,10 @@ static void __init alchemy_setup_usb(int ctype)  		res[1].start = alchemy_ehci_data[ctype][1];  		res[1].end = res[1].start;  		res[1].flags = IORESOURCE_IRQ; -		pdev->name = "au1xxx-ehci"; +		pdev->name = "ehci-platform";  		pdev->id = 0;  		pdev->dev.dma_mask = &alchemy_ehci_dmamask; +		pdev->dev.platform_data = &alchemy_ehci_pdata;  		if (platform_device_register(pdev))  			printk(KERN_INFO "Alchemy USB: cannot add EHCI0\n"); @@ -207,9 +258,10 @@ static void __init alchemy_setup_usb(int ctype)  		res[1].start = AU1300_USB_INT;  		res[1].end = res[1].start;  		res[1].flags = IORESOURCE_IRQ; -		pdev->name = "au1xxx-ohci"; +		pdev->name = "ohci-platform";  		pdev->id = 1;  		pdev->dev.dma_mask = &alchemy_ohci_dmamask; +		pdev->dev.platform_data = &alchemy_ohci_pdata;  		if (platform_device_register(pdev))  			printk(KERN_INFO "Alchemy USB: cannot add OHCI1\n"); diff --git a/arch/mips/alchemy/common/usb.c b/arch/mips/alchemy/common/usb.c new file mode 100644 index 00000000000..936af8359fb --- /dev/null +++ b/arch/mips/alchemy/common/usb.c @@ -0,0 +1,614 @@ +/* + * USB block power/access management abstraction. + * + * Au1000+: The OHCI block control register is at the far end of the OHCI memory + *	    area. Au1550 has OHCI on different base address. No need to handle + *	    UDC here. + * Au1200:  one register to control access and clocks to O/EHCI, UDC and OTG + *	    as well as the PHY for EHCI and UDC. + * + */ + +#include <linux/init.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/spinlock.h> +#include <linux/syscore_ops.h> +#include <asm/mach-au1x00/au1000.h> + +/* control register offsets */ +#define AU1000_OHCICFG	0x7fffc +#define AU1550_OHCICFG	0x07ffc +#define AU1200_USBCFG	0x04 + +/* Au1000 USB block config bits */ +#define USBHEN_RD	(1 << 4)		/* OHCI reset-done indicator */ +#define USBHEN_CE	(1 << 3)		/* OHCI block clock enable */ +#define USBHEN_E	(1 << 2)		/* OHCI block enable */ +#define USBHEN_C	(1 << 1)		/* OHCI block coherency bit */ +#define USBHEN_BE	(1 << 0)		/* OHCI Big-Endian */ + +/* Au1200 USB config bits */ +#define USBCFG_PFEN	(1 << 31)		/* prefetch enable (undoc) */ +#define USBCFG_RDCOMB	(1 << 30)		/* read combining (undoc) */ +#define USBCFG_UNKNOWN	(5 << 20)		/* unknown, leave this way */ +#define USBCFG_SSD	(1 << 23)		/* serial short detect en */ +#define USBCFG_PPE	(1 << 19)		/* HS PHY PLL */ +#define USBCFG_UCE	(1 << 18)		/* UDC clock enable */ +#define USBCFG_ECE	(1 << 17)		/* EHCI clock enable */ +#define USBCFG_OCE	(1 << 16)		/* OHCI clock enable */ +#define USBCFG_FLA(x)	(((x) & 0x3f) << 8) +#define USBCFG_UCAM	(1 << 7)		/* coherent access (undoc) */ +#define USBCFG_GME	(1 << 6)		/* OTG mem access */ +#define USBCFG_DBE	(1 << 5)		/* UDC busmaster enable */ +#define USBCFG_DME	(1 << 4)		/* UDC mem enable */ +#define USBCFG_EBE	(1 << 3)		/* EHCI busmaster enable */ +#define USBCFG_EME	(1 << 2)		/* EHCI mem enable */ +#define USBCFG_OBE	(1 << 1)		/* OHCI busmaster enable */ +#define USBCFG_OME	(1 << 0)		/* OHCI mem enable */ +#define USBCFG_INIT_AU1200	(USBCFG_PFEN | USBCFG_RDCOMB | USBCFG_UNKNOWN |\ +				 USBCFG_SSD | USBCFG_FLA(0x20) | USBCFG_UCAM | \ +				 USBCFG_GME | USBCFG_DBE | USBCFG_DME |	       \ +				 USBCFG_EBE | USBCFG_EME | USBCFG_OBE |	       \ +				 USBCFG_OME) + +/* Au1300 USB config registers */ +#define USB_DWC_CTRL1		0x00 +#define USB_DWC_CTRL2		0x04 +#define USB_VBUS_TIMER		0x10 +#define USB_SBUS_CTRL		0x14 +#define USB_MSR_ERR		0x18 +#define USB_DWC_CTRL3		0x1C +#define USB_DWC_CTRL4		0x20 +#define USB_OTG_STATUS		0x28 +#define USB_DWC_CTRL5		0x2C +#define USB_DWC_CTRL6		0x30 +#define USB_DWC_CTRL7		0x34 +#define USB_PHY_STATUS		0xC0 +#define USB_INT_STATUS		0xC4 +#define USB_INT_ENABLE		0xC8 + +#define USB_DWC_CTRL1_OTGD	0x04 /* set to DISable OTG */ +#define USB_DWC_CTRL1_HSTRS	0x02 /* set to ENable EHCI */ +#define USB_DWC_CTRL1_DCRS	0x01 /* set to ENable UDC */ + +#define USB_DWC_CTRL2_PHY1RS	0x04 /* set to enable PHY1 */ +#define USB_DWC_CTRL2_PHY0RS	0x02 /* set to enable PHY0 */ +#define USB_DWC_CTRL2_PHYRS	0x01 /* set to enable PHY */ + +#define USB_DWC_CTRL3_OHCI1_CKEN	(1 << 19) +#define USB_DWC_CTRL3_OHCI0_CKEN	(1 << 18) +#define USB_DWC_CTRL3_EHCI0_CKEN	(1 << 17) +#define USB_DWC_CTRL3_OTG0_CKEN		(1 << 16) + +#define USB_SBUS_CTRL_SBCA		0x04 /* coherent access */ + +#define USB_INTEN_FORCE			0x20 +#define USB_INTEN_PHY			0x10 +#define USB_INTEN_UDC			0x08 +#define USB_INTEN_EHCI			0x04 +#define USB_INTEN_OHCI1			0x02 +#define USB_INTEN_OHCI0			0x01 + +static DEFINE_SPINLOCK(alchemy_usb_lock); + +static inline void __au1300_usb_phyctl(void __iomem *base, int enable) +{ +	unsigned long r, s; + +	r = __raw_readl(base + USB_DWC_CTRL2); +	s = __raw_readl(base + USB_DWC_CTRL3); + +	s &= USB_DWC_CTRL3_OHCI1_CKEN | USB_DWC_CTRL3_OHCI0_CKEN | +		USB_DWC_CTRL3_EHCI0_CKEN | USB_DWC_CTRL3_OTG0_CKEN; + +	if (enable) { +		/* simply enable all PHYs */ +		r |= USB_DWC_CTRL2_PHY1RS | USB_DWC_CTRL2_PHY0RS | +		     USB_DWC_CTRL2_PHYRS; +		__raw_writel(r, base + USB_DWC_CTRL2); +		wmb(); +	} else if (!s) { +		/* no USB block active, do disable all PHYs */ +		r &= ~(USB_DWC_CTRL2_PHY1RS | USB_DWC_CTRL2_PHY0RS | +		       USB_DWC_CTRL2_PHYRS); +		__raw_writel(r, base + USB_DWC_CTRL2); +		wmb(); +	} +} + +static inline void __au1300_ohci_control(void __iomem *base, int enable, int id) +{ +	unsigned long r; + +	if (enable) { +		__raw_writel(1, base + USB_DWC_CTRL7);  /* start OHCI clock */ +		wmb(); + +		r = __raw_readl(base + USB_DWC_CTRL3);	/* enable OHCI block */ +		r |= (id == 0) ? USB_DWC_CTRL3_OHCI0_CKEN +			       : USB_DWC_CTRL3_OHCI1_CKEN; +		__raw_writel(r, base + USB_DWC_CTRL3); +		wmb(); + +		__au1300_usb_phyctl(base, enable);	/* power up the PHYs */ + +		r = __raw_readl(base + USB_INT_ENABLE); +		r |= (id == 0) ? USB_INTEN_OHCI0 : USB_INTEN_OHCI1; +		__raw_writel(r, base + USB_INT_ENABLE); +		wmb(); + +		/* reset the OHCI start clock bit */ +		__raw_writel(0, base + USB_DWC_CTRL7); +		wmb(); +	} else { +		r = __raw_readl(base + USB_INT_ENABLE); +		r &= ~((id == 0) ? USB_INTEN_OHCI0 : USB_INTEN_OHCI1); +		__raw_writel(r, base + USB_INT_ENABLE); +		wmb(); + +		r = __raw_readl(base + USB_DWC_CTRL3); +		r &= ~((id == 0) ? USB_DWC_CTRL3_OHCI0_CKEN +				 : USB_DWC_CTRL3_OHCI1_CKEN); +		__raw_writel(r, base + USB_DWC_CTRL3); +		wmb(); + +		__au1300_usb_phyctl(base, enable); +	} +} + +static inline void __au1300_ehci_control(void __iomem *base, int enable) +{ +	unsigned long r; + +	if (enable) { +		r = __raw_readl(base + USB_DWC_CTRL3); +		r |= USB_DWC_CTRL3_EHCI0_CKEN; +		__raw_writel(r, base + USB_DWC_CTRL3); +		wmb(); + +		r = __raw_readl(base + USB_DWC_CTRL1); +		r |= USB_DWC_CTRL1_HSTRS; +		__raw_writel(r, base + USB_DWC_CTRL1); +		wmb(); + +		__au1300_usb_phyctl(base, enable); + +		r = __raw_readl(base + USB_INT_ENABLE); +		r |= USB_INTEN_EHCI; +		__raw_writel(r, base + USB_INT_ENABLE); +		wmb(); +	} else { +		r = __raw_readl(base + USB_INT_ENABLE); +		r &= ~USB_INTEN_EHCI; +		__raw_writel(r, base + USB_INT_ENABLE); +		wmb(); + +		r = __raw_readl(base + USB_DWC_CTRL1); +		r &= ~USB_DWC_CTRL1_HSTRS; +		__raw_writel(r, base + USB_DWC_CTRL1); +		wmb(); + +		r = __raw_readl(base + USB_DWC_CTRL3); +		r &= ~USB_DWC_CTRL3_EHCI0_CKEN; +		__raw_writel(r, base + USB_DWC_CTRL3); +		wmb(); + +		__au1300_usb_phyctl(base, enable); +	} +} + +static inline void __au1300_udc_control(void __iomem *base, int enable) +{ +	unsigned long r; + +	if (enable) { +		r = __raw_readl(base + USB_DWC_CTRL1); +		r |= USB_DWC_CTRL1_DCRS; +		__raw_writel(r, base + USB_DWC_CTRL1); +		wmb(); + +		__au1300_usb_phyctl(base, enable); + +		r = __raw_readl(base + USB_INT_ENABLE); +		r |= USB_INTEN_UDC; +		__raw_writel(r, base + USB_INT_ENABLE); +		wmb(); +	} else { +		r = __raw_readl(base + USB_INT_ENABLE); +		r &= ~USB_INTEN_UDC; +		__raw_writel(r, base + USB_INT_ENABLE); +		wmb(); + +		r = __raw_readl(base + USB_DWC_CTRL1); +		r &= ~USB_DWC_CTRL1_DCRS; +		__raw_writel(r, base + USB_DWC_CTRL1); +		wmb(); + +		__au1300_usb_phyctl(base, enable); +	} +} + +static inline void __au1300_otg_control(void __iomem *base, int enable) +{ +	unsigned long r; +	if (enable) { +		r = __raw_readl(base + USB_DWC_CTRL3); +		r |= USB_DWC_CTRL3_OTG0_CKEN; +		__raw_writel(r, base + USB_DWC_CTRL3); +		wmb(); + +		r = __raw_readl(base + USB_DWC_CTRL1); +		r &= ~USB_DWC_CTRL1_OTGD; +		__raw_writel(r, base + USB_DWC_CTRL1); +		wmb(); + +		__au1300_usb_phyctl(base, enable); +	} else { +		r = __raw_readl(base + USB_DWC_CTRL1); +		r |= USB_DWC_CTRL1_OTGD; +		__raw_writel(r, base + USB_DWC_CTRL1); +		wmb(); + +		r = __raw_readl(base + USB_DWC_CTRL3); +		r &= ~USB_DWC_CTRL3_OTG0_CKEN; +		__raw_writel(r, base + USB_DWC_CTRL3); +		wmb(); + +		__au1300_usb_phyctl(base, enable); +	} +} + +static inline int au1300_usb_control(int block, int enable) +{ +	void __iomem *base = +		(void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR); +	int ret = 0; + +	switch (block) { +	case ALCHEMY_USB_OHCI0: +		__au1300_ohci_control(base, enable, 0); +		break; +	case ALCHEMY_USB_OHCI1: +		__au1300_ohci_control(base, enable, 1); +		break; +	case ALCHEMY_USB_EHCI0: +		__au1300_ehci_control(base, enable); +		break; +	case ALCHEMY_USB_UDC0: +		__au1300_udc_control(base, enable); +		break; +	case ALCHEMY_USB_OTG0: +		__au1300_otg_control(base, enable); +		break; +	default: +		ret = -ENODEV; +	} +	return ret; +} + +static inline void au1300_usb_init(void) +{ +	void __iomem *base = +		(void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR); + +	/* set some sane defaults.  Note: we don't fiddle with DWC_CTRL4 +	 * here at all: Port 2 routing (EHCI or UDC) must be set either +	 * by boot firmware or platform init code; I can't autodetect +	 * a sane setting. +	 */ +	__raw_writel(0, base + USB_INT_ENABLE); /* disable all USB irqs */ +	wmb(); +	__raw_writel(0, base + USB_DWC_CTRL3); /* disable all clocks */ +	wmb(); +	__raw_writel(~0, base + USB_MSR_ERR); /* clear all errors */ +	wmb(); +	__raw_writel(~0, base + USB_INT_STATUS); /* clear int status */ +	wmb(); +	/* set coherent access bit */ +	__raw_writel(USB_SBUS_CTRL_SBCA, base + USB_SBUS_CTRL); +	wmb(); +} + +static inline void __au1200_ohci_control(void __iomem *base, int enable) +{ +	unsigned long r = __raw_readl(base + AU1200_USBCFG); +	if (enable) { +		__raw_writel(r | USBCFG_OCE, base + AU1200_USBCFG); +		wmb(); +		udelay(2000); +	} else { +		__raw_writel(r & ~USBCFG_OCE, base + AU1200_USBCFG); +		wmb(); +		udelay(1000); +	} +} + +static inline void __au1200_ehci_control(void __iomem *base, int enable) +{ +	unsigned long r = __raw_readl(base + AU1200_USBCFG); +	if (enable) { +		__raw_writel(r | USBCFG_ECE | USBCFG_PPE, base + AU1200_USBCFG); +		wmb(); +		udelay(1000); +	} else { +		if (!(r & USBCFG_UCE))		/* UDC also off? */ +			r &= ~USBCFG_PPE;	/* yes: disable HS PHY PLL */ +		__raw_writel(r & ~USBCFG_ECE, base + AU1200_USBCFG); +		wmb(); +		udelay(1000); +	} +} + +static inline void __au1200_udc_control(void __iomem *base, int enable) +{ +	unsigned long r = __raw_readl(base + AU1200_USBCFG); +	if (enable) { +		__raw_writel(r | USBCFG_UCE | USBCFG_PPE, base + AU1200_USBCFG); +		wmb(); +	} else { +		if (!(r & USBCFG_ECE))		/* EHCI also off? */ +			r &= ~USBCFG_PPE;	/* yes: disable HS PHY PLL */ +		__raw_writel(r & ~USBCFG_UCE, base + AU1200_USBCFG); +		wmb(); +	} +} + +static inline int au1200_coherency_bug(void) +{ +#if defined(CONFIG_DMA_COHERENT) +	/* Au1200 AB USB does not support coherent memory */ +	if (!(read_c0_prid() & 0xff)) { +		printk(KERN_INFO "Au1200 USB: this is chip revision AB !!\n"); +		printk(KERN_INFO "Au1200 USB: update your board or re-configure" +				 " the kernel\n"); +		return -ENODEV; +	} +#endif +	return 0; +} + +static inline int au1200_usb_control(int block, int enable) +{ +	void __iomem *base = +			(void __iomem *)KSEG1ADDR(AU1200_USB_CTL_PHYS_ADDR); +	int ret = 0; + +	switch (block) { +	case ALCHEMY_USB_OHCI0: +		ret = au1200_coherency_bug(); +		if (ret && enable) +			goto out; +		__au1200_ohci_control(base, enable); +		break; +	case ALCHEMY_USB_UDC0: +		__au1200_udc_control(base, enable); +		break; +	case ALCHEMY_USB_EHCI0: +		ret = au1200_coherency_bug(); +		if (ret && enable) +			goto out; +		__au1200_ehci_control(base, enable); +		break; +	default: +		ret = -ENODEV; +	} +out: +	return ret; +} + + +/* initialize USB block(s) to a known working state */ +static inline void au1200_usb_init(void) +{ +	void __iomem *base = +			(void __iomem *)KSEG1ADDR(AU1200_USB_CTL_PHYS_ADDR); +	__raw_writel(USBCFG_INIT_AU1200, base + AU1200_USBCFG); +	wmb(); +	udelay(1000); +} + +static inline void au1000_usb_init(unsigned long rb, int reg) +{ +	void __iomem *base = (void __iomem *)KSEG1ADDR(rb + reg); +	unsigned long r = __raw_readl(base); + +#if defined(__BIG_ENDIAN) +	r |= USBHEN_BE; +#endif +	r |= USBHEN_C; + +	__raw_writel(r, base); +	wmb(); +	udelay(1000); +} + + +static inline void __au1xx0_ohci_control(int enable, unsigned long rb, int creg) +{ +	void __iomem *base = (void __iomem *)KSEG1ADDR(rb); +	unsigned long r = __raw_readl(base + creg); + +	if (enable) { +		__raw_writel(r | USBHEN_CE, base + creg); +		wmb(); +		udelay(1000); +		__raw_writel(r | USBHEN_CE | USBHEN_E, base + creg); +		wmb(); +		udelay(1000); + +		/* wait for reset complete (read reg twice: au1500 erratum) */ +		while (__raw_readl(base + creg), +			!(__raw_readl(base + creg) & USBHEN_RD)) +			udelay(1000); +	} else { +		__raw_writel(r & ~(USBHEN_CE | USBHEN_E), base + creg); +		wmb(); +	} +} + +static inline int au1000_usb_control(int block, int enable, unsigned long rb, +				     int creg) +{ +	int ret = 0; + +	switch (block) { +	case ALCHEMY_USB_OHCI0: +		__au1xx0_ohci_control(enable, rb, creg); +		break; +	default: +		ret = -ENODEV; +	} +	return ret; +} + +/* + * alchemy_usb_control - control Alchemy on-chip USB blocks + * @block:	USB block to target + * @enable:	set 1 to enable a block, 0 to disable + */ +int alchemy_usb_control(int block, int enable) +{ +	unsigned long flags; +	int ret; + +	spin_lock_irqsave(&alchemy_usb_lock, flags); +	switch (alchemy_get_cputype()) { +	case ALCHEMY_CPU_AU1000: +	case ALCHEMY_CPU_AU1500: +	case ALCHEMY_CPU_AU1100: +		ret = au1000_usb_control(block, enable, +				AU1000_USB_OHCI_PHYS_ADDR, AU1000_OHCICFG); +		break; +	case ALCHEMY_CPU_AU1550: +		ret = au1000_usb_control(block, enable, +				AU1550_USB_OHCI_PHYS_ADDR, AU1550_OHCICFG); +		break; +	case ALCHEMY_CPU_AU1200: +		ret = au1200_usb_control(block, enable); +		break; +	case ALCHEMY_CPU_AU1300: +		ret = au1300_usb_control(block, enable); +		break; +	default: +		ret = -ENODEV; +	} +	spin_unlock_irqrestore(&alchemy_usb_lock, flags); +	return ret; +} +EXPORT_SYMBOL_GPL(alchemy_usb_control); + + +static unsigned long alchemy_usb_pmdata[2]; + +static void au1000_usb_pm(unsigned long br, int creg, int susp) +{ +	void __iomem *base = (void __iomem *)KSEG1ADDR(br); + +	if (susp) { +		alchemy_usb_pmdata[0] = __raw_readl(base + creg); +		/* There appears to be some undocumented reset register.... */ +		__raw_writel(0, base + 0x04); +		wmb(); +		__raw_writel(0, base + creg); +		wmb(); +	} else { +		__raw_writel(alchemy_usb_pmdata[0], base + creg); +		wmb(); +	} +} + +static void au1200_usb_pm(int susp) +{ +	void __iomem *base = +			(void __iomem *)KSEG1ADDR(AU1200_USB_OTG_PHYS_ADDR); +	if (susp) { +		/* save OTG_CAP/MUX registers which indicate port routing */ +		/* FIXME: write an OTG driver to do that */ +		alchemy_usb_pmdata[0] = __raw_readl(base + 0x00); +		alchemy_usb_pmdata[1] = __raw_readl(base + 0x04); +	} else { +		/* restore access to all MMIO areas */ +		au1200_usb_init(); + +		/* restore OTG_CAP/MUX registers */ +		__raw_writel(alchemy_usb_pmdata[0], base + 0x00); +		__raw_writel(alchemy_usb_pmdata[1], base + 0x04); +		wmb(); +	} +} + +static void au1300_usb_pm(int susp) +{ +	void __iomem *base = +			(void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR); +	/* remember Port2 routing */ +	if (susp) { +		alchemy_usb_pmdata[0] = __raw_readl(base + USB_DWC_CTRL4); +	} else { +		au1300_usb_init(); +		__raw_writel(alchemy_usb_pmdata[0], base + USB_DWC_CTRL4); +		wmb(); +	} +} + +static void alchemy_usb_pm(int susp) +{ +	switch (alchemy_get_cputype()) { +	case ALCHEMY_CPU_AU1000: +	case ALCHEMY_CPU_AU1500: +	case ALCHEMY_CPU_AU1100: +		au1000_usb_pm(AU1000_USB_OHCI_PHYS_ADDR, AU1000_OHCICFG, susp); +		break; +	case ALCHEMY_CPU_AU1550: +		au1000_usb_pm(AU1550_USB_OHCI_PHYS_ADDR, AU1550_OHCICFG, susp); +		break; +	case ALCHEMY_CPU_AU1200: +		au1200_usb_pm(susp); +		break; +	case ALCHEMY_CPU_AU1300: +		au1300_usb_pm(susp); +		break; +	} +} + +static int alchemy_usb_suspend(void) +{ +	alchemy_usb_pm(1); +	return 0; +} + +static void alchemy_usb_resume(void) +{ +	alchemy_usb_pm(0); +} + +static struct syscore_ops alchemy_usb_pm_ops = { +	.suspend	= alchemy_usb_suspend, +	.resume		= alchemy_usb_resume, +}; + +static int __init alchemy_usb_init(void) +{ +	switch (alchemy_get_cputype()) { +	case ALCHEMY_CPU_AU1000: +	case ALCHEMY_CPU_AU1500: +	case ALCHEMY_CPU_AU1100: +		au1000_usb_init(AU1000_USB_OHCI_PHYS_ADDR, AU1000_OHCICFG); +		break; +	case ALCHEMY_CPU_AU1550: +		au1000_usb_init(AU1550_USB_OHCI_PHYS_ADDR, AU1550_OHCICFG); +		break; +	case ALCHEMY_CPU_AU1200: +		au1200_usb_init(); +		break; +	case ALCHEMY_CPU_AU1300: +		au1300_usb_init(); +		break; +	} + +	register_syscore_ops(&alchemy_usb_pm_ops); + +	return 0; +} +arch_initcall(alchemy_usb_init); diff --git a/arch/mips/ath79/dev-usb.c b/arch/mips/ath79/dev-usb.c index 072bb9be230..bd2bc108e1b 100644 --- a/arch/mips/ath79/dev-usb.c +++ b/arch/mips/ath79/dev-usb.c @@ -50,13 +50,11 @@ static u64 ath79_ehci_dmamask = DMA_BIT_MASK(32);  static struct usb_ehci_pdata ath79_ehci_pdata_v1 = {  	.has_synopsys_hc_bug	= 1, -	.port_power_off		= 1,  };  static struct usb_ehci_pdata ath79_ehci_pdata_v2 = {  	.caps_offset		= 0x100,  	.has_tt			= 1, -	.port_power_off		= 1,  };  static struct platform_device ath79_ehci_device = { diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c index d43ceff5be4..48a4c70b384 100644 --- a/arch/mips/bcm47xx/nvram.c +++ b/arch/mips/bcm47xx/nvram.c @@ -43,8 +43,8 @@ static void early_nvram_init(void)  #ifdef CONFIG_BCM47XX_SSB  	case BCM47XX_BUS_TYPE_SSB:  		mcore_ssb = &bcm47xx_bus.ssb.mipscore; -		base = mcore_ssb->flash_window; -		lim = mcore_ssb->flash_window_size; +		base = mcore_ssb->pflash.window; +		lim = mcore_ssb->pflash.window_size;  		break;  #endif  #ifdef CONFIG_BCM47XX_BCMA diff --git a/arch/mips/bcm47xx/wgt634u.c b/arch/mips/bcm47xx/wgt634u.c index e9f9ec8d443..e80d585731a 100644 --- a/arch/mips/bcm47xx/wgt634u.c +++ b/arch/mips/bcm47xx/wgt634u.c @@ -156,10 +156,10 @@ static int __init wgt634u_init(void)  					    SSB_CHIPCO_IRQ_GPIO);  		} -		wgt634u_flash_data.width = mcore->flash_buswidth; -		wgt634u_flash_resource.start = mcore->flash_window; -		wgt634u_flash_resource.end = mcore->flash_window -					   + mcore->flash_window_size +		wgt634u_flash_data.width = mcore->pflash.buswidth; +		wgt634u_flash_resource.start = mcore->pflash.window; +		wgt634u_flash_resource.end = mcore->pflash.window +					   + mcore->pflash.window_size  					   - 1;  		return platform_add_devices(wgt634u_devices,  					    ARRAY_SIZE(wgt634u_devices)); diff --git a/arch/mips/cavium-octeon/Makefile b/arch/mips/cavium-octeon/Makefile index bc96e2908f1..6e927cf20df 100644 --- a/arch/mips/cavium-octeon/Makefile +++ b/arch/mips/cavium-octeon/Makefile @@ -24,9 +24,6 @@ DTB_FILES = $(patsubst %.dts, %.dtb, $(DTS_FILES))  obj-y += $(patsubst %.dts, %.dtb.o, $(DTS_FILES)) -$(obj)/%.dtb: $(src)/%.dts FORCE -	$(call if_changed_dep,dtc) -  # Let's keep the .dtb files around in case we want to look at them.  .SECONDARY:  $(addprefix $(obj)/, $(DTB_FILES)) diff --git a/arch/mips/configs/bcm47xx_defconfig b/arch/mips/configs/bcm47xx_defconfig index b6fde2bb51b..4ca8e5c9922 100644 --- a/arch/mips/configs/bcm47xx_defconfig +++ b/arch/mips/configs/bcm47xx_defconfig @@ -473,7 +473,7 @@ CONFIG_USB_GADGET_NET2280=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_MIDI_GADGET=m  CONFIG_LEDS_CLASS=y diff --git a/arch/mips/configs/db1000_defconfig b/arch/mips/configs/db1000_defconfig index 17a36c12517..face9d26e6d 100644 --- a/arch/mips/configs/db1000_defconfig +++ b/arch/mips/configs/db1000_defconfig @@ -233,6 +233,7 @@ CONFIG_USB_EHCI_HCD=y  CONFIG_USB_EHCI_ROOT_HUB_TT=y  CONFIG_USB_EHCI_TT_NEWSCHED=y  CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PLATFORM=y  CONFIG_USB_UHCI_HCD=y  CONFIG_USB_STORAGE=y  CONFIG_NEW_LEDS=y diff --git a/arch/mips/configs/db1235_defconfig b/arch/mips/configs/db1235_defconfig index c48998ffd19..14752dde754 100644 --- a/arch/mips/configs/db1235_defconfig +++ b/arch/mips/configs/db1235_defconfig @@ -346,8 +346,10 @@ CONFIG_USB=y  CONFIG_USB_DYNAMIC_MINORS=y  CONFIG_USB_SUSPEND=y  CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD_PLATFORM=y  CONFIG_USB_EHCI_ROOT_HUB_TT=y  CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PLATFORM=y  CONFIG_USB_STORAGE=y  CONFIG_MMC=y  CONFIG_MMC_CLKGATE=y diff --git a/arch/mips/configs/gpr_defconfig b/arch/mips/configs/gpr_defconfig index 48a40aefaf5..fb64589015f 100644 --- a/arch/mips/configs/gpr_defconfig +++ b/arch/mips/configs/gpr_defconfig @@ -291,6 +291,7 @@ CONFIG_USB_MON=y  CONFIG_USB_EHCI_HCD=y  CONFIG_USB_EHCI_ROOT_HUB_TT=y  CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PLATFORM=y  CONFIG_USB_STORAGE=m  CONFIG_USB_LIBUSUAL=y  CONFIG_USB_SERIAL=y diff --git a/arch/mips/configs/ls1b_defconfig b/arch/mips/configs/ls1b_defconfig index 80cff8bea8e..7eb75543ca1 100644 --- a/arch/mips/configs/ls1b_defconfig +++ b/arch/mips/configs/ls1b_defconfig @@ -76,6 +76,7 @@ CONFIG_HID_GENERIC=m  CONFIG_USB=y  CONFIG_USB_ANNOUNCE_NEW_DEVICES=y  CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD_PLATFORM=y  # CONFIG_USB_EHCI_TT_NEWSCHED is not set  CONFIG_USB_STORAGE=m  CONFIG_USB_SERIAL=m diff --git a/arch/mips/configs/mtx1_defconfig b/arch/mips/configs/mtx1_defconfig index 46c61edcdf7..9fa8f16068d 100644 --- a/arch/mips/configs/mtx1_defconfig +++ b/arch/mips/configs/mtx1_defconfig @@ -581,6 +581,7 @@ CONFIG_USB_MON=m  CONFIG_USB_EHCI_HCD=m  CONFIG_USB_EHCI_ROOT_HUB_TT=y  CONFIG_USB_OHCI_HCD=m +CONFIG_USB_OHCI_HCD_PLATFORM=y  CONFIG_USB_UHCI_HCD=m  CONFIG_USB_U132_HCD=m  CONFIG_USB_SL811_HCD=m @@ -661,7 +662,7 @@ CONFIG_USB_GADGET_NET2280=y  CONFIG_USB_ZERO=m  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_MIDI_GADGET=m  CONFIG_MMC=m diff --git a/arch/mips/include/asm/Kbuild b/arch/mips/include/asm/Kbuild index 533053d12ce..9b54b7a403d 100644 --- a/arch/mips/include/asm/Kbuild +++ b/arch/mips/include/asm/Kbuild @@ -1 +1,2 @@  # MIPS headers +generic-y += trace_clock.h diff --git a/arch/mips/include/asm/hugetlb.h b/arch/mips/include/asm/hugetlb.h index bd94946a18f..ef99db994c2 100644 --- a/arch/mips/include/asm/hugetlb.h +++ b/arch/mips/include/asm/hugetlb.h @@ -95,7 +95,17 @@ static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,  					     pte_t *ptep, pte_t pte,  					     int dirty)  { -	return ptep_set_access_flags(vma, addr, ptep, pte, dirty); +	int changed = !pte_same(*ptep, pte); + +	if (changed) { +		set_pte_at(vma->vm_mm, addr, ptep, pte); +		/* +		 * There could be some standard sized pages in there, +		 * get them all. +		 */ +		flush_tlb_range(vma, addr, addr + HPAGE_SIZE); +	} +	return changed;  }  static inline pte_t huge_ptep_get(pte_t *ptep) diff --git a/arch/mips/include/asm/processor.h b/arch/mips/include/asm/processor.h index 5e33fabe354..d28c41e0887 100644 --- a/arch/mips/include/asm/processor.h +++ b/arch/mips/include/asm/processor.h @@ -310,8 +310,6 @@ struct task_struct;  /* Free all resources held by a thread. */  #define release_thread(thread) do { } while(0) -extern long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); -  extern unsigned long thread_saved_pc(struct task_struct *tsk);  /* diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h index 4f5da948a77..cec5e125f7e 100644 --- a/arch/mips/include/asm/ptrace.h +++ b/arch/mips/include/asm/ptrace.h @@ -61,4 +61,10 @@ static inline void die_if_kernel(const char *str, struct pt_regs *regs)  		die(str, regs);  } +#define current_pt_regs()						\ +({									\ +	unsigned long sp = (unsigned long)__builtin_frame_address(0);	\ +	(struct pt_regs *)((sp | (THREAD_SIZE - 1)) + 1 - 32) - 1;	\ +}) +  #endif /* _ASM_PTRACE_H */ diff --git a/arch/mips/include/asm/signal.h b/arch/mips/include/asm/signal.h index 880240dff8b..cf4a08062d1 100644 --- a/arch/mips/include/asm/signal.h +++ b/arch/mips/include/asm/signal.h @@ -21,6 +21,4 @@  #include <asm/sigcontext.h>  #include <asm/siginfo.h> -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -  #endif /* _ASM_SIGNAL_H */ diff --git a/arch/mips/include/asm/unistd.h b/arch/mips/include/asm/unistd.h index 9e47cc11aa2..b306e2081ca 100644 --- a/arch/mips/include/asm/unistd.h +++ b/arch/mips/include/asm/unistd.h @@ -20,6 +20,7 @@  #define __ARCH_OMIT_COMPAT_SYS_GETDENTS64  #define __ARCH_WANT_OLD_READDIR  #define __ARCH_WANT_SYS_ALARM +#define __ARCH_WANT_SYS_EXECVE  #define __ARCH_WANT_SYS_GETHOSTNAME  #define __ARCH_WANT_SYS_IPC  #define __ARCH_WANT_SYS_PAUSE diff --git a/arch/mips/include/uapi/asm/ioctls.h b/arch/mips/include/uapi/asm/ioctls.h index 92403c3d600..addd56b6069 100644 --- a/arch/mips/include/uapi/asm/ioctls.h +++ b/arch/mips/include/uapi/asm/ioctls.h @@ -86,6 +86,9 @@  #define TIOCGDEV	_IOR('T', 0x32, unsigned int) /* Get primary device node of /dev/console */  #define TIOCSIG		_IOW('T', 0x36, int)  /* Generate signal on Pty slave */  #define TIOCVHANGUP	0x5437 +#define TIOCGPKT	_IOR('T', 0x38, int) /* Get packet mode state */ +#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */ +#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */  /* I hope the range from 0x5480 on is free ... */  #define TIOCSCTTY	0x5480		/* become controlling tty */ diff --git a/arch/mips/include/uapi/asm/mman.h b/arch/mips/include/uapi/asm/mman.h index 46d3da0d4b9..9a936ac9a94 100644 --- a/arch/mips/include/uapi/asm/mman.h +++ b/arch/mips/include/uapi/asm/mman.h @@ -87,4 +87,15 @@  /* compatibility flags */  #define MAP_FILE	0 +/* + * When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size. + * This gives us 6 bits, which is enough until someone invents 128 bit address + * spaces. + * + * Assume these are all power of twos. + * When 0 use the default page size. + */ +#define MAP_HUGE_SHIFT	26 +#define MAP_HUGE_MASK	0x3f +  #endif /* _ASM_MMAN_H */ diff --git a/arch/mips/include/uapi/asm/socket.h b/arch/mips/include/uapi/asm/socket.h index c5ed59549cb..17307ab9047 100644 --- a/arch/mips/include/uapi/asm/socket.h +++ b/arch/mips/include/uapi/asm/socket.h @@ -63,6 +63,7 @@ To add: #define SO_REUSEPORT 0x0200	/* Allow local address and port reuse.  */  /* Socket filtering */  #define SO_ATTACH_FILTER        26  #define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME             28  #define SO_TIMESTAMP		29 diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index b1fb7af3c35..cce3782c96c 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c @@ -510,7 +510,6 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)  				c->cputype = CPU_R3000A;  				__cpu_name[cpu] = "R3000A";  			} -			break;  		} else {  			c->cputype = CPU_R3000;  			__cpu_name[cpu] = "R3000"; diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index a6c13321200..e5786858cdb 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S @@ -36,6 +36,11 @@ FEXPORT(ret_from_exception)  FEXPORT(ret_from_irq)  	LONG_S	s0, TI_REGS($28)  FEXPORT(__ret_from_irq) +/* + * We can be coming here from a syscall done in the kernel space, + * e.g. a failed kernel_execve(). + */ +resume_userspace_check:  	LONG_L	t0, PT_STATUS(sp)		# returning to kernel mode?  	andi	t0, t0, KU_USER  	beqz	t0, resume_kernel @@ -65,6 +70,12 @@ need_resched:  	b	need_resched  #endif +FEXPORT(ret_from_kernel_thread) +	jal	schedule_tail		# a0 = struct task_struct *prev +	move	a0, s1 +	jal	s0 +	j	syscall_exit +  FEXPORT(ret_from_fork)  	jal	schedule_tail		# a0 = struct task_struct *prev @@ -162,7 +173,7 @@ work_notifysig:				# deal with pending signals and  	move	a0, sp  	li	a1, 0  	jal	do_notify_resume	# a2 already loaded -	j	resume_userspace +	j	resume_userspace_check  FEXPORT(syscall_exit_partial)  	local_irq_disable		# make sure need_resched doesn't diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 3a21acedf88..7adab86c632 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c @@ -3,7 +3,6 @@   *   * Copyright (C) 2000 Silicon Graphics, Inc.   * Written by Ulf Carlsson (ulfc@engr.sgi.com) - * sys32_execve from ia64/ia32 code, Feb 2000, Kanoj Sarcar (kanoj@sgi.com)   */  #include <linux/compiler.h>  #include <linux/mm.h> @@ -77,26 +76,6 @@ out:  	return error;  } -/* - * sys_execve() executes a new program. - */ -asmlinkage int sys32_execve(nabi_no_regargs struct pt_regs regs) -{ -	int error; -	struct filename *filename; - -	filename = getname(compat_ptr(regs.regs[4])); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = compat_do_execve(filename->name, compat_ptr(regs.regs[5]), -				 compat_ptr(regs.regs[6]), ®s); -	putname(filename); - -out: -	return error; -} -  #define RLIM_INFINITY32	0x7fffffff  #define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x) @@ -333,7 +312,7 @@ _sys32_clone(nabi_no_regargs struct pt_regs regs)  	/* Use __dummy4 instead of getting it off the stack, so that  	   syscall() works.  */  	child_tidptr = (int __user *) __dummy4; -	return do_fork(clone_flags, newsp, ®s, 0, +	return do_fork(clone_flags, newsp, 0,  	               parent_tidptr, child_tidptr);  } diff --git a/arch/mips/kernel/mips_ksyms.c b/arch/mips/kernel/mips_ksyms.c index 3fc1691110d..2d9304c2b54 100644 --- a/arch/mips/kernel/mips_ksyms.c +++ b/arch/mips/kernel/mips_ksyms.c @@ -32,8 +32,6 @@ EXPORT_SYMBOL(memset);  EXPORT_SYMBOL(memcpy);  EXPORT_SYMBOL(memmove); -EXPORT_SYMBOL(kernel_thread); -  /*   * Functions that operate on entire pages.  Mostly used by memory management.   */ diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index e9a5fd7277f..38097652d62 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c @@ -84,6 +84,7 @@ void __noreturn cpu_idle(void)  }  asmlinkage void ret_from_fork(void); +asmlinkage void ret_from_kernel_thread(void);  void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp)  { @@ -113,10 +114,10 @@ void flush_thread(void)  }  int copy_thread(unsigned long clone_flags, unsigned long usp, -	unsigned long unused, struct task_struct *p, struct pt_regs *regs) +	unsigned long arg, struct task_struct *p)  {  	struct thread_info *ti = task_thread_info(p); -	struct pt_regs *childregs; +	struct pt_regs *childregs, *regs = current_pt_regs();  	unsigned long childksp;  	p->set_child_tid = p->clear_child_tid = NULL; @@ -136,19 +137,30 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	childregs = (struct pt_regs *) childksp - 1;  	/*  Put the stack after the struct pt_regs.  */  	childksp = (unsigned long) childregs; +	p->thread.cp0_status = read_c0_status() & ~(ST0_CU2|ST0_CU1); +	if (unlikely(p->flags & PF_KTHREAD)) { +		unsigned long status = p->thread.cp0_status; +		memset(childregs, 0, sizeof(struct pt_regs)); +		ti->addr_limit = KERNEL_DS; +		p->thread.reg16 = usp; /* fn */ +		p->thread.reg17 = arg; +		p->thread.reg29 = childksp; +		p->thread.reg31 = (unsigned long) ret_from_kernel_thread; +#if defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX) +		status = (status & ~(ST0_KUP | ST0_IEP | ST0_IEC)) | +			 ((status & (ST0_KUC | ST0_IEC)) << 2); +#else +		status |= ST0_EXL; +#endif +		childregs->cp0_status = status; +		return 0; +	}  	*childregs = *regs;  	childregs->regs[7] = 0;	/* Clear error flag */ -  	childregs->regs[2] = 0;	/* Child gets zero as return value */ +	childregs->regs[29] = usp; +	ti->addr_limit = USER_DS; -	if (childregs->cp0_status & ST0_CU0) { -		childregs->regs[28] = (unsigned long) ti; -		childregs->regs[29] = childksp; -		ti->addr_limit = KERNEL_DS; -	} else { -		childregs->regs[29] = usp; -		ti->addr_limit = USER_DS; -	}  	p->thread.reg29 = (unsigned long) childregs;  	p->thread.reg31 = (unsigned long) ret_from_fork; @@ -156,7 +168,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	 * New tasks lose permission to use the fpu. This accelerates context  	 * switching for most programs since they don't use the fpu.  	 */ -	p->thread.cp0_status = read_c0_status() & ~(ST0_CU2|ST0_CU1);  	childregs->cp0_status &= ~(ST0_CU2|ST0_CU1);  #ifdef CONFIG_MIPS_MT_SMTC @@ -222,35 +233,6 @@ int dump_task_fpu(struct task_struct *t, elf_fpregset_t *fpr)  }  /* - * Create a kernel thread - */ -static void __noreturn kernel_thread_helper(void *arg, int (*fn)(void *)) -{ -	do_exit(fn(arg)); -} - -long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); - -	regs.regs[4] = (unsigned long) arg; -	regs.regs[5] = (unsigned long) fn; -	regs.cp0_epc = (unsigned long) kernel_thread_helper; -	regs.cp0_status = read_c0_status(); -#if defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX) -	regs.cp0_status = (regs.cp0_status & ~(ST0_KUP | ST0_IEP | ST0_IEC)) | -			  ((regs.cp0_status & (ST0_KUC | ST0_IEC)) << 2); -#else -	regs.cp0_status |= ST0_EXL; -#endif - -	/* Ok, create the new process.. */ -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); -} - -/*   *   */  struct mips_frame_info { diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index f6ba8381ee0..62971914376 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S @@ -167,7 +167,7 @@ EXPORT(sysn32_call_table)  	PTR	sys_getsockopt  	PTR	sys_clone			/* 6055 */  	PTR	sys_fork -	PTR	sys32_execve +	PTR	compat_sys_execve  	PTR	sys_exit  	PTR	compat_sys_wait4  	PTR	sys_kill			/* 6060 */ @@ -397,14 +397,14 @@ EXPORT(sysn32_call_table)  	PTR	sys_timerfd_create  	PTR	compat_sys_timerfd_gettime	/* 6285 */  	PTR	compat_sys_timerfd_settime -	PTR	sys_signalfd4 +	PTR	compat_sys_signalfd4  	PTR	sys_eventfd2  	PTR	sys_epoll_create1  	PTR	sys_dup3			/* 6290 */  	PTR	sys_pipe2  	PTR	sys_inotify_init1 -	PTR	sys_preadv -	PTR	sys_pwritev +	PTR	compat_sys_preadv +	PTR	compat_sys_pwritev  	PTR	compat_sys_rt_tgsigqueueinfo	/* 6295 */  	PTR	sys_perf_event_open  	PTR	sys_accept4 diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 53c2d724576..9601be6afa3 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S @@ -203,7 +203,7 @@ sys_call_table:  	PTR	sys_creat  	PTR	sys_link  	PTR	sys_unlink			/* 4010 */ -	PTR	sys32_execve +	PTR	compat_sys_execve  	PTR	sys_chdir  	PTR	compat_sys_time  	PTR	sys_mknod diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index 2bd561bc05a..201cb76b4df 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c @@ -92,7 +92,7 @@ save_static_function(sys_fork);  static int __used noinline  _sys_fork(nabi_no_regargs struct pt_regs regs)  { -	return do_fork(SIGCHLD, regs.regs[29], ®s, 0, NULL, NULL); +	return do_fork(SIGCHLD, regs.regs[29], 0, NULL, NULL);  }  save_static_function(sys_clone); @@ -123,32 +123,10 @@ _sys_clone(nabi_no_regargs struct pt_regs regs)  #else  	child_tidptr = (int __user *) regs.regs[8];  #endif -	return do_fork(clone_flags, newsp, ®s, 0, +	return do_fork(clone_flags, newsp, 0,  	               parent_tidptr, child_tidptr);  } -/* - * sys_execve() executes a new program. - */ -asmlinkage int sys_execve(nabi_no_regargs struct pt_regs regs) -{ -	int error; -	struct filename *filename; - -	filename = getname((const char __user *) (long)regs.regs[4]); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = do_execve(filename->name, -			  (const char __user *const __user *) (long)regs.regs[5], -	                  (const char __user *const __user *) (long)regs.regs[6], -			  ®s); -	putname(filename); - -out: -	return error; -} -  SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)  {  	struct thread_info *ti = task_thread_info(current); @@ -313,34 +291,3 @@ asmlinkage void bad_stack(void)  {  	do_exit(SIGSEGV);  } - -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	register unsigned long __a0 asm("$4") = (unsigned long) filename; -	register unsigned long __a1 asm("$5") = (unsigned long) argv; -	register unsigned long __a2 asm("$6") = (unsigned long) envp; -	register unsigned long __a3 asm("$7"); -	unsigned long __v0; - -	__asm__ volatile ("					\n" -	"	.set	noreorder				\n" -	"	li	$2, %5		# __NR_execve		\n" -	"	syscall						\n" -	"	move	%0, $2					\n" -	"	.set	reorder					\n" -	: "=&r" (__v0), "=r" (__a3) -	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_execve) -	: "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", -	  "memory"); - -	if (__a3 == 0) -		return __v0; - -	return -__v0; -} diff --git a/arch/mips/lantiq/dts/Makefile b/arch/mips/lantiq/dts/Makefile index 674fca45f72..6fa72dd641b 100644 --- a/arch/mips/lantiq/dts/Makefile +++ b/arch/mips/lantiq/dts/Makefile @@ -1,4 +1 @@  obj-$(CONFIG_DT_EASY50712) := easy50712.dtb.o - -$(obj)/%.dtb: $(obj)/%.dts -	$(call if_changed,dtc) diff --git a/arch/mips/loongson1/common/platform.c b/arch/mips/loongson1/common/platform.c index e92d59c4bd7..0412ad61e29 100644 --- a/arch/mips/loongson1/common/platform.c +++ b/arch/mips/loongson1/common/platform.c @@ -13,6 +13,7 @@  #include <linux/phy.h>  #include <linux/serial_8250.h>  #include <linux/stmmac.h> +#include <linux/usb/ehci_pdriver.h>  #include <asm-generic/sizes.h>  #include <loongson1.h> @@ -107,13 +108,17 @@ static struct resource ls1x_ehci_resources[] = {  	},  }; +static struct usb_ehci_pdata ls1x_ehci_pdata = { +}; +  struct platform_device ls1x_ehci_device = { -	.name		= "ls1x-ehci", +	.name		= "ehci-platform",  	.id		= -1,  	.num_resources	= ARRAY_SIZE(ls1x_ehci_resources),  	.resource	= ls1x_ehci_resources,  	.dev		= {  		.dma_mask = &ls1x_ehci_dmamask, +		.platform_data = &ls1x_ehci_pdata,  	},  }; diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c index 302d779d5b0..d9be7540a6b 100644 --- a/arch/mips/mm/mmap.c +++ b/arch/mips/mm/mmap.c @@ -45,18 +45,6 @@ static unsigned long mmap_base(unsigned long rnd)  	return PAGE_ALIGN(TASK_SIZE - gap - rnd);  } -static inline unsigned long COLOUR_ALIGN_DOWN(unsigned long addr, -					      unsigned long pgoff) -{ -	unsigned long base = addr & ~shm_align_mask; -	unsigned long off = (pgoff << PAGE_SHIFT) & shm_align_mask; - -	if (base + off <= addr) -		return base + off; - -	return base - off; -} -  #define COLOUR_ALIGN(addr, pgoff)				\  	((((addr) + shm_align_mask) & ~shm_align_mask) +	\  	 (((pgoff) << PAGE_SHIFT) & shm_align_mask)) @@ -71,6 +59,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp,  	struct vm_area_struct *vma;  	unsigned long addr = addr0;  	int do_color_align; +	struct vm_unmapped_area_info info;  	if (unlikely(len > TASK_SIZE))  		return -ENOMEM; @@ -107,97 +96,31 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp,  			return addr;  	} -	if (dir == UP) { -		addr = mm->mmap_base; -		if (do_color_align) -			addr = COLOUR_ALIGN(addr, pgoff); -		else -			addr = PAGE_ALIGN(addr); - -		for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) { -			/* At this point:  (!vma || addr < vma->vm_end). */ -			if (TASK_SIZE - len < addr) -				return -ENOMEM; -			if (!vma || addr + len <= vma->vm_start) -				return addr; -			addr = vma->vm_end; -			if (do_color_align) -				addr = COLOUR_ALIGN(addr, pgoff); -		 } -	 } else { -		/* check if free_area_cache is useful for us */ -		if (len <= mm->cached_hole_size) { -			mm->cached_hole_size = 0; -			mm->free_area_cache = mm->mmap_base; -		} - -		/* -		 * either no address requested, or the mapping can't fit into -		 * the requested address hole -		 */ -		addr = mm->free_area_cache; -		if (do_color_align) { -			unsigned long base = -				COLOUR_ALIGN_DOWN(addr - len, pgoff); -			addr = base + len; -		} - -		/* make sure it can fit in the remaining address space */ -		if (likely(addr > len)) { -			vma = find_vma(mm, addr - len); -			if (!vma || addr <= vma->vm_start) { -				/* cache the address as a hint for next time */ -				return mm->free_area_cache = addr - len; -			} -		} - -		if (unlikely(mm->mmap_base < len)) -			goto bottomup; - -		addr = mm->mmap_base - len; -		if (do_color_align) -			addr = COLOUR_ALIGN_DOWN(addr, pgoff); - -		do { -			/* -			 * Lookup failure means no vma is above this address, -			 * else if new region fits below vma->vm_start, -			 * return with success: -			 */ -			vma = find_vma(mm, addr); -			if (likely(!vma || addr + len <= vma->vm_start)) { -				/* cache the address as a hint for next time */ -				return mm->free_area_cache = addr; -			} +	info.length = len; +	info.align_mask = do_color_align ? (PAGE_MASK & shm_align_mask) : 0; +	info.align_offset = pgoff << PAGE_SHIFT; -			/* remember the largest hole we saw so far */ -			if (addr + mm->cached_hole_size < vma->vm_start) -				mm->cached_hole_size = vma->vm_start - addr; +	if (dir == DOWN) { +		info.flags = VM_UNMAPPED_AREA_TOPDOWN; +		info.low_limit = PAGE_SIZE; +		info.high_limit = mm->mmap_base; +		addr = vm_unmapped_area(&info); -			/* try just below the current vma->vm_start */ -			addr = vma->vm_start - len; -			if (do_color_align) -				addr = COLOUR_ALIGN_DOWN(addr, pgoff); -		} while (likely(len < vma->vm_start)); +		if (!(addr & ~PAGE_MASK)) +			return addr; -bottomup:  		/*  		 * A failed mmap() very likely causes application failure,  		 * so fall back to the bottom-up function here. This scenario  		 * can happen with large stack limits and large mmap()  		 * allocations.  		 */ -		mm->cached_hole_size = ~0UL; -		mm->free_area_cache = TASK_UNMAPPED_BASE; -		addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags); -		/* -		 * Restore the topdown base: -		 */ -		mm->free_area_cache = mm->mmap_base; -		mm->cached_hole_size = ~0UL; - -		return addr;  	} + +	info.flags = 0; +	info.low_limit = mm->mmap_base; +	info.high_limit = TASK_SIZE; +	return vm_unmapped_area(&info);  }  unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr0, diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c index 4b9b935a070..88e79ad6f81 100644 --- a/arch/mips/mm/tlb-r4k.c +++ b/arch/mips/mm/tlb-r4k.c @@ -120,18 +120,11 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,  	if (cpu_context(cpu, mm) != 0) {  		unsigned long size, flags; -		int huge = is_vm_hugetlb_page(vma);  		ENTER_CRITICAL(flags); -		if (huge) { -			start = round_down(start, HPAGE_SIZE); -			end = round_up(end, HPAGE_SIZE); -			size = (end - start) >> HPAGE_SHIFT; -		} else { -			start = round_down(start, PAGE_SIZE << 1); -			end = round_up(end, PAGE_SIZE << 1); -			size = (end - start) >> (PAGE_SHIFT + 1); -		} +		start = round_down(start, PAGE_SIZE << 1); +		end = round_up(end, PAGE_SIZE << 1); +		size = (end - start) >> (PAGE_SHIFT + 1);  		if (size <= current_cpu_data.tlbsize/2) {  			int oldpid = read_c0_entryhi();  			int newpid = cpu_asid(cpu, mm); @@ -140,10 +133,7 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,  				int idx;  				write_c0_entryhi(start | newpid); -				if (huge) -					start += HPAGE_SIZE; -				else -					start += (PAGE_SIZE << 1); +				start += (PAGE_SIZE << 1);  				mtc0_tlbw_hazard();  				tlb_probe();  				tlb_probe_hazard(); diff --git a/arch/mips/netlogic/dts/Makefile b/arch/mips/netlogic/dts/Makefile index 67ae3fe296f..d117d46413a 100644 --- a/arch/mips/netlogic/dts/Makefile +++ b/arch/mips/netlogic/dts/Makefile @@ -1,4 +1 @@  obj-$(CONFIG_DT_XLP_EVP) := xlp_evp.dtb.o - -$(obj)/%.dtb: $(obj)/%.dts -	$(call if_changed,dtc) diff --git a/arch/mips/netlogic/xlr/platform.c b/arch/mips/netlogic/xlr/platform.c index 71b44d82621..507230eeb76 100644 --- a/arch/mips/netlogic/xlr/platform.c +++ b/arch/mips/netlogic/xlr/platform.c @@ -15,6 +15,8 @@  #include <linux/serial_8250.h>  #include <linux/serial_reg.h>  #include <linux/i2c.h> +#include <linux/usb/ehci_pdriver.h> +#include <linux/usb/ohci_pdriver.h>  #include <asm/netlogic/haldefs.h>  #include <asm/netlogic/xlr/iomap.h> @@ -123,12 +125,18 @@ static u64 xls_usb_dmamask = ~(u32)0;  		},							\  	} +static struct usb_ehci_pdata xls_usb_ehci_pdata = { +	.caps_offset	= 0, +}; + +static struct usb_ohci_pdata xls_usb_ohci_pdata; +  static struct platform_device xls_usb_ehci_device = -			 USB_PLATFORM_DEV("ehci-xls", 0, PIC_USB_IRQ); +			 USB_PLATFORM_DEV("ehci-platform", 0, PIC_USB_IRQ);  static struct platform_device xls_usb_ohci_device_0 = -			 USB_PLATFORM_DEV("ohci-xls-0", 1, PIC_USB_IRQ); +			 USB_PLATFORM_DEV("ohci-platform", 1, PIC_USB_IRQ);  static struct platform_device xls_usb_ohci_device_1 = -			 USB_PLATFORM_DEV("ohci-xls-1", 2, PIC_USB_IRQ); +			 USB_PLATFORM_DEV("ohci-platform", 2, PIC_USB_IRQ);  static struct platform_device *xls_platform_devices[] = {  	&xls_usb_ehci_device, @@ -172,14 +180,17 @@ int xls_platform_usb_init(void)  	memres = CPHYSADDR((unsigned long)usb_mmio);  	xls_usb_ehci_device.resource[0].start = memres;  	xls_usb_ehci_device.resource[0].end = memres + 0x400 - 1; +	xls_usb_ehci_device.dev.platform_data = &xls_usb_ehci_pdata;  	memres += 0x400;  	xls_usb_ohci_device_0.resource[0].start = memres;  	xls_usb_ohci_device_0.resource[0].end = memres + 0x400 - 1; +	xls_usb_ohci_device_0.dev.platform_data = &xls_usb_ohci_pdata;  	memres += 0x400;  	xls_usb_ohci_device_1.resource[0].start = memres;  	xls_usb_ohci_device_1.resource[0].end = memres + 0x400 - 1; +	xls_usb_ohci_device_1.dev.platform_data = &xls_usb_ohci_pdata;  	return platform_add_devices(xls_platform_devices,  				ARRAY_SIZE(xls_platform_devices)); diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c index 04e35bcde07..4040416e060 100644 --- a/arch/mips/pci/pci.c +++ b/arch/mips/pci/pci.c @@ -313,10 +313,8 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)  	}  } -#ifdef CONFIG_HOTPLUG  EXPORT_SYMBOL(PCIBIOS_MIN_IO);  EXPORT_SYMBOL(PCIBIOS_MIN_MEM); -#endif  int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,  			enum pci_mmap_state mmap_state, int write_combine) diff --git a/arch/mips/pnx8550/common/platform.c b/arch/mips/pnx8550/common/platform.c index 5264cc09a27..0a8faeaa7b7 100644 --- a/arch/mips/pnx8550/common/platform.c +++ b/arch/mips/pnx8550/common/platform.c @@ -20,6 +20,7 @@  #include <linux/serial.h>  #include <linux/serial_pnx8xxx.h>  #include <linux/platform_device.h> +#include <linux/usb/ohci_pdriver.h>  #include <int.h>  #include <usb.h> @@ -96,12 +97,40 @@ static u64 ohci_dmamask = DMA_BIT_MASK(32);  static u64 uart_dmamask = DMA_BIT_MASK(32); +static int pnx8550_usb_ohci_power_on(struct platform_device *pdev) +{ +	/* +	 * Set register CLK48CTL to enable and 48MHz +	 */ +	outl(0x00000003, PCI_BASE | 0x0004770c); + +	/* +	 * Set register CLK12CTL to enable and 48MHz +	 */ +	outl(0x00000003, PCI_BASE | 0x00047710); + +	udelay(100); + +	return 0; +} + +static void pnx8550_usb_ohci_power_off(struct platform_device *pdev) +{ +	udelay(10); +} + +static struct usb_ohci_pdata pnx8550_usb_ohci_pdata = { +	.power_on	= pnx8550_usb_ohci_power_on, +	.power_off	= pnx8550_usb_ohci_power_off, +}; +  static struct platform_device pnx8550_usb_ohci_device = { -	.name		= "pnx8550-ohci", +	.name		= "ohci-platform",  	.id		= -1,  	.dev = {  		.dma_mask		= &ohci_dmamask,  		.coherent_dma_mask	= DMA_BIT_MASK(32), +		.platform_data		= &pnx8550_usb_ohci_pdata,  	},  	.num_resources	= ARRAY_SIZE(pnx8550_usb_ohci_resources),  	.resource	= pnx8550_usb_ohci_resources, diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index 04669fac117..72471744a91 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig @@ -9,6 +9,7 @@ config MN10300  	select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER  	select GENERIC_CLOCKEVENTS  	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  	select MODULES_USE_ELF_RELA  config AM33_2 diff --git a/arch/mn10300/include/asm/Kbuild b/arch/mn10300/include/asm/Kbuild index 4a159da2363..c5d76702830 100644 --- a/arch/mn10300/include/asm/Kbuild +++ b/arch/mn10300/include/asm/Kbuild @@ -1,3 +1,4 @@  generic-y += clkdev.h  generic-y += exec.h +generic-y += trace_clock.h diff --git a/arch/mn10300/include/asm/io.h b/arch/mn10300/include/asm/io.h index 139df8c53de..e6ed0d897cc 100644 --- a/arch/mn10300/include/asm/io.h +++ b/arch/mn10300/include/asm/io.h @@ -14,6 +14,7 @@  #include <asm/page.h> /* I/O is all done through memory accesses */  #include <asm/cpu-regs.h>  #include <asm/cacheflush.h> +#include <asm-generic/pci_iomap.h>  #define mmiowb() do {} while (0) @@ -258,7 +259,7 @@ static inline void __iomem *__ioremap(unsigned long offset, unsigned long size,  static inline void __iomem *ioremap(unsigned long offset, unsigned long size)  { -	return (void __iomem *) offset; +	return (void __iomem *)(offset & ~0x20000000);  }  /* diff --git a/arch/mn10300/include/asm/signal.h b/arch/mn10300/include/asm/signal.h index f9668ec3040..d280e978079 100644 --- a/arch/mn10300/include/asm/signal.h +++ b/arch/mn10300/include/asm/signal.h @@ -45,8 +45,4 @@ struct k_sigaction {  };  #include <asm/sigcontext.h> - -struct pt_regs; -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -  #endif /* _ASM_SIGNAL_H */ diff --git a/arch/mn10300/include/asm/unistd.h b/arch/mn10300/include/asm/unistd.h index 55bbec1887e..cabf8ba73b2 100644 --- a/arch/mn10300/include/asm/unistd.h +++ b/arch/mn10300/include/asm/unistd.h @@ -44,7 +44,9 @@  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND  #define __ARCH_WANT_SYS_EXECVE -#define __ARCH_WANT_KERNEL_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/mn10300/include/uapi/asm/socket.h b/arch/mn10300/include/uapi/asm/socket.h index 820463a484b..af5366bbfe6 100644 --- a/arch/mn10300/include/uapi/asm/socket.h +++ b/arch/mn10300/include/uapi/asm/socket.h @@ -40,6 +40,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER        26  #define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		28  #define SO_TIMESTAMP		29 diff --git a/arch/mn10300/kernel/asm-offsets.c b/arch/mn10300/kernel/asm-offsets.c index 96f24fab7de..47b3bb0c04f 100644 --- a/arch/mn10300/kernel/asm-offsets.c +++ b/arch/mn10300/kernel/asm-offsets.c @@ -96,7 +96,7 @@ void foo(void)  	OFFSET(__rx_outp,		mn10300_serial_port, rx_outp);  	OFFSET(__uart_state,		mn10300_serial_port, uart.state);  	OFFSET(__tx_xchar,		mn10300_serial_port, tx_xchar); -	OFFSET(__tx_break,		mn10300_serial_port, tx_break); +	OFFSET(__tx_flags,		mn10300_serial_port, tx_flags);  	OFFSET(__intr_flags,		mn10300_serial_port, intr_flags);  	OFFSET(__rx_icr,		mn10300_serial_port, rx_icr);  	OFFSET(__tx_icr,		mn10300_serial_port, tx_icr); diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S index 0c631d34c8d..68fcab8f8f6 100644 --- a/arch/mn10300/kernel/entry.S +++ b/arch/mn10300/kernel/entry.S @@ -60,13 +60,8 @@ ENTRY(ret_from_kernel_thread)  	mov	(REG_D0,fp),d0  	mov	(REG_A0,fp),a0  	calls	(a0) -	jmp	sys_exit - -ENTRY(ret_from_kernel_execve) -	add	-12,d0	/* pt_regs -> frame */ -	mov	d0,sp -	GET_THREAD_INFO a2  	clr	d0 +	mov	d0,(REG_D0,fp)  	jmp	syscall_exit  ############################################################################### diff --git a/arch/mn10300/kernel/irq.c b/arch/mn10300/kernel/irq.c index 35932a8de8b..6ab3b73efcf 100644 --- a/arch/mn10300/kernel/irq.c +++ b/arch/mn10300/kernel/irq.c @@ -142,57 +142,11 @@ mn10300_cpupic_setaffinity(struct irq_data *d, const struct cpumask *mask,  			   bool force)  {  	unsigned long flags; -	int err;  	flags = arch_local_cli_save(); - -	/* check irq no */ -	switch (d->irq) { -	case TMJCIRQ: -	case RESCHEDULE_IPI: -	case CALL_FUNC_SINGLE_IPI: -	case LOCAL_TIMER_IPI: -	case FLUSH_CACHE_IPI: -	case CALL_FUNCTION_NMI_IPI: -	case DEBUGGER_NMI_IPI: -#ifdef CONFIG_MN10300_TTYSM0 -	case SC0RXIRQ: -	case SC0TXIRQ: -#ifdef CONFIG_MN10300_TTYSM0_TIMER8 -	case TM8IRQ: -#elif CONFIG_MN10300_TTYSM0_TIMER2 -	case TM2IRQ: -#endif /* CONFIG_MN10300_TTYSM0_TIMER8 */ -#endif /* CONFIG_MN10300_TTYSM0 */ - -#ifdef CONFIG_MN10300_TTYSM1 -	case SC1RXIRQ: -	case SC1TXIRQ: -#ifdef CONFIG_MN10300_TTYSM1_TIMER12 -	case TM12IRQ: -#elif defined(CONFIG_MN10300_TTYSM1_TIMER9) -	case TM9IRQ: -#elif defined(CONFIG_MN10300_TTYSM1_TIMER3) -	case TM3IRQ: -#endif /* CONFIG_MN10300_TTYSM1_TIMER12 */ -#endif /* CONFIG_MN10300_TTYSM1 */ - -#ifdef CONFIG_MN10300_TTYSM2 -	case SC2RXIRQ: -	case SC2TXIRQ: -	case TM10IRQ: -#endif /* CONFIG_MN10300_TTYSM2 */ -		err = -1; -		break; - -	default: -		set_bit(d->irq, irq_affinity_request); -		err = 0; -		break; -	} - +	set_bit(d->irq, irq_affinity_request);  	arch_local_irq_restore(flags); -	return err; +	return 0;  }  #endif /* CONFIG_SMP */ diff --git a/arch/mn10300/kernel/mn10300-serial-low.S b/arch/mn10300/kernel/mn10300-serial-low.S index dfc1b6f2fa9..b95e76caf4f 100644 --- a/arch/mn10300/kernel/mn10300-serial-low.S +++ b/arch/mn10300/kernel/mn10300-serial-low.S @@ -118,8 +118,8 @@ ENTRY(mn10300_serial_vdma_tx_handler)  	movbu	d2,(e3)			# ACK the interrupt  	movhu	(e3),d2			# flush -	btst	0x01,(__tx_break,a3)	# handle transmit break request -	bne	mnsc_vdma_tx_break +	btst	0xFF,(__tx_flags,a3)	# handle transmit flags +	bne	mnsc_vdma_tx_flags  	movbu	(SCxSTR,e2),d2		# don't try and transmit a char if the  					# buffer is not empty @@ -171,10 +171,13 @@ mnsc_vdma_tx_empty:  	bset	MNSCx_TX_EMPTY,(__intr_flags,a3)  	bra	mnsc_vdma_tx_done -mnsc_vdma_tx_break: +mnsc_vdma_tx_flags: +	btst	MNSCx_TX_STOP,(__tx_flags,a3) +	bne	mnsc_vdma_tx_stop  	movhu	(SCxCTR,e2),d2		# turn on break mode  	or	SC01CTR_BKE,d2  	movhu	d2,(SCxCTR,e2) +mnsc_vdma_tx_stop:  	mov	+(NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL)|GxICR_DETECT),d2  	movhu	d2,(e3)			# disable transmit interrupts on this  					# channel diff --git a/arch/mn10300/kernel/mn10300-serial.c b/arch/mn10300/kernel/mn10300-serial.c index 339cef4c825..81d5cb9b656 100644 --- a/arch/mn10300/kernel/mn10300-serial.c +++ b/arch/mn10300/kernel/mn10300-serial.c @@ -408,6 +408,34 @@ static struct irq_chip mn10300_serial_pic = {  	.irq_unmask	= mn10300_serial_nop,  }; +static void mn10300_serial_low_mask(struct irq_data *d) +{ +	unsigned long flags; +	u16 tmp; + +	flags = arch_local_cli_save(); +	GxICR(d->irq) = NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL); +	tmp = GxICR(d->irq); /* flush write buffer */ +	arch_local_irq_restore(flags); +} + +static void mn10300_serial_low_unmask(struct irq_data *d) +{ +	unsigned long flags; +	u16 tmp; + +	flags = arch_local_cli_save(); +	GxICR(d->irq) = +		NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL) | GxICR_ENABLE; +	tmp = GxICR(d->irq); /* flush write buffer */ +	arch_local_irq_restore(flags); +} + +static struct irq_chip mn10300_serial_low_pic = { +	.name		= "mnserial-low", +	.irq_mask	= mn10300_serial_low_mask, +	.irq_unmask	= mn10300_serial_low_unmask, +};  /*   * serial virtual DMA interrupt jump table @@ -416,25 +444,53 @@ struct mn10300_serial_int mn10300_serial_int_tbl[NR_IRQS];  static void mn10300_serial_dis_tx_intr(struct mn10300_serial_port *port)  { -	unsigned long flags; +	int retries = 100;  	u16 x; -	flags = arch_local_cli_save(); -	*port->tx_icr = NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL); -	x = *port->tx_icr; -	arch_local_irq_restore(flags); +	/* nothing to do if irq isn't set up */ +	if (!mn10300_serial_int_tbl[port->tx_irq].port) +		return; + +	port->tx_flags |= MNSCx_TX_STOP; +	mb(); + +	/* +	 * Here we wait for the irq to be disabled. Either it already is +	 * disabled or we wait some number of retries for the VDMA handler +	 * to disable it. The retries give the VDMA handler enough time to +	 * run to completion if it was already in progress. If the VDMA IRQ +	 * is enabled but the handler is not yet running when arrive here, +	 * the STOP flag will prevent the handler from conflicting with the +	 * driver code following this loop. +	 */ +	while ((*port->tx_icr & GxICR_ENABLE) && retries-- > 0) +		; +	if (retries <= 0) { +		*port->tx_icr = +			NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL); +		x = *port->tx_icr; +	}  }  static void mn10300_serial_en_tx_intr(struct mn10300_serial_port *port)  { -	unsigned long flags;  	u16 x; -	flags = arch_local_cli_save(); +	/* nothing to do if irq isn't set up */ +	if (!mn10300_serial_int_tbl[port->tx_irq].port) +		return; + +	/* stop vdma irq if not already stopped */ +	if (!(port->tx_flags & MNSCx_TX_STOP)) +		mn10300_serial_dis_tx_intr(port); + +	port->tx_flags &= ~MNSCx_TX_STOP; +	mb(); +  	*port->tx_icr = -		NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL) | GxICR_ENABLE; +		NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL) | +		GxICR_ENABLE | GxICR_REQUEST | GxICR_DETECT;  	x = *port->tx_icr; -	arch_local_irq_restore(flags);  }  static void mn10300_serial_dis_rx_intr(struct mn10300_serial_port *port) @@ -487,16 +543,17 @@ static void mn10300_serial_receive_interrupt(struct mn10300_serial_port *port)  try_again:  	/* pull chars out of the hat */ -	ix = port->rx_outp; -	if (ix == port->rx_inp) { +	ix = ACCESS_ONCE(port->rx_outp); +	if (CIRC_CNT(port->rx_inp, ix, MNSC_BUFFER_SIZE) == 0) {  		if (push && !tty->low_latency)  			tty_flip_buffer_push(tty);  		return;  	} +	smp_read_barrier_depends();  	ch = port->rx_buffer[ix++];  	st = port->rx_buffer[ix++]; -	smp_rmb(); +	smp_mb();  	port->rx_outp = ix & (MNSC_BUFFER_SIZE - 1);  	port->uart.icount.rx++; @@ -778,8 +835,6 @@ static void mn10300_serial_start_tx(struct uart_port *_port)  	struct mn10300_serial_port *port =  		container_of(_port, struct mn10300_serial_port, uart); -	u16 x; -  	_enter("%s{%lu}",  	       port->name,  	       CIRC_CNT(&port->uart.state->xmit.head, @@ -787,14 +842,7 @@ static void mn10300_serial_start_tx(struct uart_port *_port)  			UART_XMIT_SIZE));  	/* kick the virtual DMA controller */ -	arch_local_cli(); -	x = *port->tx_icr; -	x |= GxICR_ENABLE; - -	if (*port->_status & SC01STR_TBF) -		x &= ~(GxICR_REQUEST | GxICR_DETECT); -	else -		x |= GxICR_REQUEST | GxICR_DETECT; +	mn10300_serial_en_tx_intr(port);  	_debug("CTR=%04hx ICR=%02hx STR=%04x TMD=%02hx TBR=%04hx ICR=%04hx",  	       *port->_control, *port->_intr, *port->_status, @@ -802,10 +850,6 @@ static void mn10300_serial_start_tx(struct uart_port *_port)  	       (port->div_timer == MNSCx_DIV_TIMER_8BIT) ?  	           *(volatile u8 *)port->_tmxbr : *port->_tmxbr,  	       *port->tx_icr); - -	*port->tx_icr = x; -	x = *port->tx_icr; -	arch_local_sti();  }  /* @@ -815,13 +859,17 @@ static void mn10300_serial_send_xchar(struct uart_port *_port, char ch)  {  	struct mn10300_serial_port *port =  		container_of(_port, struct mn10300_serial_port, uart); +	unsigned long flags;  	_enter("%s,%02x", port->name, ch);  	if (likely(port->gdbstub)) {  		port->tx_xchar = ch; -		if (ch) +		if (ch) { +			spin_lock_irqsave(&port->uart.lock, flags);  			mn10300_serial_en_tx_intr(port); +			spin_unlock_irqrestore(&port->uart.lock, flags); +		}  	}  } @@ -882,18 +930,21 @@ static void mn10300_serial_break_ctl(struct uart_port *_port, int ctl)  {  	struct mn10300_serial_port *port =  		container_of(_port, struct mn10300_serial_port, uart); +	unsigned long flags;  	_enter("%s,%d", port->name, ctl); +	spin_lock_irqsave(&port->uart.lock, flags);  	if (ctl) {  		/* tell the virtual DMA handler to assert BREAK */ -		port->tx_break = 1; +		port->tx_flags |= MNSCx_TX_BREAK;  		mn10300_serial_en_tx_intr(port);  	} else { -		port->tx_break = 0; +		port->tx_flags &= ~MNSCx_TX_BREAK;  		*port->_control &= ~SC01CTR_BKE;  		mn10300_serial_en_tx_intr(port);  	} +	spin_unlock_irqrestore(&port->uart.lock, flags);  }  /* @@ -916,6 +967,7 @@ static int mn10300_serial_startup(struct uart_port *_port)  		return -ENOMEM;  	port->rx_inp = port->rx_outp = 0; +	port->tx_flags = 0;  	/* finally, enable the device */  	*port->_intr = SC01ICR_TI; @@ -928,22 +980,23 @@ static int mn10300_serial_startup(struct uart_port *_port)  	pint->port = port;  	pint->vdma = mn10300_serial_vdma_tx_handler; -	set_intr_level(port->rx_irq, -		NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL)); -	set_intr_level(port->tx_irq, -		NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL)); +	irq_set_chip(port->rx_irq, &mn10300_serial_low_pic); +	irq_set_chip(port->tx_irq, &mn10300_serial_low_pic);  	irq_set_chip(port->tm_irq, &mn10300_serial_pic);  	if (request_irq(port->rx_irq, mn10300_serial_interrupt, -			IRQF_DISABLED, port->rx_name, port) < 0) +			IRQF_DISABLED | IRQF_NOBALANCING, +			port->rx_name, port) < 0)  		goto error;  	if (request_irq(port->tx_irq, mn10300_serial_interrupt, -			IRQF_DISABLED, port->tx_name, port) < 0) +			IRQF_DISABLED | IRQF_NOBALANCING, +			port->tx_name, port) < 0)  		goto error2;  	if (request_irq(port->tm_irq, mn10300_serial_interrupt, -			IRQF_DISABLED, port->tm_name, port) < 0) +			IRQF_DISABLED | IRQF_NOBALANCING, +			port->tm_name, port) < 0)  		goto error3;  	mn10300_serial_mask_ack(port->tm_irq); @@ -964,14 +1017,22 @@ error:   */  static void mn10300_serial_shutdown(struct uart_port *_port)  { +	unsigned long flags;  	u16 x;  	struct mn10300_serial_port *port =  		container_of(_port, struct mn10300_serial_port, uart);  	_enter("%s", port->name); +	spin_lock_irqsave(&_port->lock, flags); +	mn10300_serial_dis_tx_intr(port); + +	*port->rx_icr = NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL); +	x = *port->rx_icr; +	port->tx_flags = 0; +	spin_unlock_irqrestore(&_port->lock, flags); +  	/* disable the serial port and its baud rate timer */ -	port->tx_break = 0;  	*port->_control &= ~(SC01CTR_TXE | SC01CTR_RXE | SC01CTR_BKE);  	*port->_tmxmd = 0; @@ -986,12 +1047,8 @@ static void mn10300_serial_shutdown(struct uart_port *_port)  	free_irq(port->rx_irq, port);  	free_irq(port->tx_irq, port); -	arch_local_cli(); -	*port->rx_icr = NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL); -	x = *port->rx_icr; -	*port->tx_icr = NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL); -	x = *port->tx_icr; -	arch_local_sti(); +	mn10300_serial_int_tbl[port->tx_irq].port = NULL; +	mn10300_serial_int_tbl[port->rx_irq].port = NULL;  }  /* @@ -1317,7 +1374,8 @@ timer_okay:  	if ((new->c_cflag & CREAD) == 0)  		port->uart.ignore_status_mask |= (1 << TTY_NORMAL); -	scxctr |= *port->_control & (SC01CTR_TXE | SC01CTR_RXE | SC01CTR_BKE); +	scxctr |= SC01CTR_TXE | SC01CTR_RXE; +	scxctr |= *port->_control & SC01CTR_BKE;  	*port->_control = scxctr;  	spin_unlock_irqrestore(&port->uart.lock, flags); @@ -1519,17 +1577,24 @@ static void mn10300_serial_console_write(struct console *co,  {  	struct mn10300_serial_port *port;  	unsigned i; -	u16 scxctr, txicr, tmp; +	u16 scxctr;  	u8 tmxmd; +	unsigned long flags; +	int locked = 1;  	port = mn10300_serial_ports[co->index]; +	local_irq_save(flags); +	if (port->uart.sysrq) { +		/* mn10300_serial_interrupt() already took the lock */ +		locked = 0; +	} else if (oops_in_progress) { +		locked = spin_trylock(&port->uart.lock); +	} else +		spin_lock(&port->uart.lock); +  	/* firstly hijack the serial port from the "virtual DMA" controller */ -	arch_local_cli(); -	txicr = *port->tx_icr; -	*port->tx_icr = NUM2GxICR_LEVEL(CONFIG_MN10300_SERIAL_IRQ_LEVEL); -	tmp = *port->tx_icr; -	arch_local_sti(); +	mn10300_serial_dis_tx_intr(port);  	/* the transmitter may be disabled */  	scxctr = *port->_control; @@ -1565,12 +1630,12 @@ static void mn10300_serial_console_write(struct console *co,  		while (*port->_status & SC01STR_TBF)  			continue; -		*(u8 *) port->_txb = ch; +		*port->_txb = ch;  		if (ch == 0x0a) {  			while (*port->_status & SC01STR_TBF)  				continue; -			*(u8 *) port->_txb = 0xd; +			*port->_txb = 0xd;  		}  	} @@ -1583,10 +1648,11 @@ static void mn10300_serial_console_write(struct console *co,  	if (!(scxctr & SC01CTR_TXE))  		*port->_control = scxctr; -	arch_local_cli(); -	*port->tx_icr = txicr; -	tmp = *port->tx_icr; -	arch_local_sti(); +	mn10300_serial_en_tx_intr(port); + +	if (locked) +		spin_unlock(&port->uart.lock); +	local_irq_restore(flags);  }  /* @@ -1655,18 +1721,29 @@ static int mn10300_serial_poll_get_char(struct uart_port *_port)  	_enter("%s", port->name); -	do { -		/* pull chars out of the hat */ -		ix = port->rx_outp; -		if (ix == port->rx_inp) -			return NO_POLL_CHAR; +	if (mn10300_serial_int_tbl[port->rx_irq].port != NULL) { +		do { +			/* pull chars out of the hat */ +			ix = ACCESS_ONCE(port->rx_outp); +			if (CIRC_CNT(port->rx_inp, ix, MNSC_BUFFER_SIZE) == 0) +				return NO_POLL_CHAR; -		ch = port->rx_buffer[ix++]; -		st = port->rx_buffer[ix++]; -		smp_rmb(); -		port->rx_outp = ix & (MNSC_BUFFER_SIZE - 1); +			smp_read_barrier_depends(); +			ch = port->rx_buffer[ix++]; +			st = port->rx_buffer[ix++]; +			smp_mb(); +			port->rx_outp = ix & (MNSC_BUFFER_SIZE - 1); -	} while (st & (SC01STR_FEF | SC01STR_PEF | SC01STR_OEF)); +		} while (st & (SC01STR_FEF | SC01STR_PEF | SC01STR_OEF)); +	} else { +		do { +			st = *port->_status; +			if (st & (SC01STR_FEF | SC01STR_PEF | SC01STR_OEF)) +				continue; +		} while (!(st & SC01STR_RBF)); + +		ch = *port->_rxb; +	}  	return ch;  } @@ -1693,12 +1770,12 @@ static void mn10300_serial_poll_put_char(struct uart_port *_port,  	tmp = *port->_intr;  	if (ch == 0x0a) { -		*(u8 *) port->_txb = 0x0d; +		*port->_txb = 0x0d;  		while (*port->_status & SC01STR_TBF)  			continue;  	} -	*(u8 *) port->_txb = ch; +	*port->_txb = ch;  	while (*port->_status & SC01STR_TBF)  		continue; diff --git a/arch/mn10300/kernel/mn10300-serial.h b/arch/mn10300/kernel/mn10300-serial.h index 6796499bf78..01791c68ea1 100644 --- a/arch/mn10300/kernel/mn10300-serial.h +++ b/arch/mn10300/kernel/mn10300-serial.h @@ -29,6 +29,10 @@  #define MNSCx_TX_SPACE		0x04  #define MNSCx_TX_EMPTY		0x08 +/* tx_flags bits */ +#define MNSCx_TX_BREAK		0x01 +#define MNSCx_TX_STOP		0x02 +  #ifndef __ASSEMBLY__  struct mn10300_serial_port { @@ -36,7 +40,7 @@ struct mn10300_serial_port {  	unsigned		rx_inp;		/* pointer to rx input offset */  	unsigned		rx_outp;	/* pointer to rx output offset */  	u8			tx_xchar;	/* high-priority XON/XOFF buffer */ -	u8			tx_break;	/* transmit break request */ +	u8			tx_flags;	/* transmit break/stop request */  	u8			intr_flags;	/* interrupt flags */  	volatile u16		*rx_icr;	/* Rx interrupt control register */  	volatile u16		*tx_icr;	/* Tx interrupt control register */ @@ -54,8 +58,8 @@ struct mn10300_serial_port {  	volatile u16		*_control;	/* control register pointer */  	volatile u8		*_status;	/* status register pointer */  	volatile u8		*_intr;		/* interrupt register pointer */ -	volatile void		*_rxb;		/* receive buffer register pointer */ -	volatile void		*_txb;		/* transmit buffer register pointer */ +	volatile u8		*_rxb;		/* receive buffer register pointer */ +	volatile u8		*_txb;		/* transmit buffer register pointer */  	volatile u16		*_tmicr;	/* timer interrupt control register */  	volatile u8		*_tmxmd;	/* baud rate timer mode register */  	volatile u16		*_tmxbr;	/* baud rate timer base register */ diff --git a/arch/mn10300/kernel/process.c b/arch/mn10300/kernel/process.c index d0c671b6d9f..eb09f5a552f 100644 --- a/arch/mn10300/kernel/process.c +++ b/arch/mn10300/kernel/process.c @@ -206,7 +206,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)   */  int copy_thread(unsigned long clone_flags,  		unsigned long c_usp, unsigned long ustk_size, -		struct task_struct *p, struct pt_regs *kregs) +		struct task_struct *p)  {  	struct thread_info *ti = task_thread_info(p);  	struct pt_regs *c_regs; @@ -227,7 +227,7 @@ int copy_thread(unsigned long clone_flags,  	p->thread.wchan	= p->thread.pc;  	p->thread.usp	= c_usp; -	if (unlikely(!kregs)) { +	if (unlikely(p->flags & PF_KTHREAD)) {  		memset(c_regs, 0, sizeof(struct pt_regs));  		c_regs->a0 = c_usp; /* function */  		c_regs->d0 = ustk_size; /* argument */ @@ -236,8 +236,9 @@ int copy_thread(unsigned long clone_flags,  		p->thread.pc	= (unsigned long) ret_from_kernel_thread;  		return 0;  	} -	*c_regs = *kregs; -	c_regs->sp = c_usp; +	*c_regs = *current_pt_regs(); +	if (c_usp) +		c_regs->sp = c_usp;  	c_regs->epsw &= ~EPSW_FE; /* my FPU */  	/* the new TLS pointer is passed in as arg #5 to sys_clone() */ @@ -249,30 +250,6 @@ int copy_thread(unsigned long clone_flags,  	return 0;  } -/* - * clone a process - * - tlsptr is retrieved by copy_thread() from current_frame()->d3 - */ -asmlinkage long sys_clone(unsigned long clone_flags, unsigned long newsp, -			  int __user *parent_tidptr, int __user *child_tidptr, -			  int __user *tlsptr) -{ -	return do_fork(clone_flags, newsp ?: current_frame()->sp, -		       current_frame(), 0, parent_tidptr, child_tidptr); -} - -asmlinkage long sys_fork(void) -{ -	return do_fork(SIGCHLD, current_frame()->sp, -		       current_frame(), 0, NULL, NULL); -} - -asmlinkage long sys_vfork(void) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, current_frame()->sp, -		       current_frame(), 0, NULL, NULL); -} -  unsigned long get_wchan(struct task_struct *p)  {  	return p->thread.wchan; diff --git a/arch/mn10300/kernel/smp.c b/arch/mn10300/kernel/smp.c index e62c223e4c4..95983cd21e7 100644 --- a/arch/mn10300/kernel/smp.c +++ b/arch/mn10300/kernel/smp.c @@ -130,10 +130,12 @@ static irqreturn_t smp_call_function_interrupt(int irq, void *dev_id);  static struct irqaction reschedule_ipi = {  	.handler	= smp_reschedule_interrupt, +	.flags		= IRQF_NOBALANCING,  	.name		= "smp reschedule IPI"  };  static struct irqaction call_function_ipi = {  	.handler	= smp_call_function_interrupt, +	.flags		= IRQF_NOBALANCING,  	.name		= "smp call function IPI"  }; @@ -141,7 +143,7 @@ static struct irqaction call_function_ipi = {  static irqreturn_t smp_ipi_timer_interrupt(int irq, void *dev_id);  static struct irqaction local_timer_ipi = {  	.handler	= smp_ipi_timer_interrupt, -	.flags		= IRQF_DISABLED, +	.flags		= IRQF_DISABLED | IRQF_NOBALANCING,  	.name		= "smp local timer IPI"  };  #endif @@ -180,6 +182,7 @@ static void init_ipi(void)  #ifdef CONFIG_MN10300_CACHE_ENABLED  	/* set up the cache flush IPI */ +	irq_set_chip(FLUSH_CACHE_IPI, &mn10300_ipi_type);  	flags = arch_local_cli_save();  	__set_intr_stub(NUM2EXCEP_IRQ_LEVEL(FLUSH_CACHE_GxICR_LV),  			mn10300_low_ipi_handler); @@ -189,6 +192,7 @@ static void init_ipi(void)  #endif  	/* set up the NMI call function IPI */ +	irq_set_chip(CALL_FUNCTION_NMI_IPI, &mn10300_ipi_type);  	flags = arch_local_cli_save();  	GxICR(CALL_FUNCTION_NMI_IPI) = GxICR_NMI | GxICR_ENABLE | GxICR_DETECT;  	tmp16 = GxICR(CALL_FUNCTION_NMI_IPI); @@ -199,6 +203,10 @@ static void init_ipi(void)  	__set_intr_stub(NUM2EXCEP_IRQ_LEVEL(SMP_BOOT_GxICR_LV),  			mn10300_low_ipi_handler);  	arch_local_irq_restore(flags); + +#ifdef CONFIG_KERNEL_DEBUGGER +	irq_set_chip(DEBUGGER_NMI_IPI, &mn10300_ipi_type); +#endif  }  /** diff --git a/arch/mn10300/mm/fault.c b/arch/mn10300/mm/fault.c index 90f346f7392..d48a84fd7fa 100644 --- a/arch/mn10300/mm/fault.c +++ b/arch/mn10300/mm/fault.c @@ -123,7 +123,8 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long fault_code,  	struct mm_struct *mm;  	unsigned long page;  	siginfo_t info; -	int write, fault; +	int fault; +	unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;  #ifdef CONFIG_GDBSTUB  	/* handle GDB stub causing a fault */ @@ -170,6 +171,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long fault_code,  	if (in_atomic() || !mm)  		goto no_context; +retry:  	down_read(&mm->mmap_sem);  	vma = find_vma(mm, address); @@ -220,7 +222,6 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long fault_code,   */  good_area:  	info.si_code = SEGV_ACCERR; -	write = 0;  	switch (fault_code & (MMUFCR_xFC_PGINVAL|MMUFCR_xFC_TYPE)) {  	default:	/* 3: write, present */  	case MMUFCR_xFC_TYPE_WRITE: @@ -232,7 +233,7 @@ good_area:  	case MMUFCR_xFC_PGINVAL | MMUFCR_xFC_TYPE_WRITE:  		if (!(vma->vm_flags & VM_WRITE))  			goto bad_area; -		write++; +		flags |= FAULT_FLAG_WRITE;  		break;  		/* read from protected page */ @@ -251,7 +252,11 @@ good_area:  	 * make sure we exit gracefully rather than endlessly redo  	 * the fault.  	 */ -	fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0); +	fault = handle_mm_fault(mm, vma, address, flags); + +	if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) +		return; +  	if (unlikely(fault & VM_FAULT_ERROR)) {  		if (fault & VM_FAULT_OOM)  			goto out_of_memory; @@ -259,10 +264,22 @@ good_area:  			goto do_sigbus;  		BUG();  	} -	if (fault & VM_FAULT_MAJOR) -		current->maj_flt++; -	else -		current->min_flt++; +	if (flags & FAULT_FLAG_ALLOW_RETRY) { +		if (fault & VM_FAULT_MAJOR) +			current->maj_flt++; +		else +			current->min_flt++; +		if (fault & VM_FAULT_RETRY) { +			flags &= ~FAULT_FLAG_ALLOW_RETRY; + +			 /* No need to up_read(&mm->mmap_sem) as we would +			 * have already released it in __lock_page_or_retry +			 * in mm/filemap.c. +			 */ + +			goto retry; +		} +	}  	up_read(&mm->mmap_sem);  	return; diff --git a/arch/mn10300/unit-asb2305/pci-iomap.c b/arch/mn10300/unit-asb2305/pci-iomap.c new file mode 100644 index 00000000000..bd65dae17f3 --- /dev/null +++ b/arch/mn10300/unit-asb2305/pci-iomap.c @@ -0,0 +1,35 @@ +/* ASB2305 PCI I/O mapping handler + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#include <linux/pci.h> +#include <linux/module.h> + +/* + * Create a virtual mapping cookie for a PCI BAR (memory or IO) + */ +void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) +{ +	resource_size_t start = pci_resource_start(dev, bar); +	resource_size_t len = pci_resource_len(dev, bar); +	unsigned long flags = pci_resource_flags(dev, bar); + +	if (!len || !start) +		return NULL; + +	if ((flags & IORESOURCE_IO) || (flags & IORESOURCE_MEM)) { +		if (flags & IORESOURCE_CACHEABLE && !(flags & IORESOURCE_IO)) +			return ioremap(start, len); +		else +			return ioremap_nocache(start, len); +	} + +	return NULL; +} +EXPORT_SYMBOL(pci_iomap); diff --git a/arch/mn10300/unit-asb2305/pci.c b/arch/mn10300/unit-asb2305/pci.c index 6dce9fc2cf3..e2059486d3f 100644 --- a/arch/mn10300/unit-asb2305/pci.c +++ b/arch/mn10300/unit-asb2305/pci.c @@ -17,6 +17,7 @@  #include <linux/init.h>  #include <linux/ioport.h>  #include <linux/delay.h> +#include <linux/irq.h>  #include <asm/io.h>  #include "pci-asb2305.h" @@ -303,9 +304,7 @@ static int __devinit is_valid_resource(struct pci_dev *dev, int idx)  static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)  { -	struct pci_bus_region region; -	int i; -	int limit; +	int limit, i;  	if (dev->bus->number != 0)  		return; diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig index 05f2ba41ff1..e7f1a2993f7 100644 --- a/arch/openrisc/Kconfig +++ b/arch/openrisc/Kconfig @@ -22,6 +22,8 @@ config OPENRISC  	select GENERIC_STRNCPY_FROM_USER  	select GENERIC_STRNLEN_USER  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  config MMU  	def_bool y diff --git a/arch/openrisc/Makefile b/arch/openrisc/Makefile index 966886c8daf..4739b8302a5 100644 --- a/arch/openrisc/Makefile +++ b/arch/openrisc/Makefile @@ -50,6 +50,6 @@ BUILTIN_DTB := y  else  BUILTIN_DTB := n  endif -core-$(BUILTIN_DTB) += arch/openrisc/boot/ +core-$(BUILTIN_DTB) += arch/openrisc/boot/dts/  all: vmlinux diff --git a/arch/openrisc/boot/Makefile b/arch/openrisc/boot/dts/Makefile index 09958358601..b092d30d6c2 100644 --- a/arch/openrisc/boot/Makefile +++ b/arch/openrisc/boot/dts/Makefile @@ -1,5 +1,3 @@ - -  ifneq '$(CONFIG_OPENRISC_BUILTIN_DTB)' '""'  BUILTIN_DTB := $(patsubst "%",%,$(CONFIG_OPENRISC_BUILTIN_DTB)).dtb.o  else @@ -10,6 +8,3 @@ obj-y += $(BUILTIN_DTB)  clean-files := *.dtb.S  #DTC_FLAGS ?= -p 1024 - -$(obj)/%.dtb: $(src)/dts/%.dts FORCE -	$(call if_changed_dep,dtc) diff --git a/arch/openrisc/include/asm/Kbuild b/arch/openrisc/include/asm/Kbuild index 78de6805268..8971026e1c6 100644 --- a/arch/openrisc/include/asm/Kbuild +++ b/arch/openrisc/include/asm/Kbuild @@ -60,6 +60,7 @@ generic-y += swab.h  generic-y += termbits.h  generic-y += termios.h  generic-y += topology.h +generic-y += trace_clock.h  generic-y += types.h  generic-y += ucontext.h  generic-y += user.h diff --git a/arch/openrisc/include/asm/processor.h b/arch/openrisc/include/asm/processor.h index 43decdbdb2e..33691380608 100644 --- a/arch/openrisc/include/asm/processor.h +++ b/arch/openrisc/include/asm/processor.h @@ -81,8 +81,6 @@ struct thread_struct {  #define KSTK_ESP(tsk)   (task_pt_regs(tsk)->sp) -extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); -  void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp);  void release_thread(struct task_struct *);  unsigned long get_wchan(struct task_struct *p); diff --git a/arch/openrisc/include/asm/syscalls.h b/arch/openrisc/include/asm/syscalls.h index 84a978af44d..8ee816812a9 100644 --- a/arch/openrisc/include/asm/syscalls.h +++ b/arch/openrisc/include/asm/syscalls.h @@ -24,4 +24,11 @@ asmlinkage long sys_or1k_atomic(unsigned long type, unsigned long *v1,  #include <asm-generic/syscalls.h> +asmlinkage long __sys_clone(unsigned long clone_flags, unsigned long newsp, +			void __user *parent_tid, void __user *child_tid, int tls); +asmlinkage long __sys_fork(void); + +#define sys_clone __sys_clone +#define sys_fork __sys_fork +  #endif /* __ASM_OPENRISC_SYSCALLS_H */ diff --git a/arch/openrisc/include/uapi/asm/unistd.h b/arch/openrisc/include/uapi/asm/unistd.h index 437bdbb61b1..5082b806632 100644 --- a/arch/openrisc/include/uapi/asm/unistd.h +++ b/arch/openrisc/include/uapi/asm/unistd.h @@ -20,6 +20,10 @@  #define sys_mmap2 sys_mmap_pgoff +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_CLONE +  #include <asm-generic/unistd.h>  #define __NR_or1k_atomic __NR_arch_specific_syscall diff --git a/arch/openrisc/kernel/Makefile b/arch/openrisc/kernel/Makefile index e1ee0fa2bbd..35f92ce51c2 100644 --- a/arch/openrisc/kernel/Makefile +++ b/arch/openrisc/kernel/Makefile @@ -5,7 +5,7 @@  extra-y	:= head.o vmlinux.lds  obj-y	:= setup.o idle.o or32_ksyms.o process.o dma.o \ -	   traps.o time.o irq.o entry.o ptrace.o signal.o sys_or32.o \ +	   traps.o time.o irq.o entry.o ptrace.o signal.o \  	   sys_call_table.o  obj-$(CONFIG_MODULES)		+= module.o diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S index ddfcaa828b0..5e5b30601bb 100644 --- a/arch/openrisc/kernel/entry.S +++ b/arch/openrisc/kernel/entry.S @@ -894,6 +894,16 @@ ENTRY(ret_from_fork)  	l.jal	schedule_tail  	 l.nop +	/* Check if we are a kernel thread */ +	l.sfeqi	r20,0 +	l.bf	1f +	 l.nop + +	/* ...we are a kernel thread so invoke the requested callback */ +	l.jalr	r20 +	 l.or	r3,r22,r0 + +1:  	/* _syscall_returns expect r11 to contain return value */  	l.lwz	r11,PT_GPR11(r1) @@ -915,26 +925,6 @@ ENTRY(ret_from_fork)  	l.j	_syscall_return  	 l.nop -/* Since syscalls don't save call-clobbered registers, the args to - * kernel_thread_helper will need to be passed through callee-saved - * registers and copied to the parameter registers when the thread - * begins running. - * - * See arch/openrisc/kernel/process.c: - * The args are passed as follows: - *   arg1 (r3) : passed in r20 - *   arg2 (r4) : passed in r22 - */ - -ENTRY(_kernel_thread_helper) -	l.or	r3,r20,r0 -	l.or	r4,r22,r0 -	l.movhi	r31,hi(kernel_thread_helper) -	l.ori	r31,r31,lo(kernel_thread_helper) -	l.jr	r31 -	 l.nop - -  /* ========================================================[ switch ] === */  /* @@ -1044,8 +1034,13 @@ ENTRY(_switch)  	/* Unwind stack to pre-switch state */  	l.addi  r1,r1,(INT_FRAME_SIZE) -	/* Return via the link-register back to where we 'came from', where that can be -	 * either schedule() or return_from_fork()... */ +	/* Return via the link-register back to where we 'came from', where +	 * that may be either schedule(), ret_from_fork(), or +	 * ret_from_kernel_thread().  If we are returning to a new thread, +	 * we are expected to have set up the arg to schedule_tail already, +	 * hence we do so here unconditionally: +	 */ +	l.lwz   r3,TI_STACK(r3)		/* Load 'prev' as schedule_tail arg */  	l.jr	r9  	 l.nop @@ -1076,22 +1071,18 @@ _fork_save_extra_regs_and_call:  	l.jr	r29  	 l.sw    PT_GPR28(r1),r28 -ENTRY(sys_clone) -	l.movhi	r29,hi(_sys_clone) -	l.ori	r29,r29,lo(_sys_clone) +ENTRY(__sys_clone) +	l.movhi	r29,hi(sys_clone) +	l.ori	r29,r29,lo(sys_clone)  	l.j	_fork_save_extra_regs_and_call  	 l.addi	r7,r1,0 -ENTRY(sys_fork) -	l.movhi	r29,hi(_sys_fork) -	l.ori	r29,r29,lo(_sys_fork) +ENTRY(__sys_fork) +	l.movhi	r29,hi(sys_fork) +	l.ori	r29,r29,lo(sys_fork)  	l.j	_fork_save_extra_regs_and_call  	 l.addi	r3,r1,0 -ENTRY(sys_execve) -	l.j	_sys_execve -	 l.addi	r6,r1,0 -  ENTRY(sys_sigaltstack)  	l.j	_sys_sigaltstack  	 l.addi	r5,r1,0 diff --git a/arch/openrisc/kernel/process.c b/arch/openrisc/kernel/process.c index c35f3ab1a8d..00c233bf0d0 100644 --- a/arch/openrisc/kernel/process.c +++ b/arch/openrisc/kernel/process.c @@ -109,66 +109,83 @@ void release_thread(struct task_struct *dead_task)   */  extern asmlinkage void ret_from_fork(void); +/* + * copy_thread + * @clone_flags: flags + * @usp: user stack pointer or fn for kernel thread + * @arg: arg to fn for kernel thread; always NULL for userspace thread + * @p: the newly created task + * @regs: CPU context to copy for userspace thread; always NULL for kthread + * + * At the top of a newly initialized kernel stack are two stacked pt_reg + * structures.  The first (topmost) is the userspace context of the thread. + * The second is the kernelspace context of the thread. + * + * A kernel thread will not be returning to userspace, so the topmost pt_regs + * struct can be uninitialized; it _does_ need to exist, though, because + * a kernel thread can become a userspace thread by doing a kernel_execve, in + * which case the topmost context will be initialized and used for 'returning' + * to userspace. + * + * The second pt_reg struct needs to be initialized to 'return' to + * ret_from_fork.  A kernel thread will need to set r20 to the address of + * a function to call into (with arg in r22); userspace threads need to set + * r20 to NULL in which case ret_from_fork will just continue a return to + * userspace. + * + * A kernel thread 'fn' may return; this is effectively what happens when + * kernel_execve is called.  In that case, the userspace pt_regs must have + * been initialized (which kernel_execve takes care of, see start_thread + * below); ret_from_fork will then continue its execution causing the + * 'kernel thread' to return to userspace as a userspace thread. + */ +  int  copy_thread(unsigned long clone_flags, unsigned long usp, -	    unsigned long unused, struct task_struct *p, struct pt_regs *regs) +	    unsigned long arg, struct task_struct *p)  { -	struct pt_regs *childregs; +	struct pt_regs *userregs;  	struct pt_regs *kregs;  	unsigned long sp = (unsigned long)task_stack_page(p) + THREAD_SIZE; -	struct thread_info *ti;  	unsigned long top_of_kernel_stack;  	top_of_kernel_stack = sp;  	p->set_child_tid = p->clear_child_tid = NULL; -	/* Copy registers */ -	/* redzone */ -	sp -= STACK_FRAME_OVERHEAD; +	/* Locate userspace context on stack... */ +	sp -= STACK_FRAME_OVERHEAD;	/* redzone */  	sp -= sizeof(struct pt_regs); -	childregs = (struct pt_regs *)sp; +	userregs = (struct pt_regs *) sp; -	/* Copy parent registers */ -	*childregs = *regs; +	/* ...and kernel context */ +	sp -= STACK_FRAME_OVERHEAD;	/* redzone */ +	sp -= sizeof(struct pt_regs); +	kregs = (struct pt_regs *)sp; -	if ((childregs->sr & SPR_SR_SM) == 1) { -		/* for kernel thread, set `current_thread_info' -		 * and stackptr in new task -		 */ -		childregs->sp = (unsigned long)task_stack_page(p) + THREAD_SIZE; -		childregs->gpr[10] = (unsigned long)task_thread_info(p); +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(kregs, 0, sizeof(struct pt_regs)); +		kregs->gpr[20] = usp; /* fn, kernel thread */ +		kregs->gpr[22] = arg;  	} else { -		childregs->sp = usp; -	} - -	childregs->gpr[11] = 0;	/* Result from fork() */ +		*userregs = *current_pt_regs(); -	/* -	 * The way this works is that at some point in the future -	 * some task will call _switch to switch to the new task. -	 * That will pop off the stack frame created below and start -	 * the new task running at ret_from_fork.  The new task will -	 * do some house keeping and then return from the fork or clone -	 * system call, using the stack frame created above. -	 */ -	/* redzone */ -	sp -= STACK_FRAME_OVERHEAD; -	sp -= sizeof(struct pt_regs); -	kregs = (struct pt_regs *)sp; +		if (usp) +			userregs->sp = usp; +		userregs->gpr[11] = 0;	/* Result from fork() */ -	ti = task_thread_info(p); -	ti->ksp = sp; +		kregs->gpr[20] = 0;	/* Userspace thread */ +	} -	/* kregs->sp must store the location of the 'pre-switch' kernel stack -	 * pointer... for a newly forked process, this is simply the top of -	 * the kernel stack. +	/* +	 * _switch wants the kernel stack page in pt_regs->sp so that it +	 * can restore it to thread_info->ksp... see _switch for details.  	 */  	kregs->sp = top_of_kernel_stack; -	kregs->gpr[3] = (unsigned long)current;	/* arg to schedule_tail */ -	kregs->gpr[10] = (unsigned long)task_thread_info(p);  	kregs->gpr[9] = (unsigned long)ret_from_fork; +	task_thread_info(p)->ksp = (unsigned long)kregs; +  	return 0;  } @@ -177,16 +194,14 @@ copy_thread(unsigned long clone_flags, unsigned long usp,   */  void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp)  { -	unsigned long sr = regs->sr & ~SPR_SR_SM; +	unsigned long sr = mfspr(SPR_SR) & ~SPR_SR_SM;  	set_fs(USER_DS); -	memset(regs->gpr, 0, sizeof(regs->gpr)); +	memset(regs, 0, sizeof(struct pt_regs));  	regs->pc = pc;  	regs->sr = sr;  	regs->sp = sp; - -/*	printk("start thread, ksp = %lx\n", current_thread_info()->ksp);*/  }  /* Fill in the fpu structure for a core dump.  */ @@ -237,74 +252,9 @@ void dump_elf_thread(elf_greg_t *dest, struct pt_regs* regs)  	dest[35] = 0;  } -extern void _kernel_thread_helper(void); - -void __noreturn kernel_thread_helper(int (*fn) (void *), void *arg) -{ -	do_exit(fn(arg)); -} - -/* - * Create a kernel thread. - */ -int kernel_thread(int (*fn) (void *), void *arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); - -	regs.gpr[20] = (unsigned long)fn; -	regs.gpr[22] = (unsigned long)arg; -	regs.sr = mfspr(SPR_SR); -	regs.pc = (unsigned long)_kernel_thread_helper; - -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, -		       0, ®s, 0, NULL, NULL); -} - -/* - * sys_execve() executes a new program. - */ -asmlinkage long _sys_execve(const char __user *name, -			    const char __user * const __user *argv, -			    const char __user * const __user *envp, -			    struct pt_regs *regs) -{ -	int error; -	struct filename *filename; - -	filename = getname(name); -	error = PTR_ERR(filename); - -	if (IS_ERR(filename)) -		goto out; - -	error = do_execve(filename->name, argv, envp, regs); -	putname(filename); - -out: -	return error; -} -  unsigned long get_wchan(struct task_struct *p)  {  	/* TODO */  	return 0;  } - -int kernel_execve(const char *filename, char *const argv[], char *const envp[]) -{ -	register long __res asm("r11") = __NR_execve; -	register long __a asm("r3") = (long)(filename); -	register long __b asm("r4") = (long)(argv); -	register long __c asm("r5") = (long)(envp); -	__asm__ volatile ("l.sys 1" -			  : "=r" (__res), "=r"(__a), "=r"(__b), "=r"(__c) -			  : "0"(__res), "1"(__a), "2"(__b), "3"(__c) -			  : "r6", "r7", "r8", "r12", "r13", "r15", -			    "r17", "r19", "r21", "r23", "r25", "r27", -			    "r29", "r31"); -	__asm__ volatile ("l.nop"); -	return __res; -} diff --git a/arch/openrisc/kernel/signal.c b/arch/openrisc/kernel/signal.c index 30110297f4f..ddedc8a7786 100644 --- a/arch/openrisc/kernel/signal.c +++ b/arch/openrisc/kernel/signal.c @@ -84,7 +84,6 @@ asmlinkage long _sys_rt_sigreturn(struct pt_regs *regs)  {  	struct rt_sigframe *frame = (struct rt_sigframe __user *)regs->sp;  	sigset_t set; -	stack_t st;  	/*  	 * Since we stacked the signal on a dword boundary, @@ -104,11 +103,10 @@ asmlinkage long _sys_rt_sigreturn(struct pt_regs *regs)  	if (restore_sigcontext(regs, &frame->uc.uc_mcontext))  		goto badframe; -	if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) -		goto badframe;  	/* It is more difficult to avoid calling this function than to  	   call it and ignore errors.  */ -	do_sigaltstack(&st, NULL, regs->sp); +	if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) +		goto badframe;  	return regs->gpr[11]; diff --git a/arch/openrisc/kernel/sys_or32.c b/arch/openrisc/kernel/sys_or32.c deleted file mode 100644 index 57060084c0c..00000000000 --- a/arch/openrisc/kernel/sys_or32.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * OpenRISC sys_or32.c - * - * Linux architectural port borrowing liberally from similar works of - * others.  All original copyrights apply as per the original source - * declaration. - * - * Modifications for the OpenRISC architecture: - * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com> - * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> - * - *      This program is free software; you can redistribute it and/or - *      modify it under the terms of the GNU General Public License - *      as published by the Free Software Foundation; either version - *      2 of the License, or (at your option) any later version. - * - * This file contains various random system calls that - * have a non-standard calling sequence on some platforms. - * Since we don't have to do any backwards compatibility, our - * versions are done in the most "normal" way possible. - */ - -#include <linux/errno.h> -#include <linux/syscalls.h> -#include <linux/mm.h> - -#include <asm/syscalls.h> - -/* These are secondary entry points as the primary entry points are defined in - * entry.S where we add the 'regs' parameter value - */ - -asmlinkage long _sys_clone(unsigned long clone_flags, unsigned long newsp, -			   int __user *parent_tid, int __user *child_tid, -			   struct pt_regs *regs) -{ -	long ret; - -	/* FIXME: Is alignment necessary? */ -	/* newsp = ALIGN(newsp, 4); */ - -	if (!newsp) -		newsp = regs->sp; - -	ret = do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); - -	return ret; -} - -asmlinkage int _sys_fork(struct pt_regs *regs) -{ -#ifdef CONFIG_MMU -	return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL); -#else -	return -EINVAL; -#endif -} diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 11def45b98c..e688a2be30f 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -22,6 +22,9 @@ config PARISC  	select GENERIC_STRNCPY_FROM_USER  	select HAVE_MOD_ARCH_SPECIFIC  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE +	select CLONE_BACKWARDS  	help  	  The PA-RISC microprocessor is designed by Hewlett-Packard and used diff --git a/arch/parisc/include/asm/Kbuild b/arch/parisc/include/asm/Kbuild index bac8debecff..ff4c9faed54 100644 --- a/arch/parisc/include/asm/Kbuild +++ b/arch/parisc/include/asm/Kbuild @@ -3,3 +3,4 @@ generic-y += word-at-a-time.h auxvec.h user.h cputime.h emergency-restart.h \  	  segment.h topology.h vga.h device.h percpu.h hw_irq.h mutex.h \  	  div64.h irq_regs.h kdebug.h kvm_para.h local64.h local.h param.h \  	  poll.h xor.h clkdev.h exec.h +generic-y += trace_clock.h diff --git a/arch/parisc/include/asm/processor.h b/arch/parisc/include/asm/processor.h index 0e8b7b8ce8a..09b54a57a48 100644 --- a/arch/parisc/include/asm/processor.h +++ b/arch/parisc/include/asm/processor.h @@ -326,7 +326,6 @@ struct mm_struct;  /* Free all resources held by a thread. */  extern void release_thread(struct task_struct *); -extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);  extern void map_hpux_gateway_page(struct task_struct *tsk, struct mm_struct *mm); diff --git a/arch/parisc/include/asm/signal.h b/arch/parisc/include/asm/signal.h index 21abf4fc169..0fdb3c83595 100644 --- a/arch/parisc/include/asm/signal.h +++ b/arch/parisc/include/asm/signal.h @@ -34,8 +34,6 @@ struct k_sigaction {  	struct sigaction sa;  }; -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -  #include <asm/sigcontext.h>  #endif /* !__ASSEMBLY */ diff --git a/arch/parisc/include/asm/unistd.h b/arch/parisc/include/asm/unistd.h index 541639c3f60..1efef41659c 100644 --- a/arch/parisc/include/asm/unistd.h +++ b/arch/parisc/include/asm/unistd.h @@ -163,6 +163,10 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)	\  #define __ARCH_WANT_SYS_RT_SIGACTION  #define __ARCH_WANT_SYS_RT_SIGSUSPEND  #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  #endif /* __ASSEMBLY__ */ diff --git a/arch/parisc/include/uapi/asm/ioctls.h b/arch/parisc/include/uapi/asm/ioctls.h index 054ec06f9e2..66719c38a36 100644 --- a/arch/parisc/include/uapi/asm/ioctls.h +++ b/arch/parisc/include/uapi/asm/ioctls.h @@ -55,6 +55,9 @@  #define TIOCGDEV	_IOR('T',0x32, int)  /* Get primary device node of /dev/console */  #define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */  #define TIOCVHANGUP	0x5437 +#define TIOCGPKT	_IOR('T', 0x38, int) /* Get packet mode state */ +#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */ +#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */  #define FIONCLEX	0x5450  /* these numbers need to be adjusted. */  #define FIOCLEX		0x5451 diff --git a/arch/parisc/include/uapi/asm/mman.h b/arch/parisc/include/uapi/asm/mman.h index 12219ebce86..294d251ca7b 100644 --- a/arch/parisc/include/uapi/asm/mman.h +++ b/arch/parisc/include/uapi/asm/mman.h @@ -70,4 +70,15 @@  #define MAP_FILE	0  #define MAP_VARIABLE	0 +/* + * When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size. + * This gives us 6 bits, which is enough until someone invents 128 bit address + * spaces. + * + * Assume these are all power of twos. + * When 0 use the default page size. + */ +#define MAP_HUGE_SHIFT	26 +#define MAP_HUGE_MASK	0x3f +  #endif /* __PARISC_MMAN_H__ */ diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h index 1b52c2c31a7..d9ff4731253 100644 --- a/arch/parisc/include/uapi/asm/socket.h +++ b/arch/parisc/include/uapi/asm/socket.h @@ -48,6 +48,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER        0x401a  #define SO_DETACH_FILTER        0x401b +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_ACCEPTCONN		0x401c diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index 18670a07884..bfb44247d7a 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S @@ -708,59 +708,9 @@ ENTRY(end_fault_vector)  	.import		do_cpu_irq_mask,code  	/* -	 * r26 = function to be called -	 * r25 = argument to pass in -	 * r24 = flags for do_fork() -	 * -	 * Kernel threads don't ever return, so they don't need -	 * a true register context. We just save away the arguments -	 * for copy_thread/ret_ to properly set up the child. -	 */ - -#define CLONE_VM 0x100	/* Must agree with <linux/sched.h> */ -#define CLONE_UNTRACED 0x00800000 - -	.import do_fork -ENTRY(__kernel_thread) -	STREG	%r2, -RP_OFFSET(%r30) - -	copy	%r30, %r1 -	ldo	PT_SZ_ALGN(%r30),%r30 -#ifdef CONFIG_64BIT -	/* Yo, function pointers in wide mode are little structs... -PB */ -	ldd	24(%r26), %r2 -	STREG	%r2, PT_GR27(%r1)	/* Store childs %dp */ -	ldd	16(%r26), %r26 - -	STREG	%r22, PT_GR22(%r1)	/* save r22 (arg5) */ -	copy	%r0, %r22		/* user_tid */ -#endif -	STREG	%r26, PT_GR26(%r1)  /* Store function & argument for child */ -	STREG	%r25, PT_GR25(%r1) -	ldil	L%CLONE_UNTRACED, %r26 -	ldo	CLONE_VM(%r26), %r26   /* Force CLONE_VM since only init_mm */ -	or	%r26, %r24, %r26      /* will have kernel mappings.	 */ -	ldi	1, %r25			/* stack_start, signals kernel thread */ -	stw	%r0, -52(%r30)	     	/* user_tid */ -#ifdef CONFIG_64BIT -	ldo	-16(%r30),%r29		/* Reference param save area */ -#endif -	BL	do_fork, %r2 -	copy	%r1, %r24		/* pt_regs */ - -	/* Parent Returns here */ - -	LDREG	-PT_SZ_ALGN-RP_OFFSET(%r30), %r2 -	ldo	-PT_SZ_ALGN(%r30), %r30 -	bv	%r0(%r2) -	nop -ENDPROC(__kernel_thread) - -	/*  	 * Child Returns here  	 * -	 * copy_thread moved args from temp save area set up above -	 * into task save area. +	 * copy_thread moved args into task save area.  	 */  ENTRY(ret_from_kernel_thread) @@ -769,51 +719,17 @@ ENTRY(ret_from_kernel_thread)  	BL	schedule_tail, %r2  	nop -	LDREG	TI_TASK-THREAD_SZ_ALGN(%r30), %r1 +	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1  	LDREG	TASK_PT_GR25(%r1), %r26  #ifdef CONFIG_64BIT  	LDREG	TASK_PT_GR27(%r1), %r27 -	LDREG	TASK_PT_GR22(%r1), %r22  #endif  	LDREG	TASK_PT_GR26(%r1), %r1  	ble	0(%sr7, %r1)  	copy	%r31, %r2 - -#ifdef CONFIG_64BIT -	ldo	-16(%r30),%r29		/* Reference param save area */ -	loadgp				/* Thread could have been in a module */ -#endif -#ifndef CONFIG_64BIT -	b	sys_exit -#else -	load32	sys_exit, %r1 -	bv	%r0(%r1) -#endif -	ldi	0, %r26 -ENDPROC(ret_from_kernel_thread) - -	.import	sys_execve, code -ENTRY(__execve) -	copy	%r2, %r15 -	copy	%r30, %r16 -	ldo	PT_SZ_ALGN(%r30), %r30 -	STREG	%r26, PT_GR26(%r16) -	STREG	%r25, PT_GR25(%r16) -	STREG	%r24, PT_GR24(%r16) -#ifdef CONFIG_64BIT -	ldo	-16(%r30),%r29		/* Reference param save area */ -#endif -	BL	sys_execve, %r2 -	copy	%r16, %r26 - -	cmpib,=,n 0,%r28,intr_return    /* forward */ - -	/* yes, this will trap and die. */ -	copy	%r15, %r2 -	copy	%r16, %r30 -	bv	%r0(%r2) +	b	finish_child_return  	nop -ENDPROC(__execve) +ENDPROC(ret_from_kernel_thread)  	/* @@ -1772,151 +1688,36 @@ dtlb_fault:  	LDREG   PT_GR18(\regs),%r18  	.endm -ENTRY(sys_fork_wrapper) +	.macro	fork_like name +ENTRY(sys_\name\()_wrapper)  	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1  	ldo	TASK_REGS(%r1),%r1  	reg_save %r1 -	mfctl	%cr27, %r3 -	STREG	%r3, PT_CR27(%r1) - -	STREG	%r2,-RP_OFFSET(%r30) -	ldo	FRAME_SIZE(%r30),%r30 -#ifdef CONFIG_64BIT -	ldo	-16(%r30),%r29		/* Reference param save area */ -#endif - -	/* These are call-clobbered registers and therefore -	   also syscall-clobbered (we hope). */ -	STREG	%r2,PT_GR19(%r1)	/* save for child */ -	STREG	%r30,PT_GR21(%r1) - -	LDREG	PT_GR30(%r1),%r25 -	copy	%r1,%r24 -	BL	sys_clone,%r2 -	ldi	SIGCHLD,%r26 - -	LDREG	-RP_OFFSET-FRAME_SIZE(%r30),%r2 -wrapper_exit: -	ldo	-FRAME_SIZE(%r30),%r30		/* get the stackframe */ -	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 -	ldo	TASK_REGS(%r1),%r1	 /* get pt regs */ - -	LDREG	PT_CR27(%r1), %r3 -	mtctl	%r3, %cr27 -	reg_restore %r1 +	mfctl	%cr27, %r28 +	b	sys_\name +	STREG	%r28, PT_CR27(%r1) +ENDPROC(sys_\name\()_wrapper) +	.endm -	/* strace expects syscall # to be preserved in r20 */ -	ldi	__NR_fork,%r20 -	bv %r0(%r2) -	STREG	%r20,PT_GR20(%r1) -ENDPROC(sys_fork_wrapper) +fork_like clone +fork_like fork +fork_like vfork  	/* Set the return value for the child */  ENTRY(child_return)  	BL	schedule_tail, %r2  	nop +finish_child_return: +	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 +	ldo	TASK_REGS(%r1),%r1	 /* get pt regs */ -	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE-FRAME_SIZE(%r30), %r1 -	LDREG	TASK_PT_GR19(%r1),%r2 -	b	wrapper_exit +	LDREG	PT_CR27(%r1), %r3 +	mtctl	%r3, %cr27 +	reg_restore %r1 +	b	syscall_exit  	copy	%r0,%r28  ENDPROC(child_return) - -ENTRY(sys_clone_wrapper) -	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 -	ldo	TASK_REGS(%r1),%r1	/* get pt regs */ -	reg_save %r1 -	mfctl	%cr27, %r3 -	STREG	%r3, PT_CR27(%r1) - -	STREG	%r2,-RP_OFFSET(%r30) -	ldo	FRAME_SIZE(%r30),%r30 -#ifdef CONFIG_64BIT -	ldo	-16(%r30),%r29		/* Reference param save area */ -#endif - -	/* WARNING - Clobbers r19 and r21, userspace must save these! */ -	STREG	%r2,PT_GR19(%r1)	/* save for child */ -	STREG	%r30,PT_GR21(%r1) -	BL	sys_clone,%r2 -	copy	%r1,%r24 - -	b	wrapper_exit -	LDREG	-RP_OFFSET-FRAME_SIZE(%r30),%r2 -ENDPROC(sys_clone_wrapper) - - -ENTRY(sys_vfork_wrapper) -	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 -	ldo	TASK_REGS(%r1),%r1	/* get pt regs */ -	reg_save %r1 -	mfctl	%cr27, %r3 -	STREG	%r3, PT_CR27(%r1) - -	STREG	%r2,-RP_OFFSET(%r30) -	ldo	FRAME_SIZE(%r30),%r30 -#ifdef CONFIG_64BIT -	ldo	-16(%r30),%r29		/* Reference param save area */ -#endif - -	STREG	%r2,PT_GR19(%r1)	/* save for child */ -	STREG	%r30,PT_GR21(%r1) - -	BL	sys_vfork,%r2 -	copy	%r1,%r26 - -	b	wrapper_exit -	LDREG	-RP_OFFSET-FRAME_SIZE(%r30),%r2 -ENDPROC(sys_vfork_wrapper) - -	 -	.macro  execve_wrapper execve -	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 -	ldo	TASK_REGS(%r1),%r1	/* get pt regs */ - -	/* -	 * Do we need to save/restore r3-r18 here? -	 * I don't think so. why would new thread need old -	 * threads registers? -	 */ - -	/* %arg0 - %arg3 are already saved for us. */ - -	STREG %r2,-RP_OFFSET(%r30) -	ldo FRAME_SIZE(%r30),%r30 -#ifdef CONFIG_64BIT -	ldo	-16(%r30),%r29		/* Reference param save area */ -#endif -	BL \execve,%r2 -	copy %r1,%arg0 - -	ldo -FRAME_SIZE(%r30),%r30 -	LDREG -RP_OFFSET(%r30),%r2 - -	/* If exec succeeded we need to load the args */ - -	ldo -1024(%r0),%r1 -	cmpb,>>= %r28,%r1,error_\execve -	copy %r2,%r19 - -error_\execve: -	bv %r0(%r19) -	nop -	.endm - -	.import sys_execve -ENTRY(sys_execve_wrapper) -	execve_wrapper sys_execve -ENDPROC(sys_execve_wrapper) - -#ifdef CONFIG_64BIT -	.import sys32_execve -ENTRY(sys32_execve_wrapper) -	execve_wrapper sys32_execve -ENDPROC(sys32_execve_wrapper) -#endif -  ENTRY(sys_rt_sigreturn_wrapper)  	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r26  	ldo	TASK_REGS(%r26),%r26	/* get pt regs */ diff --git a/arch/parisc/kernel/pdc_cons.c b/arch/parisc/kernel/pdc_cons.c index 88238638aee..efc5e7d3053 100644 --- a/arch/parisc/kernel/pdc_cons.c +++ b/arch/parisc/kernel/pdc_cons.c @@ -186,13 +186,13 @@ static int __init pdc_console_tty_driver_init(void)  	printk(KERN_INFO "The PDC console driver is still registered, removing CON_BOOT flag\n");  	pdc_cons.flags &= ~CON_BOOT; -	tty_port_init(&tty_port); -  	pdc_console_tty_driver = alloc_tty_driver(1);  	if (!pdc_console_tty_driver)  		return -ENOMEM; +	tty_port_init(&tty_port); +  	pdc_console_tty_driver->driver_name = "pdc_cons";  	pdc_console_tty_driver->name = "ttyB";  	pdc_console_tty_driver->major = MUX_MAJOR; @@ -207,6 +207,7 @@ static int __init pdc_console_tty_driver_init(void)  	err = tty_register_driver(pdc_console_tty_driver);  	if (err) {  		printk(KERN_ERR "Unable to register the PDC console TTY driver\n"); +		tty_port_destroy(&tty_port);  		return err;  	} diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c index cbc37216bf9..d13507246c5 100644 --- a/arch/parisc/kernel/process.c +++ b/arch/parisc/kernel/process.c @@ -52,6 +52,7 @@  #include <asm/io.h>  #include <asm/asm-offsets.h> +#include <asm/assembly.h>  #include <asm/pdc.h>  #include <asm/pdc_chassis.h>  #include <asm/pgalloc.h> @@ -165,23 +166,6 @@ void (*pm_power_off)(void) = machine_power_off;  EXPORT_SYMBOL(pm_power_off);  /* - * Create a kernel thread - */ - -extern pid_t __kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) -{ - -	/* -	 * FIXME: Once we are sure we don't need any debug here, -	 *	  kernel_thread can become a #define. -	 */ - -	return __kernel_thread(fn, arg, flags); -} -EXPORT_SYMBOL(kernel_thread); - -/*   * Free current thread data structures etc..   */  void exit_thread(void) @@ -218,48 +202,11 @@ int dump_task_fpu (struct task_struct *tsk, elf_fpregset_t *r)  	return 1;  } -/* Note that "fork()" is implemented in terms of clone, with -   parameters (SIGCHLD, regs->gr[30], regs). */ -int -sys_clone(unsigned long clone_flags, unsigned long usp, -	  struct pt_regs *regs) -{ -  	/* Arugments from userspace are: -	   r26 = Clone flags. -	   r25 = Child stack. -	   r24 = parent_tidptr. -	   r23 = Is the TLS storage descriptor  -	   r22 = child_tidptr  -	    -	   However, these last 3 args are only examined -	   if the proper flags are set. */ -	int __user *parent_tidptr = (int __user *)regs->gr[24]; -	int __user *child_tidptr  = (int __user *)regs->gr[22]; - -	/* usp must be word aligned.  This also prevents users from -	 * passing in the value 1 (which is the signal for a special -	 * return for a kernel thread) */ -	usp = ALIGN(usp, 4); - -	/* A zero value for usp means use the current stack */ -	if (usp == 0) -	  usp = regs->gr[30]; - -	return do_fork(clone_flags, usp, regs, 0, parent_tidptr, child_tidptr); -} - -int -sys_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->gr[30], regs, 0, NULL, NULL); -} -  int  copy_thread(unsigned long clone_flags, unsigned long usp, -	    unsigned long unused,	/* in ia64 this is "user_stack_size" */ -	    struct task_struct * p, struct pt_regs * pregs) +	    unsigned long arg, struct task_struct *p)  { -	struct pt_regs * cregs = &(p->thread.regs); +	struct pt_regs *cregs = &(p->thread.regs);  	void *stack = task_stack_page(p);  	/* We have to use void * instead of a function pointer, because @@ -270,48 +217,39 @@ copy_thread(unsigned long clone_flags, unsigned long usp,  #ifdef CONFIG_HPUX  	extern void * const hpux_child_return;  #endif +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(cregs, 0, sizeof(struct pt_regs)); +		if (!usp) /* idle thread */ +			return 0; -	*cregs = *pregs; - -	/* Set the return value for the child.  Note that this is not -           actually restored by the syscall exit path, but we put it -           here for consistency in case of signals. */ -	cregs->gr[28] = 0; /* child */ - -	/* -	 * We need to differentiate between a user fork and a -	 * kernel fork. We can't use user_mode, because the -	 * the syscall path doesn't save iaoq. Right now -	 * We rely on the fact that kernel_thread passes -	 * in zero for usp. -	 */ -	if (usp == 1) {  		/* kernel thread */ -		cregs->ksp = (unsigned long)stack + THREAD_SZ_ALGN;  		/* Must exit via ret_from_kernel_thread in order  		 * to call schedule_tail()  		 */ +		cregs->ksp = (unsigned long)stack + THREAD_SZ_ALGN + FRAME_SIZE;  		cregs->kpc = (unsigned long) &ret_from_kernel_thread;  		/*  		 * Copy function and argument to be called from  		 * ret_from_kernel_thread.  		 */  #ifdef CONFIG_64BIT -		cregs->gr[27] = pregs->gr[27]; +		cregs->gr[27] = ((unsigned long *)usp)[3]; +		cregs->gr[26] = ((unsigned long *)usp)[2]; +#else +		cregs->gr[26] = usp;  #endif -		cregs->gr[26] = pregs->gr[26]; -		cregs->gr[25] = pregs->gr[25]; +		cregs->gr[25] = arg;  	} else {  		/* user thread */ -		/* -		 * Note that the fork wrappers are responsible -		 * for setting gr[21]. -		 */ - -		/* Use same stack depth as parent */ -		cregs->ksp = (unsigned long)stack -			+ (pregs->gr[21] & (THREAD_SIZE - 1)); -		cregs->gr[30] = usp; +		/* usp must be word aligned.  This also prevents users from +		 * passing in the value 1 (which is the signal for a special +		 * return for a kernel thread) */ +		if (usp) { +			usp = ALIGN(usp, 4); +			if (likely(usp)) +				cregs->gr[30] = usp; +		} +		cregs->ksp = (unsigned long)stack + THREAD_SZ_ALGN + FRAME_SIZE;  		if (personality(p->personality) == PER_HPUX) {  #ifdef CONFIG_HPUX  			cregs->kpc = (unsigned long) &hpux_child_return; @@ -323,8 +261,7 @@ copy_thread(unsigned long clone_flags, unsigned long usp,  		}  		/* Setup thread TLS area from the 4th parameter in clone */  		if (clone_flags & CLONE_SETTLS) -		  cregs->cr27 = pregs->gr[23]; -	 +			cregs->cr27 = cregs->gr[23];  	}  	return 0; @@ -335,39 +272,6 @@ unsigned long thread_saved_pc(struct task_struct *t)  	return t->thread.regs.kpc;  } -/* - * sys_execve() executes a new program. - */ - -asmlinkage int sys_execve(struct pt_regs *regs) -{ -	int error; -	struct filename *filename; - -	filename = getname((const char __user *) regs->gr[26]); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = do_execve(filename->name, -			  (const char __user *const __user *) regs->gr[25], -			  (const char __user *const __user *) regs->gr[24], -			  regs); -	putname(filename); -out: - -	return error; -} - -extern int __execve(const char *filename, -		    const char *const argv[], -		    const char *const envp[], struct task_struct *task); -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	return __execve(filename, argv, envp, current); -} -  unsigned long  get_wchan(struct task_struct *p)  { diff --git a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c index bf5b93a885d..9cfdaa19ab6 100644 --- a/arch/parisc/kernel/sys_parisc32.c +++ b/arch/parisc/kernel/sys_parisc32.c @@ -53,28 +53,6 @@  #define DBG(x)  #endif -/* - * sys32_execve() executes a new program. - */ - -asmlinkage int sys32_execve(struct pt_regs *regs) -{ -	int error; -	struct filename *filename; - -	DBG(("sys32_execve(%p) r26 = 0x%lx\n", regs, regs->gr[26])); -	filename = getname((const char __user *) regs->gr[26]); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = compat_do_execve(filename->name, compat_ptr(regs->gr[25]), -				 compat_ptr(regs->gr[24]), regs); -	putname(filename); -out: - -	return error; -} -  asmlinkage long sys32_unimplemented(int r26, int r25, int r24, int r23,  	int r22, int r21, int r20)  { diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 3735abd7f8f..54d950b067b 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S @@ -60,13 +60,13 @@  	ENTRY_SAME(fork_wrapper)  	ENTRY_SAME(read)  	ENTRY_SAME(write) -	ENTRY_SAME(open)		/* 5 */ +	ENTRY_COMP(open)		/* 5 */  	ENTRY_SAME(close)  	ENTRY_SAME(waitpid)  	ENTRY_SAME(creat)  	ENTRY_SAME(link)  	ENTRY_SAME(unlink)		/* 10 */ -	ENTRY_DIFF(execve_wrapper) +	ENTRY_COMP(execve)  	ENTRY_SAME(chdir)  	/* See comments in kernel/time.c!!! Maybe we don't need this? */  	ENTRY_COMP(time) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index a902a5c1c76..951a517a1a0 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -144,6 +144,8 @@ config PPC  	select GENERIC_KERNEL_THREAD  	select HAVE_MOD_ARCH_SPECIFIC  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_EXECVE +	select CLONE_BACKWARDS  config EARLY_PRINTK  	bool diff --git a/arch/powerpc/include/asm/Kbuild b/arch/powerpc/include/asm/Kbuild index a4fe15e33c6..2d62b484b3f 100644 --- a/arch/powerpc/include/asm/Kbuild +++ b/arch/powerpc/include/asm/Kbuild @@ -2,3 +2,4 @@  generic-y += clkdev.h  generic-y += rwsem.h +generic-y += trace_clock.h diff --git a/arch/powerpc/include/asm/cputime.h b/arch/powerpc/include/asm/cputime.h index 487d46ff68a..483733bd06d 100644 --- a/arch/powerpc/include/asm/cputime.h +++ b/arch/powerpc/include/asm/cputime.h @@ -228,6 +228,8 @@ static inline cputime_t clock_t_to_cputime(const unsigned long clk)  #define cputime64_to_clock_t(ct)	cputime_to_clock_t((cputime_t)(ct)) +static inline void arch_vtime_task_switch(struct task_struct *tsk) { } +  #endif /* __KERNEL__ */  #endif /* CONFIG_VIRT_CPU_ACCOUNTING */  #endif /* __POWERPC_CPUTIME_H */ diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h index 5f73ce63fca..42b1f43b943 100644 --- a/arch/powerpc/include/asm/ppc-opcode.h +++ b/arch/powerpc/include/asm/ppc-opcode.h @@ -168,9 +168,12 @@  #define PPC_INST_AND			0x7c000038  #define PPC_INST_ANDDOT			0x7c000039  #define PPC_INST_OR			0x7c000378 +#define PPC_INST_XOR			0x7c000278  #define PPC_INST_ANDI			0x70000000  #define PPC_INST_ORI			0x60000000  #define PPC_INST_ORIS			0x64000000 +#define PPC_INST_XORI			0x68000000 +#define PPC_INST_XORIS			0x6c000000  #define PPC_INST_NEG			0x7c0000d0  #define PPC_INST_BRANCH			0x48000000  #define PPC_INST_BRANCH_COND		0x40800000 diff --git a/arch/powerpc/include/asm/signal.h b/arch/powerpc/include/asm/signal.h index 189998bb61c..a101637725a 100644 --- a/arch/powerpc/include/asm/signal.h +++ b/arch/powerpc/include/asm/signal.h @@ -3,6 +3,4 @@  #include <uapi/asm/signal.h> -struct pt_regs; -#define ptrace_signal_deliver(regs, cookie) do { } while (0)  #endif /* _ASM_POWERPC_SIGNAL_H */ diff --git a/arch/powerpc/include/asm/syscalls.h b/arch/powerpc/include/asm/syscalls.h index 329db4ec12c..b5308d3e6d3 100644 --- a/arch/powerpc/include/asm/syscalls.h +++ b/arch/powerpc/include/asm/syscalls.h @@ -17,15 +17,6 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len,  asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len,  		unsigned long prot, unsigned long flags,  		unsigned long fd, unsigned long pgoff); -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long usp, -		int __user *parent_tidp, void __user *child_threadptr, -		int __user *child_tidp, int p6, struct pt_regs *regs); -asmlinkage int sys_fork(unsigned long p1, unsigned long p2, -		unsigned long p3, unsigned long p4, unsigned long p5, -		unsigned long p6, struct pt_regs *regs); -asmlinkage int sys_vfork(unsigned long p1, unsigned long p2, -		unsigned long p3, unsigned long p4, unsigned long p5, -		unsigned long p6, struct pt_regs *regs);  asmlinkage long sys_pipe(int __user *fildes);  asmlinkage long sys_pipe2(int __user *fildes, int flags);  asmlinkage long sys_rt_sigaction(int sig, diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h index 921dce6d844..76fe846ec40 100644 --- a/arch/powerpc/include/asm/unistd.h +++ b/arch/powerpc/include/asm/unistd.h @@ -56,7 +56,9 @@  #define __ARCH_WANT_COMPAT_SYS_SENDFILE  #endif  #define __ARCH_WANT_SYS_EXECVE -#define __ARCH_WANT_KERNEL_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/powerpc/include/uapi/asm/ioctls.h b/arch/powerpc/include/uapi/asm/ioctls.h index e9b78870aaa..49a25796a61 100644 --- a/arch/powerpc/include/uapi/asm/ioctls.h +++ b/arch/powerpc/include/uapi/asm/ioctls.h @@ -97,6 +97,9 @@  #define TIOCGDEV	_IOR('T',0x32, unsigned int) /* Get primary device node of /dev/console */  #define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */  #define TIOCVHANGUP	0x5437 +#define TIOCGPKT	_IOR('T', 0x38, int) /* Get packet mode state */ +#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */ +#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */  #define TIOCSERCONFIG	0x5453  #define TIOCSERGWILD	0x5454 diff --git a/arch/powerpc/include/uapi/asm/socket.h b/arch/powerpc/include/uapi/asm/socket.h index 3d5179bb122..eb0b1864d40 100644 --- a/arch/powerpc/include/uapi/asm/socket.h +++ b/arch/powerpc/include/uapi/asm/socket.h @@ -47,6 +47,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER	26  #define SO_DETACH_FILTER	27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		28  #define SO_TIMESTAMP		29 diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 9499385676e..d22e73e4618 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S @@ -444,11 +444,6 @@ ret_from_kernel_thread:  	PPC440EP_ERR42  	blrl  	li	r3,0 -	b	do_exit		# no return - -	.globl	__ret_from_kernel_execve -__ret_from_kernel_execve: -	addi	r1,r3,-STACK_FRAME_OVERHEAD  	b	ret_from_syscall  /* Traced system call support */ diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 56e0ff0878b..e9a906c2723 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S @@ -373,17 +373,11 @@ _GLOBAL(ret_from_fork)  _GLOBAL(ret_from_kernel_thread)  	bl	.schedule_tail  	REST_NVGPRS(r1) -	REST_GPR(2,r1) +	ld	r14, 0(r14)  	mtlr	r14  	mr	r3,r15  	blrl  	li	r3,0 -	b	.do_exit	# no return - -_GLOBAL(__ret_from_kernel_execve) -	addi	r1,r3,-STACK_FRAME_OVERHEAD -	li	r10,1 -	std	r10,SOFTE(r1)  	b	syscall_exit  	.section	".toc","aw" diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 7f94f760dd0..abc0d085699 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -1428,8 +1428,6 @@ void __init pcibios_resource_survey(void)  		ppc_md.pcibios_fixup();  } -#ifdef CONFIG_HOTPLUG -  /* This is used by the PCI hotplug driver to allocate resource   * of newly plugged busses. We can try to consolidate with the   * rest of the code later, for now, keep it as-is as our main @@ -1488,8 +1486,6 @@ void pcibios_finish_adding_to_bus(struct pci_bus *bus)  }  EXPORT_SYMBOL_GPL(pcibios_finish_adding_to_bus); -#endif /* CONFIG_HOTPLUG */ -  int pcibios_enable_device(struct pci_dev *dev, int mask)  {  	if (ppc_md.pcibios_enable_device_hook) diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 4ff190ff24a..2cbe6768fdd 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c @@ -74,8 +74,6 @@ static int __init pcibios_init(void)  subsys_initcall(pcibios_init); -#ifdef CONFIG_HOTPLUG -  int pcibios_unmap_io_space(struct pci_bus *bus)  {  	struct pci_controller *hose; @@ -124,8 +122,6 @@ int pcibios_unmap_io_space(struct pci_bus *bus)  }  EXPORT_SYMBOL_GPL(pcibios_unmap_io_space); -#endif /* CONFIG_HOTPLUG */ -  static int __devinit pcibios_map_phb_io_space(struct pci_controller *hose)  {  	struct vm_struct *area; diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index ba48233500f..81430674e71 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -733,8 +733,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)  extern unsigned long dscr_default; /* defined in arch/powerpc/kernel/sysfs.c */  int copy_thread(unsigned long clone_flags, unsigned long usp, -		unsigned long arg, struct task_struct *p, -		struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  {  	struct pt_regs *childregs, *kregs;  	extern void ret_from_fork(void); @@ -745,25 +744,25 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	/* Copy registers */  	sp -= sizeof(struct pt_regs);  	childregs = (struct pt_regs *) sp; -	if (!regs) { -		/* for kernel thread, set `current' and stackptr in new task */ +	if (unlikely(p->flags & PF_KTHREAD)) { +		struct thread_info *ti = (void *)task_stack_page(p);  		memset(childregs, 0, sizeof(struct pt_regs));  		childregs->gpr[1] = sp + sizeof(struct pt_regs); +		childregs->gpr[14] = usp;	/* function */  #ifdef CONFIG_PPC64 -		childregs->gpr[14] = *(unsigned long *)usp; -		childregs->gpr[2] = ((unsigned long *)usp)[1],  		clear_tsk_thread_flag(p, TIF_32BIT); -#else -		childregs->gpr[14] = usp;	/* function */ -		childregs->gpr[2] = (unsigned long) p; +		childregs->softe = 1;  #endif  		childregs->gpr[15] = arg;  		p->thread.regs = NULL;	/* no user register state */ +		ti->flags |= _TIF_RESTOREALL;  		f = ret_from_kernel_thread;  	} else { +		struct pt_regs *regs = current_pt_regs();  		CHECK_FULL_REGS(regs);  		*childregs = *regs; -		childregs->gpr[1] = usp; +		if (usp) +			childregs->gpr[1] = usp;  		p->thread.regs = childregs;  		childregs->gpr[3] = 0;  /* Result from fork() */  		if (clone_flags & CLONE_SETTLS) { @@ -1027,51 +1026,6 @@ int get_unalign_ctl(struct task_struct *tsk, unsigned long adr)  	return put_user(tsk->thread.align_ctl, (unsigned int __user *)adr);  } -#define TRUNC_PTR(x)	((typeof(x))(((unsigned long)(x)) & 0xffffffff)) - -int sys_clone(unsigned long clone_flags, unsigned long usp, -	      int __user *parent_tidp, void __user *child_threadptr, -	      int __user *child_tidp, int p6, -	      struct pt_regs *regs) -{ -	CHECK_FULL_REGS(regs); -	if (usp == 0) -		usp = regs->gpr[1];	/* stack pointer for child */ -#ifdef CONFIG_PPC64 -	if (is_32bit_task()) { -		parent_tidp = TRUNC_PTR(parent_tidp); -		child_tidp = TRUNC_PTR(child_tidp); -	} -#endif - 	return do_fork(clone_flags, usp, regs, 0, parent_tidp, child_tidp); -} - -int sys_fork(unsigned long p1, unsigned long p2, unsigned long p3, -	     unsigned long p4, unsigned long p5, unsigned long p6, -	     struct pt_regs *regs) -{ -	CHECK_FULL_REGS(regs); -	return do_fork(SIGCHLD, regs->gpr[1], regs, 0, NULL, NULL); -} - -int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3, -	      unsigned long p4, unsigned long p5, unsigned long p6, -	      struct pt_regs *regs) -{ -	CHECK_FULL_REGS(regs); -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->gpr[1], -			regs, 0, NULL, NULL); -} - -void __ret_from_kernel_execve(struct pt_regs *normal) -__noreturn; - -void ret_from_kernel_execve(struct pt_regs *normal) -{ -	set_thread_flag(TIF_RESTOREALL); -	__ret_from_kernel_execve(normal); -} -  static inline int valid_irq_stack(unsigned long sp, struct task_struct *p,  				  unsigned long nbytes)  { diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index a2dc75793bd..3b997118df5 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c @@ -158,10 +158,8 @@ static int do_signal(struct pt_regs *regs)  void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)  { -	if (thread_info_flags & _TIF_UPROBE) { -		clear_thread_flag(TIF_UPROBE); +	if (thread_info_flags & _TIF_UPROBE)  		uprobe_notify_resume(regs); -	}  	if (thread_info_flags & _TIF_SIGPENDING)  		do_signal(regs); diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c index cf357a059dd..3ce1f864c2d 100644 --- a/arch/powerpc/kernel/sysfs.c +++ b/arch/powerpc/kernel/sysfs.c @@ -607,7 +607,7 @@ static void register_nodes(void)  int sysfs_add_device_to_node(struct device *dev, int nid)  { -	struct node *node = &node_devices[nid]; +	struct node *node = node_devices[nid];  	return sysfs_create_link(&node->dev.kobj, &dev->kobj,  			kobject_name(&dev->kobj));  } @@ -615,7 +615,7 @@ EXPORT_SYMBOL_GPL(sysfs_add_device_to_node);  void sysfs_remove_device_from_node(struct device *dev, int nid)  { -	struct node *node = &node_devices[nid]; +	struct node *node = node_devices[nid];  	sysfs_remove_link(&node->dev.kobj, kobject_name(&dev->kobj));  }  EXPORT_SYMBOL_GPL(sysfs_remove_device_from_node); diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index ce4cb772dc7..b3b14352b05 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -297,6 +297,8 @@ static u64 vtime_delta(struct task_struct *tsk,  	u64 now, nowscaled, deltascaled;  	u64 udelta, delta, user_scaled; +	WARN_ON_ONCE(!irqs_disabled()); +  	now = mftb();  	nowscaled = read_spurr(now);  	get_paca()->system_time += now - get_paca()->starttime; @@ -355,15 +357,15 @@ void vtime_account_idle(struct task_struct *tsk)  }  /* - * Transfer the user and system times accumulated in the paca - * by the exception entry and exit code to the generic process - * user and system time records. + * Transfer the user time accumulated in the paca + * by the exception entry and exit code to the generic + * process user time records.   * Must be called with interrupts disabled. - * Assumes that vtime_account() has been called recently - * (i.e. since the last entry from usermode) so that + * Assumes that vtime_account_system/idle() has been called + * recently (i.e. since the last entry from usermode) so that   * get_paca()->user_time_scaled is up to date.   */ -void account_process_tick(struct task_struct *tsk, int user_tick) +void vtime_account_user(struct task_struct *tsk)  {  	cputime_t utime, utimescaled; @@ -375,12 +377,6 @@ void account_process_tick(struct task_struct *tsk, int user_tick)  	account_user_time(tsk, utime, utimescaled);  } -void vtime_task_switch(struct task_struct *prev) -{ -	vtime_account(prev); -	account_process_tick(prev, 0); -} -  #else /* ! CONFIG_VIRT_CPU_ACCOUNTING */  #define calc_cputime_factors()  #endif diff --git a/arch/powerpc/kernel/uprobes.c b/arch/powerpc/kernel/uprobes.c index d2d46d1014f..bc77834dbf4 100644 --- a/arch/powerpc/kernel/uprobes.c +++ b/arch/powerpc/kernel/uprobes.c @@ -64,6 +64,8 @@ int arch_uprobe_pre_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)  	autask->saved_trap_nr = current->thread.trap_nr;  	current->thread.trap_nr = UPROBE_TRAP_NR;  	regs->nip = current->utask->xol_vaddr; + +	user_enable_single_step(current);  	return 0;  } @@ -119,6 +121,8 @@ int arch_uprobe_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)  	 * to be executed.  	 */  	regs->nip = utask->vaddr + MAX_UINSN_BYTES; + +	user_disable_single_step(current);  	return 0;  } @@ -162,6 +166,8 @@ void arch_uprobe_abort_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)  	current->thread.trap_nr = utask->autask.saved_trap_nr;  	instruction_pointer_set(regs, utask->vaddr); + +	user_disable_single_step(current);  }  /* diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h index 1fc8109bf2f..8a5dfaf5c6b 100644 --- a/arch/powerpc/net/bpf_jit.h +++ b/arch/powerpc/net/bpf_jit.h @@ -134,6 +134,12 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);  				     ___PPC_RS(a) | IMM_L(i))  #define PPC_ORIS(d, a, i)	EMIT(PPC_INST_ORIS | ___PPC_RA(d) |	      \  				     ___PPC_RS(a) | IMM_L(i)) +#define PPC_XOR(d, a, b)	EMIT(PPC_INST_XOR | ___PPC_RA(d) |	      \ +				     ___PPC_RS(a) | ___PPC_RB(b)) +#define PPC_XORI(d, a, i)	EMIT(PPC_INST_XORI | ___PPC_RA(d) |	      \ +				     ___PPC_RS(a) | IMM_L(i)) +#define PPC_XORIS(d, a, i)	EMIT(PPC_INST_XORIS | ___PPC_RA(d) |	      \ +				     ___PPC_RS(a) | IMM_L(i))  #define PPC_SLW(d, a, s)	EMIT(PPC_INST_SLW | ___PPC_RA(d) |	      \  				     ___PPC_RS(a) | ___PPC_RB(s))  #define PPC_SRW(d, a, s)	EMIT(PPC_INST_SRW | ___PPC_RA(d) |	      \ diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c index dd1130642d0..e834f1ec23c 100644 --- a/arch/powerpc/net/bpf_jit_comp.c +++ b/arch/powerpc/net/bpf_jit_comp.c @@ -13,6 +13,8 @@  #include <asm/cacheflush.h>  #include <linux/netdevice.h>  #include <linux/filter.h> +#include <linux/if_vlan.h> +  #include "bpf_jit.h"  #ifndef __BIG_ENDIAN @@ -89,6 +91,8 @@ static void bpf_jit_build_prologue(struct sk_filter *fp, u32 *image,  	case BPF_S_ANC_IFINDEX:  	case BPF_S_ANC_MARK:  	case BPF_S_ANC_RXHASH: +	case BPF_S_ANC_VLAN_TAG: +	case BPF_S_ANC_VLAN_TAG_PRESENT:  	case BPF_S_ANC_CPU:  	case BPF_S_ANC_QUEUE:  	case BPF_S_LD_W_ABS: @@ -232,6 +236,17 @@ static int bpf_jit_build_body(struct sk_filter *fp, u32 *image,  			if (K >= 65536)  				PPC_ORIS(r_A, r_A, IMM_H(K));  			break; +		case BPF_S_ANC_ALU_XOR_X: +		case BPF_S_ALU_XOR_X: /* A ^= X */ +			ctx->seen |= SEEN_XREG; +			PPC_XOR(r_A, r_A, r_X); +			break; +		case BPF_S_ALU_XOR_K: /* A ^= K */ +			if (IMM_L(K)) +				PPC_XORI(r_A, r_A, IMM_L(K)); +			if (K >= 65536) +				PPC_XORIS(r_A, r_A, IMM_H(K)); +			break;  		case BPF_S_ALU_LSH_X: /* A <<= X; */  			ctx->seen |= SEEN_XREG;  			PPC_SLW(r_A, r_A, r_X); @@ -371,6 +386,16 @@ static int bpf_jit_build_body(struct sk_filter *fp, u32 *image,  			PPC_LWZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,  							  rxhash));  			break; +		case BPF_S_ANC_VLAN_TAG: +		case BPF_S_ANC_VLAN_TAG_PRESENT: +			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, vlan_tci) != 2); +			PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff, +							  vlan_tci)); +			if (filter[i].code == BPF_S_ANC_VLAN_TAG) +				PPC_ANDI(r_A, r_A, VLAN_VID_MASK); +			else +				PPC_ANDI(r_A, r_A, VLAN_TAG_PRESENT); +			break;  		case BPF_S_ANC_QUEUE:  			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,  						  queue_mapping) != 2); diff --git a/arch/powerpc/platforms/cell/celleb_pci.c b/arch/powerpc/platforms/cell/celleb_pci.c index abc8af43ea7..173568140a3 100644 --- a/arch/powerpc/platforms/cell/celleb_pci.c +++ b/arch/powerpc/platforms/cell/celleb_pci.c @@ -401,11 +401,11 @@ error:  	} else {  		if (config && *config) {  			size = 256; -			free_bootmem((unsigned long)(*config), size); +			free_bootmem(__pa(*config), size);  		}  		if (res && *res) {  			size = sizeof(struct celleb_pci_resource); -			free_bootmem((unsigned long)(*res), size); +			free_bootmem(__pa(*res), size);  		}  	} diff --git a/arch/powerpc/platforms/powermac/pfunc_core.c b/arch/powerpc/platforms/powermac/pfunc_core.c index b0c3777528a..d588e48dff7 100644 --- a/arch/powerpc/platforms/powermac/pfunc_core.c +++ b/arch/powerpc/platforms/powermac/pfunc_core.c @@ -686,7 +686,7 @@ static int pmf_add_functions(struct pmf_device *dev, void *driverdata)  	int count = 0;  	for (pp = dev->node->properties; pp != 0; pp = pp->next) { -		char *name; +		const char *name;  		if (strncmp(pp->name, PP_PREFIX, plen) != 0)  			continue;  		name = pp->name + plen; diff --git a/arch/powerpc/platforms/pseries/processor_idle.c b/arch/powerpc/platforms/pseries/processor_idle.c index 45d00e5fe14..4d806b41960 100644 --- a/arch/powerpc/platforms/pseries/processor_idle.c +++ b/arch/powerpc/platforms/pseries/processor_idle.c @@ -36,7 +36,7 @@ static struct cpuidle_state *cpuidle_state_table;  static inline void idle_loop_prolog(unsigned long *in_purr, ktime_t *kt_before)  { -	*kt_before = ktime_get_real(); +	*kt_before = ktime_get();  	*in_purr = mfspr(SPRN_PURR);  	/*  	 * Indicate to the HV that we are idle. Now would be @@ -50,7 +50,7 @@ static inline  s64 idle_loop_epilog(unsigned long in_purr, ktime_t kt_before)  	get_lppaca()->wait_state_cycles += mfspr(SPRN_PURR) - in_purr;  	get_lppaca()->idle = 0; -	return ktime_to_us(ktime_sub(ktime_get_real(), kt_before)); +	return ktime_to_us(ktime_sub(ktime_get(), kt_before));  }  static int snooze_loop(struct cpuidle_device *dev, diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c index 39f71fba9b3..2f4668136b2 100644 --- a/arch/powerpc/platforms/pseries/reconfig.c +++ b/arch/powerpc/platforms/pseries/reconfig.c @@ -281,12 +281,11 @@ static struct property *new_property(const char *name, const int length,  	if (!new)  		return NULL; -	if (!(new->name = kmalloc(strlen(name) + 1, GFP_KERNEL))) +	if (!(new->name = kstrdup(name, GFP_KERNEL)))  		goto cleanup;  	if (!(new->value = kmalloc(length + 1, GFP_KERNEL)))  		goto cleanup; -	strcpy(new->name, name);  	memcpy(new->value, value, length);  	*(((char *)new->value) + length) = 0;  	new->length = length; diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index ffb93ae9379..01b62a62c63 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c @@ -136,7 +136,7 @@ static void __init setup_pci_atmu(struct pci_controller *hose,  	u32 pcicsrbar = 0, pcicsrbar_sz;  	u32 piwar = PIWAR_EN | PIWAR_PF | PIWAR_TGI_LOCAL |  			PIWAR_READ_SNOOP | PIWAR_WRITE_SNOOP; -	char *name = hose->dn->full_name; +	const char *name = hose->dn->full_name;  	const u64 *reg;  	int len; diff --git a/arch/powerpc/sysdev/scom.c b/arch/powerpc/sysdev/scom.c index 702256a1ca1..9193e12df69 100644 --- a/arch/powerpc/sysdev/scom.c +++ b/arch/powerpc/sysdev/scom.c @@ -157,7 +157,7 @@ static int scom_debug_init_one(struct dentry *root, struct device_node *dn,  	ent->map = SCOM_MAP_INVALID;  	spin_lock_init(&ent->lock);  	snprintf(ent->name, 8, "scom%d", i); -	ent->blob.data = dn->full_name; +	ent->blob.data = (void*) dn->full_name;  	ent->blob.size = strlen(dn->full_name);  	dir = debugfs_create_dir(ent->name, root); diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index d385f396dfe..3cbb8757704 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -138,8 +138,10 @@ config S390  	select KTIME_SCALAR if 32BIT  	select HAVE_ARCH_SECCOMP_FILTER  	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  	select HAVE_MOD_ARCH_SPECIFIC  	select MODULES_USE_ELF_RELA +	select CLONE_BACKWARDS2  config SCHED_OMIT_FRAME_POINTER  	def_bool y diff --git a/arch/s390/include/asm/Kbuild b/arch/s390/include/asm/Kbuild index 0633dc6d254..f313f9cbcf4 100644 --- a/arch/s390/include/asm/Kbuild +++ b/arch/s390/include/asm/Kbuild @@ -1,3 +1,4 @@  generic-y += clkdev.h +generic-y += trace_clock.h diff --git a/arch/s390/include/asm/cputime.h b/arch/s390/include/asm/cputime.h index 023d5ae2448..d2ff41370c0 100644 --- a/arch/s390/include/asm/cputime.h +++ b/arch/s390/include/asm/cputime.h @@ -14,6 +14,7 @@  #define __ARCH_HAS_VTIME_ACCOUNT +#define __ARCH_HAS_VTIME_TASK_SWITCH  /* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */ diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h index 6d5367060a5..39faa4ac966 100644 --- a/arch/s390/include/asm/page.h +++ b/arch/s390/include/asm/page.h @@ -158,6 +158,9 @@ static inline int page_reset_referenced(unsigned long addr)   * race against modification of the referenced bit. This function   * should therefore only be called if it is not mapped in any   * address space. + * + * Note that the bit gets set whenever page content is changed. That means + * also when the page is modified by DMA or from inside the kernel.   */  #define __HAVE_ARCH_PAGE_TEST_AND_CLEAR_DIRTY  static inline int page_test_and_clear_dirty(unsigned long pfn, int mapped) diff --git a/arch/s390/include/asm/signal.h b/arch/s390/include/asm/signal.h index bffdbdd5b3d..db7ddfaf5b7 100644 --- a/arch/s390/include/asm/signal.h +++ b/arch/s390/include/asm/signal.h @@ -39,6 +39,4 @@ struct k_sigaction {          struct sigaction sa;  }; -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -  #endif diff --git a/arch/s390/include/asm/unistd.h b/arch/s390/include/asm/unistd.h index bbbae41fa9a..086bb8eaf6a 100644 --- a/arch/s390/include/asm/unistd.h +++ b/arch/s390/include/asm/unistd.h @@ -54,7 +54,9 @@  #   define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND  # endif  #define __ARCH_WANT_SYS_EXECVE -#define __ARCH_WANT_KERNEL_EXECVE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/s390/include/uapi/asm/socket.h b/arch/s390/include/uapi/asm/socket.h index 69718cd6d63..436d07c23be 100644 --- a/arch/s390/include/uapi/asm/socket.h +++ b/arch/s390/include/uapi/asm/socket.h @@ -46,6 +46,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER        26  #define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		28  #define SO_TIMESTAMP		29 diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index ad79b846535..827e094a2f4 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S @@ -28,7 +28,7 @@ ENTRY(sys32_open_wrapper)  	llgtr	%r2,%r2			# const char *  	lgfr	%r3,%r3			# int  	lgfr	%r4,%r4			# int -	jg	sys_open		# branch to system call +	jg	compat_sys_open		# branch to system call  ENTRY(sys32_close_wrapper)  	llgfr	%r2,%r2			# unsigned int diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index ef46f66bc0d..aa8f2ba6289 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S @@ -330,40 +330,18 @@ ENTRY(ret_from_fork)  	la	%r11,STACK_FRAME_OVERHEAD(%r15)  	l	%r12,__LC_THREAD_INFO  	l	%r13,__LC_SVC_NEW_PSW+4 -	tm	__PT_PSW+1(%r11),0x01	# forking a kernel thread ? -	je	1f  	l	%r1,BASED(.Lschedule_tail)  	basr	%r14,%r1		# call schedule_tail  	TRACE_IRQS_ON  	ssm	__LC_SVC_NEW_PSW	# reenable interrupts -	j	sysc_tracenogo - -1:	# it's a kernel thread -	st	%r15,__PT_R15(%r11)	# store stack pointer for new kthread -	l	%r1,BASED(.Lschedule_tail) -	basr	%r14,%r1		# call schedule_tail -	TRACE_IRQS_ON -	ssm	__LC_SVC_NEW_PSW	# reenable interrupts -	lm	%r9,%r11,__PT_R9(%r11)	# load gprs +	tm	__PT_PSW+1(%r11),0x01	# forking a kernel thread ? +	jne	sysc_tracenogo +	# it's a kernel thread +	lm	%r9,%r10,__PT_R9(%r11)	# load gprs  ENTRY(kernel_thread_starter)  	la	%r2,0(%r10)  	basr	%r14,%r9 -	la	%r2,0 -	br	%r11			# do_exit - -# -# kernel_execve function needs to deal with pt_regs that is not -# at the usual place -# -ENTRY(ret_from_kernel_execve) -	ssm	__LC_PGM_NEW_PSW	# disable I/O and ext. interrupts -	lr	%r15,%r2 -	lr	%r11,%r2 -	ahi	%r15,-STACK_FRAME_OVERHEAD -	xc	__SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) -	l	%r12,__LC_THREAD_INFO -	ssm	__LC_SVC_NEW_PSW	# reenable interrupts -	j	sysc_return +	j	sysc_tracenogo  /*   * Program check handler routine diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h index d0d3f69a734..d8251b98f17 100644 --- a/arch/s390/kernel/entry.h +++ b/arch/s390/kernel/entry.h @@ -54,10 +54,6 @@ long sys_s390_fadvise64(int fd, u32 offset_high, u32 offset_low,  long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args);  long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high,  			u32 len_low); -long sys_fork(void); -long sys_clone(unsigned long newsp, unsigned long clone_flags, -	       int __user *parent_tidptr, int __user *child_tidptr); -long sys_vfork(void);  long sys_sigsuspend(int history0, int history1, old_sigset_t mask);  long sys_sigaction(int sig, const struct old_sigaction __user *act,  		   struct old_sigaction __user *oact); diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 07d8de35398..499e95e90f3 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S @@ -352,33 +352,17 @@ sysc_tracenogo:  ENTRY(ret_from_fork)  	la	%r11,STACK_FRAME_OVERHEAD(%r15)  	lg	%r12,__LC_THREAD_INFO -	tm	__PT_PSW+1(%r11),0x01	# forking a kernel thread ? -	je	1f  	brasl	%r14,schedule_tail  	TRACE_IRQS_ON  	ssm	__LC_SVC_NEW_PSW	# reenable interrupts -	j	sysc_tracenogo -1:	# it's a kernel thread -	stg	%r15,__PT_R15(%r11)	# store stack pointer for new kthread -	brasl	%r14,schedule_tail -	TRACE_IRQS_ON -	ssm	__LC_SVC_NEW_PSW	# reenable interrupts -	lmg	%r9,%r11,__PT_R9(%r11)	# load gprs +	tm	__PT_PSW+1(%r11),0x01	# forking a kernel thread ? +	jne	sysc_tracenogo +	# it's a kernel thread +	lmg	%r9,%r10,__PT_R9(%r11)	# load gprs  ENTRY(kernel_thread_starter)  	la	%r2,0(%r10)  	basr	%r14,%r9 -	la	%r2,0 -	br	%r11			# do_exit - -ENTRY(ret_from_kernel_execve) -	ssm	__LC_PGM_NEW_PSW	# disable I/O and ext. interrupts -	lgr	%r15,%r2 -	lgr	%r11,%r2 -	aghi	%r15,-STACK_FRAME_OVERHEAD -	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) -	lg	%r12,__LC_THREAD_INFO -	ssm	__LC_SVC_NEW_PSW	# reenable interrupts -	j	sysc_return +	j	sysc_tracenogo  /*   * Program check handler routine diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index cd31ad457a9..536d64579d9 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c @@ -117,8 +117,7 @@ void release_thread(struct task_struct *dead_task)  }  int copy_thread(unsigned long clone_flags, unsigned long new_stackp, -		unsigned long arg, -		struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  {  	struct thread_info *ti;  	struct fake_frame @@ -150,7 +149,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,  	frame->sf.gprs[9] = (unsigned long) frame;  	/* Store access registers to kernel stack of new process. */ -	if (unlikely(!regs)) { +	if (unlikely(p->flags & PF_KTHREAD)) {  		/* kernel thread */  		memset(&frame->childregs, 0, sizeof(struct pt_regs));  		frame->childregs.psw.mask = psw_kernel_bits | PSW_MASK_DAT | @@ -164,9 +163,10 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,  		return 0;  	} -	frame->childregs = *regs; +	frame->childregs = *current_pt_regs();  	frame->childregs.gprs[2] = 0;	/* child returns 0 on fork. */ -	frame->childregs.gprs[15] = new_stackp; +	if (new_stackp) +		frame->childregs.gprs[15] = new_stackp;  	/* Don't copy runtime instrumentation info */  	p->thread.ri_cb = NULL; @@ -183,57 +183,24 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,  	       sizeof(s390_fp_regs));  	/* Set a new TLS ?  */  	if (clone_flags & CLONE_SETTLS) -		p->thread.acrs[0] = regs->gprs[6]; +		p->thread.acrs[0] = frame->childregs.gprs[6];  #else /* CONFIG_64BIT */  	/* Save the fpu registers to new thread structure. */  	save_fp_regs(&p->thread.fp_regs);  	/* Set a new TLS ?  */  	if (clone_flags & CLONE_SETTLS) { +		unsigned long tls = frame->childregs.gprs[6];  		if (is_compat_task()) { -			p->thread.acrs[0] = (unsigned int) regs->gprs[6]; +			p->thread.acrs[0] = (unsigned int)tls;  		} else { -			p->thread.acrs[0] = (unsigned int)(regs->gprs[6] >> 32); -			p->thread.acrs[1] = (unsigned int) regs->gprs[6]; +			p->thread.acrs[0] = (unsigned int)(tls >> 32); +			p->thread.acrs[1] = (unsigned int)tls;  		}  	}  #endif /* CONFIG_64BIT */  	return 0;  } -SYSCALL_DEFINE0(fork) -{ -	struct pt_regs *regs = task_pt_regs(current); -	return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL); -} - -SYSCALL_DEFINE4(clone, unsigned long, newsp, unsigned long, clone_flags, -		int __user *, parent_tidptr, int __user *, child_tidptr) -{ -	struct pt_regs *regs = task_pt_regs(current); - -	if (!newsp) -		newsp = regs->gprs[15]; -	return do_fork(clone_flags, newsp, regs, 0, -		       parent_tidptr, child_tidptr); -} - -/* - * This is trivial, and on the face of it looks like it - * could equally well be done in user mode. - * - * Not so, for quite unobvious reasons - register pressure. - * In user mode vfork() cannot have a stack frame, and if - * done by calling the "clone()" system call directly, you - * do not have enough call-clobbered registers to hold all - * the information you need. - */ -SYSCALL_DEFINE0(vfork) -{ -	struct pt_regs *regs = task_pt_regs(current); -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, -		       regs->gprs[15], regs, 0, NULL, NULL); -} -  asmlinkage void execve_tail(void)  {  	current->thread.fp_regs.fpc = 0; diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index 79033442789..e84b8b68444 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c @@ -112,7 +112,12 @@ void vtime_task_switch(struct task_struct *prev)  	S390_lowcore.system_timer = ti->system_timer;  } -void account_process_tick(struct task_struct *tsk, int user_tick) +/* + * In s390, accounting pending user time also implies + * accounting system time in order to correctly compute + * the stolen time accounting. + */ +void vtime_account_user(struct task_struct *tsk)  {  	if (do_account_vtime(tsk, HARDIRQ_OFFSET))  		virt_timer_expire(); @@ -127,6 +132,8 @@ void vtime_account(struct task_struct *tsk)  	struct thread_info *ti = task_thread_info(tsk);  	u64 timer, system; +	WARN_ON_ONCE(!irqs_disabled()); +  	timer = S390_lowcore.last_update_timer;  	S390_lowcore.last_update_timer = get_vtimer();  	S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; @@ -140,6 +147,10 @@ void vtime_account(struct task_struct *tsk)  }  EXPORT_SYMBOL_GPL(vtime_account); +void vtime_account_system(struct task_struct *tsk) +__attribute__((alias("vtime_account"))); +EXPORT_SYMBOL_GPL(vtime_account_system); +  void __kprobes vtime_stop_cpu(void)  {  	struct s390_idle_data *idle = &__get_cpu_var(s390_idle); diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index ecced9d1898..d91a9556800 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -608,9 +608,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)  		kvm_s390_deliver_pending_interrupts(vcpu);  	vcpu->arch.sie_block->icptcode = 0; -	local_irq_disable();  	kvm_guest_enter(); -	local_irq_enable();  	VCPU_EVENT(vcpu, 6, "entering sie flags %x",  		   atomic_read(&vcpu->arch.sie_block->cpuflags));  	trace_kvm_s390_sie_enter(vcpu, @@ -629,9 +627,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)  	VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",  		   vcpu->arch.sie_block->icptcode);  	trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode); -	local_irq_disable();  	kvm_guest_exit(); -	local_irq_enable();  	memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16);  	return rc; diff --git a/arch/score/Kconfig b/arch/score/Kconfig index 4f93a431a45..45893390c7d 100644 --- a/arch/score/Kconfig +++ b/arch/score/Kconfig @@ -13,6 +13,9 @@ config SCORE         select GENERIC_CLOCKEVENTS         select HAVE_MOD_ARCH_SPECIFIC  	select MODULES_USE_ELF_REL +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE +	select CLONE_BACKWARDS  choice  	prompt "System type" diff --git a/arch/score/include/asm/Kbuild b/arch/score/include/asm/Kbuild index ec697aeefd0..16e41fe1a41 100644 --- a/arch/score/include/asm/Kbuild +++ b/arch/score/include/asm/Kbuild @@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm  header-y +=  generic-y += clkdev.h +generic-y += trace_clock.h diff --git a/arch/score/include/asm/processor.h b/arch/score/include/asm/processor.h index ab3aceb5420..d9a922d8711 100644 --- a/arch/score/include/asm/processor.h +++ b/arch/score/include/asm/processor.h @@ -13,7 +13,6 @@ struct task_struct;   */  extern void (*cpu_wait)(void); -extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);  extern unsigned long thread_saved_pc(struct task_struct *tsk);  extern void start_thread(struct pt_regs *regs,  			unsigned long pc, unsigned long sp); diff --git a/arch/score/include/asm/syscalls.h b/arch/score/include/asm/syscalls.h index 1dd5e0d6b0c..acaeed68095 100644 --- a/arch/score/include/asm/syscalls.h +++ b/arch/score/include/asm/syscalls.h @@ -1,8 +1,6 @@  #ifndef _ASM_SCORE_SYSCALLS_H  #define _ASM_SCORE_SYSCALLS_H -asmlinkage long score_clone(struct pt_regs *regs); -asmlinkage long score_execve(struct pt_regs *regs);  asmlinkage long score_sigaltstack(struct pt_regs *regs);  asmlinkage long score_rt_sigreturn(struct pt_regs *regs); diff --git a/arch/score/include/asm/unistd.h b/arch/score/include/asm/unistd.h index a862384e9c1..56001c93095 100644 --- a/arch/score/include/asm/unistd.h +++ b/arch/score/include/asm/unistd.h @@ -4,5 +4,9 @@  #define __ARCH_WANT_SYSCALL_NO_FLAGS  #define __ARCH_WANT_SYSCALL_OFF_T  #define __ARCH_WANT_SYSCALL_DEPRECATED +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_CLONE +#define __ARCH_WANT_SYS_FORK +#define __ARCH_WANT_SYS_VFORK  #include <asm-generic/unistd.h> diff --git a/arch/score/kernel/entry.S b/arch/score/kernel/entry.S index 83bb96079c4..1557ca1a295 100644 --- a/arch/score/kernel/entry.S +++ b/arch/score/kernel/entry.S @@ -278,6 +278,13 @@ need_resched:  	nop  #endif +ENTRY(ret_from_kernel_thread) +	bl	schedule_tail			# r4=struct task_struct *prev +	nop +	mv	r4, r13 +	brl	r12 +	j	syscall_exit +  ENTRY(ret_from_fork)  	bl	schedule_tail			# r4=struct task_struct *prev @@ -480,16 +487,6 @@ illegal_syscall:  	sw	r9, [r0, PT_R7]  	j	syscall_return -ENTRY(sys_execve) -	mv	r4, r0 -	la	r8, score_execve -	br	r8 - -ENTRY(sys_clone) -	mv	r4, r0 -	la	r8, score_clone -	br	r8 -  ENTRY(sys_rt_sigreturn)  	mv	r4, r0  	la	r8, score_rt_sigreturn @@ -499,16 +496,3 @@ ENTRY(sys_sigaltstack)  	mv	r4, r0  	la	r8, score_sigaltstack  	br	r8 - -#ifdef __ARCH_WANT_SYSCALL_DEPRECATED -ENTRY(sys_fork) -	mv	r4, r0 -	la	r8, score_fork -	br	r8 - -ENTRY(sys_vfork) -	mv	r4, r0 -	la	r8, score_vfork -	br	r8 -#endif /* __ARCH_WANT_SYSCALL_DEPRECATED */ - diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c index 637970cfd3f..79568466b57 100644 --- a/arch/score/kernel/process.c +++ b/arch/score/kernel/process.c @@ -60,6 +60,7 @@ void __noreturn cpu_idle(void)  }  void ret_from_fork(void); +void ret_from_kernel_thread(void);  void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp)  { @@ -86,29 +87,27 @@ void flush_thread(void) {}   * set up the kernel stack and exception frames for a new process   */  int copy_thread(unsigned long clone_flags, unsigned long usp, -		unsigned long unused, -		struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  {  	struct thread_info *ti = task_thread_info(p);  	struct pt_regs *childregs = task_pt_regs(p); +	struct pt_regs *regs = current_pt_regs(); -	p->set_child_tid = NULL; -	p->clear_child_tid = NULL; - -	*childregs = *regs; -	childregs->regs[7] = 0;		/* Clear error flag */ -	childregs->regs[4] = 0;		/* Child gets zero as return value */ -	regs->regs[4] = p->pid; - -	if (childregs->cp0_psr & 0x8) {	/* test kernel fork or user fork */ -		childregs->regs[0] = usp;		/* user fork */ +	p->thread.reg0 = (unsigned long) childregs; +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(childregs, 0, sizeof(struct pt_regs)); +		p->thread->reg12 = usp; +		p->thread->reg13 = arg; +		p->thread.reg3 = (unsigned long) ret_from_kernel_thread;  	} else { -		childregs->regs[28] = (unsigned long) ti; /* kernel fork */ -		childregs->regs[0] = (unsigned long) childregs; +		*childregs = *current_pt_regs(); +		childregs->regs[7] = 0;		/* Clear error flag */ +		childregs->regs[4] = 0;		/* Child gets zero as return value */ +		if (usp) +			childregs->regs[0] = usp;	/* user fork */ +		p->thread.reg3 = (unsigned long) ret_from_fork;  	} -	p->thread.reg0 = (unsigned long) childregs; -	p->thread.reg3 = (unsigned long) ret_from_fork;  	p->thread.cp0_psr = 0;  	return 0; @@ -120,32 +119,6 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *r)  	return 1;  } -static void __noreturn -kernel_thread_helper(void *unused0, int (*fn)(void *), -		 void *arg, void *unused1) -{ -	do_exit(fn(arg)); -} - -/* - * Create a kernel thread. - */ -long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); - -	regs.regs[6] = (unsigned long) arg; -	regs.regs[5] = (unsigned long) fn; -	regs.cp0_epc = (unsigned long) kernel_thread_helper; -	regs.cp0_psr = (regs.cp0_psr & ~(0x1|0x4|0x8)) | \ -			((regs.cp0_psr & 0x3) << 2); - -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, \ -			0, ®s, 0, NULL, NULL); -} -  unsigned long thread_saved_pc(struct task_struct *tsk)  {  	return task_pt_regs(tsk)->cp0_epc; diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c index c268bbf8b41..02353bde92d 100644 --- a/arch/score/kernel/signal.c +++ b/arch/score/kernel/signal.c @@ -148,7 +148,6 @@ score_rt_sigreturn(struct pt_regs *regs)  {  	struct rt_sigframe __user *frame;  	sigset_t set; -	stack_t st;  	int sig;  	/* Always make any pending restarted system calls return -EINTR */ @@ -168,12 +167,10 @@ score_rt_sigreturn(struct pt_regs *regs)  	else if (sig)  		force_sig(sig, current); -	if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st))) -		goto badframe; -  	/* It is more difficult to avoid calling this function than to  	   call it and ignore errors.  */ -	do_sigaltstack((stack_t __user *)&st, NULL, regs->regs[0]); +	if (do_sigaltstack(&frame->rs_uc.uc_stack, NULL, regs->regs[0]) == -EFAULT) +		goto badframe;  	regs->is_syscall = 0;  	__asm__ __volatile__( diff --git a/arch/score/kernel/sys_score.c b/arch/score/kernel/sys_score.c index d45cf00a335..47c20ba4616 100644 --- a/arch/score/kernel/sys_score.c +++ b/arch/score/kernel/sys_score.c @@ -48,92 +48,3 @@ sys_mmap(unsigned long addr, unsigned long len, unsigned long prot,  		return -EINVAL;  	return sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);  } - -asmlinkage long -score_fork(struct pt_regs *regs) -{ -	return do_fork(SIGCHLD, regs->regs[0], regs, 0, NULL, NULL); -} - -/* - * Clone a task - this clones the calling program thread. - * This is called indirectly via a small wrapper - */ -asmlinkage long -score_clone(struct pt_regs *regs) -{ -	unsigned long clone_flags; -	unsigned long newsp; -	int __user *parent_tidptr, *child_tidptr; - -	clone_flags = regs->regs[4]; -	newsp = regs->regs[5]; -	if (!newsp) -		newsp = regs->regs[0]; -	parent_tidptr = (int __user *)regs->regs[6]; -	child_tidptr = (int __user *)regs->regs[8]; - -	return do_fork(clone_flags, newsp, regs, 0, -			parent_tidptr, child_tidptr); -} - -asmlinkage long -score_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, -			regs->regs[0], regs, 0, NULL, NULL); -} - -/* - * sys_execve() executes a new program. - * This is called indirectly via a small wrapper - */ -asmlinkage long -score_execve(struct pt_regs *regs) -{ -	int error; -	struct filename *filename; - -	filename = getname((char __user*)regs->regs[4]); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		return error; - -	error = do_execve(filename->name, -			  (const char __user *const __user *)regs->regs[5], -			  (const char __user *const __user *)regs->regs[6], -			  regs); - -	putname(filename); -	return error; -} - -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -asmlinkage -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	register unsigned long __r4 asm("r4") = (unsigned long) filename; -	register unsigned long __r5 asm("r5") = (unsigned long) argv; -	register unsigned long __r6 asm("r6") = (unsigned long) envp; -	register unsigned long __r7 asm("r7"); - -	__asm__ __volatile__ ("	\n" -		"ldi	r27, %5		\n" -		"syscall		\n" -		"mv	%0, r4		\n" -		"mv	%1, r7		\n" -		: "=&r" (__r4), "=r" (__r7) -		: "r" (__r4), "r" (__r5), "r" (__r6), "i" (__NR_execve) -		: "r8", "r9", "r10", "r11", "r22", "r23", "r24", "r25", -		  "r26", "r27", "memory"); - -	if (__r7 == 0) -		return __r4; - -	return -__r4; -} diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index babc2b826c5..8451317eed5 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -40,6 +40,8 @@ config SUPERH  	select GENERIC_STRNLEN_USER  	select HAVE_MOD_ARCH_SPECIFIC if DWARF_UNWINDER  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  	help  	  The SuperH is a RISC processor targeted for use in embedded systems  	  and consumer electronics; it was also used in the Sega Dreamcast diff --git a/arch/sh/configs/ecovec24_defconfig b/arch/sh/configs/ecovec24_defconfig index 911e30c9abf..c6c2becdc8a 100644 --- a/arch/sh/configs/ecovec24_defconfig +++ b/arch/sh/configs/ecovec24_defconfig @@ -112,7 +112,7 @@ CONFIG_USB_MON=y  CONFIG_USB_R8A66597_HCD=y  CONFIG_USB_STORAGE=y  CONFIG_USB_GADGET=y -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_MMC=y  CONFIG_MMC_SPI=y  CONFIG_MMC_SDHI=y diff --git a/arch/sh/configs/se7724_defconfig b/arch/sh/configs/se7724_defconfig index ed35093e375..1faa788aeca 100644 --- a/arch/sh/configs/se7724_defconfig +++ b/arch/sh/configs/se7724_defconfig @@ -109,7 +109,7 @@ CONFIG_USB_STORAGE=y  CONFIG_USB_GADGET=y  CONFIG_USB_ETH=m  CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_MASS_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_MMC=y  CONFIG_MMC_SPI=y diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index a7e078f2e2e..81e5dafed3e 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c @@ -319,7 +319,5 @@ EXPORT_SYMBOL(pci_iounmap);  #endif /* CONFIG_GENERIC_IOMAP */ -#ifdef CONFIG_HOTPLUG  EXPORT_SYMBOL(PCIBIOS_MIN_IO);  EXPORT_SYMBOL(PCIBIOS_MIN_MEM); -#endif diff --git a/arch/sh/include/asm/Kbuild b/arch/sh/include/asm/Kbuild index 29f83beeef7..280bea9e5e2 100644 --- a/arch/sh/include/asm/Kbuild +++ b/arch/sh/include/asm/Kbuild @@ -31,5 +31,6 @@ generic-y += socket.h  generic-y += statfs.h  generic-y += termbits.h  generic-y += termios.h +generic-y += trace_clock.h  generic-y += ucontext.h  generic-y += xor.h diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h index 73a23f4617a..629db2ad791 100644 --- a/arch/sh/include/asm/io.h +++ b/arch/sh/include/asm/io.h @@ -382,7 +382,7 @@ static inline int iounmap_fixed(void __iomem *addr) { return -EINVAL; }  #define xlate_dev_kmem_ptr(p)	p  #define ARCH_HAS_VALID_PHYS_ADDR_RANGE -int valid_phys_addr_range(unsigned long addr, size_t size); +int valid_phys_addr_range(phys_addr_t addr, size_t size);  int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);  #endif /* __KERNEL__ */ diff --git a/arch/sh/include/asm/processor_32.h b/arch/sh/include/asm/processor_32.h index b6311fd2d06..b1320d55ca3 100644 --- a/arch/sh/include/asm/processor_32.h +++ b/arch/sh/include/asm/processor_32.h @@ -126,11 +126,6 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_pc, unsigned lo  /* Free all resources held by a thread. */  extern void release_thread(struct task_struct *); -/* - * create a kernel thread without removing it from tasklists - */ -extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); -  /* Copy and release all segment info associated with a VM */  #define copy_segments(p, mm)	do { } while(0)  #define release_segments(mm)	do { } while(0) diff --git a/arch/sh/include/asm/processor_64.h b/arch/sh/include/asm/processor_64.h index cd6029fb2c0..1ee8946f095 100644 --- a/arch/sh/include/asm/processor_64.h +++ b/arch/sh/include/asm/processor_64.h @@ -159,11 +159,6 @@ struct mm_struct;  /* Free all resources held by a thread. */  extern void release_thread(struct task_struct *); -/* - * create a kernel thread without removing it from tasklists - */ -extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); -  /* Copy and release all segment info associated with a VM */  #define copy_segments(p, mm)	do { } while (0) diff --git a/arch/sh/include/asm/syscalls_32.h b/arch/sh/include/asm/syscalls_32.h index 6c1fa559753..cc25485996b 100644 --- a/arch/sh/include/asm/syscalls_32.h +++ b/arch/sh/include/asm/syscalls_32.h @@ -9,20 +9,6 @@  struct pt_regs; -asmlinkage int sys_fork(unsigned long r4, unsigned long r5, -			unsigned long r6, unsigned long r7, -			struct pt_regs __regs); -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, -			 unsigned long parent_tidptr, -			 unsigned long child_tidptr, -			 struct pt_regs __regs); -asmlinkage int sys_vfork(unsigned long r4, unsigned long r5, -			 unsigned long r6, unsigned long r7, -			 struct pt_regs __regs); -asmlinkage int sys_execve(const char __user *ufilename, -			  const char __user *const __user *uargv, -			  const char __user *const __user *uenvp, -			  unsigned long r7, struct pt_regs __regs);  asmlinkage int sys_sigsuspend(old_sigset_t mask);  asmlinkage int sys_sigaction(int sig, const struct old_sigaction __user *act,  			     struct old_sigaction __user *oact); diff --git a/arch/sh/include/asm/syscalls_64.h b/arch/sh/include/asm/syscalls_64.h index ee519f41d95..d62e8eb22f7 100644 --- a/arch/sh/include/asm/syscalls_64.h +++ b/arch/sh/include/asm/syscalls_64.h @@ -9,23 +9,6 @@  struct pt_regs; -asmlinkage int sys_fork(unsigned long r2, unsigned long r3, -			unsigned long r4, unsigned long r5, -			unsigned long r6, unsigned long r7, -			struct pt_regs *pregs); -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, -			 unsigned long r4, unsigned long r5, -			 unsigned long r6, unsigned long r7, -			 struct pt_regs *pregs); -asmlinkage int sys_vfork(unsigned long r2, unsigned long r3, -			 unsigned long r4, unsigned long r5, -			 unsigned long r6, unsigned long r7, -			 struct pt_regs *pregs); -asmlinkage int sys_execve(const char *ufilename, char **uargv, -			  char **uenvp, unsigned long r5, -			  unsigned long r6, unsigned long r7, -			  struct pt_regs *pregs); -  /* Misc syscall related bits */  asmlinkage long long do_syscall_trace_enter(struct pt_regs *regs);  asmlinkage void do_syscall_trace_leave(struct pt_regs *regs); diff --git a/arch/sh/include/asm/unistd.h b/arch/sh/include/asm/unistd.h index 38956dfa76f..43d3f26b2ea 100644 --- a/arch/sh/include/asm/unistd.h +++ b/arch/sh/include/asm/unistd.h @@ -28,6 +28,10 @@  # define __ARCH_WANT_SYS_SIGPENDING  # define __ARCH_WANT_SYS_SIGPROCMASK  # define __ARCH_WANT_SYS_RT_SIGACTION +# define __ARCH_WANT_SYS_EXECVE +# define __ARCH_WANT_SYS_FORK +# define __ARCH_WANT_SYS_VFORK +# define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/sh/include/uapi/asm/ioctls.h b/arch/sh/include/uapi/asm/ioctls.h index a6769f352bf..34224107976 100644 --- a/arch/sh/include/uapi/asm/ioctls.h +++ b/arch/sh/include/uapi/asm/ioctls.h @@ -88,6 +88,9 @@  #define TIOCGDEV	_IOR('T',0x32, unsigned int) /* Get primary device node of /dev/console */  #define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */  #define TIOCVHANGUP	_IO('T', 0x37) +#define TIOCGPKT	_IOR('T', 0x38, int) /* Get packet mode state */ +#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */ +#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */  #define TIOCSERCONFIG	_IO('T', 83) /* 0x5453 */  #define TIOCSERGWILD	_IOR('T', 84,  int) /* 0x5454 */ diff --git a/arch/sh/kernel/Makefile b/arch/sh/kernel/Makefile index 88571ff8eee..f259b37874e 100644 --- a/arch/sh/kernel/Makefile +++ b/arch/sh/kernel/Makefile @@ -16,7 +16,7 @@ obj-y	:= debugtraps.o dma-nommu.o dumpstack.o 		\  	   machvec.o nmi_debug.o process.o				\  	   process_$(BITS).o ptrace.o ptrace_$(BITS).o			\  	   reboot.o return_address.o					\ -	   setup.o signal_$(BITS).o sys_sh.o sys_sh$(BITS).o		\ +	   setup.o signal_$(BITS).o sys_sh.o 				\  	   syscalls_$(BITS).o time.o topology.o traps.o			\  	   traps_$(BITS).o unwinder.o @@ -25,6 +25,7 @@ obj-y				+= iomap.o  obj-$(CONFIG_HAS_IOPORT)	+= ioport.o  endif +obj-$(CONFIG_SUPERH32)		+= sys_sh32.o  obj-y				+= cpu/  obj-$(CONFIG_VSYSCALL)		+= vsyscall/  obj-$(CONFIG_SMP)		+= smp.o diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7720.c b/arch/sh/kernel/cpu/sh3/setup-sh7720.c index 0c2f1b2c2e1..42d991f632b 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7720.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7720.c @@ -20,6 +20,7 @@  #include <linux/serial_sci.h>  #include <linux/sh_timer.h>  #include <linux/sh_intc.h> +#include <linux/usb/ohci_pdriver.h>  #include <asm/rtc.h>  #include <cpu/serial.h> @@ -103,12 +104,15 @@ static struct resource usb_ohci_resources[] = {  static u64 usb_ohci_dma_mask = 0xffffffffUL; +static struct usb_ohci_pdata usb_ohci_pdata; +  static struct platform_device usb_ohci_device = { -	.name		= "sh_ohci", +	.name		= "ohci-platform",  	.id		= -1,  	.dev = {  		.dma_mask		= &usb_ohci_dma_mask,  		.coherent_dma_mask	= 0xffffffff, +		.platform_data		= &usb_ohci_pdata,  	},  	.num_resources	= ARRAY_SIZE(usb_ohci_resources),  	.resource	= usb_ohci_resources, diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c index 4a2f357f4df..9079a0f9ea9 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c @@ -19,6 +19,7 @@  #include <linux/sh_timer.h>  #include <linux/sh_dma.h>  #include <linux/sh_intc.h> +#include <linux/usb/ohci_pdriver.h>  #include <cpu/dma-register.h>  #include <cpu/sh7757.h> @@ -750,12 +751,15 @@ static struct resource usb_ohci_resources[] = {  	},  }; +static struct usb_ohci_pdata usb_ohci_pdata; +  static struct platform_device usb_ohci_device = { -	.name		= "sh_ohci", +	.name		= "ohci-platform",  	.id		= -1,  	.dev = {  		.dma_mask = &usb_ohci_device.dev.coherent_dma_mask,  		.coherent_dma_mask = DMA_BIT_MASK(32), +		.platform_data	= &usb_ohci_pdata,  	},  	.num_resources	= ARRAY_SIZE(usb_ohci_resources),  	.resource	= usb_ohci_resources, diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c index bd0a8fbe610..1686acaaf45 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c @@ -16,6 +16,7 @@  #include <linux/sh_intc.h>  #include <linux/io.h>  #include <linux/serial_sci.h> +#include <linux/usb/ohci_pdriver.h>  static struct plat_sci_port scif0_platform_data = {  	.mapbase	= 0xffe00000, @@ -106,12 +107,15 @@ static struct resource usb_ohci_resources[] = {  static u64 usb_ohci_dma_mask = 0xffffffffUL; +static struct usb_ohci_pdata usb_ohci_pdata; +  static struct platform_device usb_ohci_device = { -	.name		= "sh_ohci", +	.name		= "ohci-platform",  	.id		= -1,  	.dev = {  		.dma_mask		= &usb_ohci_dma_mask,  		.coherent_dma_mask	= 0xffffffff, +		.platform_data		= &usb_ohci_pdata,  	},  	.num_resources	= ARRAY_SIZE(usb_ohci_resources),  	.resource	= usb_ohci_resources, diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c index 2e6952f8784..ab52d4d4484 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c @@ -23,6 +23,7 @@  #include <linux/sh_timer.h>  #include <linux/sh_dma.h>  #include <linux/sh_intc.h> +#include <linux/usb/ohci_pdriver.h>  #include <cpu/dma-register.h>  #include <asm/mmzone.h> @@ -583,12 +584,15 @@ static struct resource usb_ohci_resources[] = {  	},  }; +static struct usb_ohci_pdata usb_ohci_pdata; +  static struct platform_device usb_ohci_device = { -	.name		= "sh_ohci", +	.name		= "ohci-platform",  	.id		= -1,  	.dev = {  		.dma_mask		= &usb_ohci_device.dev.coherent_dma_mask,  		.coherent_dma_mask	= DMA_BIT_MASK(32), +		.platform_data		= &usb_ohci_pdata,  	},  	.num_resources	= ARRAY_SIZE(usb_ohci_resources),  	.resource	= usb_ohci_resources, diff --git a/arch/sh/kernel/cpu/sh5/entry.S b/arch/sh/kernel/cpu/sh5/entry.S index 7e605b95592..0c8d0377d40 100644 --- a/arch/sh/kernel/cpu/sh5/entry.S +++ b/arch/sh/kernel/cpu/sh5/entry.S @@ -1228,6 +1228,25 @@ ret_from_fork:  	pta	ret_from_syscall, tr0  	blink	tr0, ZERO +.global	ret_from_kernel_thread +ret_from_kernel_thread: + +	movi	schedule_tail,r5 +	ori	r5, 1, r5 +	ptabs	r5, tr0 +	blink	tr0, LINK + +	ld.q	SP, FRAME_R(2), r2 +	ld.q	SP, FRAME_R(3), r3 +	ptabs	r3, tr0 +	blink	tr0, LINK + +	ld.q	SP, FRAME_S(FSPC), r2 +	addi	r2, 4, r2		/* Move PC, being pre-execution event */ +	st.q	SP, FRAME_S(FSPC), r2 +	pta	ret_from_syscall, tr0 +	blink	tr0, ZERO +  syscall_allowed:  	/* Use LINK to deflect the exit point, default is syscall_ret */  	pta	syscall_ret, tr0 diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S index b96489d8b27..9b6e4beeb29 100644 --- a/arch/sh/kernel/entry-common.S +++ b/arch/sh/kernel/entry-common.S @@ -297,6 +297,19 @@ ret_from_fork:  	 mov	r0, r4  	bra	syscall_exit  	 nop + +	.align	2 +	.globl	ret_from_kernel_thread +ret_from_kernel_thread: +	mov.l	1f, r8 +	jsr	@r8 +	 mov	r0, r4 +	mov.l	@(OFF_R5,r15), r5   ! fn +	jsr	@r5 +	 mov.l	@(OFF_R4,r15), r4   ! arg +	bra	syscall_exit +	 nop +  	.align	2  1:	.long	schedule_tail diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c index ba7345f37bc..73eb66fc625 100644 --- a/arch/sh/kernel/process_32.c +++ b/arch/sh/kernel/process_32.c @@ -68,38 +68,6 @@ void show_regs(struct pt_regs * regs)  	show_code(regs);  } -/* - * Create a kernel thread - */ -__noreturn void kernel_thread_helper(void *arg, int (*fn)(void *)) -{ -	do_exit(fn(arg)); -} - -/* Don't use this in BL=1(cli).  Or else, CPU resets! */ -int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) -{ -	struct pt_regs regs; -	int pid; - -	memset(®s, 0, sizeof(regs)); -	regs.regs[4] = (unsigned long)arg; -	regs.regs[5] = (unsigned long)fn; - -	regs.pc = (unsigned long)kernel_thread_helper; -	regs.sr = SR_MD; -#if defined(CONFIG_SH_FPU) -	regs.sr |= SR_FD; -#endif - -	/* Ok, create the new process.. */ -	pid = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, -		      ®s, 0, NULL, NULL); - -	return pid; -} -EXPORT_SYMBOL(kernel_thread); -  void start_thread(struct pt_regs *regs, unsigned long new_pc,  		  unsigned long new_sp)  { @@ -157,10 +125,10 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)  EXPORT_SYMBOL(dump_fpu);  asmlinkage void ret_from_fork(void); +asmlinkage void ret_from_kernel_thread(void);  int copy_thread(unsigned long clone_flags, unsigned long usp, -		unsigned long unused, -		struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  {  	struct thread_info *ti = task_thread_info(p);  	struct pt_regs *childregs; @@ -177,29 +145,35 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	}  #endif -	childregs = task_pt_regs(p); -	*childregs = *regs; +	memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps)); -	if (user_mode(regs)) { -		childregs->regs[15] = usp; -		ti->addr_limit = USER_DS; -	} else { -		childregs->regs[15] = (unsigned long)childregs; +	childregs = task_pt_regs(p); +	p->thread.sp = (unsigned long) childregs; +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(childregs, 0, sizeof(struct pt_regs)); +		p->thread.pc = (unsigned long) ret_from_kernel_thread; +		childregs->regs[4] = arg; +		childregs->regs[5] = usp; +		childregs->sr = SR_MD; +#if defined(CONFIG_SH_FPU) +		childregs->sr |= SR_FD; +#endif  		ti->addr_limit = KERNEL_DS;  		ti->status &= ~TS_USEDFPU;  		p->fpu_counter = 0; +		return 0;  	} +	*childregs = *current_pt_regs(); + +	if (usp) +		childregs->regs[15] = usp; +	ti->addr_limit = USER_DS;  	if (clone_flags & CLONE_SETTLS)  		childregs->gbr = childregs->regs[0];  	childregs->regs[0] = 0; /* Set return value for child */ - -	p->thread.sp = (unsigned long) childregs;  	p->thread.pc = (unsigned long) ret_from_fork; - -	memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps)); -  	return 0;  } @@ -243,74 +217,6 @@ __switch_to(struct task_struct *prev, struct task_struct *next)  	return prev;  } -asmlinkage int sys_fork(unsigned long r4, unsigned long r5, -			unsigned long r6, unsigned long r7, -			struct pt_regs __regs) -{ -#ifdef CONFIG_MMU -	struct pt_regs *regs = RELOC_HIDE(&__regs, 0); -	return do_fork(SIGCHLD, regs->regs[15], regs, 0, NULL, NULL); -#else -	/* fork almost works, enough to trick you into looking elsewhere :-( */ -	return -EINVAL; -#endif -} - -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, -			 unsigned long parent_tidptr, -			 unsigned long child_tidptr, -			 struct pt_regs __regs) -{ -	struct pt_regs *regs = RELOC_HIDE(&__regs, 0); -	if (!newsp) -		newsp = regs->regs[15]; -	return do_fork(clone_flags, newsp, regs, 0, -			(int __user *)parent_tidptr, -			(int __user *)child_tidptr); -} - -/* - * This is trivial, and on the face of it looks like it - * could equally well be done in user mode. - * - * Not so, for quite unobvious reasons - register pressure. - * In user mode vfork() cannot have a stack frame, and if - * done by calling the "clone()" system call directly, you - * do not have enough call-clobbered registers to hold all - * the information you need. - */ -asmlinkage int sys_vfork(unsigned long r4, unsigned long r5, -			 unsigned long r6, unsigned long r7, -			 struct pt_regs __regs) -{ -	struct pt_regs *regs = RELOC_HIDE(&__regs, 0); -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->regs[15], regs, -		       0, NULL, NULL); -} - -/* - * sys_execve() executes a new program. - */ -asmlinkage int sys_execve(const char __user *ufilename, -			  const char __user *const __user *uargv, -			  const char __user *const __user *uenvp, -			  unsigned long r7, struct pt_regs __regs) -{ -	struct pt_regs *regs = RELOC_HIDE(&__regs, 0); -	int error; -	struct filename *filename; - -	filename = getname(ufilename); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; - -	error = do_execve(filename->name, uargv, uenvp, regs); -	putname(filename); -out: -	return error; -} -  unsigned long get_wchan(struct task_struct *p)  {  	unsigned long pc; diff --git a/arch/sh/kernel/process_64.c b/arch/sh/kernel/process_64.c index 98a709f0c3c..e611c85144b 100644 --- a/arch/sh/kernel/process_64.c +++ b/arch/sh/kernel/process_64.c @@ -285,39 +285,6 @@ void show_regs(struct pt_regs *regs)  }  /* - * Create a kernel thread - */ -__noreturn void kernel_thread_helper(void *arg, int (*fn)(void *)) -{ -	do_exit(fn(arg)); -} - -/* - * This is the mechanism for creating a new kernel thread. - * - * NOTE! Only a kernel-only process(ie the swapper or direct descendants - * who haven't done an "execve()") should use this: it will work within - * a system call from a "real" process, but the process memory space will - * not be freed until both the parent and the child have exited. - */ -int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); -	regs.regs[2] = (unsigned long)arg; -	regs.regs[3] = (unsigned long)fn; - -	regs.pc = (unsigned long)kernel_thread_helper; -	regs.sr = (1 << 30); - -	/* Ok, create the new process.. */ -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, -		      ®s, 0, NULL, NULL); -} -EXPORT_SYMBOL(kernel_thread); - -/*   * Free current thread data structures etc..   */  void exit_thread(void) @@ -401,26 +368,37 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)  EXPORT_SYMBOL(dump_fpu);  asmlinkage void ret_from_fork(void); +asmlinkage void ret_from_kernel_thread(void);  int copy_thread(unsigned long clone_flags, unsigned long usp, -		unsigned long unused, -		struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  { -	struct pt_regs *childregs; +	struct pt_regs *childregs, *regs = current_pt_regs();  #ifdef CONFIG_SH_FPU -	if(last_task_used_math == current) { +	/* can't happen for a kernel thread */ +	if (last_task_used_math == current) {  		enable_fpu();  		save_fpu(current);  		disable_fpu();  		last_task_used_math = NULL; -		regs->sr |= SR_FD; +		current_pt_regs()->sr |= SR_FD;  	}  #endif  	/* Copy from sh version */  	childregs = (struct pt_regs *)(THREAD_SIZE + task_stack_page(p)) - 1; +	p->thread.sp = (unsigned long) childregs; -	*childregs = *regs; +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(childregs, 0, sizeof(struct pt_regs)); +		childregs->regs[2] = (unsigned long)arg; +		childregs->regs[3] = (unsigned long)fn; +		childregs->sr = (1 << 30); /* not user_mode */ +		childregs->sr |= SR_FD; /* Invalidate FPU flag */ +		p->thread.pc = (unsigned long) ret_from_kernel_thread; +		return 0; +	} +	*childregs = *current_pt_regs();  	/*  	 * Sign extend the edited stack. @@ -428,85 +406,18 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	 * 32-bit wide and context switch must take care  	 * of NEFF sign extension.  	 */ -	if (user_mode(regs)) { +	if (usp)  		childregs->regs[15] = neff_sign_extend(usp); -		p->thread.uregs = childregs; -	} else { -		childregs->regs[15] = -			neff_sign_extend((unsigned long)task_stack_page(p) + -					 THREAD_SIZE); -	} +	p->thread.uregs = childregs;  	childregs->regs[9] = 0; /* Set return value for child */  	childregs->sr |= SR_FD; /* Invalidate FPU flag */ -	p->thread.sp = (unsigned long) childregs;  	p->thread.pc = (unsigned long) ret_from_fork;  	return 0;  } -asmlinkage int sys_fork(unsigned long r2, unsigned long r3, -			unsigned long r4, unsigned long r5, -			unsigned long r6, unsigned long r7, -			struct pt_regs *pregs) -{ -	return do_fork(SIGCHLD, pregs->regs[15], pregs, 0, 0, 0); -} - -asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, -			 unsigned long r4, unsigned long r5, -			 unsigned long r6, unsigned long r7, -			 struct pt_regs *pregs) -{ -	if (!newsp) -		newsp = pregs->regs[15]; -	return do_fork(clone_flags, newsp, pregs, 0, 0, 0); -} - -/* - * This is trivial, and on the face of it looks like it - * could equally well be done in user mode. - * - * Not so, for quite unobvious reasons - register pressure. - * In user mode vfork() cannot have a stack frame, and if - * done by calling the "clone()" system call directly, you - * do not have enough call-clobbered registers to hold all - * the information you need. - */ -asmlinkage int sys_vfork(unsigned long r2, unsigned long r3, -			 unsigned long r4, unsigned long r5, -			 unsigned long r6, unsigned long r7, -			 struct pt_regs *pregs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, pregs->regs[15], pregs, 0, 0, 0); -} - -/* - * sys_execve() executes a new program. - */ -asmlinkage int sys_execve(const char *ufilename, char **uargv, -			  char **uenvp, unsigned long r5, -			  unsigned long r6, unsigned long r7, -			  struct pt_regs *pregs) -{ -	int error; -	struct filename *filename; - -	filename = getname((char __user *)ufilename); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; - -	error = do_execve(filename->name, -			  (const char __user *const __user *)uargv, -			  (const char __user *const __user *)uenvp, -			  pregs); -	putname(filename); -out: -	return error; -} -  #ifdef CONFIG_FRAME_POINTER  static int in_sh64_switch_to(unsigned long pc)  { diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c index 23853814bd1..d867cd95a62 100644 --- a/arch/sh/kernel/signal_64.c +++ b/arch/sh/kernel/signal_64.c @@ -347,7 +347,6 @@ asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,  {  	struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP;  	sigset_t set; -	stack_t __user st;  	long long ret;  	/* Always make any pending restarted system calls return -EINTR */ @@ -365,11 +364,10 @@ asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,  		goto badframe;  	regs->pc -= 4; -	if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) -		goto badframe;  	/* It is more difficult to avoid calling this function than to  	   call it and ignore errors.  */ -	do_sigaltstack(&st, NULL, REF_REG_SP); +	if (do_sigaltstack(&frame->uc.uc_stack, NULL, REF_REG_SP) == -EFAULT) +		goto badframe;  	return (int) ret; diff --git a/arch/sh/kernel/sys_sh32.c b/arch/sh/kernel/sys_sh32.c index f56b6fe5c5d..497bab3a040 100644 --- a/arch/sh/kernel/sys_sh32.c +++ b/arch/sh/kernel/sys_sh32.c @@ -60,27 +60,3 @@ asmlinkage int sys_fadvise64_64_wrapper(int fd, u32 offset0, u32 offset1,  				(u64)len0 << 32 | len1,	advice);  #endif  } - -#if defined(CONFIG_CPU_SH2) || defined(CONFIG_CPU_SH2A) -#define SYSCALL_ARG3	"trapa #0x23" -#else -#define SYSCALL_ARG3	"trapa #0x13" -#endif - -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	register long __sc0 __asm__ ("r3") = __NR_execve; -	register long __sc4 __asm__ ("r4") = (long) filename; -	register long __sc5 __asm__ ("r5") = (long) argv; -	register long __sc6 __asm__ ("r6") = (long) envp; -	__asm__ __volatile__ (SYSCALL_ARG3 : "=z" (__sc0) -			: "0" (__sc0), "r" (__sc4), "r" (__sc5), "r" (__sc6) -			: "memory"); -	return __sc0; -} diff --git a/arch/sh/kernel/sys_sh64.c b/arch/sh/kernel/sys_sh64.c deleted file mode 100644 index c5a38c4bf41..00000000000 --- a/arch/sh/kernel/sys_sh64.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * arch/sh/kernel/sys_sh64.c - * - * Copyright (C) 2000, 2001  Paolo Alberelli - * - * This file contains various random system calls that - * have a non-standard calling sequence on the Linux/SH5 - * platform. - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - */ -#include <linux/errno.h> -#include <linux/rwsem.h> -#include <linux/sched.h> -#include <linux/mm.h> -#include <linux/fs.h> -#include <linux/smp.h> -#include <linux/sem.h> -#include <linux/msg.h> -#include <linux/shm.h> -#include <linux/stat.h> -#include <linux/mman.h> -#include <linux/file.h> -#include <linux/syscalls.h> -#include <linux/ipc.h> -#include <asm/uaccess.h> -#include <asm/ptrace.h> -#include <asm/unistd.h> - -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	register unsigned long __sc0 __asm__ ("r9") = ((0x13 << 16) | __NR_execve); -	register unsigned long __sc2 __asm__ ("r2") = (unsigned long) filename; -	register unsigned long __sc3 __asm__ ("r3") = (unsigned long) argv; -	register unsigned long __sc4 __asm__ ("r4") = (unsigned long) envp; -	__asm__ __volatile__ ("trapa	%1 !\t\t\t execve(%2,%3,%4)" -	: "=r" (__sc0) -	: "r" (__sc0), "r" (__sc2), "r" (__sc3), "r" (__sc4) ); -	__asm__ __volatile__ ("!dummy	%0 %1 %2 %3" -	: : "r" (__sc0), "r" (__sc2), "r" (__sc3), "r" (__sc4) : "memory"); -	return __sc0; -} diff --git a/arch/sh/mm/mmap.c b/arch/sh/mm/mmap.c index afeb710ec5c..6777177807c 100644 --- a/arch/sh/mm/mmap.c +++ b/arch/sh/mm/mmap.c @@ -30,25 +30,13 @@ static inline unsigned long COLOUR_ALIGN(unsigned long addr,  	return base + off;  } -static inline unsigned long COLOUR_ALIGN_DOWN(unsigned long addr, -					      unsigned long pgoff) -{ -	unsigned long base = addr & ~shm_align_mask; -	unsigned long off = (pgoff << PAGE_SHIFT) & shm_align_mask; - -	if (base + off <= addr) -		return base + off; - -	return base - off; -} -  unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,  	unsigned long len, unsigned long pgoff, unsigned long flags)  {  	struct mm_struct *mm = current->mm;  	struct vm_area_struct *vma; -	unsigned long start_addr;  	int do_colour_align; +	struct vm_unmapped_area_info info;  	if (flags & MAP_FIXED) {  		/* We do not accept a shared mapping if it would violate @@ -79,47 +67,13 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,  			return addr;  	} -	if (len > mm->cached_hole_size) { -		start_addr = addr = mm->free_area_cache; -	} else { -	        mm->cached_hole_size = 0; -		start_addr = addr = TASK_UNMAPPED_BASE; -	} - -full_search: -	if (do_colour_align) -		addr = COLOUR_ALIGN(addr, pgoff); -	else -		addr = PAGE_ALIGN(mm->free_area_cache); - -	for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { -		/* At this point:  (!vma || addr < vma->vm_end). */ -		if (unlikely(TASK_SIZE - len < addr)) { -			/* -			 * Start a new search - just in case we missed -			 * some holes. -			 */ -			if (start_addr != TASK_UNMAPPED_BASE) { -				start_addr = addr = TASK_UNMAPPED_BASE; -				mm->cached_hole_size = 0; -				goto full_search; -			} -			return -ENOMEM; -		} -		if (likely(!vma || addr + len <= vma->vm_start)) { -			/* -			 * Remember the place where we stopped the search: -			 */ -			mm->free_area_cache = addr + len; -			return addr; -		} -		if (addr + mm->cached_hole_size < vma->vm_start) -		        mm->cached_hole_size = vma->vm_start - addr; - -		addr = vma->vm_end; -		if (do_colour_align) -			addr = COLOUR_ALIGN(addr, pgoff); -	} +	info.flags = 0; +	info.length = len; +	info.low_limit = TASK_UNMAPPED_BASE; +	info.high_limit = TASK_SIZE; +	info.align_mask = do_colour_align ? (PAGE_MASK & shm_align_mask) : 0; +	info.align_offset = pgoff << PAGE_SHIFT; +	return vm_unmapped_area(&info);  }  unsigned long @@ -131,6 +85,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  	struct mm_struct *mm = current->mm;  	unsigned long addr = addr0;  	int do_colour_align; +	struct vm_unmapped_area_info info;  	if (flags & MAP_FIXED) {  		/* We do not accept a shared mapping if it would violate @@ -162,73 +117,27 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  			return addr;  	} -	/* check if free_area_cache is useful for us */ -	if (len <= mm->cached_hole_size) { -	        mm->cached_hole_size = 0; -		mm->free_area_cache = mm->mmap_base; -	} - -	/* either no address requested or can't fit in requested address hole */ -	addr = mm->free_area_cache; -	if (do_colour_align) { -		unsigned long base = COLOUR_ALIGN_DOWN(addr-len, pgoff); +	info.flags = VM_UNMAPPED_AREA_TOPDOWN; +	info.length = len; +	info.low_limit = PAGE_SIZE; +	info.high_limit = mm->mmap_base; +	info.align_mask = do_colour_align ? (PAGE_MASK & shm_align_mask) : 0; +	info.align_offset = pgoff << PAGE_SHIFT; +	addr = vm_unmapped_area(&info); -		addr = base + len; -	} - -	/* make sure it can fit in the remaining address space */ -	if (likely(addr > len)) { -		vma = find_vma(mm, addr-len); -		if (!vma || addr <= vma->vm_start) { -			/* remember the address as a hint for next time */ -			return (mm->free_area_cache = addr-len); -		} -	} - -	if (unlikely(mm->mmap_base < len)) -		goto bottomup; - -	addr = mm->mmap_base-len; -	if (do_colour_align) -		addr = COLOUR_ALIGN_DOWN(addr, pgoff); - -	do { -		/* -		 * Lookup failure means no vma is above this address, -		 * else if new region fits below vma->vm_start, -		 * return with success: -		 */ -		vma = find_vma(mm, addr); -		if (likely(!vma || addr+len <= vma->vm_start)) { -			/* remember the address as a hint for next time */ -			return (mm->free_area_cache = addr); -		} - -		/* remember the largest hole we saw so far */ -		if (addr + mm->cached_hole_size < vma->vm_start) -		        mm->cached_hole_size = vma->vm_start - addr; - -		/* try just below the current vma->vm_start */ -		addr = vma->vm_start-len; -		if (do_colour_align) -			addr = COLOUR_ALIGN_DOWN(addr, pgoff); -	} while (likely(len < vma->vm_start)); - -bottomup:  	/*  	 * A failed mmap() very likely causes application failure,  	 * so fall back to the bottom-up function here. This scenario  	 * can happen with large stack limits and large mmap()  	 * allocations.  	 */ -	mm->cached_hole_size = ~0UL; -	mm->free_area_cache = TASK_UNMAPPED_BASE; -	addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags); -	/* -	 * Restore the topdown base: -	 */ -	mm->free_area_cache = mm->mmap_base; -	mm->cached_hole_size = ~0UL; +	if (addr & ~PAGE_MASK) { +		VM_BUG_ON(addr != -ENOMEM); +		info.flags = 0; +		info.low_limit = TASK_UNMAPPED_BASE; +		info.high_limit = TASK_SIZE; +		addr = vm_unmapped_area(&info); +	}  	return addr;  } @@ -238,7 +147,7 @@ bottomup:   * You really shouldn't be using read() or write() on /dev/mem.  This   * might go away in the future.   */ -int valid_phys_addr_range(unsigned long addr, size_t count) +int valid_phys_addr_range(phys_addr_t addr, size_t count)  {  	if (addr < __MEMORY_START)  		return 0; diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 9f2edb5c555..0c7d365fa40 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -41,6 +41,8 @@ config SPARC  	select GENERIC_STRNCPY_FROM_USER  	select GENERIC_STRNLEN_USER  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  config SPARC32  	def_bool !64BIT diff --git a/arch/sparc/boot/piggyback.c b/arch/sparc/boot/piggyback.c index c0a798fcf03..bb7c95161d7 100644 --- a/arch/sparc/boot/piggyback.c +++ b/arch/sparc/boot/piggyback.c @@ -81,18 +81,18 @@ static void usage(void)  static int start_line(const char *line)  { -	if (strcmp(line + 8, " T _start\n") == 0) +	if (strcmp(line + 10, " _start\n") == 0)  		return 1; -	else if (strcmp(line + 16, " T _start\n") == 0) +	else if (strcmp(line + 18, " _start\n") == 0)  		return 1;  	return 0;  }  static int end_line(const char *line)  { -	if (strcmp(line + 8, " A _end\n") == 0) +	if (strcmp(line + 10, " _end\n") == 0)  		return 1; -	else if (strcmp (line + 16, " A _end\n") == 0) +	else if (strcmp (line + 18, " _end\n") == 0)  		return 1;  	return 0;  } @@ -100,8 +100,8 @@ static int end_line(const char *line)  /*   * Find address for start and end in System.map.   * The file looks like this: - * f0004000 T _start - * f0379f79 A _end + * f0004000 ... _start + * f0379f79 ... _end   * 1234567890123456   * ^coloumn 1   * There is support for 64 bit addresses too. diff --git a/arch/sparc/include/asm/Kbuild b/arch/sparc/include/asm/Kbuild index 645a58da0e8..e26d430ce2f 100644 --- a/arch/sparc/include/asm/Kbuild +++ b/arch/sparc/include/asm/Kbuild @@ -8,4 +8,5 @@ generic-y += local64.h  generic-y += irq_regs.h  generic-y += local.h  generic-y += module.h +generic-y += trace_clock.h  generic-y += word-at-a-time.h diff --git a/arch/sparc/include/asm/processor_32.h b/arch/sparc/include/asm/processor_32.h index f74ac9ee33a..c1e01914fd9 100644 --- a/arch/sparc/include/asm/processor_32.h +++ b/arch/sparc/include/asm/processor_32.h @@ -106,7 +106,6 @@ static inline void start_thread(struct pt_regs * regs, unsigned long pc,  /* Free all resources held by a thread. */  #define release_thread(tsk)		do { } while(0) -extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);  extern unsigned long get_wchan(struct task_struct *); diff --git a/arch/sparc/include/asm/processor_64.h b/arch/sparc/include/asm/processor_64.h index 721e25f0e2e..cce72ce4c33 100644 --- a/arch/sparc/include/asm/processor_64.h +++ b/arch/sparc/include/asm/processor_64.h @@ -94,6 +94,7 @@ struct thread_struct {  #ifndef __ASSEMBLY__  #include <linux/types.h> +#include <asm/fpumacro.h>  /* Return saved PC of a blocked thread. */  struct task_struct; @@ -143,6 +144,10 @@ do { \  	: \  	: "r" (regs), "r" (sp - sizeof(struct reg_window) - STACK_BIAS), \  	  "i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0]))); \ +	fprs_write(0);	\ +	current_thread_info()->xfsr[0] = 0;	\ +	current_thread_info()->fpsaved[0] = 0;	\ +	regs->tstate &= ~TSTATE_PEF;	\  } while (0)  #define start_thread32(regs, pc, sp) \ @@ -183,13 +188,15 @@ do { \  	: \  	: "r" (regs), "r" (sp - sizeof(struct reg_window32)), \  	  "i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0]))); \ +	fprs_write(0);	\ +	current_thread_info()->xfsr[0] = 0;	\ +	current_thread_info()->fpsaved[0] = 0;	\ +	regs->tstate &= ~TSTATE_PEF;	\  } while (0)  /* Free all resources held by a thread. */  #define release_thread(tsk)		do { } while (0) -extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); -  extern unsigned long get_wchan(struct task_struct *task);  #define task_pt_regs(tsk) (task_thread_info(tsk)->kregs) diff --git a/arch/sparc/include/asm/ptrace.h b/arch/sparc/include/asm/ptrace.h index da43bdc6229..bdfafd7af46 100644 --- a/arch/sparc/include/asm/ptrace.h +++ b/arch/sparc/include/asm/ptrace.h @@ -32,6 +32,9 @@ static inline bool pt_regs_clear_syscall(struct pt_regs *regs)  #define arch_ptrace_stop(exit_code, info) \  	synchronize_user_stack() +#define current_pt_regs() \ +	((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE) - 1) +  struct global_reg_snapshot {  	unsigned long		tstate;  	unsigned long		tpc; @@ -55,9 +58,7 @@ union global_cpu_snapshot {  extern union global_cpu_snapshot global_cpu_snapshot[NR_CPUS]; -#define force_successful_syscall_return()	    \ -do {	current_thread_info()->syscall_noerror = 1; \ -} while (0) +#define force_successful_syscall_return() set_thread_noerror(1)  #define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV))  #define instruction_pointer(regs) ((regs)->tpc)  #define instruction_pointer_set(regs, val) ((regs)->tpc = (val)) @@ -100,6 +101,9 @@ static inline bool pt_regs_clear_syscall(struct pt_regs *regs)  #define arch_ptrace_stop(exit_code, info) \  	synchronize_user_stack() +#define current_pt_regs() \ +	((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE) - 1) +  #define user_mode(regs) (!((regs)->psr & PSR_PS))  #define instruction_pointer(regs) ((regs)->pc)  #define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP]) diff --git a/arch/sparc/include/asm/signal.h b/arch/sparc/include/asm/signal.h index d243c2ae02d..77b85850d54 100644 --- a/arch/sparc/include/asm/signal.h +++ b/arch/sparc/include/asm/signal.h @@ -26,7 +26,5 @@ struct k_sigaction {  	void			__user *ka_restorer;  }; -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -  #endif /* !(__ASSEMBLY__) */  #endif /* !(__SPARC_SIGNAL_H) */ diff --git a/arch/sparc/include/asm/switch_to_64.h b/arch/sparc/include/asm/switch_to_64.h index 7923c4a2be3..cad36f56fa0 100644 --- a/arch/sparc/include/asm/switch_to_64.h +++ b/arch/sparc/include/asm/switch_to_64.h @@ -23,7 +23,7 @@ do {	flush_tlb_pending();						\  	/* If you are tempted to conditionalize the following */	\  	/* so that ASI is only written if it changes, think again. */	\  	__asm__ __volatile__("wr %%g0, %0, %%asi"			\ -	: : "r" (__thread_flag_byte_ptr(task_thread_info(next))[TI_FLAG_BYTE_CURRENT_DS]));\ +	: : "r" (task_thread_info(next)->current_ds));\  	trap_block[current_thread_info()->cpu].thread =			\  		task_thread_info(next);					\  	__asm__ __volatile__(						\ diff --git a/arch/sparc/include/asm/syscalls.h b/arch/sparc/include/asm/syscalls.h index 45a43f637a1..bf8972adea1 100644 --- a/arch/sparc/include/asm/syscalls.h +++ b/arch/sparc/include/asm/syscalls.h @@ -8,6 +8,4 @@ extern asmlinkage long sparc_do_fork(unsigned long clone_flags,  				     struct pt_regs *regs,  				     unsigned long stack_size); -extern asmlinkage int sparc_execve(struct pt_regs *regs); -  #endif /* _SPARC64_SYSCALLS_H */ diff --git a/arch/sparc/include/asm/thread_info_64.h b/arch/sparc/include/asm/thread_info_64.h index a3fe4dcc0aa..269bd92313d 100644 --- a/arch/sparc/include/asm/thread_info_64.h +++ b/arch/sparc/include/asm/thread_info_64.h @@ -14,12 +14,12 @@  #define TI_FLAG_FAULT_CODE_SHIFT	56  #define TI_FLAG_BYTE_WSTATE		1  #define TI_FLAG_WSTATE_SHIFT		48 -#define TI_FLAG_BYTE_CWP		2 -#define TI_FLAG_CWP_SHIFT		40 -#define TI_FLAG_BYTE_CURRENT_DS		3 -#define TI_FLAG_CURRENT_DS_SHIFT	32 -#define TI_FLAG_BYTE_FPDEPTH		4 -#define TI_FLAG_FPDEPTH_SHIFT		24 +#define TI_FLAG_BYTE_NOERROR		2 +#define TI_FLAG_BYTE_NOERROR_SHIFT	40 +#define TI_FLAG_BYTE_FPDEPTH		3 +#define TI_FLAG_FPDEPTH_SHIFT		32 +#define TI_FLAG_BYTE_CWP		4 +#define TI_FLAG_CWP_SHIFT		24  #define TI_FLAG_BYTE_WSAVED		5  #define TI_FLAG_WSAVED_SHIFT		16 @@ -47,7 +47,7 @@ struct thread_info {  	struct exec_domain	*exec_domain;  	int			preempt_count;	/* 0 => preemptable, <0 => BUG */  	__u8			new_child; -	__u8			syscall_noerror; +	__u8			current_ds;  	__u16			cpu;  	unsigned long		*utraps; @@ -74,9 +74,9 @@ struct thread_info {  #define TI_FAULT_CODE	(TI_FLAGS + TI_FLAG_BYTE_FAULT_CODE)  #define TI_WSTATE	(TI_FLAGS + TI_FLAG_BYTE_WSTATE)  #define TI_CWP		(TI_FLAGS + TI_FLAG_BYTE_CWP) -#define TI_CURRENT_DS	(TI_FLAGS + TI_FLAG_BYTE_CURRENT_DS)  #define TI_FPDEPTH	(TI_FLAGS + TI_FLAG_BYTE_FPDEPTH)  #define TI_WSAVED	(TI_FLAGS + TI_FLAG_BYTE_WSAVED) +#define TI_SYS_NOERROR	(TI_FLAGS + TI_FLAG_BYTE_NOERROR)  #define TI_FPSAVED	0x00000010  #define TI_KSP		0x00000018  #define TI_FAULT_ADDR	0x00000020 @@ -84,7 +84,7 @@ struct thread_info {  #define TI_EXEC_DOMAIN	0x00000030  #define TI_PRE_COUNT	0x00000038  #define TI_NEW_CHILD	0x0000003c -#define TI_SYS_NOERROR	0x0000003d +#define TI_CURRENT_DS	0x0000003d  #define TI_CPU		0x0000003e  #define TI_UTRAPS	0x00000040  #define TI_REG_WINDOW	0x00000048 @@ -121,7 +121,7 @@ struct thread_info {  #define INIT_THREAD_INFO(tsk)				\  {							\  	.task		=	&tsk,			\ -	.flags		= ((unsigned long)ASI_P) << TI_FLAG_CURRENT_DS_SHIFT,	\ +	.current_ds	=	ASI_P,			\  	.exec_domain	=	&default_exec_domain,	\  	.preempt_count	=	INIT_PREEMPT_COUNT,	\  	.restart_block	= {				\ @@ -153,13 +153,12 @@ register struct thread_info *current_thread_info_reg asm("g6");  #define set_thread_wstate(val)		(__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSTATE] = (val))  #define get_thread_cwp()		(__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CWP])  #define set_thread_cwp(val)		(__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CWP] = (val)) -#define get_thread_current_ds()		(__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CURRENT_DS]) -#define set_thread_current_ds(val)	(__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CURRENT_DS] = (val)) +#define get_thread_noerror()		(__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_NOERROR]) +#define set_thread_noerror(val)		(__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_NOERROR] = (val))  #define get_thread_fpdepth()		(__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FPDEPTH])  #define set_thread_fpdepth(val)		(__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FPDEPTH] = (val))  #define get_thread_wsaved()		(__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSAVED])  #define set_thread_wsaved(val)		(__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSAVED] = (val)) -  #endif /* !(__ASSEMBLY__) */  /* diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h index 73083e1d38d..e562d3caee5 100644 --- a/arch/sparc/include/asm/uaccess_64.h +++ b/arch/sparc/include/asm/uaccess_64.h @@ -38,14 +38,14 @@  #define VERIFY_READ	0  #define VERIFY_WRITE	1 -#define get_fs() ((mm_segment_t) { get_thread_current_ds() }) +#define get_fs() ((mm_segment_t){(current_thread_info()->current_ds)})  #define get_ds() (KERNEL_DS)  #define segment_eq(a,b)  ((a).seg == (b).seg)  #define set_fs(val)								\  do {										\ -	set_thread_current_ds((val).seg);					\ +	current_thread_info()->current_ds =(val).seg;				\  	__asm__ __volatile__ ("wr %%g0, %0, %%asi" : : "r" ((val).seg));	\  } while(0) diff --git a/arch/sparc/include/asm/unistd.h b/arch/sparc/include/asm/unistd.h index 0ecea6ed943..c3e5d8b6417 100644 --- a/arch/sparc/include/asm/unistd.h +++ b/arch/sparc/include/asm/unistd.h @@ -46,6 +46,7 @@  #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND  #define __ARCH_WANT_COMPAT_SYS_SENDFILE  #endif +#define __ARCH_WANT_SYS_EXECVE  /*   * "Conditional" syscalls diff --git a/arch/sparc/include/uapi/asm/ioctls.h b/arch/sparc/include/uapi/asm/ioctls.h index 9155f7041d4..897d1723fa1 100644 --- a/arch/sparc/include/uapi/asm/ioctls.h +++ b/arch/sparc/include/uapi/asm/ioctls.h @@ -21,6 +21,9 @@  #define TCSETSF2	_IOW('T', 15, struct termios2)  #define TIOCGDEV	_IOR('T',0x32, unsigned int) /* Get primary device node of /dev/console */  #define TIOCVHANGUP	_IO('T', 0x37) +#define TIOCGPKT	_IOR('T', 0x38, int) /* Get packet mode state */ +#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */ +#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */  /* Note that all the ioctls that are not available in Linux have a    * double underscore on the front to: a) avoid some programs to diff --git a/arch/sparc/include/uapi/asm/socket.h b/arch/sparc/include/uapi/asm/socket.h index bea1568ae4a..c83a937ead0 100644 --- a/arch/sparc/include/uapi/asm/socket.h +++ b/arch/sparc/include/uapi/asm/socket.h @@ -41,6 +41,7 @@  #define SO_ATTACH_FILTER	0x001a  #define SO_DETACH_FILTER        0x001b +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		0x001c  #define SO_TIMESTAMP		0x001d diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index dcaa1cf0de4..21fd1a8f47d 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S @@ -806,23 +806,10 @@ sys_nis_syscall:  	call	c_sys_nis_syscall  	 mov	%l5, %o7 -	.align	4 -	.globl	sys_execve -sys_execve: -	mov	%o7, %l5 -	add	%sp, STACKFRAME_SZ, %o0		! pt_regs *regs arg -	call	sparc_execve -	 mov	%l5, %o7 - -	.globl	sunos_execv  sunos_execv: -	st	%g0, [%sp + STACKFRAME_SZ + PT_I2] - -	call	sparc_execve -	 add	%sp, STACKFRAME_SZ, %o0 - -	b	ret_sys_call -	 ld	[%sp + STACKFRAME_SZ + PT_I0], %o0 +	.globl	sunos_execv +	b	sys_execve +	 clr	%i2  	.align	4  	.globl	sys_sparc_pipe @@ -959,17 +946,9 @@ flush_patch_four:          .align  4  linux_sparc_ni_syscall:  	sethi   %hi(sys_ni_syscall), %l7 -	b       syscall_is_too_hard +	b       do_syscall  	 or     %l7, %lo(sys_ni_syscall), %l7 -linux_fast_syscall: -	andn	%l7, 3, %l7 -	mov	%i0, %o0 -	mov	%i1, %o1 -	mov 	%i2, %o2 -	jmpl	%l7 + %g0, %g0 -	 mov	%i3, %o3 -  linux_syscall_trace:  	add	%sp, STACKFRAME_SZ, %o0  	call	syscall_trace @@ -991,6 +970,23 @@ ret_from_fork:  	b	ret_sys_call  	 ld	[%sp + STACKFRAME_SZ + PT_I0], %o0 +	.globl	ret_from_kernel_thread +ret_from_kernel_thread: +	call	schedule_tail +	 ld	[%g3 + TI_TASK], %o0 +	ld	[%sp + STACKFRAME_SZ + PT_G1], %l0 +	call	%l0 +	 ld	[%sp + STACKFRAME_SZ + PT_G2], %o0 +	rd	%psr, %l1 +	ld	[%sp + STACKFRAME_SZ + PT_PSR], %l0 +	andn	%l0, PSR_CWP, %l0 +	nop +	and	%l1, PSR_CWP, %l1 +	or	%l0, %l1, %l0 +	st	%l0, [%sp + STACKFRAME_SZ + PT_PSR] +	b	ret_sys_call +	 mov	0, %o0 +  	/* Linux native system calls enter here... */  	.align	4  	.globl	linux_sparc_syscall @@ -1002,11 +998,8 @@ linux_sparc_syscall:  	bgeu	linux_sparc_ni_syscall  	 sll	%g1, 2, %l4  	ld	[%l7 + %l4], %l7 -	andcc	%l7, 1, %g0 -	bne	linux_fast_syscall -	 /* Just do first insn from SAVE_ALL in the delay slot */ -syscall_is_too_hard: +do_syscall:  	SAVE_ALL_HEAD  	 rd	%wim, %l3 diff --git a/arch/sparc/kernel/etrap_64.S b/arch/sparc/kernel/etrap_64.S index 786b185e6e3..1276ca2567b 100644 --- a/arch/sparc/kernel/etrap_64.S +++ b/arch/sparc/kernel/etrap_64.S @@ -92,8 +92,10 @@ etrap_save:	save	%g2, -STACK_BIAS, %sp  		rdpr	%wstate, %g2  		wrpr	%g0, 0, %canrestore  		sll	%g2, 3, %g2 + +		/* Set TI_SYS_FPDEPTH to 1 and clear TI_SYS_NOERROR.  */  		mov	1, %l5 -		stb	%l5, [%l6 + TI_FPDEPTH] +		sth	%l5, [%l6 + TI_SYS_NOERROR]  		wrpr	%g3, 0, %otherwin  		wrpr	%g2, 0, %wstate @@ -152,7 +154,9 @@ etrap_save:	save	%g2, -STACK_BIAS, %sp  		add	%l6, TI_FPSAVED + 1, %l4  		srl	%l5, 1, %l3  		add	%l5, 2, %l5 -		stb	%l5, [%l6 + TI_FPDEPTH] + +		/* Set TI_SYS_FPDEPTH to %l5 and clear TI_SYS_NOERROR.  */ +		sth	%l5, [%l6 + TI_SYS_NOERROR]  		ba,pt	%xcc, 2b  		 stb	%g0, [%l4 + %l3]  		nop diff --git a/arch/sparc/kernel/pci_impl.h b/arch/sparc/kernel/pci_impl.h index 918a2031c8b..5f688531f48 100644 --- a/arch/sparc/kernel/pci_impl.h +++ b/arch/sparc/kernel/pci_impl.h @@ -88,7 +88,7 @@ struct pci_pbm_info {  	int				chip_revision;  	/* Name used for top-level resources. */ -	char				*name; +	const char			*name;  	/* OBP specific information. */  	struct platform_device		*op; diff --git a/arch/sparc/kernel/process_32.c b/arch/sparc/kernel/process_32.c index 487bffb36f5..be8e862bada 100644 --- a/arch/sparc/kernel/process_32.c +++ b/arch/sparc/kernel/process_32.c @@ -286,8 +286,7 @@ asmlinkage int sparc_do_fork(unsigned long clone_flags,  	parent_tid_ptr = regs->u_regs[UREG_I2];  	child_tid_ptr = regs->u_regs[UREG_I4]; -	ret = do_fork(clone_flags, stack_start, -		      regs, stack_size, +	ret = do_fork(clone_flags, stack_start, stack_size,  		      (int __user *) parent_tid_ptr,  		      (int __user *) child_tid_ptr); @@ -316,13 +315,13 @@ asmlinkage int sparc_do_fork(unsigned long clone_flags,   * XXX See comment above sys_vfork in sparc64. todo.   */  extern void ret_from_fork(void); +extern void ret_from_kernel_thread(void);  int copy_thread(unsigned long clone_flags, unsigned long sp, -		unsigned long unused, -		struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  {  	struct thread_info *ti = task_thread_info(p); -	struct pt_regs *childregs; +	struct pt_regs *childregs, *regs = current_pt_regs();  	char *new_stack;  #ifndef CONFIG_SMP @@ -336,16 +335,13 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  	}  	/* -	 *  p->thread_info         new_stack   childregs -	 *  !                      !           !             {if(PSR_PS) } -	 *  V                      V (stk.fr.) V  (pt_regs)  { (stk.fr.) } -	 *  +----- - - - - - ------+===========+============={+==========}+ +	 *  p->thread_info         new_stack   childregs stack bottom +	 *  !                      !           !             ! +	 *  V                      V (stk.fr.) V  (pt_regs)  V +	 *  +----- - - - - - ------+===========+=============+  	 */  	new_stack = task_stack_page(p) + THREAD_SIZE; -	if (regs->psr & PSR_PS) -		new_stack -= STACKFRAME_SZ;  	new_stack -= STACKFRAME_SZ + TRACEREG_SZ; -	memcpy(new_stack, (char *)regs - STACKFRAME_SZ, STACKFRAME_SZ + TRACEREG_SZ);  	childregs = (struct pt_regs *) (new_stack + STACKFRAME_SZ);  	/* @@ -356,55 +352,58 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  	 * Thus, kpsr|=PSR_PIL.  	 */  	ti->ksp = (unsigned long) new_stack; -	ti->kpc = (((unsigned long) ret_from_fork) - 0x8); -	ti->kpsr = current->thread.fork_kpsr | PSR_PIL; -	ti->kwim = current->thread.fork_kwim; +	p->thread.kregs = childregs; -	if(regs->psr & PSR_PS) { -		extern struct pt_regs fake_swapper_regs; - -		p->thread.kregs = &fake_swapper_regs; -		new_stack += STACKFRAME_SZ + TRACEREG_SZ; -		childregs->u_regs[UREG_FP] = (unsigned long) new_stack; +	if (unlikely(p->flags & PF_KTHREAD)) { +		extern int nwindows; +		unsigned long psr; +		memset(new_stack, 0, STACKFRAME_SZ + TRACEREG_SZ);  		p->thread.flags |= SPARC_FLAG_KTHREAD;  		p->thread.current_ds = KERNEL_DS; -		memcpy(new_stack, (void *)regs->u_regs[UREG_FP], STACKFRAME_SZ); -		childregs->u_regs[UREG_G6] = (unsigned long) ti; -	} else { -		p->thread.kregs = childregs; -		childregs->u_regs[UREG_FP] = sp; -		p->thread.flags &= ~SPARC_FLAG_KTHREAD; -		p->thread.current_ds = USER_DS; +		ti->kpc = (((unsigned long) ret_from_kernel_thread) - 0x8); +		childregs->u_regs[UREG_G1] = sp; /* function */ +		childregs->u_regs[UREG_G2] = arg; +		psr = childregs->psr = get_psr(); +		ti->kpsr = psr | PSR_PIL; +		ti->kwim = 1 << (((psr & PSR_CWP) + 1) % nwindows); +		return 0; +	} +	memcpy(new_stack, (char *)regs - STACKFRAME_SZ, STACKFRAME_SZ + TRACEREG_SZ); +	childregs->u_regs[UREG_FP] = sp; +	p->thread.flags &= ~SPARC_FLAG_KTHREAD; +	p->thread.current_ds = USER_DS; +	ti->kpc = (((unsigned long) ret_from_fork) - 0x8); +	ti->kpsr = current->thread.fork_kpsr | PSR_PIL; +	ti->kwim = current->thread.fork_kwim; -		if (sp != regs->u_regs[UREG_FP]) { -			struct sparc_stackf __user *childstack; -			struct sparc_stackf __user *parentstack; +	if (sp != regs->u_regs[UREG_FP]) { +		struct sparc_stackf __user *childstack; +		struct sparc_stackf __user *parentstack; -			/* -			 * This is a clone() call with supplied user stack. -			 * Set some valid stack frames to give to the child. -			 */ -			childstack = (struct sparc_stackf __user *) -				(sp & ~0xfUL); -			parentstack = (struct sparc_stackf __user *) -				regs->u_regs[UREG_FP]; +		/* +		 * This is a clone() call with supplied user stack. +		 * Set some valid stack frames to give to the child. +		 */ +		childstack = (struct sparc_stackf __user *) +			(sp & ~0xfUL); +		parentstack = (struct sparc_stackf __user *) +			regs->u_regs[UREG_FP];  #if 0 -			printk("clone: parent stack:\n"); -			show_stackframe(parentstack); +		printk("clone: parent stack:\n"); +		show_stackframe(parentstack);  #endif -			childstack = clone_stackframe(childstack, parentstack); -			if (!childstack) -				return -EFAULT; +		childstack = clone_stackframe(childstack, parentstack); +		if (!childstack) +			return -EFAULT;  #if 0 -			printk("clone: child stack:\n"); -			show_stackframe(childstack); +		printk("clone: child stack:\n"); +		show_stackframe(childstack);  #endif -			childregs->u_regs[UREG_FP] = (unsigned long)childstack; -		} +		childregs->u_regs[UREG_FP] = (unsigned long)childstack;  	}  #ifdef CONFIG_SMP @@ -475,69 +474,6 @@ int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs)  	return 1;  } -/* - * sparc_execve() executes a new program after the asm stub has set - * things up for us.  This should basically do what I want it to. - */ -asmlinkage int sparc_execve(struct pt_regs *regs) -{ -	int error, base = 0; -	struct filename *filename; - -	/* Check for indirect call. */ -	if(regs->u_regs[UREG_G1] == 0) -		base = 1; - -	filename = getname((char __user *)regs->u_regs[base + UREG_I0]); -	error = PTR_ERR(filename); -	if(IS_ERR(filename)) -		goto out; -	error = do_execve(filename->name, -			  (const char __user *const  __user *) -			  regs->u_regs[base + UREG_I1], -			  (const char __user *const  __user *) -			  regs->u_regs[base + UREG_I2], -			  regs); -	putname(filename); -out: -	return error; -} - -/* - * This is the mechanism for creating a new kernel thread. - * - * NOTE! Only a kernel-only process(ie the swapper or direct descendants - * who haven't done an "execve()") should use this: it will work within - * a system call from a "real" process, but the process memory space will - * not be freed until both the parent and the child have exited. - */ -pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) -{ -	long retval; - -	__asm__ __volatile__("mov %4, %%g2\n\t"    /* Set aside fn ptr... */ -			     "mov %5, %%g3\n\t"    /* and arg. */ -			     "mov %1, %%g1\n\t" -			     "mov %2, %%o0\n\t"    /* Clone flags. */ -			     "mov 0, %%o1\n\t"     /* usp arg == 0 */ -			     "t 0x10\n\t"          /* Linux/Sparc clone(). */ -			     "cmp %%o1, 0\n\t" -			     "be 1f\n\t"           /* The parent, just return. */ -			     " nop\n\t"            /* Delay slot. */ -			     "jmpl %%g2, %%o7\n\t" /* Call the function. */ -			     " mov %%g3, %%o0\n\t" /* Get back the arg in delay. */ -			     "mov %3, %%g1\n\t" -			     "t 0x10\n\t"          /* Linux/Sparc exit(). */ -			     /* Notreached by child. */ -			     "1: mov %%o0, %0\n\t" : -			     "=r" (retval) : -			     "i" (__NR_clone), "r" (flags | CLONE_VM | CLONE_UNTRACED), -			     "i" (__NR_exit),  "r" (fn), "r" (arg) : -			     "g1", "g2", "g3", "o0", "o1", "memory", "cc"); -	return retval; -} -EXPORT_SYMBOL(kernel_thread); -  unsigned long get_wchan(struct task_struct *task)  {  	unsigned long pc, fp, bias = 0; diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c index c6e0c291004..cdb80b2adbe 100644 --- a/arch/sparc/kernel/process_64.c +++ b/arch/sparc/kernel/process_64.c @@ -601,8 +601,7 @@ asmlinkage long sparc_do_fork(unsigned long clone_flags,  		child_tid_ptr = (int __user *) regs->u_regs[UREG_I4];  	} -	ret = do_fork(clone_flags, stack_start, -		      regs, stack_size, +	ret = do_fork(clone_flags, stack_start, stack_size,  		      parent_tid_ptr, child_tid_ptr);  	/* If we get an error and potentially restart the system @@ -622,64 +621,55 @@ asmlinkage long sparc_do_fork(unsigned long clone_flags,   * Child  -->  %o0 == parents pid, %o1 == 1   */  int copy_thread(unsigned long clone_flags, unsigned long sp, -		unsigned long unused, -		struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  {  	struct thread_info *t = task_thread_info(p); +	struct pt_regs *regs = current_pt_regs();  	struct sparc_stackf *parent_sf;  	unsigned long child_stack_sz;  	char *child_trap_frame; -	int kernel_thread; - -	kernel_thread = (regs->tstate & TSTATE_PRIV) ? 1 : 0; -	parent_sf = ((struct sparc_stackf *) regs) - 1;  	/* Calculate offset to stack_frame & pt_regs */ -	child_stack_sz = ((STACKFRAME_SZ + TRACEREG_SZ) + -			  (kernel_thread ? STACKFRAME_SZ : 0)); +	child_stack_sz = (STACKFRAME_SZ + TRACEREG_SZ);  	child_trap_frame = (task_stack_page(p) +  			    (THREAD_SIZE - child_stack_sz)); -	memcpy(child_trap_frame, parent_sf, child_stack_sz); -	t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) | -				 (0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) | -		(((regs->tstate + 1) & TSTATE_CWP) << TI_FLAG_CWP_SHIFT);  	t->new_child = 1;  	t->ksp = ((unsigned long) child_trap_frame) - STACK_BIAS;  	t->kregs = (struct pt_regs *) (child_trap_frame +  				       sizeof(struct sparc_stackf));  	t->fpsaved[0] = 0; -	if (kernel_thread) { -		struct sparc_stackf *child_sf = (struct sparc_stackf *) -			(child_trap_frame + (STACKFRAME_SZ + TRACEREG_SZ)); - -		/* Zero terminate the stack backtrace.  */ -		child_sf->fp = NULL; -		t->kregs->u_regs[UREG_FP] = -		  ((unsigned long) child_sf) - STACK_BIAS; +	if (unlikely(p->flags & PF_KTHREAD)) { +		memset(child_trap_frame, 0, child_stack_sz); +		__thread_flag_byte_ptr(t)[TI_FLAG_BYTE_CWP] =  +			(current_pt_regs()->tstate + 1) & TSTATE_CWP; +		t->current_ds = ASI_P; +		t->kregs->u_regs[UREG_G1] = sp; /* function */ +		t->kregs->u_regs[UREG_G2] = arg; +		return 0; +	} -		t->flags |= ((long)ASI_P << TI_FLAG_CURRENT_DS_SHIFT); -		t->kregs->u_regs[UREG_G6] = (unsigned long) t; -		t->kregs->u_regs[UREG_G4] = (unsigned long) t->task; -	} else { -		if (t->flags & _TIF_32BIT) { -			sp &= 0x00000000ffffffffUL; -			regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; -		} -		t->kregs->u_regs[UREG_FP] = sp; -		t->flags |= ((long)ASI_AIUS << TI_FLAG_CURRENT_DS_SHIFT); -		if (sp != regs->u_regs[UREG_FP]) { -			unsigned long csp; +	parent_sf = ((struct sparc_stackf *) regs) - 1; +	memcpy(child_trap_frame, parent_sf, child_stack_sz); +	if (t->flags & _TIF_32BIT) { +		sp &= 0x00000000ffffffffUL; +		regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; +	} +	t->kregs->u_regs[UREG_FP] = sp; +	__thread_flag_byte_ptr(t)[TI_FLAG_BYTE_CWP] =  +		(regs->tstate + 1) & TSTATE_CWP; +	t->current_ds = ASI_AIUS; +	if (sp != regs->u_regs[UREG_FP]) { +		unsigned long csp; -			csp = clone_stackframe(sp, regs->u_regs[UREG_FP]); -			if (!csp) -				return -EFAULT; -			t->kregs->u_regs[UREG_FP] = csp; -		} -		if (t->utraps) -			t->utraps[0]++; +		csp = clone_stackframe(sp, regs->u_regs[UREG_FP]); +		if (!csp) +			return -EFAULT; +		t->kregs->u_regs[UREG_FP] = csp;  	} +	if (t->utraps) +		t->utraps[0]++;  	/* Set the return value for the child. */  	t->kregs->u_regs[UREG_I0] = current->pid; @@ -694,45 +684,6 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  	return 0;  } -/* - * This is the mechanism for creating a new kernel thread. - * - * NOTE! Only a kernel-only process(ie the swapper or direct descendants - * who haven't done an "execve()") should use this: it will work within - * a system call from a "real" process, but the process memory space will - * not be freed until both the parent and the child have exited. - */ -pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) -{ -	long retval; - -	/* If the parent runs before fn(arg) is called by the child, -	 * the input registers of this function can be clobbered. -	 * So we stash 'fn' and 'arg' into global registers which -	 * will not be modified by the parent. -	 */ -	__asm__ __volatile__("mov %4, %%g2\n\t"	   /* Save FN into global */ -			     "mov %5, %%g3\n\t"	   /* Save ARG into global */ -			     "mov %1, %%g1\n\t"	   /* Clone syscall nr. */ -			     "mov %2, %%o0\n\t"	   /* Clone flags. */ -			     "mov 0, %%o1\n\t"	   /* usp arg == 0 */ -			     "t 0x6d\n\t"	   /* Linux/Sparc clone(). */ -			     "brz,a,pn %%o1, 1f\n\t" /* Parent, just return. */ -			     " mov %%o0, %0\n\t" -			     "jmpl %%g2, %%o7\n\t"   /* Call the function. */ -			     " mov %%g3, %%o0\n\t"   /* Set arg in delay. */ -			     "mov %3, %%g1\n\t" -			     "t 0x6d\n\t"	   /* Linux/Sparc exit(). */ -			     /* Notreached by child. */ -			     "1:" : -			     "=r" (retval) : -			     "i" (__NR_clone), "r" (flags | CLONE_VM | CLONE_UNTRACED), -			     "i" (__NR_exit),  "r" (fn), "r" (arg) : -			     "g1", "g2", "g3", "o0", "o1", "memory", "cc"); -	return retval; -} -EXPORT_SYMBOL(kernel_thread); -  typedef struct {  	union {  		unsigned int	pr_regs[32]; @@ -799,41 +750,6 @@ int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs)  }  EXPORT_SYMBOL(dump_fpu); -/* - * sparc_execve() executes a new program after the asm stub has set - * things up for us.  This should basically do what I want it to. - */ -asmlinkage int sparc_execve(struct pt_regs *regs) -{ -	int error, base = 0; -	struct filename *filename; - -	/* User register window flush is done by entry.S */ - -	/* Check for indirect call. */ -	if (regs->u_regs[UREG_G1] == 0) -		base = 1; - -	filename = getname((char __user *)regs->u_regs[base + UREG_I0]); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = do_execve(filename->name, -			  (const char __user *const __user *) -			  regs->u_regs[base + UREG_I1], -			  (const char __user *const __user *) -			  regs->u_regs[base + UREG_I2], regs); -	putname(filename); -	if (!error) { -		fprs_write(0); -		current_thread_info()->xfsr[0] = 0; -		current_thread_info()->fpsaved[0] = 0; -		regs->tstate &= ~TSTATE_PEF; -	} -out: -	return error; -} -  unsigned long get_wchan(struct task_struct *task)  {  	unsigned long pc, fp, bias = 0; diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index 44025f4ba41..8475a474273 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S @@ -47,7 +47,7 @@ STUB:	sra	REG1, 0, REG1; \  	sra	REG4, 0, REG4  SIGN1(sys32_exit, sparc_exit, %o0) -SIGN1(sys32_exit_group, sys_exit_group, %o0) +SIGN1(sys32_exit_group, sparc_exit_group, %o0)  SIGN1(sys32_wait4, compat_sys_wait4, %o2)  SIGN1(sys32_creat, sys_creat, %o1)  SIGN1(sys32_mknod, sys_mknod, %o1) diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c index c3239811a1b..03c7e929ec3 100644 --- a/arch/sparc/kernel/sys_sparc32.c +++ b/arch/sparc/kernel/sys_sparc32.c @@ -396,42 +396,6 @@ asmlinkage long compat_sys_rt_sigaction(int sig,          return ret;  } -/* - * sparc32_execve() executes a new program after the asm stub has set - * things up for us.  This should basically do what I want it to. - */ -asmlinkage long sparc32_execve(struct pt_regs *regs) -{ -	int error, base = 0; -	struct filename *filename; - -	/* User register window flush is done by entry.S */ - -	/* Check for indirect call. */ -	if ((u32)regs->u_regs[UREG_G1] == 0) -		base = 1; - -	filename = getname(compat_ptr(regs->u_regs[base + UREG_I0])); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; - -	error = compat_do_execve(filename->name, -				 compat_ptr(regs->u_regs[base + UREG_I1]), -				 compat_ptr(regs->u_regs[base + UREG_I2]), regs); - -	putname(filename); - -	if (!error) { -		fprs_write(0); -		current_thread_info()->xfsr[0] = 0; -		current_thread_info()->fpsaved[0] = 0; -		regs->tstate &= ~TSTATE_PEF; -	} -out: -	return error; -} -  #ifdef CONFIG_MODULES  asmlinkage long sys32_init_module(void __user *umod, u32 len, diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c index 0c9b31b22e0..2da0bdcae52 100644 --- a/arch/sparc/kernel/sys_sparc_32.c +++ b/arch/sparc/kernel/sys_sparc_32.c @@ -34,11 +34,9 @@ asmlinkage unsigned long sys_getpagesize(void)  	return PAGE_SIZE; /* Possibly older binaries want 8192 on sun4's? */  } -#define COLOUR_ALIGN(addr)      (((addr)+SHMLBA-1)&~(SHMLBA-1)) -  unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags)  { -	struct vm_area_struct * vmm; +	struct vm_unmapped_area_info info;  	if (flags & MAP_FIXED) {  		/* We do not accept a shared mapping if it would violate @@ -56,21 +54,14 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi  	if (!addr)  		addr = TASK_UNMAPPED_BASE; -	if (flags & MAP_SHARED) -		addr = COLOUR_ALIGN(addr); -	else -		addr = PAGE_ALIGN(addr); - -	for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) { -		/* At this point:  (!vmm || addr < vmm->vm_end). */ -		if (TASK_SIZE - PAGE_SIZE - len < addr) -			return -ENOMEM; -		if (!vmm || addr + len <= vmm->vm_start) -			return addr; -		addr = vmm->vm_end; -		if (flags & MAP_SHARED) -			addr = COLOUR_ALIGN(addr); -	} +	info.flags = 0; +	info.length = len; +	info.low_limit = addr; +	info.high_limit = TASK_SIZE; +	info.align_mask = (flags & MAP_SHARED) ? +		(PAGE_MASK & (SHMLBA - 1)) : 0; +	info.align_offset = pgoff << PAGE_SHIFT; +	return vm_unmapped_area(&info);  }  /* @@ -258,27 +249,3 @@ out:  	up_read(&uts_sem);  	return err;  } - -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	long __res; -	register long __g1 __asm__ ("g1") = __NR_execve; -	register long __o0 __asm__ ("o0") = (long)(filename); -	register long __o1 __asm__ ("o1") = (long)(argv); -	register long __o2 __asm__ ("o2") = (long)(envp); -	asm volatile ("t 0x10\n\t" -		      "bcc 1f\n\t" -		      "mov %%o0, %0\n\t" -		      "sub %%g0, %%o0, %0\n\t" -		      "1:\n\t" -		      : "=r" (__res), "=&r" (__o0) -		      : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1) -		      : "cc"); -	return __res; -} diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 878ef3d5fec..708bc29d36a 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c @@ -75,7 +75,7 @@ static inline int invalid_64bit_range(unsigned long addr, unsigned long len)   *    the spitfire/niagara VA-hole.   */ -static inline unsigned long COLOUR_ALIGN(unsigned long addr, +static inline unsigned long COLOR_ALIGN(unsigned long addr,  					 unsigned long pgoff)  {  	unsigned long base = (addr+SHMLBA-1)&~(SHMLBA-1); @@ -84,24 +84,13 @@ static inline unsigned long COLOUR_ALIGN(unsigned long addr,  	return base + off;  } -static inline unsigned long COLOUR_ALIGN_DOWN(unsigned long addr, -					      unsigned long pgoff) -{ -	unsigned long base = addr & ~(SHMLBA-1); -	unsigned long off = (pgoff<<PAGE_SHIFT) & (SHMLBA-1); - -	if (base + off <= addr) -		return base + off; -	return base - off; -} -  unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags)  {  	struct mm_struct *mm = current->mm;  	struct vm_area_struct * vma;  	unsigned long task_size = TASK_SIZE; -	unsigned long start_addr;  	int do_color_align; +	struct vm_unmapped_area_info info;  	if (flags & MAP_FIXED) {  		/* We do not accept a shared mapping if it would violate @@ -124,7 +113,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi  	if (addr) {  		if (do_color_align) -			addr = COLOUR_ALIGN(addr, pgoff); +			addr = COLOR_ALIGN(addr, pgoff);  		else  			addr = PAGE_ALIGN(addr); @@ -134,50 +123,22 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi  			return addr;  	} -	if (len > mm->cached_hole_size) { -	        start_addr = addr = mm->free_area_cache; -	} else { -	        start_addr = addr = TASK_UNMAPPED_BASE; -	        mm->cached_hole_size = 0; -	} - -	task_size -= len; - -full_search: -	if (do_color_align) -		addr = COLOUR_ALIGN(addr, pgoff); -	else -		addr = PAGE_ALIGN(addr); - -	for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { -		/* At this point:  (!vma || addr < vma->vm_end). */ -		if (addr < VA_EXCLUDE_START && -		    (addr + len) >= VA_EXCLUDE_START) { -			addr = VA_EXCLUDE_END; -			vma = find_vma(mm, VA_EXCLUDE_END); -		} -		if (unlikely(task_size < addr)) { -			if (start_addr != TASK_UNMAPPED_BASE) { -				start_addr = addr = TASK_UNMAPPED_BASE; -				mm->cached_hole_size = 0; -				goto full_search; -			} -			return -ENOMEM; -		} -		if (likely(!vma || addr + len <= vma->vm_start)) { -			/* -			 * Remember the place where we stopped the search: -			 */ -			mm->free_area_cache = addr + len; -			return addr; -		} -		if (addr + mm->cached_hole_size < vma->vm_start) -		        mm->cached_hole_size = vma->vm_start - addr; +	info.flags = 0; +	info.length = len; +	info.low_limit = TASK_UNMAPPED_BASE; +	info.high_limit = min(task_size, VA_EXCLUDE_START); +	info.align_mask = do_color_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; +	info.align_offset = pgoff << PAGE_SHIFT; +	addr = vm_unmapped_area(&info); -		addr = vma->vm_end; -		if (do_color_align) -			addr = COLOUR_ALIGN(addr, pgoff); +	if ((addr & ~PAGE_MASK) && task_size > VA_EXCLUDE_END) { +		VM_BUG_ON(addr != -ENOMEM); +		info.low_limit = VA_EXCLUDE_END; +		info.high_limit = task_size; +		addr = vm_unmapped_area(&info);  	} + +	return addr;  }  unsigned long @@ -190,6 +151,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  	unsigned long task_size = STACK_TOP32;  	unsigned long addr = addr0;  	int do_color_align; +	struct vm_unmapped_area_info info;  	/* This should only ever run for 32-bit processes.  */  	BUG_ON(!test_thread_flag(TIF_32BIT)); @@ -214,7 +176,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  	/* requesting a specific address */  	if (addr) {  		if (do_color_align) -			addr = COLOUR_ALIGN(addr, pgoff); +			addr = COLOR_ALIGN(addr, pgoff);  		else  			addr = PAGE_ALIGN(addr); @@ -224,73 +186,27 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  			return addr;  	} -	/* check if free_area_cache is useful for us */ -	if (len <= mm->cached_hole_size) { - 	        mm->cached_hole_size = 0; - 		mm->free_area_cache = mm->mmap_base; - 	} - -	/* either no address requested or can't fit in requested address hole */ -	addr = mm->free_area_cache; -	if (do_color_align) { -		unsigned long base = COLOUR_ALIGN_DOWN(addr-len, pgoff); - -		addr = base + len; -	} +	info.flags = VM_UNMAPPED_AREA_TOPDOWN; +	info.length = len; +	info.low_limit = PAGE_SIZE; +	info.high_limit = mm->mmap_base; +	info.align_mask = do_color_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; +	info.align_offset = pgoff << PAGE_SHIFT; +	addr = vm_unmapped_area(&info); -	/* make sure it can fit in the remaining address space */ -	if (likely(addr > len)) { -		vma = find_vma(mm, addr-len); -		if (!vma || addr <= vma->vm_start) { -			/* remember the address as a hint for next time */ -			return (mm->free_area_cache = addr-len); -		} -	} - -	if (unlikely(mm->mmap_base < len)) -		goto bottomup; - -	addr = mm->mmap_base-len; -	if (do_color_align) -		addr = COLOUR_ALIGN_DOWN(addr, pgoff); - -	do { -		/* -		 * Lookup failure means no vma is above this address, -		 * else if new region fits below vma->vm_start, -		 * return with success: -		 */ -		vma = find_vma(mm, addr); -		if (likely(!vma || addr+len <= vma->vm_start)) { -			/* remember the address as a hint for next time */ -			return (mm->free_area_cache = addr); -		} - - 		/* remember the largest hole we saw so far */ - 		if (addr + mm->cached_hole_size < vma->vm_start) - 		        mm->cached_hole_size = vma->vm_start - addr; - -		/* try just below the current vma->vm_start */ -		addr = vma->vm_start-len; -		if (do_color_align) -			addr = COLOUR_ALIGN_DOWN(addr, pgoff); -	} while (likely(len < vma->vm_start)); - -bottomup:  	/*  	 * A failed mmap() very likely causes application failure,  	 * so fall back to the bottom-up function here. This scenario  	 * can happen with large stack limits and large mmap()  	 * allocations.  	 */ -	mm->cached_hole_size = ~0UL; -  	mm->free_area_cache = TASK_UNMAPPED_BASE; -	addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags); -	/* -	 * Restore the topdown base: -	 */ -	mm->free_area_cache = mm->mmap_base; -	mm->cached_hole_size = ~0UL; +	if (addr & ~PAGE_MASK) { +		VM_BUG_ON(addr != -ENOMEM); +		info.flags = 0; +		info.low_limit = TASK_UNMAPPED_BASE; +		info.high_limit = STACK_TOP32; +		addr = vm_unmapped_area(&info); +	}  	return addr;  } @@ -730,28 +646,6 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,  	return ret;  } -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) -{ -	long __res; -	register long __g1 __asm__ ("g1") = __NR_execve; -	register long __o0 __asm__ ("o0") = (long)(filename); -	register long __o1 __asm__ ("o1") = (long)(argv); -	register long __o2 __asm__ ("o2") = (long)(envp); -	asm volatile ("t 0x6d\n\t" -		      "sub %%g0, %%o0, %0\n\t" -		      "movcc %%xcc, %%o0, %0\n\t" -		      : "=r" (__res), "=&r" (__o0) -		      : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1) -		      : "cc"); -	return __res; -} -  asmlinkage long sys_kern_features(void)  {  	return KERN_FEATURE_MIXED_MODE_STACK; diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S index 7f5f65d0b3f..e0fed7711a9 100644 --- a/arch/sparc/kernel/syscalls.S +++ b/arch/sparc/kernel/syscalls.S @@ -1,23 +1,19 @@  	/* SunOS's execv() call only specifies the argv argument, the  	 * environment settings are the same as the calling processes.  	 */ -sys_execve: -	sethi	%hi(sparc_execve), %g1 -	ba,pt	%xcc, execve_merge -	 or	%g1, %lo(sparc_execve), %g1 +sys64_execve: +	set	sys_execve, %g1 +	jmpl	%g1, %g0 +	 flushw  #ifdef CONFIG_COMPAT  sunos_execv: -	stx	%g0, [%sp + PTREGS_OFF + PT_V9_I2] +	mov	%g0, %o2  sys32_execve: -	sethi	%hi(sparc32_execve), %g1 -	or	%g1, %lo(sparc32_execve), %g1 -#endif - -execve_merge: -	flushw +	set	compat_sys_execve, %g1  	jmpl	%g1, %g0 -	 add	%sp, PTREGS_OFF, %o0 +	 flushw +#endif  	.align	32  sys_sparc_pipe: @@ -112,16 +108,31 @@ sys_clone:  ret_from_syscall:  	/* Clear current_thread_info()->new_child. */  	stb	%g0, [%g6 + TI_NEW_CHILD] -	ldx	[%g6 + TI_FLAGS], %l0  	call	schedule_tail  	 mov	%g7, %o0 +	ldx	[%sp + PTREGS_OFF + PT_V9_I0], %o0 +	brnz,pt	%o0, ret_sys_call +	 ldx	[%g6 + TI_FLAGS], %l0 +	ldx	[%sp + PTREGS_OFF + PT_V9_G1], %l1 +	call	%l1 +	 ldx	[%sp + PTREGS_OFF + PT_V9_G2], %o0  	ba,pt	%xcc, ret_sys_call -	 ldx	[%sp + PTREGS_OFF + PT_V9_I0], %o0 +	 mov	0, %o0 + +	.globl	sparc_exit_group +	.type	sparc_exit_group,#function +sparc_exit_group: +	sethi	%hi(sys_exit_group), %g7 +	ba,pt	%xcc, 1f +	 or	%g7, %lo(sys_exit_group), %g7 +	.size	sparc_exit_group,.-sparc_exit_group  	.globl	sparc_exit  	.type	sparc_exit,#function  sparc_exit: -	rdpr	%pstate, %g2 +	sethi	%hi(sys_exit), %g7 +	or	%g7, %lo(sys_exit), %g7 +1:	rdpr	%pstate, %g2  	wrpr	%g2, PSTATE_IE, %pstate  	rdpr	%otherwin, %g1  	rdpr	%cansave, %g3 @@ -129,7 +140,7 @@ sparc_exit:  	wrpr	%g3, 0x0, %cansave  	wrpr	%g0, 0x0, %otherwin  	wrpr	%g2, 0x0, %pstate -	ba,pt	%xcc, sys_exit +	jmpl	%g7, %g0  	 stb	%g0, [%g6 + TI_WSAVED]  	.size	sparc_exit,.-sparc_exit @@ -222,7 +233,6 @@ ret_sys_call:  	ldx	[%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc  2: -	stb	%g0, [%g6 + TI_SYS_NOERROR]  	/* System call success, clear Carry condition code. */  	andn	%g3, %g2, %g3  3: diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index 1c9af9fa38e..cdbd9b81775 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S @@ -107,7 +107,7 @@ sys_call_table:  /*40*/	.word sys_newlstat, sys_dup, sys_sparc_pipe, sys_times, sys_nis_syscall  	.word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid  /*50*/	.word sys_getegid, sys_acct, sys_memory_ordering, sys_nis_syscall, sys_ioctl -	.word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve +	.word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys64_execve  /*60*/	.word sys_umask, sys_chroot, sys_newfstat, sys_fstat64, sys_getpagesize  	.word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall  /*70*/	.word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys_64_munmap, sys_mprotect @@ -133,7 +133,7 @@ sys_call_table:  /*170*/	.word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents  	.word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr  /*180*/	.word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall -	.word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname +	.word sys_setpgid, sys_fremovexattr, sys_tkill, sparc_exit_group, sys_newuname  /*190*/	.word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl  	.word sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_nis_syscall, sys_sgetmask  /*200*/	.word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c index b66a77968f3..e7ecf1507d9 100644 --- a/arch/sparc/kernel/traps_64.c +++ b/arch/sparc/kernel/traps_64.c @@ -2688,8 +2688,8 @@ void __init trap_init(void)  		     TI_PRE_COUNT != offsetof(struct thread_info,  					      preempt_count) ||  		     TI_NEW_CHILD != offsetof(struct thread_info, new_child) || -		     TI_SYS_NOERROR != offsetof(struct thread_info, -						syscall_noerror) || +		     TI_CURRENT_DS != offsetof(struct thread_info, +						current_ds) ||  		     TI_RESTART_BLOCK != offsetof(struct thread_info,  						  restart_block) ||  		     TI_KUNA_REGS != offsetof(struct thread_info, diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c index f76f83d5ac6..d2b59441ebd 100644 --- a/arch/sparc/mm/hugetlbpage.c +++ b/arch/sparc/mm/hugetlbpage.c @@ -30,55 +30,28 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *filp,  							unsigned long pgoff,  							unsigned long flags)  { -	struct mm_struct *mm = current->mm; -	struct vm_area_struct * vma;  	unsigned long task_size = TASK_SIZE; -	unsigned long start_addr; +	struct vm_unmapped_area_info info;  	if (test_thread_flag(TIF_32BIT))  		task_size = STACK_TOP32; -	if (unlikely(len >= VA_EXCLUDE_START)) -		return -ENOMEM; - -	if (len > mm->cached_hole_size) { -	        start_addr = addr = mm->free_area_cache; -	} else { -	        start_addr = addr = TASK_UNMAPPED_BASE; -	        mm->cached_hole_size = 0; -	} -	task_size -= len; - -full_search: -	addr = ALIGN(addr, HPAGE_SIZE); - -	for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { -		/* At this point:  (!vma || addr < vma->vm_end). */ -		if (addr < VA_EXCLUDE_START && -		    (addr + len) >= VA_EXCLUDE_START) { -			addr = VA_EXCLUDE_END; -			vma = find_vma(mm, VA_EXCLUDE_END); -		} -		if (unlikely(task_size < addr)) { -			if (start_addr != TASK_UNMAPPED_BASE) { -				start_addr = addr = TASK_UNMAPPED_BASE; -				mm->cached_hole_size = 0; -				goto full_search; -			} -			return -ENOMEM; -		} -		if (likely(!vma || addr + len <= vma->vm_start)) { -			/* -			 * Remember the place where we stopped the search: -			 */ -			mm->free_area_cache = addr + len; -			return addr; -		} -		if (addr + mm->cached_hole_size < vma->vm_start) -		        mm->cached_hole_size = vma->vm_start - addr; +	info.flags = 0; +	info.length = len; +	info.low_limit = TASK_UNMAPPED_BASE; +	info.high_limit = min(task_size, VA_EXCLUDE_START); +	info.align_mask = PAGE_MASK & ~HPAGE_MASK; +	info.align_offset = 0; +	addr = vm_unmapped_area(&info); -		addr = ALIGN(vma->vm_end, HPAGE_SIZE); +	if ((addr & ~PAGE_MASK) && task_size > VA_EXCLUDE_END) { +		VM_BUG_ON(addr != -ENOMEM); +		info.low_limit = VA_EXCLUDE_END; +		info.high_limit = task_size; +		addr = vm_unmapped_area(&info);  	} + +	return addr;  }  static unsigned long @@ -87,71 +60,34 @@ hugetlb_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  				  const unsigned long pgoff,  				  const unsigned long flags)  { -	struct vm_area_struct *vma;  	struct mm_struct *mm = current->mm;  	unsigned long addr = addr0; +	struct vm_unmapped_area_info info;  	/* This should only ever run for 32-bit processes.  */  	BUG_ON(!test_thread_flag(TIF_32BIT)); -	/* check if free_area_cache is useful for us */ -	if (len <= mm->cached_hole_size) { - 	        mm->cached_hole_size = 0; - 		mm->free_area_cache = mm->mmap_base; - 	} - -	/* either no address requested or can't fit in requested address hole */ -	addr = mm->free_area_cache & HPAGE_MASK; +	info.flags = VM_UNMAPPED_AREA_TOPDOWN; +	info.length = len; +	info.low_limit = PAGE_SIZE; +	info.high_limit = mm->mmap_base; +	info.align_mask = PAGE_MASK & ~HPAGE_MASK; +	info.align_offset = 0; +	addr = vm_unmapped_area(&info); -	/* make sure it can fit in the remaining address space */ -	if (likely(addr > len)) { -		vma = find_vma(mm, addr-len); -		if (!vma || addr <= vma->vm_start) { -			/* remember the address as a hint for next time */ -			return (mm->free_area_cache = addr-len); -		} -	} - -	if (unlikely(mm->mmap_base < len)) -		goto bottomup; - -	addr = (mm->mmap_base-len) & HPAGE_MASK; - -	do { -		/* -		 * Lookup failure means no vma is above this address, -		 * else if new region fits below vma->vm_start, -		 * return with success: -		 */ -		vma = find_vma(mm, addr); -		if (likely(!vma || addr+len <= vma->vm_start)) { -			/* remember the address as a hint for next time */ -			return (mm->free_area_cache = addr); -		} - - 		/* remember the largest hole we saw so far */ - 		if (addr + mm->cached_hole_size < vma->vm_start) - 		        mm->cached_hole_size = vma->vm_start - addr; - -		/* try just below the current vma->vm_start */ -		addr = (vma->vm_start-len) & HPAGE_MASK; -	} while (likely(len < vma->vm_start)); - -bottomup:  	/*  	 * A failed mmap() very likely causes application failure,  	 * so fall back to the bottom-up function here. This scenario  	 * can happen with large stack limits and large mmap()  	 * allocations.  	 */ -	mm->cached_hole_size = ~0UL; -  	mm->free_area_cache = TASK_UNMAPPED_BASE; -	addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags); -	/* -	 * Restore the topdown base: -	 */ -	mm->free_area_cache = mm->mmap_base; -	mm->cached_hole_size = ~0UL; +	if (addr & ~PAGE_MASK) { +		VM_BUG_ON(addr != -ENOMEM); +		info.flags = 0; +		info.low_limit = TASK_UNMAPPED_BASE; +		info.high_limit = STACK_TOP32; +		addr = vm_unmapped_area(&info); +	}  	return addr;  } diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 9e28a118e6a..85be1ca539b 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -624,7 +624,7 @@ static void __init inherit_prom_mappings(void)  void prom_world(int enter)  {  	if (!enter) -		set_fs((mm_segment_t) { get_thread_current_ds() }); +		set_fs(get_fs());  	__asm__ __volatile__("flushw");  } diff --git a/arch/sparc/net/bpf_jit_comp.c b/arch/sparc/net/bpf_jit_comp.c index 28368701ef7..3109ca684a9 100644 --- a/arch/sparc/net/bpf_jit_comp.c +++ b/arch/sparc/net/bpf_jit_comp.c @@ -3,6 +3,7 @@  #include <linux/netdevice.h>  #include <linux/filter.h>  #include <linux/cache.h> +#include <linux/if_vlan.h>  #include <asm/cacheflush.h>  #include <asm/ptrace.h> @@ -312,6 +313,12 @@ do {	*prog++ = BR_OPC | WDISP22(OFF);		\  #define emit_addi(R1, IMM, R3) \  	*prog++ = (ADD | IMMED | RS1(R1) | S13(IMM) | RD(R3)) +#define emit_and(R1, R2, R3) \ +	*prog++ = (AND | RS1(R1) | RS2(R2) | RD(R3)) + +#define emit_andi(R1, IMM, R3) \ +	*prog++ = (AND | IMMED | RS1(R1) | S13(IMM) | RD(R3)) +  #define emit_alloc_stack(SZ) \  	*prog++ = (SUB | IMMED | RS1(SP) | S13(SZ) | RD(SP)) @@ -415,6 +422,8 @@ void bpf_jit_compile(struct sk_filter *fp)  		case BPF_S_ANC_IFINDEX:  		case BPF_S_ANC_MARK:  		case BPF_S_ANC_RXHASH: +		case BPF_S_ANC_VLAN_TAG: +		case BPF_S_ANC_VLAN_TAG_PRESENT:  		case BPF_S_ANC_CPU:  		case BPF_S_ANC_QUEUE:  		case BPF_S_LD_W_ABS: @@ -600,6 +609,16 @@ void bpf_jit_compile(struct sk_filter *fp)  			case BPF_S_ANC_RXHASH:  				emit_skb_load32(rxhash, r_A);  				break; +			case BPF_S_ANC_VLAN_TAG: +			case BPF_S_ANC_VLAN_TAG_PRESENT: +				emit_skb_load16(vlan_tci, r_A); +				if (filter[i].code == BPF_S_ANC_VLAN_TAG) { +					emit_andi(r_A, VLAN_VID_MASK, r_A); +				} else { +					emit_loadimm(VLAN_TAG_PRESENT, r_TMP); +					emit_and(r_A, r_TMP, r_A); +				} +				break;  			case BPF_S_LD_IMM:  				emit_loadimm(K, r_A); diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 875d008828b..ea7f61e8bc9 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig @@ -21,6 +21,8 @@ config TILE  	select ARCH_HAVE_NMI_SAFE_CMPXCHG  	select GENERIC_CLOCKEVENTS  	select MODULES_USE_ELF_RELA +	select GENERIC_KERNEL_THREAD +	select GENERIC_KERNEL_EXECVE  # FIXME: investigate whether we need/want these options.  #	select HAVE_IOREMAP_PROT diff --git a/arch/tile/include/asm/Kbuild b/arch/tile/include/asm/Kbuild index 6948015e08a..b17b9b8e53c 100644 --- a/arch/tile/include/asm/Kbuild +++ b/arch/tile/include/asm/Kbuild @@ -34,5 +34,6 @@ generic-y += sockios.h  generic-y += statfs.h  generic-y += termbits.h  generic-y += termios.h +generic-y += trace_clock.h  generic-y += types.h  generic-y += xor.h diff --git a/arch/tile/include/asm/compat.h b/arch/tile/include/asm/compat.h index 3063e6fc8da..ca61fb4296b 100644 --- a/arch/tile/include/asm/compat.h +++ b/arch/tile/include/asm/compat.h @@ -275,18 +275,14 @@ extern int compat_setup_rt_frame(int sig, struct k_sigaction *ka,  struct compat_sigaction;  struct compat_siginfo;  struct compat_sigaltstack; -long compat_sys_execve(const char __user *path, -		       compat_uptr_t __user *argv, -		       compat_uptr_t __user *envp, struct pt_regs *);  long compat_sys_rt_sigaction(int sig, struct compat_sigaction __user *act,  			     struct compat_sigaction __user *oact,  			     size_t sigsetsize);  long compat_sys_rt_sigqueueinfo(int pid, int sig,  				struct compat_siginfo __user *uinfo); -long compat_sys_rt_sigreturn(struct pt_regs *); +long compat_sys_rt_sigreturn(void);  long compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr, -			    struct compat_sigaltstack __user *uoss_ptr, -			    struct pt_regs *); +			    struct compat_sigaltstack __user *uoss_ptr);  long compat_sys_truncate64(char __user *filename, u32 dummy, u32 low, u32 high);  long compat_sys_ftruncate64(unsigned int fd, u32 dummy, u32 low, u32 high);  long compat_sys_pread64(unsigned int fd, char __user *ubuf, size_t count, @@ -303,12 +299,7 @@ long compat_sys_fallocate(int fd, int mode,  long compat_sys_sched_rr_get_interval(compat_pid_t pid,  				      struct compat_timespec __user *interval); -/* These are the intvec_64.S trampolines. */ -long _compat_sys_execve(const char __user *path, -			const compat_uptr_t __user *argv, -			const compat_uptr_t __user *envp); -long _compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr, -			    struct compat_sigaltstack __user *uoss_ptr); +/* Assembly trampoline to avoid clobbering r0. */  long _compat_sys_rt_sigreturn(void);  #endif /* _ASM_TILE_COMPAT_H */ diff --git a/arch/tile/include/asm/elf.h b/arch/tile/include/asm/elf.h index f8ccf08f693..b73e1039c91 100644 --- a/arch/tile/include/asm/elf.h +++ b/arch/tile/include/asm/elf.h @@ -148,6 +148,7 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm,  #define compat_start_thread(regs, ip, usp) do { \  		regs->pc = ptr_to_compat_reg((void *)(ip)); \  		regs->sp = ptr_to_compat_reg((void *)(usp)); \ +		single_step_execve();	\  	} while (0)  /* diff --git a/arch/tile/include/asm/processor.h b/arch/tile/include/asm/processor.h index 8c4dd9ff91e..2b70dfb1442 100644 --- a/arch/tile/include/asm/processor.h +++ b/arch/tile/include/asm/processor.h @@ -211,6 +211,7 @@ static inline void start_thread(struct pt_regs *regs,  {  	regs->pc = pc;  	regs->sp = usp; +	single_step_execve();  }  /* Free all resources held by a thread. */ @@ -219,8 +220,6 @@ static inline void release_thread(struct task_struct *dead_task)  	/* Nothing for now */  } -extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -  extern int do_work_pending(struct pt_regs *regs, u32 flags); @@ -239,6 +238,9 @@ unsigned long get_wchan(struct task_struct *p);  #define KSTK_TOP(task)	(task_ksp0(task) - STACK_TOP_DELTA)  #define task_pt_regs(task) \    ((struct pt_regs *)(task_ksp0(task) - KSTK_PTREGS_GAP) - 1) +#define current_pt_regs()                                   \ +  ((struct pt_regs *)((stack_pointer | (THREAD_SIZE - 1)) - \ +                      (KSTK_PTREGS_GAP - 1)) - 1)  #define task_sp(task)	(task_pt_regs(task)->sp)  #define task_pc(task)	(task_pt_regs(task)->pc)  /* Aliases for pc and sp (used in fs/proc/array.c) */ diff --git a/arch/tile/include/asm/switch_to.h b/arch/tile/include/asm/switch_to.h index 1d48c5fee8b..b8f888cbe6b 100644 --- a/arch/tile/include/asm/switch_to.h +++ b/arch/tile/include/asm/switch_to.h @@ -68,7 +68,10 @@ extern unsigned long get_switch_to_pc(void);  /* Support function for forking a new task. */  void ret_from_fork(void); -/* Called from ret_from_fork() when a new process starts up. */ +/* Support function for forking a new kernel thread. */ +void ret_from_kernel_thread(void *fn, void *arg); + +/* Called from ret_from_xxx() when a new process starts up. */  struct task_struct *sim_notify_fork(struct task_struct *prev);  #endif /* !__ASSEMBLY__ */ diff --git a/arch/tile/include/asm/syscalls.h b/arch/tile/include/asm/syscalls.h index 06f0464cfed..4c8462a62cb 100644 --- a/arch/tile/include/asm/syscalls.h +++ b/arch/tile/include/asm/syscalls.h @@ -51,8 +51,7 @@ long sys_cacheflush(unsigned long addr, unsigned long len,  #ifndef __tilegx__  /* mm/fault.c */ -long sys_cmpxchg_badaddr(unsigned long address, struct pt_regs *); -long _sys_cmpxchg_badaddr(unsigned long address); +long sys_cmpxchg_badaddr(unsigned long address);  #endif  #ifdef CONFIG_COMPAT @@ -63,14 +62,16 @@ long sys_truncate64(const char __user *path, loff_t length);  long sys_ftruncate64(unsigned int fd, loff_t length);  #endif +/* Provide versions of standard syscalls that use current_pt_regs(). */ +long sys_rt_sigreturn(void); +long sys_sigaltstack(const stack_t __user *, stack_t __user *); +#define sys_rt_sigreturn sys_rt_sigreturn +#define sys_sigaltstack sys_sigaltstack +  /* These are the intvec*.S trampolines. */ -long _sys_sigaltstack(const stack_t __user *, stack_t __user *);  long _sys_rt_sigreturn(void);  long _sys_clone(unsigned long clone_flags, unsigned long newsp,  		void __user *parent_tid, void __user *child_tid); -long _sys_execve(const char __user *filename, -		 const char __user *const __user *argv, -		 const char __user *const __user *envp);  #include <asm-generic/syscalls.h> diff --git a/arch/tile/include/asm/unistd.h b/arch/tile/include/asm/unistd.h index 6e032a0a268..b51c6ee3cd6 100644 --- a/arch/tile/include/asm/unistd.h +++ b/arch/tile/include/asm/unistd.h @@ -16,4 +16,6 @@  #define __ARCH_WANT_SYS_LLSEEK  #endif  #define __ARCH_WANT_SYS_NEWFSTATAT +#define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_CLONE  #include <uapi/asm/unistd.h> diff --git a/arch/tile/kernel/compat.c b/arch/tile/kernel/compat.c index d67459b9ac2..9cd7cb6041c 100644 --- a/arch/tile/kernel/compat.c +++ b/arch/tile/kernel/compat.c @@ -102,9 +102,7 @@ long compat_sys_sched_rr_get_interval(compat_pid_t pid,  #define compat_sys_fadvise64_64 sys32_fadvise64_64  #define compat_sys_readahead sys32_readahead -/* Call the trampolines to manage pt_regs where necessary. */ -#define compat_sys_execve _compat_sys_execve -#define compat_sys_sigaltstack _compat_sys_sigaltstack +/* Call the assembly trampolines where necessary. */  #define compat_sys_rt_sigreturn _compat_sys_rt_sigreturn  #define sys_clone _sys_clone diff --git a/arch/tile/kernel/compat_signal.c b/arch/tile/kernel/compat_signal.c index 08b4fe1717b..2e4cc69224a 100644 --- a/arch/tile/kernel/compat_signal.c +++ b/arch/tile/kernel/compat_signal.c @@ -197,8 +197,7 @@ int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from)  }  long compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr, -			    struct compat_sigaltstack __user *uoss_ptr, -			    struct pt_regs *regs) +			    struct compat_sigaltstack __user *uoss_ptr)  {  	stack_t uss, uoss;  	int ret; @@ -219,7 +218,7 @@ long compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr,  	set_fs(KERNEL_DS);  	ret = do_sigaltstack(uss_ptr ? (stack_t __user __force *)&uss : NULL,  			     (stack_t __user __force *)&uoss, -			     (unsigned long)compat_ptr(regs->sp)); +			     (unsigned long)compat_ptr(current_pt_regs()->sp));  	set_fs(seg);  	if (ret >= 0 && uoss_ptr)  {  		if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(*uoss_ptr)) || @@ -232,8 +231,9 @@ long compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr,  }  /* The assembly shim for this function arranges to ignore the return value. */ -long compat_sys_rt_sigreturn(struct pt_regs *regs) +long compat_sys_rt_sigreturn(void)  { +	struct pt_regs *regs = current_pt_regs();  	struct compat_rt_sigframe __user *frame =  		(struct compat_rt_sigframe __user *) compat_ptr(regs->sp);  	sigset_t set; @@ -248,7 +248,7 @@ long compat_sys_rt_sigreturn(struct pt_regs *regs)  	if (restore_sigcontext(regs, &frame->uc.uc_mcontext))  		goto badframe; -	if (compat_sys_sigaltstack(&frame->uc.uc_stack, NULL, regs) != 0) +	if (compat_sys_sigaltstack(&frame->uc.uc_stack, NULL) == -EFAULT)  		goto badframe;  	return 0; diff --git a/arch/tile/kernel/entry.S b/arch/tile/kernel/entry.S index c31637baff2..f116cb0bce2 100644 --- a/arch/tile/kernel/entry.S +++ b/arch/tile/kernel/entry.S @@ -28,17 +28,6 @@ STD_ENTRY(current_text_addr)  	STD_ENDPROC(current_text_addr)  /* - * Implement execve().  The i386 code has a note that forking from kernel - * space results in no copy on write until the execve, so we should be - * careful not to write to the stack here. - */ -STD_ENTRY(kernel_execve) -	moveli TREG_SYSCALL_NR_NAME, __NR_execve -	swint1 -	jrp lr -	STD_ENDPROC(kernel_execve) - -/*   * We don't run this function directly, but instead copy it to a page   * we map into every user process.  See vdso_setup().   * diff --git a/arch/tile/kernel/intvec_32.S b/arch/tile/kernel/intvec_32.S index 6943515100f..f212bf7cea8 100644 --- a/arch/tile/kernel/intvec_32.S +++ b/arch/tile/kernel/intvec_32.S @@ -1291,6 +1291,21 @@ STD_ENTRY(ret_from_fork)  	}  	STD_ENDPROC(ret_from_fork) +STD_ENTRY(ret_from_kernel_thread) +	jal     sim_notify_fork +	jal     schedule_tail +	FEEDBACK_REENTER(ret_from_fork) +	{ +	 move   r0, r31 +	 jalr   r30 +	} +	FEEDBACK_REENTER(ret_from_kernel_thread) +	{ +	 movei  r30, 0               /* not an NMI */ +	 j      .Lresume_userspace   /* jump into middle of interrupt_return */ +	} +	STD_ENDPROC(ret_from_kernel_thread) +  	/*  	 * Code for ill interrupt.  	 */ @@ -1437,15 +1452,6 @@ STD_ENTRY_LOCAL(bad_intr)  	panic   "Unhandled interrupt %#x: PC %#lx"  	STD_ENDPROC(bad_intr) -/* Put address of pt_regs in reg and jump. */ -#define PTREGS_SYSCALL(x, reg)                          \ -	STD_ENTRY(_##x);                                \ -	{                                               \ -	 PTREGS_PTR(reg, PTREGS_OFFSET_BASE);           \ -	 j      x                                       \ -	};                                              \ -	STD_ENDPROC(_##x) -  /*   * Special-case sigreturn to not write r0 to the stack on return.   * This is technically more efficient, but it also avoids difficulties @@ -1461,12 +1467,9 @@ STD_ENTRY_LOCAL(bad_intr)  	};                                              \  	STD_ENDPROC(_##x) -PTREGS_SYSCALL(sys_execve, r3) -PTREGS_SYSCALL(sys_sigaltstack, r2)  PTREGS_SYSCALL_SIGRETURN(sys_rt_sigreturn, r0) -PTREGS_SYSCALL(sys_cmpxchg_badaddr, r1) -/* Save additional callee-saves to pt_regs, put address in r4 and jump. */ +/* Save additional callee-saves to pt_regs and jump to standard function. */  STD_ENTRY(_sys_clone)  	push_extra_callee_saves r4  	j       sys_clone diff --git a/arch/tile/kernel/intvec_64.S b/arch/tile/kernel/intvec_64.S index 7c06d597ffd..54bc9a6678e 100644 --- a/arch/tile/kernel/intvec_64.S +++ b/arch/tile/kernel/intvec_64.S @@ -1150,6 +1150,21 @@ STD_ENTRY(ret_from_fork)  	}  	STD_ENDPROC(ret_from_fork) +STD_ENTRY(ret_from_kernel_thread) +	jal     sim_notify_fork +	jal     schedule_tail +	FEEDBACK_REENTER(ret_from_fork) +	{ +	 move   r0, r31 +	 jalr   r30 +	} +	FEEDBACK_REENTER(ret_from_kernel_thread) +	{ +	 movei  r30, 0               /* not an NMI */ +	 j      .Lresume_userspace   /* jump into middle of interrupt_return */ +	} +	STD_ENDPROC(ret_from_kernel_thread) +  /* Various stub interrupt handlers and syscall handlers */  STD_ENTRY_LOCAL(_kernel_double_fault) @@ -1166,15 +1181,6 @@ STD_ENTRY_LOCAL(bad_intr)  	panic   "Unhandled interrupt %#x: PC %#lx"  	STD_ENDPROC(bad_intr) -/* Put address of pt_regs in reg and jump. */ -#define PTREGS_SYSCALL(x, reg)                          \ -	STD_ENTRY(_##x);                                \ -	{                                               \ -	 PTREGS_PTR(reg, PTREGS_OFFSET_BASE);           \ -	 j      x                                       \ -	};                                              \ -	STD_ENDPROC(_##x) -  /*   * Special-case sigreturn to not write r0 to the stack on return.   * This is technically more efficient, but it also avoids difficulties @@ -1190,16 +1196,12 @@ STD_ENTRY_LOCAL(bad_intr)  	};                                              \  	STD_ENDPROC(_##x) -PTREGS_SYSCALL(sys_execve, r3) -PTREGS_SYSCALL(sys_sigaltstack, r2)  PTREGS_SYSCALL_SIGRETURN(sys_rt_sigreturn, r0)  #ifdef CONFIG_COMPAT -PTREGS_SYSCALL(compat_sys_execve, r3) -PTREGS_SYSCALL(compat_sys_sigaltstack, r2)  PTREGS_SYSCALL_SIGRETURN(compat_sys_rt_sigreturn, r0)  #endif -/* Save additional callee-saves to pt_regs, put address in r4 and jump. */ +/* Save additional callee-saves to pt_regs and jump to standard function. */  STD_ENTRY(_sys_clone)  	push_extra_callee_saves r4  	j       sys_clone diff --git a/arch/tile/kernel/process.c b/arch/tile/kernel/process.c index 307d010696c..0e5661e7d00 100644 --- a/arch/tile/kernel/process.c +++ b/arch/tile/kernel/process.c @@ -157,24 +157,43 @@ void arch_release_thread_info(struct thread_info *info)  static void save_arch_state(struct thread_struct *t);  int copy_thread(unsigned long clone_flags, unsigned long sp, -		unsigned long stack_size, -		struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  { -	struct pt_regs *childregs; +	struct pt_regs *childregs = task_pt_regs(p), *regs = current_pt_regs();  	unsigned long ksp; +	unsigned long *callee_regs;  	/* -	 * When creating a new kernel thread we pass sp as zero. -	 * Assign it to a reasonable value now that we have the stack. +	 * Set up the stack and stack pointer appropriately for the +	 * new child to find itself woken up in __switch_to(). +	 * The callee-saved registers must be on the stack to be read; +	 * the new task will then jump to assembly support to handle +	 * calling schedule_tail(), etc., and (for userspace tasks) +	 * returning to the context set up in the pt_regs.  	 */ -	if (sp == 0 && regs->ex1 == PL_ICS_EX1(KERNEL_PL, 0)) -		sp = KSTK_TOP(p); +	ksp = (unsigned long) childregs; +	ksp -= C_ABI_SAVE_AREA_SIZE;   /* interrupt-entry save area */ +	((long *)ksp)[0] = ((long *)ksp)[1] = 0; +	ksp -= CALLEE_SAVED_REGS_COUNT * sizeof(unsigned long); +	callee_regs = (unsigned long *)ksp; +	ksp -= C_ABI_SAVE_AREA_SIZE;   /* __switch_to() save area */ +	((long *)ksp)[0] = ((long *)ksp)[1] = 0; +	p->thread.ksp = ksp; -	/* -	 * Do not clone step state from the parent; each thread -	 * must make its own lazily. -	 */ -	task_thread_info(p)->step_state = NULL; +	/* Record the pid of the task that created this one. */ +	p->thread.creator_pid = current->pid; + +	if (unlikely(p->flags & PF_KTHREAD)) { +		/* kernel thread */ +		memset(childregs, 0, sizeof(struct pt_regs)); +		memset(&callee_regs[2], 0, +		       (CALLEE_SAVED_REGS_COUNT - 2) * sizeof(unsigned long)); +		callee_regs[0] = sp;   /* r30 = function */ +		callee_regs[1] = arg;  /* r31 = arg */ +		childregs->ex1 = PL_ICS_EX1(KERNEL_PL, 0); +		p->thread.pc = (unsigned long) ret_from_kernel_thread; +		return 0; +	}  	/*  	 * Start new thread in ret_from_fork so it schedules properly @@ -182,46 +201,33 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  	 */  	p->thread.pc = (unsigned long) ret_from_fork; -	/* Save user stack top pointer so we can ID the stack vm area later. */ -	p->thread.usp0 = sp; - -	/* Record the pid of the process that created this one. */ -	p->thread.creator_pid = current->pid; +	/* +	 * Do not clone step state from the parent; each thread +	 * must make its own lazily. +	 */ +	task_thread_info(p)->step_state = NULL;  	/*  	 * Copy the registers onto the kernel stack so the  	 * return-from-interrupt code will reload it into registers.  	 */ -	childregs = task_pt_regs(p); -	*childregs = *regs; +	*childregs = *current_pt_regs();  	childregs->regs[0] = 0;         /* return value is zero */ -	childregs->sp = sp;  /* override with new user stack pointer */ +	if (sp) +		childregs->sp = sp;  /* override with new user stack pointer */ +	memcpy(callee_regs, &childregs->regs[CALLEE_SAVED_FIRST_REG], +	       CALLEE_SAVED_REGS_COUNT * sizeof(unsigned long)); + +	/* Save user stack top pointer so we can ID the stack vm area later. */ +	p->thread.usp0 = childregs->sp;  	/*  	 * If CLONE_SETTLS is set, set "tp" in the new task to "r4",  	 * which is passed in as arg #5 to sys_clone().  	 */  	if (clone_flags & CLONE_SETTLS) -		childregs->tp = regs->regs[4]; +		childregs->tp = childregs->regs[4]; -	/* -	 * Copy the callee-saved registers from the passed pt_regs struct -	 * into the context-switch callee-saved registers area. -	 * This way when we start the interrupt-return sequence, the -	 * callee-save registers will be correctly in registers, which -	 * is how we assume the compiler leaves them as we start doing -	 * the normal return-from-interrupt path after calling C code. -	 * Zero out the C ABI save area to mark the top of the stack. -	 */ -	ksp = (unsigned long) childregs; -	ksp -= C_ABI_SAVE_AREA_SIZE;   /* interrupt-entry save area */ -	((long *)ksp)[0] = ((long *)ksp)[1] = 0; -	ksp -= CALLEE_SAVED_REGS_COUNT * sizeof(unsigned long); -	memcpy((void *)ksp, ®s->regs[CALLEE_SAVED_FIRST_REG], -	       CALLEE_SAVED_REGS_COUNT * sizeof(unsigned long)); -	ksp -= C_ABI_SAVE_AREA_SIZE;   /* __switch_to() save area */ -	((long *)ksp)[0] = ((long *)ksp)[1] = 0; -	p->thread.ksp = ksp;  #if CHIP_HAS_TILE_DMA()  	/* @@ -577,62 +583,6 @@ int do_work_pending(struct pt_regs *regs, u32 thread_info_flags)  	panic("work_pending: bad flags %#x\n", thread_info_flags);  } -/* Note there is an implicit fifth argument if (clone_flags & CLONE_SETTLS). */ -SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp, -		void __user *, parent_tidptr, void __user *, child_tidptr, -		struct pt_regs *, regs) -{ -	if (!newsp) -		newsp = regs->sp; -	return do_fork(clone_flags, newsp, regs, 0, -		       parent_tidptr, child_tidptr); -} - -/* - * sys_execve() executes a new program. - */ -SYSCALL_DEFINE4(execve, const char __user *, path, -		const char __user *const __user *, argv, -		const char __user *const __user *, envp, -		struct pt_regs *, regs) -{ -	long error; -	struct filename *filename; - -	filename = getname(path); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = do_execve(filename->name, argv, envp, regs); -	putname(filename); -	if (error == 0) -		single_step_execve(); -out: -	return error; -} - -#ifdef CONFIG_COMPAT -long compat_sys_execve(const char __user *path, -		       compat_uptr_t __user *argv, -		       compat_uptr_t __user *envp, -		       struct pt_regs *regs) -{ -	long error; -	struct filename *filename; - -	filename = getname(path); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = compat_do_execve(filename->name, argv, envp, regs); -	putname(filename); -	if (error == 0) -		single_step_execve(); -out: -	return error; -} -#endif -  unsigned long get_wchan(struct task_struct *p)  {  	struct KBacktraceIterator kbt; @@ -650,37 +600,6 @@ unsigned long get_wchan(struct task_struct *p)  	return 0;  } -/* - * We pass in lr as zero (cleared in kernel_thread) and the caller - * part of the backtrace ABI on the stack also zeroed (in copy_thread) - * so that backtraces will stop with this function. - * Note that we don't use r0, since copy_thread() clears it. - */ -static void start_kernel_thread(int dummy, int (*fn)(int), int arg) -{ -	do_exit(fn(arg)); -} - -/* - * Create a kernel thread - */ -int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); -	regs.ex1 = PL_ICS_EX1(KERNEL_PL, 0);  /* run at kernel PL, no ICS */ -	regs.pc = (long) start_kernel_thread; -	regs.flags = PT_FLAGS_CALLER_SAVES;   /* need to restore r1 and r2 */ -	regs.regs[1] = (long) fn;             /* function pointer */ -	regs.regs[2] = (long) arg;            /* parameter register */ - -	/* Ok, create the new process.. */ -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, -		       0, NULL, NULL); -} -EXPORT_SYMBOL(kernel_thread); -  /* Flush thread state. */  void flush_thread(void)  { diff --git a/arch/tile/kernel/signal.c b/arch/tile/kernel/signal.c index 67efb656d10..657a7ace4ab 100644 --- a/arch/tile/kernel/signal.c +++ b/arch/tile/kernel/signal.c @@ -37,10 +37,10 @@  #define DEBUG_SIG 0 -SYSCALL_DEFINE3(sigaltstack, const stack_t __user *, uss, -		stack_t __user *, uoss, struct pt_regs *, regs) +SYSCALL_DEFINE2(sigaltstack, const stack_t __user *, uss, +		stack_t __user *, uoss)  { -	return do_sigaltstack(uss, uoss, regs->sp); +	return do_sigaltstack(uss, uoss, current_pt_regs()->sp);  } @@ -83,8 +83,9 @@ void signal_fault(const char *type, struct pt_regs *regs,  }  /* The assembly shim for this function arranges to ignore the return value. */ -SYSCALL_DEFINE1(rt_sigreturn, struct pt_regs *, regs) +SYSCALL_DEFINE0(rt_sigreturn)  { +	struct pt_regs *regs = current_pt_regs();  	struct rt_sigframe __user *frame =  		(struct rt_sigframe __user *)(regs->sp);  	sigset_t set; diff --git a/arch/tile/kernel/sys.c b/arch/tile/kernel/sys.c index b08095b402d..b881a7be24b 100644 --- a/arch/tile/kernel/sys.c +++ b/arch/tile/kernel/sys.c @@ -106,14 +106,10 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,  #define sys_readahead sys32_readahead  #endif -/* Call the trampolines to manage pt_regs where necessary. */ -#define sys_execve _sys_execve -#define sys_sigaltstack _sys_sigaltstack +/* Call the assembly trampolines where necessary. */ +#undef sys_rt_sigreturn  #define sys_rt_sigreturn _sys_rt_sigreturn  #define sys_clone _sys_clone -#ifndef __tilegx__ -#define sys_cmpxchg_badaddr _sys_cmpxchg_badaddr -#endif  /*   * Note that we can't include <linux/unistd.h> here since the header diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c index fe811fa5f1b..3d2b81c163a 100644 --- a/arch/tile/mm/fault.c +++ b/arch/tile/mm/fault.c @@ -70,9 +70,10 @@ static noinline void force_sig_info_fault(const char *type, int si_signo,   * Synthesize the fault a PL0 process would get by doing a word-load of   * an unaligned address or a high kernel address.   */ -SYSCALL_DEFINE2(cmpxchg_badaddr, unsigned long, address, -		struct pt_regs *, regs) +SYSCALL_DEFINE1(cmpxchg_badaddr, unsigned long, address)  { +	struct pt_regs *regs = current_pt_regs(); +  	if (address >= PAGE_OFFSET)  		force_sig_info_fault("atomic segfault", SIGSEGV, SEGV_MAPERR,  				     address, INT_DTLB_MISS, current, regs); diff --git a/arch/tile/mm/hugetlbpage.c b/arch/tile/mm/hugetlbpage.c index 812e2d03797..650ccff8378 100644 --- a/arch/tile/mm/hugetlbpage.c +++ b/arch/tile/mm/hugetlbpage.c @@ -231,42 +231,15 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file,  		unsigned long pgoff, unsigned long flags)  {  	struct hstate *h = hstate_file(file); -	struct mm_struct *mm = current->mm; -	struct vm_area_struct *vma; -	unsigned long start_addr; - -	if (len > mm->cached_hole_size) { -		start_addr = mm->free_area_cache; -	} else { -		start_addr = TASK_UNMAPPED_BASE; -		mm->cached_hole_size = 0; -	} - -full_search: -	addr = ALIGN(start_addr, huge_page_size(h)); +	struct vm_unmapped_area_info info; -	for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { -		/* At this point:  (!vma || addr < vma->vm_end). */ -		if (TASK_SIZE - len < addr) { -			/* -			 * Start a new search - just in case we missed -			 * some holes. -			 */ -			if (start_addr != TASK_UNMAPPED_BASE) { -				start_addr = TASK_UNMAPPED_BASE; -				mm->cached_hole_size = 0; -				goto full_search; -			} -			return -ENOMEM; -		} -		if (!vma || addr + len <= vma->vm_start) { -			mm->free_area_cache = addr + len; -			return addr; -		} -		if (addr + mm->cached_hole_size < vma->vm_start) -			mm->cached_hole_size = vma->vm_start - addr; -		addr = ALIGN(vma->vm_end, huge_page_size(h)); -	} +	info.flags = 0; +	info.length = len; +	info.low_limit = TASK_UNMAPPED_BASE; +	info.high_limit = TASK_SIZE; +	info.align_mask = PAGE_MASK & ~huge_page_mask(h); +	info.align_offset = 0; +	return vm_unmapped_area(&info);  }  static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, @@ -274,92 +247,30 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,  		unsigned long pgoff, unsigned long flags)  {  	struct hstate *h = hstate_file(file); -	struct mm_struct *mm = current->mm; -	struct vm_area_struct *vma, *prev_vma; -	unsigned long base = mm->mmap_base, addr = addr0; -	unsigned long largest_hole = mm->cached_hole_size; -	int first_time = 1; +	struct vm_unmapped_area_info info; +	unsigned long addr; -	/* don't allow allocations above current base */ -	if (mm->free_area_cache > base) -		mm->free_area_cache = base; +	info.flags = VM_UNMAPPED_AREA_TOPDOWN; +	info.length = len; +	info.low_limit = PAGE_SIZE; +	info.high_limit = current->mm->mmap_base; +	info.align_mask = PAGE_MASK & ~huge_page_mask(h); +	info.align_offset = 0; +	addr = vm_unmapped_area(&info); -	if (len <= largest_hole) { -		largest_hole = 0; -		mm->free_area_cache  = base; -	} -try_again: -	/* make sure it can fit in the remaining address space */ -	if (mm->free_area_cache < len) -		goto fail; - -	/* either no address requested or can't fit in requested address hole */ -	addr = (mm->free_area_cache - len) & huge_page_mask(h); -	do { -		/* -		 * Lookup failure means no vma is above this address, -		 * i.e. return with success: -		 */ -		vma = find_vma_prev(mm, addr, &prev_vma); -		if (!vma) { -			return addr; -			break; -		} - -		/* -		 * new region fits between prev_vma->vm_end and -		 * vma->vm_start, use it: -		 */ -		if (addr + len <= vma->vm_start && -			    (!prev_vma || (addr >= prev_vma->vm_end))) { -			/* remember the address as a hint for next time */ -			mm->cached_hole_size = largest_hole; -			mm->free_area_cache = addr; -			return addr; -		} else { -			/* pull free_area_cache down to the first hole */ -			if (mm->free_area_cache == vma->vm_end) { -				mm->free_area_cache = vma->vm_start; -				mm->cached_hole_size = largest_hole; -			} -		} - -		/* remember the largest hole we saw so far */ -		if (addr + largest_hole < vma->vm_start) -			largest_hole = vma->vm_start - addr; - -		/* try just below the current vma->vm_start */ -		addr = (vma->vm_start - len) & huge_page_mask(h); - -	} while (len <= vma->vm_start); - -fail: -	/* -	 * if hint left us with no space for the requested -	 * mapping then try again: -	 */ -	if (first_time) { -		mm->free_area_cache = base; -		largest_hole = 0; -		first_time = 0; -		goto try_again; -	}  	/*  	 * A failed mmap() very likely causes application failure,  	 * so fall back to the bottom-up function here. This scenario  	 * can happen with large stack limits and large mmap()  	 * allocations.  	 */ -	mm->free_area_cache = TASK_UNMAPPED_BASE; -	mm->cached_hole_size = ~0UL; -	addr = hugetlb_get_unmapped_area_bottomup(file, addr0, -			len, pgoff, flags); - -	/* -	 * Restore the topdown base: -	 */ -	mm->free_area_cache = base; -	mm->cached_hole_size = ~0UL; +	if (addr & ~PAGE_MASK) { +		VM_BUG_ON(addr != -ENOMEM); +		info.flags = 0; +		info.low_limit = TASK_UNMAPPED_BASE; +		info.high_limit = TASK_SIZE; +		addr = vm_unmapped_area(&info); +	}  	return addr;  } diff --git a/arch/um/drivers/chan_kern.c b/arch/um/drivers/chan_kern.c index c3bba73e4be..e9a0abc6a32 100644 --- a/arch/um/drivers/chan_kern.c +++ b/arch/um/drivers/chan_kern.c @@ -83,21 +83,8 @@ static const struct chan_ops not_configged_ops = {  static void tty_receive_char(struct tty_struct *tty, char ch)  { -	if (tty == NULL) -		return; - -	if (I_IXON(tty) && !I_IXOFF(tty) && !tty->raw) { -		if (ch == STOP_CHAR(tty)) { -			stop_tty(tty); -			return; -		} -		else if (ch == START_CHAR(tty)) { -			start_tty(tty); -			return; -		} -	} - -	tty_insert_flip_char(tty, ch, TTY_NORMAL); +	if (tty) +		tty_insert_flip_char(tty, ch, TTY_NORMAL);  }  static int open_one_chan(struct chan *chan) diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c index fd9a15b318a..9ffc28bd4b7 100644 --- a/arch/um/drivers/line.c +++ b/arch/um/drivers/line.c @@ -584,6 +584,8 @@ int register_lines(struct line_driver *line_driver,  		printk(KERN_ERR "register_lines : can't register %s driver\n",  		       line_driver->name);  		put_tty_driver(driver); +		for (i = 0; i < nlines; i++) +			tty_port_destroy(&lines[i].port);  		return err;  	} diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index 79ccfe6c707..49e3b49e552 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c @@ -648,7 +648,7 @@ static void stack_proc(void *arg)  	struct task_struct *from = current, *to = arg;  	to->thread.saved_task = from; -	rcu_switch(from, to); +	rcu_user_hooks_switch(from, to);  	switch_to(from, to, from);  } diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild index 0f6e7b32826..b30f34a7988 100644 --- a/arch/um/include/asm/Kbuild +++ b/arch/um/include/asm/Kbuild @@ -2,3 +2,4 @@ generic-y += bug.h cputime.h device.h emergency-restart.h futex.h hardirq.h  generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h  generic-y += ftrace.h pci.h io.h param.h delay.h mutex.h current.h exec.h  generic-y += switch_to.h clkdev.h +generic-y += trace_clock.h diff --git a/arch/um/kernel/exec.c b/arch/um/kernel/exec.c index 3a8ece7d09c..0d7103c9eff 100644 --- a/arch/um/kernel/exec.c +++ b/arch/um/kernel/exec.c @@ -32,13 +32,14 @@ void flush_thread(void)  		       "err = %d\n", ret);  		force_sig(SIGKILL, current);  	} +	get_safe_registers(current_pt_regs()->regs.gp, +			   current_pt_regs()->regs.fp);  	__switch_mm(¤t->mm->context.id);  }  void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp)  { -	get_safe_registers(regs->regs.gp, regs->regs.fp);  	PT_REGS_IP(regs) = eip;  	PT_REGS_SP(regs) = esp;  	current->ptrace &= ~PT_DTRACE; diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index b6d699cdd55..b462b13c5ba 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c @@ -161,8 +161,7 @@ void fork_handler(void)  }  int copy_thread(unsigned long clone_flags, unsigned long sp, -		unsigned long arg, struct task_struct * p, -		struct pt_regs *regs) +		unsigned long arg, struct task_struct * p)  {  	void (*handler)(void);  	int kthread = current->flags & PF_KTHREAD; @@ -171,7 +170,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  	p->thread = (struct thread_struct) INIT_THREAD;  	if (!kthread) { -	  	memcpy(&p->thread.regs.regs, ®s->regs, +	  	memcpy(&p->thread.regs.regs, current_pt_regs(),  		       sizeof(p->thread.regs.regs));  		PT_REGS_SET_SYSCALL_RETURN(&p->thread.regs, 0);  		if (sp != 0) diff --git a/arch/um/kernel/syscall.c b/arch/um/kernel/syscall.c index a81f3705e90..c1d0ae069b5 100644 --- a/arch/um/kernel/syscall.c +++ b/arch/um/kernel/syscall.c @@ -14,29 +14,6 @@  #include <asm/uaccess.h>  #include <asm/unistd.h> -long sys_fork(void) -{ -	return do_fork(SIGCHLD, UPT_SP(¤t->thread.regs.regs), -		      ¤t->thread.regs, 0, NULL, NULL); -} - -long sys_vfork(void) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, -		      UPT_SP(¤t->thread.regs.regs), -		      ¤t->thread.regs, 0, NULL, NULL); -} - -long sys_clone(unsigned long clone_flags, unsigned long newsp, -	       void __user *parent_tid, void __user *child_tid) -{ -	if (!newsp) -		newsp = UPT_SP(¤t->thread.regs.regs); - -	return do_fork(clone_flags, newsp, ¤t->thread.regs, 0, parent_tid, -		      child_tid); -} -  long old_mmap(unsigned long addr, unsigned long len,  	      unsigned long prot, unsigned long flags,  	      unsigned long fd, unsigned long offset) diff --git a/arch/unicore32/include/asm/Kbuild b/arch/unicore32/include/asm/Kbuild index 601e92f18af..89d8b6c4e39 100644 --- a/arch/unicore32/include/asm/Kbuild +++ b/arch/unicore32/include/asm/Kbuild @@ -53,6 +53,7 @@ generic-y += syscalls.h  generic-y += termbits.h  generic-y += termios.h  generic-y += topology.h +generic-y += trace_clock.h  generic-y += types.h  generic-y += ucontext.h  generic-y += unaligned.h diff --git a/arch/unicore32/include/uapi/asm/unistd.h b/arch/unicore32/include/uapi/asm/unistd.h index d18a3be89b3..00cf5e286fc 100644 --- a/arch/unicore32/include/uapi/asm/unistd.h +++ b/arch/unicore32/include/uapi/asm/unistd.h @@ -13,3 +13,4 @@  /* Use the standard ABI for syscalls. */  #include <asm-generic/unistd.h>  #define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_CLONE diff --git a/arch/unicore32/kernel/entry.S b/arch/unicore32/kernel/entry.S index 7049350c790..581630d9144 100644 --- a/arch/unicore32/kernel/entry.S +++ b/arch/unicore32/kernel/entry.S @@ -668,12 +668,6 @@ __cr_alignment:  #endif  	.ltorg -ENTRY(sys_clone) -		add	ip, sp, #S_OFF -		stw	ip, [sp+], #4 -		b	__sys_clone -ENDPROC(sys_clone) -  ENTRY(sys_rt_sigreturn)  		add	r0, sp, #S_OFF  		mov	why, #0		@ prevent syscall restart handling diff --git a/arch/unicore32/kernel/pci.c b/arch/unicore32/kernel/pci.c index b0056f68d32..7c4359240b8 100644 --- a/arch/unicore32/kernel/pci.c +++ b/arch/unicore32/kernel/pci.c @@ -250,9 +250,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)  	printk(KERN_INFO "PCI: bus%d: Fast back to back transfers %sabled\n",  		bus->number, (features & PCI_COMMAND_FAST_BACK) ? "en" : "dis");  } -#ifdef CONFIG_HOTPLUG  EXPORT_SYMBOL(pcibios_fixup_bus); -#endif  static int __init pci_common_init(void)  { diff --git a/arch/unicore32/kernel/process.c b/arch/unicore32/kernel/process.c index a8fe265ce2c..62bad9fed03 100644 --- a/arch/unicore32/kernel/process.c +++ b/arch/unicore32/kernel/process.c @@ -262,26 +262,27 @@ asmlinkage void ret_from_kernel_thread(void) __asm__("ret_from_kernel_thread");  int  copy_thread(unsigned long clone_flags, unsigned long stack_start, -	    unsigned long stk_sz, struct task_struct *p, struct pt_regs *regs) +	    unsigned long stk_sz, struct task_struct *p)  {  	struct thread_info *thread = task_thread_info(p);  	struct pt_regs *childregs = task_pt_regs(p);  	memset(&thread->cpu_context, 0, sizeof(struct cpu_context_save));  	thread->cpu_context.sp = (unsigned long)childregs; -	if (unlikely(!regs)) { +	if (unlikely(p->flags & PF_KTHREAD)) {  		thread->cpu_context.pc = (unsigned long)ret_from_kernel_thread;  		thread->cpu_context.r4 = stack_start;  		thread->cpu_context.r5 = stk_sz;  		memset(childregs, 0, sizeof(struct pt_regs));  	} else {  		thread->cpu_context.pc = (unsigned long)ret_from_fork; -		*childregs = *regs; +		*childregs = *current_pt_regs();  		childregs->UCreg_00 = 0; -		childregs->UCreg_sp = stack_start; +		if (stack_start) +			childregs->UCreg_sp = stack_start;  		if (clone_flags & CLONE_SETTLS) -			childregs->UCreg_16 = regs->UCreg_03; +			childregs->UCreg_16 = childregs->UCreg_03;  	}  	return 0;  } diff --git a/arch/unicore32/kernel/sys.c b/arch/unicore32/kernel/sys.c index 9680134b31f..cfe79c9529b 100644 --- a/arch/unicore32/kernel/sys.c +++ b/arch/unicore32/kernel/sys.c @@ -28,20 +28,6 @@  #include <asm/syscalls.h>  #include <asm/cacheflush.h> -/* Clone a task - this clones the calling program thread. - * This is called indirectly via a small wrapper - */ -asmlinkage long __sys_clone(unsigned long clone_flags, unsigned long newsp, -			 void __user *parent_tid, void __user *child_tid, -			 struct pt_regs *regs) -{ -	if (!newsp) -		newsp = regs->UCreg_sp; - -	return do_fork(clone_flags, newsp, regs, 0, -			parent_tid, child_tid); -} -  /* Note: used by the compat code even in 64-bit Linux. */  SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len,  		unsigned long, prot, unsigned long, flags, diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 46c3bff3ced..9195fd80e11 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -69,8 +69,8 @@ config X86  	select HAVE_PERF_USER_STACK_DUMP  	select HAVE_DEBUG_KMEMLEAK  	select ANON_INODES -	select HAVE_ALIGNED_STRUCT_PAGE if SLUB && !M386 -	select HAVE_CMPXCHG_LOCAL if !M386 +	select HAVE_ALIGNED_STRUCT_PAGE if SLUB +	select HAVE_CMPXCHG_LOCAL  	select HAVE_CMPXCHG_DOUBLE  	select HAVE_ARCH_KMEMCHECK  	select HAVE_USER_RETURN_NOTIFIER @@ -106,12 +106,13 @@ config X86  	select KTIME_SCALAR if X86_32  	select GENERIC_STRNCPY_FROM_USER  	select GENERIC_STRNLEN_USER -	select HAVE_RCU_USER_QS if X86_64 +	select HAVE_CONTEXT_TRACKING if X86_64  	select HAVE_IRQ_TIME_ACCOUNTING  	select GENERIC_KERNEL_THREAD  	select GENERIC_KERNEL_EXECVE  	select MODULES_USE_ELF_REL if X86_32  	select MODULES_USE_ELF_RELA if X86_64 +	select CLONE_BACKWARDS if X86_32  config INSTRUCTION_DECODER  	def_bool y @@ -171,13 +172,8 @@ config ARCH_MAY_HAVE_PC_FDC  	def_bool y  	depends on ISA_DMA_API -config RWSEM_GENERIC_SPINLOCK -	def_bool y -	depends on !X86_XADD -  config RWSEM_XCHGADD_ALGORITHM  	def_bool y -	depends on X86_XADD  config GENERIC_CALIBRATE_DELAY  	def_bool y @@ -310,7 +306,7 @@ config X86_X2APIC  	  If you don't know what to do here, say N.  config X86_MPPARSE -	bool "Enable MPS table" if ACPI +	bool "Enable MPS table" if ACPI || SFI  	default y  	depends on X86_LOCAL_APIC  	---help--- @@ -1100,7 +1096,7 @@ config HIGHMEM4G  config HIGHMEM64G  	bool "64GB" -	depends on !M386 && !M486 +	depends on !M486  	select X86_PAE  	---help---  	  Select this if you have a 32-bit processor and more than 4 @@ -1698,6 +1694,50 @@ config HOTPLUG_CPU  	    automatically on SMP systems. )  	  Say N if you want to disable CPU hotplug. +config BOOTPARAM_HOTPLUG_CPU0 +	bool "Set default setting of cpu0_hotpluggable" +	default n +	depends on HOTPLUG_CPU && EXPERIMENTAL +	---help--- +	  Set whether default state of cpu0_hotpluggable is on or off. + +	  Say Y here to enable CPU0 hotplug by default. If this switch +	  is turned on, there is no need to give cpu0_hotplug kernel +	  parameter and the CPU0 hotplug feature is enabled by default. + +	  Please note: there are two known CPU0 dependencies if you want +	  to enable the CPU0 hotplug feature either by this switch or by +	  cpu0_hotplug kernel parameter. + +	  First, resume from hibernate or suspend always starts from CPU0. +	  So hibernate and suspend are prevented if CPU0 is offline. + +	  Second dependency is PIC interrupts always go to CPU0. CPU0 can not +	  offline if any interrupt can not migrate out of CPU0. There may +	  be other CPU0 dependencies. + +	  Please make sure the dependencies are under your control before +	  you enable this feature. + +	  Say N if you don't want to enable CPU0 hotplug feature by default. +	  You still can enable the CPU0 hotplug feature at boot by kernel +	  parameter cpu0_hotplug. + +config DEBUG_HOTPLUG_CPU0 +	def_bool n +	prompt "Debug CPU0 hotplug" +	depends on HOTPLUG_CPU && EXPERIMENTAL +	---help--- +	  Enabling this option offlines CPU0 (if CPU0 can be offlined) as +	  soon as possible and boots up userspace with CPU0 offlined. User +	  can online CPU0 back after boot time. + +	  To debug CPU0 hotplug, you need to enable CPU0 offline/online +	  feature by either turning on CONFIG_BOOTPARAM_HOTPLUG_CPU0 during +	  compilation or giving cpu0_hotplug kernel parameter at boot. + +	  If unsure, say N. +  config COMPAT_VDSO  	def_bool y  	prompt "Compat VDSO support" diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu index f3b86d0df44..c026cca5602 100644 --- a/arch/x86/Kconfig.cpu +++ b/arch/x86/Kconfig.cpu @@ -4,23 +4,24 @@ choice  	default M686 if X86_32  	default GENERIC_CPU if X86_64 -config M386 -	bool "386" -	depends on X86_32 && !UML +config M486 +	bool "486" +	depends on X86_32  	---help--- -	  This is the processor type of your CPU. This information is used for -	  optimizing purposes. In order to compile a kernel that can run on -	  all x86 CPU types (albeit not optimally fast), you can specify -	  "386" here. +	  This is the processor type of your CPU. This information is +	  used for optimizing purposes. In order to compile a kernel +	  that can run on all supported x86 CPU types (albeit not +	  optimally fast), you can specify "486" here. + +	  Note that the 386 is no longer supported, this includes +	  AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI 486DLC/DLC2, +	  UMC 486SX-S and the NexGen Nx586.  	  The kernel will not necessarily run on earlier architectures than  	  the one you have chosen, e.g. a Pentium optimized kernel will run on  	  a PPro, but not necessarily on a i486.  	  Here are the settings recommended for greatest speed: -	  - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI -	  486DLC/DLC2, and UMC 486SX-S.  Only "386" kernels will run on a 386 -	  class machine.  	  - "486" for the AMD/Cyrix/IBM/Intel 486DX/DX2/DX4 or  	  SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or U5S.  	  - "586" for generic Pentium CPUs lacking the TSC @@ -43,16 +44,7 @@ config M386  	  - "VIA C3-2" for VIA C3-2 "Nehemiah" (model 9 and above).  	  - "VIA C7" for VIA C7. -	  If you don't know what to do, choose "386". - -config M486 -	bool "486" -	depends on X86_32 -	---help--- -	  Select this for a 486 series processor, either Intel or one of the -	  compatible processors from AMD, Cyrix, IBM, or Intel.  Includes DX, -	  DX2, and DX4 variants; also SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or -	  U5S. +	  If you don't know what to do, choose "486".  config M586  	bool "586/K5/5x86/6x86/6x86MX" @@ -305,24 +297,16 @@ config X86_INTERNODE_CACHE_SHIFT  	default "12" if X86_VSMP  	default X86_L1_CACHE_SHIFT -config X86_CMPXCHG -	def_bool y -	depends on X86_64 || (X86_32 && !M386) -  config X86_L1_CACHE_SHIFT  	int  	default "7" if MPENTIUM4 || MPSC  	default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU -	default "4" if MELAN || M486 || M386 || MGEODEGX1 +	default "4" if MELAN || M486 || MGEODEGX1  	default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX -config X86_XADD -	def_bool y -	depends on !M386 -  config X86_PPRO_FENCE  	bool "PentiumPro memory ordering errata workaround" -	depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODEGX1 +	depends on M686 || M586MMX || M586TSC || M586 || M486 || MGEODEGX1  	---help---  	  Old PentiumPro multiprocessor systems had errata that could cause  	  memory operations to violate the x86 ordering standard in rare cases. @@ -335,27 +319,11 @@ config X86_PPRO_FENCE  config X86_F00F_BUG  	def_bool y -	depends on M586MMX || M586TSC || M586 || M486 || M386 +	depends on M586MMX || M586TSC || M586 || M486  config X86_INVD_BUG  	def_bool y -	depends on M486 || M386 - -config X86_WP_WORKS_OK -	def_bool y -	depends on !M386 - -config X86_INVLPG -	def_bool y -	depends on X86_32 && !M386 - -config X86_BSWAP -	def_bool y -	depends on X86_32 && !M386 - -config X86_POPAD_OK -	def_bool y -	depends on X86_32 && !M386 +	depends on M486  config X86_ALIGNMENT_16  	def_bool y @@ -412,12 +380,11 @@ config X86_MINIMUM_CPU_FAMILY  	default "64" if X86_64  	default "6" if X86_32 && X86_P6_NOP  	default "5" if X86_32 && X86_CMPXCHG64 -	default "4" if X86_32 && (X86_XADD || X86_CMPXCHG || X86_BSWAP || X86_WP_WORKS_OK) -	default "3" +	default "4"  config X86_DEBUGCTLMSR  	def_bool y -	depends on !(MK6 || MWINCHIPC6 || MWINCHIP3D || MCYRIXIII || M586MMX || M586TSC || M586 || M486 || M386) && !UML +	depends on !(MK6 || MWINCHIPC6 || MWINCHIP3D || MCYRIXIII || M586MMX || M586TSC || M586 || M486) && !UML  menuconfig PROCESSOR_SELECT  	bool "Supported processor vendors" if EXPERT @@ -441,7 +408,7 @@ config CPU_SUP_INTEL  config CPU_SUP_CYRIX_32  	default y  	bool "Support Cyrix processors" if PROCESSOR_SELECT -	depends on M386 || M486 || M586 || M586TSC || M586MMX || (EXPERT && !64BIT) +	depends on M486 || M586 || M586TSC || M586MMX || (EXPERT && !64BIT)  	---help---  	  This enables detection, tunings and quirks for Cyrix processors @@ -495,7 +462,7 @@ config CPU_SUP_TRANSMETA_32  config CPU_SUP_UMC_32  	default y  	bool "Support UMC processors" if PROCESSOR_SELECT -	depends on M386 || M486 || (EXPERT && !64BIT) +	depends on M486 || (EXPERT && !64BIT)  	---help---  	  This enables detection, tunings and quirks for UMC processors diff --git a/arch/x86/Makefile_32.cpu b/arch/x86/Makefile_32.cpu index 86cee7b749e..6647ed49c66 100644 --- a/arch/x86/Makefile_32.cpu +++ b/arch/x86/Makefile_32.cpu @@ -10,7 +10,6 @@ tune		= $(call cc-option,-mcpu=$(1),$(2))  endif  align := $(cc-option-align) -cflags-$(CONFIG_M386)		+= -march=i386  cflags-$(CONFIG_M486)		+= -march=i486  cflags-$(CONFIG_M586)		+= -march=i586  cflags-$(CONFIG_M586TSC)	+= -march=i586 diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index 07b3a68d2d2..a703af19c28 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c @@ -35,7 +35,7 @@  #undef WARN_OLD  #undef CORE_DUMP /* definitely broken */ -static int load_aout_binary(struct linux_binprm *, struct pt_regs *regs); +static int load_aout_binary(struct linux_binprm *);  static int load_aout_library(struct file *);  #ifdef CORE_DUMP @@ -260,9 +260,10 @@ static u32 __user *create_aout_tables(char __user *p, struct linux_binprm *bprm)   * These are the functions used to load a.out style executables and shared   * libraries.  There is no binary dependent code anywhere else.   */ -static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) +static int load_aout_binary(struct linux_binprm *bprm)  {  	unsigned long error, fd_offset, rlim; +	struct pt_regs *regs = current_pt_regs();  	struct exec ex;  	int retval; diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 076745fc804..32e6f05ddaa 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S @@ -467,11 +467,16 @@ GLOBAL(\label)  	PTREGSCALL stub32_sigaltstack, sys32_sigaltstack, %rdx  	PTREGSCALL stub32_execve, compat_sys_execve, %rcx  	PTREGSCALL stub32_fork, sys_fork, %rdi -	PTREGSCALL stub32_clone, sys32_clone, %rdx  	PTREGSCALL stub32_vfork, sys_vfork, %rdi  	PTREGSCALL stub32_iopl, sys_iopl, %rsi  	ALIGN +GLOBAL(stub32_clone) +	leaq sys_clone(%rip),%rax +	mov	%r8, %rcx +	jmp  ia32_ptregs_common	 + +	ALIGN  ia32_ptregs_common:  	popq %r11  	CFI_ENDPROC diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c index 86d68d1c880..d0b689ba7be 100644 --- a/arch/x86/ia32/sys_ia32.c +++ b/arch/x86/ia32/sys_ia32.c @@ -385,17 +385,6 @@ asmlinkage long sys32_sendfile(int out_fd, int in_fd,  	return ret;  } -asmlinkage long sys32_clone(unsigned int clone_flags, unsigned int newsp, -			    struct pt_regs *regs) -{ -	void __user *parent_tid = (void __user *)regs->dx; -	void __user *child_tid = (void __user *)regs->di; - -	if (!newsp) -		newsp = regs->sp; -	return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); -} -  /*   * Some system calls that need sign extended arguments. This could be   * done by a generic wrapper. diff --git a/arch/x86/include/asm/Kbuild b/arch/x86/include/asm/Kbuild index 66e5f0ef052..79fd8a3418f 100644 --- a/arch/x86/include/asm/Kbuild +++ b/arch/x86/include/asm/Kbuild @@ -12,6 +12,7 @@ header-y += mce.h  header-y += msr-index.h  header-y += msr.h  header-y += mtrr.h +header-y += perf_regs.h  header-y += posix_types_32.h  header-y += posix_types_64.h  header-y += posix_types_x32.h @@ -19,8 +20,10 @@ header-y += prctl.h  header-y += processor-flags.h  header-y += ptrace-abi.h  header-y += sigcontext32.h +header-y += svm.h  header-y += ucontext.h  header-y += vm86.h +header-y += vmx.h  header-y += vsyscall.h  genhdr-y += unistd_32.h diff --git a/arch/x86/include/asm/atomic.h b/arch/x86/include/asm/atomic.h index b6c3b821acf..722aa3b0462 100644 --- a/arch/x86/include/asm/atomic.h +++ b/arch/x86/include/asm/atomic.h @@ -172,23 +172,7 @@ static inline int atomic_add_negative(int i, atomic_t *v)   */  static inline int atomic_add_return(int i, atomic_t *v)  { -#ifdef CONFIG_M386 -	int __i; -	unsigned long flags; -	if (unlikely(boot_cpu_data.x86 <= 3)) -		goto no_xadd; -#endif -	/* Modern 486+ processor */  	return i + xadd(&v->counter, i); - -#ifdef CONFIG_M386 -no_xadd: /* Legacy 386 processor */ -	raw_local_irq_save(flags); -	__i = atomic_read(v); -	atomic_set(v, i + __i); -	raw_local_irq_restore(flags); -	return i + __i; -#endif  }  /** diff --git a/arch/x86/include/asm/cmpxchg_32.h b/arch/x86/include/asm/cmpxchg_32.h index 53f4b219336..f8bf2eecab8 100644 --- a/arch/x86/include/asm/cmpxchg_32.h +++ b/arch/x86/include/asm/cmpxchg_32.h @@ -34,9 +34,7 @@ static inline void set_64bit(volatile u64 *ptr, u64 value)  		     : "memory");  } -#ifdef CONFIG_X86_CMPXCHG  #define __HAVE_ARCH_CMPXCHG 1 -#endif  #ifdef CONFIG_X86_CMPXCHG64  #define cmpxchg64(ptr, o, n)						\ @@ -73,59 +71,6 @@ static inline u64 __cmpxchg64_local(volatile u64 *ptr, u64 old, u64 new)  	return prev;  } -#ifndef CONFIG_X86_CMPXCHG -/* - * Building a kernel capable running on 80386. It may be necessary to - * simulate the cmpxchg on the 80386 CPU. For that purpose we define - * a function for each of the sizes we support. - */ - -extern unsigned long cmpxchg_386_u8(volatile void *, u8, u8); -extern unsigned long cmpxchg_386_u16(volatile void *, u16, u16); -extern unsigned long cmpxchg_386_u32(volatile void *, u32, u32); - -static inline unsigned long cmpxchg_386(volatile void *ptr, unsigned long old, -					unsigned long new, int size) -{ -	switch (size) { -	case 1: -		return cmpxchg_386_u8(ptr, old, new); -	case 2: -		return cmpxchg_386_u16(ptr, old, new); -	case 4: -		return cmpxchg_386_u32(ptr, old, new); -	} -	return old; -} - -#define cmpxchg(ptr, o, n)						\ -({									\ -	__typeof__(*(ptr)) __ret;					\ -	if (likely(boot_cpu_data.x86 > 3))				\ -		__ret = (__typeof__(*(ptr)))__cmpxchg((ptr),		\ -				(unsigned long)(o), (unsigned long)(n),	\ -				sizeof(*(ptr)));			\ -	else								\ -		__ret = (__typeof__(*(ptr)))cmpxchg_386((ptr),		\ -				(unsigned long)(o), (unsigned long)(n),	\ -				sizeof(*(ptr)));			\ -	__ret;								\ -}) -#define cmpxchg_local(ptr, o, n)					\ -({									\ -	__typeof__(*(ptr)) __ret;					\ -	if (likely(boot_cpu_data.x86 > 3))				\ -		__ret = (__typeof__(*(ptr)))__cmpxchg_local((ptr),	\ -				(unsigned long)(o), (unsigned long)(n),	\ -				sizeof(*(ptr)));			\ -	else								\ -		__ret = (__typeof__(*(ptr)))cmpxchg_386((ptr),		\ -				(unsigned long)(o), (unsigned long)(n),	\ -				sizeof(*(ptr)));			\ -	__ret;								\ -}) -#endif -  #ifndef CONFIG_X86_CMPXCHG64  /*   * Building a kernel capable running on 80386 and 80486. It may be necessary diff --git a/arch/x86/include/asm/rcu.h b/arch/x86/include/asm/context_tracking.h index d1ac07a2397..1616562683e 100644 --- a/arch/x86/include/asm/rcu.h +++ b/arch/x86/include/asm/context_tracking.h @@ -1,27 +1,26 @@ -#ifndef _ASM_X86_RCU_H -#define _ASM_X86_RCU_H +#ifndef _ASM_X86_CONTEXT_TRACKING_H +#define _ASM_X86_CONTEXT_TRACKING_H  #ifndef __ASSEMBLY__ - -#include <linux/rcupdate.h> +#include <linux/context_tracking.h>  #include <asm/ptrace.h>  static inline void exception_enter(struct pt_regs *regs)  { -	rcu_user_exit(); +	user_exit();  }  static inline void exception_exit(struct pt_regs *regs)  { -#ifdef CONFIG_RCU_USER_QS +#ifdef CONFIG_CONTEXT_TRACKING  	if (user_mode(regs)) -		rcu_user_enter(); +		user_enter();  #endif  }  #else /* __ASSEMBLY__ */ -#ifdef CONFIG_RCU_USER_QS +#ifdef CONFIG_CONTEXT_TRACKING  # define SCHEDULE_USER call schedule_user  #else  # define SCHEDULE_USER call schedule diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h index 4564c8e28a3..5f9a1243190 100644 --- a/arch/x86/include/asm/cpu.h +++ b/arch/x86/include/asm/cpu.h @@ -28,6 +28,10 @@ struct x86_cpu {  #ifdef CONFIG_HOTPLUG_CPU  extern int arch_register_cpu(int num);  extern void arch_unregister_cpu(int); +extern void __cpuinit start_cpu0(void); +#ifdef CONFIG_DEBUG_HOTPLUG_CPU0 +extern int _debug_hotplug_cpu(int cpu, int action); +#endif  #endif  DECLARE_PER_CPU(int, cpu_state); diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 8c297aa53ee..da40b1e2228 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h @@ -311,12 +311,7 @@ extern const char * const x86_power_flags[32];  #define cpu_has_cx8		boot_cpu_has(X86_FEATURE_CX8)  #define cpu_has_cx16		boot_cpu_has(X86_FEATURE_CX16)  #define cpu_has_eager_fpu	boot_cpu_has(X86_FEATURE_EAGER_FPU) - -#if defined(CONFIG_X86_INVLPG) || defined(CONFIG_X86_64) -# define cpu_has_invlpg		1 -#else -# define cpu_has_invlpg		(boot_cpu_data.x86 > 3) -#endif +#define cpu_has_topoext		boot_cpu_has(X86_FEATURE_TOPOEXT)  #ifdef CONFIG_X86_64 diff --git a/arch/x86/include/asm/device.h b/arch/x86/include/asm/device.h index 93e1c55f14a..03dd72957d2 100644 --- a/arch/x86/include/asm/device.h +++ b/arch/x86/include/asm/device.h @@ -2,9 +2,6 @@  #define _ASM_X86_DEVICE_H  struct dev_archdata { -#ifdef CONFIG_ACPI -	void	*acpi_handle; -#endif  #ifdef CONFIG_X86_DEV_DMA_OPS  	struct dma_map_ops *dma_ops;  #endif diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index 5939f44fe0c..9c999c1674f 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h @@ -354,12 +354,10 @@ static inline int mmap_is_ia32(void)  	return 0;  } -/* The first two values are special, do not change. See align_addr() */ +/* Do not change the values. See get_align_mask() */  enum align_flags {  	ALIGN_VA_32	= BIT(0),  	ALIGN_VA_64	= BIT(1), -	ALIGN_VDSO	= BIT(2), -	ALIGN_TOPDOWN	= BIT(3),  };  struct va_alignment { @@ -368,5 +366,5 @@ struct va_alignment {  } ____cacheline_aligned;  extern struct va_alignment va_align; -extern unsigned long align_addr(unsigned long, struct file *, enum align_flags); +extern unsigned long align_vdso_addr(unsigned long);  #endif /* _ASM_X86_ELF_H */ diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h index 831dbb9c6c0..41ab26ea656 100644 --- a/arch/x86/include/asm/fpu-internal.h +++ b/arch/x86/include/asm/fpu-internal.h @@ -399,14 +399,17 @@ static inline void drop_init_fpu(struct task_struct *tsk)  typedef struct { int preload; } fpu_switch_t;  /* - * FIXME! We could do a totally lazy restore, but we need to - * add a per-cpu "this was the task that last touched the FPU - * on this CPU" variable, and the task needs to have a "I last - * touched the FPU on this CPU" and check them. + * Must be run with preemption disabled: this clears the fpu_owner_task, + * on this CPU.   * - * We don't do that yet, so "fpu_lazy_restore()" always returns - * false, but some day.. + * This will disable any lazy FPU state restore of the current FPU state, + * but if the current thread owns the FPU, it will still be saved by.   */ +static inline void __cpu_disable_lazy_restore(unsigned int cpu) +{ +	per_cpu(fpu_owner_task, cpu) = NULL; +} +  static inline int fpu_lazy_restore(struct task_struct *new, unsigned int cpu)  {  	return new == this_cpu_read_stable(fpu_owner_task) && diff --git a/arch/x86/include/asm/futex.h b/arch/x86/include/asm/futex.h index f373046e63e..be27ba1e947 100644 --- a/arch/x86/include/asm/futex.h +++ b/arch/x86/include/asm/futex.h @@ -55,12 +55,6 @@ static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr)  	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))  		return -EFAULT; -#if defined(CONFIG_X86_32) && !defined(CONFIG_X86_BSWAP) -	/* Real i386 machines can only support FUTEX_OP_SET */ -	if (op != FUTEX_OP_SET && boot_cpu_data.x86 == 3) -		return -ENOSYS; -#endif -  	pagefault_disable();  	switch (op) { @@ -118,12 +112,6 @@ static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,  {  	int ret = 0; -#if defined(CONFIG_X86_32) && !defined(CONFIG_X86_BSWAP) -	/* Real i386 machines have no cmpxchg instruction */ -	if (boot_cpu_data.x86 == 3) -		return -ENOSYS; -#endif -  	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))  		return -EFAULT; diff --git a/arch/x86/include/asm/local.h b/arch/x86/include/asm/local.h index c8bed0da434..2d89e3980cb 100644 --- a/arch/x86/include/asm/local.h +++ b/arch/x86/include/asm/local.h @@ -124,27 +124,11 @@ static inline int local_add_negative(long i, local_t *l)   */  static inline long local_add_return(long i, local_t *l)  { -	long __i; -#ifdef CONFIG_M386 -	unsigned long flags; -	if (unlikely(boot_cpu_data.x86 <= 3)) -		goto no_xadd; -#endif -	/* Modern 486+ processor */ -	__i = i; +	long __i = i;  	asm volatile(_ASM_XADD "%0, %1;"  		     : "+r" (i), "+m" (l->a.counter)  		     : : "memory");  	return i + __i; - -#ifdef CONFIG_M386 -no_xadd: /* Legacy 386 processor */ -	local_irq_save(flags); -	__i = local_read(l); -	local_set(l, i + __i); -	local_irq_restore(flags); -	return i + __i; -#endif  }  static inline long local_sub_return(long i, local_t *l) diff --git a/arch/x86/include/asm/mman.h b/arch/x86/include/asm/mman.h index 593e51d4643..513b05f15bb 100644 --- a/arch/x86/include/asm/mman.h +++ b/arch/x86/include/asm/mman.h @@ -3,6 +3,9 @@  #define MAP_32BIT	0x40		/* only give out 32bit addresses */ +#define MAP_HUGE_2MB    (21 << MAP_HUGE_SHIFT) +#define MAP_HUGE_1GB    (30 << MAP_HUGE_SHIFT) +  #include <asm-generic/mman.h>  #endif /* _ASM_X86_MMAN_H */ diff --git a/arch/x86/include/asm/module.h b/arch/x86/include/asm/module.h index 9eae7752ae9..e3b7819caee 100644 --- a/arch/x86/include/asm/module.h +++ b/arch/x86/include/asm/module.h @@ -5,8 +5,6 @@  #ifdef CONFIG_X86_64  /* X86_64 does not define MODULE_PROC_FAMILY */ -#elif defined CONFIG_M386 -#define MODULE_PROC_FAMILY "386 "  #elif defined CONFIG_M486  #define MODULE_PROC_FAMILY "486 "  #elif defined CONFIG_M586 diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 7f0edceb756..e400cdb2dd6 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h @@ -337,6 +337,8 @@  #define MSR_IA32_MISC_ENABLE_TURBO_DISABLE	(1ULL << 38)  #define MSR_IA32_MISC_ENABLE_IP_PREF_DISABLE	(1ULL << 39) +#define MSR_IA32_TSC_DEADLINE		0x000006E0 +  /* P4/Xeon+ specific */  #define MSR_IA32_MCG_EAX		0x00000180  #define MSR_IA32_MCG_EBX		0x00000181 diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index 1104afaba52..0da5200ee79 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h @@ -406,7 +406,6 @@ do {									\  #define this_cpu_xchg_2(pcp, nval)	percpu_xchg_op(pcp, nval)  #define this_cpu_xchg_4(pcp, nval)	percpu_xchg_op(pcp, nval) -#ifndef CONFIG_M386  #define __this_cpu_add_return_1(pcp, val) percpu_add_return_op(pcp, val)  #define __this_cpu_add_return_2(pcp, val) percpu_add_return_op(pcp, val)  #define __this_cpu_add_return_4(pcp, val) percpu_add_return_op(pcp, val) @@ -421,8 +420,6 @@ do {									\  #define this_cpu_cmpxchg_2(pcp, oval, nval)	percpu_cmpxchg_op(pcp, oval, nval)  #define this_cpu_cmpxchg_4(pcp, oval, nval)	percpu_cmpxchg_op(pcp, oval, nval) -#endif /* !CONFIG_M386 */ -  #ifdef CONFIG_X86_CMPXCHG64  #define percpu_cmpxchg8b_double(pcp1, pcp2, o1, o2, n1, n2)		\  ({									\ diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index ad1fc851167..888184b2fc8 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -178,8 +178,6 @@ static inline int hlt_works(int cpu)  extern void cpu_detect(struct cpuinfo_x86 *c); -extern struct pt_regs *idle_regs(struct pt_regs *); -  extern void early_cpu_init(void);  extern void identify_boot_cpu(void);  extern void identify_secondary_cpu(struct cpuinfo_x86 *); @@ -187,7 +185,7 @@ extern void print_cpu_info(struct cpuinfo_x86 *);  void print_cpu_msr(struct cpuinfo_x86 *);  extern void init_scattered_cpuid_features(struct cpuinfo_x86 *c);  extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c); -extern unsigned short num_cache_leaves; +extern void init_amd_cacheinfo(struct cpuinfo_x86 *c);  extern void detect_extended_topology(struct cpuinfo_x86 *c);  extern void detect_ht(struct cpuinfo_x86 *c); @@ -672,18 +670,29 @@ static inline void sync_core(void)  {  	int tmp; -#if defined(CONFIG_M386) || defined(CONFIG_M486) -	if (boot_cpu_data.x86 < 5) -		/* There is no speculative execution. -		 * jmp is a barrier to prefetching. */ -		asm volatile("jmp 1f\n1:\n" ::: "memory"); -	else +#ifdef CONFIG_M486 +	/* +	 * Do a CPUID if available, otherwise do a jump.  The jump +	 * can conveniently enough be the jump around CPUID. +	 */ +	asm volatile("cmpl %2,%1\n\t" +		     "jl 1f\n\t" +		     "cpuid\n" +		     "1:" +		     : "=a" (tmp) +		     : "rm" (boot_cpu_data.cpuid_level), "ri" (0), "0" (1) +		     : "ebx", "ecx", "edx", "memory"); +#else +	/* +	 * CPUID is a barrier to speculative execution. +	 * Prefetched instructions are automatically +	 * invalidated when modified. +	 */ +	asm volatile("cpuid" +		     : "=a" (tmp) +		     : "0" (1) +		     : "ebx", "ecx", "edx", "memory");  #endif -		/* cpuid is a barrier to speculative execution. -		 * Prefetched instructions are automatically -		 * invalidated when modified. */ -		asm volatile("cpuid" : "=a" (tmp) : "0" (1) -			     : "ebx", "ecx", "edx", "memory");  }  static inline void __monitor(const void *eax, unsigned long ecx, diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index 19f16ebaf4f..54d80fddb73 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h @@ -239,6 +239,15 @@ static inline unsigned long regs_get_register(struct pt_regs *regs,  {  	if (unlikely(offset > MAX_REG_OFFSET))  		return 0; +#ifdef CONFIG_X86_32 +	/* +	 * Traps from the kernel do not save sp and ss. +	 * Use the helper function to retrieve sp. +	 */ +	if (offset == offsetof(struct pt_regs, sp) && +	    regs->cs == __KERNEL_CS) +		return kernel_stack_pointer(regs); +#endif  	return *(unsigned long *)((unsigned long)regs + offset);  } diff --git a/arch/x86/include/asm/signal.h b/arch/x86/include/asm/signal.h index 323973f4abf..0dba8b7a6ac 100644 --- a/arch/x86/include/asm/signal.h +++ b/arch/x86/include/asm/signal.h @@ -260,8 +260,6 @@ struct pt_regs;  #endif /* !__i386__ */ -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -  #endif /* __KERNEL__ */  #endif /* __ASSEMBLY__ */ diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h index 4f19a152603..b073aaea747 100644 --- a/arch/x86/include/asm/smp.h +++ b/arch/x86/include/asm/smp.h @@ -166,6 +166,7 @@ void native_send_call_func_ipi(const struct cpumask *mask);  void native_send_call_func_single_ipi(int cpu);  void x86_idle_thread_init(unsigned int cpu, struct task_struct *idle); +void smp_store_boot_cpu_info(void);  void smp_store_cpu_info(int id);  #define cpu_physical_id(cpu)	per_cpu(x86_cpu_to_apicid, cpu) diff --git a/arch/x86/include/asm/swab.h b/arch/x86/include/asm/swab.h index 557cd9f0066..7f235c7105c 100644 --- a/arch/x86/include/asm/swab.h +++ b/arch/x86/include/asm/swab.h @@ -6,22 +6,7 @@  static inline __attribute_const__ __u32 __arch_swab32(__u32 val)  { -#ifdef __i386__ -# ifdef CONFIG_X86_BSWAP -	asm("bswap %0" : "=r" (val) : "0" (val)); -# else -	asm("xchgb %b0,%h0\n\t"	/* swap lower bytes	*/ -	    "rorl $16,%0\n\t"	/* swap words		*/ -	    "xchgb %b0,%h0"	/* swap higher bytes	*/ -	    : "=q" (val) -	    : "0" (val)); -# endif - -#else /* __i386__ */ -	asm("bswapl %0" -	    : "=r" (val) -	    : "0" (val)); -#endif +	asm("bswapl %0" : "=r" (val) : "0" (val));  	return val;  }  #define __arch_swab32 __arch_swab32 @@ -37,22 +22,12 @@ static inline __attribute_const__ __u64 __arch_swab64(__u64 val)  		__u64 u;  	} v;  	v.u = val; -# ifdef CONFIG_X86_BSWAP  	asm("bswapl %0 ; bswapl %1 ; xchgl %0,%1"  	    : "=r" (v.s.a), "=r" (v.s.b)  	    : "0" (v.s.a), "1" (v.s.b)); -# else -	v.s.a = __arch_swab32(v.s.a); -	v.s.b = __arch_swab32(v.s.b); -	asm("xchgl %0,%1" -	    : "=r" (v.s.a), "=r" (v.s.b) -	    : "0" (v.s.a), "1" (v.s.b)); -# endif  	return v.u;  #else /* __i386__ */ -	asm("bswapq %0" -	    : "=r" (val) -	    : "0" (val)); +	asm("bswapq %0" : "=r" (val) : "0" (val));  	return val;  #endif  } diff --git a/arch/x86/include/asm/sys_ia32.h b/arch/x86/include/asm/sys_ia32.h index a9a8cf3da49..c76fae4d90b 100644 --- a/arch/x86/include/asm/sys_ia32.h +++ b/arch/x86/include/asm/sys_ia32.h @@ -54,8 +54,6 @@ asmlinkage long sys32_pwrite(unsigned int, const char __user *, u32, u32, u32);  asmlinkage long sys32_personality(unsigned long);  asmlinkage long sys32_sendfile(int, int, compat_off_t __user *, s32); -asmlinkage long sys32_clone(unsigned int, unsigned int, struct pt_regs *); -  long sys32_lseek(unsigned int, int, unsigned int);  long sys32_kill(int, int);  long sys32_fadvise64_64(int, __u32, __u32, __u32, __u32, int); diff --git a/arch/x86/include/asm/syscalls.h b/arch/x86/include/asm/syscalls.h index 2be0b880417..2f8374718aa 100644 --- a/arch/x86/include/asm/syscalls.h +++ b/arch/x86/include/asm/syscalls.h @@ -20,15 +20,6 @@  asmlinkage long sys_ioperm(unsigned long, unsigned long, int);  long sys_iopl(unsigned int, struct pt_regs *); -/* kernel/process.c */ -int sys_fork(struct pt_regs *); -int sys_vfork(struct pt_regs *); -long sys_execve(const char __user *, -		const char __user *const __user *, -		const char __user *const __user *); -long sys_clone(unsigned long, unsigned long, void __user *, -	       void __user *, struct pt_regs *); -  /* kernel/ldt.c */  asmlinkage int sys_modify_ldt(int, void __user *, unsigned long); diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index 74a44333545..0fee48e279c 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h @@ -56,10 +56,7 @@ static inline void __flush_tlb_all(void)  static inline void __flush_tlb_one(unsigned long addr)  { -	if (cpu_has_invlpg)  		__flush_tlb_single(addr); -	else -		__flush_tlb();  }  #define TLB_FLUSH_ALL	-1UL diff --git a/arch/x86/include/asm/trace_clock.h b/arch/x86/include/asm/trace_clock.h new file mode 100644 index 00000000000..beab86cc282 --- /dev/null +++ b/arch/x86/include/asm/trace_clock.h @@ -0,0 +1,20 @@ +#ifndef _ASM_X86_TRACE_CLOCK_H +#define _ASM_X86_TRACE_CLOCK_H + +#include <linux/compiler.h> +#include <linux/types.h> + +#ifdef CONFIG_X86_TSC + +extern u64 notrace trace_clock_x86_tsc(void); + +# define ARCH_TRACE_CLOCKS \ +	{ trace_clock_x86_tsc,	"x86-tsc",	.in_ns = 0 }, + +#else /* !CONFIG_X86_TSC */ + +#define ARCH_TRACE_CLOCKS + +#endif + +#endif  /* _ASM_X86_TRACE_CLOCK_H */ diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h index 7ccf8d13153..1709801d18e 100644 --- a/arch/x86/include/asm/uaccess.h +++ b/arch/x86/include/asm/uaccess.h @@ -237,8 +237,6 @@ extern void __put_user_2(void);  extern void __put_user_4(void);  extern void __put_user_8(void); -#ifdef CONFIG_X86_WP_WORKS_OK -  /**   * put_user: - Write a simple value into user space.   * @x:   Value to copy to user space. @@ -326,29 +324,6 @@ do {									\  	}								\  } while (0) -#else - -#define __put_user_size(x, ptr, size, retval, errret)			\ -do {									\ -	__typeof__(*(ptr))__pus_tmp = x;				\ -	retval = 0;							\ -									\ -	if (unlikely(__copy_to_user_ll(ptr, &__pus_tmp, size) != 0))	\ -		retval = errret;					\ -} while (0) - -#define put_user(x, ptr)					\ -({								\ -	int __ret_pu;						\ -	__typeof__(*(ptr))__pus_tmp = x;			\ -	__ret_pu = 0;						\ -	if (unlikely(__copy_to_user_ll(ptr, &__pus_tmp,		\ -				       sizeof(*(ptr))) != 0))	\ -		__ret_pu = -EFAULT;				\ -	__ret_pu;						\ -}) -#endif -  #ifdef CONFIG_X86_32  #define __get_user_asm_u64(x, ptr, retval, errret)	(x) = __get_user_bad()  #define __get_user_asm_ex_u64(x, ptr)			(x) = __get_user_bad() @@ -543,29 +518,12 @@ struct __large_struct { unsigned long buf[100]; };  	(x) = (__force __typeof__(*(ptr)))__gue_val;			\  } while (0) -#ifdef CONFIG_X86_WP_WORKS_OK -  #define put_user_try		uaccess_try  #define put_user_catch(err)	uaccess_catch(err)  #define put_user_ex(x, ptr)						\  	__put_user_size_ex((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) -#else /* !CONFIG_X86_WP_WORKS_OK */ - -#define put_user_try		do {		\ -	int __uaccess_err = 0; - -#define put_user_catch(err)			\ -	(err) |= __uaccess_err;			\ -} while (0) - -#define put_user_ex(x, ptr)	do {		\ -	__uaccess_err |= __put_user(x, ptr);	\ -} while (0) - -#endif /* CONFIG_X86_WP_WORKS_OK */ -  extern unsigned long  copy_from_user_nmi(void *to, const void __user *from, unsigned long n);  extern __must_check long diff --git a/arch/x86/include/asm/unistd.h b/arch/x86/include/asm/unistd.h index 16f3fc6ebf2..0e7dea7d366 100644 --- a/arch/x86/include/asm/unistd.h +++ b/arch/x86/include/asm/unistd.h @@ -51,6 +51,9 @@  # define __ARCH_WANT_SYS_UTIME  # define __ARCH_WANT_SYS_WAITPID  # define __ARCH_WANT_SYS_EXECVE +# define __ARCH_WANT_SYS_FORK +# define __ARCH_WANT_SYS_VFORK +# define __ARCH_WANT_SYS_CLONE  /*   * "Conditional" syscalls diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 91ce48f05f9..34e923a5376 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile @@ -9,7 +9,6 @@ CPPFLAGS_vmlinux.lds += -U$(UTS_MACHINE)  ifdef CONFIG_FUNCTION_TRACER  # Do not profile debug and lowlevel utilities  CFLAGS_REMOVE_tsc.o = -pg -CFLAGS_REMOVE_rtc.o = -pg  CFLAGS_REMOVE_paravirt-spinlocks.o = -pg  CFLAGS_REMOVE_pvclock.o = -pg  CFLAGS_REMOVE_kvmclock.o = -pg @@ -62,6 +61,7 @@ obj-$(CONFIG_X86_REBOOTFIXUPS)	+= reboot_fixups_32.o  obj-$(CONFIG_DYNAMIC_FTRACE)	+= ftrace.o  obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o  obj-$(CONFIG_FTRACE_SYSCALLS)	+= ftrace.o +obj-$(CONFIG_X86_TSC)		+= trace_clock.o  obj-$(CONFIG_KEXEC)		+= machine_kexec_$(BITS).o  obj-$(CONFIG_KEXEC)		+= relocate_kernel_$(BITS).o crash.o  obj-$(CONFIG_CRASH_DUMP)	+= crash_dump_$(BITS).o diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index e651f7a589a..e48cafcf92a 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c @@ -574,6 +574,12 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)  	return irq;  } +EXPORT_SYMBOL_GPL(acpi_register_gsi); + +void acpi_unregister_gsi(u32 gsi) +{ +} +EXPORT_SYMBOL_GPL(acpi_unregister_gsi);  void __init acpi_set_irq_model_pic(void)  { diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index 11676cf65ae..d5e0d717005 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c @@ -101,6 +101,8 @@ static int __init acpi_sleep_setup(char *str)  #endif  		if (strncmp(str, "nonvs", 5) == 0)  			acpi_nvs_nosave(); +		if (strncmp(str, "nonvs_s3", 8) == 0) +			acpi_nvs_nosave_s3();  		if (strncmp(str, "old_ordering", 12) == 0)  			acpi_old_suspend_ordering();  		str = strchr(str, ','); diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index b17416e72fb..b994cc84aa7 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -90,21 +90,6 @@ EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid);   */  DEFINE_EARLY_PER_CPU_READ_MOSTLY(int, x86_cpu_to_logical_apicid, BAD_APICID); -/* - * Knob to control our willingness to enable the local APIC. - * - * +1=force-enable - */ -static int force_enable_local_apic __initdata; -/* - * APIC command line parameters - */ -static int __init parse_lapic(char *arg) -{ -	force_enable_local_apic = 1; -	return 0; -} -early_param("lapic", parse_lapic);  /* Local APIC was disabled by the BIOS and enabled by the kernel */  static int enabled_via_apicbase; @@ -133,6 +118,25 @@ static inline void imcr_apic_to_pic(void)  }  #endif +/* + * Knob to control our willingness to enable the local APIC. + * + * +1=force-enable + */ +static int force_enable_local_apic __initdata; +/* + * APIC command line parameters + */ +static int __init parse_lapic(char *arg) +{ +	if (config_enabled(CONFIG_X86_32) && !arg) +		force_enable_local_apic = 1; +	else if (!strncmp(arg, "notscdeadline", 13)) +		setup_clear_cpu_cap(X86_FEATURE_TSC_DEADLINE_TIMER); +	return 0; +} +early_param("lapic", parse_lapic); +  #ifdef CONFIG_X86_64  static int apic_calibrate_pmtmr __initdata;  static __init int setup_apicpmtimer(char *s) @@ -315,6 +319,7 @@ int lapic_get_maxlvt(void)  /* Clock divisor */  #define APIC_DIVISOR 16 +#define TSC_DIVISOR  32  /*   * This function sets up the local APIC timer, with a timeout of @@ -333,6 +338,9 @@ static void __setup_APIC_LVTT(unsigned int clocks, int oneshot, int irqen)  	lvtt_value = LOCAL_TIMER_VECTOR;  	if (!oneshot)  		lvtt_value |= APIC_LVT_TIMER_PERIODIC; +	else if (boot_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER)) +		lvtt_value |= APIC_LVT_TIMER_TSCDEADLINE; +  	if (!lapic_is_integrated())  		lvtt_value |= SET_APIC_TIMER_BASE(APIC_TIMER_BASE_DIV); @@ -341,6 +349,11 @@ static void __setup_APIC_LVTT(unsigned int clocks, int oneshot, int irqen)  	apic_write(APIC_LVTT, lvtt_value); +	if (lvtt_value & APIC_LVT_TIMER_TSCDEADLINE) { +		printk_once(KERN_DEBUG "TSC deadline timer enabled\n"); +		return; +	} +  	/*  	 * Divide PICLK by 16  	 */ @@ -453,6 +466,16 @@ static int lapic_next_event(unsigned long delta,  	return 0;  } +static int lapic_next_deadline(unsigned long delta, +			       struct clock_event_device *evt) +{ +	u64 tsc; + +	rdtscll(tsc); +	wrmsrl(MSR_IA32_TSC_DEADLINE, tsc + (((u64) delta) * TSC_DIVISOR)); +	return 0; +} +  /*   * Setup the lapic timer in periodic or oneshot mode   */ @@ -533,7 +556,15 @@ static void __cpuinit setup_APIC_timer(void)  	memcpy(levt, &lapic_clockevent, sizeof(*levt));  	levt->cpumask = cpumask_of(smp_processor_id()); -	clockevents_register_device(levt); +	if (this_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER)) { +		levt->features &= ~(CLOCK_EVT_FEAT_PERIODIC | +				    CLOCK_EVT_FEAT_DUMMY); +		levt->set_next_event = lapic_next_deadline; +		clockevents_config_and_register(levt, +						(tsc_khz / TSC_DIVISOR) * 1000, +						0xF, ~0UL); +	} else +		clockevents_register_device(levt);  }  /* @@ -661,7 +692,9 @@ static int __init calibrate_APIC_clock(void)  	 * in the clockevent structure and return.  	 */ -	if (lapic_timer_frequency) { +	if (boot_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER)) { +		return 0; +	} else if (lapic_timer_frequency) {  		apic_printk(APIC_VERBOSE, "lapic timer already calibrated %d\n",  				lapic_timer_frequency);  		lapic_clockevent.mult = div_sc(lapic_timer_frequency/APIC_DIVISOR, @@ -674,6 +707,9 @@ static int __init calibrate_APIC_clock(void)  		return 0;  	} +	apic_printk(APIC_VERBOSE, "Using local APIC timer interrupts.\n" +		    "calibrating APIC timer ...\n"); +  	local_irq_disable();  	/* Replace the global interrupt handler */ @@ -811,9 +847,6 @@ void __init setup_boot_APIC_clock(void)  		return;  	} -	apic_printk(APIC_VERBOSE, "Using local APIC timer interrupts.\n" -		    "calibrating APIC timer ...\n"); -  	if (calibrate_APIC_clock()) {  		/* No broadcast on UP ! */  		if (num_possible_cpus() > 1) diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 1817fa91102..b739d398bb2 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -234,11 +234,11 @@ int __init arch_early_irq_init(void)  		zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_KERNEL, node);  		/*  		 * For legacy IRQ's, start with assigning irq0 to irq15 to -		 * IRQ0_VECTOR to IRQ15_VECTOR on cpu 0. +		 * IRQ0_VECTOR to IRQ15_VECTOR for all cpu's.  		 */  		if (i < legacy_pic->nr_legacy_irqs) {  			cfg[i].vector = IRQ0_VECTOR + i; -			cpumask_set_cpu(0, cfg[i].domain); +			cpumask_setall(cfg[i].domain);  		}  	} @@ -1141,7 +1141,8 @@ __assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)  			 * allocation for the members that are not used anymore.  			 */  			cpumask_andnot(cfg->old_domain, cfg->domain, tmp_mask); -			cfg->move_in_progress = 1; +			cfg->move_in_progress = +			   cpumask_intersects(cfg->old_domain, cpu_online_mask);  			cpumask_and(cfg->domain, cfg->domain, tmp_mask);  			break;  		} @@ -1172,8 +1173,9 @@ next:  		current_vector = vector;  		current_offset = offset;  		if (cfg->vector) { -			cfg->move_in_progress = 1;  			cpumask_copy(cfg->old_domain, cfg->domain); +			cfg->move_in_progress = +			   cpumask_intersects(cfg->old_domain, cpu_online_mask);  		}  		for_each_cpu_and(new_cpu, tmp_mask, cpu_online_mask)  			per_cpu(vector_irq, new_cpu)[vector] = irq; @@ -1241,12 +1243,6 @@ void __setup_vector_irq(int cpu)  		cfg = irq_get_chip_data(irq);  		if (!cfg)  			continue; -		/* -		 * If it is a legacy IRQ handled by the legacy PIC, this cpu -		 * will be part of the irq_cfg's domain. -		 */ -		if (irq < legacy_pic->nr_legacy_irqs && !IO_APIC_IRQ(irq)) -			cpumask_set_cpu(cpu, cfg->domain);  		if (!cpumask_test_cpu(cpu, cfg->domain))  			continue; @@ -1356,16 +1352,6 @@ static void setup_ioapic_irq(unsigned int irq, struct irq_cfg *cfg,  	if (!IO_APIC_IRQ(irq))  		return; -	/* -	 * For legacy irqs, cfg->domain starts with cpu 0. Now that IO-APIC -	 * can handle this irq and the apic driver is finialized at this point, -	 * update the cfg->domain. -	 */ -	if (irq < legacy_pic->nr_legacy_irqs && -	    cpumask_equal(cfg->domain, cpumask_of(0))) -		apic->vector_allocation_domain(0, cfg->domain, -					       apic->target_cpus()); -  	if (assign_irq_vector(irq, cfg, apic->target_cpus()))  		return; @@ -2199,9 +2185,11 @@ static int ioapic_retrigger_irq(struct irq_data *data)  {  	struct irq_cfg *cfg = data->chip_data;  	unsigned long flags; +	int cpu;  	raw_spin_lock_irqsave(&vector_lock, flags); -	apic->send_IPI_mask(cpumask_of(cpumask_first(cfg->domain)), cfg->vector); +	cpu = cpumask_first_and(cfg->domain, cpu_online_mask); +	apic->send_IPI_mask(cpumask_of(cpu), cfg->vector);  	raw_spin_unlock_irqrestore(&vector_lock, flags);  	return 1; @@ -3317,8 +3305,9 @@ int arch_setup_hpet_msi(unsigned int irq, unsigned int id)  	int ret;  	if (irq_remapping_enabled) { -		if (!setup_hpet_msi_remapped(irq, id)) -			return -1; +		ret = setup_hpet_msi_remapped(irq, id); +		if (ret) +			return ret;  	}  	ret = msi_compose_msg(NULL, irq, &msg, id); diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 1b7d1656a04..15239fffd6f 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -304,7 +304,7 @@ static void __cpuinit amd_get_topology(struct cpuinfo_x86 *c)  	int cpu = smp_processor_id();  	/* get information required for multi-node processors */ -	if (cpu_has(c, X86_FEATURE_TOPOEXT)) { +	if (cpu_has_topoext) {  		u32 eax, ebx, ecx, edx;  		cpuid(0x8000001e, &eax, &ebx, &ecx, &edx); @@ -657,12 +657,7 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)  	detect_ht(c);  #endif -	if (c->extended_cpuid_level >= 0x80000006) { -		if (cpuid_edx(0x80000006) & 0xf000) -			num_cache_leaves = 4; -		else -			num_cache_leaves = 3; -	} +	init_amd_cacheinfo(c);  	if (c->x86 >= 0xf)  		set_cpu_cap(c, X86_FEATURE_K8); @@ -753,9 +748,6 @@ static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 *c,  static void __cpuinit cpu_set_tlb_flushall_shift(struct cpuinfo_x86 *c)  { -	if (!cpu_has_invlpg) -		return; -  	tlb_flushall_shift = 5;  	if (c->x86 <= 0x11) diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index d0e910da16c..92dfec986a4 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c @@ -107,53 +107,17 @@ static void __init check_hlt(void)  }  /* - *	Most 386 processors have a bug where a POPAD can lock the - *	machine even from user space. - */ - -static void __init check_popad(void) -{ -#ifndef CONFIG_X86_POPAD_OK -	int res, inp = (int) &res; - -	pr_info("Checking for popad bug... "); -	__asm__ __volatile__( -	  "movl $12345678,%%eax; movl $0,%%edi; pusha; popa; movl (%%edx,%%edi),%%ecx " -	  : "=&a" (res) -	  : "d" (inp) -	  : "ecx", "edi"); -	/* -	 * If this fails, it means that any user program may lock the -	 * CPU hard. Too bad. -	 */ -	if (res != 12345678) -		pr_cont("Buggy\n"); -	else -		pr_cont("OK\n"); -#endif -} - -/*   * Check whether we are able to run this kernel safely on SMP.   * - * - In order to run on a i386, we need to be compiled for i386 - *   (for due to lack of "invlpg" and working WP on a i386) + * - i386 is no longer supported.   * - In order to run on anything without a TSC, we need to be   *   compiled for a i486.   */  static void __init check_config(void)  { -/* - * We'd better not be a i386 if we're configured to use some - * i486+ only features! (WP works in supervisor mode and the - * new "invlpg" and "bswap" instructions) - */ -#if defined(CONFIG_X86_WP_WORKS_OK) || defined(CONFIG_X86_INVLPG) || \ -	defined(CONFIG_X86_BSWAP) -	if (boot_cpu_data.x86 == 3) +	if (boot_cpu_data.x86 < 4)  		panic("Kernel requires i486+ for 'invlpg' and other features"); -#endif  } @@ -166,7 +130,6 @@ void __init check_bugs(void)  #endif  	check_config();  	check_hlt(); -	check_popad();  	init_utsname()->machine[1] =  		'0' + (boot_cpu_data.x86 > 6 ? 6 : boot_cpu_data.x86);  	alternative_instructions(); diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 7505f7b13e7..9c3ab43a695 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -1173,15 +1173,6 @@ DEFINE_PER_CPU(struct task_struct *, fpu_owner_task);  DEFINE_PER_CPU_ALIGNED(struct stack_canary, stack_canary);  #endif -/* Make sure %fs and %gs are initialized properly in idle threads */ -struct pt_regs * __cpuinit idle_regs(struct pt_regs *regs) -{ -	memset(regs, 0, sizeof(struct pt_regs)); -	regs->fs = __KERNEL_PERCPU; -	regs->gs = __KERNEL_STACK_CANARY; - -	return regs; -}  #endif	/* CONFIG_X86_64 */  /* @@ -1237,7 +1228,7 @@ void __cpuinit cpu_init(void)  	oist = &per_cpu(orig_ist, cpu);  #ifdef CONFIG_NUMA -	if (cpu != 0 && this_cpu_read(numa_node) == 0 && +	if (this_cpu_read(numa_node) == 0 &&  	    early_cpu_to_node(cpu) != NUMA_NO_NODE)  		set_numa_node(early_cpu_to_node(cpu));  #endif @@ -1269,8 +1260,7 @@ void __cpuinit cpu_init(void)  	barrier();  	x86_configure_nx(); -	if (cpu != 0) -		enable_x2apic(); +	enable_x2apic();  	/*  	 * set up and load the per-CPU TSS diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 198e019a531..fcaabd0432c 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c @@ -612,10 +612,6 @@ static void __cpuinit intel_tlb_lookup(const unsigned char desc)  static void __cpuinit intel_tlb_flushall_shift_set(struct cpuinfo_x86 *c)  { -	if (!cpu_has_invlpg) { -		tlb_flushall_shift = -1; -		return; -	}  	switch ((c->x86 << 8) + c->x86_model) {  	case 0x60f: /* original 65 nm celeron/pentium/core2/xeon, "Merom"/"Conroe" */  	case 0x616: /* single-core 65 nm celeron/core2solo "Merom-L"/"Conroe-L" */ diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index 93c5451bdd5..fe9edec6698 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c @@ -538,7 +538,11 @@ __cpuinit cpuid4_cache_lookup_regs(int index,  	unsigned		edx;  	if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) { -		amd_cpuid4(index, &eax, &ebx, &ecx); +		if (cpu_has_topoext) +			cpuid_count(0x8000001d, index, &eax.full, +				    &ebx.full, &ecx.full, &edx); +		else +			amd_cpuid4(index, &eax, &ebx, &ecx);  		amd_init_l3_cache(this_leaf, index);  	} else {  		cpuid_count(4, index, &eax.full, &ebx.full, &ecx.full, &edx); @@ -557,21 +561,39 @@ __cpuinit cpuid4_cache_lookup_regs(int index,  	return 0;  } -static int __cpuinit find_num_cache_leaves(void) +static int __cpuinit find_num_cache_leaves(struct cpuinfo_x86 *c)  { -	unsigned int		eax, ebx, ecx, edx; +	unsigned int		eax, ebx, ecx, edx, op;  	union _cpuid4_leaf_eax	cache_eax;  	int 			i = -1; +	if (c->x86_vendor == X86_VENDOR_AMD) +		op = 0x8000001d; +	else +		op = 4; +  	do {  		++i; -		/* Do cpuid(4) loop to find out num_cache_leaves */ -		cpuid_count(4, i, &eax, &ebx, &ecx, &edx); +		/* Do cpuid(op) loop to find out num_cache_leaves */ +		cpuid_count(op, i, &eax, &ebx, &ecx, &edx);  		cache_eax.full = eax;  	} while (cache_eax.split.type != CACHE_TYPE_NULL);  	return i;  } +void __cpuinit init_amd_cacheinfo(struct cpuinfo_x86 *c) +{ + +	if (cpu_has_topoext) { +		num_cache_leaves = find_num_cache_leaves(c); +	} else if (c->extended_cpuid_level >= 0x80000006) { +		if (cpuid_edx(0x80000006) & 0xf000) +			num_cache_leaves = 4; +		else +			num_cache_leaves = 3; +	} +} +  unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c)  {  	/* Cache sizes */ @@ -588,7 +610,7 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c)  		if (is_initialized == 0) {  			/* Init num_cache_leaves from boot CPU */ -			num_cache_leaves = find_num_cache_leaves(); +			num_cache_leaves = find_num_cache_leaves(c);  			is_initialized++;  		} @@ -728,37 +750,50 @@ static DEFINE_PER_CPU(struct _cpuid4_info *, ici_cpuid4_info);  static int __cpuinit cache_shared_amd_cpu_map_setup(unsigned int cpu, int index)  {  	struct _cpuid4_info *this_leaf; -	int ret, i, sibling; -	struct cpuinfo_x86 *c = &cpu_data(cpu); +	int i, sibling; -	ret = 0; -	if (index == 3) { -		ret = 1; -		for_each_cpu(i, cpu_llc_shared_mask(cpu)) { +	if (cpu_has_topoext) { +		unsigned int apicid, nshared, first, last; + +		if (!per_cpu(ici_cpuid4_info, cpu)) +			return 0; + +		this_leaf = CPUID4_INFO_IDX(cpu, index); +		nshared = this_leaf->base.eax.split.num_threads_sharing + 1; +		apicid = cpu_data(cpu).apicid; +		first = apicid - (apicid % nshared); +		last = first + nshared - 1; + +		for_each_online_cpu(i) { +			apicid = cpu_data(i).apicid; +			if ((apicid < first) || (apicid > last)) +				continue;  			if (!per_cpu(ici_cpuid4_info, i))  				continue;  			this_leaf = CPUID4_INFO_IDX(i, index); -			for_each_cpu(sibling, cpu_llc_shared_mask(cpu)) { -				if (!cpu_online(sibling)) + +			for_each_online_cpu(sibling) { +				apicid = cpu_data(sibling).apicid; +				if ((apicid < first) || (apicid > last))  					continue;  				set_bit(sibling, this_leaf->shared_cpu_map);  			}  		} -	} else if ((c->x86 == 0x15) && ((index == 1) || (index == 2))) { -		ret = 1; -		for_each_cpu(i, cpu_sibling_mask(cpu)) { +	} else if (index == 3) { +		for_each_cpu(i, cpu_llc_shared_mask(cpu)) {  			if (!per_cpu(ici_cpuid4_info, i))  				continue;  			this_leaf = CPUID4_INFO_IDX(i, index); -			for_each_cpu(sibling, cpu_sibling_mask(cpu)) { +			for_each_cpu(sibling, cpu_llc_shared_mask(cpu)) {  				if (!cpu_online(sibling))  					continue;  				set_bit(sibling, this_leaf->shared_cpu_map);  			}  		} -	} +	} else +		return 0; -	return ret; +	return 1;  }  static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c index 6b96110bb0c..e4c1a418453 100644 --- a/arch/x86/kernel/cpu/mtrr/main.c +++ b/arch/x86/kernel/cpu/mtrr/main.c @@ -695,11 +695,16 @@ void mtrr_ap_init(void)  }  /** - * Save current fixed-range MTRR state of the BSP + * Save current fixed-range MTRR state of the first cpu in cpu_online_mask.   */  void mtrr_save_state(void)  { -	smp_call_function_single(0, mtrr_save_fixed_ranges, NULL, 1); +	int first_cpu; + +	get_online_cpus(); +	first_cpu = cpumask_first(cpu_online_mask); +	smp_call_function_single(first_cpu, mtrr_save_fixed_ranges, NULL, 1); +	put_online_cpus();  }  void set_mtrr_aps_delayed_init(void) diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 4a3374e61a9..4428fd178bc 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c @@ -1316,6 +1316,121 @@ static struct attribute_group x86_pmu_format_group = {  	.attrs = NULL,  }; +struct perf_pmu_events_attr { +	struct device_attribute attr; +	u64 id; +}; + +/* + * Remove all undefined events (x86_pmu.event_map(id) == 0) + * out of events_attr attributes. + */ +static void __init filter_events(struct attribute **attrs) +{ +	int i, j; + +	for (i = 0; attrs[i]; i++) { +		if (x86_pmu.event_map(i)) +			continue; + +		for (j = i; attrs[j]; j++) +			attrs[j] = attrs[j + 1]; + +		/* Check the shifted attr. */ +		i--; +	} +} + +static ssize_t events_sysfs_show(struct device *dev, struct device_attribute *attr, +			  char *page) +{ +	struct perf_pmu_events_attr *pmu_attr = \ +		container_of(attr, struct perf_pmu_events_attr, attr); + +	u64 config = x86_pmu.event_map(pmu_attr->id); +	return x86_pmu.events_sysfs_show(page, config); +} + +#define EVENT_VAR(_id)  event_attr_##_id +#define EVENT_PTR(_id) &event_attr_##_id.attr.attr + +#define EVENT_ATTR(_name, _id)					\ +static struct perf_pmu_events_attr EVENT_VAR(_id) = {		\ +	.attr = __ATTR(_name, 0444, events_sysfs_show, NULL),	\ +	.id   =  PERF_COUNT_HW_##_id,				\ +}; + +EVENT_ATTR(cpu-cycles,			CPU_CYCLES		); +EVENT_ATTR(instructions,		INSTRUCTIONS		); +EVENT_ATTR(cache-references,		CACHE_REFERENCES	); +EVENT_ATTR(cache-misses, 		CACHE_MISSES		); +EVENT_ATTR(branch-instructions,		BRANCH_INSTRUCTIONS	); +EVENT_ATTR(branch-misses,		BRANCH_MISSES		); +EVENT_ATTR(bus-cycles,			BUS_CYCLES		); +EVENT_ATTR(stalled-cycles-frontend,	STALLED_CYCLES_FRONTEND	); +EVENT_ATTR(stalled-cycles-backend,	STALLED_CYCLES_BACKEND	); +EVENT_ATTR(ref-cycles,			REF_CPU_CYCLES		); + +static struct attribute *empty_attrs; + +static struct attribute *events_attr[] = { +	EVENT_PTR(CPU_CYCLES), +	EVENT_PTR(INSTRUCTIONS), +	EVENT_PTR(CACHE_REFERENCES), +	EVENT_PTR(CACHE_MISSES), +	EVENT_PTR(BRANCH_INSTRUCTIONS), +	EVENT_PTR(BRANCH_MISSES), +	EVENT_PTR(BUS_CYCLES), +	EVENT_PTR(STALLED_CYCLES_FRONTEND), +	EVENT_PTR(STALLED_CYCLES_BACKEND), +	EVENT_PTR(REF_CPU_CYCLES), +	NULL, +}; + +static struct attribute_group x86_pmu_events_group = { +	.name = "events", +	.attrs = events_attr, +}; + +ssize_t x86_event_sysfs_show(char *page, u64 config, u64 event) +{ +	u64 umask  = (config & ARCH_PERFMON_EVENTSEL_UMASK) >> 8; +	u64 cmask  = (config & ARCH_PERFMON_EVENTSEL_CMASK) >> 24; +	bool edge  = (config & ARCH_PERFMON_EVENTSEL_EDGE); +	bool pc    = (config & ARCH_PERFMON_EVENTSEL_PIN_CONTROL); +	bool any   = (config & ARCH_PERFMON_EVENTSEL_ANY); +	bool inv   = (config & ARCH_PERFMON_EVENTSEL_INV); +	ssize_t ret; + +	/* +	* We have whole page size to spend and just little data +	* to write, so we can safely use sprintf. +	*/ +	ret = sprintf(page, "event=0x%02llx", event); + +	if (umask) +		ret += sprintf(page + ret, ",umask=0x%02llx", umask); + +	if (edge) +		ret += sprintf(page + ret, ",edge"); + +	if (pc) +		ret += sprintf(page + ret, ",pc"); + +	if (any) +		ret += sprintf(page + ret, ",any"); + +	if (inv) +		ret += sprintf(page + ret, ",inv"); + +	if (cmask) +		ret += sprintf(page + ret, ",cmask=0x%02llx", cmask); + +	ret += sprintf(page + ret, "\n"); + +	return ret; +} +  static int __init init_hw_perf_events(void)  {  	struct x86_pmu_quirk *quirk; @@ -1362,6 +1477,11 @@ static int __init init_hw_perf_events(void)  	x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */  	x86_pmu_format_group.attrs = x86_pmu.format_attrs; +	if (!x86_pmu.events_sysfs_show) +		x86_pmu_events_group.attrs = &empty_attrs; +	else +		filter_events(x86_pmu_events_group.attrs); +  	pr_info("... version:                %d\n",     x86_pmu.version);  	pr_info("... bit width:              %d\n",     x86_pmu.cntval_bits);  	pr_info("... generic registers:      %d\n",     x86_pmu.num_counters); @@ -1651,6 +1771,7 @@ static struct attribute_group x86_pmu_attr_group = {  static const struct attribute_group *x86_pmu_attr_groups[] = {  	&x86_pmu_attr_group,  	&x86_pmu_format_group, +	&x86_pmu_events_group,  	NULL,  }; diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index 271d2570029..115c1ea9774 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h @@ -354,6 +354,8 @@ struct x86_pmu {  	int		attr_rdpmc;  	struct attribute **format_attrs; +	ssize_t		(*events_sysfs_show)(char *page, u64 config); +  	/*  	 * CPU Hotplug hooks  	 */ @@ -536,6 +538,9 @@ static inline void set_linear_ip(struct pt_regs *regs, unsigned long ip)  	regs->ip = ip;  } +ssize_t x86_event_sysfs_show(char *page, u64 config, u64 event); +ssize_t intel_event_sysfs_show(char *page, u64 config); +  #ifdef CONFIG_CPU_SUP_AMD  int amd_pmu_init(void); diff --git a/arch/x86/kernel/cpu/perf_event_amd.c b/arch/x86/kernel/cpu/perf_event_amd.c index 4528ae7b6ec..c93bc4e813a 100644 --- a/arch/x86/kernel/cpu/perf_event_amd.c +++ b/arch/x86/kernel/cpu/perf_event_amd.c @@ -568,6 +568,14 @@ amd_get_event_constraints_f15h(struct cpu_hw_events *cpuc, struct perf_event *ev  	}  } +static ssize_t amd_event_sysfs_show(char *page, u64 config) +{ +	u64 event = (config & ARCH_PERFMON_EVENTSEL_EVENT) | +		    (config & AMD64_EVENTSEL_EVENT) >> 24; + +	return x86_event_sysfs_show(page, config, event); +} +  static __initconst const struct x86_pmu amd_pmu = {  	.name			= "AMD",  	.handle_irq		= x86_pmu_handle_irq, @@ -591,6 +599,7 @@ static __initconst const struct x86_pmu amd_pmu = {  	.put_event_constraints	= amd_put_event_constraints,  	.format_attrs		= amd_format_attr, +	.events_sysfs_show	= amd_event_sysfs_show,  	.cpu_prepare		= amd_pmu_cpu_prepare,  	.cpu_starting		= amd_pmu_cpu_starting, diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 324bb523d9d..93b9e1181f8 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c @@ -1603,6 +1603,13 @@ static struct attribute *intel_arch_formats_attr[] = {  	NULL,  }; +ssize_t intel_event_sysfs_show(char *page, u64 config) +{ +	u64 event = (config & ARCH_PERFMON_EVENTSEL_EVENT); + +	return x86_event_sysfs_show(page, config, event); +} +  static __initconst const struct x86_pmu core_pmu = {  	.name			= "core",  	.handle_irq		= x86_pmu_handle_irq, @@ -1628,6 +1635,7 @@ static __initconst const struct x86_pmu core_pmu = {  	.event_constraints	= intel_core_event_constraints,  	.guest_get_msrs		= core_guest_get_msrs,  	.format_attrs		= intel_arch_formats_attr, +	.events_sysfs_show	= intel_event_sysfs_show,  };  struct intel_shared_regs *allocate_shared_regs(int cpu) @@ -1766,6 +1774,7 @@ static __initconst const struct x86_pmu intel_pmu = {  	.pebs_aliases		= intel_pebs_aliases_core2,  	.format_attrs		= intel_arch3_formats_attr, +	.events_sysfs_show	= intel_event_sysfs_show,  	.cpu_prepare		= intel_pmu_cpu_prepare,  	.cpu_starting		= intel_pmu_cpu_starting, diff --git a/arch/x86/kernel/cpu/perf_event_p6.c b/arch/x86/kernel/cpu/perf_event_p6.c index 7d0270bd793..f2af39f5dc3 100644 --- a/arch/x86/kernel/cpu/perf_event_p6.c +++ b/arch/x86/kernel/cpu/perf_event_p6.c @@ -227,6 +227,8 @@ static __initconst const struct x86_pmu p6_pmu = {  	.event_constraints	= p6_event_constraints,  	.format_attrs		= intel_p6_formats_attr, +	.events_sysfs_show	= intel_event_sysfs_show, +  };  __init int p6_pmu_init(void) diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 88b725aa1d5..c763116c535 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S @@ -739,30 +739,12 @@ ENTRY(ptregs_##name) ; \  ENDPROC(ptregs_##name)  PTREGSCALL1(iopl) -PTREGSCALL0(fork) -PTREGSCALL0(vfork)  PTREGSCALL2(sigaltstack)  PTREGSCALL0(sigreturn)  PTREGSCALL0(rt_sigreturn)  PTREGSCALL2(vm86)  PTREGSCALL1(vm86old) -/* Clone is an oddball.  The 4th arg is in %edi */ -ENTRY(ptregs_clone) -	CFI_STARTPROC -	leal 4(%esp),%eax -	pushl_cfi %eax -	pushl_cfi PT_EDI(%eax) -	movl PT_EDX(%eax),%ecx -	movl PT_ECX(%eax),%edx -	movl PT_EBX(%eax),%eax -	call sys_clone -	addl $8,%esp -	CFI_ADJUST_CFA_OFFSET -8 -	ret -	CFI_ENDPROC -ENDPROC(ptregs_clone) -  .macro FIXUP_ESPFIX_STACK  /*   * Switch back for ESPFIX stack to the normal zerobased stack diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 1328fe49a3f..70641aff0c2 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -56,7 +56,7 @@  #include <asm/ftrace.h>  #include <asm/percpu.h>  #include <asm/asm.h> -#include <asm/rcu.h> +#include <asm/context_tracking.h>  #include <asm/smap.h>  #include <linux/err.h> @@ -845,9 +845,25 @@ ENTRY(\label)  END(\label)  	.endm -	PTREGSCALL stub_clone, sys_clone, %r8 -	PTREGSCALL stub_fork, sys_fork, %rdi -	PTREGSCALL stub_vfork, sys_vfork, %rdi +	.macro FORK_LIKE func +ENTRY(stub_\func) +	CFI_STARTPROC +	popq	%r11			/* save return address */ +	PARTIAL_FRAME 0 +	SAVE_REST +	pushq	%r11			/* put it back on stack */ +	FIXUP_TOP_OF_STACK %r11, 8 +	DEFAULT_FRAME 0 8		/* offset 8: return address */ +	call sys_\func +	RESTORE_TOP_OF_STACK %r11, 8 +	ret $REST_SKIP		/* pop extended registers */ +	CFI_ENDPROC +END(stub_\func) +	.endm + +	FORK_LIKE  clone +	FORK_LIKE  fork +	FORK_LIKE  vfork  	PTREGSCALL stub_sigaltstack, sys_sigaltstack, %rdx  	PTREGSCALL stub_iopl, sys_iopl, %rsi @@ -1699,9 +1715,10 @@ nested_nmi:  1:  	/* Set up the interrupted NMIs stack to jump to repeat_nmi */ -	leaq -6*8(%rsp), %rdx +	leaq -1*8(%rsp), %rdx  	movq %rdx, %rsp -	CFI_ADJUST_CFA_OFFSET 6*8 +	CFI_ADJUST_CFA_OFFSET 1*8 +	leaq -10*8(%rsp), %rdx  	pushq_cfi $__KERNEL_DS  	pushq_cfi %rdx  	pushfq_cfi @@ -1709,8 +1726,8 @@ nested_nmi:  	pushq_cfi $repeat_nmi  	/* Put stack back */ -	addq $(11*8), %rsp -	CFI_ADJUST_CFA_OFFSET -11*8 +	addq $(6*8), %rsp +	CFI_ADJUST_CFA_OFFSET -6*8  nested_nmi_out:  	popq_cfi %rdx @@ -1736,18 +1753,18 @@ first_nmi:  	 * +-------------------------+  	 * | NMI executing variable  |  	 * +-------------------------+ -	 * | Saved SS                | -	 * | Saved Return RSP        | -	 * | Saved RFLAGS            | -	 * | Saved CS                | -	 * | Saved RIP               | -	 * +-------------------------+  	 * | copied SS               |  	 * | copied Return RSP       |  	 * | copied RFLAGS           |  	 * | copied CS               |  	 * | copied RIP              |  	 * +-------------------------+ +	 * | Saved SS                | +	 * | Saved Return RSP        | +	 * | Saved RFLAGS            | +	 * | Saved CS                | +	 * | Saved RIP               | +	 * +-------------------------+  	 * | pt_regs                 |  	 * +-------------------------+  	 * @@ -1763,9 +1780,14 @@ first_nmi:  	/* Set the NMI executing variable on the stack. */  	pushq_cfi $1 +	/* +	 * Leave room for the "copied" frame +	 */ +	subq $(5*8), %rsp +  	/* Copy the stack frame to the Saved frame */  	.rept 5 -	pushq_cfi 6*8(%rsp) +	pushq_cfi 11*8(%rsp)  	.endr  	CFI_DEF_CFA_OFFSET SS+8-RIP @@ -1786,12 +1808,15 @@ repeat_nmi:  	 * is benign for the non-repeat case, where 1 was pushed just above  	 * to this very stack slot).  	 */ -	movq $1, 5*8(%rsp) +	movq $1, 10*8(%rsp)  	/* Make another copy, this one may be modified by nested NMIs */ +	addq $(10*8), %rsp +	CFI_ADJUST_CFA_OFFSET -10*8  	.rept 5 -	pushq_cfi 4*8(%rsp) +	pushq_cfi -6*8(%rsp)  	.endr +	subq $(5*8), %rsp  	CFI_DEF_CFA_OFFSET SS+8-RIP  end_repeat_nmi: @@ -1842,8 +1867,12 @@ nmi_swapgs:  	SWAPGS_UNSAFE_STACK  nmi_restore:  	RESTORE_ALL 8 + +	/* Pop the extra iret frame */ +	addq $(5*8), %rsp +  	/* Clear the NMI executing stack variable */ -	movq $0, 10*8(%rsp) +	movq $0, 5*8(%rsp)  	jmp irq_return  	CFI_ENDPROC  END(nmi) diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 957a47aec64..8e7f6556028 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S @@ -266,6 +266,19 @@ num_subarch_entries = (. - subarch_entries) / 4  	jmp default_entry  #endif /* CONFIG_PARAVIRT */ +#ifdef CONFIG_HOTPLUG_CPU +/* + * Boot CPU0 entry point. It's called from play_dead(). Everything has been set + * up already except stack. We just set up stack here. Then call + * start_secondary(). + */ +ENTRY(start_cpu0) +	movl stack_start, %ecx +	movl %ecx, %esp +	jmp  *(initial_code) +ENDPROC(start_cpu0) +#endif +  /*   * Non-boot CPU entry point; entered from trampoline.S   * We can't lgdt here, because lgdt itself uses a data segment, but @@ -292,8 +305,8 @@ default_entry:   *	be using the global pages.    *   *	NOTE! If we are on a 486 we may have no cr4 at all! - *	Specifically, cr4 exists if and only if CPUID exists, - *	which in turn exists if and only if EFLAGS.ID exists. + *	Specifically, cr4 exists if and only if CPUID exists + *	and has flags other than the FPU flag set.   */  	movl $X86_EFLAGS_ID,%ecx  	pushl %ecx @@ -308,6 +321,11 @@ default_entry:  	testl %ecx,%eax  	jz 6f			# No ID flag = no CPUID = no CR4 +	movl $1,%eax +	cpuid +	andl $~1,%edx		# Ignore CPUID.FPU +	jz 6f			# No flags or only CPUID.FPU = no CR4 +  	movl pa(mmu_cr4_features),%eax  	movl %eax,%cr4 diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 94bf9cc2c7e..980053c4b9c 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S @@ -252,6 +252,22 @@ ENTRY(secondary_startup_64)  	pushq	%rax		# target address in negative space  	lretq +#ifdef CONFIG_HOTPLUG_CPU +/* + * Boot CPU0 entry point. It's called from play_dead(). Everything has been set + * up already except stack. We just set up stack here. Then call + * start_secondary(). + */ +ENTRY(start_cpu0) +	movq stack_start(%rip),%rsp +	movq	initial_code(%rip),%rax +	pushq	$0		# fake return address to stop unwinder +	pushq	$__KERNEL_CS	# set correct cs +	pushq	%rax		# target address in negative space +	lretq +ENDPROC(start_cpu0) +#endif +  	/* SMP bootup changes these two */  	__REFDATA  	.align	8 diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index 1460a5df92f..e28670f9a58 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c @@ -434,7 +434,7 @@ void hpet_msi_unmask(struct irq_data *data)  	/* unmask it */  	cfg = hpet_readl(HPET_Tn_CFG(hdev->num)); -	cfg |= HPET_TN_FSB; +	cfg |= HPET_TN_ENABLE | HPET_TN_FSB;  	hpet_writel(cfg, HPET_Tn_CFG(hdev->num));  } @@ -445,7 +445,7 @@ void hpet_msi_mask(struct irq_data *data)  	/* mask it */  	cfg = hpet_readl(HPET_Tn_CFG(hdev->num)); -	cfg &= ~HPET_TN_FSB; +	cfg &= ~(HPET_TN_ENABLE | HPET_TN_FSB);  	hpet_writel(cfg, HPET_Tn_CFG(hdev->num));  } diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index 675a0501244..245a71db401 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c @@ -175,7 +175,11 @@ void __cpuinit fpu_init(void)  		cr0 |= X86_CR0_EM;  	write_cr0(cr0); -	if (!smp_processor_id()) +	/* +	 * init_thread_xstate is only called once to avoid overriding +	 * xstate_size during boot time or during CPU hotplug. +	 */ +	if (xstate_size == 0)  		init_thread_xstate();  	mxcsr_feature_mask_init(); diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index b644e1c765d..2ed787f15bf 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -262,36 +262,6 @@ void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,  	propagate_user_return_notify(prev_p, next_p);  } -int sys_fork(struct pt_regs *regs) -{ -	return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL); -} - -/* - * This is trivial, and on the face of it looks like it - * could equally well be done in user mode. - * - * Not so, for quite unobvious reasons - register pressure. - * In user mode vfork() cannot have a stack frame, and if - * done by calling the "clone()" system call directly, you - * do not have enough call-clobbered registers to hold all - * the information you need. - */ -int sys_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->sp, regs, 0, -		       NULL, NULL); -} - -long -sys_clone(unsigned long clone_flags, unsigned long newsp, -	  void __user *parent_tid, void __user *child_tid, struct pt_regs *regs) -{ -	if (!newsp) -		newsp = regs->sp; -	return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); -} -  /*   * Idle related variables and functions   */ @@ -306,11 +276,6 @@ void (*pm_idle)(void);  EXPORT_SYMBOL(pm_idle);  #endif -static inline int hlt_use_halt(void) -{ -	return 1; -} -  #ifndef CONFIG_SMP  static inline void play_dead(void)  { @@ -410,28 +375,22 @@ void cpu_idle(void)   */  void default_idle(void)  { -	if (hlt_use_halt()) { -		trace_power_start_rcuidle(POWER_CSTATE, 1, smp_processor_id()); -		trace_cpu_idle_rcuidle(1, smp_processor_id()); -		current_thread_info()->status &= ~TS_POLLING; -		/* -		 * TS_POLLING-cleared state must be visible before we -		 * test NEED_RESCHED: -		 */ -		smp_mb(); +	trace_power_start_rcuidle(POWER_CSTATE, 1, smp_processor_id()); +	trace_cpu_idle_rcuidle(1, smp_processor_id()); +	current_thread_info()->status &= ~TS_POLLING; +	/* +	 * TS_POLLING-cleared state must be visible before we +	 * test NEED_RESCHED: +	 */ +	smp_mb(); -		if (!need_resched()) -			safe_halt();	/* enables interrupts racelessly */ -		else -			local_irq_enable(); -		current_thread_info()->status |= TS_POLLING; -		trace_power_end_rcuidle(smp_processor_id()); -		trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id()); -	} else { +	if (!need_resched()) +		safe_halt();	/* enables interrupts racelessly */ +	else  		local_irq_enable(); -		/* loop is done by the caller */ -		cpu_relax(); -	} +	current_thread_info()->status |= TS_POLLING; +	trace_power_end_rcuidle(smp_processor_id()); +	trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());  }  #ifdef CONFIG_APM_MODULE  EXPORT_SYMBOL(default_idle); diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 44e0bff38e7..b5a8905785e 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c @@ -128,8 +128,7 @@ void release_thread(struct task_struct *dead_task)  }  int copy_thread(unsigned long clone_flags, unsigned long sp, -	unsigned long arg, -	struct task_struct *p, struct pt_regs *regs) +	unsigned long arg, struct task_struct *p)  {  	struct pt_regs *childregs = task_pt_regs(p);  	struct task_struct *tsk; @@ -138,7 +137,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  	p->thread.sp = (unsigned long) childregs;  	p->thread.sp0 = (unsigned long) (childregs+1); -	if (unlikely(!regs)) { +	if (unlikely(p->flags & PF_KTHREAD)) {  		/* kernel thread */  		memset(childregs, 0, sizeof(struct pt_regs));  		p->thread.ip = (unsigned long) ret_from_kernel_thread; @@ -156,12 +155,13 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  		memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps));  		return 0;  	} -	*childregs = *regs; +	*childregs = *current_pt_regs();  	childregs->ax = 0; -	childregs->sp = sp; +	if (sp) +		childregs->sp = sp;  	p->thread.ip = (unsigned long) ret_from_fork; -	task_user_gs(p) = get_user_gs(regs); +	task_user_gs(p) = get_user_gs(current_pt_regs());  	p->fpu_counter = 0;  	p->thread.io_bitmap_ptr = NULL; diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 16c6365e2b8..6e68a619496 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -146,8 +146,7 @@ static inline u32 read_32bit_tls(struct task_struct *t, int tls)  }  int copy_thread(unsigned long clone_flags, unsigned long sp, -		unsigned long arg, -	struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  {  	int err;  	struct pt_regs *childregs; @@ -169,7 +168,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  	savesegment(ds, p->thread.ds);  	memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps)); -	if (unlikely(!regs)) { +	if (unlikely(p->flags & PF_KTHREAD)) {  		/* kernel thread */  		memset(childregs, 0, sizeof(struct pt_regs));  		childregs->sp = (unsigned long)childregs; @@ -181,10 +180,11 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  		childregs->flags = X86_EFLAGS_IF | X86_EFLAGS_BIT1;  		return 0;  	} -	*childregs = *regs; +	*childregs = *current_pt_regs();  	childregs->ax = 0; -	childregs->sp = sp; +	if (sp) +		childregs->sp = sp;  	err = -ENOMEM;  	memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps)); diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 5e0596b0632..b629bbe0d9b 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c @@ -23,6 +23,7 @@  #include <linux/hw_breakpoint.h>  #include <linux/rcupdate.h>  #include <linux/module.h> +#include <linux/context_tracking.h>  #include <asm/uaccess.h>  #include <asm/pgtable.h> @@ -1491,7 +1492,7 @@ long syscall_trace_enter(struct pt_regs *regs)  {  	long ret = 0; -	rcu_user_exit(); +	user_exit();  	/*  	 * If we stepped into a sysenter/syscall insn, it trapped in @@ -1541,6 +1542,13 @@ void syscall_trace_leave(struct pt_regs *regs)  {  	bool step; +	/* +	 * We may come here right after calling schedule_user() +	 * or do_notify_resume(), in which case we can be in RCU +	 * user mode. +	 */ +	user_exit(); +  	audit_syscall_exit(regs);  	if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) @@ -1557,5 +1565,5 @@ void syscall_trace_leave(struct pt_regs *regs)  	if (step || test_thread_flag(TIF_SYSCALL_TRACE))  		tracehook_report_syscall_exit(regs, step); -	rcu_user_enter(); +	user_enter();  } diff --git a/arch/x86/kernel/rtc.c b/arch/x86/kernel/rtc.c index 4929c1be0ac..801602b5d74 100644 --- a/arch/x86/kernel/rtc.c +++ b/arch/x86/kernel/rtc.c @@ -195,12 +195,6 @@ void read_persistent_clock(struct timespec *ts)  	ts->tv_nsec = 0;  } -unsigned long long native_read_tsc(void) -{ -	return __native_read_tsc(); -} -EXPORT_SYMBOL(native_read_tsc); -  static struct resource rtc_resources[] = {  	[0] = { diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index 70b27ee6118..fbbb604313a 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c @@ -22,6 +22,7 @@  #include <linux/uaccess.h>  #include <linux/user-return-notifier.h>  #include <linux/uprobes.h> +#include <linux/context_tracking.h>  #include <asm/processor.h>  #include <asm/ucontext.h> @@ -816,7 +817,7 @@ static void do_signal(struct pt_regs *regs)  void  do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)  { -	rcu_user_exit(); +	user_exit();  #ifdef CONFIG_X86_MCE  	/* notify userspace of pending MCEs */ @@ -838,7 +839,7 @@ do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)  	if (thread_info_flags & _TIF_USER_RETURN_NOTIFY)  		fire_user_return_notifiers(); -	rcu_user_enter(); +	user_enter();  }  void signal_fault(struct pt_regs *regs, void __user *frame, char *where) diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index c80a33bc528..ed0fe385289 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -68,6 +68,8 @@  #include <asm/mwait.h>  #include <asm/apic.h>  #include <asm/io_apic.h> +#include <asm/i387.h> +#include <asm/fpu-internal.h>  #include <asm/setup.h>  #include <asm/uv/uv.h>  #include <linux/mc146818rtc.h> @@ -125,8 +127,8 @@ EXPORT_PER_CPU_SYMBOL(cpu_info);  atomic_t init_deasserted;  /* - * Report back to the Boot Processor. - * Running on AP. + * Report back to the Boot Processor during boot time or to the caller processor + * during CPU online.   */  static void __cpuinit smp_callin(void)  { @@ -138,15 +140,17 @@ static void __cpuinit smp_callin(void)  	 * we may get here before an INIT-deassert IPI reaches  	 * our local APIC.  We have to wait for the IPI or we'll  	 * lock up on an APIC access. +	 * +	 * Since CPU0 is not wakened up by INIT, it doesn't wait for the IPI.  	 */ -	if (apic->wait_for_init_deassert) +	cpuid = smp_processor_id(); +	if (apic->wait_for_init_deassert && cpuid != 0)  		apic->wait_for_init_deassert(&init_deasserted);  	/*  	 * (This works even if the APIC is not enabled.)  	 */  	phys_id = read_apic_id(); -	cpuid = smp_processor_id();  	if (cpumask_test_cpu(cpuid, cpu_callin_mask)) {  		panic("%s: phys CPU#%d, CPU#%d already present??\n", __func__,  					phys_id, cpuid); @@ -228,6 +232,8 @@ static void __cpuinit smp_callin(void)  	cpumask_set_cpu(cpuid, cpu_callin_mask);  } +static int cpu0_logical_apicid; +static int enable_start_cpu0;  /*   * Activate a secondary processor.   */ @@ -243,6 +249,8 @@ notrace static void __cpuinit start_secondary(void *unused)  	preempt_disable();  	smp_callin(); +	enable_start_cpu0 = 0; +  #ifdef CONFIG_X86_32  	/* switch away from the initial page table */  	load_cr3(swapper_pg_dir); @@ -279,19 +287,30 @@ notrace static void __cpuinit start_secondary(void *unused)  	cpu_idle();  } +void __init smp_store_boot_cpu_info(void) +{ +	int id = 0; /* CPU 0 */ +	struct cpuinfo_x86 *c = &cpu_data(id); + +	*c = boot_cpu_data; +	c->cpu_index = id; +} +  /*   * The bootstrap kernel entry code has set these up. Save them for   * a given CPU   */ -  void __cpuinit smp_store_cpu_info(int id)  {  	struct cpuinfo_x86 *c = &cpu_data(id);  	*c = boot_cpu_data;  	c->cpu_index = id; -	if (id != 0) -		identify_secondary_cpu(c); +	/* +	 * During boot time, CPU0 has this setup already. Save the info when +	 * bringing up AP or offlined CPU0. +	 */ +	identify_secondary_cpu(c);  }  static bool __cpuinit @@ -313,7 +332,7 @@ do {									\  static bool __cpuinit match_smt(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o)  { -	if (cpu_has(c, X86_FEATURE_TOPOEXT)) { +	if (cpu_has_topoext) {  		int cpu1 = c->cpu_index, cpu2 = o->cpu_index;  		if (c->phys_proc_id == o->phys_proc_id && @@ -481,7 +500,7 @@ void __inquire_remote_apic(int apicid)   * won't ... remember to clear down the APIC, etc later.   */  int __cpuinit -wakeup_secondary_cpu_via_nmi(int logical_apicid, unsigned long start_eip) +wakeup_secondary_cpu_via_nmi(int apicid, unsigned long start_eip)  {  	unsigned long send_status, accept_status = 0;  	int maxlvt; @@ -489,7 +508,7 @@ wakeup_secondary_cpu_via_nmi(int logical_apicid, unsigned long start_eip)  	/* Target chip */  	/* Boot on the stack */  	/* Kick the second */ -	apic_icr_write(APIC_DM_NMI | apic->dest_logical, logical_apicid); +	apic_icr_write(APIC_DM_NMI | apic->dest_logical, apicid);  	pr_debug("Waiting for send to finish...\n");  	send_status = safe_apic_wait_icr_idle(); @@ -649,6 +668,63 @@ static void __cpuinit announce_cpu(int cpu, int apicid)  			node, cpu, apicid);  } +static int wakeup_cpu0_nmi(unsigned int cmd, struct pt_regs *regs) +{ +	int cpu; + +	cpu = smp_processor_id(); +	if (cpu == 0 && !cpu_online(cpu) && enable_start_cpu0) +		return NMI_HANDLED; + +	return NMI_DONE; +} + +/* + * Wake up AP by INIT, INIT, STARTUP sequence. + * + * Instead of waiting for STARTUP after INITs, BSP will execute the BIOS + * boot-strap code which is not a desired behavior for waking up BSP. To + * void the boot-strap code, wake up CPU0 by NMI instead. + * + * This works to wake up soft offlined CPU0 only. If CPU0 is hard offlined + * (i.e. physically hot removed and then hot added), NMI won't wake it up. + * We'll change this code in the future to wake up hard offlined CPU0 if + * real platform and request are available. + */ +static int __cpuinit +wakeup_cpu_via_init_nmi(int cpu, unsigned long start_ip, int apicid, +	       int *cpu0_nmi_registered) +{ +	int id; +	int boot_error; + +	/* +	 * Wake up AP by INIT, INIT, STARTUP sequence. +	 */ +	if (cpu) +		return wakeup_secondary_cpu_via_init(apicid, start_ip); + +	/* +	 * Wake up BSP by nmi. +	 * +	 * Register a NMI handler to help wake up CPU0. +	 */ +	boot_error = register_nmi_handler(NMI_LOCAL, +					  wakeup_cpu0_nmi, 0, "wake_cpu0"); + +	if (!boot_error) { +		enable_start_cpu0 = 1; +		*cpu0_nmi_registered = 1; +		if (apic->dest_logical == APIC_DEST_LOGICAL) +			id = cpu0_logical_apicid; +		else +			id = apicid; +		boot_error = wakeup_secondary_cpu_via_nmi(id, start_ip); +	} + +	return boot_error; +} +  /*   * NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad   * (ie clustered apic addressing mode), this is a LOGICAL apic ID. @@ -664,6 +740,7 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu, struct task_struct *idle)  	unsigned long boot_error = 0;  	int timeout; +	int cpu0_nmi_registered = 0;  	/* Just in case we booted with a single CPU. */  	alternatives_enable_smp(); @@ -711,13 +788,16 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu, struct task_struct *idle)  	}  	/* -	 * Kick the secondary CPU. Use the method in the APIC driver -	 * if it's defined - or use an INIT boot APIC message otherwise: +	 * Wake up a CPU in difference cases: +	 * - Use the method in the APIC driver if it's defined +	 * Otherwise, +	 * - Use an INIT boot APIC message for APs or NMI for BSP.  	 */  	if (apic->wakeup_secondary_cpu)  		boot_error = apic->wakeup_secondary_cpu(apicid, start_ip);  	else -		boot_error = wakeup_secondary_cpu_via_init(apicid, start_ip); +		boot_error = wakeup_cpu_via_init_nmi(cpu, start_ip, apicid, +						     &cpu0_nmi_registered);  	if (!boot_error) {  		/* @@ -782,6 +862,13 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu, struct task_struct *idle)  		 */  		smpboot_restore_warm_reset_vector();  	} +	/* +	 * Clean up the nmi handler. Do this after the callin and callout sync +	 * to avoid impact of possible long unregister time. +	 */ +	if (cpu0_nmi_registered) +		unregister_nmi_handler(NMI_LOCAL, "wake_cpu0"); +  	return boot_error;  } @@ -795,7 +882,7 @@ int __cpuinit native_cpu_up(unsigned int cpu, struct task_struct *tidle)  	pr_debug("++++++++++++++++++++=_---CPU UP  %u\n", cpu); -	if (apicid == BAD_APICID || apicid == boot_cpu_physical_apicid || +	if (apicid == BAD_APICID ||  	    !physid_isset(apicid, phys_cpu_present_map) ||  	    !apic->apic_id_valid(apicid)) {  		pr_err("%s: bad cpu %d\n", __func__, cpu); @@ -818,6 +905,9 @@ int __cpuinit native_cpu_up(unsigned int cpu, struct task_struct *tidle)  	per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; +	/* the FPU context is blank, nobody can own it */ +	__cpu_disable_lazy_restore(cpu); +  	err = do_boot_cpu(apicid, cpu, tidle);  	if (err) {  		pr_debug("do_boot_cpu failed %d\n", err); @@ -990,7 +1080,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)  	/*  	 * Setup boot CPU information  	 */ -	smp_store_cpu_info(0); /* Final full version of the data */ +	smp_store_boot_cpu_info(); /* Final full version of the data */  	cpumask_copy(cpu_callin_mask, cpumask_of(0));  	mb(); @@ -1026,6 +1116,11 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)  	 */  	setup_local_APIC(); +	if (x2apic_mode) +		cpu0_logical_apicid = apic_read(APIC_LDR); +	else +		cpu0_logical_apicid = GET_APIC_LOGICAL_ID(apic_read(APIC_LDR)); +  	/*  	 * Enable IO APIC before setting up error vector  	 */ @@ -1214,19 +1309,6 @@ void cpu_disable_common(void)  int native_cpu_disable(void)  { -	int cpu = smp_processor_id(); - -	/* -	 * Perhaps use cpufreq to drop frequency, but that could go -	 * into generic code. -	 * -	 * We won't take down the boot processor on i386 due to some -	 * interrupts only being able to be serviced by the BSP. -	 * Especially so if we're not using an IOAPIC	-zwane -	 */ -	if (cpu == 0) -		return -EBUSY; -  	clear_local_APIC();  	cpu_disable_common(); @@ -1266,6 +1348,14 @@ void play_dead_common(void)  	local_irq_disable();  } +static bool wakeup_cpu0(void) +{ +	if (smp_processor_id() == 0 && enable_start_cpu0) +		return true; + +	return false; +} +  /*   * We need to flush the caches before going to sleep, lest we have   * dirty data in our caches when we come back up. @@ -1329,6 +1419,11 @@ static inline void mwait_play_dead(void)  		__monitor(mwait_ptr, 0, 0);  		mb();  		__mwait(eax, 0); +		/* +		 * If NMI wants to wake up CPU0, start CPU0. +		 */ +		if (wakeup_cpu0()) +			start_cpu0();  	}  } @@ -1339,6 +1434,11 @@ static inline void hlt_play_dead(void)  	while (1) {  		native_halt(); +		/* +		 * If NMI wants to wake up CPU0, start CPU0. +		 */ +		if (wakeup_cpu0()) +			start_cpu0();  	}  } diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index b4d3c3927dd..97ef74b88e0 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c @@ -21,37 +21,23 @@  /*   * Align a virtual address to avoid aliasing in the I$ on AMD F15h. - * - * @flags denotes the allocation direction - bottomup or topdown - - * or vDSO; see call sites below.   */ -unsigned long align_addr(unsigned long addr, struct file *filp, -			 enum align_flags flags) +static unsigned long get_align_mask(void)  { -	unsigned long tmp_addr; -  	/* handle 32- and 64-bit case with a single conditional */  	if (va_align.flags < 0 || !(va_align.flags & (2 - mmap_is_ia32()))) -		return addr; +		return 0;  	if (!(current->flags & PF_RANDOMIZE)) -		return addr; - -	if (!((flags & ALIGN_VDSO) || filp)) -		return addr; - -	tmp_addr = addr; - -	/* -	 * We need an address which is <= than the original -	 * one only when in topdown direction. -	 */ -	if (!(flags & ALIGN_TOPDOWN)) -		tmp_addr += va_align.mask; +		return 0; -	tmp_addr &= ~va_align.mask; +	return va_align.mask; +} -	return tmp_addr; +unsigned long align_vdso_addr(unsigned long addr) +{ +	unsigned long align_mask = get_align_mask(); +	return (addr + align_mask) & ~align_mask;  }  static int __init control_va_addr_alignment(char *str) @@ -126,7 +112,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,  {  	struct mm_struct *mm = current->mm;  	struct vm_area_struct *vma; -	unsigned long start_addr; +	struct vm_unmapped_area_info info;  	unsigned long begin, end;  	if (flags & MAP_FIXED) @@ -144,50 +130,16 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,  		    (!vma || addr + len <= vma->vm_start))  			return addr;  	} -	if (((flags & MAP_32BIT) || test_thread_flag(TIF_ADDR32)) -	    && len <= mm->cached_hole_size) { -		mm->cached_hole_size = 0; -		mm->free_area_cache = begin; -	} -	addr = mm->free_area_cache; -	if (addr < begin) -		addr = begin; -	start_addr = addr; - -full_search: - -	addr = align_addr(addr, filp, 0); - -	for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { -		/* At this point:  (!vma || addr < vma->vm_end). */ -		if (end - len < addr) { -			/* -			 * Start a new search - just in case we missed -			 * some holes. -			 */ -			if (start_addr != begin) { -				start_addr = addr = begin; -				mm->cached_hole_size = 0; -				goto full_search; -			} -			return -ENOMEM; -		} -		if (!vma || addr + len <= vma->vm_start) { -			/* -			 * Remember the place where we stopped the search: -			 */ -			mm->free_area_cache = addr + len; -			return addr; -		} -		if (addr + mm->cached_hole_size < vma->vm_start) -			mm->cached_hole_size = vma->vm_start - addr; -		addr = vma->vm_end; -		addr = align_addr(addr, filp, 0); -	} +	info.flags = 0; +	info.length = len; +	info.low_limit = begin; +	info.high_limit = end; +	info.align_mask = filp ? get_align_mask() : 0; +	info.align_offset = pgoff << PAGE_SHIFT; +	return vm_unmapped_area(&info);  } -  unsigned long  arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  			  const unsigned long len, const unsigned long pgoff, @@ -195,7 +147,8 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  {  	struct vm_area_struct *vma;  	struct mm_struct *mm = current->mm; -	unsigned long addr = addr0, start_addr; +	unsigned long addr = addr0; +	struct vm_unmapped_area_info info;  	/* requested length too big for entire address space */  	if (len > TASK_SIZE) @@ -217,51 +170,16 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  			return addr;  	} -	/* check if free_area_cache is useful for us */ -	if (len <= mm->cached_hole_size) { -		mm->cached_hole_size = 0; -		mm->free_area_cache = mm->mmap_base; -	} - -try_again: -	/* either no address requested or can't fit in requested address hole */ -	start_addr = addr = mm->free_area_cache; - -	if (addr < len) -		goto fail; - -	addr -= len; -	do { -		addr = align_addr(addr, filp, ALIGN_TOPDOWN); - -		/* -		 * Lookup failure means no vma is above this address, -		 * else if new region fits below vma->vm_start, -		 * return with success: -		 */ -		vma = find_vma(mm, addr); -		if (!vma || addr+len <= vma->vm_start) -			/* remember the address as a hint for next time */ -			return mm->free_area_cache = addr; - -		/* remember the largest hole we saw so far */ -		if (addr + mm->cached_hole_size < vma->vm_start) -			mm->cached_hole_size = vma->vm_start - addr; - -		/* try just below the current vma->vm_start */ -		addr = vma->vm_start-len; -	} while (len < vma->vm_start); - -fail: -	/* -	 * if hint left us with no space for the requested -	 * mapping then try again: -	 */ -	if (start_addr != mm->mmap_base) { -		mm->free_area_cache = mm->mmap_base; -		mm->cached_hole_size = 0; -		goto try_again; -	} +	info.flags = VM_UNMAPPED_AREA_TOPDOWN; +	info.length = len; +	info.low_limit = PAGE_SIZE; +	info.high_limit = mm->mmap_base; +	info.align_mask = filp ? get_align_mask() : 0; +	info.align_offset = pgoff << PAGE_SHIFT; +	addr = vm_unmapped_area(&info); +	if (!(addr & ~PAGE_MASK)) +		return addr; +	VM_BUG_ON(addr != -ENOMEM);  bottomup:  	/* @@ -270,14 +188,5 @@ bottomup:  	 * can happen with large stack limits and large mmap()  	 * allocations.  	 */ -	mm->cached_hole_size = ~0UL; -	mm->free_area_cache = TASK_UNMAPPED_BASE; -	addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags); -	/* -	 * Restore the topdown base: -	 */ -	mm->free_area_cache = mm->mmap_base; -	mm->cached_hole_size = ~0UL; - -	return addr; +	return arch_get_unmapped_area(filp, addr0, len, pgoff, flags);  } diff --git a/arch/x86/kernel/topology.c b/arch/x86/kernel/topology.c index 76ee97709a0..6e60b5fe224 100644 --- a/arch/x86/kernel/topology.c +++ b/arch/x86/kernel/topology.c @@ -30,23 +30,110 @@  #include <linux/mmzone.h>  #include <linux/init.h>  #include <linux/smp.h> +#include <linux/irq.h>  #include <asm/cpu.h>  static DEFINE_PER_CPU(struct x86_cpu, cpu_devices);  #ifdef CONFIG_HOTPLUG_CPU + +#ifdef CONFIG_BOOTPARAM_HOTPLUG_CPU0 +static int cpu0_hotpluggable = 1; +#else +static int cpu0_hotpluggable; +static int __init enable_cpu0_hotplug(char *str) +{ +	cpu0_hotpluggable = 1; +	return 1; +} + +__setup("cpu0_hotplug", enable_cpu0_hotplug); +#endif + +#ifdef CONFIG_DEBUG_HOTPLUG_CPU0 +/* + * This function offlines a CPU as early as possible and allows userspace to + * boot up without the CPU. The CPU can be onlined back by user after boot. + * + * This is only called for debugging CPU offline/online feature. + */ +int __ref _debug_hotplug_cpu(int cpu, int action) +{ +	struct device *dev = get_cpu_device(cpu); +	int ret; + +	if (!cpu_is_hotpluggable(cpu)) +		return -EINVAL; + +	cpu_hotplug_driver_lock(); + +	switch (action) { +	case 0: +		ret = cpu_down(cpu); +		if (!ret) { +			pr_info("CPU %u is now offline\n", cpu); +			kobject_uevent(&dev->kobj, KOBJ_OFFLINE); +		} else +			pr_debug("Can't offline CPU%d.\n", cpu); +		break; +	case 1: +		ret = cpu_up(cpu); +		if (!ret) +			kobject_uevent(&dev->kobj, KOBJ_ONLINE); +		else +			pr_debug("Can't online CPU%d.\n", cpu); +		break; +	default: +		ret = -EINVAL; +	} + +	cpu_hotplug_driver_unlock(); + +	return ret; +} + +static int __init debug_hotplug_cpu(void) +{ +	_debug_hotplug_cpu(0, 0); +	return 0; +} + +late_initcall_sync(debug_hotplug_cpu); +#endif /* CONFIG_DEBUG_HOTPLUG_CPU0 */ +  int __ref arch_register_cpu(int num)  { +	struct cpuinfo_x86 *c = &cpu_data(num); + +	/* +	 * Currently CPU0 is only hotpluggable on Intel platforms. Other +	 * vendors can add hotplug support later. +	 */ +	if (c->x86_vendor != X86_VENDOR_INTEL) +		cpu0_hotpluggable = 0; +  	/* -	 * CPU0 cannot be offlined due to several -	 * restrictions and assumptions in kernel. This basically -	 * doesn't add a control file, one cannot attempt to offline -	 * BSP. +	 * Two known BSP/CPU0 dependencies: Resume from suspend/hibernate +	 * depends on BSP. PIC interrupts depend on BSP.  	 * -	 * Also certain PCI quirks require not to enable hotplug control -	 * for all CPU's. +	 * If the BSP depencies are under control, one can tell kernel to +	 * enable BSP hotplug. This basically adds a control file and +	 * one can attempt to offline BSP.  	 */ -	if (num) +	if (num == 0 && cpu0_hotpluggable) { +		unsigned int irq; +		/* +		 * We won't take down the boot processor on i386 if some +		 * interrupts only are able to be serviced by the BSP in PIC. +		 */ +		for_each_active_irq(irq) { +			if (!IO_APIC_IRQ(irq) && irq_has_action(irq)) { +				cpu0_hotpluggable = 0; +				break; +			} +		} +	} +	if (num || cpu0_hotpluggable)  		per_cpu(cpu_devices, num).cpu.hotpluggable = 1;  	return register_cpu(&per_cpu(cpu_devices, num).cpu, num); diff --git a/arch/x86/kernel/trace_clock.c b/arch/x86/kernel/trace_clock.c new file mode 100644 index 00000000000..25b993729f9 --- /dev/null +++ b/arch/x86/kernel/trace_clock.c @@ -0,0 +1,21 @@ +/* + * X86 trace clocks + */ +#include <asm/trace_clock.h> +#include <asm/barrier.h> +#include <asm/msr.h> + +/* + * trace_clock_x86_tsc(): A clock that is just the cycle counter. + * + * Unlike the other clocks, this is not in nanoseconds. + */ +u64 notrace trace_clock_x86_tsc(void) +{ +	u64 ret; + +	rdtsc_barrier(); +	rdtscll(ret); + +	return ret; +} diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 8276dc6794c..eb8586693e0 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -55,7 +55,7 @@  #include <asm/i387.h>  #include <asm/fpu-internal.h>  #include <asm/mce.h> -#include <asm/rcu.h> +#include <asm/context_tracking.h>  #include <asm/mach_traps.h> diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index cfa5d4f7ca5..06ccb5073a3 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -77,6 +77,12 @@ unsigned long long  sched_clock(void) __attribute__((alias("native_sched_clock")));  #endif +unsigned long long native_read_tsc(void) +{ +	return __native_read_tsc(); +} +EXPORT_SYMBOL(native_read_tsc); +  int check_tsc_unstable(void)  {  	return tsc_unstable; diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c index aafa5557b39..c71025b6746 100644 --- a/arch/x86/kernel/uprobes.c +++ b/arch/x86/kernel/uprobes.c @@ -478,6 +478,11 @@ int arch_uprobe_pre_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)  	regs->ip = current->utask->xol_vaddr;  	pre_xol_rip_insn(auprobe, regs, autask); +	autask->saved_tf = !!(regs->flags & X86_EFLAGS_TF); +	regs->flags |= X86_EFLAGS_TF; +	if (test_tsk_thread_flag(current, TIF_BLOCKSTEP)) +		set_task_blockstep(current, false); +  	return 0;  } @@ -603,6 +608,16 @@ int arch_uprobe_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)  	if (auprobe->fixups & UPROBE_FIX_CALL)  		result = adjust_ret_addr(regs->sp, correction); +	/* +	 * arch_uprobe_pre_xol() doesn't save the state of TIF_BLOCKSTEP +	 * so we can get an extra SIGTRAP if we do not clear TF. We need +	 * to examine the opcode to make it right. +	 */ +	if (utask->autask.saved_tf) +		send_sig(SIGTRAP, current, 0); +	else if (!(auprobe->fixups & UPROBE_FIX_SETF)) +		regs->flags &= ~X86_EFLAGS_TF; +  	return result;  } @@ -647,6 +662,10 @@ void arch_uprobe_abort_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)  	current->thread.trap_nr = utask->autask.saved_trap_nr;  	handle_riprel_post_xol(auprobe, regs, NULL);  	instruction_pointer_set(regs, utask->vaddr); + +	/* clear TF if it was set by us in arch_uprobe_pre_xol() */ +	if (!utask->autask.saved_tf) +		regs->flags &= ~X86_EFLAGS_TF;  }  /* @@ -676,38 +695,3 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)  		send_sig(SIGTRAP, current, 0);  	return ret;  } - -void arch_uprobe_enable_step(struct arch_uprobe *auprobe) -{ -	struct task_struct *task = current; -	struct arch_uprobe_task	*autask	= &task->utask->autask; -	struct pt_regs *regs = task_pt_regs(task); - -	autask->saved_tf = !!(regs->flags & X86_EFLAGS_TF); - -	regs->flags |= X86_EFLAGS_TF; -	if (test_tsk_thread_flag(task, TIF_BLOCKSTEP)) -		set_task_blockstep(task, false); -} - -void arch_uprobe_disable_step(struct arch_uprobe *auprobe) -{ -	struct task_struct *task = current; -	struct arch_uprobe_task	*autask	= &task->utask->autask; -	bool trapped = (task->utask->state == UTASK_SSTEP_TRAPPED); -	struct pt_regs *regs = task_pt_regs(task); -	/* -	 * The state of TIF_BLOCKSTEP was not saved so we can get an extra -	 * SIGTRAP if we do not clear TF. We need to examine the opcode to -	 * make it right. -	 */ -	if (unlikely(trapped)) { -		if (!autask->saved_tf) -			regs->flags &= ~X86_EFLAGS_TF; -	} else { -		if (autask->saved_tf) -			send_sig(SIGTRAP, task, 0); -		else if (!(auprobe->fixups & UPROBE_FIX_SETF)) -			regs->flags &= ~X86_EFLAGS_TF; -	} -} diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 39171cb307e..bba39bfa1c4 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -426,8 +426,7 @@ static void invalidate_registers(struct x86_emulate_ctxt *ctxt)  			_ASM_EXTABLE(1b, 3b)				\  			: "=m" ((ctxt)->eflags), "=&r" (_tmp),		\  			  "+a" (*rax), "+d" (*rdx), "+qm"(_ex)		\ -			: "i" (EFLAGS_MASK), "m" ((ctxt)->src.val),	\ -			  "a" (*rax), "d" (*rdx));			\ +			: "i" (EFLAGS_MASK), "m" ((ctxt)->src.val));	\  	} while (0)  /* instruction has only one source operand, destination is implicit (e.g. mul, div, imul, idiv) */ diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile index b00f6785da7..96b2c6697c9 100644 --- a/arch/x86/lib/Makefile +++ b/arch/x86/lib/Makefile @@ -32,7 +32,6 @@ ifeq ($(CONFIG_X86_32),y)          lib-y += checksum_32.o          lib-y += strstr_32.o          lib-y += string_32.o -        lib-y += cmpxchg.o  ifneq ($(CONFIG_X86_CMPXCHG64),y)          lib-y += cmpxchg8b_emu.o atomic64_386_32.o  endif diff --git a/arch/x86/lib/cmpxchg.c b/arch/x86/lib/cmpxchg.c deleted file mode 100644 index 5d619f6df3e..00000000000 --- a/arch/x86/lib/cmpxchg.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * cmpxchg*() fallbacks for CPU not supporting these instructions - */ - -#include <linux/kernel.h> -#include <linux/smp.h> -#include <linux/module.h> - -#ifndef CONFIG_X86_CMPXCHG -unsigned long cmpxchg_386_u8(volatile void *ptr, u8 old, u8 new) -{ -	u8 prev; -	unsigned long flags; - -	/* Poor man's cmpxchg for 386. Unsuitable for SMP */ -	local_irq_save(flags); -	prev = *(u8 *)ptr; -	if (prev == old) -		*(u8 *)ptr = new; -	local_irq_restore(flags); -	return prev; -} -EXPORT_SYMBOL(cmpxchg_386_u8); - -unsigned long cmpxchg_386_u16(volatile void *ptr, u16 old, u16 new) -{ -	u16 prev; -	unsigned long flags; - -	/* Poor man's cmpxchg for 386. Unsuitable for SMP */ -	local_irq_save(flags); -	prev = *(u16 *)ptr; -	if (prev == old) -		*(u16 *)ptr = new; -	local_irq_restore(flags); -	return prev; -} -EXPORT_SYMBOL(cmpxchg_386_u16); - -unsigned long cmpxchg_386_u32(volatile void *ptr, u32 old, u32 new) -{ -	u32 prev; -	unsigned long flags; - -	/* Poor man's cmpxchg for 386. Unsuitable for SMP */ -	local_irq_save(flags); -	prev = *(u32 *)ptr; -	if (prev == old) -		*(u32 *)ptr = new; -	local_irq_restore(flags); -	return prev; -} -EXPORT_SYMBOL(cmpxchg_386_u32); -#endif diff --git a/arch/x86/lib/copy_page_64.S b/arch/x86/lib/copy_page_64.S index 6b34d04d096..176cca67212 100644 --- a/arch/x86/lib/copy_page_64.S +++ b/arch/x86/lib/copy_page_64.S @@ -5,91 +5,89 @@  #include <asm/alternative-asm.h>  	ALIGN -copy_page_c: +copy_page_rep:  	CFI_STARTPROC -	movl $4096/8,%ecx -	rep movsq +	movl	$4096/8, %ecx +	rep	movsq  	ret  	CFI_ENDPROC -ENDPROC(copy_page_c) +ENDPROC(copy_page_rep) -/* Don't use streaming store because it's better when the target -   ends up in cache. */ -	     -/* Could vary the prefetch distance based on SMP/UP */ +/* + *  Don't use streaming copy unless the CPU indicates X86_FEATURE_REP_GOOD. + *  Could vary the prefetch distance based on SMP/UP. +*/  ENTRY(copy_page)  	CFI_STARTPROC -	subq	$2*8,%rsp +	subq	$2*8,	%rsp  	CFI_ADJUST_CFA_OFFSET 2*8 -	movq	%rbx,(%rsp) +	movq	%rbx,	(%rsp)  	CFI_REL_OFFSET rbx, 0 -	movq	%r12,1*8(%rsp) +	movq	%r12,	1*8(%rsp)  	CFI_REL_OFFSET r12, 1*8 -	movl	$(4096/64)-5,%ecx +	movl	$(4096/64)-5,	%ecx  	.p2align 4  .Loop64: -  	dec     %rcx - -	movq        (%rsi), %rax -	movq      8 (%rsi), %rbx -	movq     16 (%rsi), %rdx -	movq     24 (%rsi), %r8 -	movq     32 (%rsi), %r9 -	movq     40 (%rsi), %r10 -	movq     48 (%rsi), %r11 -	movq     56 (%rsi), %r12 +	dec	%rcx +	movq	0x8*0(%rsi), %rax +	movq	0x8*1(%rsi), %rbx +	movq	0x8*2(%rsi), %rdx +	movq	0x8*3(%rsi), %r8 +	movq	0x8*4(%rsi), %r9 +	movq	0x8*5(%rsi), %r10 +	movq	0x8*6(%rsi), %r11 +	movq	0x8*7(%rsi), %r12  	prefetcht0 5*64(%rsi) -	movq     %rax,    (%rdi) -	movq     %rbx,  8 (%rdi) -	movq     %rdx, 16 (%rdi) -	movq     %r8,  24 (%rdi) -	movq     %r9,  32 (%rdi) -	movq     %r10, 40 (%rdi) -	movq     %r11, 48 (%rdi) -	movq     %r12, 56 (%rdi) +	movq	%rax, 0x8*0(%rdi) +	movq	%rbx, 0x8*1(%rdi) +	movq	%rdx, 0x8*2(%rdi) +	movq	%r8,  0x8*3(%rdi) +	movq	%r9,  0x8*4(%rdi) +	movq	%r10, 0x8*5(%rdi) +	movq	%r11, 0x8*6(%rdi) +	movq	%r12, 0x8*7(%rdi) -	leaq    64 (%rsi), %rsi -	leaq    64 (%rdi), %rdi +	leaq	64 (%rsi), %rsi +	leaq	64 (%rdi), %rdi -	jnz     .Loop64 +	jnz	.Loop64 -	movl	$5,%ecx +	movl	$5, %ecx  	.p2align 4  .Loop2: -	decl   %ecx - -	movq        (%rsi), %rax -	movq      8 (%rsi), %rbx -	movq     16 (%rsi), %rdx -	movq     24 (%rsi), %r8 -	movq     32 (%rsi), %r9 -	movq     40 (%rsi), %r10 -	movq     48 (%rsi), %r11 -	movq     56 (%rsi), %r12 +	decl	%ecx -	movq     %rax,    (%rdi) -	movq     %rbx,  8 (%rdi) -	movq     %rdx, 16 (%rdi) -	movq     %r8,  24 (%rdi) -	movq     %r9,  32 (%rdi) -	movq     %r10, 40 (%rdi) -	movq     %r11, 48 (%rdi) -	movq     %r12, 56 (%rdi) +	movq	0x8*0(%rsi), %rax +	movq	0x8*1(%rsi), %rbx +	movq	0x8*2(%rsi), %rdx +	movq	0x8*3(%rsi), %r8 +	movq	0x8*4(%rsi), %r9 +	movq	0x8*5(%rsi), %r10 +	movq	0x8*6(%rsi), %r11 +	movq	0x8*7(%rsi), %r12 -	leaq	64(%rdi),%rdi -	leaq	64(%rsi),%rsi +	movq	%rax, 0x8*0(%rdi) +	movq	%rbx, 0x8*1(%rdi) +	movq	%rdx, 0x8*2(%rdi) +	movq	%r8,  0x8*3(%rdi) +	movq	%r9,  0x8*4(%rdi) +	movq	%r10, 0x8*5(%rdi) +	movq	%r11, 0x8*6(%rdi) +	movq	%r12, 0x8*7(%rdi) +	leaq	64(%rdi), %rdi +	leaq	64(%rsi), %rsi  	jnz	.Loop2 -	movq	(%rsp),%rbx +	movq	(%rsp), %rbx  	CFI_RESTORE rbx -	movq	1*8(%rsp),%r12 +	movq	1*8(%rsp), %r12  	CFI_RESTORE r12 -	addq	$2*8,%rsp +	addq	$2*8, %rsp  	CFI_ADJUST_CFA_OFFSET -2*8  	ret  .Lcopy_page_end: @@ -103,7 +101,7 @@ ENDPROC(copy_page)  	.section .altinstr_replacement,"ax"  1:	.byte 0xeb					/* jmp <disp8> */ -	.byte (copy_page_c - copy_page) - (2f - 1b)	/* offset */ +	.byte (copy_page_rep - copy_page) - (2f - 1b)	/* offset */  2:  	.previous  	.section .altinstructions,"a" diff --git a/arch/x86/lib/usercopy_32.c b/arch/x86/lib/usercopy_32.c index 98f6d6b68f5..f0312d74640 100644 --- a/arch/x86/lib/usercopy_32.c +++ b/arch/x86/lib/usercopy_32.c @@ -570,63 +570,6 @@ do {									\  unsigned long __copy_to_user_ll(void __user *to, const void *from,  				unsigned long n)  { -#ifndef CONFIG_X86_WP_WORKS_OK -	if (unlikely(boot_cpu_data.wp_works_ok == 0) && -			((unsigned long)to) < TASK_SIZE) { -		/* -		 * When we are in an atomic section (see -		 * mm/filemap.c:file_read_actor), return the full -		 * length to take the slow path. -		 */ -		if (in_atomic()) -			return n; - -		/* -		 * CPU does not honor the WP bit when writing -		 * from supervisory mode, and due to preemption or SMP, -		 * the page tables can change at any time. -		 * Do it manually.	Manfred <manfred@colorfullife.com> -		 */ -		while (n) { -			unsigned long offset = ((unsigned long)to)%PAGE_SIZE; -			unsigned long len = PAGE_SIZE - offset; -			int retval; -			struct page *pg; -			void *maddr; - -			if (len > n) -				len = n; - -survive: -			down_read(¤t->mm->mmap_sem); -			retval = get_user_pages(current, current->mm, -					(unsigned long)to, 1, 1, 0, &pg, NULL); - -			if (retval == -ENOMEM && is_global_init(current)) { -				up_read(¤t->mm->mmap_sem); -				congestion_wait(BLK_RW_ASYNC, HZ/50); -				goto survive; -			} - -			if (retval != 1) { -				up_read(¤t->mm->mmap_sem); -				break; -			} - -			maddr = kmap_atomic(pg); -			memcpy(maddr + offset, from, len); -			kunmap_atomic(maddr); -			set_page_dirty_lock(pg); -			put_page(pg); -			up_read(¤t->mm->mmap_sem); - -			from += len; -			to += len; -			n -= len; -		} -		return n; -	} -#endif  	stac();  	if (movsl_is_ok(to, from, n))  		__copy_user(to, from, n); diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 8e13ecb41be..7a529cbab7a 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -18,7 +18,7 @@  #include <asm/pgalloc.h>		/* pgd_*(), ...			*/  #include <asm/kmemcheck.h>		/* kmemcheck_*(), ...		*/  #include <asm/fixmap.h>			/* VSYSCALL_START		*/ -#include <asm/rcu.h>			/* exception_enter(), ...	*/ +#include <asm/context_tracking.h>	/* exception_enter(), ...	*/  /*   * Page fault error code bits: diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index 937bff5cdaa..ae1aa71d011 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c @@ -274,42 +274,15 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file,  		unsigned long pgoff, unsigned long flags)  {  	struct hstate *h = hstate_file(file); -	struct mm_struct *mm = current->mm; -	struct vm_area_struct *vma; -	unsigned long start_addr; - -	if (len > mm->cached_hole_size) { -	        start_addr = mm->free_area_cache; -	} else { -	        start_addr = TASK_UNMAPPED_BASE; -	        mm->cached_hole_size = 0; -	} - -full_search: -	addr = ALIGN(start_addr, huge_page_size(h)); +	struct vm_unmapped_area_info info; -	for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { -		/* At this point:  (!vma || addr < vma->vm_end). */ -		if (TASK_SIZE - len < addr) { -			/* -			 * Start a new search - just in case we missed -			 * some holes. -			 */ -			if (start_addr != TASK_UNMAPPED_BASE) { -				start_addr = TASK_UNMAPPED_BASE; -				mm->cached_hole_size = 0; -				goto full_search; -			} -			return -ENOMEM; -		} -		if (!vma || addr + len <= vma->vm_start) { -			mm->free_area_cache = addr + len; -			return addr; -		} -		if (addr + mm->cached_hole_size < vma->vm_start) -		        mm->cached_hole_size = vma->vm_start - addr; -		addr = ALIGN(vma->vm_end, huge_page_size(h)); -	} +	info.flags = 0; +	info.length = len; +	info.low_limit = TASK_UNMAPPED_BASE; +	info.high_limit = TASK_SIZE; +	info.align_mask = PAGE_MASK & ~huge_page_mask(h); +	info.align_offset = 0; +	return vm_unmapped_area(&info);  }  static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, @@ -317,83 +290,30 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,  		unsigned long pgoff, unsigned long flags)  {  	struct hstate *h = hstate_file(file); -	struct mm_struct *mm = current->mm; -	struct vm_area_struct *vma; -	unsigned long base = mm->mmap_base; -	unsigned long addr = addr0; -	unsigned long largest_hole = mm->cached_hole_size; -	unsigned long start_addr; - -	/* don't allow allocations above current base */ -	if (mm->free_area_cache > base) -		mm->free_area_cache = base; - -	if (len <= largest_hole) { -	        largest_hole = 0; -		mm->free_area_cache  = base; -	} -try_again: -	start_addr = mm->free_area_cache; - -	/* make sure it can fit in the remaining address space */ -	if (mm->free_area_cache < len) -		goto fail; - -	/* either no address requested or can't fit in requested address hole */ -	addr = (mm->free_area_cache - len) & huge_page_mask(h); -	do { -		/* -		 * Lookup failure means no vma is above this address, -		 * i.e. return with success: -		 */ -		vma = find_vma(mm, addr); -		if (!vma) -			return addr; - -		if (addr + len <= vma->vm_start) { -			/* remember the address as a hint for next time */ -		        mm->cached_hole_size = largest_hole; -		        return (mm->free_area_cache = addr); -		} else if (mm->free_area_cache == vma->vm_end) { -			/* pull free_area_cache down to the first hole */ -			mm->free_area_cache = vma->vm_start; -			mm->cached_hole_size = largest_hole; -		} - -		/* remember the largest hole we saw so far */ -		if (addr + largest_hole < vma->vm_start) -		        largest_hole = vma->vm_start - addr; +	struct vm_unmapped_area_info info; +	unsigned long addr; -		/* try just below the current vma->vm_start */ -		addr = (vma->vm_start - len) & huge_page_mask(h); -	} while (len <= vma->vm_start); +	info.flags = VM_UNMAPPED_AREA_TOPDOWN; +	info.length = len; +	info.low_limit = PAGE_SIZE; +	info.high_limit = current->mm->mmap_base; +	info.align_mask = PAGE_MASK & ~huge_page_mask(h); +	info.align_offset = 0; +	addr = vm_unmapped_area(&info); -fail: -	/* -	 * if hint left us with no space for the requested -	 * mapping then try again: -	 */ -	if (start_addr != base) { -		mm->free_area_cache = base; -		largest_hole = 0; -		goto try_again; -	}  	/*  	 * A failed mmap() very likely causes application failure,  	 * so fall back to the bottom-up function here. This scenario  	 * can happen with large stack limits and large mmap()  	 * allocations.  	 */ -	mm->free_area_cache = TASK_UNMAPPED_BASE; -	mm->cached_hole_size = ~0UL; -	addr = hugetlb_get_unmapped_area_bottomup(file, addr0, -			len, pgoff, flags); - -	/* -	 * Restore the topdown base: -	 */ -	mm->free_area_cache = base; -	mm->cached_hole_size = ~0UL; +	if (addr & ~PAGE_MASK) { +		VM_BUG_ON(addr != -ENOMEM); +		info.flags = 0; +		info.low_limit = TASK_UNMAPPED_BASE; +		info.high_limit = TASK_SIZE; +		addr = vm_unmapped_area(&info); +	}  	return addr;  } diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 11a58001b4c..745d66b843c 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c @@ -715,10 +715,7 @@ static void __init test_wp_bit(void)  	if (!boot_cpu_data.wp_works_ok) {  		printk(KERN_CONT "No.\n"); -#ifdef CONFIG_X86_WP_WORKS_OK -		panic( -  "This kernel doesn't support CPU's with broken WP. Recompile it for a 386!"); -#endif +		panic("Linux doesn't support CPUs with broken WP.");  	} else {  		printk(KERN_CONT "Ok.\n");  	} diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 60f926cd8b0..13a6b29e2e5 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -104,7 +104,7 @@ static void flush_tlb_func(void *info)  		return;  	if (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_OK) { -		if (f->flush_end == TLB_FLUSH_ALL || !cpu_has_invlpg) +		if (f->flush_end == TLB_FLUSH_ALL)  			local_flush_tlb();  		else if (!f->flush_end)  			__flush_tlb_single(f->flush_start); @@ -337,10 +337,8 @@ static const struct file_operations fops_tlbflush = {  static int __cpuinit create_tlb_flushall_shift(void)  { -	if (cpu_has_invlpg) { -		debugfs_create_file("tlb_flushall_shift", S_IRUSR | S_IWUSR, -			arch_debugfs_dir, NULL, &fops_tlbflush); -	} +	debugfs_create_file("tlb_flushall_shift", S_IRUSR | S_IWUSR, +			    arch_debugfs_dir, NULL, &fops_tlbflush);  	return 0;  }  late_initcall(create_tlb_flushall_shift); diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 520d2bd0b9c..d11a47099d3 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -11,6 +11,7 @@  #include <asm/cacheflush.h>  #include <linux/netdevice.h>  #include <linux/filter.h> +#include <linux/if_vlan.h>  /*   * Conventions : @@ -212,6 +213,8 @@ void bpf_jit_compile(struct sk_filter *fp)  		case BPF_S_ANC_MARK:  		case BPF_S_ANC_RXHASH:  		case BPF_S_ANC_CPU: +		case BPF_S_ANC_VLAN_TAG: +		case BPF_S_ANC_VLAN_TAG_PRESENT:  		case BPF_S_ANC_QUEUE:  		case BPF_S_LD_W_ABS:  		case BPF_S_LD_H_ABS: @@ -515,6 +518,24 @@ void bpf_jit_compile(struct sk_filter *fp)  				CLEAR_A();  #endif  				break; +			case BPF_S_ANC_VLAN_TAG: +			case BPF_S_ANC_VLAN_TAG_PRESENT: +				BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, vlan_tci) != 2); +				if (is_imm8(offsetof(struct sk_buff, vlan_tci))) { +					/* movzwl off8(%rdi),%eax */ +					EMIT4(0x0f, 0xb7, 0x47, offsetof(struct sk_buff, vlan_tci)); +				} else { +					EMIT3(0x0f, 0xb7, 0x87); /* movzwl off32(%rdi),%eax */ +					EMIT(offsetof(struct sk_buff, vlan_tci), 4); +				} +				BUILD_BUG_ON(VLAN_TAG_PRESENT != 0x1000); +				if (filter[i].code == BPF_S_ANC_VLAN_TAG) { +					EMIT3(0x80, 0xe4, 0xef); /* and    $0xef,%ah */ +				} else { +					EMIT3(0xc1, 0xe8, 0x0c); /* shr    $0xc,%eax */ +					EMIT3(0x83, 0xe0, 0x01); /* and    $0x1,%eax */ +				} +				break;  			case BPF_S_LD_W_ABS:  				func = CHOOSE_LOAD_FUNC(K, sk_load_word);  common_load:			seen |= SEEN_DATAREF; diff --git a/arch/x86/platform/ce4100/ce4100.c b/arch/x86/platform/ce4100/ce4100.c index 92525cb8e54..f8ab4945892 100644 --- a/arch/x86/platform/ce4100/ce4100.c +++ b/arch/x86/platform/ce4100/ce4100.c @@ -105,8 +105,11 @@ static void ce4100_serial_fixup(int port, struct uart_port *up,  		up->membase =  			(void __iomem *)__fix_to_virt(FIX_EARLYCON_MEM_BASE);  		up->membase += up->mapbase & ~PAGE_MASK; +		up->mapbase += port * 0x100; +		up->membase += port * 0x100;  		up->iotype   = UPIO_MEM32;  		up->regshift = 2; +		up->irq = 4;  	}  #endif  	up->iobase = 0; diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c index 218cdb16163..120cee1c3f8 100644 --- a/arch/x86/power/cpu.c +++ b/arch/x86/power/cpu.c @@ -21,6 +21,7 @@  #include <asm/suspend.h>  #include <asm/debugreg.h>  #include <asm/fpu-internal.h> /* pcntxt_mask */ +#include <asm/cpu.h>  #ifdef CONFIG_X86_32  static struct saved_context saved_context; @@ -237,3 +238,84 @@ void restore_processor_state(void)  #ifdef CONFIG_X86_32  EXPORT_SYMBOL(restore_processor_state);  #endif + +/* + * When bsp_check() is called in hibernate and suspend, cpu hotplug + * is disabled already. So it's unnessary to handle race condition between + * cpumask query and cpu hotplug. + */ +static int bsp_check(void) +{ +	if (cpumask_first(cpu_online_mask) != 0) { +		pr_warn("CPU0 is offline.\n"); +		return -ENODEV; +	} + +	return 0; +} + +static int bsp_pm_callback(struct notifier_block *nb, unsigned long action, +			   void *ptr) +{ +	int ret = 0; + +	switch (action) { +	case PM_SUSPEND_PREPARE: +	case PM_HIBERNATION_PREPARE: +		ret = bsp_check(); +		break; +#ifdef CONFIG_DEBUG_HOTPLUG_CPU0 +	case PM_RESTORE_PREPARE: +		/* +		 * When system resumes from hibernation, online CPU0 because +		 * 1. it's required for resume and +		 * 2. the CPU was online before hibernation +		 */ +		if (!cpu_online(0)) +			_debug_hotplug_cpu(0, 1); +		break; +	case PM_POST_RESTORE: +		/* +		 * When a resume really happens, this code won't be called. +		 * +		 * This code is called only when user space hibernation software +		 * prepares for snapshot device during boot time. So we just +		 * call _debug_hotplug_cpu() to restore to CPU0's state prior to +		 * preparing the snapshot device. +		 * +		 * This works for normal boot case in our CPU0 hotplug debug +		 * mode, i.e. CPU0 is offline and user mode hibernation +		 * software initializes during boot time. +		 * +		 * If CPU0 is online and user application accesses snapshot +		 * device after boot time, this will offline CPU0 and user may +		 * see different CPU0 state before and after accessing +		 * the snapshot device. But hopefully this is not a case when +		 * user debugging CPU0 hotplug. Even if users hit this case, +		 * they can easily online CPU0 back. +		 * +		 * To simplify this debug code, we only consider normal boot +		 * case. Otherwise we need to remember CPU0's state and restore +		 * to that state and resolve racy conditions etc. +		 */ +		_debug_hotplug_cpu(0, 0); +		break; +#endif +	default: +		break; +	} +	return notifier_from_errno(ret); +} + +static int __init bsp_pm_check_init(void) +{ +	/* +	 * Set this bsp_pm_callback as lower priority than +	 * cpu_hotplug_pm_callback. So cpu_hotplug_pm_callback will be called +	 * earlier to disable cpu hotplug before bsp online check. +	 */ +	pm_notifier(bsp_pm_callback, -INT_MAX); +	return 0; +} + +core_initcall(bsp_pm_check_init); diff --git a/arch/x86/syscalls/syscall_32.tbl b/arch/x86/syscalls/syscall_32.tbl index a47103fbc69..ee3c220ee50 100644 --- a/arch/x86/syscalls/syscall_32.tbl +++ b/arch/x86/syscalls/syscall_32.tbl @@ -8,7 +8,7 @@  #  0	i386	restart_syscall		sys_restart_syscall  1	i386	exit			sys_exit -2	i386	fork			ptregs_fork			stub32_fork +2	i386	fork			sys_fork			stub32_fork  3	i386	read			sys_read  4	i386	write			sys_write  5	i386	open			sys_open			compat_sys_open @@ -126,7 +126,7 @@  117	i386	ipc			sys_ipc				sys32_ipc  118	i386	fsync			sys_fsync  119	i386	sigreturn		ptregs_sigreturn		stub32_sigreturn -120	i386	clone			ptregs_clone			stub32_clone +120	i386	clone			sys_clone			stub32_clone  121	i386	setdomainname		sys_setdomainname  122	i386	uname			sys_newuname  123	i386	modify_ldt		sys_modify_ldt @@ -196,7 +196,7 @@  187	i386	sendfile		sys_sendfile			sys32_sendfile  188	i386	getpmsg  189	i386	putpmsg -190	i386	vfork			ptregs_vfork			stub32_vfork +190	i386	vfork			sys_vfork			stub32_vfork  191	i386	ugetrlimit		sys_getrlimit			compat_sys_getrlimit  192	i386	mmap2			sys_mmap_pgoff  193	i386	truncate64		sys_truncate64			sys32_truncate64 diff --git a/arch/x86/tools/gen-insn-attr-x86.awk b/arch/x86/tools/gen-insn-attr-x86.awk index ddcf39b1a18..e6773dc8ac4 100644 --- a/arch/x86/tools/gen-insn-attr-x86.awk +++ b/arch/x86/tools/gen-insn-attr-x86.awk @@ -356,7 +356,7 @@ END {  		exit 1  	# print escape opcode map's array  	print "/* Escape opcode map array */" -	print "const insn_attr_t const *inat_escape_tables[INAT_ESC_MAX + 1]" \ +	print "const insn_attr_t * const inat_escape_tables[INAT_ESC_MAX + 1]" \  	      "[INAT_LSTPFX_MAX + 1] = {"  	for (i = 0; i < geid; i++)  		for (j = 0; j < max_lprefix; j++) @@ -365,7 +365,7 @@ END {  	print "};\n"  	# print group opcode map's array  	print "/* Group opcode map array */" -	print "const insn_attr_t const *inat_group_tables[INAT_GRP_MAX + 1]"\ +	print "const insn_attr_t * const inat_group_tables[INAT_GRP_MAX + 1]"\  	      "[INAT_LSTPFX_MAX + 1] = {"  	for (i = 0; i < ggid; i++)  		for (j = 0; j < max_lprefix; j++) @@ -374,7 +374,7 @@ END {  	print "};\n"  	# print AVX opcode map's array  	print "/* AVX opcode map array */" -	print "const insn_attr_t const *inat_avx_tables[X86_VEX_M_MAX + 1]"\ +	print "const insn_attr_t * const inat_avx_tables[X86_VEX_M_MAX + 1]"\  	      "[INAT_LSTPFX_MAX + 1] = {"  	for (i = 0; i < gaid; i++)  		for (j = 0; j < max_lprefix; j++) diff --git a/arch/x86/um/Kconfig b/arch/x86/um/Kconfig index 07611759ce3..98399704196 100644 --- a/arch/x86/um/Kconfig +++ b/arch/x86/um/Kconfig @@ -25,13 +25,14 @@ config X86_32  	select HAVE_AOUT  	select ARCH_WANT_IPC_PARSE_VERSION  	select MODULES_USE_ELF_REL +	select CLONE_BACKWARDS  config X86_64  	def_bool 64BIT  	select MODULES_USE_ELF_RELA  config RWSEM_XCHGADD_ALGORITHM -	def_bool X86_XADD && 64BIT +	def_bool 64BIT  config RWSEM_GENERIC_SPINLOCK  	def_bool !RWSEM_XCHGADD_ALGORITHM diff --git a/arch/x86/um/shared/sysdep/syscalls.h b/arch/x86/um/shared/sysdep/syscalls.h index ca255a805ed..bd9a89b67e4 100644 --- a/arch/x86/um/shared/sysdep/syscalls.h +++ b/arch/x86/um/shared/sysdep/syscalls.h @@ -1,5 +1,3 @@ -extern long sys_clone(unsigned long clone_flags, unsigned long newsp, -	       void __user *parent_tid, void __user *child_tid);  #ifdef __i386__  #include "syscalls_32.h"  #else diff --git a/arch/x86/um/sys_call_table_32.c b/arch/x86/um/sys_call_table_32.c index 232e60504b3..812e98c098e 100644 --- a/arch/x86/um/sys_call_table_32.c +++ b/arch/x86/um/sys_call_table_32.c @@ -24,13 +24,10 @@  #define old_mmap sys_old_mmap -#define ptregs_fork sys_fork  #define ptregs_iopl sys_iopl  #define ptregs_vm86old sys_vm86old -#define ptregs_clone i386_clone  #define ptregs_vm86 sys_vm86  #define ptregs_sigaltstack sys_sigaltstack -#define ptregs_vfork sys_vfork  #define __SYSCALL_I386(nr, sym, compat) extern asmlinkage void sym(void) ;  #include <asm/syscalls_32.h> diff --git a/arch/x86/um/syscalls_32.c b/arch/x86/um/syscalls_32.c index db444c7218f..e8bcea99acd 100644 --- a/arch/x86/um/syscalls_32.c +++ b/arch/x86/um/syscalls_32.c @@ -6,21 +6,6 @@  #include <linux/syscalls.h>  #include <sysdep/syscalls.h> -/* - * The prototype on i386 is: - * - *     int clone(int flags, void * child_stack, int * parent_tidptr, struct user_desc * newtls - * - * and the "newtls" arg. on i386 is read by copy_thread directly from the - * register saved on the stack. - */ -long i386_clone(unsigned long clone_flags, unsigned long newsp, -		int __user *parent_tid, void *newtls, int __user *child_tid) -{ -	return sys_clone(clone_flags, newsp, parent_tid, child_tid); -} - -  long sys_sigaction(int sig, const struct old_sigaction __user *act,  			 struct old_sigaction __user *oact)  { diff --git a/arch/x86/vdso/vma.c b/arch/x86/vdso/vma.c index 00aaf047b39..431e8754441 100644 --- a/arch/x86/vdso/vma.c +++ b/arch/x86/vdso/vma.c @@ -141,7 +141,7 @@ static unsigned long vdso_addr(unsigned long start, unsigned len)  	 * unaligned here as a result of stack start randomization.  	 */  	addr = PAGE_ALIGN(addr); -	addr = align_addr(addr, NULL, ALIGN_VDSO); +	addr = align_vdso_addr(addr);  	return addr;  } diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig index fdce49c7aff..9a6775c9ddc 100644 --- a/arch/x86/xen/Kconfig +++ b/arch/x86/xen/Kconfig @@ -7,7 +7,7 @@ config XEN  	select PARAVIRT  	select PARAVIRT_CLOCK  	depends on X86_64 || (X86_32 && X86_PAE && !X86_VISWS) -	depends on X86_CMPXCHG && X86_TSC +	depends on X86_TSC  	help  	  This is the Linux Xen port.  Enabling this will allow the  	  kernel to boot in a paravirtualized environment under the diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index 0d1f36a22c9..2481f267be2 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -16,6 +16,7 @@ config XTENSA  	select GENERIC_KERNEL_THREAD  	select GENERIC_KERNEL_EXECVE  	select ARCH_WANT_OPTIONAL_GPIOLIB +	select CLONE_BACKWARDS  	help  	  Xtensa processors are 32-bit RISC machines designed by Tensilica  	  primarily for embedded systems.  These processors are both diff --git a/arch/xtensa/include/asm/Kbuild b/arch/xtensa/include/asm/Kbuild index 6d130278999..095f0a2244f 100644 --- a/arch/xtensa/include/asm/Kbuild +++ b/arch/xtensa/include/asm/Kbuild @@ -25,4 +25,5 @@ generic-y += siginfo.h  generic-y += statfs.h  generic-y += termios.h  generic-y += topology.h +generic-y += trace_clock.h  generic-y += xor.h diff --git a/arch/xtensa/include/asm/signal.h b/arch/xtensa/include/asm/signal.h index 72fd44c85b7..6f586bd90e1 100644 --- a/arch/xtensa/include/asm/signal.h +++ b/arch/xtensa/include/asm/signal.h @@ -27,7 +27,6 @@ struct k_sigaction {  };  #include <asm/sigcontext.h> -#define ptrace_signal_deliver(regs, cookie) do { } while (0)  #endif	/* __ASSEMBLY__ */  #endif	/* _XTENSA_SIGNAL_H */ diff --git a/arch/xtensa/include/asm/syscall.h b/arch/xtensa/include/asm/syscall.h index 124aeee0d38..b00c928d4cc 100644 --- a/arch/xtensa/include/asm/syscall.h +++ b/arch/xtensa/include/asm/syscall.h @@ -10,8 +10,6 @@  struct pt_regs;  struct sigaction; -asmlinkage long sys_execve(char*, char**, char**, struct pt_regs*); -asmlinkage long xtensa_clone(unsigned long, unsigned long, struct pt_regs*);  asmlinkage long xtensa_ptrace(long, long, long, long);  asmlinkage long xtensa_sigreturn(struct pt_regs*);  asmlinkage long xtensa_rt_sigreturn(struct pt_regs*); diff --git a/arch/xtensa/include/asm/unistd.h b/arch/xtensa/include/asm/unistd.h index f4e6eaa40d1..e002dbcc88b 100644 --- a/arch/xtensa/include/asm/unistd.h +++ b/arch/xtensa/include/asm/unistd.h @@ -2,6 +2,7 @@  #define _XTENSA_UNISTD_H  #define __ARCH_WANT_SYS_EXECVE +#define __ARCH_WANT_SYS_CLONE  #include <uapi/asm/unistd.h>  /* diff --git a/arch/xtensa/include/uapi/asm/ioctls.h b/arch/xtensa/include/uapi/asm/ioctls.h index 2aa4cd9f0ce..b4cb1100c0f 100644 --- a/arch/xtensa/include/uapi/asm/ioctls.h +++ b/arch/xtensa/include/uapi/asm/ioctls.h @@ -101,6 +101,9 @@  #define TIOCGDEV	_IOR('T',0x32, unsigned int) /* Get primary device node of /dev/console */  #define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */  #define TIOCVHANGUP	_IO('T', 0x37) +#define TIOCGPKT	_IOR('T', 0x38, int) /* Get packet mode state */ +#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */ +#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */  #define TIOCSERCONFIG	_IO('T', 83)  #define TIOCSERGWILD	_IOR('T', 84,  int) diff --git a/arch/xtensa/include/uapi/asm/mman.h b/arch/xtensa/include/uapi/asm/mman.h index 25bc6c1309c..00eed6786d7 100644 --- a/arch/xtensa/include/uapi/asm/mman.h +++ b/arch/xtensa/include/uapi/asm/mman.h @@ -93,4 +93,15 @@  /* compatibility flags */  #define MAP_FILE	0 +/* + * When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size. + * This gives us 6 bits, which is enough until someone invents 128 bit address + * spaces. + * + * Assume these are all power of twos. + * When 0 use the default page size. + */ +#define MAP_HUGE_SHIFT	26 +#define MAP_HUGE_MASK	0x3f +  #endif /* _XTENSA_MMAN_H */ diff --git a/arch/xtensa/include/uapi/asm/socket.h b/arch/xtensa/include/uapi/asm/socket.h index e36c6818492..38079be1cf1 100644 --- a/arch/xtensa/include/uapi/asm/socket.h +++ b/arch/xtensa/include/uapi/asm/socket.h @@ -52,6 +52,7 @@  #define SO_ATTACH_FILTER        26  #define SO_DETACH_FILTER        27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		28  #define SO_TIMESTAMP		29 diff --git a/arch/xtensa/include/uapi/asm/unistd.h b/arch/xtensa/include/uapi/asm/unistd.h index 9f36d0e3e0a..5162418c5d9 100644 --- a/arch/xtensa/include/uapi/asm/unistd.h +++ b/arch/xtensa/include/uapi/asm/unistd.h @@ -260,7 +260,7 @@ __SYSCALL(115, sys_sendmmsg, 4)  /* Process Operations */  #define __NR_clone 				116 -__SYSCALL(116, xtensa_clone, 5) +__SYSCALL(116, sys_clone, 5)  #define __NR_execve 				117  __SYSCALL(117, sys_execve, 3)  #define __NR_exit 				118 diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c index 09ae7bfab9a..1accf28da5f 100644 --- a/arch/xtensa/kernel/process.c +++ b/arch/xtensa/kernel/process.c @@ -199,8 +199,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)   */  int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn, -		unsigned long thread_fn_arg, -		struct task_struct *p, struct pt_regs *unused) +		unsigned long thread_fn_arg, struct task_struct *p)  {  	struct pt_regs *childregs = task_pt_regs(p); @@ -364,12 +363,3 @@ int dump_fpu(void)  {  	return 0;  } - -asmlinkage -long xtensa_clone(unsigned long clone_flags, unsigned long newsp, -                  void __user *parent_tid, void *child_tls, -                  void __user *child_tid, long a5, -                  struct pt_regs *regs) -{ -        return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); -} diff --git a/arch/xtensa/platforms/iss/console.c b/arch/xtensa/platforms/iss/console.c index 7e74895eee0..8207a119eee 100644 --- a/arch/xtensa/platforms/iss/console.c +++ b/arch/xtensa/platforms/iss/console.c @@ -221,6 +221,7 @@ static __exit void rs_exit(void)  		printk("ISS_SERIAL: failed to unregister serial driver (%d)\n",  		       error);  	put_tty_driver(serial_driver); +	tty_port_destroy(&serial_port);  }  |