diff options
Diffstat (limited to 'arch')
200 files changed, 1228 insertions, 653 deletions
diff --git a/arch/alpha/include/asm/mmzone.h b/arch/alpha/include/asm/mmzone.h index 8af56ce346a..445dc42e033 100644 --- a/arch/alpha/include/asm/mmzone.h +++ b/arch/alpha/include/asm/mmzone.h @@ -56,7 +56,6 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)   * Given a kernel address, find the home node of the underlying memory.   */  #define kvaddr_to_nid(kaddr)	pa_to_nid(__pa(kaddr)) -#define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn)  /*   * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 376f2213079..326f0a2d56e 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -409,7 +409,7 @@ SYSCALL_DEFINE2(osf_getdomainname, char __user *, name, int, namelen)  		return -EFAULT;  	len = namelen; -	if (namelen > 32) +	if (len > 32)  		len = 32;  	down_read(&uts_sem); @@ -594,7 +594,7 @@ SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)  	down_read(&uts_sem);  	res = sysinfo_table[offset];  	len = strlen(res)+1; -	if (len > count) +	if ((unsigned long)len > (unsigned long)count)  		len = count;  	if (copy_to_user(buf, res, len))  		err = -EFAULT; @@ -649,7 +649,7 @@ SYSCALL_DEFINE5(osf_getsysinfo, unsigned long, op, void __user *, buffer,  		return 1;  	case GSI_GET_HWRPB: -		if (nbytes < sizeof(*hwrpb)) +		if (nbytes > sizeof(*hwrpb))  			return -EINVAL;  		if (copy_to_user(buffer, hwrpb, nbytes) != 0)  			return -EFAULT; @@ -1008,6 +1008,7 @@ SYSCALL_DEFINE4(osf_wait4, pid_t, pid, int __user *, ustatus, int, options,  {  	struct rusage r;  	long ret, err; +	unsigned int status = 0;  	mm_segment_t old_fs;  	if (!ur) @@ -1016,13 +1017,15 @@ SYSCALL_DEFINE4(osf_wait4, pid_t, pid, int __user *, ustatus, int, options,  	old_fs = get_fs();  	set_fs (KERNEL_DS); -	ret = sys_wait4(pid, ustatus, options, (struct rusage __user *) &r); +	ret = sys_wait4(pid, (unsigned int __user *) &status, options, +			(struct rusage __user *) &r);  	set_fs (old_fs);  	if (!access_ok(VERIFY_WRITE, ur, sizeof(*ur)))  		return -EFAULT;  	err = 0; +	err |= put_user(status, ustatus);  	err |= __put_user(r.ru_utime.tv_sec, &ur->ru_utime.tv_sec);  	err |= __put_user(r.ru_utime.tv_usec, &ur->ru_utime.tv_usec);  	err |= __put_user(r.ru_stime.tv_sec, &ur->ru_stime.tv_sec); diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index f9da41921c5..940b2017810 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S @@ -597,6 +597,8 @@ __common_mmu_cache_on:  		sub	pc, lr, r0, lsr #32	@ properly flush pipeline  #endif +#define PROC_ENTRY_SIZE (4*5) +  /*   * Here follow the relocatable cache support functions for the   * various processors.  This is a generic hook for locating an @@ -624,7 +626,7 @@ call_cache_fn:	adr	r12, proc_types   ARM(		addeq	pc, r12, r3		) @ call cache function   THUMB(		addeq	r12, r3			)   THUMB(		moveq	pc, r12			) @ call cache function -		add	r12, r12, #4*5 +		add	r12, r12, #PROC_ENTRY_SIZE  		b	1b  /* @@ -691,9 +693,9 @@ proc_types:  		.word	0x41069260		@ ARM926EJ-S (v5TEJ)  		.word	0xff0ffff0 -		b	__arm926ejs_mmu_cache_on -		b	__armv4_mmu_cache_off -		b	__armv5tej_mmu_cache_flush +		W(b)	__arm926ejs_mmu_cache_on +		W(b)	__armv4_mmu_cache_off +		W(b)	__armv5tej_mmu_cache_flush  		.word	0x00007000		@ ARM7 IDs  		.word	0x0000f000 @@ -794,6 +796,16 @@ proc_types:  		.size	proc_types, . - proc_types +		/* +		 * If you get a "non-constant expression in ".if" statement" +		 * error from the assembler on this line, check that you have +		 * not accidentally written a "b" instruction where you should +		 * have written W(b). +		 */ +		.if (. - proc_types) % PROC_ENTRY_SIZE != 0 +		.error "The size of one or more proc_types entries is wrong." +		.endif +  /*   * Turn off the Cache and MMU.  ARMv3 does not support   * reading the control register, but ARMv4 does. diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index e5681636626..841df7d21c2 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c @@ -255,7 +255,7 @@ static inline dma_addr_t map_single(struct device *dev, void *ptr, size_t size,  		if (buf == 0) {  			dev_err(dev, "%s: unable to map unsafe buffer %p!\n",  			       __func__, ptr); -			return 0; +			return ~0;  		}  		dev_dbg(dev, diff --git a/arch/arm/configs/davinci_all_defconfig b/arch/arm/configs/davinci_all_defconfig index 889922ad229..67b5abb6f85 100644 --- a/arch/arm/configs/davinci_all_defconfig +++ b/arch/arm/configs/davinci_all_defconfig @@ -157,7 +157,7 @@ CONFIG_LEDS_GPIO=m  CONFIG_LEDS_TRIGGERS=y  CONFIG_LEDS_TRIGGER_TIMER=m  CONFIG_LEDS_TRIGGER_HEARTBEAT=m -CONFIG_RTC_CLASS=m +CONFIG_RTC_CLASS=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  CONFIG_XFS_FS=m diff --git a/arch/arm/configs/netx_defconfig b/arch/arm/configs/netx_defconfig index 316af5479d9..9c0ad799398 100644 --- a/arch/arm/configs/netx_defconfig +++ b/arch/arm/configs/netx_defconfig @@ -60,7 +60,7 @@ CONFIG_FB_ARMCLCD=y  # CONFIG_VGA_CONSOLE is not set  CONFIG_FRAMEBUFFER_CONSOLE=y  CONFIG_LOGO=y -CONFIG_RTC_CLASS=m +CONFIG_RTC_CLASS=y  CONFIG_INOTIFY=y  CONFIG_TMPFS=y  CONFIG_JFFS2_FS=y diff --git a/arch/arm/configs/viper_defconfig b/arch/arm/configs/viper_defconfig index 8b0c717378f..1d01ddd3312 100644 --- a/arch/arm/configs/viper_defconfig +++ b/arch/arm/configs/viper_defconfig @@ -142,7 +142,7 @@ CONFIG_USB_GADGETFS=m  CONFIG_USB_FILE_STORAGE=m  CONFIG_USB_G_SERIAL=m  CONFIG_USB_G_PRINTER=m -CONFIG_RTC_CLASS=m +CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_DS1307=m  CONFIG_RTC_DRV_SA1100=m  CONFIG_EXT2_FS=m diff --git a/arch/arm/configs/xcep_defconfig b/arch/arm/configs/xcep_defconfig index 5b550414364..721832ffe2d 100644 --- a/arch/arm/configs/xcep_defconfig +++ b/arch/arm/configs/xcep_defconfig @@ -73,7 +73,7 @@ CONFIG_SENSORS_MAX6650=m  # CONFIG_VGA_CONSOLE is not set  # CONFIG_HID_SUPPORT is not set  # CONFIG_USB_SUPPORT is not set -CONFIG_RTC_CLASS=m +CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_SA1100=m  CONFIG_DMADEVICES=y  # CONFIG_DNOTIFY is not set diff --git a/arch/arm/configs/zeus_defconfig b/arch/arm/configs/zeus_defconfig index 960f65514d8..59577ad3f4e 100644 --- a/arch/arm/configs/zeus_defconfig +++ b/arch/arm/configs/zeus_defconfig @@ -158,7 +158,7 @@ CONFIG_LEDS_TRIGGER_HEARTBEAT=m  CONFIG_LEDS_TRIGGER_BACKLIGHT=m  CONFIG_LEDS_TRIGGER_GPIO=m  CONFIG_LEDS_TRIGGER_DEFAULT_ON=m -CONFIG_RTC_CLASS=m +CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_ISL1208=m  CONFIG_RTC_DRV_PXA=m  CONFIG_EXT2_FS=y diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index bc2d2d75f70..65c3f2474f5 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -13,6 +13,9 @@   *  Do not include any C declarations in this file - it is included by   *  assembler source.   */ +#ifndef __ASM_ASSEMBLER_H__ +#define __ASM_ASSEMBLER_H__ +  #ifndef __ASSEMBLY__  #error "Only include this from assembly code"  #endif @@ -290,3 +293,4 @@  	.macro	ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f  	usracc	ldr, \reg, \ptr, \inc, \cond, \rept, \abort  	.endm +#endif /* __ASM_ASSEMBLER_H__ */ diff --git a/arch/arm/include/asm/entry-macro-multi.S b/arch/arm/include/asm/entry-macro-multi.S index ec0bbf79c71..2da8547de6d 100644 --- a/arch/arm/include/asm/entry-macro-multi.S +++ b/arch/arm/include/asm/entry-macro-multi.S @@ -1,3 +1,5 @@ +#include <asm/assembler.h> +  /*   * Interrupt handling.  Preserves r7, r8, r9   */ diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c index a701e4226a6..0cdd7b456cb 100644 --- a/arch/arm/kernel/devtree.c +++ b/arch/arm/kernel/devtree.c @@ -76,6 +76,9 @@ struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)  	unsigned long dt_root;  	const char *model; +	if (!dt_phys) +		return NULL; +  	devtree = phys_to_virt(dt_phys);  	/* check device tree validity */ diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index e8d88567680..90c62cd51ca 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -435,6 +435,10 @@ __irq_usr:  	usr_entry  	kuser_cmpxchg_check +#ifdef CONFIG_IRQSOFF_TRACER +	bl	trace_hardirqs_off +#endif +  	get_thread_info tsk  #ifdef CONFIG_PREEMPT  	ldr	r8, [tsk, #TI_PREEMPT]		@ get preempt count @@ -453,7 +457,7 @@ __irq_usr:  #endif  	mov	why, #0 -	b	ret_to_user +	b	ret_to_user_from_irq   UNWIND(.fnend		)  ENDPROC(__irq_usr) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 1e7b04a40a3..b2a27b6b004 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -64,6 +64,7 @@ work_resched:  ENTRY(ret_to_user)  ret_slow_syscall:  	disable_irq				@ disable interrupts +ENTRY(ret_to_user_from_irq)  	ldr	r1, [tsk, #TI_FLAGS]  	tst	r1, #_TIF_WORK_MASK  	bne	work_pending @@ -75,6 +76,7 @@ no_work_pending:  	arch_ret_to_user r1, lr  	restore_user_regs fast = 0, offset = 0 +ENDPROC(ret_to_user_from_irq)  ENDPROC(ret_to_user)  /* diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c index fee7c36349e..016d6a0830a 100644 --- a/arch/arm/kernel/module.c +++ b/arch/arm/kernel/module.c @@ -193,8 +193,17 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,  				offset -= 0x02000000;  			offset += sym->st_value - loc; -			/* only Thumb addresses allowed (no interworking) */ -			if (!(offset & 1) || +			/* +			 * For function symbols, only Thumb addresses are +			 * allowed (no interworking). +			 * +			 * For non-function symbols, the destination +			 * has no specific ARM/Thumb disposition, so +			 * the branch is resolved under the assumption +			 * that interworking is not required. +			 */ +			if ((ELF32_ST_TYPE(sym->st_info) == STT_FUNC && +				!(offset & 1)) ||  			    offset <= (s32)0xff000000 ||  			    offset >= (s32)0x01000000) {  				pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n", diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index d53c0abc4dd..2b5b1421596 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c @@ -583,7 +583,7 @@ static int armpmu_event_init(struct perf_event *event)  static void armpmu_enable(struct pmu *pmu)  {  	/* Enable all of the perf events on hardware. */ -	int idx; +	int idx, enabled = 0;  	struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);  	if (!armpmu) @@ -596,9 +596,11 @@ static void armpmu_enable(struct pmu *pmu)  			continue;  		armpmu->enable(&event->hw, idx); +		enabled = 1;  	} -	armpmu->start(); +	if (enabled) +		armpmu->start();  }  static void armpmu_disable(struct pmu *pmu) diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index ed11fb08b05..acbb447ac6b 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -73,6 +73,7 @@ __setup("fpe=", fpe_setup);  #endif  extern void paging_init(struct machine_desc *desc); +extern void sanity_check_meminfo(void);  extern void reboot_setup(char *str);  unsigned int processor_id; @@ -900,6 +901,7 @@ void __init setup_arch(char **cmdline_p)  	parse_early_param(); +	sanity_check_meminfo();  	arm_memblock_init(&meminfo, mdesc);  	paging_init(mdesc); diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 344e52b16c8..e7f92a4321f 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -318,9 +318,13 @@ asmlinkage void __cpuinit secondary_start_kernel(void)  	smp_store_cpu_info(cpu);  	/* -	 * OK, now it's safe to let the boot CPU continue +	 * OK, now it's safe to let the boot CPU continue.  Wait for +	 * the CPU migration code to notice that the CPU is online +	 * before we continue.  	 */  	set_cpu_online(cpu, true); +	while (!cpu_active(cpu)) +		cpu_relax();  	/*  	 * OK, it's off to the idle thread for us diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index 60636f499cb..2c277d40cee 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c @@ -115,7 +115,7 @@ static void __cpuinit twd_calibrate_rate(void)  		twd_timer_rate = (0xFFFFFFFFU - count) * (HZ / 5);  		printk("%lu.%02luMHz.\n", twd_timer_rate / 1000000, -			(twd_timer_rate / 1000000) % 100); +			(twd_timer_rate / 10000) % 100);  	}  } diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index d52eec268b4..6807cb1e76d 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -139,7 +139,7 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)  	fs = get_fs();  	set_fs(KERNEL_DS); -	for (i = -4; i < 1; i++) { +	for (i = -4; i < 1 + !!thumb; i++) {  		unsigned int val, bad;  		if (thumb) @@ -563,7 +563,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)  		if (!pmd_present(*pmd))  			goto bad_access;  		pte = pte_offset_map_lock(mm, pmd, addr, &ptl); -		if (!pte_present(*pte) || !pte_dirty(*pte)) { +		if (!pte_present(*pte) || !pte_write(*pte) || !pte_dirty(*pte)) {  			pte_unmap_unlock(pte, ptl);  			goto bad_access;  		} diff --git a/arch/arm/mach-at91/at91cap9.c b/arch/arm/mach-at91/at91cap9.c index 17fae4a42ab..f1013d08bb5 100644 --- a/arch/arm/mach-at91/at91cap9.c +++ b/arch/arm/mach-at91/at91cap9.c @@ -223,15 +223,15 @@ static struct clk *periph_clocks[] __initdata = {  };  static struct clk_lookup periph_clocks_lookups[] = { -	CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), -	CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), +	CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_clk), +	CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk),  	CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk),  	CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk),  	CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),  	CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),  	CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk), -	CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk), -	CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk), +	CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), +	CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),  };  static struct clk_lookup usart_clocks_lookups[] = { diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c index cd850ed6f33..dba0d8d8a4b 100644 --- a/arch/arm/mach-at91/at91cap9_devices.c +++ b/arch/arm/mach-at91/at91cap9_devices.c @@ -1220,7 +1220,7 @@ void __init at91_set_serial_console(unsigned portnr)  {  	if (portnr < ATMEL_MAX_UART) {  		atmel_default_console_device = at91_uarts[portnr]; -		at91cap9_set_console_clock(portnr); +		at91cap9_set_console_clock(at91_uarts[portnr]->id);  	}  } diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index b228ce9e21a..83a1a3fee55 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c @@ -199,9 +199,9 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tc3_clk),  	CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk),  	CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk), -	CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk), -	CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk), -	CLKDEV_CON_DEV_ID("ssc", "ssc.2", &ssc2_clk), +	CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), +	CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), +	CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk),  };  static struct clk_lookup usart_clocks_lookups[] = { diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index a0ba475be04..7227755ffec 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c @@ -1135,7 +1135,7 @@ void __init at91_set_serial_console(unsigned portnr)  {  	if (portnr < ATMEL_MAX_UART) {  		atmel_default_console_device = at91_uarts[portnr]; -		at91rm9200_set_console_clock(portnr); +		at91rm9200_set_console_clock(at91_uarts[portnr]->id);  	}  } diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 1fdeb9058a7..39f81f47b4b 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c @@ -1173,7 +1173,7 @@ void __init at91_set_serial_console(unsigned portnr)  {  	if (portnr < ATMEL_MAX_UART) {  		atmel_default_console_device = at91_uarts[portnr]; -		at91sam9260_set_console_clock(portnr); +		at91sam9260_set_console_clock(at91_uarts[portnr]->id);  	}  } diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 14dd666850b..0f917928eeb 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c @@ -1013,7 +1013,7 @@ void __init at91_set_serial_console(unsigned portnr)  {  	if (portnr < ATMEL_MAX_UART) {  		atmel_default_console_device = at91_uarts[portnr]; -		at91sam9261_set_console_clock(portnr); +		at91sam9261_set_console_clock(at91_uarts[portnr]->id);  	}  } diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index ffe081b77ed..a050f41fc86 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -1395,7 +1395,7 @@ void __init at91_set_serial_console(unsigned portnr)  {  	if (portnr < ATMEL_MAX_UART) {  		atmel_default_console_device = at91_uarts[portnr]; -		at91sam9263_set_console_clock(portnr); +		at91sam9263_set_console_clock(at91_uarts[portnr]->id);  	}  } diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 2bb6ff9af1c..11e214121b2 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c @@ -217,11 +217,11 @@ static struct clk *periph_clocks[] __initdata = {  static struct clk_lookup periph_clocks_lookups[] = {  	/* One additional fake clock for ohci */  	CLKDEV_CON_ID("ohci_clk", &uhphs_clk), -	CLKDEV_CON_DEV_ID("ehci_clk", "atmel-ehci.0", &uhphs_clk), -	CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), -	CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), -	CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk), -	CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk), +	CLKDEV_CON_DEV_ID("ehci_clk", "atmel-ehci", &uhphs_clk), +	CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_clk), +	CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci.0", &mmc0_clk), +	CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci.1", &mmc1_clk),  	CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),  	CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),  	CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb0_clk), diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index 05674865bc2..600bffb01ed 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c @@ -1550,7 +1550,7 @@ void __init at91_set_serial_console(unsigned portnr)  {  	if (portnr < ATMEL_MAX_UART) {  		atmel_default_console_device = at91_uarts[portnr]; -		at91sam9g45_set_console_clock(portnr); +		at91sam9g45_set_console_clock(at91_uarts[portnr]->id);  	}  } diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index 1a40f16b66c..29dff18ed13 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c @@ -191,8 +191,8 @@ static struct clk *periph_clocks[] __initdata = {  };  static struct clk_lookup periph_clocks_lookups[] = { -	CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), -	CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), +	CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_clk), +	CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk),  	CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),  	CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk),  	CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index c296045f2b6..aacb19dc922 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c @@ -1168,7 +1168,7 @@ void __init at91_set_serial_console(unsigned portnr)  {  	if (portnr < ATMEL_MAX_UART) {  		atmel_default_console_device = at91_uarts[portnr]; -		at91sam9rl_set_console_clock(portnr); +		at91sam9rl_set_console_clock(at91_uarts[portnr]->id);  	}  } diff --git a/arch/arm/mach-at91/board-cap9adk.c b/arch/arm/mach-at91/board-cap9adk.c index 1904fdf8761..cdb65d48325 100644 --- a/arch/arm/mach-at91/board-cap9adk.c +++ b/arch/arm/mach-at91/board-cap9adk.c @@ -215,7 +215,7 @@ static void __init cap9adk_add_device_nand(void)  	csa = at91_sys_read(AT91_MATRIX_EBICSA);  	at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_VDDIOMSEL_3_3V); -	cap9adk_nand_data.bus_width_16 = !board_have_nand_8bit(); +	cap9adk_nand_data.bus_width_16 = board_have_nand_16bit();  	/* setup bus-width (8 or 16) */  	if (cap9adk_nand_data.bus_width_16)  		cap9adk_nand_smc_config.mode |= AT91_SMC_DBW_16; diff --git a/arch/arm/mach-at91/board-sam9260ek.c b/arch/arm/mach-at91/board-sam9260ek.c index d600dc12322..5c240743c5b 100644 --- a/arch/arm/mach-at91/board-sam9260ek.c +++ b/arch/arm/mach-at91/board-sam9260ek.c @@ -214,7 +214,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {  static void __init ek_add_device_nand(void)  { -	ek_nand_data.bus_width_16 = !board_have_nand_8bit(); +	ek_nand_data.bus_width_16 = board_have_nand_16bit();  	/* setup bus-width (8 or 16) */  	if (ek_nand_data.bus_width_16)  		ek_nand_smc_config.mode |= AT91_SMC_DBW_16; diff --git a/arch/arm/mach-at91/board-sam9261ek.c b/arch/arm/mach-at91/board-sam9261ek.c index f897f84d43d..b60c22b6e24 100644 --- a/arch/arm/mach-at91/board-sam9261ek.c +++ b/arch/arm/mach-at91/board-sam9261ek.c @@ -220,7 +220,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {  static void __init ek_add_device_nand(void)  { -	ek_nand_data.bus_width_16 = !board_have_nand_8bit(); +	ek_nand_data.bus_width_16 = board_have_nand_16bit();  	/* setup bus-width (8 or 16) */  	if (ek_nand_data.bus_width_16)  		ek_nand_smc_config.mode |= AT91_SMC_DBW_16; diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c index 605b26f40a4..9bbdc92ea19 100644 --- a/arch/arm/mach-at91/board-sam9263ek.c +++ b/arch/arm/mach-at91/board-sam9263ek.c @@ -221,7 +221,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {  static void __init ek_add_device_nand(void)  { -	ek_nand_data.bus_width_16 = !board_have_nand_8bit(); +	ek_nand_data.bus_width_16 = board_have_nand_16bit();  	/* setup bus-width (8 or 16) */  	if (ek_nand_data.bus_width_16)  		ek_nand_smc_config.mode |= AT91_SMC_DBW_16; diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c index 7624cf0d006..1325a50101a 100644 --- a/arch/arm/mach-at91/board-sam9g20ek.c +++ b/arch/arm/mach-at91/board-sam9g20ek.c @@ -198,7 +198,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {  static void __init ek_add_device_nand(void)  { -	ek_nand_data.bus_width_16 = !board_have_nand_8bit(); +	ek_nand_data.bus_width_16 = board_have_nand_16bit();  	/* setup bus-width (8 or 16) */  	if (ek_nand_data.bus_width_16)  		ek_nand_smc_config.mode |= AT91_SMC_DBW_16; diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c index 063c95d0e8f..33eaa135f24 100644 --- a/arch/arm/mach-at91/board-sam9m10g45ek.c +++ b/arch/arm/mach-at91/board-sam9m10g45ek.c @@ -178,7 +178,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {  static void __init ek_add_device_nand(void)  { -	ek_nand_data.bus_width_16 = !board_have_nand_8bit(); +	ek_nand_data.bus_width_16 = board_have_nand_16bit();  	/* setup bus-width (8 or 16) */  	if (ek_nand_data.bus_width_16)  		ek_nand_smc_config.mode |= AT91_SMC_DBW_16; diff --git a/arch/arm/mach-at91/include/mach/system_rev.h b/arch/arm/mach-at91/include/mach/system_rev.h index b855ee75f72..8f4866045b4 100644 --- a/arch/arm/mach-at91/include/mach/system_rev.h +++ b/arch/arm/mach-at91/include/mach/system_rev.h @@ -13,13 +13,13 @@   * the 16-31 bit are reserved for at91 generic information   *   * bit 31: - *	0 => nand 16 bit - *	1 => nand 8 bit + *	0 => nand 8 bit + *	1 => nand 16 bit   */ -#define BOARD_HAVE_NAND_8BIT	(1 << 31) -static int inline board_have_nand_8bit(void) +#define BOARD_HAVE_NAND_16BIT	(1 << 31) +static inline int board_have_nand_16bit(void)  { -	return system_rev & BOARD_HAVE_NAND_8BIT; +	return system_rev & BOARD_HAVE_NAND_16BIT;  }  #endif /* __ARCH_SYSTEM_REV_H__ */ diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c index 4e66881c7ae..fc4e98ea754 100644 --- a/arch/arm/mach-davinci/devices-da8xx.c +++ b/arch/arm/mach-davinci/devices-da8xx.c @@ -494,7 +494,7 @@ static struct platform_device da850_mcasp_device = {  	.resource	= da850_mcasp_resources,  }; -struct platform_device davinci_pcm_device = { +static struct platform_device davinci_pcm_device = {  	.name	= "davinci-pcm-audio",  	.id	= -1,  }; diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c index 8f4f736aa26..806a2f02b98 100644 --- a/arch/arm/mach-davinci/devices.c +++ b/arch/arm/mach-davinci/devices.c @@ -298,7 +298,7 @@ static void davinci_init_wdt(void)  /*-------------------------------------------------------------------------*/ -struct platform_device davinci_pcm_device = { +static struct platform_device davinci_pcm_device = {  	.name		= "davinci-pcm-audio",  	.id		= -1,  }; diff --git a/arch/arm/mach-davinci/gpio.c b/arch/arm/mach-davinci/gpio.c index a0b838894ac..e7221398e5a 100644 --- a/arch/arm/mach-davinci/gpio.c +++ b/arch/arm/mach-davinci/gpio.c @@ -252,9 +252,11 @@ static struct irq_chip gpio_irqchip = {  static void  gpio_irq_handler(unsigned irq, struct irq_desc *desc)  { -	struct davinci_gpio_regs __iomem *g = irq2regs(irq); +	struct davinci_gpio_regs __iomem *g;  	u32 mask = 0xffff; +	g = (__force struct davinci_gpio_regs __iomem *) irq_desc_get_handler_data(desc); +  	/* we only care about one bank */  	if (irq & 1)  		mask <<= 16; @@ -422,8 +424,7 @@ static int __init davinci_gpio_irq_setup(void)  		/* set up all irqs in this bank */  		irq_set_chained_handler(bank_irq, gpio_irq_handler); -		irq_set_chip_data(bank_irq, (__force void *)g); -		irq_set_handler_data(bank_irq, (void *)irq); +		irq_set_handler_data(bank_irq, (__force void *)g);  		for (i = 0; i < 16 && gpio < ngpio; i++, irq++, gpio++) {  			irq_set_chip(irq, &gpio_irqchip); diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index 82079545adc..6659a0d137a 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c @@ -251,9 +251,9 @@ static void ep93xx_uart_set_mctrl(struct amba_device *dev,  	unsigned int mcr;  	mcr = 0; -	if (!(mctrl & TIOCM_RTS)) +	if (mctrl & TIOCM_RTS)  		mcr |= 2; -	if (!(mctrl & TIOCM_DTR)) +	if (mctrl & TIOCM_DTR)  		mcr |= 1;  	__raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET); @@ -402,11 +402,15 @@ static struct resource ep93xx_eth_resource[] = {  	}  }; +static u64 ep93xx_eth_dma_mask = DMA_BIT_MASK(32); +  static struct platform_device ep93xx_eth_device = {  	.name		= "ep93xx-eth",  	.id		= -1,  	.dev		= { -		.platform_data	= &ep93xx_eth_data, +		.platform_data		= &ep93xx_eth_data, +		.coherent_dma_mask	= DMA_BIT_MASK(32), +		.dma_mask		= &ep93xx_eth_dma_mask,  	},  	.num_resources	= ARRAY_SIZE(ep93xx_eth_resource),  	.resource	= ep93xx_eth_resource, diff --git a/arch/arm/mach-exynos4/Kconfig b/arch/arm/mach-exynos4/Kconfig index b92c1e55714..1435fc31c4b 100644 --- a/arch/arm/mach-exynos4/Kconfig +++ b/arch/arm/mach-exynos4/Kconfig @@ -91,6 +91,11 @@ config EXYNOS4_SETUP_FIMC  	help  	  Common setup code for the camera interfaces. +config EXYNOS4_SETUP_USB_PHY +	bool +	help +	  Common setup code for USB PHY controller +  # machine support  menu "EXYNOS4 Machines" @@ -176,6 +181,7 @@ config MACH_NURI  	select EXYNOS4_SETUP_I2C3  	select EXYNOS4_SETUP_I2C5  	select EXYNOS4_SETUP_SDHCI +	select EXYNOS4_SETUP_USB_PHY  	select SAMSUNG_DEV_PWM  	help  	  Machine support for Samsung Mobile NURI Board. diff --git a/arch/arm/mach-exynos4/Makefile b/arch/arm/mach-exynos4/Makefile index a9bb94fabaa..60fe5ecf359 100644 --- a/arch/arm/mach-exynos4/Makefile +++ b/arch/arm/mach-exynos4/Makefile @@ -56,4 +56,4 @@ obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD)	+= setup-keypad.o  obj-$(CONFIG_EXYNOS4_SETUP_SDHCI)	+= setup-sdhci.o  obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO)	+= setup-sdhci-gpio.o -obj-$(CONFIG_USB_SUPPORT)		+= usb-phy.o +obj-$(CONFIG_EXYNOS4_SETUP_USB_PHY)	+= setup-usb-phy.o diff --git a/arch/arm/mach-exynos4/cpu.c b/arch/arm/mach-exynos4/cpu.c index 08813a6f66b..bfd621460ab 100644 --- a/arch/arm/mach-exynos4/cpu.c +++ b/arch/arm/mach-exynos4/cpu.c @@ -23,6 +23,7 @@  #include <plat/sdhci.h>  #include <plat/devs.h>  #include <plat/fimc-core.h> +#include <plat/iic-core.h>  #include <mach/regs-irq.h> @@ -98,7 +99,7 @@ static struct map_desc exynos4_iodesc[] __initdata = {  		.length		= SZ_4K,  		.type		= MT_DEVICE,  	}, { -		.virtual	= (unsigned long)S5P_VA_USB_HSPHY, +		.virtual	= (unsigned long)S3C_VA_USB_HSPHY,  		.pfn		= __phys_to_pfn(EXYNOS4_PA_HSPHY),  		.length		= SZ_4K,  		.type		= MT_DEVICE, @@ -132,6 +133,11 @@ void __init exynos4_map_io(void)  	s3c_fimc_setname(1, "exynos4-fimc");  	s3c_fimc_setname(2, "exynos4-fimc");  	s3c_fimc_setname(3, "exynos4-fimc"); + +	/* The I2C bus controllers are directly compatible with s3c2440 */ +	s3c_i2c0_setname("s3c2440-i2c"); +	s3c_i2c1_setname("s3c2440-i2c"); +	s3c_i2c2_setname("s3c2440-i2c");  }  void __init exynos4_init_clocks(int xtal) diff --git a/arch/arm/mach-exynos4/dev-audio.c b/arch/arm/mach-exynos4/dev-audio.c index 1eed5f9f7bd..983069a5323 100644 --- a/arch/arm/mach-exynos4/dev-audio.c +++ b/arch/arm/mach-exynos4/dev-audio.c @@ -330,7 +330,7 @@ struct platform_device exynos4_device_ac97 = {  static int exynos4_spdif_cfg_gpio(struct platform_device *pdev)  { -	s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(3)); +	s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(4));  	return 0;  } diff --git a/arch/arm/mach-exynos4/headsmp.S b/arch/arm/mach-exynos4/headsmp.S index 6c6cfc50c46..3cdeb364754 100644 --- a/arch/arm/mach-exynos4/headsmp.S +++ b/arch/arm/mach-exynos4/headsmp.S @@ -13,7 +13,7 @@  #include <linux/linkage.h>  #include <linux/init.h> -	__INIT +	__CPUINIT  /*   * exynos4 specific entry point for secondary CPUs.  This provides diff --git a/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h b/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h index 703118d5173..c337cf3a71b 100644 --- a/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h +++ b/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h @@ -11,7 +11,7 @@  #ifndef __PLAT_S5P_REGS_USB_PHY_H  #define __PLAT_S5P_REGS_USB_PHY_H -#define EXYNOS4_HSOTG_PHYREG(x)		((x) + S5P_VA_USB_HSPHY) +#define EXYNOS4_HSOTG_PHYREG(x)		((x) + S3C_VA_USB_HSPHY)  #define EXYNOS4_PHYPWR			EXYNOS4_HSOTG_PHYREG(0x00)  #define PHY1_HSIC_NORMAL_MASK		(0xf << 9) diff --git a/arch/arm/mach-exynos4/init.c b/arch/arm/mach-exynos4/init.c index cf91f50e43a..a8a83e3881a 100644 --- a/arch/arm/mach-exynos4/init.c +++ b/arch/arm/mach-exynos4/init.c @@ -35,6 +35,7 @@ void __init exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)  			tcfg->clocks = exynos4_serial_clocks;  			tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks);  		} +		tcfg->flags |= NO_NEED_CHECK_CLKSRC;  	}  	s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); diff --git a/arch/arm/mach-exynos4/mach-smdkv310.c b/arch/arm/mach-exynos4/mach-smdkv310.c index 152676471b6..edd814110da 100644 --- a/arch/arm/mach-exynos4/mach-smdkv310.c +++ b/arch/arm/mach-exynos4/mach-smdkv310.c @@ -78,9 +78,7 @@ static struct s3c2410_uartcfg smdkv310_uartcfgs[] __initdata = {  };  static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = { -	.cd_type		= S3C_SDHCI_CD_GPIO, -	.ext_cd_gpio		= EXYNOS4_GPK0(2), -	.ext_cd_gpio_invert	= 1, +	.cd_type		= S3C_SDHCI_CD_INTERNAL,  	.clk_type		= S3C_SDHCI_CLK_DIV_EXTERNAL,  #ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT  	.max_width		= 8, @@ -96,9 +94,7 @@ static struct s3c_sdhci_platdata smdkv310_hsmmc1_pdata __initdata = {  };  static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = { -	.cd_type		= S3C_SDHCI_CD_GPIO, -	.ext_cd_gpio		= EXYNOS4_GPK2(2), -	.ext_cd_gpio_invert	= 1, +	.cd_type		= S3C_SDHCI_CD_INTERNAL,  	.clk_type		= S3C_SDHCI_CLK_DIV_EXTERNAL,  #ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT  	.max_width		= 8, diff --git a/arch/arm/mach-exynos4/usb-phy.c b/arch/arm/mach-exynos4/setup-usb-phy.c index 0883c1b824b..0883c1b824b 100644 --- a/arch/arm/mach-exynos4/usb-phy.c +++ b/arch/arm/mach-exynos4/setup-usb-phy.c diff --git a/arch/arm/mach-exynos4/time.c b/arch/arm/mach-exynos4/time.c index 86b9fa0d363..ebb8f38d540 100644 --- a/arch/arm/mach-exynos4/time.c +++ b/arch/arm/mach-exynos4/time.c @@ -206,6 +206,7 @@ static cycle_t exynos4_pwm4_read(struct clocksource *cs)  	return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40));  } +#ifdef CONFIG_PM  static void exynos4_pwm4_resume(struct clocksource *cs)  {  	unsigned long pclk; @@ -218,6 +219,7 @@ static void exynos4_pwm4_resume(struct clocksource *cs)  	exynos4_pwm_init(4, ~0);  	exynos4_pwm_start(4, 1);  } +#endif  struct clocksource pwm_clocksource = {  	.name		= "pwm_timer4", diff --git a/arch/arm/mach-footbridge/dc21285-timer.c b/arch/arm/mach-footbridge/dc21285-timer.c index 5f1f9867fc7..121ad1d4fa3 100644 --- a/arch/arm/mach-footbridge/dc21285-timer.c +++ b/arch/arm/mach-footbridge/dc21285-timer.c @@ -103,6 +103,7 @@ static void __init footbridge_timer_init(void)  	clockevents_calc_mult_shift(ce, mem_fclk_21285, 5);  	ce->max_delta_ns = clockevent_delta2ns(0xffffff, ce);  	ce->min_delta_ns = clockevent_delta2ns(0x000004, ce); +	ce->cpumask = cpumask_of(smp_processor_id());  	clockevents_register_device(ce);  } diff --git a/arch/arm/mach-footbridge/include/mach/debug-macro.S b/arch/arm/mach-footbridge/include/mach/debug-macro.S index 30b971d6581..1be2eeb7a0a 100644 --- a/arch/arm/mach-footbridge/include/mach/debug-macro.S +++ b/arch/arm/mach-footbridge/include/mach/debug-macro.S @@ -26,6 +26,7 @@  #include <asm/hardware/debug-8250.S>  #else +#include <mach/hardware.h>  	/* For EBSA285 debugging */  		.equ	dc21285_high, ARMCSR_BASE & 0xff000000  		.equ	dc21285_low,  ARMCSR_BASE & 0x00ffffff @@ -36,8 +37,8 @@  		.else  		mov	\rp, #0  		.endif -		orr	\rv, \rp, #0x42000000 -		orr	\rp, \rp, #dc21285_high +		orr	\rv, \rp, #dc21285_high +		orr	\rp, \rp, #0x42000000  		.endm  		.macro	senduart,rd,rx diff --git a/arch/arm/mach-h720x/Kconfig b/arch/arm/mach-h720x/Kconfig index 9b6982efbd2..abf356c0234 100644 --- a/arch/arm/mach-h720x/Kconfig +++ b/arch/arm/mach-h720x/Kconfig @@ -6,12 +6,14 @@ config ARCH_H7201  	bool "gms30c7201"  	depends on ARCH_H720X  	select CPU_H7201 +	select ZONE_DMA  	help  	  Say Y here if you are using the Hynix GMS30C7201 Reference Board  config ARCH_H7202  	bool "hms30c7202"  	select CPU_H7202 +	select ZONE_DMA  	depends on ARCH_H720X  	help  	  Say Y here if you are using the Hynix HMS30C7202 Reference Board diff --git a/arch/arm/mach-msm/timer.c b/arch/arm/mach-msm/timer.c index 38b95e949d1..63621f152c9 100644 --- a/arch/arm/mach-msm/timer.c +++ b/arch/arm/mach-msm/timer.c @@ -23,6 +23,8 @@  #include <linux/io.h>  #include <asm/mach/time.h> +#include <asm/hardware/gic.h> +  #include <mach/msm_iomap.h>  #include <mach/cpu.h> @@ -55,10 +57,12 @@ enum timer_location {  #if defined(CONFIG_ARCH_QSD8X50)  #define DGT_HZ (19200000 / 4) /* 19.2 MHz / 4 by default */  #define MSM_DGT_SHIFT (0) -#elif defined(CONFIG_ARCH_MSM7X30) || defined(CONFIG_ARCH_MSM8X60) || \ -				      defined(CONFIG_ARCH_MSM8960) +#elif defined(CONFIG_ARCH_MSM7X30)  #define DGT_HZ (24576000 / 4) /* 24.576 MHz (LPXO) / 4 by default */  #define MSM_DGT_SHIFT (0) +#elif defined(CONFIG_ARCH_MSM8X60) || defined(CONFIG_ARCH_MSM8960) +#define DGT_HZ (27000000 / 4) /* 27 MHz (PXO) / 4 by default */ +#define MSM_DGT_SHIFT (0)  #else  #define DGT_HZ 19200000 /* 19.2 MHz or 600 KHz after shift */  #define MSM_DGT_SHIFT (5) @@ -100,7 +104,11 @@ static cycle_t msm_read_timer_count(struct clocksource *cs)  {  	struct msm_clock *clk = container_of(cs, struct msm_clock, clocksource); -	return readl(clk->global_counter); +	/* +	 * Shift timer count down by a constant due to unreliable lower bits +	 * on some targets. +	 */ +	return readl(clk->global_counter) >> clk->shift;  }  static struct msm_clock *clockevent_to_clock(struct clock_event_device *evt) diff --git a/arch/arm/mach-mxs/ocotp.c b/arch/arm/mach-mxs/ocotp.c index 65157a35dbb..54add60f94c 100644 --- a/arch/arm/mach-mxs/ocotp.c +++ b/arch/arm/mach-mxs/ocotp.c @@ -16,6 +16,8 @@  #include <linux/err.h>  #include <linux/mutex.h> +#include <asm/processor.h>	/* for cpu_relax() */ +  #include <mach/mxs.h>  #define OCOTP_WORD_OFFSET		0x20 diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile index af98117043d..5b114d1558c 100644 --- a/arch/arm/mach-omap1/Makefile +++ b/arch/arm/mach-omap1/Makefile @@ -4,14 +4,14 @@  # Common support  obj-y := io.o id.o sram.o time.o irq.o mux.o flash.o serial.o devices.o dma.o -obj-y += clock.o clock_data.o opp_data.o reset.o +obj-y += clock.o clock_data.o opp_data.o reset.o pm_bus.o  obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o  obj-$(CONFIG_OMAP_32K_TIMER)	+= timer32k.o  # Power Management -obj-$(CONFIG_PM) += pm.o sleep.o pm_bus.o +obj-$(CONFIG_PM) += pm.o sleep.o  # DSP  obj-$(CONFIG_OMAP_MBOX_FWK)	+= mailbox_mach.o diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index de88c9297b6..f49ce85d244 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c @@ -215,7 +215,7 @@ static struct omap_kp_platform_data ams_delta_kp_data __initdata = {  	.delay		= 9,  }; -static struct platform_device ams_delta_kp_device __initdata = { +static struct platform_device ams_delta_kp_device = {  	.name		= "omap-keypad",  	.id		= -1,  	.dev		= { @@ -225,12 +225,12 @@ static struct platform_device ams_delta_kp_device __initdata = {  	.resource	= ams_delta_kp_resources,  }; -static struct platform_device ams_delta_lcd_device __initdata = { +static struct platform_device ams_delta_lcd_device = {  	.name	= "lcd_ams_delta",  	.id	= -1,  }; -static struct platform_device ams_delta_led_device __initdata = { +static struct platform_device ams_delta_led_device = {  	.name	= "ams-delta-led",  	.id	= -1  }; @@ -267,7 +267,7 @@ static struct soc_camera_link ams_delta_iclink = {  	.power		= ams_delta_camera_power,  }; -static struct platform_device ams_delta_camera_device __initdata = { +static struct platform_device ams_delta_camera_device = {  	.name   = "soc-camera-pdrv",  	.id     = 0,  	.dev    = { diff --git a/arch/arm/mach-omap1/gpio15xx.c b/arch/arm/mach-omap1/gpio15xx.c index 04c4b04cf54..364137c2042 100644 --- a/arch/arm/mach-omap1/gpio15xx.c +++ b/arch/arm/mach-omap1/gpio15xx.c @@ -41,7 +41,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = {  	.bank_stride		= 1,  }; -static struct __initdata platform_device omap15xx_mpu_gpio = { +static struct platform_device omap15xx_mpu_gpio = {  	.name           = "omap_gpio",  	.id             = 0,  	.dev            = { @@ -70,7 +70,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_gpio_config = {  	.bank_width		= 16,  }; -static struct __initdata platform_device omap15xx_gpio = { +static struct platform_device omap15xx_gpio = {  	.name           = "omap_gpio",  	.id             = 1,  	.dev            = { diff --git a/arch/arm/mach-omap1/gpio16xx.c b/arch/arm/mach-omap1/gpio16xx.c index 5dd0d4c82b2..293a246e282 100644 --- a/arch/arm/mach-omap1/gpio16xx.c +++ b/arch/arm/mach-omap1/gpio16xx.c @@ -44,7 +44,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = {  	.bank_stride		= 1,  }; -static struct __initdata platform_device omap16xx_mpu_gpio = { +static struct platform_device omap16xx_mpu_gpio = {  	.name           = "omap_gpio",  	.id             = 0,  	.dev            = { @@ -73,7 +73,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = {  	.bank_width		= 16,  }; -static struct __initdata platform_device omap16xx_gpio1 = { +static struct platform_device omap16xx_gpio1 = {  	.name           = "omap_gpio",  	.id             = 1,  	.dev            = { @@ -102,7 +102,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio2_config = {  	.bank_width		= 16,  }; -static struct __initdata platform_device omap16xx_gpio2 = { +static struct platform_device omap16xx_gpio2 = {  	.name           = "omap_gpio",  	.id             = 2,  	.dev            = { @@ -131,7 +131,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio3_config = {  	.bank_width		= 16,  }; -static struct __initdata platform_device omap16xx_gpio3 = { +static struct platform_device omap16xx_gpio3 = {  	.name           = "omap_gpio",  	.id             = 3,  	.dev            = { @@ -160,7 +160,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio4_config = {  	.bank_width		= 16,  }; -static struct __initdata platform_device omap16xx_gpio4 = { +static struct platform_device omap16xx_gpio4 = {  	.name           = "omap_gpio",  	.id             = 4,  	.dev            = { diff --git a/arch/arm/mach-omap1/gpio7xx.c b/arch/arm/mach-omap1/gpio7xx.c index 1204c8b871a..c6ad248d63a 100644 --- a/arch/arm/mach-omap1/gpio7xx.c +++ b/arch/arm/mach-omap1/gpio7xx.c @@ -46,7 +46,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = {  	.bank_stride		= 2,  }; -static struct __initdata platform_device omap7xx_mpu_gpio = { +static struct platform_device omap7xx_mpu_gpio = {  	.name           = "omap_gpio",  	.id             = 0,  	.dev            = { @@ -75,7 +75,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio1_config = {  	.bank_width		= 32,  }; -static struct __initdata platform_device omap7xx_gpio1 = { +static struct platform_device omap7xx_gpio1 = {  	.name           = "omap_gpio",  	.id             = 1,  	.dev            = { @@ -104,7 +104,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio2_config = {  	.bank_width		= 32,  }; -static struct __initdata platform_device omap7xx_gpio2 = { +static struct platform_device omap7xx_gpio2 = {  	.name           = "omap_gpio",  	.id             = 2,  	.dev            = { @@ -133,7 +133,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio3_config = {  	.bank_width		= 32,  }; -static struct __initdata platform_device omap7xx_gpio3 = { +static struct platform_device omap7xx_gpio3 = {  	.name           = "omap_gpio",  	.id             = 3,  	.dev            = { @@ -162,7 +162,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio4_config = {  	.bank_width		= 32,  }; -static struct __initdata platform_device omap7xx_gpio4 = { +static struct platform_device omap7xx_gpio4 = {  	.name           = "omap_gpio",  	.id             = 4,  	.dev            = { @@ -191,7 +191,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio5_config = {  	.bank_width		= 32,  }; -static struct __initdata platform_device omap7xx_gpio5 = { +static struct platform_device omap7xx_gpio5 = {  	.name           = "omap_gpio",  	.id             = 5,  	.dev            = { @@ -220,7 +220,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio6_config = {  	.bank_width		= 32,  }; -static struct __initdata platform_device omap7xx_gpio6 = { +static struct platform_device omap7xx_gpio6 = {  	.name           = "omap_gpio",  	.id             = 6,  	.dev            = { diff --git a/arch/arm/mach-omap1/pm_bus.c b/arch/arm/mach-omap1/pm_bus.c index fe31d933f0e..334fb8871bc 100644 --- a/arch/arm/mach-omap1/pm_bus.c +++ b/arch/arm/mach-omap1/pm_bus.c @@ -56,9 +56,13 @@ static struct dev_power_domain default_power_domain = {  		USE_PLATFORM_PM_SLEEP_OPS  	},  }; +#define OMAP1_PWR_DOMAIN (&default_power_domain) +#else +#define OMAP1_PWR_DOMAIN NULL +#endif /* CONFIG_PM_RUNTIME */  static struct pm_clk_notifier_block platform_bus_notifier = { -	.pwr_domain = &default_power_domain, +	.pwr_domain = OMAP1_PWR_DOMAIN,  	.con_ids = { "ick", "fck", NULL, },  }; @@ -72,4 +76,4 @@ static int __init omap1_pm_runtime_init(void)  	return 0;  }  core_initcall(omap1_pm_runtime_init); -#endif /* CONFIG_PM_RUNTIME */ + diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index 2a0bb4818ca..23f71d40883 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c @@ -84,7 +84,8 @@ static struct mtd_partition omap3pandora_nand_partitions[] = {  static struct omap_nand_platform_data pandora_nand_data = {  	.cs		= 0, -	.devsize	= 1,	/* '0' for 8-bit, '1' for 16-bit device */ +	.devsize	= NAND_BUSWIDTH_16, +	.xfer_type	= NAND_OMAP_PREFETCH_DMA,  	.parts		= omap3pandora_nand_partitions,  	.nr_parts	= ARRAY_SIZE(omap3pandora_nand_partitions),  }; diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index 990366726c5..88bd6f7705f 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c @@ -558,7 +558,7 @@ static struct radio_si4713_platform_data rx51_si4713_data __initdata_or_module =  	.subdev_board_info = &rx51_si4713_board_info,  }; -static struct platform_device rx51_si4713_dev __initdata_or_module = { +static struct platform_device rx51_si4713_dev = {  	.name	= "radio-si4713",  	.id	= -1,  	.dev	= { diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c index a5a83b358dd..e01da45c053 100644 --- a/arch/arm/mach-omap2/pm-debug.c +++ b/arch/arm/mach-omap2/pm-debug.c @@ -189,7 +189,7 @@ static struct dentry *pm_dbg_dir;  static int pm_dbg_init_done; -static int __init pm_dbg_init(void); +static int pm_dbg_init(void);  enum {  	DEBUG_FILE_COUNTERS = 0, @@ -595,7 +595,7 @@ static int option_set(void *data, u64 val)  DEFINE_SIMPLE_ATTRIBUTE(pm_dbg_option_fops, option_get, option_set, "%llu\n"); -static int __init pm_dbg_init(void) +static int pm_dbg_init(void)  {  	int i;  	struct dentry *d; diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c index 7fe74067d85..094279aefe9 100644 --- a/arch/arm/mach-pxa/spitz_pm.c +++ b/arch/arm/mach-pxa/spitz_pm.c @@ -14,6 +14,7 @@  #include <linux/init.h>  #include <linux/kernel.h>  #include <linux/delay.h> +#include <linux/gpio.h>  #include <linux/interrupt.h>  #include <linux/platform_device.h>  #include <linux/apm-emulation.h> diff --git a/arch/arm/mach-s3c2410/Makefile b/arch/arm/mach-s3c2410/Makefile index 0d468e96e83..81695353d8f 100644 --- a/arch/arm/mach-s3c2410/Makefile +++ b/arch/arm/mach-s3c2410/Makefile @@ -10,7 +10,6 @@ obj-n				:=  obj-				:=  obj-$(CONFIG_CPU_S3C2410)	+= s3c2410.o -obj-$(CONFIG_CPU_S3C2410)	+= irq.o  obj-$(CONFIG_CPU_S3C2410_DMA)	+= dma.o  obj-$(CONFIG_CPU_S3C2410_DMA)	+= dma.o  obj-$(CONFIG_S3C2410_PM)	+= pm.o sleep.o diff --git a/arch/arm/mach-s3c2410/irq.c b/arch/arm/mach-s3c2410/irq.c deleted file mode 100644 index 2854129f8cc..00000000000 --- a/arch/arm/mach-s3c2410/irq.c +++ /dev/null @@ -1,34 +0,0 @@ -/* linux/arch/arm/mach-s3c2410/irq.c - * - * Copyright (c) 2006 Simtec Electronics - *	Ben Dooks <ben@simtec.co.uk> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License 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/module.h> -#include <linux/interrupt.h> -#include <linux/ioport.h> -#include <linux/syscore_ops.h> - -#include <plat/cpu.h> -#include <plat/pm.h> - -struct syscore_ops s3c24xx_irq_syscore_ops = { -	.suspend	= s3c24xx_irq_suspend, -	.resume		= s3c24xx_irq_resume, -}; diff --git a/arch/arm/mach-s3c2440/mach-mini2440.c b/arch/arm/mach-s3c2440/mach-mini2440.c index dd3120df09f..fc2dc0b3d4f 100644 --- a/arch/arm/mach-s3c2440/mach-mini2440.c +++ b/arch/arm/mach-s3c2440/mach-mini2440.c @@ -552,7 +552,7 @@ struct mini2440_features_t {  	struct platform_device *optional[8];  }; -static void mini2440_parse_features( +static void __init mini2440_parse_features(  		struct mini2440_features_t * features,  		const char * features_str )  { diff --git a/arch/arm/mach-s3c64xx/dev-spi.c b/arch/arm/mach-s3c64xx/dev-spi.c index 82db072cb83..5e6b42089eb 100644 --- a/arch/arm/mach-s3c64xx/dev-spi.c +++ b/arch/arm/mach-s3c64xx/dev-spi.c @@ -88,6 +88,7 @@ static struct s3c64xx_spi_info s3c64xx_spi0_pdata = {  	.cfg_gpio = s3c64xx_spi_cfg_gpio,  	.fifo_lvl_mask = 0x7f,  	.rx_lvl_offset = 13, +	.tx_st_done = 21,  };  static u64 spi_dmamask = DMA_BIT_MASK(32); @@ -132,6 +133,7 @@ static struct s3c64xx_spi_info s3c64xx_spi1_pdata = {  	.cfg_gpio = s3c64xx_spi_cfg_gpio,  	.fifo_lvl_mask = 0x7f,  	.rx_lvl_offset = 13, +	.tx_st_done = 21,  };  struct platform_device s3c64xx_device_spi1 = { diff --git a/arch/arm/mach-s5p64x0/dev-spi.c b/arch/arm/mach-s5p64x0/dev-spi.c index e78ee18c76e..ac825e82632 100644 --- a/arch/arm/mach-s5p64x0/dev-spi.c +++ b/arch/arm/mach-s5p64x0/dev-spi.c @@ -112,12 +112,14 @@ static struct s3c64xx_spi_info s5p6440_spi0_pdata = {  	.cfg_gpio	= s5p6440_spi_cfg_gpio,  	.fifo_lvl_mask	= 0x1ff,  	.rx_lvl_offset	= 15, +	.tx_st_done	= 25,  };  static struct s3c64xx_spi_info s5p6450_spi0_pdata = {  	.cfg_gpio	= s5p6450_spi_cfg_gpio,  	.fifo_lvl_mask	= 0x1ff,  	.rx_lvl_offset	= 15, +	.tx_st_done	= 25,  };  static u64 spi_dmamask = DMA_BIT_MASK(32); @@ -160,12 +162,14 @@ static struct s3c64xx_spi_info s5p6440_spi1_pdata = {  	.cfg_gpio	= s5p6440_spi_cfg_gpio,  	.fifo_lvl_mask	= 0x7f,  	.rx_lvl_offset	= 15, +	.tx_st_done	= 25,  };  static struct s3c64xx_spi_info s5p6450_spi1_pdata = {  	.cfg_gpio	= s5p6450_spi_cfg_gpio,  	.fifo_lvl_mask	= 0x7f,  	.rx_lvl_offset	= 15, +	.tx_st_done	= 25,  };  struct platform_device s5p64x0_device_spi1 = { diff --git a/arch/arm/mach-s5pc100/dev-spi.c b/arch/arm/mach-s5pc100/dev-spi.c index 57b19794d9b..e5d6c4dceb5 100644 --- a/arch/arm/mach-s5pc100/dev-spi.c +++ b/arch/arm/mach-s5pc100/dev-spi.c @@ -15,6 +15,7 @@  #include <mach/dma.h>  #include <mach/map.h>  #include <mach/spi-clocks.h> +#include <mach/irqs.h>  #include <plat/s3c64xx-spi.h>  #include <plat/gpio-cfg.h> @@ -90,6 +91,7 @@ static struct s3c64xx_spi_info s5pc100_spi0_pdata = {  	.fifo_lvl_mask = 0x7f,  	.rx_lvl_offset = 13,  	.high_speed = 1, +	.tx_st_done = 21,  };  static u64 spi_dmamask = DMA_BIT_MASK(32); @@ -134,6 +136,7 @@ static struct s3c64xx_spi_info s5pc100_spi1_pdata = {  	.fifo_lvl_mask = 0x7f,  	.rx_lvl_offset = 13,  	.high_speed = 1, +	.tx_st_done = 21,  };  struct platform_device s5pc100_device_spi1 = { @@ -176,6 +179,7 @@ static struct s3c64xx_spi_info s5pc100_spi2_pdata = {  	.fifo_lvl_mask = 0x7f,  	.rx_lvl_offset = 13,  	.high_speed = 1, +	.tx_st_done = 21,  };  struct platform_device s5pc100_device_spi2 = { diff --git a/arch/arm/mach-s5pv210/cpufreq.c b/arch/arm/mach-s5pv210/cpufreq.c index 22046e2f53c..153af8b359e 100644 --- a/arch/arm/mach-s5pv210/cpufreq.c +++ b/arch/arm/mach-s5pv210/cpufreq.c @@ -101,12 +101,14 @@ static void s5pv210_set_refresh(enum s5pv210_dmc_port ch, unsigned long freq)  	unsigned long tmp, tmp1;  	void __iomem *reg = NULL; -	if (ch == DMC0) +	if (ch == DMC0) {  		reg = (S5P_VA_DMC0 + 0x30); -	else if (ch == DMC1) +	} else if (ch == DMC1) {  		reg = (S5P_VA_DMC1 + 0x30); -	else +	} else {  		printk(KERN_ERR "Cannot find DMC port\n"); +		return; +	}  	/* Find current DRAM frequency */  	tmp = s5pv210_dram_conf[ch].freq; diff --git a/arch/arm/mach-s5pv210/dev-spi.c b/arch/arm/mach-s5pv210/dev-spi.c index e3249a47e3b..eaf9a7bff7a 100644 --- a/arch/arm/mach-s5pv210/dev-spi.c +++ b/arch/arm/mach-s5pv210/dev-spi.c @@ -85,6 +85,7 @@ static struct s3c64xx_spi_info s5pv210_spi0_pdata = {  	.fifo_lvl_mask = 0x1ff,  	.rx_lvl_offset = 15,  	.high_speed = 1, +	.tx_st_done = 25,  };  static u64 spi_dmamask = DMA_BIT_MASK(32); @@ -129,6 +130,7 @@ static struct s3c64xx_spi_info s5pv210_spi1_pdata = {  	.fifo_lvl_mask = 0x7f,  	.rx_lvl_offset = 15,  	.high_speed = 1, +	.tx_st_done = 25,  };  struct platform_device s5pv210_device_spi1 = { diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index c95258c274c..ce5c2513c6c 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c @@ -381,11 +381,9 @@ void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state)  	gpio_set_value(GPIO_PORT114, state);  } -static struct sh_mobile_sdhi_info sh_sdhi1_platdata = { -	.dma_slave_tx	= SHDMA_SLAVE_SDHI1_TX, -	.dma_slave_rx	= SHDMA_SLAVE_SDHI1_RX, +static struct sh_mobile_sdhi_info sh_sdhi1_info = {  	.tmio_flags	= TMIO_MMC_WRPROTECT_DISABLE, -	.tmio_caps	= MMC_CAP_NONREMOVABLE, +	.tmio_caps	= MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ,  	.tmio_ocr_mask	= MMC_VDD_32_33 | MMC_VDD_33_34,  	.set_pwr	= ag5evm_sdhi1_set_pwr,  }; @@ -415,7 +413,7 @@ static struct platform_device sdhi1_device = {  	.name		= "sh_mobile_sdhi",  	.id		= 1,  	.dev		= { -		.platform_data	= &sh_sdhi1_platdata, +		.platform_data	= &sh_sdhi1_info,  	},  	.num_resources	= ARRAY_SIZE(sdhi1_resources),  	.resource	= sdhi1_resources, diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index 04bc123938f..bb4e084920b 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c @@ -913,7 +913,7 @@ static struct i2c_board_info imx074_info = {  	I2C_BOARD_INFO("imx074", 0x1a),  }; -struct soc_camera_link imx074_link = { +static struct soc_camera_link imx074_link = {  	.bus_id		= 0,  	.board_info	= &imx074_info,  	.i2c_adapter_id	= 0, diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 776f20560e7..3802f2afabe 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c @@ -126,7 +126,7 @@   * ------+--------------------+--------------------+-------   * IRQ0  | ICR1A.IRQ0SA=0010  | SDHI2 card detect  | Low   * IRQ6  | ICR1A.IRQ6SA=0011  | Ether(LAN9220)     | High - * IRQ7  | ICR1A.IRQ7SA=0010  | LCD Tuch Panel     | Low + * IRQ7  | ICR1A.IRQ7SA=0010  | LCD Touch Panel    | Low   * IRQ8  | ICR2A.IRQ8SA=0010  | MMC/SD card detect | Low   * IRQ9  | ICR2A.IRQ9SA=0010  | KEY(TCA6408)       | Low   * IRQ21 | ICR4A.IRQ21SA=0011 | Sensor(ADXL345)    | High @@ -165,10 +165,10 @@   * USB1 can become Host by r8a66597, and become Function by renesas_usbhs.   * But don't select both drivers in same time.   * These uses same IRQ number for request_irq(), and aren't supporting - * IRQF_SHARD / IORESOURCE_IRQ_SHAREABLE. + * IRQF_SHARED / IORESOURCE_IRQ_SHAREABLE.   *   * Actually these are old/new version of USB driver. - * This mean its register will be broken if it supports SHARD IRQ, + * This mean its register will be broken if it supports shared IRQ,   */  /* @@ -562,7 +562,121 @@ out:  		clk_put(hdmi_ick);  } -/* USB1 (Host) */ +/* USBHS0 is connected to CN22 which takes a USB Mini-B plug + * + * The sh7372 SoC has IRQ7 set aside for USBHS0 hotplug, + * but on this particular board IRQ7 is already used by + * the touch screen. This leaves us with software polling. + */ +#define USBHS0_POLL_INTERVAL (HZ * 5) + +struct usbhs_private { +	unsigned int usbphyaddr; +	unsigned int usbcrcaddr; +	struct renesas_usbhs_platform_info info; +	struct delayed_work work; +	struct platform_device *pdev; +}; + +#define usbhs_get_priv(pdev)				\ +	container_of(renesas_usbhs_get_info(pdev),	\ +		     struct usbhs_private, info) + +#define usbhs_is_connected(priv)			\ +	(!((1 << 7) & __raw_readw(priv->usbcrcaddr))) + +static int usbhs_get_vbus(struct platform_device *pdev) +{ +	return usbhs_is_connected(usbhs_get_priv(pdev)); +} + +static void usbhs_phy_reset(struct platform_device *pdev) +{ +	struct usbhs_private *priv = usbhs_get_priv(pdev); + +	/* init phy */ +	__raw_writew(0x8a0a, priv->usbcrcaddr); +} + +static int usbhs0_get_id(struct platform_device *pdev) +{ +	return USBHS_GADGET; +} + +static void usbhs0_work_function(struct work_struct *work) +{ +	struct usbhs_private *priv = container_of(work, struct usbhs_private, +						  work.work); + +	renesas_usbhs_call_notify_hotplug(priv->pdev); +	schedule_delayed_work(&priv->work, USBHS0_POLL_INTERVAL); +} + +static int usbhs0_hardware_init(struct platform_device *pdev) +{ +	struct usbhs_private *priv = usbhs_get_priv(pdev); + +	priv->pdev = pdev; +	INIT_DELAYED_WORK(&priv->work, usbhs0_work_function); +	schedule_delayed_work(&priv->work, USBHS0_POLL_INTERVAL); +	return 0; +} + +static void usbhs0_hardware_exit(struct platform_device *pdev) +{ +	struct usbhs_private *priv = usbhs_get_priv(pdev); + +	cancel_delayed_work_sync(&priv->work); +} + +static struct usbhs_private usbhs0_private = { +	.usbcrcaddr	= 0xe605810c,		/* USBCR2 */ +	.info = { +		.platform_callback = { +			.hardware_init	= usbhs0_hardware_init, +			.hardware_exit	= usbhs0_hardware_exit, +			.phy_reset	= usbhs_phy_reset, +			.get_id		= usbhs0_get_id, +			.get_vbus	= usbhs_get_vbus, +		}, +		.driver_param = { +			.buswait_bwait	= 4, +		}, +	}, +}; + +static struct resource usbhs0_resources[] = { +	[0] = { +		.name	= "USBHS0", +		.start	= 0xe6890000, +		.end	= 0xe68900e6 - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= evt2irq(0x1ca0) /* USB0_USB0I0 */, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device usbhs0_device = { +	.name	= "renesas_usbhs", +	.id	= 0, +	.dev = { +		.platform_data		= &usbhs0_private.info, +	}, +	.num_resources	= ARRAY_SIZE(usbhs0_resources), +	.resource	= usbhs0_resources, +}; + +/* USBHS1 is connected to CN31 which takes a USB Mini-AB plug + * + * Use J30 to select between Host and Function. This setting + * can however not be detected by software. Hotplug of USBHS1 + * is provided via IRQ8. + */ +#define IRQ8 evt2irq(0x0300) + +/* USBHS1 USB Host support via r8a66597_hcd */  static void usb1_host_port_power(int port, int power)  {  	if (!power) /* only power-on is supported for now */ @@ -579,9 +693,9 @@ static struct r8a66597_platdata usb1_host_data = {  static struct resource usb1_host_resources[] = {  	[0] = { -		.name	= "USBHS", -		.start	= 0xE68B0000, -		.end	= 0xE68B00E6 - 1, +		.name	= "USBHS1", +		.start	= 0xe68b0000, +		.end	= 0xe68b00e6 - 1,  		.flags	= IORESOURCE_MEM,  	},  	[1] = { @@ -602,37 +716,14 @@ static struct platform_device usb1_host_device = {  	.resource	= usb1_host_resources,  }; -/* USB1 (Function) */ +/* USBHS1 USB Function support via renesas_usbhs */ +  #define USB_PHY_MODE		(1 << 4)  #define USB_PHY_INT_EN		((1 << 3) | (1 << 2))  #define USB_PHY_ON		(1 << 1)  #define USB_PHY_OFF		(1 << 0)  #define USB_PHY_INT_CLR		(USB_PHY_ON | USB_PHY_OFF) -struct usbhs_private { -	unsigned int irq; -	unsigned int usbphyaddr; -	unsigned int usbcrcaddr; -	struct renesas_usbhs_platform_info info; -}; - -#define usbhs_get_priv(pdev)				\ -	container_of(renesas_usbhs_get_info(pdev),	\ -		     struct usbhs_private, info) - -#define usbhs_is_connected(priv)			\ -	(!((1 << 7) & __raw_readw(priv->usbcrcaddr))) - -static int usbhs1_get_id(struct platform_device *pdev) -{ -	return USBHS_GADGET; -} - -static int usbhs1_get_vbus(struct platform_device *pdev) -{ -	return usbhs_is_connected(usbhs_get_priv(pdev)); -} -  static irqreturn_t usbhs1_interrupt(int irq, void *data)  {  	struct platform_device *pdev = data; @@ -654,12 +745,10 @@ static int usbhs1_hardware_init(struct platform_device *pdev)  	struct usbhs_private *priv = usbhs_get_priv(pdev);  	int ret; -	irq_set_irq_type(priv->irq, IRQ_TYPE_LEVEL_HIGH); -  	/* clear interrupt status */  	__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr); -	ret = request_irq(priv->irq, usbhs1_interrupt, 0, +	ret = request_irq(IRQ8, usbhs1_interrupt, IRQF_TRIGGER_HIGH,  			  dev_name(&pdev->dev), pdev);  	if (ret) {  		dev_err(&pdev->dev, "request_irq err\n"); @@ -679,15 +768,12 @@ static void usbhs1_hardware_exit(struct platform_device *pdev)  	/* clear interrupt status */  	__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr); -	free_irq(priv->irq, pdev); +	free_irq(IRQ8, pdev);  } -static void usbhs1_phy_reset(struct platform_device *pdev) +static int usbhs1_get_id(struct platform_device *pdev)  { -	struct usbhs_private *priv = usbhs_get_priv(pdev); - -	/* init phy */ -	__raw_writew(0x8a0a, priv->usbcrcaddr); +	return USBHS_GADGET;  }  static u32 usbhs1_pipe_cfg[] = { @@ -710,16 +796,15 @@ static u32 usbhs1_pipe_cfg[] = {  };  static struct usbhs_private usbhs1_private = { -	.irq		= evt2irq(0x0300),	/* IRQ8 */ -	.usbphyaddr	= 0xE60581E2,		/* USBPHY1INTAP */ -	.usbcrcaddr	= 0xE6058130,		/* USBCR4 */ +	.usbphyaddr	= 0xe60581e2,		/* USBPHY1INTAP */ +	.usbcrcaddr	= 0xe6058130,		/* USBCR4 */  	.info = {  		.platform_callback = {  			.hardware_init	= usbhs1_hardware_init,  			.hardware_exit	= usbhs1_hardware_exit, -			.phy_reset	= usbhs1_phy_reset,  			.get_id		= usbhs1_get_id, -			.get_vbus	= usbhs1_get_vbus, +			.phy_reset	= usbhs_phy_reset, +			.get_vbus	= usbhs_get_vbus,  		},  		.driver_param = {  			.buswait_bwait	= 4, @@ -731,9 +816,9 @@ static struct usbhs_private usbhs1_private = {  static struct resource usbhs1_resources[] = {  	[0] = { -		.name	= "USBHS", -		.start	= 0xE68B0000, -		.end	= 0xE68B00E6 - 1, +		.name	= "USBHS1", +		.start	= 0xe68b0000, +		.end	= 0xe68b00e6 - 1,  		.flags	= IORESOURCE_MEM,  	},  	[1] = { @@ -752,7 +837,6 @@ static struct platform_device usbhs1_device = {  	.resource	= usbhs1_resources,  }; -  /* LED */  static struct gpio_led mackerel_leds[] = {  	{ @@ -1205,6 +1289,7 @@ static struct platform_device *mackerel_devices[] __initdata = {  	&lcdc_device,  	&usb1_host_device,  	&usbhs1_device, +	&usbhs0_device,  	&leds_device,  	&fsi_device,  	&fsi_ak4643_device, @@ -1301,6 +1386,7 @@ static void __init mackerel_map_io(void)  #define GPIO_PORT9CR	0xE6051009  #define GPIO_PORT10CR	0xE605100A +#define GPIO_PORT167CR	0xE60520A7  #define GPIO_PORT168CR	0xE60520A8  #define SRCR4		0xe61580bc  #define USCCR1		0xE6058144 @@ -1354,17 +1440,17 @@ static void __init mackerel_init(void)  	gpio_request(GPIO_PORT151, NULL); /* LCDDON */  	gpio_direction_output(GPIO_PORT151, 1); -	/* USB enable */ -	gpio_request(GPIO_FN_VBUS0_1,    NULL); -	gpio_request(GPIO_FN_IDIN_1_18,  NULL); -	gpio_request(GPIO_FN_PWEN_1_115, NULL); -	gpio_request(GPIO_FN_OVCN_1_114, NULL); -	gpio_request(GPIO_FN_EXTLP_1,    NULL); -	gpio_request(GPIO_FN_OVCN2_1,    NULL); -	gpio_pull_down(GPIO_PORT168CR); +	/* USBHS0 */ +	gpio_request(GPIO_FN_VBUS0_0, NULL); +	gpio_pull_down(GPIO_PORT168CR); /* VBUS0_0 pull down */ + +	/* USBHS1 */ +	gpio_request(GPIO_FN_VBUS0_1, NULL); +	gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */ +	gpio_request(GPIO_FN_IDIN_1_113, NULL); -	/* setup USB phy */ -	__raw_writew(0x8a0a, 0xE6058130);	/* USBCR4 */ +	/* USB phy tweak to make the r8a66597_hcd host driver work */ +	__raw_writew(0x8a0a, 0xe6058130);       /* USBCR4 */  	/* enable FSI2 port A (ak4643) */  	gpio_request(GPIO_FN_FSIAIBT,	NULL); diff --git a/arch/arm/mach-shmobile/intc-sh73a0.c b/arch/arm/mach-shmobile/intc-sh73a0.c index 5d0e1503ece..a911a60e771 100644 --- a/arch/arm/mach-shmobile/intc-sh73a0.c +++ b/arch/arm/mach-shmobile/intc-sh73a0.c @@ -250,6 +250,11 @@ static irqreturn_t sh73a0_intcs_demux(int irq, void *dev_id)  	return IRQ_HANDLED;  } +static int sh73a0_set_wake(struct irq_data *data, unsigned int on) +{ +	return 0; /* always allow wakeup */ +} +  void __init sh73a0_init_irq(void)  {  	void __iomem *gic_dist_base = __io(0xf0001000); @@ -257,6 +262,7 @@ void __init sh73a0_init_irq(void)  	void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE);  	gic_init(0, 29, gic_dist_base, gic_cpu_base); +	gic_arch_extn.irq_set_wake = sh73a0_set_wake;  	register_intc_controller(&intcs_desc); diff --git a/arch/arm/mach-shmobile/setup-sh7367.c b/arch/arm/mach-shmobile/setup-sh7367.c index 2c10190dbb5..e546017f15d 100644 --- a/arch/arm/mach-shmobile/setup-sh7367.c +++ b/arch/arm/mach-shmobile/setup-sh7367.c @@ -38,7 +38,7 @@ static struct plat_sci_port scif0_platform_data = {  	.flags		= UPF_BOOT_AUTOCONF,  	.scscr		= SCSCR_RE | SCSCR_TE,  	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIF, +	.type		= PORT_SCIFA,  	.irqs		= { evt2irq(0xc00), evt2irq(0xc00),  			    evt2irq(0xc00), evt2irq(0xc00) },  }; @@ -57,7 +57,7 @@ static struct plat_sci_port scif1_platform_data = {  	.flags		= UPF_BOOT_AUTOCONF,  	.scscr		= SCSCR_RE | SCSCR_TE,  	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIF, +	.type		= PORT_SCIFA,  	.irqs		= { evt2irq(0xc20), evt2irq(0xc20),  			    evt2irq(0xc20), evt2irq(0xc20) },  }; @@ -76,7 +76,7 @@ static struct plat_sci_port scif2_platform_data = {  	.flags		= UPF_BOOT_AUTOCONF,  	.scscr		= SCSCR_RE | SCSCR_TE,  	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIF, +	.type		= PORT_SCIFA,  	.irqs		= { evt2irq(0xc40), evt2irq(0xc40),  			    evt2irq(0xc40), evt2irq(0xc40) },  }; @@ -95,7 +95,7 @@ static struct plat_sci_port scif3_platform_data = {  	.flags		= UPF_BOOT_AUTOCONF,  	.scscr		= SCSCR_RE | SCSCR_TE,  	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIF, +	.type		= PORT_SCIFA,  	.irqs		= { evt2irq(0xc60), evt2irq(0xc60),  			    evt2irq(0xc60), evt2irq(0xc60) },  }; @@ -114,7 +114,7 @@ static struct plat_sci_port scif4_platform_data = {  	.flags		= UPF_BOOT_AUTOCONF,  	.scscr		= SCSCR_RE | SCSCR_TE,  	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIF, +	.type		= PORT_SCIFA,  	.irqs		= { evt2irq(0xd20), evt2irq(0xd20),  			    evt2irq(0xd20), evt2irq(0xd20) },  }; @@ -133,7 +133,7 @@ static struct plat_sci_port scif5_platform_data = {  	.flags		= UPF_BOOT_AUTOCONF,  	.scscr		= SCSCR_RE | SCSCR_TE,  	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIF, +	.type		= PORT_SCIFA,  	.irqs		= { evt2irq(0xd40), evt2irq(0xd40),  			    evt2irq(0xd40), evt2irq(0xd40) },  }; @@ -152,7 +152,7 @@ static struct plat_sci_port scif6_platform_data = {  	.flags		= UPF_BOOT_AUTOCONF,  	.scscr		= SCSCR_RE | SCSCR_TE,  	.scbrr_algo_id	= SCBRR_ALGO_4, -	.type		= PORT_SCIF, +	.type		= PORT_SCIFB,  	.irqs		= { evt2irq(0xd60), evt2irq(0xd60),  			    evt2irq(0xd60), evt2irq(0xd60) },  }; diff --git a/arch/arm/mach-u300/clock.h b/arch/arm/mach-u300/clock.h index c34f3ea3017..4f50ca8f901 100644 --- a/arch/arm/mach-u300/clock.h +++ b/arch/arm/mach-u300/clock.h @@ -31,7 +31,7 @@ struct clk {  	bool reset;  	__u16 clk_val;  	__s8 usecount; -	__u32 res_reg; +	void __iomem * res_reg;  	__u16 res_mask;  	bool hw_ctrld; diff --git a/arch/arm/mach-u300/include/mach/u300-regs.h b/arch/arm/mach-u300/include/mach/u300-regs.h index 8b85df4c8d8..035fdc9dbdb 100644 --- a/arch/arm/mach-u300/include/mach/u300-regs.h +++ b/arch/arm/mach-u300/include/mach/u300-regs.h @@ -18,6 +18,12 @@   * the defines are used for setting up the I/O memory mapping.   */ +#ifdef __ASSEMBLER__ +#define IOMEM(a) (a) +#else +#define IOMEM(a) (void __iomem *) a +#endif +  /* NAND Flash CS0 */  #define U300_NAND_CS0_PHYS_BASE		0x80000000 @@ -48,13 +54,6 @@  #endif  /* - * All the following peripherals are specified at their PHYSICAL address, - * so if you need to access them (in the kernel), you MUST use the macros - * defined in <asm/io.h> to map to the IO_ADDRESS_AHB() IO_ADDRESS_FAST() - * etc. - */ - -/*   * AHB peripherals   */ @@ -63,11 +62,11 @@  /* Vectored Interrupt Controller 0, servicing 32 interrupts */  #define U300_INTCON0_BASE		(U300_AHB_PER_PHYS_BASE+0x1000) -#define U300_INTCON0_VBASE		(U300_AHB_PER_VIRT_BASE+0x1000) +#define U300_INTCON0_VBASE		IOMEM(U300_AHB_PER_VIRT_BASE+0x1000)  /* Vectored Interrupt Controller 1, servicing 32 interrupts */  #define U300_INTCON1_BASE		(U300_AHB_PER_PHYS_BASE+0x2000) -#define U300_INTCON1_VBASE		(U300_AHB_PER_VIRT_BASE+0x2000) +#define U300_INTCON1_VBASE		IOMEM(U300_AHB_PER_VIRT_BASE+0x2000)  /* Memory Stick Pro (MSPRO) controller */  #define U300_MSPRO_BASE			(U300_AHB_PER_PHYS_BASE+0x3000) @@ -115,7 +114,7 @@  /* SYSCON */  #define U300_SYSCON_BASE		(U300_SLOW_PER_PHYS_BASE+0x1000) -#define U300_SYSCON_VBASE		(U300_SLOW_PER_VIRT_BASE+0x1000) +#define U300_SYSCON_VBASE		IOMEM(U300_SLOW_PER_VIRT_BASE+0x1000)  /* Watchdog */  #define U300_WDOG_BASE			(U300_SLOW_PER_PHYS_BASE+0x2000) @@ -125,7 +124,7 @@  /* APP side special timer */  #define U300_TIMER_APP_BASE		(U300_SLOW_PER_PHYS_BASE+0x4000) -#define U300_TIMER_APP_VBASE		(U300_SLOW_PER_VIRT_BASE+0x4000) +#define U300_TIMER_APP_VBASE		IOMEM(U300_SLOW_PER_VIRT_BASE+0x4000)  /* Keypad */  #define U300_KEYPAD_BASE		(U300_SLOW_PER_PHYS_BASE+0x5000) @@ -181,5 +180,4 @@   * Virtual accessor macros for static devices   */ -  #endif diff --git a/arch/arm/mach-u300/timer.c b/arch/arm/mach-u300/timer.c index 891cf44591e..18d7fa0603c 100644 --- a/arch/arm/mach-u300/timer.c +++ b/arch/arm/mach-u300/timer.c @@ -411,8 +411,7 @@ static void __init u300_timer_init(void)  	/* Use general purpose timer 2 as clock source */  	if (clocksource_mmio_init(U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT2CC,  			"GPT2", rate, 300, 32, clocksource_mmio_readl_up)) -		printk(KERN_ERR "timer: failed to initialize clock " -		       "source %s\n", clocksource_u300_1mhz.name); +		pr_err("timer: failed to initialize U300 clock source\n");  	clockevents_calc_mult_shift(&clockevent_u300_1mhz,  				    rate, APPTIMER_MIN_RANGE); diff --git a/arch/arm/mach-ux500/board-mop500-pins.c b/arch/arm/mach-ux500/board-mop500-pins.c index fd4cf1ca5ef..70cdbd60596 100644 --- a/arch/arm/mach-ux500/board-mop500-pins.c +++ b/arch/arm/mach-ux500/board-mop500-pins.c @@ -110,10 +110,18 @@ static pin_cfg_t mop500_pins_common[] = {  	GPIO168_KP_O0,  	/* UART */ -	GPIO0_U0_CTSn	| PIN_INPUT_PULLUP, -	GPIO1_U0_RTSn	| PIN_OUTPUT_HIGH, -	GPIO2_U0_RXD	| PIN_INPUT_PULLUP, -	GPIO3_U0_TXD	| PIN_OUTPUT_HIGH, +	/* uart-0 pins gpio configuration should be +	 * kept intact to prevent glitch in tx line +	 * when tty dev is opened. Later these pins +	 * are configured to uart mop500_pins_uart0 +	 * +	 * It will be replaced with uart configuration +	 * once the issue is solved. +	 */ +	GPIO0_GPIO	| PIN_INPUT_PULLUP, +	GPIO1_GPIO	| PIN_OUTPUT_HIGH, +	GPIO2_GPIO	| PIN_INPUT_PULLUP, +	GPIO3_GPIO	| PIN_OUTPUT_HIGH,  	GPIO29_U2_RXD	| PIN_INPUT_PULLUP,  	GPIO30_U2_TXD	| PIN_OUTPUT_HIGH, diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index bb26f40493e..2a08c07dec6 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -27,18 +27,21 @@  #include <linux/leds-lp5521.h>  #include <linux/input.h>  #include <linux/gpio_keys.h> +#include <linux/delay.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <plat/i2c.h>  #include <plat/ste_dma40.h> +#include <plat/pincfg.h>  #include <mach/hardware.h>  #include <mach/setup.h>  #include <mach/devices.h>  #include <mach/irqs.h> +#include "pins-db8500.h"  #include "ste-dma40-db8500.h"  #include "devices-db8500.h"  #include "board-mop500.h" @@ -393,12 +396,63 @@ static struct stedma40_chan_cfg uart2_dma_cfg_tx = {  };  #endif + +static pin_cfg_t mop500_pins_uart0[] = { +	GPIO0_U0_CTSn   | PIN_INPUT_PULLUP, +	GPIO1_U0_RTSn   | PIN_OUTPUT_HIGH, +	GPIO2_U0_RXD    | PIN_INPUT_PULLUP, +	GPIO3_U0_TXD    | PIN_OUTPUT_HIGH, +}; + +#define PRCC_K_SOFTRST_SET      0x18 +#define PRCC_K_SOFTRST_CLEAR    0x1C +static void ux500_uart0_reset(void) +{ +	void __iomem *prcc_rst_set, *prcc_rst_clr; + +	prcc_rst_set = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE + +			PRCC_K_SOFTRST_SET); +	prcc_rst_clr = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE + +			PRCC_K_SOFTRST_CLEAR); + +	/* Activate soft reset PRCC_K_SOFTRST_CLEAR */ +	writel((readl(prcc_rst_clr) | 0x1), prcc_rst_clr); +	udelay(1); + +	/* Release soft reset PRCC_K_SOFTRST_SET */ +	writel((readl(prcc_rst_set) | 0x1), prcc_rst_set); +	udelay(1); +} + +static void ux500_uart0_init(void) +{ +	int ret; + +	ret = nmk_config_pins(mop500_pins_uart0, +			ARRAY_SIZE(mop500_pins_uart0)); +	if (ret < 0) +		pr_err("pl011: uart pins_enable failed\n"); +} + +static void ux500_uart0_exit(void) +{ +	int ret; + +	ret = nmk_config_pins_sleep(mop500_pins_uart0, +			ARRAY_SIZE(mop500_pins_uart0)); +	if (ret < 0) +		pr_err("pl011: uart pins_disable failed\n"); +} +  static struct amba_pl011_data uart0_plat = {  #ifdef CONFIG_STE_DMA40  	.dma_filter = stedma40_filter,  	.dma_rx_param = &uart0_dma_cfg_rx,  	.dma_tx_param = &uart0_dma_cfg_tx,  #endif +	.init = ux500_uart0_init, +	.exit = ux500_uart0_exit, +	.reset = ux500_uart0_reset,  };  static struct amba_pl011_data uart1_plat = { diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index c3c417656bd..4598b06c8c5 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c @@ -159,6 +159,9 @@ static void __init db8500_add_gpios(void)  		/* No custom data yet */  	}; +	if (cpu_is_u8500v2()) +		pdata.supports_sleepmode = true; +  	dbx500_add_gpios(ARRAY_AND_SIZE(db8500_gpio_base),  			 IRQ_DB8500_GPIO0, &pdata);  } diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 285edcd2da2..9e6b93b1a04 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c @@ -46,12 +46,6 @@ static struct map_desc v2m_io_desc[] __initdata = {  	},  }; -static void __init v2m_init_early(void) -{ -	ct_desc->init_early(); -	versatile_sched_clock_init(MMIO_P2V(V2M_SYS_24MHZ), 24000000); -} -  static void __init v2m_timer_init(void)  {  	u32 scctrl; @@ -365,6 +359,13 @@ static struct clk_lookup v2m_lookups[] = {  	},  }; +static void __init v2m_init_early(void) +{ +	ct_desc->init_early(); +	clkdev_add_table(v2m_lookups, ARRAY_SIZE(v2m_lookups)); +	versatile_sched_clock_init(MMIO_P2V(V2M_SYS_24MHZ), 24000000); +} +  static void v2m_power_off(void)  {  	if (v2m_cfg_write(SYS_CFG_SHUTDOWN | SYS_CFG_SITE_MB, 0)) @@ -418,8 +419,6 @@ static void __init v2m_init(void)  {  	int i; -	clkdev_add_table(v2m_lookups, ARRAY_SIZE(v2m_lookups)); -  	platform_device_register(&v2m_pcie_i2c_device);  	platform_device_register(&v2m_ddc_i2c_device);  	platform_device_register(&v2m_flash_device); diff --git a/arch/arm/mach-vt8500/irq.c b/arch/arm/mach-vt8500/irq.c index 245140c0df1..642de0408f2 100644 --- a/arch/arm/mach-vt8500/irq.c +++ b/arch/arm/mach-vt8500/irq.c @@ -39,9 +39,10 @@  static void __iomem *ic_regbase;  static void __iomem *sic_regbase; -static void vt8500_irq_mask(unsigned int irq) +static void vt8500_irq_mask(struct irq_data *d)  {  	void __iomem *base = ic_regbase; +	unsigned irq = d->irq;  	u8 edge;  	if (irq >= 64) { @@ -64,9 +65,10 @@ static void vt8500_irq_mask(unsigned int irq)  	}  } -static void vt8500_irq_unmask(unsigned int irq) +static void vt8500_irq_unmask(struct irq_data *d)  {  	void __iomem *base = ic_regbase; +	unsigned irq = d->irq;  	u8 dctr;  	if (irq >= 64) { @@ -78,10 +80,11 @@ static void vt8500_irq_unmask(unsigned int irq)  	writeb(dctr, base + VT8500_IC_DCTR + irq);  } -static int vt8500_irq_set_type(unsigned int irq, unsigned int flow_type) +static int vt8500_irq_set_type(struct irq_data *d, unsigned int flow_type)  {  	void __iomem *base = ic_regbase; -	unsigned int orig_irq = irq; +	unsigned irq = d->irq; +	unsigned orig_irq = irq;  	u8 dctr;  	if (irq >= 64) { @@ -114,11 +117,11 @@ static int vt8500_irq_set_type(unsigned int irq, unsigned int flow_type)  }  static struct irq_chip vt8500_irq_chip = { -	.name      = "vt8500", -	.ack       = vt8500_irq_mask, -	.mask      = vt8500_irq_mask, -	.unmask    = vt8500_irq_unmask, -	.set_type  = vt8500_irq_set_type, +	.name = "vt8500", +	.irq_ack = vt8500_irq_mask, +	.irq_mask = vt8500_irq_mask, +	.irq_unmask = vt8500_irq_unmask, +	.irq_set_type = vt8500_irq_set_type,  };  void __init vt8500_init_irq(void) diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index ef59099a546..44c086710d2 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c @@ -120,17 +120,22 @@ static void l2x0_cache_sync(void)  	spin_unlock_irqrestore(&l2x0_lock, flags);  } -static void l2x0_flush_all(void) +static void __l2x0_flush_all(void)  { -	unsigned long flags; - -	/* clean all ways */ -	spin_lock_irqsave(&l2x0_lock, flags);  	debug_writel(0x03);  	writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_CLEAN_INV_WAY);  	cache_wait_way(l2x0_base + L2X0_CLEAN_INV_WAY, l2x0_way_mask);  	cache_sync();  	debug_writel(0x00); +} + +static void l2x0_flush_all(void) +{ +	unsigned long flags; + +	/* clean all ways */ +	spin_lock_irqsave(&l2x0_lock, flags); +	__l2x0_flush_all();  	spin_unlock_irqrestore(&l2x0_lock, flags);  } @@ -266,7 +271,9 @@ static void l2x0_disable(void)  	unsigned long flags;  	spin_lock_irqsave(&l2x0_lock, flags); -	writel(0, l2x0_base + L2X0_CTRL); +	__l2x0_flush_all(); +	writel_relaxed(0, l2x0_base + L2X0_CTRL); +	dsb();  	spin_unlock_irqrestore(&l2x0_lock, flags);  } diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 8bfae964b13..b0ee9ba3cfa 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c @@ -24,7 +24,9 @@ DEFINE_PER_CPU(struct mm_struct *, current_mm);  /*   * We fork()ed a process, and we need a new context for the child - * to run in. + * to run in.  We reserve version 0 for initial tasks so we will + * always allocate an ASID. The ASID 0 is reserved for the TTBR + * register changing sequence.   */  void __init_new_context(struct task_struct *tsk, struct mm_struct *mm)  { @@ -34,11 +36,8 @@ void __init_new_context(struct task_struct *tsk, struct mm_struct *mm)  static void flush_context(void)  { -	u32 ttb; -	/* Copy TTBR1 into TTBR0 */ -	asm volatile("mrc	p15, 0, %0, c2, c0, 1\n" -		     "mcr	p15, 0, %0, c2, c0, 0" -		     : "=r" (ttb)); +	/* set the reserved ASID before flushing the TLB */ +	asm("mcr	p15, 0, %0, c13, c0, 1\n" : : "r" (0));  	isb();  	local_flush_tlb_all();  	if (icache_is_vivt_asid_tagged()) { @@ -94,7 +93,7 @@ static void reset_context(void *info)  		return;  	smp_rmb(); -	asid = cpu_last_asid + cpu; +	asid = cpu_last_asid + cpu + 1;  	flush_context();  	set_mm_context(mm, asid); @@ -144,13 +143,13 @@ void __new_context(struct mm_struct *mm)  	 * to start a new version and flush the TLB.  	 */  	if (unlikely((asid & ~ASID_MASK) == 0)) { -		asid = cpu_last_asid + smp_processor_id(); +		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 - 1; +		cpu_last_asid += NR_CPUS;  	}  	set_mm_context(mm, asid); diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 2c2cce9cd8c..c19571c40a2 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -331,6 +331,12 @@ void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc)  #endif  #ifdef CONFIG_BLK_DEV_INITRD  	if (phys_initrd_size && +	    !memblock_is_region_memory(phys_initrd_start, phys_initrd_size)) { +		pr_err("INITRD: 0x%08lx+0x%08lx is not a memory region - disabling initrd\n", +		       phys_initrd_start, phys_initrd_size); +		phys_initrd_start = phys_initrd_size = 0; +	} +	if (phys_initrd_size &&  	    memblock_is_region_reserved(phys_initrd_start, phys_initrd_size)) {  		pr_err("INITRD: 0x%08lx+0x%08lx overlaps in-use memory region - disabling initrd\n",  		       phys_initrd_start, phys_initrd_size); @@ -635,7 +641,8 @@ void __init mem_init(void)  			"    modules : 0x%08lx - 0x%08lx   (%4ld MB)\n"  			"      .init : 0x%p" " - 0x%p" "   (%4d kB)\n"  			"      .text : 0x%p" " - 0x%p" "   (%4d kB)\n" -			"      .data : 0x%p" " - 0x%p" "   (%4d kB)\n", +			"      .data : 0x%p" " - 0x%p" "   (%4d kB)\n" +			"       .bss : 0x%p" " - 0x%p" "   (%4d kB)\n",  			MLK(UL(CONFIG_VECTORS_BASE), UL(CONFIG_VECTORS_BASE) +  				(PAGE_SIZE)), @@ -657,7 +664,8 @@ void __init mem_init(void)  			MLK_ROUNDUP(__init_begin, __init_end),  			MLK_ROUNDUP(_text, _etext), -			MLK_ROUNDUP(_sdata, _edata)); +			MLK_ROUNDUP(_sdata, _edata), +			MLK_ROUNDUP(__bss_start, __bss_stop));  #undef MLK  #undef MLM diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 9d9e736c2b4..594d677b92c 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -759,7 +759,7 @@ early_param("vmalloc", early_vmalloc);  static phys_addr_t lowmem_limit __initdata = 0; -static void __init sanity_check_meminfo(void) +void __init sanity_check_meminfo(void)  {  	int i, j, highmem = 0; @@ -1032,8 +1032,9 @@ void __init paging_init(struct machine_desc *mdesc)  {  	void *zero_page; +	memblock_set_current_limit(lowmem_limit); +  	build_mem_type_table(); -	sanity_check_meminfo();  	prepare_page_table();  	map_lowmem();  	devicemaps_init(mdesc); diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c index 687d02319a4..941a98c9e8a 100644 --- a/arch/arm/mm/nommu.c +++ b/arch/arm/mm/nommu.c @@ -27,6 +27,10 @@ void __init arm_mm_memblock_reserve(void)  	memblock_reserve(CONFIG_VECTORS_BASE, PAGE_SIZE);  } +void __init sanity_check_meminfo(void) +{ +} +  /*   * paging_init() sets up the page tables, initialises the zone memory   * maps, and sets up the zero page, bad page and bad page tables. diff --git a/arch/arm/mm/proc-arm7tdmi.S b/arch/arm/mm/proc-arm7tdmi.S index e4c165ca669..537ffcb0646 100644 --- a/arch/arm/mm/proc-arm7tdmi.S +++ b/arch/arm/mm/proc-arm7tdmi.S @@ -146,7 +146,7 @@ __arm7tdmi_proc_info:  		.long	0  		.long	0  		.long	v4_cache_fns -		.size	__arm7tdmi_proc_info, . - __arm7dmi_proc_info +		.size	__arm7tdmi_proc_info, . - __arm7tdmi_proc_info  		.type	__triscenda7_proc_info, #object  __triscenda7_proc_info: diff --git a/arch/arm/mm/proc-arm9tdmi.S b/arch/arm/mm/proc-arm9tdmi.S index 7b7ebd4d096..546b54da100 100644 --- a/arch/arm/mm/proc-arm9tdmi.S +++ b/arch/arm/mm/proc-arm9tdmi.S @@ -116,7 +116,7 @@ __arm9tdmi_proc_info:  		.long	0  		.long	0  		.long	v4_cache_fns -		.size	__arm9tdmi_proc_info, . - __arm9dmi_proc_info +		.size	__arm9tdmi_proc_info, . - __arm9tdmi_proc_info  		.type	__p2001_proc_info, #object  __p2001_proc_info: diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index b3b566ec83d..089c0b5e454 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S @@ -108,16 +108,18 @@ ENTRY(cpu_v7_switch_mm)  #ifdef CONFIG_ARM_ERRATA_430973  	mcr	p15, 0, r2, c7, c5, 6		@ flush BTAC/BTB  #endif -	mrc	p15, 0, r2, c2, c0, 1		@ load TTB 1 -	mcr	p15, 0, r2, c2, c0, 0		@ into TTB 0 +#ifdef CONFIG_ARM_ERRATA_754322 +	dsb +#endif +	mcr	p15, 0, r2, c13, c0, 1		@ set reserved context ID +	isb +1:	mcr	p15, 0, r0, c2, c0, 0		@ set TTB 0  	isb  #ifdef CONFIG_ARM_ERRATA_754322  	dsb  #endif  	mcr	p15, 0, r1, c13, c0, 1		@ set context ID  	isb -	mcr	p15, 0, r0, c2, c0, 0		@ set TTB 0 -	isb  #endif  	mov	pc, lr  ENDPROC(cpu_v7_switch_mm) @@ -208,19 +210,21 @@ cpu_v7_name:  /* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */  .globl	cpu_v7_suspend_size -.equ	cpu_v7_suspend_size, 4 * 8 +.equ	cpu_v7_suspend_size, 4 * 9  #ifdef CONFIG_PM_SLEEP  ENTRY(cpu_v7_do_suspend)  	stmfd	sp!, {r4 - r11, lr}  	mrc	p15, 0, r4, c13, c0, 0	@ FCSE/PID  	mrc	p15, 0, r5, c13, c0, 1	@ Context ID +	mrc	p15, 0, r6, c13, c0, 3	@ User r/o thread ID +	stmia	r0!, {r4 - r6}  	mrc	p15, 0, r6, c3, c0, 0	@ Domain ID  	mrc	p15, 0, r7, c2, c0, 0	@ TTB 0  	mrc	p15, 0, r8, c2, c0, 1	@ TTB 1  	mrc	p15, 0, r9, c1, c0, 0	@ Control register  	mrc	p15, 0, r10, c1, c0, 1	@ Auxiliary control register  	mrc	p15, 0, r11, c1, c0, 2	@ Co-processor access control -	stmia	r0, {r4 - r11} +	stmia	r0, {r6 - r11}  	ldmfd	sp!, {r4 - r11, pc}  ENDPROC(cpu_v7_do_suspend) @@ -228,9 +232,11 @@ ENTRY(cpu_v7_do_resume)  	mov	ip, #0  	mcr	p15, 0, ip, c8, c7, 0	@ invalidate TLBs  	mcr	p15, 0, ip, c7, c5, 0	@ invalidate I cache -	ldmia	r0, {r4 - r11} +	ldmia	r0!, {r4 - r6}  	mcr	p15, 0, r4, c13, c0, 0	@ FCSE/PID  	mcr	p15, 0, r5, c13, c0, 1	@ Context ID +	mcr	p15, 0, r6, c13, c0, 3	@ User r/o thread ID +	ldmia	r0, {r6 - r11}  	mcr	p15, 0, r6, c3, c0, 0	@ Domain ID  	mcr	p15, 0, r7, c2, c0, 0	@ TTB 0  	mcr	p15, 0, r8, c2, c0, 1	@ TTB 1 @@ -416,9 +422,9 @@ ENTRY(v7_processor_functions)  	.word	cpu_v7_dcache_clean_area  	.word	cpu_v7_switch_mm  	.word	cpu_v7_set_pte_ext -	.word	0 -	.word	0 -	.word	0 +	.word	cpu_v7_suspend_size +	.word	cpu_v7_do_suspend +	.word	cpu_v7_do_resume  	.size	v7_processor_functions, . - v7_processor_functions  	.section ".rodata" diff --git a/arch/arm/plat-iop/cp6.c b/arch/arm/plat-iop/cp6.c index 9612a87e2a8..bab73e2c79d 100644 --- a/arch/arm/plat-iop/cp6.c +++ b/arch/arm/plat-iop/cp6.c @@ -18,6 +18,7 @@   */  #include <linux/init.h>  #include <asm/traps.h> +#include <asm/ptrace.h>  static int cp6_trap(struct pt_regs *regs, unsigned int instr)  { diff --git a/arch/arm/plat-mxc/devices/platform-imx-dma.c b/arch/arm/plat-mxc/devices/platform-imx-dma.c index 3538b85ede9..b130f60ca6b 100644 --- a/arch/arm/plat-mxc/devices/platform-imx-dma.c +++ b/arch/arm/plat-mxc/devices/platform-imx-dma.c @@ -139,7 +139,7 @@ static struct sdma_script_start_addrs addr_imx35_to2 = {  #endif  #ifdef CONFIG_SOC_IMX51 -static struct sdma_script_start_addrs addr_imx51_to1 = { +static struct sdma_script_start_addrs addr_imx51 = {  	.ap_2_ap_addr = 642,  	.uart_2_mcu_addr = 817,  	.mcu_2_app_addr = 747, @@ -196,7 +196,9 @@ static int __init imxXX_add_imx_dma(void)  #if defined(CONFIG_SOC_IMX51)  	if (cpu_is_mx51()) { -		imx51_imx_sdma_data.pdata.script_addrs = &addr_imx51_to1; +		int to_version = mx51_revision() >> 4; +		imx51_imx_sdma_data.pdata.to_version = to_version; +		imx51_imx_sdma_data.pdata.script_addrs = &addr_imx51;  		ret = imx_add_imx_sdma(&imx51_imx_sdma_data);  	} else  #endif diff --git a/arch/arm/plat-nomadik/include/plat/gpio.h b/arch/arm/plat-nomadik/include/plat/gpio.h index ea19a5b2f22..d5d7e651269 100644 --- a/arch/arm/plat-nomadik/include/plat/gpio.h +++ b/arch/arm/plat-nomadik/include/plat/gpio.h @@ -90,6 +90,7 @@ struct nmk_gpio_platform_data {  	int num_gpio;  	u32 (*get_secondary_status)(unsigned int bank);  	void (*set_ioforce)(bool enable); +	bool supports_sleepmode;  };  #endif /* __ASM_PLAT_GPIO_H */ diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c index a37b8eb65b7..49fc0df0c21 100644 --- a/arch/arm/plat-omap/omap_device.c +++ b/arch/arm/plat-omap/omap_device.c @@ -84,6 +84,7 @@  #include <linux/io.h>  #include <linux/clk.h>  #include <linux/clkdev.h> +#include <linux/pm_runtime.h>  #include <plat/omap_device.h>  #include <plat/omap_hwmod.h> @@ -539,20 +540,34 @@ int omap_early_device_register(struct omap_device *od)  static int _od_runtime_suspend(struct device *dev)  {  	struct platform_device *pdev = to_platform_device(dev); +	int ret; + +	ret = pm_generic_runtime_suspend(dev); + +	if (!ret) +		omap_device_idle(pdev); + +	return ret; +} -	return omap_device_idle(pdev); +static int _od_runtime_idle(struct device *dev) +{ +	return pm_generic_runtime_idle(dev);  }  static int _od_runtime_resume(struct device *dev)  {  	struct platform_device *pdev = to_platform_device(dev); -	return omap_device_enable(pdev); +	omap_device_enable(pdev); + +	return pm_generic_runtime_resume(dev);  }  static struct dev_power_domain omap_device_power_domain = {  	.ops = {  		.runtime_suspend = _od_runtime_suspend, +		.runtime_idle = _od_runtime_idle,  		.runtime_resume = _od_runtime_resume,  		USE_PLATFORM_PM_SLEEP_OPS  	} diff --git a/arch/arm/plat-s3c24xx/dma.c b/arch/arm/plat-s3c24xx/dma.c index c10d10c56e2..a79a8ccd25f 100644 --- a/arch/arm/plat-s3c24xx/dma.c +++ b/arch/arm/plat-s3c24xx/dma.c @@ -1027,17 +1027,13 @@ int s3c2410_dma_config(unsigned int channel,  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);  	unsigned int dcon; -	pr_debug("%s: chan=%d, xfer_unit=%d, dcon=%08x\n", -		 __func__, channel, xferunit, dcon); +	pr_debug("%s: chan=%d, xfer_unit=%d\n", __func__, channel, xferunit);  	if (chan == NULL)  		return -EINVAL; -	pr_debug("%s: Initial dcon is %08x\n", __func__, dcon); -  	dcon = chan->dcon & dma_sel.dcon_mask; - -	pr_debug("%s: New dcon is %08x\n", __func__, dcon); +	pr_debug("%s: dcon is %08x\n", __func__, dcon);  	switch (chan->req_ch) {  	case DMACH_I2S_IN: @@ -1199,7 +1195,7 @@ EXPORT_SYMBOL(s3c2410_dma_getposition);  #ifdef CONFIG_PM -static void s3c2410_dma_suspend_chan(s3c2410_dma_chan *cp) +static void s3c2410_dma_suspend_chan(struct s3c2410_dma_chan *cp)  {  	printk(KERN_DEBUG "suspending dma channel %d\n", cp->number); @@ -1235,7 +1231,7 @@ static void s3c2410_dma_resume_chan(struct s3c2410_dma_chan *cp)  	/* restore channel's hardware configuration */  	if (!cp->in_use) -		return 0; +		return;  	printk(KERN_INFO "dma%d: restoring configuration\n", cp->number); @@ -1246,8 +1242,6 @@ static void s3c2410_dma_resume_chan(struct s3c2410_dma_chan *cp)  	if (cp->map != NULL)  		dma_sel.select(cp, cp->map); - -	return 0;  }  static void s3c2410_dma_resume(void) diff --git a/arch/arm/plat-s3c24xx/irq.c b/arch/arm/plat-s3c24xx/irq.c index 9aee7e1668b..fc8c5f89954 100644 --- a/arch/arm/plat-s3c24xx/irq.c +++ b/arch/arm/plat-s3c24xx/irq.c @@ -23,6 +23,7 @@  #include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/sysdev.h> +#include <linux/syscore_ops.h>  #include <asm/irq.h>  #include <asm/mach/irq.h> @@ -668,3 +669,8 @@ void __init s3c24xx_init_irq(void)  	irqdbf("s3c2410: registered interrupt handlers\n");  } + +struct syscore_ops s3c24xx_irq_syscore_ops = { +	.suspend	= s3c24xx_irq_suspend, +	.resume		= s3c24xx_irq_resume, +}; diff --git a/arch/arm/plat-s5p/dev-onenand.c b/arch/arm/plat-s5p/dev-onenand.c index 6db926202ca..20336c8f247 100644 --- a/arch/arm/plat-s5p/dev-onenand.c +++ b/arch/arm/plat-s5p/dev-onenand.c @@ -15,8 +15,6 @@  #include <linux/kernel.h>  #include <linux/platform_device.h> -#include <linux/mtd/mtd.h> -#include <linux/mtd/onenand.h>  #include <mach/irqs.h>  #include <mach/map.h> @@ -45,13 +43,3 @@ struct platform_device s5p_device_onenand = {  	.num_resources	= ARRAY_SIZE(s5p_onenand_resources),  	.resource	= s5p_onenand_resources,  }; - -void s5p_onenand_set_platdata(struct onenand_platform_data *pdata) -{ -	struct onenand_platform_data *pd; - -	pd = kmemdup(pdata, sizeof(struct onenand_platform_data), GFP_KERNEL); -	if (!pd) -		printk(KERN_ERR "%s: no memory for platform data\n", __func__); -	s5p_device_onenand.dev.platform_data = pd; -} diff --git a/arch/arm/plat-s5p/include/plat/map-s5p.h b/arch/arm/plat-s5p/include/plat/map-s5p.h index a6c3d327ce7..d973d39666a 100644 --- a/arch/arm/plat-s5p/include/plat/map-s5p.h +++ b/arch/arm/plat-s5p/include/plat/map-s5p.h @@ -39,7 +39,7 @@  #define S5P_VA_TWD		S5P_VA_COREPERI(0x600)  #define S5P_VA_GIC_DIST		S5P_VA_COREPERI(0x1000) -#define S5P_VA_USB_HSPHY	S3C_ADDR(0x02900000) +#define S3C_VA_USB_HSPHY	S3C_ADDR(0x02900000)  #define VA_VIC(x)		(S3C_VA_IRQ + ((x) * 0x10000))  #define VA_VIC0			VA_VIC(0) diff --git a/arch/arm/plat-s5p/s5p-time.c b/arch/arm/plat-s5p/s5p-time.c index 899a8cc011f..612934c48b0 100644 --- a/arch/arm/plat-s5p/s5p-time.c +++ b/arch/arm/plat-s5p/s5p-time.c @@ -370,11 +370,11 @@ static void __init s5p_clocksource_init(void)  	clock_rate = clk_get_rate(tin_source); -	init_sched_clock(&cd, s5p_update_sched_clock, 32, clock_rate); -  	s5p_time_setup(timer_source.source_id, TCNT_MAX);  	s5p_time_start(timer_source.source_id, PERIODIC); +	init_sched_clock(&cd, s5p_update_sched_clock, 32, clock_rate); +  	if (clocksource_register_hz(&time_clocksource, clock_rate))  		panic("%s: can't register clocksource\n", time_clocksource.name);  } diff --git a/arch/arm/plat-samsung/dev-onenand.c b/arch/arm/plat-samsung/dev-onenand.c index 45ec73287d8..f54ae71f0cd 100644 --- a/arch/arm/plat-samsung/dev-onenand.c +++ b/arch/arm/plat-samsung/dev-onenand.c @@ -13,8 +13,6 @@  #include <linux/kernel.h>  #include <linux/platform_device.h> -#include <linux/mtd/mtd.h> -#include <linux/mtd/onenand.h>  #include <mach/irqs.h>  #include <mach/map.h> @@ -43,13 +41,3 @@ struct platform_device s3c_device_onenand = {  	.num_resources	= ARRAY_SIZE(s3c_onenand_resources),  	.resource	= s3c_onenand_resources,  }; - -void s3c_onenand_set_platdata(struct onenand_platform_data *pdata) -{ -	struct onenand_platform_data *pd; - -	pd = kmemdup(pdata, sizeof(struct onenand_platform_data), GFP_KERNEL); -	if (!pd) -		printk(KERN_ERR "%s: no memory for platform data\n", __func__); -	s3c_device_onenand.dev.platform_data = pd; -} diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h index b61b8ee7cc5..e3b31c26ac3 100644 --- a/arch/arm/plat-samsung/include/plat/devs.h +++ b/arch/arm/plat-samsung/include/plat/devs.h @@ -12,6 +12,10 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.  */ + +#ifndef __PLAT_DEVS_H +#define __PLAT_DEVS_H __FILE__ +  #include <linux/platform_device.h>  struct s3c24xx_uart_resources { @@ -75,10 +79,8 @@ extern struct platform_device s5pc100_device_spi1;  extern struct platform_device s5pc100_device_spi2;  extern struct platform_device s5pv210_device_spi0;  extern struct platform_device s5pv210_device_spi1; -extern struct platform_device s5p6440_device_spi0; -extern struct platform_device s5p6440_device_spi1; -extern struct platform_device s5p6450_device_spi0; -extern struct platform_device s5p6450_device_spi1; +extern struct platform_device s5p64x0_device_spi0; +extern struct platform_device s5p64x0_device_spi1;  extern struct platform_device s3c_device_hwmon; @@ -161,3 +163,5 @@ extern struct platform_device s3c_device_ac97;   */  extern void *s3c_set_platdata(void *pd, size_t pdsize,  			      struct platform_device *pdev); + +#endif /* __PLAT_DEVS_H */ diff --git a/arch/arm/plat-samsung/include/plat/regs-serial.h b/arch/arm/plat-samsung/include/plat/regs-serial.h index c151c5f94a8..116edfe120b 100644 --- a/arch/arm/plat-samsung/include/plat/regs-serial.h +++ b/arch/arm/plat-samsung/include/plat/regs-serial.h @@ -224,6 +224,8 @@  #define S5PV210_UFSTAT_RXMASK	(255<<0)  #define S5PV210_UFSTAT_RXSHIFT	(0) +#define NO_NEED_CHECK_CLKSRC	1 +  #ifndef __ASSEMBLY__  /* struct s3c24xx_uart_clksrc diff --git a/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h b/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h index 0ffe34a2155..4c16fa3621b 100644 --- a/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h +++ b/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h @@ -39,6 +39,7 @@ struct s3c64xx_spi_csinfo {   * @fifo_lvl_mask: All tx fifo_lvl fields start at offset-6   * @rx_lvl_offset: Depends on tx fifo_lvl field and bus number   * @high_speed: If the controller supports HIGH_SPEED_EN bit + * @tx_st_done: Depends on tx fifo_lvl field   */  struct s3c64xx_spi_info {  	int src_clk_nr; @@ -53,6 +54,7 @@ struct s3c64xx_spi_info {  	int fifo_lvl_mask;  	int rx_lvl_offset;  	int high_speed; +	int tx_st_done;  };  /** diff --git a/arch/avr32/configs/atngw100_defconfig b/arch/avr32/configs/atngw100_defconfig index 6f9ca56de1f..a06bfccc284 100644 --- a/arch/avr32/configs/atngw100_defconfig +++ b/arch/avr32/configs/atngw100_defconfig @@ -5,6 +5,7 @@ CONFIG_POSIX_MQUEUE=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_RELAY=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/atngw100_evklcd100_defconfig b/arch/avr32/configs/atngw100_evklcd100_defconfig index 7eece0af34c..d8f1fe80d21 100644 --- a/arch/avr32/configs/atngw100_evklcd100_defconfig +++ b/arch/avr32/configs/atngw100_evklcd100_defconfig @@ -5,6 +5,7 @@ CONFIG_POSIX_MQUEUE=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_RELAY=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/atngw100_evklcd101_defconfig b/arch/avr32/configs/atngw100_evklcd101_defconfig index 387eb9d6e42..d4c5b19ec95 100644 --- a/arch/avr32/configs/atngw100_evklcd101_defconfig +++ b/arch/avr32/configs/atngw100_evklcd101_defconfig @@ -5,6 +5,7 @@ CONFIG_POSIX_MQUEUE=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_RELAY=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/atngw100_mrmt_defconfig b/arch/avr32/configs/atngw100_mrmt_defconfig index 19f6ceeeff7..77ca4f905d2 100644 --- a/arch/avr32/configs/atngw100_mrmt_defconfig +++ b/arch/avr32/configs/atngw100_mrmt_defconfig @@ -7,6 +7,7 @@ CONFIG_BSD_PROCESS_ACCT_V3=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_SYSFS_DEPRECATED_V2=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_SLUB_DEBUG is not set @@ -109,7 +110,7 @@ CONFIG_LEDS_GPIO=y  CONFIG_LEDS_TRIGGERS=y  CONFIG_LEDS_TRIGGER_TIMER=y  CONFIG_LEDS_TRIGGER_HEARTBEAT=y -CONFIG_RTC_CLASS=m +CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_S35390A=m  CONFIG_RTC_DRV_AT32AP700X=m  CONFIG_DMADEVICES=y diff --git a/arch/avr32/configs/atngw100mkii_defconfig b/arch/avr32/configs/atngw100mkii_defconfig index f0fe237133a..6e0dca4d313 100644 --- a/arch/avr32/configs/atngw100mkii_defconfig +++ b/arch/avr32/configs/atngw100mkii_defconfig @@ -5,6 +5,7 @@ CONFIG_POSIX_MQUEUE=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_RELAY=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/atngw100mkii_evklcd100_defconfig b/arch/avr32/configs/atngw100mkii_evklcd100_defconfig index e4a7c1dc838..7f2a344a5fa 100644 --- a/arch/avr32/configs/atngw100mkii_evklcd100_defconfig +++ b/arch/avr32/configs/atngw100mkii_evklcd100_defconfig @@ -5,6 +5,7 @@ CONFIG_POSIX_MQUEUE=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_RELAY=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/atngw100mkii_evklcd101_defconfig b/arch/avr32/configs/atngw100mkii_evklcd101_defconfig index 6f37f70c2c3..085eeba88f6 100644 --- a/arch/avr32/configs/atngw100mkii_evklcd101_defconfig +++ b/arch/avr32/configs/atngw100mkii_evklcd101_defconfig @@ -5,6 +5,7 @@ CONFIG_POSIX_MQUEUE=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_RELAY=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/atstk1002_defconfig b/arch/avr32/configs/atstk1002_defconfig index 4fb01f5ab42..d1a887e6405 100644 --- a/arch/avr32/configs/atstk1002_defconfig +++ b/arch/avr32/configs/atstk1002_defconfig @@ -5,6 +5,7 @@ CONFIG_POSIX_MQUEUE=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_RELAY=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/atstk1003_defconfig b/arch/avr32/configs/atstk1003_defconfig index 9faaf9b900f..956f2819ad4 100644 --- a/arch/avr32/configs/atstk1003_defconfig +++ b/arch/avr32/configs/atstk1003_defconfig @@ -5,6 +5,7 @@ CONFIG_POSIX_MQUEUE=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_RELAY=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/atstk1004_defconfig b/arch/avr32/configs/atstk1004_defconfig index 3d2a5d85f97..40c69f38c61 100644 --- a/arch/avr32/configs/atstk1004_defconfig +++ b/arch/avr32/configs/atstk1004_defconfig @@ -5,6 +5,7 @@ CONFIG_POSIX_MQUEUE=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_RELAY=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/atstk1006_defconfig b/arch/avr32/configs/atstk1006_defconfig index 1ed8f22d4fe..511eb8af356 100644 --- a/arch/avr32/configs/atstk1006_defconfig +++ b/arch/avr32/configs/atstk1006_defconfig @@ -5,6 +5,7 @@ CONFIG_POSIX_MQUEUE=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_RELAY=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/favr-32_defconfig b/arch/avr32/configs/favr-32_defconfig index aeadc955db3..19973b06170 100644 --- a/arch/avr32/configs/favr-32_defconfig +++ b/arch/avr32/configs/favr-32_defconfig @@ -6,6 +6,7 @@ CONFIG_LOG_BUF_SHIFT=14  CONFIG_SYSFS_DEPRECATED_V2=y  CONFIG_RELAY=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/hammerhead_defconfig b/arch/avr32/configs/hammerhead_defconfig index 1692beeb7ed..6f45681196d 100644 --- a/arch/avr32/configs/hammerhead_defconfig +++ b/arch/avr32/configs/hammerhead_defconfig @@ -7,6 +7,7 @@ CONFIG_BSD_PROCESS_ACCT_V3=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_SYSFS_DEPRECATED_V2=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/configs/merisc_defconfig b/arch/avr32/configs/merisc_defconfig index 8b670a6530b..3befab96682 100644 --- a/arch/avr32/configs/merisc_defconfig +++ b/arch/avr32/configs/merisc_defconfig @@ -7,6 +7,7 @@ CONFIG_BSD_PROCESS_ACCT_V3=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_SYSFS_DEPRECATED_V2=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  CONFIG_MODULES=y diff --git a/arch/avr32/configs/mimc200_defconfig b/arch/avr32/configs/mimc200_defconfig index 5a51f2e7ffb..1bee51f2215 100644 --- a/arch/avr32/configs/mimc200_defconfig +++ b/arch/avr32/configs/mimc200_defconfig @@ -7,6 +7,7 @@ CONFIG_BSD_PROCESS_ACCT_V3=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_SYSFS_DEPRECATED_V2=y  CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  # CONFIG_SYSCTL_SYSCALL is not set  # CONFIG_BASE_FULL is not set  # CONFIG_COMPAT_BRK is not set diff --git a/arch/avr32/include/asm/processor.h b/arch/avr32/include/asm/processor.h index 49a88f5a9d2..108502bc677 100644 --- a/arch/avr32/include/asm/processor.h +++ b/arch/avr32/include/asm/processor.h @@ -131,7 +131,6 @@ struct thread_struct {   */  #define start_thread(regs, new_pc, new_sp)	 \  	do {					 \ -		set_fs(USER_DS);		 \  		memset(regs, 0, sizeof(*regs));	 \  		regs->sr = MODE_USER;		 \  		regs->pc = new_pc & ~1;		 \ diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c index aa677e2a382..7fbf0dcb9af 100644 --- a/arch/avr32/mach-at32ap/at32ap700x.c +++ b/arch/avr32/mach-at32ap/at32ap700x.c @@ -1043,8 +1043,9 @@ void __init at32_map_usart(unsigned int hw_id, unsigned int line, int flags)  		data->regs = (void __iomem *)pdev->resource[0].start;  	} +	pdev->id = line;  	pdata = pdev->dev.platform_data; -	pdata->num = portnr; +	pdata->num = line;  	at32_usarts[line] = pdev;  } diff --git a/arch/avr32/mach-at32ap/include/mach/cpu.h b/arch/avr32/mach-at32ap/include/mach/cpu.h index 9c96a130f3a..8181293115e 100644 --- a/arch/avr32/mach-at32ap/include/mach/cpu.h +++ b/arch/avr32/mach-at32ap/include/mach/cpu.h @@ -31,8 +31,20 @@  #define cpu_is_at91sam9263()	(0)  #define cpu_is_at91sam9rl()	(0)  #define cpu_is_at91cap9()	(0) +#define cpu_is_at91cap9_revB()	(0) +#define cpu_is_at91cap9_revC()	(0)  #define cpu_is_at91sam9g10()	(0) +#define cpu_is_at91sam9g20()	(0)  #define cpu_is_at91sam9g45()	(0)  #define cpu_is_at91sam9g45es()	(0) +#define cpu_is_at91sam9m10()	(0) +#define cpu_is_at91sam9g46()	(0) +#define cpu_is_at91sam9m11()	(0) +#define cpu_is_at91sam9x5()	(0) +#define cpu_is_at91sam9g15()	(0) +#define cpu_is_at91sam9g35()	(0) +#define cpu_is_at91sam9x35()	(0) +#define cpu_is_at91sam9g25()	(0) +#define cpu_is_at91sam9x25()	(0)  #endif /* __ASM_ARCH_CPU_H */ diff --git a/arch/avr32/mach-at32ap/intc.c b/arch/avr32/mach-at32ap/intc.c index 6c700431e34..258682bc127 100644 --- a/arch/avr32/mach-at32ap/intc.c +++ b/arch/avr32/mach-at32ap/intc.c @@ -167,14 +167,12 @@ static int intc_suspend(void)  	return 0;  } -static int intc_resume(void) +static void intc_resume(void)  {  	int i;  	for (i = 0; i < 64; i++)  		intc_writel(&intc0, INTPR0 + 4 * i, intc0.saved_ipr[i]); - -	return 0;  }  #else  #define intc_suspend	NULL diff --git a/arch/blackfin/configs/CM-BF548_defconfig b/arch/blackfin/configs/CM-BF548_defconfig index 31d954216c0..9f1d08401fc 100644 --- a/arch/blackfin/configs/CM-BF548_defconfig +++ b/arch/blackfin/configs/CM-BF548_defconfig @@ -112,7 +112,7 @@ CONFIG_USB_G_SERIAL=m  CONFIG_USB_G_PRINTER=m  CONFIG_MMC=m  CONFIG_SDH_BFIN=m -CONFIG_RTC_CLASS=m +CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_BFIN=m  CONFIG_EXT2_FS=m  # CONFIG_DNOTIFY is not set diff --git a/arch/m32r/include/asm/mmzone.h b/arch/m32r/include/asm/mmzone.h index 9f3b5accda8..115ced33feb 100644 --- a/arch/m32r/include/asm/mmzone.h +++ b/arch/m32r/include/asm/mmzone.h @@ -14,12 +14,6 @@ extern struct pglist_data *node_data[];  #define NODE_DATA(nid)		(node_data[nid])  #define node_localnr(pfn, nid)	((pfn) - NODE_DATA(nid)->node_start_pfn) -#define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn) -#define node_end_pfn(nid)						\ -({									\ -	pg_data_t *__pgdat = NODE_DATA(nid);				\ -	__pgdat->node_start_pfn + __pgdat->node_spanned_pages - 1;	\ -})  #define pmd_page(pmd)		(pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))  /* @@ -44,7 +38,7 @@ static __inline__ int pfn_to_nid(unsigned long pfn)  	int node;  	for (node = 0 ; node < MAX_NUMNODES ; node++) -		if (pfn >= node_start_pfn(node) && pfn <= node_end_pfn(node)) +		if (pfn >= node_start_pfn(node) && pfn < node_end_pfn(node))  			break;  	return node; diff --git a/arch/m68k/Kconfig.nommu b/arch/m68k/Kconfig.nommu index fc98f9b9d4d..b004dc1b171 100644 --- a/arch/m68k/Kconfig.nommu +++ b/arch/m68k/Kconfig.nommu @@ -14,6 +14,33 @@ config GENERIC_CLOCKEVENTS  	bool  	default n +config M68000 +	bool +	help +	  The Freescale (was Motorola) 68000 CPU is the first generation of +	  the well known M68K family of processors. The CPU core as well as +	  being available as a stand alone CPU was also used in many +	  System-On-Chip devices (eg 68328, 68302, etc). It does not contain +	  a paging MMU. + +config MCPU32 +	bool +	help +	  The Freescale (was then Motorola) CPU32 is a CPU core that is +	  based on the 68020 processor. For the most part it is used in +	  System-On-Chip parts, and does not contain a paging MMU. + +config COLDFIRE +	bool +	select GENERIC_GPIO +	select ARCH_REQUIRE_GPIOLIB +	help +	  The Freescale ColdFire family of processors is a modern derivitive +	  of the 68000 processor family. They are mainly targeted at embedded +	  applications, and are all System-On-Chip (SOC) devices, as opposed +	  to stand alone CPUs. They implement a subset of the original 68000 +	  processor instruction set. +  config COLDFIRE_SW_A7  	bool  	default n @@ -36,26 +63,31 @@ choice  config M68328  	bool "MC68328" +	select M68000  	help  	  Motorola 68328 processor support.  config M68EZ328  	bool "MC68EZ328" +	select M68000  	help  	  Motorola 68EX328 processor support.  config M68VZ328  	bool "MC68VZ328" +	select M68000  	help  	  Motorola 68VZ328 processor support.  config M68360  	bool "MC68360" +	select MCPU32  	help  	  Motorola 68360 processor support.  config M5206  	bool "MCF5206" +	select COLDFIRE  	select COLDFIRE_SW_A7  	select HAVE_MBAR  	help @@ -63,6 +95,7 @@ config M5206  config M5206e  	bool "MCF5206e" +	select COLDFIRE  	select COLDFIRE_SW_A7  	select HAVE_MBAR  	help @@ -70,6 +103,7 @@ config M5206e  config M520x  	bool "MCF520x" +	select COLDFIRE  	select GENERIC_CLOCKEVENTS  	select HAVE_CACHE_SPLIT  	help @@ -77,6 +111,7 @@ config M520x  config M523x  	bool "MCF523x" +	select COLDFIRE  	select GENERIC_CLOCKEVENTS  	select HAVE_CACHE_SPLIT  	select HAVE_IPSBAR @@ -85,6 +120,7 @@ config M523x  config M5249  	bool "MCF5249" +	select COLDFIRE  	select COLDFIRE_SW_A7  	select HAVE_MBAR  	help @@ -92,6 +128,7 @@ config M5249  config M5271  	bool "MCF5271" +	select COLDFIRE  	select HAVE_CACHE_SPLIT  	select HAVE_IPSBAR  	help @@ -99,6 +136,7 @@ config M5271  config M5272  	bool "MCF5272" +	select COLDFIRE  	select COLDFIRE_SW_A7  	select HAVE_MBAR  	help @@ -106,6 +144,7 @@ config M5272  config M5275  	bool "MCF5275" +	select COLDFIRE  	select HAVE_CACHE_SPLIT  	select HAVE_IPSBAR  	help @@ -113,6 +152,7 @@ config M5275  config M528x  	bool "MCF528x" +	select COLDFIRE  	select GENERIC_CLOCKEVENTS  	select HAVE_CACHE_SPLIT  	select HAVE_IPSBAR @@ -121,6 +161,7 @@ config M528x  config M5307  	bool "MCF5307" +	select COLDFIRE  	select COLDFIRE_SW_A7  	select HAVE_CACHE_CB  	select HAVE_MBAR @@ -129,12 +170,14 @@ config M5307  config M532x  	bool "MCF532x" +	select COLDFIRE  	select HAVE_CACHE_CB  	help  	  Freescale (Motorola) ColdFire 532x processor support.  config M5407  	bool "MCF5407" +	select COLDFIRE  	select COLDFIRE_SW_A7  	select HAVE_CACHE_CB  	select HAVE_MBAR @@ -143,6 +186,7 @@ config M5407  config M547x  	bool "MCF547x" +	select COLDFIRE  	select HAVE_CACHE_CB  	select HAVE_MBAR  	help @@ -150,6 +194,7 @@ config M547x  config M548x  	bool "MCF548x" +	select COLDFIRE  	select HAVE_CACHE_CB  	select HAVE_MBAR  	help @@ -168,13 +213,6 @@ config M54xx  	depends on (M548x || M547x)  	default y -config COLDFIRE -	bool -	depends on (M5206 || M5206e || M520x || M523x || M5249 || M527x || M5272 || M528x || M5307 || M532x || M5407 || M54xx) -	select GENERIC_GPIO -	select ARCH_REQUIRE_GPIOLIB -	default y -  config CLOCK_SET  	bool "Enable setting the CPU clock frequency"  	default n diff --git a/arch/m68k/kernel/m68k_ksyms.c b/arch/m68k/kernel/m68k_ksyms.c index 33f82769547..1b7a14d1a00 100644 --- a/arch/m68k/kernel/m68k_ksyms.c +++ b/arch/m68k/kernel/m68k_ksyms.c @@ -14,8 +14,7 @@ EXPORT_SYMBOL(__ashrdi3);  EXPORT_SYMBOL(__lshrdi3);  EXPORT_SYMBOL(__muldi3); -#if !defined(__mc68020__) && !defined(__mc68030__) && \ -    !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcpu32__) +#if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE)  /*   * Simpler 68k and ColdFire parts also need a few other gcc functions.   */ diff --git a/arch/m68k/kernel/vmlinux.lds_no.S b/arch/m68k/kernel/vmlinux.lds_no.S index f4d715cdca0..7dc4087a954 100644 --- a/arch/m68k/kernel/vmlinux.lds_no.S +++ b/arch/m68k/kernel/vmlinux.lds_no.S @@ -84,52 +84,52 @@ SECTIONS {  		/* Kernel symbol table: Normal symbols */  		. = ALIGN(4);  		__start___ksymtab = .; -		*(__ksymtab) +		*(SORT(___ksymtab+*))  		__stop___ksymtab = .;  		/* Kernel symbol table: GPL-only symbols */  		__start___ksymtab_gpl = .; -		*(__ksymtab_gpl) +		*(SORT(___ksymtab_gpl+*))  		__stop___ksymtab_gpl = .;  		/* Kernel symbol table: Normal unused symbols */  		__start___ksymtab_unused = .; -		*(__ksymtab_unused) +		*(SORT(___ksymtab_unused+*))  		__stop___ksymtab_unused = .;  		/* Kernel symbol table: GPL-only unused symbols */  		__start___ksymtab_unused_gpl = .; -		*(__ksymtab_unused_gpl) +		*(SORT(___ksymtab_unused_gpl+*))  		__stop___ksymtab_unused_gpl = .;  		/* Kernel symbol table: GPL-future symbols */  		__start___ksymtab_gpl_future = .; -		*(__ksymtab_gpl_future) +		*(SORT(___ksymtab_gpl_future+*))  		__stop___ksymtab_gpl_future = .;  		/* Kernel symbol table: Normal symbols */  		__start___kcrctab = .; -		*(__kcrctab) +		*(SORT(___kcrctab+*))  		__stop___kcrctab = .;  		/* Kernel symbol table: GPL-only symbols */  		__start___kcrctab_gpl = .; -		*(__kcrctab_gpl) +		*(SORT(___kcrctab_gpl+*))  		__stop___kcrctab_gpl = .;  		/* Kernel symbol table: Normal unused symbols */  		__start___kcrctab_unused = .; -		*(__kcrctab_unused) +		*(SORT(___kcrctab_unused+*))  		__stop___kcrctab_unused = .;  		/* Kernel symbol table: GPL-only unused symbols */  		__start___kcrctab_unused_gpl = .; -		*(__kcrctab_unused_gpl) +		*(SORT(___kcrctab_unused_gpl+*))  		__stop___kcrctab_unused_gpl = .;  		/* Kernel symbol table: GPL-future symbols */  		__start___kcrctab_gpl_future = .; -		*(__kcrctab_gpl_future) +		*(SORT(___kcrctab_gpl_future+*))  		__stop___kcrctab_gpl_future = .;  		/* Kernel symbol table: strings */ diff --git a/arch/m68k/lib/memcpy.c b/arch/m68k/lib/memcpy.c index 62182c81e91..06488931697 100644 --- a/arch/m68k/lib/memcpy.c +++ b/arch/m68k/lib/memcpy.c @@ -34,8 +34,10 @@ void *memcpy(void *to, const void *from, size_t n)  	if (temp) {  		long *lto = to;  		const long *lfrom = from; -#if defined(__mc68020__) || defined(__mc68030__) || \ -    defined(__mc68040__) || defined(__mc68060__) || defined(__mcpu32__) +#if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE) +		for (; temp; temp--) +			*lto++ = *lfrom++; +#else  		asm volatile (  			"	movel %2,%3\n"  			"	andw  #7,%3\n" @@ -56,9 +58,6 @@ void *memcpy(void *to, const void *from, size_t n)  			"	jpl   4b"  			: "=a" (lfrom), "=a" (lto), "=d" (temp), "=&d" (temp1)  			: "0" (lfrom), "1" (lto), "2" (temp)); -#else -		for (; temp; temp--) -			*lto++ = *lfrom++;  #endif  		to = lto;  		from = lfrom; diff --git a/arch/m68k/lib/memset.c b/arch/m68k/lib/memset.c index f649e6a2e64..8a7639f0a2f 100644 --- a/arch/m68k/lib/memset.c +++ b/arch/m68k/lib/memset.c @@ -32,8 +32,10 @@ void *memset(void *s, int c, size_t count)  	temp = count >> 2;  	if (temp) {  		long *ls = s; -#if defined(__mc68020__) || defined(__mc68030__) || \ -    defined(__mc68040__) || defined(__mc68060__) || defined(__mcpu32__) +#if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE) +		for (; temp; temp--) +			*ls++ = c; +#else  		size_t temp1;  		asm volatile (  			"	movel %1,%2\n" @@ -55,9 +57,6 @@ void *memset(void *s, int c, size_t count)  			"	jpl   1b"  			: "=a" (ls), "=d" (temp), "=&d" (temp1)  			: "d" (c), "0" (ls), "1" (temp)); -#else -		for (; temp; temp--) -			*ls++ = c;  #endif  		s = ls;  	} diff --git a/arch/m68k/lib/muldi3.c b/arch/m68k/lib/muldi3.c index 079bafca073..79e928a525d 100644 --- a/arch/m68k/lib/muldi3.c +++ b/arch/m68k/lib/muldi3.c @@ -19,17 +19,7 @@ along with GNU CC; see the file COPYING.  If not, write to  the Free Software Foundation, 59 Temple Place - Suite 330,  Boston, MA 02111-1307, USA.  */ -#if defined(__mc68020__) || defined(__mc68030__) || \ -    defined(__mc68040__) || defined(__mc68060__) || defined(__mcpu32__) - -#define umul_ppmm(w1, w0, u, v) \ -  __asm__ ("mulu%.l %3,%1:%0"						\ -           : "=d" ((USItype)(w0)),					\ -             "=d" ((USItype)(w1))					\ -           : "%0" ((USItype)(u)),					\ -             "dmi" ((USItype)(v))) - -#else +#if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE)  #define SI_TYPE_SIZE 32  #define __BITS4 (SI_TYPE_SIZE / 4) @@ -61,6 +51,15 @@ Boston, MA 02111-1307, USA.  */      (w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0);		\    } while (0) +#else + +#define umul_ppmm(w1, w0, u, v) \ +  __asm__ ("mulu%.l %3,%1:%0"						\ +           : "=d" ((USItype)(w0)),					\ +             "=d" ((USItype)(w1))					\ +           : "%0" ((USItype)(u)),					\ +             "dmi" ((USItype)(v))) +  #endif  #define __umulsidi3(u, v) \ diff --git a/arch/mips/configs/mtx1_defconfig b/arch/mips/configs/mtx1_defconfig index 37862b2ce36..807c97eed8a 100644 --- a/arch/mips/configs/mtx1_defconfig +++ b/arch/mips/configs/mtx1_defconfig @@ -678,7 +678,7 @@ CONFIG_LEDS_TRIGGERS=y  CONFIG_LEDS_TRIGGER_TIMER=y  CONFIG_LEDS_TRIGGER_HEARTBEAT=y  CONFIG_LEDS_TRIGGER_DEFAULT_ON=y -CONFIG_RTC_CLASS=m +CONFIG_RTC_CLASS=y  CONFIG_RTC_INTF_DEV_UIE_EMUL=y  CONFIG_RTC_DRV_TEST=m  CONFIG_RTC_DRV_DS1307=m diff --git a/arch/mn10300/include/asm/uaccess.h b/arch/mn10300/include/asm/uaccess.h index 3d6e60dad9d..780560b330d 100644 --- a/arch/mn10300/include/asm/uaccess.h +++ b/arch/mn10300/include/asm/uaccess.h @@ -15,6 +15,7 @@   * User space memory access functions   */  #include <linux/thread_info.h> +#include <linux/kernel.h>  #include <asm/page.h>  #include <asm/errno.h> diff --git a/arch/parisc/include/asm/mmzone.h b/arch/parisc/include/asm/mmzone.h index 9608d2cf214..e67eb9c3d1b 100644 --- a/arch/parisc/include/asm/mmzone.h +++ b/arch/parisc/include/asm/mmzone.h @@ -14,13 +14,6 @@ extern struct node_map_data node_data[];  #define NODE_DATA(nid)          (&node_data[nid].pg_data) -#define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn) -#define node_end_pfn(nid)						\ -({									\ -	pg_data_t *__pgdat = NODE_DATA(nid);				\ -	__pgdat->node_start_pfn + __pgdat->node_spanned_pages;		\ -}) -  /* We have these possible memory map layouts:   * Astro: 0-3.75, 67.75-68, 4-64   * zx1: 0-1, 257-260, 4-256 diff --git a/arch/powerpc/boot/dts/p1022ds.dts b/arch/powerpc/boot/dts/p1022ds.dts index 4f685a779f4..98d9426d4b8 100644 --- a/arch/powerpc/boot/dts/p1022ds.dts +++ b/arch/powerpc/boot/dts/p1022ds.dts @@ -209,8 +209,10 @@  			wm8776:codec@1a {  				compatible = "wlf,wm8776";  				reg = <0x1a>; -				/* MCLK source is a stand-alone oscillator */ -				clock-frequency = <12288000>; +				/* +				 * clock-frequency will be set by U-Boot if +				 * the clock is enabled. +				 */  			};  		}; @@ -280,7 +282,8 @@  			codec-handle = <&wm8776>;  			fsl,playback-dma = <&dma00>;  			fsl,capture-dma = <&dma01>; -			fsl,fifo-depth = <16>; +			fsl,fifo-depth = <15>; +			fsl,ssi-asynchronous;  		};  		dma@c300 { diff --git a/arch/powerpc/configs/52xx/pcm030_defconfig b/arch/powerpc/configs/52xx/pcm030_defconfig index 7f7e4a87860..22e719575c6 100644 --- a/arch/powerpc/configs/52xx/pcm030_defconfig +++ b/arch/powerpc/configs/52xx/pcm030_defconfig @@ -85,7 +85,7 @@ CONFIG_USB_OHCI_HCD=m  CONFIG_USB_OHCI_HCD_PPC_OF_BE=y  # CONFIG_USB_OHCI_HCD_PCI is not set  CONFIG_USB_STORAGE=m -CONFIG_RTC_CLASS=m +CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_PCF8563=m  CONFIG_EXT2_FS=m  CONFIG_EXT3_FS=m diff --git a/arch/powerpc/configs/ps3_defconfig b/arch/powerpc/configs/ps3_defconfig index 6472322bf13..185c292b0f1 100644 --- a/arch/powerpc/configs/ps3_defconfig +++ b/arch/powerpc/configs/ps3_defconfig @@ -141,7 +141,7 @@ CONFIG_USB_EHCI_TT_NEWSCHED=y  # CONFIG_USB_EHCI_HCD_PPC_OF is not set  CONFIG_USB_OHCI_HCD=m  CONFIG_USB_STORAGE=m -CONFIG_RTC_CLASS=m +CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_PS3=m  CONFIG_EXT2_FS=m  CONFIG_EXT3_FS=m diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig index c9f212b5f3d..80bc5de7ee1 100644 --- a/arch/powerpc/configs/pseries_defconfig +++ b/arch/powerpc/configs/pseries_defconfig @@ -148,7 +148,6 @@ CONFIG_SCSI_SAS_ATTRS=m  CONFIG_SCSI_CXGB3_ISCSI=m  CONFIG_SCSI_CXGB4_ISCSI=m  CONFIG_SCSI_BNX2_ISCSI=m -CONFIG_SCSI_BNX2_ISCSI=m  CONFIG_BE2ISCSI=m  CONFIG_SCSI_IBMVSCSI=y  CONFIG_SCSI_IBMVFC=m diff --git a/arch/powerpc/include/asm/mmzone.h b/arch/powerpc/include/asm/mmzone.h index fd3fd58bad8..7b589178be4 100644 --- a/arch/powerpc/include/asm/mmzone.h +++ b/arch/powerpc/include/asm/mmzone.h @@ -38,13 +38,6 @@ u64 memory_hotplug_max(void);  #define memory_hotplug_max() memblock_end_of_DRAM()  #endif -/* - * Following are macros that each numa implmentation must define. - */ - -#define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn) -#define node_end_pfn(nid)	(NODE_DATA(nid)->node_end_pfn) -  #else  #define memory_hotplug_max() memblock_end_of_DRAM()  #endif /* CONFIG_NEED_MULTIPLE_NODES */ diff --git a/arch/powerpc/kernel/rtas-rtc.c b/arch/powerpc/kernel/rtas-rtc.c index 77578c093dd..c57c19358a2 100644 --- a/arch/powerpc/kernel/rtas-rtc.c +++ b/arch/powerpc/kernel/rtas-rtc.c @@ -4,6 +4,7 @@  #include <linux/init.h>  #include <linux/rtc.h>  #include <linux/delay.h> +#include <linux/ratelimit.h>  #include <asm/prom.h>  #include <asm/rtas.h>  #include <asm/time.h> @@ -29,9 +30,10 @@ unsigned long __init rtas_get_boot_time(void)  		}  	} while (wait_time && (get_tb() < max_wait_tb)); -	if (error != 0 && printk_ratelimit()) { -		printk(KERN_WARNING "error: reading the clock failed (%d)\n", -			error); +	if (error != 0) { +		printk_ratelimited(KERN_WARNING +				   "error: reading the clock failed (%d)\n", +				   error);  		return 0;  	} @@ -55,19 +57,21 @@ void rtas_get_rtc_time(struct rtc_time *rtc_tm)  		wait_time = rtas_busy_delay_time(error);  		if (wait_time) { -			if (in_interrupt() && printk_ratelimit()) { +			if (in_interrupt()) {  				memset(rtc_tm, 0, sizeof(struct rtc_time)); -				printk(KERN_WARNING "error: reading clock" -				       " would delay interrupt\n"); +				printk_ratelimited(KERN_WARNING +						   "error: reading clock " +						   "would delay interrupt\n");  				return;	/* delay not allowed */  			}  			msleep(wait_time);  		}  	} while (wait_time && (get_tb() < max_wait_tb)); -        if (error != 0 && printk_ratelimit()) { -                printk(KERN_WARNING "error: reading the clock failed (%d)\n", -		       error); +	if (error != 0) { +		printk_ratelimited(KERN_WARNING +				   "error: reading the clock failed (%d)\n", +				   error);  		return;          } @@ -99,9 +103,10 @@ int rtas_set_rtc_time(struct rtc_time *tm)  		}  	} while (wait_time && (get_tb() < max_wait_tb)); -        if (error != 0 && printk_ratelimit()) -                printk(KERN_WARNING "error: setting the clock failed (%d)\n", -		       error); +	if (error != 0) +		printk_ratelimited(KERN_WARNING +				   "error: setting the clock failed (%d)\n", +				   error);          return 0;  } diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index b96a3a010c2..78b76dc54df 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c @@ -25,6 +25,7 @@  #include <linux/errno.h>  #include <linux/elf.h>  #include <linux/ptrace.h> +#include <linux/ratelimit.h>  #ifdef CONFIG_PPC64  #include <linux/syscalls.h>  #include <linux/compat.h> @@ -892,11 +893,12 @@ badframe:  	printk("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n",  	       regs, frame, newsp);  #endif -	if (show_unhandled_signals && printk_ratelimit()) -		printk(KERN_INFO "%s[%d]: bad frame in handle_rt_signal32: " -			"%p nip %08lx lr %08lx\n", -			current->comm, current->pid, -			addr, regs->nip, regs->link); +	if (show_unhandled_signals) +		printk_ratelimited(KERN_INFO +				   "%s[%d]: bad frame in handle_rt_signal32: " +				   "%p nip %08lx lr %08lx\n", +				   current->comm, current->pid, +				   addr, regs->nip, regs->link);  	force_sigsegv(sig, current);  	return 0; @@ -1058,11 +1060,12 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,  	return 0;   bad: -	if (show_unhandled_signals && printk_ratelimit()) -		printk(KERN_INFO "%s[%d]: bad frame in sys_rt_sigreturn: " -			"%p nip %08lx lr %08lx\n", -			current->comm, current->pid, -			rt_sf, regs->nip, regs->link); +	if (show_unhandled_signals) +		printk_ratelimited(KERN_INFO +				   "%s[%d]: bad frame in sys_rt_sigreturn: " +				   "%p nip %08lx lr %08lx\n", +				   current->comm, current->pid, +				   rt_sf, regs->nip, regs->link);  	force_sig(SIGSEGV, current);  	return 0; @@ -1149,12 +1152,12 @@ int sys_debug_setcontext(struct ucontext __user *ctx,  	 * We kill the task with a SIGSEGV in this situation.  	 */  	if (do_setcontext(ctx, regs, 1)) { -		if (show_unhandled_signals && printk_ratelimit()) -			printk(KERN_INFO "%s[%d]: bad frame in " -				"sys_debug_setcontext: %p nip %08lx " -				"lr %08lx\n", -				current->comm, current->pid, -				ctx, regs->nip, regs->link); +		if (show_unhandled_signals) +			printk_ratelimited(KERN_INFO "%s[%d]: bad frame in " +					   "sys_debug_setcontext: %p nip %08lx " +					   "lr %08lx\n", +					   current->comm, current->pid, +					   ctx, regs->nip, regs->link);  		force_sig(SIGSEGV, current);  		goto out; @@ -1236,11 +1239,12 @@ badframe:  	printk("badframe in handle_signal, regs=%p frame=%p newsp=%lx\n",  	       regs, frame, newsp);  #endif -	if (show_unhandled_signals && printk_ratelimit()) -		printk(KERN_INFO "%s[%d]: bad frame in handle_signal32: " -			"%p nip %08lx lr %08lx\n", -			current->comm, current->pid, -			frame, regs->nip, regs->link); +	if (show_unhandled_signals) +		printk_ratelimited(KERN_INFO +				   "%s[%d]: bad frame in handle_signal32: " +				   "%p nip %08lx lr %08lx\n", +				   current->comm, current->pid, +				   frame, regs->nip, regs->link);  	force_sigsegv(sig, current);  	return 0; @@ -1288,11 +1292,12 @@ long sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,  	return 0;  badframe: -	if (show_unhandled_signals && printk_ratelimit()) -		printk(KERN_INFO "%s[%d]: bad frame in sys_sigreturn: " -			"%p nip %08lx lr %08lx\n", -			current->comm, current->pid, -			addr, regs->nip, regs->link); +	if (show_unhandled_signals) +		printk_ratelimited(KERN_INFO +				   "%s[%d]: bad frame in sys_sigreturn: " +				   "%p nip %08lx lr %08lx\n", +				   current->comm, current->pid, +				   addr, regs->nip, regs->link);  	force_sig(SIGSEGV, current);  	return 0; diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index da989fff19c..e91c736cc84 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c @@ -24,6 +24,7 @@  #include <linux/elf.h>  #include <linux/ptrace.h>  #include <linux/module.h> +#include <linux/ratelimit.h>  #include <asm/sigcontext.h>  #include <asm/ucontext.h> @@ -380,10 +381,10 @@ badframe:  	printk("badframe in sys_rt_sigreturn, regs=%p uc=%p &uc->uc_mcontext=%p\n",  	       regs, uc, &uc->uc_mcontext);  #endif -	if (show_unhandled_signals && printk_ratelimit()) -		printk(regs->msr & MSR_64BIT ? fmt64 : fmt32, -			current->comm, current->pid, "rt_sigreturn", -			(long)uc, regs->nip, regs->link); +	if (show_unhandled_signals) +		printk_ratelimited(regs->msr & MSR_64BIT ? fmt64 : fmt32, +				   current->comm, current->pid, "rt_sigreturn", +				   (long)uc, regs->nip, regs->link);  	force_sig(SIGSEGV, current);  	return 0; @@ -468,10 +469,10 @@ badframe:  	printk("badframe in setup_rt_frame, regs=%p frame=%p newsp=%lx\n",  	       regs, frame, newsp);  #endif -	if (show_unhandled_signals && printk_ratelimit()) -		printk(regs->msr & MSR_64BIT ? fmt64 : fmt32, -			current->comm, current->pid, "setup_rt_frame", -			(long)frame, regs->nip, regs->link); +	if (show_unhandled_signals) +		printk_ratelimited(regs->msr & MSR_64BIT ? fmt64 : fmt32, +				   current->comm, current->pid, "setup_rt_frame", +				   (long)frame, regs->nip, regs->link);  	force_sigsegv(signr, current);  	return 0; diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 0ff4ab98d50..1a0141426cd 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -34,6 +34,7 @@  #include <linux/bug.h>  #include <linux/kdebug.h>  #include <linux/debugfs.h> +#include <linux/ratelimit.h>  #include <asm/emulated_ops.h>  #include <asm/pgtable.h> @@ -197,12 +198,11 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)  		if (die("Exception in kernel mode", regs, signr))  			return;  	} else if (show_unhandled_signals && -		    unhandled_signal(current, signr) && -		    printk_ratelimit()) { -			printk(regs->msr & MSR_64BIT ? fmt64 : fmt32, -				current->comm, current->pid, signr, -				addr, regs->nip, regs->link, code); -		} +		   unhandled_signal(current, signr)) { +		printk_ratelimited(regs->msr & MSR_64BIT ? fmt64 : fmt32, +				   current->comm, current->pid, signr, +				   addr, regs->nip, regs->link, code); +	}  	memset(&info, 0, sizeof(info));  	info.si_signo = signr; @@ -425,7 +425,7 @@ int machine_check_e500mc(struct pt_regs *regs)  	unsigned long reason = mcsr;  	int recoverable = 1; -	if (reason & MCSR_BUS_RBERR) { +	if (reason & MCSR_LD) {  		recoverable = fsl_rio_mcheck_exception(regs);  		if (recoverable == 1)  			goto silent_out; @@ -1342,9 +1342,8 @@ void altivec_assist_exception(struct pt_regs *regs)  	} else {  		/* didn't recognize the instruction */  		/* XXX quick hack for now: set the non-Java bit in the VSCR */ -		if (printk_ratelimit()) -			printk(KERN_ERR "Unrecognized altivec instruction " -			       "in %s at %lx\n", current->comm, regs->nip); +		printk_ratelimited(KERN_ERR "Unrecognized altivec instruction " +				   "in %s at %lx\n", current->comm, regs->nip);  		current->thread.vscr.u[3] |= 0x10000;  	}  } @@ -1548,9 +1547,8 @@ u32 ppc_warn_emulated;  void ppc_warn_emulated_print(const char *type)  { -	if (printk_ratelimit()) -		pr_warning("%s used emulated %s instruction\n", current->comm, -			   type); +	pr_warn_ratelimited("%s used emulated %s instruction\n", current->comm, +			    type);  }  static int __init ppc_warn_emulated_init(void) diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index 54f4fb994e9..ad35f66c69e 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c @@ -31,6 +31,7 @@  #include <linux/kdebug.h>  #include <linux/perf_event.h>  #include <linux/magic.h> +#include <linux/ratelimit.h>  #include <asm/firmware.h>  #include <asm/page.h> @@ -346,11 +347,10 @@ bad_area_nosemaphore:  		return 0;  	} -	if (is_exec && (error_code & DSISR_PROTFAULT) -	    && printk_ratelimit()) -		printk(KERN_CRIT "kernel tried to execute NX-protected" -		       " page (%lx) - exploit attempt? (uid: %d)\n", -		       address, current_uid()); +	if (is_exec && (error_code & DSISR_PROTFAULT)) +		printk_ratelimited(KERN_CRIT "kernel tried to execute NX-protected" +				   " page (%lx) - exploit attempt? (uid: %d)\n", +				   address, current_uid());  	return SIGSEGV; diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index 95853386a66..2de8551df40 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c @@ -283,23 +283,24 @@ static void __iomem *rio_regs_win;  #ifdef CONFIG_E500  int fsl_rio_mcheck_exception(struct pt_regs *regs)  { -	const struct exception_table_entry *entry = NULL; -	unsigned long reason = mfspr(SPRN_MCSR); +	const struct exception_table_entry *entry; +	unsigned long reason; -	if (reason & MCSR_BUS_RBERR) { -		reason = in_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR)); -		if (reason & (RIO_LTLEDCSR_IER | RIO_LTLEDCSR_PRT)) { -			/* Check if we are prepared to handle this fault */ -			entry = search_exception_tables(regs->nip); -			if (entry) { -				pr_debug("RIO: %s - MC Exception handled\n", -					 __func__); -				out_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR), -					 0); -				regs->msr |= MSR_RI; -				regs->nip = entry->fixup; -				return 1; -			} +	if (!rio_regs_win) +		return 0; + +	reason = in_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR)); +	if (reason & (RIO_LTLEDCSR_IER | RIO_LTLEDCSR_PRT)) { +		/* Check if we are prepared to handle this fault */ +		entry = search_exception_tables(regs->nip); +		if (entry) { +			pr_debug("RIO: %s - MC Exception handled\n", +				 __func__); +			out_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR), +				 0); +			regs->msr |= MSR_RI; +			regs->nip = entry->fixup; +			return 1;  		}  	} diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 3a8de5bb628..58d7a534f87 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c @@ -29,6 +29,7 @@  #include <linux/pci.h>  #include <linux/slab.h>  #include <linux/syscore_ops.h> +#include <linux/ratelimit.h>  #include <asm/ptrace.h>  #include <asm/signal.h> @@ -1648,9 +1649,8 @@ static unsigned int _mpic_get_one_irq(struct mpic *mpic, int reg)  		return NO_IRQ;  	}  	if (unlikely(mpic->protected && test_bit(src, mpic->protected))) { -		if (printk_ratelimit()) -			printk(KERN_WARNING "%s: Got protected source %d !\n", -			       mpic->name, (int)src); +		printk_ratelimited(KERN_WARNING "%s: Got protected source %d !\n", +				   mpic->name, (int)src);  		mpic_eoi(mpic);  		return NO_IRQ;  	} @@ -1688,9 +1688,8 @@ unsigned int mpic_get_coreint_irq(void)  		return NO_IRQ;  	}  	if (unlikely(mpic->protected && test_bit(src, mpic->protected))) { -		if (printk_ratelimit()) -			printk(KERN_WARNING "%s: Got protected source %d !\n", -			       mpic->name, (int)src); +		printk_ratelimited(KERN_WARNING "%s: Got protected source %d !\n", +				   mpic->name, (int)src);  		return NO_IRQ;  	} diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 90d77bd078f..c03fef7a9c2 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -579,6 +579,7 @@ config S390_GUEST  	def_bool y  	prompt "s390 guest support for KVM (EXPERIMENTAL)"  	depends on 64BIT && EXPERIMENTAL +	select VIRTUALIZATION  	select VIRTIO  	select VIRTIO_RING  	select VIRTIO_CONSOLE diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 52420d2785b..1d55c95f617 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c @@ -262,7 +262,7 @@ void smp_ctl_set_bit(int cr, int bit)  	memset(&parms.orvals, 0, sizeof(parms.orvals));  	memset(&parms.andvals, 0xff, sizeof(parms.andvals)); -	parms.orvals[cr] = 1 << bit; +	parms.orvals[cr] = 1UL << bit;  	on_each_cpu(smp_ctl_bit_callback, &parms, 1);  }  EXPORT_SYMBOL(smp_ctl_set_bit); @@ -276,7 +276,7 @@ void smp_ctl_clear_bit(int cr, int bit)  	memset(&parms.orvals, 0, sizeof(parms.orvals));  	memset(&parms.andvals, 0xff, sizeof(parms.andvals)); -	parms.andvals[cr] = ~(1L << bit); +	parms.andvals[cr] = ~(1UL << bit);  	on_each_cpu(smp_ctl_bit_callback, &parms, 1);  }  EXPORT_SYMBOL(smp_ctl_clear_bit); diff --git a/arch/s390/oprofile/init.c b/arch/s390/oprofile/init.c index 0c2d94b94f0..6efc18b5e60 100644 --- a/arch/s390/oprofile/init.c +++ b/arch/s390/oprofile/init.c @@ -23,7 +23,7 @@ extern void s390_backtrace(struct pt_regs * const regs, unsigned int depth);  #include "hwsampler.h" -#define DEFAULT_INTERVAL	4096 +#define DEFAULT_INTERVAL	4127518  #define DEFAULT_SDBT_BLOCKS	1  #define DEFAULT_SDB_BLOCKS	511 @@ -149,6 +149,12 @@ static int oprofile_hwsampler_init(struct oprofile_operations *ops)  	if (oprofile_max_interval == 0)  		return -ENODEV; +	/* The initial value should be sane */ +	if (oprofile_hw_interval < oprofile_min_interval) +		oprofile_hw_interval = oprofile_min_interval; +	if (oprofile_hw_interval > oprofile_max_interval) +		oprofile_hw_interval = oprofile_max_interval; +  	if (oprofile_timer_init(ops))  		return -ENODEV; diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index f03338c2f08..bbdeb48bbf8 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -348,6 +348,7 @@ config CPU_SUBTYPE_SH7720  	select SYS_SUPPORTS_CMT  	select ARCH_WANT_OPTIONAL_GPIOLIB  	select USB_ARCH_HAS_OHCI +	select USB_OHCI_SH if USB_OHCI_HCD  	help  	  Select SH7720 if you have a SH3-DSP SH7720 CPU. @@ -357,6 +358,7 @@ config CPU_SUBTYPE_SH7721  	select CPU_HAS_DSP  	select SYS_SUPPORTS_CMT  	select USB_ARCH_HAS_OHCI +	select USB_OHCI_SH if USB_OHCI_HCD  	help  	  Select SH7721 if you have a SH3-DSP SH7721 CPU. @@ -440,6 +442,7 @@ config CPU_SUBTYPE_SH7763  	bool "Support SH7763 processor"  	select CPU_SH4A  	select USB_ARCH_HAS_OHCI +	select USB_OHCI_SH if USB_OHCI_HCD  	help  	  Select SH7763 if you have a SH4A SH7763(R5S77631) CPU. @@ -467,7 +470,9 @@ config CPU_SUBTYPE_SH7786  	select GENERIC_CLOCKEVENTS_BROADCAST if SMP  	select ARCH_WANT_OPTIONAL_GPIOLIB  	select USB_ARCH_HAS_OHCI +	select USB_OHCI_SH if USB_OHCI_HCD  	select USB_ARCH_HAS_EHCI +	select USB_EHCI_SH if USB_EHCI_HCD  config CPU_SUBTYPE_SHX3  	bool "Support SH-X3 processor" diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index f80478f36d5..b24d69d509e 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c @@ -20,6 +20,7 @@  #include <linux/io.h>  #include <linux/delay.h>  #include <linux/usb/r8a66597.h> +#include <linux/usb/renesas_usbhs.h>  #include <linux/i2c.h>  #include <linux/i2c/tsc2007.h>  #include <linux/spi/spi.h> @@ -232,6 +233,52 @@ static struct platform_device usb1_common_device = {  	.resource	= usb1_common_resources,  }; +/* + * USBHS + */ +static int usbhs_get_id(struct platform_device *pdev) +{ +	return gpio_get_value(GPIO_PTB3); +} + +static struct renesas_usbhs_platform_info usbhs_info = { +	.platform_callback = { +		.get_id		= usbhs_get_id, +	}, +	.driver_param = { +		.buswait_bwait		= 4, +		.detection_delay	= 5, +	}, +}; + +static struct resource usbhs_resources[] = { +	[0] = { +		.start	= 0xa4d90000, +		.end	= 0xa4d90124 - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= 66, +		.end	= 66, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device usbhs_device = { +	.name	= "renesas_usbhs", +	.id	= 1, +	.dev = { +		.dma_mask		= NULL,         /*  not use dma */ +		.coherent_dma_mask	= 0xffffffff, +		.platform_data		= &usbhs_info, +	}, +	.num_resources	= ARRAY_SIZE(usbhs_resources), +	.resource	= usbhs_resources, +	.archdata = { +		.hwblk_id = HWBLK_USB1, +	}, +}; +  /* LCDC */  static const struct fb_videomode ecovec_lcd_modes[] = {  	{ @@ -897,6 +944,7 @@ static struct platform_device *ecovec_devices[] __initdata = {  	&sh_eth_device,  	&usb0_host_device,  	&usb1_common_device, +	&usbhs_device,  	&lcdc_device,  	&ceu0_device,  	&ceu1_device, diff --git a/arch/sh/boot/compressed/Makefile b/arch/sh/boot/compressed/Makefile index 780e083e4d1..23bc849d9c6 100644 --- a/arch/sh/boot/compressed/Makefile +++ b/arch/sh/boot/compressed/Makefile @@ -27,8 +27,6 @@ IMAGE_OFFSET	:= $(shell /bin/bash -c 'printf "0x%08x" \  			$(CONFIG_BOOT_LINK_OFFSET)]')  endif -LIBGCC	:= $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) -  ifeq ($(CONFIG_MCOUNT),y)  ORIG_CFLAGS := $(KBUILD_CFLAGS)  KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS)) @@ -37,7 +35,25 @@ endif  LDFLAGS_vmlinux := --oformat $(ld-bfd) -Ttext $(IMAGE_OFFSET) -e startup \  		   -T $(obj)/../../kernel/vmlinux.lds -$(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o $(LIBGCC) FORCE +# +# Pull in the necessary libgcc bits from the in-kernel implementation. +# +lib1funcs-$(CONFIG_SUPERH32)	:= ashiftrt.S ashldi3.c ashrsi3.S ashlsi3.S \ +				   lshrsi3.S +lib1funcs-obj			:= \ +	$(addsuffix .o, $(basename $(addprefix $(obj)/, $(lib1funcs-y)))) + +lib1funcs-dir		:= $(srctree)/arch/$(SRCARCH)/lib +ifeq ($(BITS),64) +	lib1funcs-dir 	:= $(addsuffix $(BITS), $(lib1funcs-dir)) +endif + +KBUILD_CFLAGS += -I$(lib1funcs-dir) + +$(addprefix $(obj)/,$(lib1funcs-y)): $(obj)/%: $(lib1funcs-dir)/% FORCE +	$(call cmd,shipped) + +$(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o $(lib1funcs-obj) FORCE  	$(call if_changed,ld)  	@: diff --git a/arch/sh/configs/sh7757lcr_defconfig b/arch/sh/configs/sh7757lcr_defconfig index 33ddb130a7c..cfde98ddb29 100644 --- a/arch/sh/configs/sh7757lcr_defconfig +++ b/arch/sh/configs/sh7757lcr_defconfig @@ -9,7 +9,6 @@ CONFIG_TASK_XACCT=y  CONFIG_TASK_IO_ACCOUNTING=y  CONFIG_LOG_BUF_SHIFT=14  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  # CONFIG_SYSCTL_SYSCALL is not set  CONFIG_KALLSYMS_ALL=y  CONFIG_SLAB=y @@ -39,8 +38,6 @@ CONFIG_IPV6=y  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_CONCAT=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y  CONFIG_MTD_M25P80=y @@ -56,18 +53,19 @@ CONFIG_SH_ETH=y  # CONFIG_KEYBOARD_ATKBD is not set  # CONFIG_MOUSE_PS2 is not set  # CONFIG_SERIO is not set +# CONFIG_LEGACY_PTYS is not set  CONFIG_SERIAL_SH_SCI=y  CONFIG_SERIAL_SH_SCI_NR_UARTS=3  CONFIG_SERIAL_SH_SCI_CONSOLE=y -# CONFIG_LEGACY_PTYS is not set  # CONFIG_HW_RANDOM is not set  CONFIG_SPI=y  CONFIG_SPI_SH=y  # CONFIG_HWMON is not set -CONFIG_MFD_SH_MOBILE_SDHI=y  CONFIG_USB=y  CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_SH=y  CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_SH=y  CONFIG_USB_STORAGE=y  CONFIG_MMC=y  CONFIG_MMC_SDHI=y diff --git a/arch/sh/configs/titan_defconfig b/arch/sh/configs/titan_defconfig index 0f558914e76..e2cbd92d520 100644 --- a/arch/sh/configs/titan_defconfig +++ b/arch/sh/configs/titan_defconfig @@ -227,7 +227,7 @@ CONFIG_USB_SERIAL=m  CONFIG_USB_SERIAL_GENERIC=y  CONFIG_USB_SERIAL_ARK3116=m  CONFIG_USB_SERIAL_PL2303=m -CONFIG_RTC_CLASS=m +CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_SH=m  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y diff --git a/arch/sh/include/asm/cmpxchg-grb.h b/arch/sh/include/asm/cmpxchg-grb.h index 4676bf57693..f848dec9e48 100644 --- a/arch/sh/include/asm/cmpxchg-grb.h +++ b/arch/sh/include/asm/cmpxchg-grb.h @@ -15,8 +15,9 @@ static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)  		"   mov.l   %2,   @%1     \n\t" /* store new value */  		"1: mov     r1,   r15     \n\t" /* LOGOUT */  		: "=&r" (retval), -		  "+r"  (m) -		: "r"   (val) +		  "+r"  (m), +		  "+r"  (val)		/* inhibit r15 overloading */ +		:  		: "memory", "r0", "r1");  	return retval; @@ -36,8 +37,9 @@ static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)  		"   mov.b   %2,   @%1     \n\t" /* store new value */  		"1: mov     r1,   r15     \n\t" /* LOGOUT */  		: "=&r" (retval), -		  "+r"  (m) -		: "r"   (val) +		  "+r"  (m), +		  "+r"  (val)		/* inhibit r15 overloading */ +		:  		: "memory" , "r0", "r1");  	return retval; @@ -54,13 +56,14 @@ static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old,  		"   nop                   \n\t"  		"   mov    r15,   r1      \n\t" /* r1 = saved sp */  		"   mov    #-8,   r15     \n\t" /* LOGIN */ -		"   mov.l  @%1,   %0      \n\t" /* load  old value */ -		"   cmp/eq  %0,   %2      \n\t" +		"   mov.l  @%3,   %0      \n\t" /* load  old value */ +		"   cmp/eq  %0,   %1      \n\t"  		"   bf            1f      \n\t" /* if not equal */ -		"   mov.l   %3,   @%1     \n\t" /* store new value */ +		"   mov.l   %2,   @%3     \n\t" /* store new value */  		"1: mov     r1,   r15     \n\t" /* LOGOUT */ -		: "=&r" (retval) -		:  "r"  (m), "r"  (old), "r"  (new) +		: "=&r" (retval), +		  "+r"  (old), "+r"  (new) /* old or new can be r15 */ +		:  "r"  (m)  		: "memory" , "r0", "r1", "t");  	return retval; diff --git a/arch/sh/include/asm/mmzone.h b/arch/sh/include/asm/mmzone.h index 8887baff5ef..15a8496960e 100644 --- a/arch/sh/include/asm/mmzone.h +++ b/arch/sh/include/asm/mmzone.h @@ -9,10 +9,6 @@  extern struct pglist_data *node_data[];  #define NODE_DATA(nid)		(node_data[nid]) -#define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn) -#define node_end_pfn(nid)	(NODE_DATA(nid)->node_start_pfn + \ -				 NODE_DATA(nid)->node_spanned_pages) -  static inline int pfn_to_nid(unsigned long pfn)  {  	int nid; diff --git a/arch/sh/include/asm/processor_64.h b/arch/sh/include/asm/processor_64.h index 2a541ddb5a1..e25c4c7d6b6 100644 --- a/arch/sh/include/asm/processor_64.h +++ b/arch/sh/include/asm/processor_64.h @@ -150,7 +150,6 @@ struct thread_struct {  #define SR_USER (SR_MMU | SR_FD)  #define start_thread(_regs, new_pc, new_sp)			\ -	set_fs(USER_DS);					\  	_regs->sr = SR_USER;	/* User mode. */		\  	_regs->pc = new_pc - 4;	/* Compensate syscall exit */	\  	_regs->pc |= 1;		/* Set SHmedia ! */		\ diff --git a/arch/sh/include/cpu-sh4/cpu/sh7724.h b/arch/sh/include/cpu-sh4/cpu/sh7724.h index 3daef8ecbc6..cbc47e6bcab 100644 --- a/arch/sh/include/cpu-sh4/cpu/sh7724.h +++ b/arch/sh/include/cpu-sh4/cpu/sh7724.h @@ -298,6 +298,14 @@ enum {  	SHDMA_SLAVE_SCIF4_RX,  	SHDMA_SLAVE_SCIF5_TX,  	SHDMA_SLAVE_SCIF5_RX, +	SHDMA_SLAVE_USB0D0_TX, +	SHDMA_SLAVE_USB0D0_RX, +	SHDMA_SLAVE_USB0D1_TX, +	SHDMA_SLAVE_USB0D1_RX, +	SHDMA_SLAVE_USB1D0_TX, +	SHDMA_SLAVE_USB1D0_RX, +	SHDMA_SLAVE_USB1D1_TX, +	SHDMA_SLAVE_USB1D1_RX,  	SHDMA_SLAVE_SDHI0_TX,  	SHDMA_SLAVE_SDHI0_RX,  	SHDMA_SLAVE_SDHI1_TX, diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7724.c b/arch/sh/kernel/cpu/sh4a/setup-sh7724.c index 0333fe9e388..134a397b191 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7724.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7724.c @@ -93,6 +93,46 @@ static const struct sh_dmae_slave_config sh7724_dmae_slaves[] = {  		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0x36,  	}, { +		.slave_id	= SHDMA_SLAVE_USB0D0_TX, +		.addr		= 0xA4D80100, +		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.mid_rid	= 0x73, +	}, { +		.slave_id	= SHDMA_SLAVE_USB0D0_RX, +		.addr		= 0xA4D80100, +		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.mid_rid	= 0x73, +	}, { +		.slave_id	= SHDMA_SLAVE_USB0D1_TX, +		.addr		= 0xA4D80120, +		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.mid_rid	= 0x77, +	}, { +		.slave_id	= SHDMA_SLAVE_USB0D1_RX, +		.addr		= 0xA4D80120, +		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.mid_rid	= 0x77, +	}, { +		.slave_id	= SHDMA_SLAVE_USB1D0_TX, +		.addr		= 0xA4D90100, +		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.mid_rid	= 0xab, +	}, { +		.slave_id	= SHDMA_SLAVE_USB1D0_RX, +		.addr		= 0xA4D90100, +		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.mid_rid	= 0xab, +	}, { +		.slave_id	= SHDMA_SLAVE_USB1D1_TX, +		.addr		= 0xA4D90120, +		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.mid_rid	= 0xaf, +	}, { +		.slave_id	= SHDMA_SLAVE_USB1D1_RX, +		.addr		= 0xA4D90120, +		.chcr		= DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT), +		.mid_rid	= 0xaf, +	}, {  		.slave_id	= SHDMA_SLAVE_SDHI0_TX,  		.addr		= 0x04ce0030,  		.chcr		= DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT), diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c index 423dabf542d..e915deafac8 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c @@ -183,7 +183,7 @@ static const struct sh_dmae_slave_config sh7757_dmae1_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_SCIF2_RX,  		.addr		= 0x1f4b0014, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0x22,  	}, @@ -197,7 +197,7 @@ static const struct sh_dmae_slave_config sh7757_dmae1_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_SCIF3_RX,  		.addr		= 0x1f4c0014, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0x2a,  	}, @@ -211,7 +211,7 @@ static const struct sh_dmae_slave_config sh7757_dmae1_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_SCIF4_RX,  		.addr		= 0x1f4d0014, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0x42,  	}, @@ -228,7 +228,7 @@ static const struct sh_dmae_slave_config sh7757_dmae2_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_RIIC0_RX,  		.addr		= 0x1e500013, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0x22,  	}, @@ -242,7 +242,7 @@ static const struct sh_dmae_slave_config sh7757_dmae2_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_RIIC1_RX,  		.addr		= 0x1e510013, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0x2a,  	}, @@ -256,7 +256,7 @@ static const struct sh_dmae_slave_config sh7757_dmae2_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_RIIC2_RX,  		.addr		= 0x1e520013, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0xa2,  	}, @@ -265,12 +265,12 @@ static const struct sh_dmae_slave_config sh7757_dmae2_slaves[] = {  		.addr		= 0x1e530012,  		.chcr		= SM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT), -		.mid_rid	= 0xab, +		.mid_rid	= 0xa9,  	},  	{  		.slave_id	= SHDMA_SLAVE_RIIC3_RX,  		.addr		= 0x1e530013, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0xaf,  	}, @@ -279,14 +279,14 @@ static const struct sh_dmae_slave_config sh7757_dmae2_slaves[] = {  		.addr		= 0x1e540012,  		.chcr		= SM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT), -		.mid_rid	= 0xc1, +		.mid_rid	= 0xc5,  	},  	{  		.slave_id	= SHDMA_SLAVE_RIIC4_RX,  		.addr		= 0x1e540013, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT), -		.mid_rid	= 0xc2, +		.mid_rid	= 0xc6,  	},  }; @@ -301,7 +301,7 @@ static const struct sh_dmae_slave_config sh7757_dmae3_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_RIIC5_RX,  		.addr		= 0x1e550013, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0x22,  	}, @@ -315,7 +315,7 @@ static const struct sh_dmae_slave_config sh7757_dmae3_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_RIIC6_RX,  		.addr		= 0x1e560013, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0x2a,  	}, @@ -329,7 +329,7 @@ static const struct sh_dmae_slave_config sh7757_dmae3_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_RIIC7_RX,  		.addr		= 0x1e570013, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0x42,  	}, @@ -343,7 +343,7 @@ static const struct sh_dmae_slave_config sh7757_dmae3_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_RIIC8_RX,  		.addr		= 0x1e580013, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0x46,  	}, @@ -357,7 +357,7 @@ static const struct sh_dmae_slave_config sh7757_dmae3_slaves[] = {  	{  		.slave_id	= SHDMA_SLAVE_RIIC9_RX,  		.addr		= 0x1e590013, -		.chcr		= SM_INC | 0x800 | 0x40000000 | +		.chcr		= DM_INC | 0x800 | 0x40000000 |  				  TS_INDEX2VAL(XMIT_SZ_8BIT),  		.mid_rid	= 0x52,  	}, @@ -659,6 +659,54 @@ static struct platform_device spi0_device = {  	.resource	= spi0_resources,  }; +static struct resource usb_ehci_resources[] = { +	[0] = { +		.start	= 0xfe4f1000, +		.end	= 0xfe4f10ff, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= 57, +		.end	= 57, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device usb_ehci_device = { +	.name		= "sh_ehci", +	.id		= -1, +	.dev = { +		.dma_mask = &usb_ehci_device.dev.coherent_dma_mask, +		.coherent_dma_mask = DMA_BIT_MASK(32), +	}, +	.num_resources	= ARRAY_SIZE(usb_ehci_resources), +	.resource	= usb_ehci_resources, +}; + +static struct resource usb_ohci_resources[] = { +	[0] = { +		.start	= 0xfe4f1800, +		.end	= 0xfe4f18ff, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= 57, +		.end	= 57, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device usb_ohci_device = { +	.name		= "sh_ohci", +	.id		= -1, +	.dev = { +		.dma_mask = &usb_ohci_device.dev.coherent_dma_mask, +		.coherent_dma_mask = DMA_BIT_MASK(32), +	}, +	.num_resources	= ARRAY_SIZE(usb_ohci_resources), +	.resource	= usb_ohci_resources, +}; +  static struct platform_device *sh7757_devices[] __initdata = {  	&scif2_device,  	&scif3_device, @@ -670,6 +718,8 @@ static struct platform_device *sh7757_devices[] __initdata = {  	&dma2_device,  	&dma3_device,  	&spi0_device, +	&usb_ehci_device, +	&usb_ohci_device,  };  static int __init sh7757_devices_setup(void) @@ -1039,13 +1089,13 @@ static DECLARE_INTC_DESC(intc_desc, "sh7757", vectors, groups,  /* Support for external interrupt pins in IRQ mode */  static struct intc_vect vectors_irq0123[] __initdata = { -	INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280), -	INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300), +	INTC_VECT(IRQ0, 0x200), INTC_VECT(IRQ1, 0x240), +	INTC_VECT(IRQ2, 0x280), INTC_VECT(IRQ3, 0x2c0),  };  static struct intc_vect vectors_irq4567[] __initdata = { -	INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380), -	INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200), +	INTC_VECT(IRQ4, 0x300), INTC_VECT(IRQ5, 0x340), +	INTC_VECT(IRQ6, 0x380), INTC_VECT(IRQ7, 0x3c0),  };  static struct intc_sense_reg sense_registers[] __initdata = { @@ -1079,14 +1129,14 @@ static struct intc_vect vectors_irl0123[] __initdata = {  };  static struct intc_vect vectors_irl4567[] __initdata = { -	INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20), -	INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60), -	INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0), -	INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0), -	INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20), -	INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60), -	INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0), -	INTC_VECT(IRL4_HHHL, 0xcc0), +	INTC_VECT(IRL4_LLLL, 0x200), INTC_VECT(IRL4_LLLH, 0x220), +	INTC_VECT(IRL4_LLHL, 0x240), INTC_VECT(IRL4_LLHH, 0x260), +	INTC_VECT(IRL4_LHLL, 0x280), INTC_VECT(IRL4_LHLH, 0x2a0), +	INTC_VECT(IRL4_LHHL, 0x2c0), INTC_VECT(IRL4_LHHH, 0x2e0), +	INTC_VECT(IRL4_HLLL, 0x300), INTC_VECT(IRL4_HLLH, 0x320), +	INTC_VECT(IRL4_HLHL, 0x340), INTC_VECT(IRL4_HLHH, 0x360), +	INTC_VECT(IRL4_HHLL, 0x380), INTC_VECT(IRL4_HHLH, 0x3a0), +	INTC_VECT(IRL4_HHHL, 0x3c0),  };  static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7757-irl0123", vectors_irl0123, diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index 91971103b62..a3ee9197112 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c @@ -13,6 +13,7 @@  #include <linux/seq_file.h>  #include <linux/ftrace.h>  #include <linux/delay.h> +#include <linux/ratelimit.h>  #include <asm/processor.h>  #include <asm/machvec.h>  #include <asm/uaccess.h> @@ -268,9 +269,8 @@ void migrate_irqs(void)  			unsigned int newcpu = cpumask_any_and(data->affinity,  							      cpu_online_mask);  			if (newcpu >= nr_cpu_ids) { -				if (printk_ratelimit()) -					printk(KERN_INFO "IRQ%u no longer affine to CPU%u\n", -					       irq, cpu); +				pr_info_ratelimited("IRQ%u no longer affine to CPU%u\n", +						    irq, cpu);  				cpumask_setall(data->affinity);  				newcpu = cpumask_any_and(data->affinity, diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c index b473f0c06fb..aaf6d59c201 100644 --- a/arch/sh/kernel/process_32.c +++ b/arch/sh/kernel/process_32.c @@ -102,8 +102,6 @@ EXPORT_SYMBOL(kernel_thread);  void start_thread(struct pt_regs *regs, unsigned long new_pc,  		  unsigned long new_sp)  { -	set_fs(USER_DS); -  	regs->pr = 0;  	regs->sr = SR_FD;  	regs->pc = new_pc; diff --git a/arch/sh/mm/alignment.c b/arch/sh/mm/alignment.c index b2595b8548e..620fa7ff9ee 100644 --- a/arch/sh/mm/alignment.c +++ b/arch/sh/mm/alignment.c @@ -13,6 +13,7 @@  #include <linux/seq_file.h>  #include <linux/proc_fs.h>  #include <linux/uaccess.h> +#include <linux/ratelimit.h>  #include <asm/alignment.h>  #include <asm/processor.h> @@ -95,13 +96,13 @@ int set_unalign_ctl(struct task_struct *tsk, unsigned int val)  void unaligned_fixups_notify(struct task_struct *tsk, insn_size_t insn,  			     struct pt_regs *regs)  { -	if (user_mode(regs) && (se_usermode & UM_WARN) && printk_ratelimit()) -		pr_notice("Fixing up unaligned userspace access " +	if (user_mode(regs) && (se_usermode & UM_WARN)) +		pr_notice_ratelimited("Fixing up unaligned userspace access "  			  "in \"%s\" pid=%d pc=0x%p ins=0x%04hx\n",  			  tsk->comm, task_pid_nr(tsk),  			  (void *)instruction_pointer(regs), insn); -	else if (se_kernmode_warn && printk_ratelimit()) -		pr_notice("Fixing up unaligned kernel access " +	else if (se_kernmode_warn) +		pr_notice_ratelimited("Fixing up unaligned kernel access "  			  "in \"%s\" pid=%d pc=0x%p ins=0x%04hx\n",  			  tsk->comm, task_pid_nr(tsk),  			  (void *)instruction_pointer(regs), insn); diff --git a/arch/sh/mm/cache-debugfs.c b/arch/sh/mm/cache-debugfs.c index 52411462c40..11572519803 100644 --- a/arch/sh/mm/cache-debugfs.c +++ b/arch/sh/mm/cache-debugfs.c @@ -26,9 +26,9 @@ static int cache_seq_show(struct seq_file *file, void *iter)  {  	unsigned int cache_type = (unsigned int)file->private;  	struct cache_info *cache; -	unsigned int waysize, way, cache_size; -	unsigned long ccr, base; -	static unsigned long addrstart = 0; +	unsigned int waysize, way; +	unsigned long ccr; +	unsigned long addrstart = 0;  	/*  	 * Go uncached immediately so we don't skew the results any @@ -45,28 +45,13 @@ static int cache_seq_show(struct seq_file *file, void *iter)  	}  	if (cache_type == CACHE_TYPE_DCACHE) { -		base = CACHE_OC_ADDRESS_ARRAY; +		addrstart = CACHE_OC_ADDRESS_ARRAY;  		cache = ¤t_cpu_data.dcache;  	} else { -		base = CACHE_IC_ADDRESS_ARRAY; +		addrstart = CACHE_IC_ADDRESS_ARRAY;  		cache = ¤t_cpu_data.icache;  	} -	/* -	 * Due to the amount of data written out (depending on the cache size), -	 * we may be iterated over multiple times. In this case, keep track of -	 * the entry position in addrstart, and rewind it when we've hit the -	 * end of the cache. -	 * -	 * Likewise, the same code is used for multiple caches, so care must -	 * be taken for bouncing addrstart back and forth so the appropriate -	 * cache is hit. -	 */ -	cache_size = cache->ways * cache->sets * cache->linesz; -	if (((addrstart & 0xff000000) != base) || -	     (addrstart & 0x00ffffff) > cache_size) -		addrstart = base; -  	waysize = cache->sets;  	/* diff --git a/arch/sparc/include/asm/mmzone.h b/arch/sparc/include/asm/mmzone.h index e8c648741ed..99d9b9f577b 100644 --- a/arch/sparc/include/asm/mmzone.h +++ b/arch/sparc/include/asm/mmzone.h @@ -8,8 +8,6 @@  extern struct pglist_data *node_data[];  #define NODE_DATA(nid)		(node_data[nid]) -#define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn) -#define node_end_pfn(nid)	(NODE_DATA(nid)->node_end_pfn)  extern int numa_cpu_lookup_table[];  extern cpumask_t numa_cpumask_lookup_table[]; diff --git a/arch/tile/include/asm/mmzone.h b/arch/tile/include/asm/mmzone.h index c6344c4f32a..9d3dbce8f95 100644 --- a/arch/tile/include/asm/mmzone.h +++ b/arch/tile/include/asm/mmzone.h @@ -40,17 +40,6 @@ static inline int pfn_to_nid(unsigned long pfn)  	return highbits_to_node[__pfn_to_highbits(pfn)];  } -/* - * Following are macros that each numa implmentation must define. - */ - -#define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn) -#define node_end_pfn(nid)						\ -({									\ -	pg_data_t *__pgdat = NODE_DATA(nid);				\ -	__pgdat->node_start_pfn + __pgdat->node_spanned_pages;		\ -}) -  #define kern_addr_valid(kaddr)	virt_addr_valid((void *)kaddr)  static inline int pfn_valid(int pfn) diff --git a/arch/um/include/asm/percpu.h b/arch/um/include/asm/percpu.h new file mode 100644 index 00000000000..efe7508d8ab --- /dev/null +++ b/arch/um/include/asm/percpu.h @@ -0,0 +1,6 @@ +#ifndef __UM_PERCPU_H +#define __UM_PERCPU_H + +#include <asm-generic/percpu.h> + +#endif /* __UM_PERCPU_H */ diff --git a/arch/x86/include/asm/apb_timer.h b/arch/x86/include/asm/apb_timer.h index 2fefa501d3b..af60d8a2e28 100644 --- a/arch/x86/include/asm/apb_timer.h +++ b/arch/x86/include/asm/apb_timer.h @@ -62,7 +62,7 @@ extern int sfi_mtimer_num;  #else /* CONFIG_APB_TIMER */  static inline unsigned long apbt_quick_calibrate(void) {return 0; } -static inline void apbt_time_init(void) {return 0; } +static inline void apbt_time_init(void) { }  #endif  #endif /* ASM_X86_APBT_H */ diff --git a/arch/x86/include/asm/memblock.h b/arch/x86/include/asm/memblock.h index 19ae14ba697..0cd3800f33b 100644 --- a/arch/x86/include/asm/memblock.h +++ b/arch/x86/include/asm/memblock.h @@ -4,7 +4,6 @@  #define ARCH_DISCARD_MEMBLOCK  u64 memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align); -void memblock_x86_to_bootmem(u64 start, u64 end);  void memblock_x86_reserve_range(u64 start, u64 end, char *name);  void memblock_x86_free_range(u64 start, u64 end); @@ -19,5 +18,6 @@ u64 memblock_x86_hole_size(u64 start, u64 end);  u64 memblock_x86_find_in_range_node(int nid, u64 start, u64 end, u64 size, u64 align);  u64 memblock_x86_free_memory_in_range(u64 addr, u64 limit);  u64 memblock_x86_memory_in_range(u64 addr, u64 limit); +bool memblock_x86_check_reserved_size(u64 *addrp, u64 *sizep, u64 align);  #endif diff --git a/arch/x86/include/asm/mmzone_32.h b/arch/x86/include/asm/mmzone_32.h index 5e83a416eca..ffa037f28d3 100644 --- a/arch/x86/include/asm/mmzone_32.h +++ b/arch/x86/include/asm/mmzone_32.h @@ -48,17 +48,6 @@ static inline int pfn_to_nid(unsigned long pfn)  #endif  } -/* - * Following are macros that each numa implmentation must define. - */ - -#define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn) -#define node_end_pfn(nid)						\ -({									\ -	pg_data_t *__pgdat = NODE_DATA(nid);				\ -	__pgdat->node_start_pfn + __pgdat->node_spanned_pages;		\ -}) -  static inline int pfn_valid(int pfn)  {  	int nid = pfn_to_nid(pfn); @@ -68,6 +57,8 @@ static inline int pfn_valid(int pfn)  	return 0;  } +#define early_pfn_valid(pfn)	pfn_valid((pfn)) +  #endif /* CONFIG_DISCONTIGMEM */  #ifdef CONFIG_NEED_MULTIPLE_NODES diff --git a/arch/x86/include/asm/mmzone_64.h b/arch/x86/include/asm/mmzone_64.h index b3f88d7867c..129d9aa3ceb 100644 --- a/arch/x86/include/asm/mmzone_64.h +++ b/arch/x86/include/asm/mmzone_64.h @@ -13,8 +13,5 @@ extern struct pglist_data *node_data[];  #define NODE_DATA(nid)		(node_data[nid]) -#define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn) -#define node_end_pfn(nid)       (NODE_DATA(nid)->node_start_pfn +	\ -				 NODE_DATA(nid)->node_spanned_pages)  #endif  #endif /* _ASM_X86_MMZONE_64_H */ diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h index 31d84acc151..a518c0a4504 100644 --- a/arch/x86/include/asm/pvclock.h +++ b/arch/x86/include/asm/pvclock.h @@ -22,6 +22,8 @@ static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift)  	u64 product;  #ifdef __i386__  	u32 tmp1, tmp2; +#else +	ulong tmp;  #endif  	if (shift < 0) @@ -42,8 +44,11 @@ static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift)  		: "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) );  #elif defined(__x86_64__)  	__asm__ ( -		"mul %%rdx ; shrd $32,%%rdx,%%rax" -		: "=a" (product) : "0" (delta), "d" ((u64)mul_frac) ); +		"mul %[mul_frac] ; shrd $32, %[hi], %[lo]" +		: [lo]"=a"(product), +		  [hi]"=d"(tmp) +		: "0"(delta), +		  [mul_frac]"rm"((u64)mul_frac));  #else  #error implement me!  #endif diff --git a/arch/x86/kernel/acpi/realmode/wakeup.S b/arch/x86/kernel/acpi/realmode/wakeup.S index ead21b66311..b4fd836e405 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.S +++ b/arch/x86/kernel/acpi/realmode/wakeup.S @@ -28,6 +28,8 @@ pmode_cr3:	.long	0	/* Saved %cr3 */  pmode_cr4:	.long	0	/* Saved %cr4 */  pmode_efer:	.quad	0	/* Saved EFER */  pmode_gdt:	.quad	0 +pmode_misc_en:	.quad	0	/* Saved MISC_ENABLE MSR */ +pmode_behavior:	.long	0	/* Wakeup behavior flags */  realmode_flags:	.long	0  real_magic:	.long	0  trampoline_segment:	.word 0 @@ -91,6 +93,18 @@ wakeup_code:  	/* Call the C code */  	calll	main +	/* Restore MISC_ENABLE before entering protected mode, in case +	   BIOS decided to clear XD_DISABLE during S3. */ +	movl	pmode_behavior, %eax +	btl	$WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE, %eax +	jnc	1f + +	movl	pmode_misc_en, %eax +	movl	pmode_misc_en + 4, %edx +	movl	$MSR_IA32_MISC_ENABLE, %ecx +	wrmsr +1: +  	/* Do any other stuff... */  #ifndef CONFIG_64BIT diff --git a/arch/x86/kernel/acpi/realmode/wakeup.h b/arch/x86/kernel/acpi/realmode/wakeup.h index e1828c07e79..97a29e1430e 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.h +++ b/arch/x86/kernel/acpi/realmode/wakeup.h @@ -21,6 +21,9 @@ struct wakeup_header {  	u32 pmode_efer_low;	/* Protected mode EFER */  	u32 pmode_efer_high;  	u64 pmode_gdt; +	u32 pmode_misc_en_low;	/* Protected mode MISC_ENABLE */ +	u32 pmode_misc_en_high; +	u32 pmode_behavior;	/* Wakeup routine behavior flags */  	u32 realmode_flags;  	u32 real_magic;  	u16 trampoline_segment;	/* segment with trampoline code, 64-bit only */ @@ -39,4 +42,7 @@ extern struct wakeup_header wakeup_header;  #define WAKEUP_HEADER_SIGNATURE 0x51ee1111  #define WAKEUP_END_SIGNATURE	0x65a22c82 +/* Wakeup behavior bits */ +#define WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE     0 +  #endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */ diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index 18a857ba7a2..103b6ab368d 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c @@ -77,6 +77,12 @@ int acpi_suspend_lowlevel(void)  	header->pmode_cr0 = read_cr0();  	header->pmode_cr4 = read_cr4_safe(); +	header->pmode_behavior = 0; +	if (!rdmsr_safe(MSR_IA32_MISC_ENABLE, +			&header->pmode_misc_en_low, +			&header->pmode_misc_en_high)) +		header->pmode_behavior |= +			(1 << WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE);  	header->realmode_flags = acpi_realmode_flags;  	header->real_magic = 0x12345678; diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index b961af86bfe..b9338b8cf42 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -390,7 +390,8 @@ static unsigned int reserve_eilvt_offset(int offset, unsigned int new)  /*   * If mask=1, the LVT entry does not generate interrupts while mask=0 - * enables the vector. See also the BKDGs. + * enables the vector. See also the BKDGs. Must be called with + * preemption disabled.   */  int setup_APIC_eilvt(u8 offset, u8 vector, u8 msg_type, u8 mask) diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index b511a011b7d..adc66c3a1fe 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c @@ -632,14 +632,14 @@ late_initcall(uv_init_heartbeat);  /* Direct Legacy VGA I/O traffic to designated IOH */  int uv_set_vga_state(struct pci_dev *pdev, bool decode, -		      unsigned int command_bits, bool change_bridge) +		      unsigned int command_bits, u32 flags)  {  	int domain, bus, rc; -	PR_DEVEL("devfn %x decode %d cmd %x chg_brdg %d\n", -			pdev->devfn, decode, command_bits, change_bridge); +	PR_DEVEL("devfn %x decode %d cmd %x flags %d\n", +			pdev->devfn, decode, command_bits, flags); -	if (!change_bridge) +	if (!(flags & PCI_VGA_STATE_CHANGE_BRIDGE))  		return 0;  	if ((command_bits & PCI_COMMAND_IO) == 0) diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c index 690bc846183..9aeb78a23de 100644 --- a/arch/x86/kernel/devicetree.c +++ b/arch/x86/kernel/devicetree.c @@ -13,6 +13,7 @@  #include <linux/slab.h>  #include <linux/pci.h>  #include <linux/of_pci.h> +#include <linux/initrd.h>  #include <asm/hpet.h>  #include <asm/irq_controller.h> @@ -98,6 +99,16 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)  	return __alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS));  } +#ifdef CONFIG_BLK_DEV_INITRD +void __init early_init_dt_setup_initrd_arch(unsigned long start, +					    unsigned long end) +{ +	initrd_start = (unsigned long)__va(start); +	initrd_end = (unsigned long)__va(end); +	initrd_below_start_ok = 1; +} +#endif +  void __init add_dtb(u64 data)  {  	initial_dtb = data + offsetof(struct setup_data, data); diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 2e4928d45a2..e1ba8cb24e4 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -337,7 +337,7 @@ EXPORT_SYMBOL(boot_option_idle_override);   * Powermanagement idle function, if any..   */  void (*pm_idle)(void); -#if defined(CONFIG_APM_MODULE) && defined(CONFIG_APM_CPU_IDLE) +#ifdef CONFIG_APM_MODULE  EXPORT_SYMBOL(pm_idle);  #endif @@ -399,7 +399,7 @@ void default_idle(void)  		cpu_relax();  	}  } -#if defined(CONFIG_APM_MODULE) && defined(CONFIG_APM_CPU_IDLE) +#ifdef CONFIG_APM_MODULE  EXPORT_SYMBOL(default_idle);  #endif diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 0c016f72769..4f0d46fefa7 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -294,6 +294,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {  			DMI_MATCH(DMI_BOARD_NAME, "VersaLogic Menlow board"),  		},  	}, +	{ /* Handle reboot issue on Acer Aspire one */ +		.callback = set_bios_reboot, +		.ident = "Acer Aspire One A110", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "Acer"), +			DMI_MATCH(DMI_PRODUCT_NAME, "AOA110"), +		}, +	},  	{ }  }; diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 33a0c11797d..9fd3137230d 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -285,6 +285,19 @@ notrace static void __cpuinit start_secondary(void *unused)  	per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;  	x86_platform.nmi_init(); +	/* +	 * Wait until the cpu which brought this one up marked it +	 * online before enabling interrupts. If we don't do that then +	 * we can end up waking up the softirq thread before this cpu +	 * reached the active state, which makes the scheduler unhappy +	 * and schedule the softirq thread on the wrong cpu. This is +	 * only observable with forced threaded interrupts, but in +	 * theory it could also happen w/o them. It's just way harder +	 * to achieve. +	 */ +	while (!cpumask_test_cpu(smp_processor_id(), cpu_active_mask)) +		cpu_relax(); +  	/* enable local interrupts */  	local_irq_enable(); diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 6df88c7885c..adc98675cda 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -3372,7 +3372,7 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)  	int def_op_bytes, def_ad_bytes, goffset, simd_prefix;  	bool op_prefix = false;  	struct opcode opcode; -	struct operand memop = { .type = OP_NONE }; +	struct operand memop = { .type = OP_NONE }, *memopp = NULL;  	c->eip = ctxt->eip;  	c->fetch.start = c->eip; @@ -3547,9 +3547,6 @@ done_prefixes:  	if (memop.type == OP_MEM && c->ad_bytes != 8)  		memop.addr.mem.ea = (u32)memop.addr.mem.ea; -	if (memop.type == OP_MEM && c->rip_relative) -		memop.addr.mem.ea += c->eip; -  	/*  	 * Decode and fetch the source operand: register, memory  	 * or immediate. @@ -3571,6 +3568,7 @@ done_prefixes:  							   c->op_bytes;  	srcmem_common:  		c->src = memop; +		memopp = &c->src;  		break;  	case SrcImmU16:  		rc = decode_imm(ctxt, &c->src, 2, false); @@ -3667,6 +3665,7 @@ done_prefixes:  	case DstMem:  	case DstMem64:  		c->dst = memop; +		memopp = &c->dst;  		if ((c->d & DstMask) == DstMem64)  			c->dst.bytes = 8;  		else @@ -3700,10 +3699,13 @@ done_prefixes:  		/* Special instructions do their own operand decoding. */  	default:  		c->dst.type = OP_NONE; /* Disable writeback. */ -		return 0; +		break;  	}  done: +	if (memopp && memopp->type == OP_MEM && c->rip_relative) +		memopp->addr.mem.ea += c->eip; +  	return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK;  } diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 9b9f012c16d..c7af6a76127 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -564,7 +564,7 @@ gfn_to_memslot_dirty_bitmap(struct kvm_vcpu *vcpu, gfn_t gfn,  static bool mapping_level_dirty_bitmap(struct kvm_vcpu *vcpu, gfn_t large_gfn)  { -	return gfn_to_memslot_dirty_bitmap(vcpu, large_gfn, true); +	return !gfn_to_memslot_dirty_bitmap(vcpu, large_gfn, true);  }  static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn) diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index 6c4dc010c4c..9d03ad4dd5e 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h @@ -121,7 +121,7 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,  				    gva_t addr, u32 access)  {  	pt_element_t pte; -	pt_element_t __user *ptep_user; +	pt_element_t __user *uninitialized_var(ptep_user);  	gfn_t table_gfn;  	unsigned index, pt_access, uninitialized_var(pte_access);  	gpa_t pte_gpa; diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 4c3fa0f6746..d48ec60ea42 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -2047,7 +2047,8 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0,  					unsigned long cr0,  					struct kvm_vcpu *vcpu)  { -	vmx_decache_cr3(vcpu); +	if (!test_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail)) +		vmx_decache_cr3(vcpu);  	if (!(cr0 & X86_CR0_PG)) {  		/* From paging/starting to nonpaging */  		vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, diff --git a/arch/x86/mm/memblock.c b/arch/x86/mm/memblock.c index aa1169392b8..992da5ec5a6 100644 --- a/arch/x86/mm/memblock.c +++ b/arch/x86/mm/memblock.c @@ -8,7 +8,7 @@  #include <linux/range.h>  /* Check for already reserved areas */ -static bool __init check_with_memblock_reserved_size(u64 *addrp, u64 *sizep, u64 align) +bool __init memblock_x86_check_reserved_size(u64 *addrp, u64 *sizep, u64 align)  {  	struct memblock_region *r;  	u64 addr = *addrp, last; @@ -59,7 +59,7 @@ u64 __init memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align)  		if (addr >= ei_last)  			continue;  		*sizep = ei_last - addr; -		while (check_with_memblock_reserved_size(&addr, sizep, align)) +		while (memblock_x86_check_reserved_size(&addr, sizep, align))  			;  		if (*sizep) diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c index cf9750004a0..68894fdc034 100644 --- a/arch/x86/oprofile/nmi_int.c +++ b/arch/x86/oprofile/nmi_int.c @@ -112,8 +112,10 @@ static void nmi_cpu_start(void *dummy)  static int nmi_start(void)  {  	get_online_cpus(); -	on_each_cpu(nmi_cpu_start, NULL, 1);  	ctr_running = 1; +	/* make ctr_running visible to the nmi handler: */ +	smp_mb(); +	on_each_cpu(nmi_cpu_start, NULL, 1);  	put_online_cpus();  	return 0;  } @@ -504,15 +506,18 @@ static int nmi_setup(void)  	nmi_enabled = 0;  	ctr_running = 0; -	barrier(); +	/* make variables visible to the nmi handler: */ +	smp_mb();  	err = register_die_notifier(&profile_exceptions_nb);  	if (err)  		goto fail;  	get_online_cpus();  	register_cpu_notifier(&oprofile_cpu_nb); -	on_each_cpu(nmi_cpu_setup, NULL, 1);  	nmi_enabled = 1; +	/* make nmi_enabled visible to the nmi handler: */ +	smp_mb(); +	on_each_cpu(nmi_cpu_setup, NULL, 1);  	put_online_cpus();  	return 0; @@ -531,7 +536,8 @@ static void nmi_shutdown(void)  	nmi_enabled = 0;  	ctr_running = 0;  	put_online_cpus(); -	barrier(); +	/* make variables visible to the nmi handler: */ +	smp_mb();  	unregister_die_notifier(&profile_exceptions_nb);  	msrs = &get_cpu_var(cpu_msrs);  	model->shutdown(msrs); diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c index 9fd8a567fe1..9cbb710dc94 100644 --- a/arch/x86/oprofile/op_model_amd.c +++ b/arch/x86/oprofile/op_model_amd.c @@ -609,16 +609,21 @@ static int setup_ibs_ctl(int ibs_eilvt_off)  	return 0;  } +/* + * This runs only on the current cpu. We try to find an LVT offset and + * setup the local APIC. For this we must disable preemption. On + * success we initialize all nodes with this offset. This updates then + * the offset in the IBS_CTL per-node msr. The per-core APIC setup of + * the IBS interrupt vector is called from op_amd_setup_ctrs()/op_- + * amd_cpu_shutdown() using the new offset. + */  static int force_ibs_eilvt_setup(void)  {  	int offset;  	int ret; -	/* -	 * find the next free available EILVT entry, skip offset 0, -	 * pin search to this cpu -	 */  	preempt_disable(); +	/* find the next free available EILVT entry, skip offset 0 */  	for (offset = 1; offset < APIC_EILVT_NR_MAX; offset++) {  		if (get_eilvt(offset))  			break; diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 0972315c386..68c3c139520 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -188,7 +188,7 @@ static bool resource_contains(struct resource *res, resource_size_t point)  	return false;  } -static void coalesce_windows(struct pci_root_info *info, int type) +static void coalesce_windows(struct pci_root_info *info, unsigned long type)  {  	int i, j;  	struct resource *res1, *res2; diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index 8214724ce54..f567965c062 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c @@ -327,7 +327,7 @@ int __init pci_xen_hvm_init(void)  }  #ifdef CONFIG_XEN_DOM0 -static int xen_register_pirq(u32 gsi, int triggering) +static int xen_register_pirq(u32 gsi, int gsi_override, int triggering)  {  	int rc, pirq, irq = -1;  	struct physdev_map_pirq map_irq; @@ -344,16 +344,18 @@ static int xen_register_pirq(u32 gsi, int triggering)  		shareable = 1;  		name = "ioapic-level";  	} -  	pirq = xen_allocate_pirq_gsi(gsi);  	if (pirq < 0)  		goto out; -	irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name); +	if (gsi_override >= 0) +		irq = xen_bind_pirq_gsi_to_irq(gsi_override, pirq, shareable, name); +	else +		irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name);  	if (irq < 0)  		goto out; -	printk(KERN_DEBUG "xen: --> pirq=%d -> irq=%d\n", pirq, irq); +	printk(KERN_DEBUG "xen: --> pirq=%d -> irq=%d (gsi=%d)\n", pirq, irq, gsi);  	map_irq.domid = DOMID_SELF;  	map_irq.type = MAP_PIRQ_TYPE_GSI; @@ -370,7 +372,7 @@ out:  	return irq;  } -static int xen_register_gsi(u32 gsi, int triggering, int polarity) +static int xen_register_gsi(u32 gsi, int gsi_override, int triggering, int polarity)  {  	int rc, irq;  	struct physdev_setup_gsi setup_gsi; @@ -381,7 +383,7 @@ static int xen_register_gsi(u32 gsi, int triggering, int polarity)  	printk(KERN_DEBUG "xen: registering gsi %u triggering %d polarity %d\n",  			gsi, triggering, polarity); -	irq = xen_register_pirq(gsi, triggering); +	irq = xen_register_pirq(gsi, gsi_override, triggering);  	setup_gsi.gsi = gsi;  	setup_gsi.triggering = (triggering == ACPI_EDGE_SENSITIVE ? 0 : 1); @@ -403,6 +405,8 @@ static __init void xen_setup_acpi_sci(void)  	int rc;  	int trigger, polarity;  	int gsi = acpi_sci_override_gsi; +	int irq = -1; +	int gsi_override = -1;  	if (!gsi)  		return; @@ -419,7 +423,25 @@ static __init void xen_setup_acpi_sci(void)  	printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d "  			"polarity=%d\n", gsi, trigger, polarity); -	gsi = xen_register_gsi(gsi, trigger, polarity); +	/* Before we bind the GSI to a Linux IRQ, check whether +	 * we need to override it with bus_irq (IRQ) value. Usually for +	 * IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so: +	 *  ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level) +	 * but there are oddballs where the IRQ != GSI: +	 *  ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level) +	 * which ends up being: gsi_to_irq[9] == 20 +	 * (which is what acpi_gsi_to_irq ends up calling when starting the +	 * the ACPI interpreter and keels over since IRQ 9 has not been +	 * setup as we had setup IRQ 20 for it). +	 */ +	/* Check whether the GSI != IRQ */ +	if (acpi_gsi_to_irq(gsi, &irq) == 0) { +		if (irq >= 0 && irq != gsi) +			/* Bugger, we MUST have that IRQ. */ +			gsi_override = irq; +	} + +	gsi = xen_register_gsi(gsi, gsi_override, trigger, polarity);  	printk(KERN_INFO "xen: acpi sci %d\n", gsi);  	return; @@ -428,7 +450,7 @@ static __init void xen_setup_acpi_sci(void)  static int acpi_register_gsi_xen(struct device *dev, u32 gsi,  				 int trigger, int polarity)  { -	return xen_register_gsi(gsi, trigger, polarity); +	return xen_register_gsi(gsi, -1 /* no GSI override */, trigger, polarity);  }  static int __init pci_xen_initial_domain(void) @@ -467,7 +489,7 @@ void __init xen_setup_pirqs(void)  		if (acpi_get_override_irq(irq, &trigger, &polarity) == -1)  			continue; -		xen_register_pirq(irq, +		xen_register_pirq(irq, -1 /* no GSI override */,  			trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE);  	}  } diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 0d3a4fa3456..899e393d8e7 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c @@ -310,14 +310,31 @@ void __init efi_reserve_boot_services(void)  	for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {  		efi_memory_desc_t *md = p; -		unsigned long long start = md->phys_addr; -		unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; +		u64 start = md->phys_addr; +		u64 size = md->num_pages << EFI_PAGE_SHIFT;  		if (md->type != EFI_BOOT_SERVICES_CODE &&  		    md->type != EFI_BOOT_SERVICES_DATA)  			continue; - -		memblock_x86_reserve_range(start, start + size, "EFI Boot"); +		/* Only reserve where possible: +		 * - Not within any already allocated areas +		 * - Not over any memory area (really needed, if above?) +		 * - Not within any part of the kernel +		 * - Not the bios reserved area +		*/ +		if ((start+size >= virt_to_phys(_text) +				&& start <= virt_to_phys(_end)) || +			!e820_all_mapped(start, start+size, E820_RAM) || +			memblock_x86_check_reserved_size(&start, &size, +							1<<EFI_PAGE_SHIFT)) { +			/* Could not reserve, skip it */ +			md->num_pages = 0; +			memblock_dbg(PFX "Could not reserve boot range " +					"[0x%010llx-0x%010llx]\n", +						start, start+size-1); +		} else +			memblock_x86_reserve_range(start, start+size, +							"EFI Boot");  	}  } @@ -334,6 +351,10 @@ static void __init efi_free_boot_services(void)  		    md->type != EFI_BOOT_SERVICES_DATA)  			continue; +		/* Could not reserve boot area */ +		if (!size) +			continue; +  		free_bootmem_late(start, size);  	}  } @@ -483,9 +504,6 @@ void __init efi_init(void)  	x86_platform.set_wallclock = efi_set_rtc_mmss;  #endif -	/* Setup for EFI runtime service */ -	reboot_type = BOOT_EFI; -  #if EFI_DEBUG  	print_efi_memmap();  #endif diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index dd7b88f2ec7..5525163a039 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c @@ -1033,6 +1033,13 @@ static void xen_machine_halt(void)  	xen_reboot(SHUTDOWN_poweroff);  } +static void xen_machine_power_off(void) +{ +	if (pm_power_off) +		pm_power_off(); +	xen_reboot(SHUTDOWN_poweroff); +} +  static void xen_crash_shutdown(struct pt_regs *regs)  {  	xen_reboot(SHUTDOWN_crash); @@ -1058,7 +1065,7 @@ int xen_panic_handler_init(void)  static const struct machine_ops xen_machine_ops __initconst = {  	.restart = xen_restart,  	.halt = xen_machine_halt, -	.power_off = xen_machine_halt, +	.power_off = xen_machine_power_off,  	.shutdown = xen_machine_halt,  	.crash_shutdown = xen_crash_shutdown,  	.emergency_restart = xen_emergency_restart, diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index dc708dcc62f..0ccccb67a99 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c @@ -59,6 +59,7 @@  #include <asm/page.h>  #include <asm/init.h>  #include <asm/pat.h> +#include <asm/smp.h>  #include <asm/xen/hypercall.h>  #include <asm/xen/hypervisor.h> @@ -1231,7 +1232,11 @@ static void xen_flush_tlb_others(const struct cpumask *cpus,  {  	struct {  		struct mmuext_op op; +#ifdef CONFIG_SMP +		DECLARE_BITMAP(mask, num_processors); +#else  		DECLARE_BITMAP(mask, NR_CPUS); +#endif  	} *args;  	struct multicall_space mcs; @@ -1599,6 +1604,11 @@ static void __init xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn)  		for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) {  			pte_t pte; +#ifdef CONFIG_X86_32 +			if (pfn > max_pfn_mapped) +				max_pfn_mapped = pfn; +#endif +  			if (!pte_none(pte_page[pteidx]))  				continue; @@ -1766,7 +1776,9 @@ pgd_t * __init xen_setup_kernel_pagetable(pgd_t *pgd,  	initial_kernel_pmd =  		extend_brk(sizeof(pmd_t) * PTRS_PER_PMD, PAGE_SIZE); -	max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->mfn_list)); +	max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->pt_base) + +				  xen_start_info->nr_pt_frames * PAGE_SIZE + +				  512*1024);  	kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd);  	memcpy(initial_kernel_pmd, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD); diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index be1a464f6d6..60aeeb56948 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c @@ -227,11 +227,7 @@ char * __init xen_memory_setup(void)  	memcpy(map_raw, map, sizeof(map));  	e820.nr_map = 0; -#ifdef CONFIG_X86_32  	xen_extra_mem_start = mem_end; -#else -	xen_extra_mem_start = max((1ULL << 32), mem_end); -#endif  	for (i = 0; i < memmap.nr_entries; i++) {  		unsigned long long end; @@ -266,6 +262,12 @@ char * __init xen_memory_setup(void)  		if (map[i].size > 0)  			e820_add_region(map[i].addr, map[i].size, map[i].type);  	} +	/* Align the balloon area so that max_low_pfn does not get set +	 * to be at the _end_ of the PCI gap at the far end (fee01000). +	 * Note that xen_extra_mem_start gets set in the loop above to be +	 * past the last E820 region. */ +	if (xen_initial_domain() && (xen_extra_mem_start < (1ULL<<32))) +		xen_extra_mem_start = (1ULL<<32);  	/*  	 * In domU, the ISA region is normal, usable memory, but we diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 41038c01de4..b4533a86d7e 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c @@ -205,11 +205,18 @@ static void __init xen_smp_prepare_boot_cpu(void)  static void __init xen_smp_prepare_cpus(unsigned int max_cpus)  {  	unsigned cpu; +	unsigned int i;  	xen_init_lock_cpu(0);  	smp_store_cpu_info(0);  	cpu_data(0).x86_max_cores = 1; + +	for_each_possible_cpu(i) { +		zalloc_cpumask_var(&per_cpu(cpu_sibling_map, i), GFP_KERNEL); +		zalloc_cpumask_var(&per_cpu(cpu_core_map, i), GFP_KERNEL); +		zalloc_cpumask_var(&per_cpu(cpu_llc_shared_map, i), GFP_KERNEL); +	}  	set_cpu_sibling_map(0);  	if (xen_smp_intr_init(0))  |