diff options
Diffstat (limited to 'arch')
439 files changed, 3107 insertions, 3457 deletions
diff --git a/arch/alpha/include/asm/futex.h b/arch/alpha/include/asm/futex.h index e8a761aee08..f939794363a 100644 --- a/arch/alpha/include/asm/futex.h +++ b/arch/alpha/include/asm/futex.h @@ -108,7 +108,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,  	"	lda	$31,3b-2b(%0)\n"  	"	.previous\n"  	:	"+r"(ret), "=&r"(prev), "=&r"(cmp) -	:	"r"(uaddr), "r"((long)oldval), "r"(newval) +	:	"r"(uaddr), "r"((long)(int)oldval), "r"(newval)  	:	"memory");  	*uval = prev; diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 24626b0419e..dfb0312f4e7 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -754,7 +754,7 @@ config ARCH_SA1100  	select ARCH_HAS_CPUFREQ  	select CPU_FREQ  	select GENERIC_CLOCKEVENTS -	select CLKDEV_LOOKUP +	select HAVE_CLK  	select HAVE_SCHED_CLOCK  	select TICK_ONESHOT  	select ARCH_REQUIRE_GPIOLIB @@ -825,7 +825,6 @@ config ARCH_S5PC100  	select HAVE_CLK  	select CLKDEV_LOOKUP  	select CPU_V7 -	select ARM_L1_CACHE_SHIFT_6  	select ARCH_USES_GETTIMEOFFSET  	select HAVE_S3C2410_I2C if I2C  	select HAVE_S3C_RTC if RTC_CLASS @@ -842,7 +841,6 @@ config ARCH_S5PV210  	select HAVE_CLK  	select CLKDEV_LOOKUP  	select CLKSRC_MMIO -	select ARM_L1_CACHE_SHIFT_6  	select ARCH_HAS_CPUFREQ  	select GENERIC_CLOCKEVENTS  	select HAVE_SCHED_CLOCK @@ -1282,7 +1280,7 @@ config ARM_ERRATA_743622  	depends on CPU_V7  	help  	  This option enables the workaround for the 743622 Cortex-A9 -	  (r2p0..r2p2) erratum. Under very rare conditions, a faulty +	  (r2p*) erratum. Under very rare conditions, a faulty  	  optimisation in the Cortex-A9 Store Buffer may lead to data  	  corruption. This workaround sets a specific bit in the diagnostic  	  register of the Cortex-A9 which disables the Store Buffer diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 40319d91bb7..1683bfb9166 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -160,7 +160,6 @@ machine-$(CONFIG_ARCH_MSM)		:= msm  machine-$(CONFIG_ARCH_MV78XX0)		:= mv78xx0  machine-$(CONFIG_ARCH_IMX_V4_V5)	:= imx  machine-$(CONFIG_ARCH_IMX_V6_V7)	:= imx -machine-$(CONFIG_ARCH_MX5)		:= mx5  machine-$(CONFIG_ARCH_MXS)		:= mxs  machine-$(CONFIG_ARCH_NETX)		:= netx  machine-$(CONFIG_ARCH_NOMADIK)		:= nomadik diff --git a/arch/arm/boot/.gitignore b/arch/arm/boot/.gitignore index ce1c5ff746e..3c79f85975a 100644 --- a/arch/arm/boot/.gitignore +++ b/arch/arm/boot/.gitignore @@ -3,3 +3,4 @@ zImage  xipImage  bootpImage  uImage +*.dtb diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi index 63d7578856c..a1dd2ee8375 100644 --- a/arch/arm/boot/dts/exynos4210.dtsi +++ b/arch/arm/boot/dts/exynos4210.dtsi @@ -29,6 +29,7 @@  		compatible = "arm,cortex-a9-gic";  		#interrupt-cells = <3>;  		interrupt-controller; +		cpu-offset = <0x8000>;  		reg = <0x10490000 0x1000>, <0x10480000 0x100>;  	}; diff --git a/arch/arm/boot/dts/tegra-paz00.dts b/arch/arm/boot/dts/tegra-paz00.dts index 1a1d7023b69..825d2957da0 100644 --- a/arch/arm/boot/dts/tegra-paz00.dts +++ b/arch/arm/boot/dts/tegra-paz00.dts @@ -46,11 +46,11 @@  	};  	serial@70006200 { -		status = "disable"; +		clock-frequency = <216000000>;  	};  	serial@70006300 { -		clock-frequency = <216000000>; +		status = "disable";  	};  	serial@70006400 { @@ -60,7 +60,7 @@  	sdhci@c8000000 {  		cd-gpios = <&gpio 173 0>; /* gpio PV5 */  		wp-gpios = <&gpio 57 0>;  /* gpio PH1 */ -		power-gpios = <&gpio 155 0>; /* gpio PT3 */ +		power-gpios = <&gpio 169 0>; /* gpio PV1 */  	};  	sdhci@c8000200 { diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index b2dc2dd7f1d..c47d6199b78 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c @@ -41,6 +41,7 @@  #include <asm/irq.h>  #include <asm/exception.h> +#include <asm/smp_plat.h>  #include <asm/mach/irq.h>  #include <asm/hardware/gic.h> @@ -352,11 +353,7 @@ static void __init gic_dist_init(struct gic_chip_data *gic)  	unsigned int gic_irqs = gic->gic_irqs;  	struct irq_domain *domain = &gic->domain;  	void __iomem *base = gic_data_dist_base(gic); -	u32 cpu = 0; - -#ifdef CONFIG_SMP -	cpu = cpu_logical_map(smp_processor_id()); -#endif +	u32 cpu = cpu_logical_map(smp_processor_id());  	cpumask = 1 << cpu;  	cpumask |= cpumask << 8; diff --git a/arch/arm/common/it8152.c b/arch/arm/common/it8152.c index d1bcd7b13eb..fb1f1cfce60 100644 --- a/arch/arm/common/it8152.c +++ b/arch/arm/common/it8152.c @@ -320,13 +320,6 @@ err0:  	return -EBUSY;  } -/* - * If we set up a device for bus mastering, we need to check the latency - * timer as we don't have even crappy BIOSes to set it properly. - * The implementation is from arch/i386/pci/i386.c - */ -unsigned int pcibios_max_latency = 255; -  /* ITE bridge requires setting latency timer to avoid early bus access     termination by PCI bus master devices  */ diff --git a/arch/arm/common/pl330.c b/arch/arm/common/pl330.c index d8e44a43047..ff3ad224482 100644 --- a/arch/arm/common/pl330.c +++ b/arch/arm/common/pl330.c @@ -1502,12 +1502,13 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op)  	struct pl330_thread *thrd = ch_id;  	struct pl330_dmac *pl330;  	unsigned long flags; -	int ret = 0, active = thrd->req_running; +	int ret = 0, active;  	if (!thrd || thrd->free || thrd->dmac->state == DYING)  		return -EINVAL;  	pl330 = thrd->dmac; +	active = thrd->req_running;  	spin_lock_irqsave(&pl330->lock, flags); diff --git a/arch/arm/configs/mx5_defconfig b/arch/arm/configs/imx_v6_v7_defconfig index d0d8dfece37..3a4fb2e5fc6 100644 --- a/arch/arm/configs/mx5_defconfig +++ b/arch/arm/configs/imx_v6_v7_defconfig @@ -3,6 +3,7 @@ CONFIG_EXPERIMENTAL=y  CONFIG_KERNEL_LZO=y  CONFIG_SYSVIPC=y  CONFIG_LOG_BUF_SHIFT=18 +CONFIG_CGROUPS=y  CONFIG_RELAY=y  CONFIG_EXPERT=y  # CONFIG_SLUB_DEBUG is not set @@ -14,20 +15,31 @@ CONFIG_MODULE_SRCVERSION_ALL=y  # CONFIG_LBDAF is not set  # CONFIG_BLK_DEV_BSG is not set  CONFIG_ARCH_MXC=y -CONFIG_ARCH_MX5=y -CONFIG_MACH_MX51_BABBAGE=y +CONFIG_MACH_MX31LILLY=y +CONFIG_MACH_MX31LITE=y +CONFIG_MACH_PCM037=y +CONFIG_MACH_PCM037_EET=y +CONFIG_MACH_MX31_3DS=y +CONFIG_MACH_MX31MOBOARD=y +CONFIG_MACH_QONG=y +CONFIG_MACH_ARMADILLO5X0=y +CONFIG_MACH_KZM_ARM11_01=y +CONFIG_MACH_PCM043=y +CONFIG_MACH_MX35_3DS=y +CONFIG_MACH_EUKREA_CPUIMX35=y +CONFIG_MACH_VPR200=y +CONFIG_MACH_IMX51_DT=y  CONFIG_MACH_MX51_3DS=y  CONFIG_MACH_EUKREA_CPUIMX51=y  CONFIG_MACH_EUKREA_CPUIMX51SD=y  CONFIG_MACH_MX51_EFIKAMX=y  CONFIG_MACH_MX51_EFIKASB=y -CONFIG_MACH_MX53_EVK=y -CONFIG_MACH_MX53_SMD=y -CONFIG_MACH_MX53_LOCO=y -CONFIG_MACH_MX53_ARD=y +CONFIG_MACH_IMX53_DT=y +CONFIG_SOC_IMX6Q=y  CONFIG_MXC_PWM=y  CONFIG_NO_HZ=y  CONFIG_HIGH_RES_TIMERS=y +CONFIG_SMP=y  CONFIG_VMSPLIT_2G=y  CONFIG_PREEMPT_VOLUNTARY=y  CONFIG_AEABI=y @@ -49,7 +61,7 @@ CONFIG_IP_PNP_DHCP=y  # CONFIG_INET_XFRM_MODE_TUNNEL is not set  # CONFIG_INET_XFRM_MODE_BEET is not set  # CONFIG_INET_LRO is not set -# CONFIG_IPV6 is not set +CONFIG_IPV6=y  # CONFIG_WIRELESS is not set  CONFIG_DEVTMPFS=y  CONFIG_DEVTMPFS_MOUNT=y @@ -68,24 +80,20 @@ CONFIG_SCSI_SCAN_ASYNC=y  CONFIG_ATA=y  CONFIG_PATA_IMX=y  CONFIG_NETDEVICES=y -CONFIG_MII=m -CONFIG_MARVELL_PHY=y -CONFIG_DAVICOM_PHY=y -CONFIG_QSEMI_PHY=y -CONFIG_LXT_PHY=y -CONFIG_CICADA_PHY=y -CONFIG_VITESSE_PHY=y -CONFIG_SMSC_PHY=y -CONFIG_BROADCOM_PHY=y -CONFIG_ICPLUS_PHY=y -CONFIG_REALTEK_PHY=y -CONFIG_NATIONAL_PHY=y -CONFIG_STE10XP=y -CONFIG_LSI_ET1011C_PHY=y -CONFIG_MICREL_PHY=y -CONFIG_NET_ETHERNET=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_CHELSIO is not set +# CONFIG_NET_VENDOR_FARADAY is not set +CONFIG_FEC=y +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_SEEQ is not set +CONFIG_SMC91X=y +CONFIG_SMC911X=y +CONFIG_SMSC911X=y +# CONFIG_NET_VENDOR_STMICRO is not set  # CONFIG_WLAN is not set  # CONFIG_INPUT_MOUSEDEV_PSAUX is not set  CONFIG_INPUT_EVDEV=y @@ -124,7 +132,6 @@ CONFIG_USB_EHCI_HCD=y  CONFIG_USB_EHCI_MXC=y  CONFIG_USB_STORAGE=y  CONFIG_MMC=y -CONFIG_MMC_BLOCK=m  CONFIG_MMC_SDHCI=y  CONFIG_MMC_SDHCI_PLTFM=y  CONFIG_MMC_SDHCI_ESDHC_IMX=y @@ -133,6 +140,8 @@ CONFIG_LEDS_CLASS=y  CONFIG_RTC_CLASS=y  CONFIG_RTC_INTF_DEV_UIE_EMUL=y  CONFIG_RTC_MXC=y +CONFIG_DMADEVICES=y +CONFIG_IMX_SDMA=y  CONFIG_EXT2_FS=y  CONFIG_EXT2_FS_XATTR=y  CONFIG_EXT2_FS_POSIX_ACL=y diff --git a/arch/arm/configs/mx3_defconfig b/arch/arm/configs/mx3_defconfig deleted file mode 100644 index cb0717fbb03..00000000000 --- a/arch/arm/configs/mx3_defconfig +++ /dev/null @@ -1,144 +0,0 @@ -CONFIG_EXPERIMENTAL=y -CONFIG_SYSVIPC=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_EXPERT=y -CONFIG_SLAB=y -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -CONFIG_MODULE_FORCE_UNLOAD=y -CONFIG_MODVERSIONS=y -# CONFIG_BLK_DEV_BSG is not set -CONFIG_ARCH_MXC=y -CONFIG_MACH_MX31ADS_WM1133_EV1=y -CONFIG_MACH_MX31LILLY=y -CONFIG_MACH_MX31LITE=y -CONFIG_MACH_PCM037=y -CONFIG_MACH_PCM037_EET=y -CONFIG_MACH_MX31_3DS=y -CONFIG_MACH_MX31MOBOARD=y -CONFIG_MACH_QONG=y -CONFIG_MACH_ARMADILLO5X0=y -CONFIG_MACH_KZM_ARM11_01=y -CONFIG_MACH_PCM043=y -CONFIG_MACH_MX35_3DS=y -CONFIG_MACH_EUKREA_CPUIMX35=y -CONFIG_MXC_IRQ_PRIOR=y -CONFIG_MXC_PWM=y -CONFIG_ARM_ERRATA_411920=y -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y -CONFIG_PREEMPT=y -CONFIG_AEABI=y -CONFIG_ZBOOT_ROM_TEXT=0x0 -CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="noinitrd console=ttymxc0,115200 root=/dev/mtdblock2 rw ip=off" -CONFIG_VFP=y -CONFIG_PM_DEBUG=y -CONFIG_NET=y -CONFIG_PACKET=y -CONFIG_UNIX=y -CONFIG_INET=y -CONFIG_IP_PNP=y -CONFIG_IP_PNP_DHCP=y -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_MODE_BEET is not set -# CONFIG_INET_LRO is not set -# CONFIG_INET_DIAG is not set -# CONFIG_IPV6 is not set -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -CONFIG_FW_LOADER=m -CONFIG_MTD=y -CONFIG_MTD_CMDLINE_PARTS=y -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -CONFIG_MTD_CFI=y -CONFIG_MTD_PHYSMAP=y -CONFIG_MTD_NAND=y -CONFIG_MTD_NAND_MXC=y -CONFIG_MTD_UBI=y -# CONFIG_BLK_DEV is not set -CONFIG_MISC_DEVICES=y -CONFIG_EEPROM_AT24=y -CONFIG_NETDEVICES=y -CONFIG_SMSC_PHY=y -CONFIG_NET_ETHERNET=y -CONFIG_SMSC911X=y -CONFIG_DNET=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set -# CONFIG_INPUT_MOUSEDEV is not set -# CONFIG_KEYBOARD_ATKBD is not set -CONFIG_KEYBOARD_IMX=y -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -# CONFIG_VT is not set -# CONFIG_LEGACY_PTYS is not set -CONFIG_SERIAL_8250=m -CONFIG_SERIAL_8250_EXTENDED=y -CONFIG_SERIAL_8250_SHARE_IRQ=y -CONFIG_SERIAL_IMX=y -CONFIG_SERIAL_IMX_CONSOLE=y -# CONFIG_HW_RANDOM is not set -CONFIG_I2C=y -CONFIG_I2C_CHARDEV=y -CONFIG_I2C_IMX=y -CONFIG_SPI=y -CONFIG_W1=y -CONFIG_W1_MASTER_MXC=y -CONFIG_W1_SLAVE_THERM=y -# CONFIG_HWMON is not set -CONFIG_WATCHDOG=y -CONFIG_IMX2_WDT=y -CONFIG_MFD_WM8350_I2C=y -CONFIG_REGULATOR=y -CONFIG_REGULATOR_WM8350=y -CONFIG_MEDIA_SUPPORT=y -CONFIG_VIDEO_DEV=y -# CONFIG_RC_CORE is not set -# CONFIG_MEDIA_TUNER_CUSTOMISE is not set -CONFIG_SOC_CAMERA=y -CONFIG_SOC_CAMERA_MT9M001=y -CONFIG_SOC_CAMERA_MT9M111=y -CONFIG_SOC_CAMERA_MT9T031=y -CONFIG_SOC_CAMERA_MT9V022=y -CONFIG_SOC_CAMERA_TW9910=y -CONFIG_SOC_CAMERA_OV772X=y -CONFIG_VIDEO_MX3=y -# CONFIG_RADIO_ADAPTERS is not set -CONFIG_FB=y -CONFIG_SOUND=y -CONFIG_SND=y -# CONFIG_SND_ARM is not set -# CONFIG_SND_SPI is not set -CONFIG_SND_SOC=y -CONFIG_SND_IMX_SOC=y -CONFIG_SND_MXC_SOC_WM1133_EV1=y -CONFIG_SND_SOC_PHYCORE_AC97=y -CONFIG_SND_SOC_EUKREA_TLV320=y -CONFIG_USB=y -CONFIG_USB_EHCI_HCD=y -CONFIG_USB_EHCI_MXC=y -CONFIG_USB_GADGET=m -CONFIG_USB_FSL_USB2=m -CONFIG_USB_G_SERIAL=m -CONFIG_USB_ULPI=y -CONFIG_MMC=y -CONFIG_MMC_MXC=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_MXC=y -CONFIG_DMADEVICES=y -# CONFIG_DNOTIFY is not set -CONFIG_TMPFS=y -CONFIG_JFFS2_FS=y -CONFIG_UBIFS_FS=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_NFS_V4=y -CONFIG_ROOT_NFS=y -# CONFIG_ENABLE_WARN_DEPRECATED is not set -# CONFIG_ENABLE_MUST_CHECK is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y -# CONFIG_CRYPTO_ANSI_CPRNG is not set diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index b6e65dedfd7..23371b17b23 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -137,6 +137,11 @@  	disable_irq  	.endm +	.macro	save_and_disable_irqs_notrace, oldcpsr +	mrs	\oldcpsr, cpsr +	disable_irq_notrace +	.endm +  /*   * Restore interrupt state previously stored in a register.  We don't   * guarantee that this will preserve the flags. @@ -237,7 +242,7 @@   */  #ifdef CONFIG_THUMB2_KERNEL -	.macro	usraccoff, instr, reg, ptr, inc, off, cond, abort, t=T() +	.macro	usraccoff, instr, reg, ptr, inc, off, cond, abort, t=TUSER()  9999:  	.if	\inc == 1  	\instr\cond\()b\()\t\().w \reg, [\ptr, #\off] @@ -277,7 +282,7 @@  #else	/* !CONFIG_THUMB2_KERNEL */ -	.macro	usracc, instr, reg, ptr, inc, cond, rept, abort, t=T() +	.macro	usracc, instr, reg, ptr, inc, cond, rept, abort, t=TUSER()  	.rept	\rept  9999:  	.if	\inc == 1 diff --git a/arch/arm/include/asm/domain.h b/arch/arm/include/asm/domain.h index af18ceaacf5..b5dc173d336 100644 --- a/arch/arm/include/asm/domain.h +++ b/arch/arm/include/asm/domain.h @@ -83,9 +83,9 @@   * instructions (inline assembly)   */  #ifdef CONFIG_CPU_USE_DOMAINS -#define T(instr)	#instr "t" +#define TUSER(instr)	#instr "t"  #else -#define T(instr)	#instr +#define TUSER(instr)	#instr  #endif  #else /* __ASSEMBLY__ */ @@ -95,9 +95,9 @@   * instructions   */  #ifdef CONFIG_CPU_USE_DOMAINS -#define T(instr)	instr ## t +#define TUSER(instr)	instr ## t  #else -#define T(instr)	instr +#define TUSER(instr)	instr  #endif  #endif /* __ASSEMBLY__ */ diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h index 253cc86318b..7be54690aee 100644 --- a/arch/arm/include/asm/futex.h +++ b/arch/arm/include/asm/futex.h @@ -75,9 +75,9 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,  #define __futex_atomic_op(insn, ret, oldval, tmp, uaddr, oparg)	\  	__asm__ __volatile__(					\ -	"1:	" T(ldr) "	%1, [%3]\n"			\ +	"1:	" TUSER(ldr) "	%1, [%3]\n"			\  	"	" insn "\n"					\ -	"2:	" T(str) "	%0, [%3]\n"			\ +	"2:	" TUSER(str) "	%0, [%3]\n"			\  	"	mov	%0, #0\n"				\  	__futex_atomic_ex_table("%5")				\  	: "=&r" (ret), "=&r" (oldval), "=&r" (tmp)		\ @@ -95,10 +95,10 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,  		return -EFAULT;  	__asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" -	"1:	" T(ldr) "	%1, [%4]\n" +	"1:	" TUSER(ldr) "	%1, [%4]\n"  	"	teq	%1, %2\n"  	"	it	eq	@ explicit IT needed for the 2b label\n" -	"2:	" T(streq) "	%3, [%4]\n" +	"2:	" TUSER(streq) "	%3, [%4]\n"  	__futex_atomic_ex_table("%5")  	: "+r" (ret), "=&r" (val)  	: "r" (oldval), "r" (newval), "r" (uaddr), "Ir" (-EFAULT) diff --git a/arch/arm/include/asm/hardware/pl330.h b/arch/arm/include/asm/hardware/pl330.h index 575fa8186ca..c1821385abf 100644 --- a/arch/arm/include/asm/hardware/pl330.h +++ b/arch/arm/include/asm/hardware/pl330.h @@ -41,7 +41,7 @@ enum pl330_dstcachectrl {  	DCCTRL1, /* Bufferable only */  	DCCTRL2, /* Cacheable, but do not allocate */  	DCCTRL3, /* Cacheable and bufferable, but do not allocate */ -	DINVALID1 = 8, +	DINVALID1,              /* AWCACHE = 0x1000 */  	DINVALID2,  	DCCTRL6, /* Cacheable write-through, allocate on writes only */  	DCCTRL7, /* Cacheable write-back, allocate on writes only */ diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index b5a5be2536c..90114faa9f3 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h @@ -134,7 +134,7 @@ int __init armpmu_register(struct arm_pmu *armpmu, char *name, int type);  u64 armpmu_event_update(struct perf_event *event,  			struct hw_perf_event *hwc, -			int idx, int overflow); +			int idx);  int armpmu_event_set_period(struct perf_event *event,  			    struct hw_perf_event *hwc, diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index ce280b8d613..cb8d638924f 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h @@ -22,6 +22,7 @@  #include <asm/hw_breakpoint.h>  #include <asm/ptrace.h>  #include <asm/types.h> +#include <asm/system.h>  #ifdef __KERNEL__  #define STACK_TOP	((current->personality & ADDR_LIMIT_32BIT) ? \ diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h index 1e5717afc4a..ae29293270a 100644 --- a/arch/arm/include/asm/smp.h +++ b/arch/arm/include/asm/smp.h @@ -71,12 +71,6 @@ extern void platform_secondary_init(unsigned int cpu);  extern void platform_smp_prepare_cpus(unsigned int);  /* - * Logical CPU mapping. - */ -extern int __cpu_logical_map[NR_CPUS]; -#define cpu_logical_map(cpu)	__cpu_logical_map[cpu] - -/*   * Initial data for bringing up a secondary CPU.   */  struct secondary_data { diff --git a/arch/arm/include/asm/smp_plat.h b/arch/arm/include/asm/smp_plat.h index f24c1b9e211..558d6c80aca 100644 --- a/arch/arm/include/asm/smp_plat.h +++ b/arch/arm/include/asm/smp_plat.h @@ -43,4 +43,10 @@ static inline int cache_ops_need_broadcast(void)  }  #endif +/* + * Logical CPU mapping. + */ +extern int __cpu_logical_map[]; +#define cpu_logical_map(cpu)	__cpu_logical_map[cpu] +  #endif diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h index 5d3ed7e3856..314d4664eae 100644 --- a/arch/arm/include/asm/tlb.h +++ b/arch/arm/include/asm/tlb.h @@ -198,7 +198,15 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,  	unsigned long addr)  {  	pgtable_page_dtor(pte); -	tlb_add_flush(tlb, addr); + +	/* +	 * With the classic ARM MMU, a pte page has two corresponding pmd +	 * entries, each covering 1MB. +	 */ +	addr &= PMD_MASK; +	tlb_add_flush(tlb, addr + SZ_1M - PAGE_SIZE); +	tlb_add_flush(tlb, addr + SZ_1M); +  	tlb_remove_page(tlb, pte);  } diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h index b293616a1a1..2958976d867 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h @@ -227,7 +227,7 @@ do {									\  #define __get_user_asm_byte(x,addr,err)				\  	__asm__ __volatile__(					\ -	"1:	" T(ldrb) "	%1,[%2],#0\n"			\ +	"1:	" TUSER(ldrb) "	%1,[%2],#0\n"			\  	"2:\n"							\  	"	.pushsection .fixup,\"ax\"\n"			\  	"	.align	2\n"					\ @@ -263,7 +263,7 @@ do {									\  #define __get_user_asm_word(x,addr,err)				\  	__asm__ __volatile__(					\ -	"1:	" T(ldr) "	%1,[%2],#0\n"			\ +	"1:	" TUSER(ldr) "	%1,[%2],#0\n"			\  	"2:\n"							\  	"	.pushsection .fixup,\"ax\"\n"			\  	"	.align	2\n"					\ @@ -308,7 +308,7 @@ do {									\  #define __put_user_asm_byte(x,__pu_addr,err)			\  	__asm__ __volatile__(					\ -	"1:	" T(strb) "	%1,[%2],#0\n"			\ +	"1:	" TUSER(strb) "	%1,[%2],#0\n"			\  	"2:\n"							\  	"	.pushsection .fixup,\"ax\"\n"			\  	"	.align	2\n"					\ @@ -341,7 +341,7 @@ do {									\  #define __put_user_asm_word(x,__pu_addr,err)			\  	__asm__ __volatile__(					\ -	"1:	" T(str) "	%1,[%2],#0\n"			\ +	"1:	" TUSER(str) "	%1,[%2],#0\n"			\  	"2:\n"							\  	"	.pushsection .fixup,\"ax\"\n"			\  	"	.align	2\n"					\ @@ -366,10 +366,10 @@ do {									\  #define __put_user_asm_dword(x,__pu_addr,err)			\  	__asm__ __volatile__(					\ - ARM(	"1:	" T(str) "	" __reg_oper1 ", [%1], #4\n"	)	\ - ARM(	"2:	" T(str) "	" __reg_oper0 ", [%1]\n"	)	\ - THUMB(	"1:	" T(str) "	" __reg_oper1 ", [%1]\n"	)	\ - THUMB(	"2:	" T(str) "	" __reg_oper0 ", [%1, #4]\n"	)	\ + ARM(	"1:	" TUSER(str) "	" __reg_oper1 ", [%1], #4\n"	) \ + ARM(	"2:	" TUSER(str) "	" __reg_oper0 ", [%1]\n"	) \ + THUMB(	"1:	" TUSER(str) "	" __reg_oper1 ", [%1]\n"	) \ + THUMB(	"2:	" TUSER(str) "	" __reg_oper0 ", [%1, #4]\n"	) \  	"3:\n"							\  	"	.pushsection .fixup,\"ax\"\n"			\  	"	.align	2\n"					\ diff --git a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c index 4dd0edab6a6..1651d495074 100644 --- a/arch/arm/kernel/ecard.c +++ b/arch/arm/kernel/ecard.c @@ -242,6 +242,7 @@ static void ecard_init_pgtables(struct mm_struct *mm)  	memcpy(dst_pgd, src_pgd, sizeof(pgd_t) * (EASI_SIZE / PGDIR_SIZE)); +	vma.vm_flags = VM_EXEC;  	vma.vm_mm = mm;  	flush_tlb_range(&vma, IO_START, IO_START + IO_SIZE); diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 3a456c6c700..be16a48007b 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -790,7 +790,7 @@ __kuser_cmpxchg64:				@ 0xffff0f60  	smp_dmb	arm  	rsbs	r0, r3, #0			@ set returned val and C flag  	ldmfd	sp!, {r4, r5, r6, r7} -	bx	lr +	usr_ret	lr  #elif !defined(CONFIG_SMP) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 520889cf1b5..9fd0ba90c1d 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -149,6 +149,11 @@ ENDPROC(ret_from_fork)  #endif  #endif +.macro mcount_adjust_addr rd, rn +	bic	\rd, \rn, #1		@ clear the Thumb bit if present +	sub	\rd, \rd, #MCOUNT_INSN_SIZE +.endm +  .macro __mcount suffix  	mcount_enter  	ldr	r0, =ftrace_trace_function @@ -173,8 +178,7 @@ ENDPROC(ret_from_fork)  	mcount_exit  1: 	mcount_get_lr	r1			@ lr of instrumented func -	mov	r0, lr				@ instrumented function -	sub	r0, r0, #MCOUNT_INSN_SIZE +	mcount_adjust_addr	r0, lr		@ instrumented function  	adr	lr, BSYM(2f)  	mov	pc, r2  2:	mcount_exit @@ -184,8 +188,7 @@ ENDPROC(ret_from_fork)  	mcount_enter  	mcount_get_lr	r1			@ lr of instrumented func -	mov	r0, lr				@ instrumented function -	sub	r0, r0, #MCOUNT_INSN_SIZE +	mcount_adjust_addr	r0, lr		@ instrumented function  	.globl ftrace_call\suffix  ftrace_call\suffix: @@ -205,11 +208,11 @@ ftrace_graph_call\suffix:  #ifdef CONFIG_DYNAMIC_FTRACE  	@ called from __ftrace_caller, saved in mcount_enter  	ldr	r1, [sp, #16]		@ instrumented routine (func) +	mcount_adjust_addr	r1, r1  #else  	@ called from __mcount, untouched in lr -	mov	r1, lr			@ instrumented routine (func) +	mcount_adjust_addr	r1, lr	@ instrumented routine (func)  #endif -	sub	r1, r1, #MCOUNT_INSN_SIZE  	mov	r2, fp			@ frame pointer  	bl	prepare_ftrace_return  	mcount_exit diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 5bb91bf3d47..b2abfa18f13 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c @@ -180,7 +180,7 @@ armpmu_event_set_period(struct perf_event *event,  u64  armpmu_event_update(struct perf_event *event,  		    struct hw_perf_event *hwc, -		    int idx, int overflow) +		    int idx)  {  	struct arm_pmu *armpmu = to_arm_pmu(event->pmu);  	u64 delta, prev_raw_count, new_raw_count; @@ -193,13 +193,7 @@ again:  			     new_raw_count) != prev_raw_count)  		goto again; -	new_raw_count &= armpmu->max_period; -	prev_raw_count &= armpmu->max_period; - -	if (overflow) -		delta = armpmu->max_period - prev_raw_count + new_raw_count + 1; -	else -		delta = new_raw_count - prev_raw_count; +	delta = (new_raw_count - prev_raw_count) & armpmu->max_period;  	local64_add(delta, &event->count);  	local64_sub(delta, &hwc->period_left); @@ -216,7 +210,7 @@ armpmu_read(struct perf_event *event)  	if (hwc->idx < 0)  		return; -	armpmu_event_update(event, hwc, hwc->idx, 0); +	armpmu_event_update(event, hwc, hwc->idx);  }  static void @@ -232,7 +226,7 @@ armpmu_stop(struct perf_event *event, int flags)  	if (!(hwc->state & PERF_HES_STOPPED)) {  		armpmu->disable(hwc, hwc->idx);  		barrier(); /* why? */ -		armpmu_event_update(event, hwc, hwc->idx, 0); +		armpmu_event_update(event, hwc, hwc->idx);  		hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;  	}  } @@ -518,7 +512,13 @@ __hw_perf_event_init(struct perf_event *event)  	hwc->config_base	    |= (unsigned long)mapping;  	if (!hwc->sample_period) { -		hwc->sample_period  = armpmu->max_period; +		/* +		 * For non-sampling runs, limit the sample_period to half +		 * of the counter width. That way, the new counter value +		 * is far less likely to overtake the previous one unless +		 * you have some serious IRQ latency issues. +		 */ +		hwc->sample_period  = armpmu->max_period >> 1;  		hwc->last_period    = hwc->sample_period;  		local64_set(&hwc->period_left, hwc->sample_period);  	} @@ -680,6 +680,28 @@ static void __init cpu_pmu_init(struct arm_pmu *armpmu)  }  /* + * PMU hardware loses all context when a CPU goes offline. + * When a CPU is hotplugged back in, since some hardware registers are + * UNKNOWN at reset, the PMU must be explicitly reset to avoid reading + * junk values out of them. + */ +static int __cpuinit pmu_cpu_notify(struct notifier_block *b, +					unsigned long action, void *hcpu) +{ +	if ((action & ~CPU_TASKS_FROZEN) != CPU_STARTING) +		return NOTIFY_DONE; + +	if (cpu_pmu && cpu_pmu->reset) +		cpu_pmu->reset(NULL); + +	return NOTIFY_OK; +} + +static struct notifier_block __cpuinitdata pmu_cpu_notifier = { +	.notifier_call = pmu_cpu_notify, +}; + +/*   * CPU PMU identification and registration.   */  static int __init @@ -730,6 +752,7 @@ init_hw_perf_events(void)  		pr_info("enabled with %s PMU driver, %d counters available\n",  			cpu_pmu->name, cpu_pmu->num_events);  		cpu_pmu_init(cpu_pmu); +		register_cpu_notifier(&pmu_cpu_notifier);  		armpmu_register(cpu_pmu, "cpu", PERF_TYPE_RAW);  	} else {  		pr_info("no hardware support available\n"); diff --git a/arch/arm/kernel/perf_event_v6.c b/arch/arm/kernel/perf_event_v6.c index 533be9930ec..b78af0cc6ef 100644 --- a/arch/arm/kernel/perf_event_v6.c +++ b/arch/arm/kernel/perf_event_v6.c @@ -467,23 +467,6 @@ armv6pmu_enable_event(struct hw_perf_event *hwc,  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } -static int counter_is_active(unsigned long pmcr, int idx) -{ -	unsigned long mask = 0; -	if (idx == ARMV6_CYCLE_COUNTER) -		mask = ARMV6_PMCR_CCOUNT_IEN; -	else if (idx == ARMV6_COUNTER0) -		mask = ARMV6_PMCR_COUNT0_IEN; -	else if (idx == ARMV6_COUNTER1) -		mask = ARMV6_PMCR_COUNT1_IEN; - -	if (mask) -		return pmcr & mask; - -	WARN_ONCE(1, "invalid counter number (%d)\n", idx); -	return 0; -} -  static irqreturn_t  armv6pmu_handle_irq(int irq_num,  		    void *dev) @@ -513,7 +496,8 @@ armv6pmu_handle_irq(int irq_num,  		struct perf_event *event = cpuc->events[idx];  		struct hw_perf_event *hwc; -		if (!counter_is_active(pmcr, idx)) +		/* Ignore if we don't have an event. */ +		if (!event)  			continue;  		/* @@ -524,7 +508,7 @@ armv6pmu_handle_irq(int irq_num,  			continue;  		hwc = &event->hw; -		armpmu_event_update(event, hwc, idx, 1); +		armpmu_event_update(event, hwc, idx);  		data.period = event->hw.last_period;  		if (!armpmu_event_set_period(event, hwc, idx))  			continue; diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index 460bbbb6b88..4d7095af2ab 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c @@ -469,6 +469,20 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]  			[C(RESULT_MISS)]	= CACHE_OP_UNSUPPORTED,  		},  	}, +	[C(NODE)] = { +		[C(OP_READ)] = { +			[C(RESULT_ACCESS)]	= CACHE_OP_UNSUPPORTED, +			[C(RESULT_MISS)]	= CACHE_OP_UNSUPPORTED, +		}, +		[C(OP_WRITE)] = { +			[C(RESULT_ACCESS)]	= CACHE_OP_UNSUPPORTED, +			[C(RESULT_MISS)]	= CACHE_OP_UNSUPPORTED, +		}, +		[C(OP_PREFETCH)] = { +			[C(RESULT_ACCESS)]	= CACHE_OP_UNSUPPORTED, +			[C(RESULT_MISS)]	= CACHE_OP_UNSUPPORTED, +		}, +	},  };  /* @@ -579,6 +593,20 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]  			[C(RESULT_MISS)]	= CACHE_OP_UNSUPPORTED,  		},  	}, +	[C(NODE)] = { +		[C(OP_READ)] = { +			[C(RESULT_ACCESS)]	= CACHE_OP_UNSUPPORTED, +			[C(RESULT_MISS)]	= CACHE_OP_UNSUPPORTED, +		}, +		[C(OP_WRITE)] = { +			[C(RESULT_ACCESS)]	= CACHE_OP_UNSUPPORTED, +			[C(RESULT_MISS)]	= CACHE_OP_UNSUPPORTED, +		}, +		[C(OP_PREFETCH)] = { +			[C(RESULT_ACCESS)]	= CACHE_OP_UNSUPPORTED, +			[C(RESULT_MISS)]	= CACHE_OP_UNSUPPORTED, +		}, +	},  };  /* @@ -781,6 +809,11 @@ static inline int armv7_pmnc_disable_intens(int idx)  	counter = ARMV7_IDX_TO_COUNTER(idx);  	asm volatile("mcr p15, 0, %0, c9, c14, 2" : : "r" (BIT(counter))); +	isb(); +	/* Clear the overflow flag in case an interrupt is pending. */ +	asm volatile("mcr p15, 0, %0, c9, c12, 3" : : "r" (BIT(counter))); +	isb(); +  	return idx;  } @@ -927,6 +960,10 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)  		struct perf_event *event = cpuc->events[idx];  		struct hw_perf_event *hwc; +		/* Ignore if we don't have an event. */ +		if (!event) +			continue; +  		/*  		 * We have a single interrupt for all counters. Check that  		 * each counter has overflowed before we process it. @@ -935,7 +972,7 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)  			continue;  		hwc = &event->hw; -		armpmu_event_update(event, hwc, idx, 1); +		armpmu_event_update(event, hwc, idx);  		data.period = event->hw.last_period;  		if (!armpmu_event_set_period(event, hwc, idx))  			continue; diff --git a/arch/arm/kernel/perf_event_xscale.c b/arch/arm/kernel/perf_event_xscale.c index 3b99d826982..71a21e6712f 100644 --- a/arch/arm/kernel/perf_event_xscale.c +++ b/arch/arm/kernel/perf_event_xscale.c @@ -255,11 +255,14 @@ xscale1pmu_handle_irq(int irq_num, void *dev)  		struct perf_event *event = cpuc->events[idx];  		struct hw_perf_event *hwc; +		if (!event) +			continue; +  		if (!xscale1_pmnc_counter_has_overflowed(pmnc, idx))  			continue;  		hwc = &event->hw; -		armpmu_event_update(event, hwc, idx, 1); +		armpmu_event_update(event, hwc, idx);  		data.period = event->hw.last_period;  		if (!armpmu_event_set_period(event, hwc, idx))  			continue; @@ -592,11 +595,14 @@ xscale2pmu_handle_irq(int irq_num, void *dev)  		struct perf_event *event = cpuc->events[idx];  		struct hw_perf_event *hwc; -		if (!xscale2_pmnc_counter_has_overflowed(pmnc, idx)) +		if (!event) +			continue; + +		if (!xscale2_pmnc_counter_has_overflowed(of_flags, idx))  			continue;  		hwc = &event->hw; -		armpmu_event_update(event, hwc, idx, 1); +		armpmu_event_update(event, hwc, idx);  		data.period = event->hw.last_period;  		if (!armpmu_event_set_period(event, hwc, idx))  			continue; @@ -663,7 +669,7 @@ xscale2pmu_enable_event(struct hw_perf_event *hwc, int idx)  static void  xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)  { -	unsigned long flags, ien, evtsel; +	unsigned long flags, ien, evtsel, of_flags;  	struct pmu_hw_events *events = cpu_pmu->get_hw_events();  	ien = xscale2pmu_read_int_enable(); @@ -672,26 +678,31 @@ xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)  	switch (idx) {  	case XSCALE_CYCLE_COUNTER:  		ien &= ~XSCALE2_CCOUNT_INT_EN; +		of_flags = XSCALE2_CCOUNT_OVERFLOW;  		break;  	case XSCALE_COUNTER0:  		ien &= ~XSCALE2_COUNT0_INT_EN;  		evtsel &= ~XSCALE2_COUNT0_EVT_MASK;  		evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT0_EVT_SHFT; +		of_flags = XSCALE2_COUNT0_OVERFLOW;  		break;  	case XSCALE_COUNTER1:  		ien &= ~XSCALE2_COUNT1_INT_EN;  		evtsel &= ~XSCALE2_COUNT1_EVT_MASK;  		evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT1_EVT_SHFT; +		of_flags = XSCALE2_COUNT1_OVERFLOW;  		break;  	case XSCALE_COUNTER2:  		ien &= ~XSCALE2_COUNT2_INT_EN;  		evtsel &= ~XSCALE2_COUNT2_EVT_MASK;  		evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT2_EVT_SHFT; +		of_flags = XSCALE2_COUNT2_OVERFLOW;  		break;  	case XSCALE_COUNTER3:  		ien &= ~XSCALE2_COUNT3_INT_EN;  		evtsel &= ~XSCALE2_COUNT3_EVT_MASK;  		evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT3_EVT_SHFT; +		of_flags = XSCALE2_COUNT3_OVERFLOW;  		break;  	default:  		WARN_ONCE(1, "invalid counter number (%d)\n", idx); @@ -701,6 +712,7 @@ xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)  	raw_spin_lock_irqsave(&events->pmu_lock, flags);  	xscale2pmu_write_event_select(evtsel);  	xscale2pmu_write_int_enable(ien); +	xscale2pmu_write_overflow_flags(of_flags);  	raw_spin_unlock_irqrestore(&events->pmu_lock, flags);  } diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index e1d5e1929fb..ede6443c34d 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -23,6 +23,7 @@  #include <linux/perf_event.h>  #include <linux/hw_breakpoint.h>  #include <linux/regset.h> +#include <linux/audit.h>  #include <asm/pgtable.h>  #include <asm/system.h> @@ -699,10 +700,13 @@ static int vfp_set(struct task_struct *target,  {  	int ret;  	struct thread_info *thread = task_thread_info(target); -	struct vfp_hard_struct new_vfp = thread->vfpstate.hard; +	struct vfp_hard_struct new_vfp;  	const size_t user_fpregs_offset = offsetof(struct user_vfp, fpregs);  	const size_t user_fpscr_offset = offsetof(struct user_vfp, fpscr); +	vfp_sync_hwstate(thread); +	new_vfp = thread->vfpstate.hard; +  	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,  				  &new_vfp.fpregs,  				  user_fpregs_offset, @@ -723,9 +727,8 @@ static int vfp_set(struct task_struct *target,  	if (ret)  		return ret; -	vfp_sync_hwstate(thread); -	thread->vfpstate.hard = new_vfp;  	vfp_flush_hwstate(thread); +	thread->vfpstate.hard = new_vfp;  	return 0;  } @@ -902,6 +905,12 @@ long arch_ptrace(struct task_struct *child, long request,  	return ret;  } +#ifdef __ARMEB__ +#define AUDIT_ARCH_NR AUDIT_ARCH_ARMEB +#else +#define AUDIT_ARCH_NR AUDIT_ARCH_ARM +#endif +  asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)  {  	unsigned long ip; @@ -916,7 +925,7 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)  	if (!ip)  		audit_syscall_exit(regs);  	else -		audit_syscall_entry(AUDIT_ARCH_ARMEB, scno, regs->ARM_r0, +		audit_syscall_entry(AUDIT_ARCH_NR, scno, regs->ARM_r0,  				    regs->ARM_r1, regs->ARM_r2, regs->ARM_r3);  	if (!test_thread_flag(TIF_SYSCALL_TRACE)) diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 129fbd55bde..a255c39612c 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -21,7 +21,6 @@  #include <linux/init.h>  #include <linux/kexec.h>  #include <linux/of_fdt.h> -#include <linux/crash_dump.h>  #include <linux/root_dev.h>  #include <linux/cpu.h>  #include <linux/interrupt.h> @@ -160,7 +159,7 @@ static struct resource mem_res[] = {  		.flags = IORESOURCE_MEM  	},  	{ -		.name = "Kernel text", +		.name = "Kernel code",  		.start = 0,  		.end = 0,  		.flags = IORESOURCE_MEM @@ -427,6 +426,20 @@ void cpu_init(void)  	    : "r14");  } +int __cpu_logical_map[NR_CPUS]; + +void __init smp_setup_processor_id(void) +{ +	int i; +	u32 cpu = is_smp() ? read_cpuid_mpidr() & 0xff : 0; + +	cpu_logical_map(0) = cpu; +	for (i = 1; i < NR_CPUS; ++i) +		cpu_logical_map(i) = i == cpu ? 0 : i; + +	printk(KERN_INFO "Booting Linux on physical CPU %d\n", cpu); +} +  static void __init setup_processor(void)  {  	struct proc_info_list *list; diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 0340224cf73..9e617bd4a14 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -227,6 +227,8 @@ static int restore_vfp_context(struct vfp_sigframe __user *frame)  	if (magic != VFP_MAGIC || size != VFP_STORAGE_SIZE)  		return -EINVAL; +	vfp_flush_hwstate(thread); +  	/*  	 * Copy the floating point registers. There can be unused  	 * registers see asm/hwcap.h for details. @@ -251,9 +253,6 @@ static int restore_vfp_context(struct vfp_sigframe __user *frame)  	__get_user_error(h->fpinst, &frame->ufp_exc.fpinst, err);  	__get_user_error(h->fpinst2, &frame->ufp_exc.fpinst2, err); -	if (!err) -		vfp_flush_hwstate(thread); -  	return err ? -EFAULT : 0;  } diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 57db122a4f6..cdeb727527d 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -233,20 +233,6 @@ void __ref cpu_die(void)  }  #endif /* CONFIG_HOTPLUG_CPU */ -int __cpu_logical_map[NR_CPUS]; - -void __init smp_setup_processor_id(void) -{ -	int i; -	u32 cpu = is_smp() ? read_cpuid_mpidr() & 0xff : 0; - -	cpu_logical_map(0) = cpu; -	for (i = 1; i < NR_CPUS; ++i) -		cpu_logical_map(i) = i == cpu ? 0 : i; - -	printk(KERN_INFO "Booting Linux on physical CPU %d\n", cpu); -} -  /*   * Called by both boot and secondaries to move global data into   * per-processor storage. @@ -443,9 +429,7 @@ static DEFINE_PER_CPU(struct clock_event_device, percpu_clockevent);  static void ipi_timer(void)  {  	struct clock_event_device *evt = &__get_cpu_var(percpu_clockevent); -	irq_enter();  	evt->event_handler(evt); -	irq_exit();  }  #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST @@ -548,7 +532,9 @@ void handle_IPI(int ipinr, struct pt_regs *regs)  	switch (ipinr) {  	case IPI_TIMER: +		irq_enter();  		ipi_timer(); +		irq_exit();  		break;  	case IPI_RESCHEDULE: @@ -556,15 +542,21 @@ void handle_IPI(int ipinr, struct pt_regs *regs)  		break;  	case IPI_CALL_FUNC: +		irq_enter();  		generic_smp_call_function_interrupt(); +		irq_exit();  		break;  	case IPI_CALL_FUNC_SINGLE: +		irq_enter();  		generic_smp_call_function_single_interrupt(); +		irq_exit();  		break;  	case IPI_CPU_STOP: +		irq_enter();  		ipi_cpu_stop(cpu); +		irq_exit();  		break;  	default: diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index c8e938553d4..7a79b24597b 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c @@ -129,7 +129,7 @@ static struct notifier_block twd_cpufreq_nb = {  static int twd_cpufreq_init(void)  { -	if (!IS_ERR(twd_clk)) +	if (twd_evt && *__this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk))  		return cpufreq_register_notifier(&twd_cpufreq_nb,  			CPUFREQ_TRANSITION_NOTIFIER); @@ -252,6 +252,8 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk)  	else  		twd_calibrate_rate(); +	__raw_writel(0, twd_base + TWD_TIMER_CONTROL); +  	clk->name = "local_timer";  	clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT |  			CLOCK_EVT_FEAT_C3STOP; diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 99a57270250..f84dfe67724 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -266,6 +266,7 @@ void die(const char *str, struct pt_regs *regs, int err)  {  	struct thread_info *thread = current_thread_info();  	int ret; +	enum bug_trap_type bug_type = BUG_TRAP_TYPE_NONE;  	oops_enter(); @@ -273,7 +274,9 @@ void die(const char *str, struct pt_regs *regs, int err)  	console_verbose();  	bust_spinlocks(1);  	if (!user_mode(regs)) -		report_bug(regs->ARM_pc, regs); +		bug_type = report_bug(regs->ARM_pc, regs); +	if (bug_type != BUG_TRAP_TYPE_NONE) +		str = "Oops - BUG";  	ret = __die(str, err, thread, regs);  	if (regs && kexec_should_crash(thread->task)) diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index f76e7554867..43a31fb0631 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S @@ -4,11 +4,13 @@   */  #include <asm-generic/vmlinux.lds.h> +#include <asm/cache.h>  #include <asm/thread_info.h>  #include <asm/memory.h>  #include <asm/page.h>  #define PROC_INFO							\ +	. = ALIGN(4);							\  	VMLINUX_SYMBOL(__proc_info_begin) = .;				\  	*(.proc.info.init)						\  	VMLINUX_SYMBOL(__proc_info_end) = .; @@ -181,7 +183,7 @@ SECTIONS  	}  #endif -	PERCPU_SECTION(32) +	PERCPU_SECTION(L1_CACHE_BYTES)  #ifdef CONFIG_XIP_KERNEL  	__data_loc = ALIGN(4);		/* location in binary */ @@ -212,13 +214,13 @@ SECTIONS  #endif  		NOSAVE_DATA -		CACHELINE_ALIGNED_DATA(32) -		READ_MOSTLY_DATA(32) +		CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES) +		READ_MOSTLY_DATA(L1_CACHE_BYTES)  		/*  		 * The exception fixup table (might need resorting at runtime)  		 */ -		. = ALIGN(32); +		. = ALIGN(4);  		__start___ex_table = .;  #ifdef CONFIG_MMU  		*(__ex_table) diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S index 1b049cd7a49..11093a7c3e3 100644 --- a/arch/arm/lib/getuser.S +++ b/arch/arm/lib/getuser.S @@ -31,18 +31,18 @@  #include <asm/domain.h>  ENTRY(__get_user_1) -1:	T(ldrb)	r2, [r0] +1: TUSER(ldrb)	r2, [r0]  	mov	r0, #0  	mov	pc, lr  ENDPROC(__get_user_1)  ENTRY(__get_user_2)  #ifdef CONFIG_THUMB2_KERNEL -2:	T(ldrb)	r2, [r0] -3:	T(ldrb)	r3, [r0, #1] +2: TUSER(ldrb)	r2, [r0] +3: TUSER(ldrb)	r3, [r0, #1]  #else -2:	T(ldrb)	r2, [r0], #1 -3:	T(ldrb)	r3, [r0] +2: TUSER(ldrb)	r2, [r0], #1 +3: TUSER(ldrb)	r3, [r0]  #endif  #ifndef __ARMEB__  	orr	r2, r2, r3, lsl #8 @@ -54,7 +54,7 @@ ENTRY(__get_user_2)  ENDPROC(__get_user_2)  ENTRY(__get_user_4) -4:	T(ldr)	r2, [r0] +4: TUSER(ldr)	r2, [r0]  	mov	r0, #0  	mov	pc, lr  ENDPROC(__get_user_4) diff --git a/arch/arm/lib/putuser.S b/arch/arm/lib/putuser.S index c023fc11e86..7db25990c58 100644 --- a/arch/arm/lib/putuser.S +++ b/arch/arm/lib/putuser.S @@ -31,7 +31,7 @@  #include <asm/domain.h>  ENTRY(__put_user_1) -1:	T(strb)	r2, [r0] +1: TUSER(strb)	r2, [r0]  	mov	r0, #0  	mov	pc, lr  ENDPROC(__put_user_1) @@ -40,19 +40,19 @@ ENTRY(__put_user_2)  	mov	ip, r2, lsr #8  #ifdef CONFIG_THUMB2_KERNEL  #ifndef __ARMEB__ -2:	T(strb)	r2, [r0] -3:	T(strb)	ip, [r0, #1] +2: TUSER(strb)	r2, [r0] +3: TUSER(strb)	ip, [r0, #1]  #else -2:	T(strb)	ip, [r0] -3:	T(strb)	r2, [r0, #1] +2: TUSER(strb)	ip, [r0] +3: TUSER(strb)	r2, [r0, #1]  #endif  #else	/* !CONFIG_THUMB2_KERNEL */  #ifndef __ARMEB__ -2:	T(strb)	r2, [r0], #1 -3:	T(strb)	ip, [r0] +2: TUSER(strb)	r2, [r0], #1 +3: TUSER(strb)	ip, [r0]  #else -2:	T(strb)	ip, [r0], #1 -3:	T(strb)	r2, [r0] +2: TUSER(strb)	ip, [r0], #1 +3: TUSER(strb)	r2, [r0]  #endif  #endif	/* CONFIG_THUMB2_KERNEL */  	mov	r0, #0 @@ -60,18 +60,18 @@ ENTRY(__put_user_2)  ENDPROC(__put_user_2)  ENTRY(__put_user_4) -4:	T(str)	r2, [r0] +4: TUSER(str)	r2, [r0]  	mov	r0, #0  	mov	pc, lr  ENDPROC(__put_user_4)  ENTRY(__put_user_8)  #ifdef CONFIG_THUMB2_KERNEL -5:	T(str)	r2, [r0] -6:	T(str)	r3, [r0, #4] +5: TUSER(str)	r2, [r0] +6: TUSER(str)	r3, [r0, #4]  #else -5:	T(str)	r2, [r0], #4 -6:	T(str)	r3, [r0] +5: TUSER(str)	r2, [r0], #4 +6: TUSER(str)	r3, [r0]  #endif  	mov	r0, #0  	mov	pc, lr diff --git a/arch/arm/lib/uaccess.S b/arch/arm/lib/uaccess.S index d0ece2aeb70..5c908b1cb8e 100644 --- a/arch/arm/lib/uaccess.S +++ b/arch/arm/lib/uaccess.S @@ -32,11 +32,11 @@  		rsb	ip, ip, #4  		cmp	ip, #2  		ldrb	r3, [r1], #1 -USER(		T(strb)	r3, [r0], #1)			@ May fault +USER(	TUSER(	strb)	r3, [r0], #1)			@ May fault  		ldrgeb	r3, [r1], #1 -USER(		T(strgeb) r3, [r0], #1)			@ May fault +USER(	TUSER(	strgeb) r3, [r0], #1)			@ May fault  		ldrgtb	r3, [r1], #1 -USER(		T(strgtb) r3, [r0], #1)			@ May fault +USER(	TUSER(	strgtb) r3, [r0], #1)			@ May fault  		sub	r2, r2, ip  		b	.Lc2u_dest_aligned @@ -59,7 +59,7 @@ ENTRY(__copy_to_user)  		addmi	ip, r2, #4  		bmi	.Lc2u_0nowords  		ldr	r3, [r1], #4 -USER(		T(str)	r3, [r0], #4)			@ May fault +USER(	TUSER(	str)	r3, [r0], #4)			@ May fault  		mov	ip, r0, lsl #32 - PAGE_SHIFT	@ On each page, use a ld/st??t instruction  		rsb	ip, ip, #0  		movs	ip, ip, lsr #32 - PAGE_SHIFT @@ -88,18 +88,18 @@ USER(		T(str)	r3, [r0], #4)			@ May fault  		stmneia	r0!, {r3 - r4}			@ Shouldnt fault  		tst	ip, #4  		ldrne	r3, [r1], #4 -		T(strne) r3, [r0], #4			@ Shouldnt fault +	TUSER(	strne) r3, [r0], #4			@ Shouldnt fault  		ands	ip, ip, #3  		beq	.Lc2u_0fupi  .Lc2u_0nowords:	teq	ip, #0  		beq	.Lc2u_finished  .Lc2u_nowords:	cmp	ip, #2  		ldrb	r3, [r1], #1 -USER(		T(strb)	r3, [r0], #1)			@ May fault +USER(	TUSER(	strb)	r3, [r0], #1)			@ May fault  		ldrgeb	r3, [r1], #1 -USER(		T(strgeb) r3, [r0], #1)			@ May fault +USER(	TUSER(	strgeb) r3, [r0], #1)			@ May fault  		ldrgtb	r3, [r1], #1 -USER(		T(strgtb) r3, [r0], #1)			@ May fault +USER(	TUSER(	strgtb) r3, [r0], #1)			@ May fault  		b	.Lc2u_finished  .Lc2u_not_enough: @@ -120,7 +120,7 @@ USER(		T(strgtb) r3, [r0], #1)			@ May fault  		mov	r3, r7, pull #8  		ldr	r7, [r1], #4  		orr	r3, r3, r7, push #24 -USER(		T(str)	r3, [r0], #4)			@ May fault +USER(	TUSER(	str)	r3, [r0], #4)			@ May fault  		mov	ip, r0, lsl #32 - PAGE_SHIFT  		rsb	ip, ip, #0  		movs	ip, ip, lsr #32 - PAGE_SHIFT @@ -155,18 +155,18 @@ USER(		T(str)	r3, [r0], #4)			@ May fault  		movne	r3, r7, pull #8  		ldrne	r7, [r1], #4  		orrne	r3, r3, r7, push #24 -		T(strne) r3, [r0], #4			@ Shouldnt fault +	TUSER(	strne) r3, [r0], #4			@ Shouldnt fault  		ands	ip, ip, #3  		beq	.Lc2u_1fupi  .Lc2u_1nowords:	mov	r3, r7, get_byte_1  		teq	ip, #0  		beq	.Lc2u_finished  		cmp	ip, #2 -USER(		T(strb)	r3, [r0], #1)			@ May fault +USER(	TUSER(	strb)	r3, [r0], #1)			@ May fault  		movge	r3, r7, get_byte_2 -USER(		T(strgeb) r3, [r0], #1)			@ May fault +USER(	TUSER(	strgeb) r3, [r0], #1)			@ May fault  		movgt	r3, r7, get_byte_3 -USER(		T(strgtb) r3, [r0], #1)			@ May fault +USER(	TUSER(	strgtb) r3, [r0], #1)			@ May fault  		b	.Lc2u_finished  .Lc2u_2fupi:	subs	r2, r2, #4 @@ -175,7 +175,7 @@ USER(		T(strgtb) r3, [r0], #1)			@ May fault  		mov	r3, r7, pull #16  		ldr	r7, [r1], #4  		orr	r3, r3, r7, push #16 -USER(		T(str)	r3, [r0], #4)			@ May fault +USER(	TUSER(	str)	r3, [r0], #4)			@ May fault  		mov	ip, r0, lsl #32 - PAGE_SHIFT  		rsb	ip, ip, #0  		movs	ip, ip, lsr #32 - PAGE_SHIFT @@ -210,18 +210,18 @@ USER(		T(str)	r3, [r0], #4)			@ May fault  		movne	r3, r7, pull #16  		ldrne	r7, [r1], #4  		orrne	r3, r3, r7, push #16 -		T(strne) r3, [r0], #4			@ Shouldnt fault +	TUSER(	strne) r3, [r0], #4			@ Shouldnt fault  		ands	ip, ip, #3  		beq	.Lc2u_2fupi  .Lc2u_2nowords:	mov	r3, r7, get_byte_2  		teq	ip, #0  		beq	.Lc2u_finished  		cmp	ip, #2 -USER(		T(strb)	r3, [r0], #1)			@ May fault +USER(	TUSER(	strb)	r3, [r0], #1)			@ May fault  		movge	r3, r7, get_byte_3 -USER(		T(strgeb) r3, [r0], #1)			@ May fault +USER(	TUSER(	strgeb) r3, [r0], #1)			@ May fault  		ldrgtb	r3, [r1], #0 -USER(		T(strgtb) r3, [r0], #1)			@ May fault +USER(	TUSER(	strgtb) r3, [r0], #1)			@ May fault  		b	.Lc2u_finished  .Lc2u_3fupi:	subs	r2, r2, #4 @@ -230,7 +230,7 @@ USER(		T(strgtb) r3, [r0], #1)			@ May fault  		mov	r3, r7, pull #24  		ldr	r7, [r1], #4  		orr	r3, r3, r7, push #8 -USER(		T(str)	r3, [r0], #4)			@ May fault +USER(	TUSER(	str)	r3, [r0], #4)			@ May fault  		mov	ip, r0, lsl #32 - PAGE_SHIFT  		rsb	ip, ip, #0  		movs	ip, ip, lsr #32 - PAGE_SHIFT @@ -265,18 +265,18 @@ USER(		T(str)	r3, [r0], #4)			@ May fault  		movne	r3, r7, pull #24  		ldrne	r7, [r1], #4  		orrne	r3, r3, r7, push #8 -		T(strne) r3, [r0], #4			@ Shouldnt fault +	TUSER(	strne) r3, [r0], #4			@ Shouldnt fault  		ands	ip, ip, #3  		beq	.Lc2u_3fupi  .Lc2u_3nowords:	mov	r3, r7, get_byte_3  		teq	ip, #0  		beq	.Lc2u_finished  		cmp	ip, #2 -USER(		T(strb)	r3, [r0], #1)			@ May fault +USER(	TUSER(	strb)	r3, [r0], #1)			@ May fault  		ldrgeb	r3, [r1], #1 -USER(		T(strgeb) r3, [r0], #1)			@ May fault +USER(	TUSER(	strgeb) r3, [r0], #1)			@ May fault  		ldrgtb	r3, [r1], #0 -USER(		T(strgtb) r3, [r0], #1)			@ May fault +USER(	TUSER(	strgtb) r3, [r0], #1)			@ May fault  		b	.Lc2u_finished  ENDPROC(__copy_to_user) @@ -295,11 +295,11 @@ ENDPROC(__copy_to_user)  .Lcfu_dest_not_aligned:  		rsb	ip, ip, #4  		cmp	ip, #2 -USER(		T(ldrb)	r3, [r1], #1)			@ May fault +USER(	TUSER(	ldrb)	r3, [r1], #1)			@ May fault  		strb	r3, [r0], #1 -USER(		T(ldrgeb) r3, [r1], #1)			@ May fault +USER(	TUSER(	ldrgeb) r3, [r1], #1)			@ May fault  		strgeb	r3, [r0], #1 -USER(		T(ldrgtb) r3, [r1], #1)			@ May fault +USER(	TUSER(	ldrgtb) r3, [r1], #1)			@ May fault  		strgtb	r3, [r0], #1  		sub	r2, r2, ip  		b	.Lcfu_dest_aligned @@ -322,7 +322,7 @@ ENTRY(__copy_from_user)  .Lcfu_0fupi:	subs	r2, r2, #4  		addmi	ip, r2, #4  		bmi	.Lcfu_0nowords -USER(		T(ldr)	r3, [r1], #4) +USER(	TUSER(	ldr)	r3, [r1], #4)  		str	r3, [r0], #4  		mov	ip, r1, lsl #32 - PAGE_SHIFT	@ On each page, use a ld/st??t instruction  		rsb	ip, ip, #0 @@ -351,18 +351,18 @@ USER(		T(ldr)	r3, [r1], #4)  		ldmneia	r1!, {r3 - r4}			@ Shouldnt fault  		stmneia	r0!, {r3 - r4}  		tst	ip, #4 -		T(ldrne) r3, [r1], #4			@ Shouldnt fault +	TUSER(	ldrne) r3, [r1], #4			@ Shouldnt fault  		strne	r3, [r0], #4  		ands	ip, ip, #3  		beq	.Lcfu_0fupi  .Lcfu_0nowords:	teq	ip, #0  		beq	.Lcfu_finished  .Lcfu_nowords:	cmp	ip, #2 -USER(		T(ldrb)	r3, [r1], #1)			@ May fault +USER(	TUSER(	ldrb)	r3, [r1], #1)			@ May fault  		strb	r3, [r0], #1 -USER(		T(ldrgeb) r3, [r1], #1)			@ May fault +USER(	TUSER(	ldrgeb) r3, [r1], #1)			@ May fault  		strgeb	r3, [r0], #1 -USER(		T(ldrgtb) r3, [r1], #1)			@ May fault +USER(	TUSER(	ldrgtb) r3, [r1], #1)			@ May fault  		strgtb	r3, [r0], #1  		b	.Lcfu_finished @@ -375,7 +375,7 @@ USER(		T(ldrgtb) r3, [r1], #1)			@ May fault  .Lcfu_src_not_aligned:  		bic	r1, r1, #3 -USER(		T(ldr)	r7, [r1], #4)			@ May fault +USER(	TUSER(	ldr)	r7, [r1], #4)			@ May fault  		cmp	ip, #2  		bgt	.Lcfu_3fupi  		beq	.Lcfu_2fupi @@ -383,7 +383,7 @@ USER(		T(ldr)	r7, [r1], #4)			@ May fault  		addmi	ip, r2, #4  		bmi	.Lcfu_1nowords  		mov	r3, r7, pull #8 -USER(		T(ldr)	r7, [r1], #4)			@ May fault +USER(	TUSER(	ldr)	r7, [r1], #4)			@ May fault  		orr	r3, r3, r7, push #24  		str	r3, [r0], #4  		mov	ip, r1, lsl #32 - PAGE_SHIFT @@ -418,7 +418,7 @@ USER(		T(ldr)	r7, [r1], #4)			@ May fault  		stmneia	r0!, {r3 - r4}  		tst	ip, #4  		movne	r3, r7, pull #8 -USER(		T(ldrne) r7, [r1], #4)			@ May fault +USER(	TUSER(	ldrne) r7, [r1], #4)			@ May fault  		orrne	r3, r3, r7, push #24  		strne	r3, [r0], #4  		ands	ip, ip, #3 @@ -438,7 +438,7 @@ USER(		T(ldrne) r7, [r1], #4)			@ May fault  		addmi	ip, r2, #4  		bmi	.Lcfu_2nowords  		mov	r3, r7, pull #16 -USER(		T(ldr)	r7, [r1], #4)			@ May fault +USER(	TUSER(	ldr)	r7, [r1], #4)			@ May fault  		orr	r3, r3, r7, push #16  		str	r3, [r0], #4  		mov	ip, r1, lsl #32 - PAGE_SHIFT @@ -474,7 +474,7 @@ USER(		T(ldr)	r7, [r1], #4)			@ May fault  		stmneia	r0!, {r3 - r4}  		tst	ip, #4  		movne	r3, r7, pull #16 -USER(		T(ldrne) r7, [r1], #4)			@ May fault +USER(	TUSER(	ldrne) r7, [r1], #4)			@ May fault  		orrne	r3, r3, r7, push #16  		strne	r3, [r0], #4  		ands	ip, ip, #3 @@ -486,7 +486,7 @@ USER(		T(ldrne) r7, [r1], #4)			@ May fault  		strb	r3, [r0], #1  		movge	r3, r7, get_byte_3  		strgeb	r3, [r0], #1 -USER(		T(ldrgtb) r3, [r1], #0)			@ May fault +USER(	TUSER(	ldrgtb) r3, [r1], #0)			@ May fault  		strgtb	r3, [r0], #1  		b	.Lcfu_finished @@ -494,7 +494,7 @@ USER(		T(ldrgtb) r3, [r1], #0)			@ May fault  		addmi	ip, r2, #4  		bmi	.Lcfu_3nowords  		mov	r3, r7, pull #24 -USER(		T(ldr)	r7, [r1], #4)			@ May fault +USER(	TUSER(	ldr)	r7, [r1], #4)			@ May fault  		orr	r3, r3, r7, push #8  		str	r3, [r0], #4  		mov	ip, r1, lsl #32 - PAGE_SHIFT @@ -529,7 +529,7 @@ USER(		T(ldr)	r7, [r1], #4)			@ May fault  		stmneia	r0!, {r3 - r4}  		tst	ip, #4  		movne	r3, r7, pull #24 -USER(		T(ldrne) r7, [r1], #4)			@ May fault +USER(	TUSER(	ldrne) r7, [r1], #4)			@ May fault  		orrne	r3, r3, r7, push #8  		strne	r3, [r0], #4  		ands	ip, ip, #3 @@ -539,9 +539,9 @@ USER(		T(ldrne) r7, [r1], #4)			@ May fault  		beq	.Lcfu_finished  		cmp	ip, #2  		strb	r3, [r0], #1 -USER(		T(ldrgeb) r3, [r1], #1)			@ May fault +USER(	TUSER(	ldrgeb) r3, [r1], #1)			@ May fault  		strgeb	r3, [r0], #1 -USER(		T(ldrgtb) r3, [r1], #1)			@ May fault +USER(	TUSER(	ldrgtb) r3, [r1], #1)			@ May fault  		strgtb	r3, [r0], #1  		b	.Lcfu_finished  ENDPROC(__copy_from_user) diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index 4f991f29528..71feb00a1e9 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig @@ -18,6 +18,12 @@ config HAVE_AT91_USART4  config HAVE_AT91_USART5  	bool +config AT91_SAM9_ALT_RESET +	bool + +config AT91_SAM9G45_RESET +	bool +  menu "Atmel AT91 System-on-Chip"  choice @@ -39,6 +45,7 @@ config ARCH_AT91SAM9260  	select HAVE_AT91_USART4  	select HAVE_AT91_USART5  	select HAVE_NET_MACB +	select AT91_SAM9_ALT_RESET  config ARCH_AT91SAM9261  	bool "AT91SAM9261" @@ -46,6 +53,7 @@ config ARCH_AT91SAM9261  	select GENERIC_CLOCKEVENTS  	select HAVE_FB_ATMEL  	select HAVE_AT91_DBGU0 +	select AT91_SAM9_ALT_RESET  config ARCH_AT91SAM9G10  	bool "AT91SAM9G10" @@ -53,6 +61,7 @@ config ARCH_AT91SAM9G10  	select GENERIC_CLOCKEVENTS  	select HAVE_AT91_DBGU0  	select HAVE_FB_ATMEL +	select AT91_SAM9_ALT_RESET  config ARCH_AT91SAM9263  	bool "AT91SAM9263" @@ -61,6 +70,7 @@ config ARCH_AT91SAM9263  	select HAVE_FB_ATMEL  	select HAVE_NET_MACB  	select HAVE_AT91_DBGU1 +	select AT91_SAM9_ALT_RESET  config ARCH_AT91SAM9RL  	bool "AT91SAM9RL" @@ -69,6 +79,7 @@ config ARCH_AT91SAM9RL  	select HAVE_AT91_USART3  	select HAVE_FB_ATMEL  	select HAVE_AT91_DBGU0 +	select AT91_SAM9_ALT_RESET  config ARCH_AT91SAM9G20  	bool "AT91SAM9G20" @@ -79,6 +90,7 @@ config ARCH_AT91SAM9G20  	select HAVE_AT91_USART4  	select HAVE_AT91_USART5  	select HAVE_NET_MACB +	select AT91_SAM9_ALT_RESET  config ARCH_AT91SAM9G45  	bool "AT91SAM9G45" @@ -88,6 +100,7 @@ config ARCH_AT91SAM9G45  	select HAVE_FB_ATMEL  	select HAVE_NET_MACB  	select HAVE_AT91_DBGU1 +	select AT91_SAM9G45_RESET  config ARCH_AT91CAP9  	bool "AT91CAP9" @@ -96,6 +109,7 @@ config ARCH_AT91CAP9  	select HAVE_FB_ATMEL  	select HAVE_NET_MACB  	select HAVE_AT91_DBGU1 +	select AT91_SAM9G45_RESET  config ARCH_AT91X40  	bool "AT91x40" diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index 242174f9f35..705e1fbded3 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile @@ -8,15 +8,17 @@ obj-n		:=  obj-		:=  obj-$(CONFIG_AT91_PMC_UNIT)	+= clock.o +obj-$(CONFIG_AT91_SAM9_ALT_RESET) += at91sam9_alt_reset.o +obj-$(CONFIG_AT91_SAM9G45_RESET) += at91sam9g45_reset.o  # CPU-specific support  obj-$(CONFIG_ARCH_AT91RM9200)	+= at91rm9200.o at91rm9200_time.o at91rm9200_devices.o -obj-$(CONFIG_ARCH_AT91SAM9260)	+= at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9_alt_reset.o -obj-$(CONFIG_ARCH_AT91SAM9261)	+= at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o at91sam9_alt_reset.o -obj-$(CONFIG_ARCH_AT91SAM9G10)	+= at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o at91sam9_alt_reset.o -obj-$(CONFIG_ARCH_AT91SAM9263)	+= at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o at91sam9_alt_reset.o -obj-$(CONFIG_ARCH_AT91SAM9RL)	+= at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o at91sam9_alt_reset.o -obj-$(CONFIG_ARCH_AT91SAM9G20)	+= at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o at91sam9_alt_reset.o +obj-$(CONFIG_ARCH_AT91SAM9260)	+= at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o +obj-$(CONFIG_ARCH_AT91SAM9261)	+= at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o +obj-$(CONFIG_ARCH_AT91SAM9G10)	+= at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o +obj-$(CONFIG_ARCH_AT91SAM9263)	+= at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o +obj-$(CONFIG_ARCH_AT91SAM9RL)	+= at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o +obj-$(CONFIG_ARCH_AT91SAM9G20)	+= at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o  obj-$(CONFIG_ARCH_AT91SAM9G45)	+= at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o  obj-$(CONFIG_ARCH_AT91CAP9)	+= at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o  obj-$(CONFIG_ARCH_AT91X40)	+= at91x40.o at91x40_time.o diff --git a/arch/arm/mach-at91/at91cap9.c b/arch/arm/mach-at91/at91cap9.c index edb879ac04c..a42edc25a87 100644 --- a/arch/arm/mach-at91/at91cap9.c +++ b/arch/arm/mach-at91/at91cap9.c @@ -21,7 +21,6 @@  #include <mach/cpu.h>  #include <mach/at91cap9.h>  #include <mach/at91_pmc.h> -#include <mach/at91_rstc.h>  #include "soc.h"  #include "generic.h" @@ -314,11 +313,6 @@ static struct at91_gpio_bank at91cap9_gpio[] __initdata = {  	}  }; -static void at91cap9_restart(char mode, const char *cmd) -{ -	at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); -} -  /* --------------------------------------------------------------------   *  AT91CAP9 processor initialization   * -------------------------------------------------------------------- */ @@ -331,13 +325,14 @@ static void __init at91cap9_map_io(void)  static void __init at91cap9_ioremap_registers(void)  {  	at91_ioremap_shdwc(AT91CAP9_BASE_SHDWC); +	at91_ioremap_rstc(AT91CAP9_BASE_RSTC);  	at91sam926x_ioremap_pit(AT91CAP9_BASE_PIT);  	at91sam9_ioremap_smc(0, AT91CAP9_BASE_SMC);  }  static void __init at91cap9_initialize(void)  { -	arm_pm_restart = at91cap9_restart; +	arm_pm_restart = at91sam9g45_restart;  	at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1);  	/* Register GPIO subsystem */ diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index 18bacec2b09..97676bdae99 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c @@ -83,7 +83,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}   *  USB Device (Gadget)   * -------------------------------------------------------------------- */ -#ifdef CONFIG_USB_AT91 +#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)  static struct at91_udc_data udc_data;  static struct resource udc_resources[] = { diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index 5e46e4a9643..d4036ba4361 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c @@ -323,6 +323,7 @@ static void __init at91sam9260_map_io(void)  static void __init at91sam9260_ioremap_registers(void)  {  	at91_ioremap_shdwc(AT91SAM9260_BASE_SHDWC); +	at91_ioremap_rstc(AT91SAM9260_BASE_RSTC);  	at91sam926x_ioremap_pit(AT91SAM9260_BASE_PIT);  	at91sam9_ioremap_smc(0, AT91SAM9260_BASE_SMC);  } diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 642ccb6d26b..5a24f0b4554 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c @@ -84,7 +84,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}   *  USB Device (Gadget)   * -------------------------------------------------------------------- */ -#ifdef CONFIG_USB_AT91 +#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)  static struct at91_udc_data udc_data;  static struct resource udc_resources[] = { @@ -1215,8 +1215,7 @@ void __init at91_add_device_serial(void) {}   *  CF/IDE   * -------------------------------------------------------------------- */ -#if defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) || \ -	defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) || \ +#if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) || \  	defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE)  static struct at91_cf_data cf0_data; @@ -1313,10 +1312,8 @@ void __init at91_add_device_cf(struct at91_cf_data *data)  	if (data->flags & AT91_CF_TRUE_IDE)  #if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE)  		pdev->name = "pata_at91"; -#elif defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) -		pdev->name = "at91_ide";  #else -#warning "board requires AT91_CF_TRUE_IDE: enable either at91_ide or pata_at91" +#warning "board requires AT91_CF_TRUE_IDE: enable pata_at91"  #endif  	else  		pdev->name = "at91_cf"; diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index b85b9ea6017..023c2ff138d 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c @@ -281,6 +281,7 @@ static void __init at91sam9261_map_io(void)  static void __init at91sam9261_ioremap_registers(void)  {  	at91_ioremap_shdwc(AT91SAM9261_BASE_SHDWC); +	at91_ioremap_rstc(AT91SAM9261_BASE_RSTC);  	at91sam926x_ioremap_pit(AT91SAM9261_BASE_PIT);  	at91sam9_ioremap_smc(0, AT91SAM9261_BASE_SMC);  } diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index fc59cbdb0e3..1e28bed8f42 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c @@ -87,7 +87,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}   *  USB Device (Gadget)   * -------------------------------------------------------------------- */ -#ifdef CONFIG_USB_AT91 +#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)  static struct at91_udc_data udc_data;  static struct resource udc_resources[] = { diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index 79e3669b111..75e876c258a 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c @@ -301,6 +301,7 @@ static void __init at91sam9263_map_io(void)  static void __init at91sam9263_ioremap_registers(void)  {  	at91_ioremap_shdwc(AT91SAM9263_BASE_SHDWC); +	at91_ioremap_rstc(AT91SAM9263_BASE_RSTC);  	at91sam926x_ioremap_pit(AT91SAM9263_BASE_PIT);  	at91sam9_ioremap_smc(0, AT91SAM9263_BASE_SMC0);  	at91sam9_ioremap_smc(1, AT91SAM9263_BASE_SMC1); diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 7b46b278702..366a7765635 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -92,7 +92,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}   *  USB Device (Gadget)   * -------------------------------------------------------------------- */ -#ifdef CONFIG_USB_AT91 +#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)  static struct at91_udc_data udc_data;  static struct resource udc_resources[] = { @@ -355,8 +355,8 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}   *  Compact Flash (PCMCIA or IDE)   * -------------------------------------------------------------------- */ -#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) || \ -    defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) +#if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) || \ +	defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE)  static struct at91_cf_data cf0_data; @@ -450,7 +450,7 @@ void __init at91_add_device_cf(struct at91_cf_data *data)  	at91_set_A_periph(AT91_PIN_PD9, 0);  /* CFCE2 */  	at91_set_A_periph(AT91_PIN_PD14, 0); /* CFNRW */ -	pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "at91_ide" : "at91_cf"; +	pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "pata_at91" : "at91_cf";  	platform_device_register(pdev);  }  #else diff --git a/arch/arm/mach-at91/at91sam9_alt_reset.S b/arch/arm/mach-at91/at91sam9_alt_reset.S index d3f931c5942..518e4237717 100644 --- a/arch/arm/mach-at91/at91sam9_alt_reset.S +++ b/arch/arm/mach-at91/at91sam9_alt_reset.S @@ -23,7 +23,8 @@  			.globl	at91sam9_alt_restart  at91sam9_alt_restart:	ldr	r0, .at91_va_base_sdramc	@ preload constants -			ldr	r1, .at91_va_base_rstc_cr +			ldr	r1, =at91_rstc_base +			ldr	r1, [r1]  			mov	r2, #1  			mov	r3, #AT91_SDRAMC_LPCB_POWER_DOWN @@ -33,11 +34,9 @@ at91sam9_alt_restart:	ldr	r0, .at91_va_base_sdramc	@ preload constants  			str	r2, [r0, #AT91_SDRAMC_TR]	@ disable SDRAM access  			str	r3, [r0, #AT91_SDRAMC_LPR]	@ power down SDRAM -			str	r4, [r1]			@ reset processor +			str	r4, [r1, #AT91_RSTC_CR]		@ reset processor  			b	.  .at91_va_base_sdramc:  	.word AT91_VA_BASE_SYS + AT91_SDRAMC0 -.at91_va_base_rstc_cr: -	.word AT91_VA_BASE_SYS + AT91_RSTC_CR diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 7032dd32cdf..1cb6a96b1c1 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c @@ -18,7 +18,6 @@  #include <asm/mach/map.h>  #include <mach/at91sam9g45.h>  #include <mach/at91_pmc.h> -#include <mach/at91_rstc.h>  #include <mach/cpu.h>  #include "soc.h" @@ -318,11 +317,6 @@ static struct at91_gpio_bank at91sam9g45_gpio[] __initdata = {  	}  }; -static void at91sam9g45_restart(char mode, const char *cmd) -{ -	at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); -} -  /* --------------------------------------------------------------------   *  AT91SAM9G45 processor initialization   * -------------------------------------------------------------------- */ @@ -336,6 +330,7 @@ static void __init at91sam9g45_map_io(void)  static void __init at91sam9g45_ioremap_registers(void)  {  	at91_ioremap_shdwc(AT91SAM9G45_BASE_SHDWC); +	at91_ioremap_rstc(AT91SAM9G45_BASE_RSTC);  	at91sam926x_ioremap_pit(AT91SAM9G45_BASE_PIT);  	at91sam9_ioremap_smc(0, AT91SAM9G45_BASE_SMC);  } diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index b7582dd10dc..96e2adcd5a8 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c @@ -38,10 +38,6 @@  #if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)  static u64 hdmac_dmamask = DMA_BIT_MASK(32); -static struct at_dma_platform_data atdma_pdata = { -	.nr_channels	= 8, -}; -  static struct resource hdmac_resources[] = {  	[0] = {  		.start	= AT91SAM9G45_BASE_DMA, @@ -56,12 +52,11 @@ static struct resource hdmac_resources[] = {  };  static struct platform_device at_hdmac_device = { -	.name		= "at_hdmac", +	.name		= "at91sam9g45_dma",  	.id		= -1,  	.dev		= {  				.dma_mask		= &hdmac_dmamask,  				.coherent_dma_mask	= DMA_BIT_MASK(32), -				.platform_data		= &atdma_pdata,  	},  	.resource	= hdmac_resources,  	.num_resources	= ARRAY_SIZE(hdmac_resources), @@ -69,9 +64,15 @@ static struct platform_device at_hdmac_device = {  void __init at91_add_device_hdmac(void)  { -	dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask); -	dma_cap_set(DMA_SLAVE, atdma_pdata.cap_mask); -	platform_device_register(&at_hdmac_device); +#if defined(CONFIG_OF) +	struct device_node *of_node = +		of_find_node_by_name(NULL, "dma-controller"); + +	if (of_node) +		of_node_put(of_node); +	else +#endif +		platform_device_register(&at_hdmac_device);  }  #else  void __init at91_add_device_hdmac(void) {} diff --git a/arch/arm/mach-at91/at91sam9g45_reset.S b/arch/arm/mach-at91/at91sam9g45_reset.S new file mode 100644 index 00000000000..0468be10980 --- /dev/null +++ b/arch/arm/mach-at91/at91sam9g45_reset.S @@ -0,0 +1,40 @@ +/* + * reset AT91SAM9G45 as per errata + * + * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcosoft.com> + * + * unless the SDRAM is cleanly shutdown before we hit the + * reset register it can be left driving the data bus and + * killing the chance of a subsequent boot from NAND + * + * GPLv2 Only + */ + +#include <linux/linkage.h> +#include <mach/hardware.h> +#include <mach/at91sam9_ddrsdr.h> +#include <mach/at91_rstc.h> + +			.arm + +			.globl	at91sam9g45_restart + +at91sam9g45_restart: +			ldr	r0, .at91_va_base_sdramc0	@ preload constants +			ldr	r1, =at91_rstc_base +			ldr	r1, [r1] + +			mov	r2, #1 +			mov	r3, #AT91_DDRSDRC_LPCB_POWER_DOWN +			ldr	r4, =AT91_RSTC_KEY | AT91_RSTC_PERRST | AT91_RSTC_PROCRST + +			.balign	32				@ align to cache line + +			str	r2, [r0, #AT91_DDRSDRC_RTR]	@ disable DDR0 access +			str	r3, [r0, #AT91_DDRSDRC_LPR]	@ power down DDR0 +			str	r4, [r1, #AT91_RSTC_CR]		@ reset processor + +			b	. + +.at91_va_base_sdramc0: +	.word AT91_VA_BASE_SYS + AT91_DDRSDRC0 diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index d6bcb1da11d..d2c91a841cb 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c @@ -286,6 +286,7 @@ static void __init at91sam9rl_map_io(void)  static void __init at91sam9rl_ioremap_registers(void)  {  	at91_ioremap_shdwc(AT91SAM9RL_BASE_SHDWC); +	at91_ioremap_rstc(AT91SAM9RL_BASE_RSTC);  	at91sam926x_ioremap_pit(AT91SAM9RL_BASE_PIT);  	at91sam9_ioremap_smc(0, AT91SAM9RL_BASE_SMC);  } diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index 61908dce978..9be71c11d0f 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c @@ -33,10 +33,6 @@  #if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)  static u64 hdmac_dmamask = DMA_BIT_MASK(32); -static struct at_dma_platform_data atdma_pdata = { -	.nr_channels	= 2, -}; -  static struct resource hdmac_resources[] = {  	[0] = {  		.start	= AT91SAM9RL_BASE_DMA, @@ -51,12 +47,11 @@ static struct resource hdmac_resources[] = {  };  static struct platform_device at_hdmac_device = { -	.name		= "at_hdmac", +	.name		= "at91sam9rl_dma",  	.id		= -1,  	.dev		= {  				.dma_mask		= &hdmac_dmamask,  				.coherent_dma_mask	= DMA_BIT_MASK(32), -				.platform_data		= &atdma_pdata,  	},  	.resource	= hdmac_resources,  	.num_resources	= ARRAY_SIZE(hdmac_resources), @@ -64,7 +59,6 @@ static struct platform_device at_hdmac_device = {  void __init at91_add_device_hdmac(void)  { -	dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);  	platform_device_register(&at_hdmac_device);  }  #else diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index 4866b8180d6..594133451c0 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h @@ -58,7 +58,9 @@ extern void at91_irq_suspend(void);  extern void at91_irq_resume(void);  /* reset */ +extern void at91_ioremap_rstc(u32 base_addr);  extern void at91sam9_alt_restart(char, const char *); +extern void at91sam9g45_restart(char, const char *);  /* shutdown */  extern void at91_ioremap_shdwc(u32 base_addr); diff --git a/arch/arm/mach-at91/include/mach/at91_rstc.h b/arch/arm/mach-at91/include/mach/at91_rstc.h index cbd2bf052c1..875fa336800 100644 --- a/arch/arm/mach-at91/include/mach/at91_rstc.h +++ b/arch/arm/mach-at91/include/mach/at91_rstc.h @@ -16,13 +16,25 @@  #ifndef AT91_RSTC_H  #define AT91_RSTC_H -#define AT91_RSTC_CR		(AT91_RSTC + 0x00)	/* Reset Controller Control Register */ +#ifndef __ASSEMBLY__ +extern void __iomem *at91_rstc_base; + +#define at91_rstc_read(field) \ +	__raw_readl(at91_rstc_base + field) + +#define at91_rstc_write(field, value) \ +	__raw_writel(value, at91_rstc_base + field); +#else +.extern at91_rstc_base +#endif + +#define AT91_RSTC_CR		0x00			/* Reset Controller Control Register */  #define		AT91_RSTC_PROCRST	(1 << 0)		/* Processor Reset */  #define		AT91_RSTC_PERRST	(1 << 2)		/* Peripheral Reset */  #define		AT91_RSTC_EXTRST	(1 << 3)		/* External Reset */  #define		AT91_RSTC_KEY		(0xa5 << 24)		/* KEY Password */ -#define AT91_RSTC_SR		(AT91_RSTC + 0x04)	/* Reset Controller Status Register */ +#define AT91_RSTC_SR		0x04			/* Reset Controller Status Register */  #define		AT91_RSTC_URSTS		(1 << 0)		/* User Reset Status */  #define		AT91_RSTC_RSTTYP	(7 << 8)		/* Reset Type */  #define			AT91_RSTC_RSTTYP_GENERAL	(0 << 8) @@ -33,7 +45,7 @@  #define		AT91_RSTC_NRSTL		(1 << 16)		/* NRST Pin Level */  #define		AT91_RSTC_SRCMP		(1 << 17)		/* Software Reset Command in Progress */ -#define AT91_RSTC_MR		(AT91_RSTC + 0x08)	/* Reset Controller Mode Register */ +#define AT91_RSTC_MR		0x08			/* Reset Controller Mode Register */  #define		AT91_RSTC_URSTEN	(1 << 0)		/* User Reset Enable */  #define		AT91_RSTC_URSTIEN	(1 << 4)		/* User Reset Interrupt Enable */  #define		AT91_RSTC_ERSTL		(0xf << 8)		/* External Reset Length */ diff --git a/arch/arm/mach-at91/include/mach/at91cap9.h b/arch/arm/mach-at91/include/mach/at91cap9.h index 4c0e2f6011d..61d952902f2 100644 --- a/arch/arm/mach-at91/include/mach/at91cap9.h +++ b/arch/arm/mach-at91/include/mach/at91cap9.h @@ -83,7 +83,6 @@  #define AT91_DDRSDRC0	(0xffffe600 - AT91_BASE_SYS)  #define AT91_MATRIX	(0xffffea00 - AT91_BASE_SYS)  #define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) -#define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS)  #define AT91_GPBR	(cpu_is_at91cap9_revB() ?	\  			(0xfffffd50 - AT91_BASE_SYS) :	\  			(0xfffffd60 - AT91_BASE_SYS)) @@ -96,6 +95,7 @@  #define AT91CAP9_BASE_PIOB	0xfffff400  #define AT91CAP9_BASE_PIOC	0xfffff600  #define AT91CAP9_BASE_PIOD	0xfffff800 +#define AT91CAP9_BASE_RSTC	0xfffffd00  #define AT91CAP9_BASE_SHDWC	0xfffffd10  #define AT91CAP9_BASE_RTT	0xfffffd20  #define AT91CAP9_BASE_PIT	0xfffffd30 diff --git a/arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h b/arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h deleted file mode 100644 index 976f4a6c335..00000000000 --- a/arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * arch/arm/mach-at91/include/mach/at91cap9_ddrsdr.h - * - *  (C) 2008 Andrew Victor - * - * DDR/SDR Controller (DDRSDRC) - System peripherals registers. - * Based on AT91CAP9 datasheet revision B. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#ifndef AT91CAP9_DDRSDR_H -#define AT91CAP9_DDRSDR_H - -#define AT91_DDRSDRC_MR		0x00	/* Mode Register */ -#define		AT91_DDRSDRC_MODE	(0xf << 0)		/* Command Mode */ -#define			AT91_DDRSDRC_MODE_NORMAL		0 -#define			AT91_DDRSDRC_MODE_NOP		1 -#define			AT91_DDRSDRC_MODE_PRECHARGE	2 -#define			AT91_DDRSDRC_MODE_LMR		3 -#define			AT91_DDRSDRC_MODE_REFRESH	4 -#define			AT91_DDRSDRC_MODE_EXT_LMR	5 -#define			AT91_DDRSDRC_MODE_DEEP		6 - -#define AT91_DDRSDRC_RTR	0x04	/* Refresh Timer Register */ -#define		AT91_DDRSDRC_COUNT	(0xfff << 0)		/* Refresh Timer Counter */ - -#define AT91_DDRSDRC_CR		0x08	/* Configuration Register */ -#define		AT91_DDRSDRC_NC		(3 << 0)		/* Number of Column Bits */ -#define			AT91_DDRSDRC_NC_SDR8	(0 << 0) -#define			AT91_DDRSDRC_NC_SDR9	(1 << 0) -#define			AT91_DDRSDRC_NC_SDR10	(2 << 0) -#define			AT91_DDRSDRC_NC_SDR11	(3 << 0) -#define			AT91_DDRSDRC_NC_DDR9	(0 << 0) -#define			AT91_DDRSDRC_NC_DDR10	(1 << 0) -#define			AT91_DDRSDRC_NC_DDR11	(2 << 0) -#define			AT91_DDRSDRC_NC_DDR12	(3 << 0) -#define		AT91_DDRSDRC_NR		(3 << 2)		/* Number of Row Bits */ -#define			AT91_DDRSDRC_NR_11	(0 << 2) -#define			AT91_DDRSDRC_NR_12	(1 << 2) -#define			AT91_DDRSDRC_NR_13	(2 << 2) -#define		AT91_DDRSDRC_CAS	(7 << 4)		/* CAS Latency */ -#define			AT91_DDRSDRC_CAS_2	(2 << 4) -#define			AT91_DDRSDRC_CAS_3	(3 << 4) -#define			AT91_DDRSDRC_CAS_25	(6 << 4) -#define		AT91_DDRSDRC_DLL	(1 << 7)		/* Reset DLL */ -#define		AT91_DDRSDRC_DICDS	(1 << 8)		/* Output impedance control */ - -#define AT91_DDRSDRC_T0PR	0x0C	/* Timing 0 Register */ -#define		AT91_DDRSDRC_TRAS	(0xf <<  0)		/* Active to Precharge delay */ -#define		AT91_DDRSDRC_TRCD	(0xf <<  4)		/* Row to Column delay */ -#define		AT91_DDRSDRC_TWR	(0xf <<  8)		/* Write recovery delay */ -#define		AT91_DDRSDRC_TRC	(0xf << 12)		/* Row cycle delay */ -#define		AT91_DDRSDRC_TRP	(0xf << 16)		/* Row precharge delay */ -#define		AT91_DDRSDRC_TRRD	(0xf << 20)		/* Active BankA to BankB */ -#define		AT91_DDRSDRC_TWTR	(1   << 24)		/* Internal Write to Read delay */ -#define		AT91_DDRSDRC_TMRD	(0xf << 28)		/* Load mode to active/refresh delay */ - -#define AT91_DDRSDRC_T1PR	0x10	/* Timing 1 Register */ -#define		AT91_DDRSDRC_TRFC	(0x1f << 0)		/* Row Cycle Delay */ -#define		AT91_DDRSDRC_TXSNR	(0xff << 8)		/* Exit self-refresh to non-read */ -#define		AT91_DDRSDRC_TXSRD	(0xff << 16)		/* Exit self-refresh to read */ -#define		AT91_DDRSDRC_TXP	(0xf  << 24)		/* Exit power-down delay */ - -#define AT91_DDRSDRC_LPR	0x18	/* Low Power Register */ -#define		AT91_DDRSDRC_LPCB		(3 << 0)	/* Low-power Configurations */ -#define			AT91_DDRSDRC_LPCB_DISABLE		0 -#define			AT91_DDRSDRC_LPCB_SELF_REFRESH		1 -#define			AT91_DDRSDRC_LPCB_POWER_DOWN		2 -#define			AT91_DDRSDRC_LPCB_DEEP_POWER_DOWN	3 -#define		AT91_DDRSDRC_CLKFR		(1 << 2)	/* Clock Frozen */ -#define		AT91_DDRSDRC_PASR		(7 << 4)	/* Partial Array Self Refresh */ -#define		AT91_DDRSDRC_TCSR		(3 << 8)	/* Temperature Compensated Self Refresh */ -#define		AT91_DDRSDRC_DS			(3 << 10)	/* Drive Strength */ -#define		AT91_DDRSDRC_TIMEOUT		(3 << 12)	/* Time to define when Low Power Mode is enabled */ -#define			AT91_DDRSDRC_TIMEOUT_0_CLK_CYCLES	(0 << 12) -#define			AT91_DDRSDRC_TIMEOUT_64_CLK_CYCLES	(1 << 12) -#define			AT91_DDRSDRC_TIMEOUT_128_CLK_CYCLES	(2 << 12) - -#define AT91_DDRSDRC_MDR	0x1C	/* Memory Device Register */ -#define		AT91_DDRSDRC_MD		(3 << 0)		/* Memory Device Type */ -#define			AT91_DDRSDRC_MD_SDR		0 -#define			AT91_DDRSDRC_MD_LOW_POWER_SDR	1 -#define			AT91_DDRSDRC_MD_DDR		2 -#define			AT91_DDRSDRC_MD_LOW_POWER_DDR	3 - -#define AT91_DDRSDRC_DLLR	0x20	/* DLL Information Register */ -#define		AT91_DDRSDRC_MDINC	(1 << 0)		/* Master Delay increment */ -#define		AT91_DDRSDRC_MDDEC	(1 << 1)		/* Master Delay decrement */ -#define		AT91_DDRSDRC_MDOVF	(1 << 2)		/* Master Delay Overflow */ -#define		AT91_DDRSDRC_SDCOVF	(1 << 3)		/* Slave Delay Correction Overflow */ -#define		AT91_DDRSDRC_SDCUDF	(1 << 4)		/* Slave Delay Correction Underflow */ -#define		AT91_DDRSDRC_SDERF	(1 << 5)		/* Slave Delay Correction error */ -#define		AT91_DDRSDRC_MDVAL	(0xff <<  8)		/* Master Delay value */ -#define		AT91_DDRSDRC_SDVAL	(0xff << 16)		/* Slave Delay value */ -#define		AT91_DDRSDRC_SDCVAL	(0xff << 24)		/* Slave Delay Correction value */ - -/* Register access macros */ -#define at91_ramc_read(num, reg) \ -	at91_sys_read(AT91_DDRSDRC##num + reg) -#define at91_ramc_write(num, reg, value) \ -	at91_sys_write(AT91_DDRSDRC##num + reg, value) - - -#endif diff --git a/arch/arm/mach-at91/include/mach/at91sam9260.h b/arch/arm/mach-at91/include/mach/at91sam9260.h index f937c476bb6..fa5ca278ade 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9260.h +++ b/arch/arm/mach-at91/include/mach/at91sam9260.h @@ -83,7 +83,6 @@  #define AT91_SDRAMC0	(0xffffea00 - AT91_BASE_SYS)  #define AT91_MATRIX	(0xffffee00 - AT91_BASE_SYS)  #define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) -#define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS)  #define AT91_GPBR	(0xfffffd50 - AT91_BASE_SYS)  #define AT91SAM9260_BASE_ECC	0xffffe800 @@ -92,6 +91,7 @@  #define AT91SAM9260_BASE_PIOA	0xfffff400  #define AT91SAM9260_BASE_PIOB	0xfffff600  #define AT91SAM9260_BASE_PIOC	0xfffff800 +#define AT91SAM9260_BASE_RSTC	0xfffffd00  #define AT91SAM9260_BASE_SHDWC	0xfffffd10  #define AT91SAM9260_BASE_RTT	0xfffffd20  #define AT91SAM9260_BASE_PIT	0xfffffd30 diff --git a/arch/arm/mach-at91/include/mach/at91sam9261.h b/arch/arm/mach-at91/include/mach/at91sam9261.h index 175604e261b..7cde2d36570 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9261.h +++ b/arch/arm/mach-at91/include/mach/at91sam9261.h @@ -68,7 +68,6 @@  #define AT91_SDRAMC0	(0xffffea00 - AT91_BASE_SYS)  #define AT91_MATRIX	(0xffffee00 - AT91_BASE_SYS)  #define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) -#define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS)  #define AT91_GPBR	(0xfffffd50 - AT91_BASE_SYS)  #define AT91SAM9261_BASE_SMC	0xffffec00 @@ -76,6 +75,7 @@  #define AT91SAM9261_BASE_PIOA	0xfffff400  #define AT91SAM9261_BASE_PIOB	0xfffff600  #define AT91SAM9261_BASE_PIOC	0xfffff800 +#define AT91SAM9261_BASE_RSTC	0xfffffd00  #define AT91SAM9261_BASE_SHDWC	0xfffffd10  #define AT91SAM9261_BASE_RTT	0xfffffd20  #define AT91SAM9261_BASE_PIT	0xfffffd30 diff --git a/arch/arm/mach-at91/include/mach/at91sam9263.h b/arch/arm/mach-at91/include/mach/at91sam9263.h index 80c915002d8..5949abda962 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9263.h +++ b/arch/arm/mach-at91/include/mach/at91sam9263.h @@ -78,7 +78,6 @@  #define AT91_SDRAMC1	(0xffffe800 - AT91_BASE_SYS)  #define AT91_MATRIX	(0xffffec00 - AT91_BASE_SYS)  #define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) -#define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS)  #define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS)  #define AT91SAM9263_BASE_ECC0	0xffffe000 @@ -91,6 +90,7 @@  #define AT91SAM9263_BASE_PIOC	0xfffff600  #define AT91SAM9263_BASE_PIOD	0xfffff800  #define AT91SAM9263_BASE_PIOE	0xfffffa00 +#define AT91SAM9263_BASE_RSTC	0xfffffd00  #define AT91SAM9263_BASE_SHDWC	0xfffffd10  #define AT91SAM9263_BASE_RTT0	0xfffffd20  #define AT91SAM9263_BASE_PIT	0xfffffd30 diff --git a/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h b/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h index d27b15ba8eb..e2f8da8ce5b 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h +++ b/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h @@ -46,10 +46,10 @@  #define			AT91_DDRSDRC_CAS_25	(6 << 4)  #define		AT91_DDRSDRC_RST_DLL	(1 << 7)		/* Reset DLL */  #define		AT91_DDRSDRC_DICDS	(1 << 8)		/* Output impedance control */ -#define		AT91_DDRSDRC_DIS_DLL	(1 << 9)		/* Disable DLL */ -#define		AT91_DDRSDRC_OCD	(1 << 12)		/* Off-Chip Driver */ -#define		AT91_DDRSDRC_DQMS	(1 << 16)		/* Mask Data is Shared */ -#define		AT91_DDRSDRC_ACTBST	(1 << 18)		/* Active Bank X to Burst Stop Read Access Bank Y */ +#define		AT91_DDRSDRC_DIS_DLL	(1 << 9)		/* Disable DLL [SAM9 Only] */ +#define		AT91_DDRSDRC_OCD	(1 << 12)		/* Off-Chip Driver [SAM9 Only] */ +#define		AT91_DDRSDRC_DQMS	(1 << 16)		/* Mask Data is Shared [SAM9 Only] */ +#define		AT91_DDRSDRC_ACTBST	(1 << 18)		/* Active Bank X to Burst Stop Read Access Bank Y [SAM9 Only] */  #define AT91_DDRSDRC_T0PR	0x0C	/* Timing 0 Register */  #define		AT91_DDRSDRC_TRAS	(0xf <<  0)		/* Active to Precharge delay */ @@ -59,7 +59,8 @@  #define		AT91_DDRSDRC_TRP	(0xf << 16)		/* Row precharge delay */  #define		AT91_DDRSDRC_TRRD	(0xf << 20)		/* Active BankA to BankB */  #define		AT91_DDRSDRC_TWTR	(0x7 << 24)		/* Internal Write to Read delay */ -#define		AT91_DDRSDRC_RED_WRRD	(0x1 << 27)		/* Reduce Write to Read Delay */ +#define		AT91CAP9_DDRSDRC_TWTR	(1   << 24)		/* Internal Write to Read delay */ +#define		AT91_DDRSDRC_RED_WRRD	(0x1 << 27)		/* Reduce Write to Read Delay [SAM9 Only] */  #define		AT91_DDRSDRC_TMRD	(0xf << 28)		/* Load mode to active/refresh delay */  #define AT91_DDRSDRC_T1PR	0x10	/* Timing 1 Register */ @@ -68,13 +69,14 @@  #define		AT91_DDRSDRC_TXSRD	(0xff << 16)		/* Exit self-refresh to read */  #define		AT91_DDRSDRC_TXP	(0xf  << 24)		/* Exit power-down delay */ -#define AT91_DDRSDRC_T2PR	0x14	/* Timing 2 Register */ +#define AT91_DDRSDRC_T2PR	0x14	/* Timing 2 Register [SAM9 Only] */  #define		AT91_DDRSDRC_TXARD	(0xf  << 0)		/* Exit active power down delay to read command in mode "Fast Exit" */  #define		AT91_DDRSDRC_TXARDS	(0xf  << 4)		/* Exit active power down delay to read command in mode "Slow Exit" */  #define		AT91_DDRSDRC_TRPA	(0xf  << 8)		/* Row Precharge All delay */  #define		AT91_DDRSDRC_TRTP	(0x7  << 12)		/* Read to Precharge delay */  #define AT91_DDRSDRC_LPR	0x1C	/* Low Power Register */ +#define AT91CAP9_DDRSDRC_LPR	0x18	/* Low Power Register */  #define		AT91_DDRSDRC_LPCB	(3 << 0)		/* Low-power Configurations */  #define			AT91_DDRSDRC_LPCB_DISABLE		0  #define			AT91_DDRSDRC_LPCB_SELF_REFRESH		1 @@ -92,32 +94,40 @@  #define		AT91_DDRSDRC_UPD_MR	(3 << 20)	 /* Update load mode register and extended mode register */  #define AT91_DDRSDRC_MDR	0x20	/* Memory Device Register */ +#define AT91CAP9_DDRSDRC_MDR	0x1C	/* Memory Device Register */  #define		AT91_DDRSDRC_MD		(3 << 0)		/* Memory Device Type */  #define			AT91_DDRSDRC_MD_SDR		0  #define			AT91_DDRSDRC_MD_LOW_POWER_SDR	1 +#define			AT91CAP9_DDRSDRC_MD_DDR		2  #define			AT91_DDRSDRC_MD_LOW_POWER_DDR	3 -#define			AT91_DDRSDRC_MD_DDR2		6 +#define			AT91_DDRSDRC_MD_DDR2		6	/* [SAM9 Only] */  #define		AT91_DDRSDRC_DBW	(1 << 4)		/* Data Bus Width */  #define			AT91_DDRSDRC_DBW_32BITS		(0 <<  4)  #define			AT91_DDRSDRC_DBW_16BITS		(1 <<  4)  #define AT91_DDRSDRC_DLL	0x24	/* DLL Information Register */ +#define AT91CAP9_DDRSDRC_DLL	0x20	/* DLL Information Register */  #define		AT91_DDRSDRC_MDINC	(1 << 0)		/* Master Delay increment */  #define		AT91_DDRSDRC_MDDEC	(1 << 1)		/* Master Delay decrement */  #define		AT91_DDRSDRC_MDOVF	(1 << 2)		/* Master Delay Overflow */ +#define		AT91CAP9_DDRSDRC_SDCOVF	(1 << 3)		/* Slave Delay Correction Overflow */ +#define		AT91CAP9_DDRSDRC_SDCUDF	(1 << 4)		/* Slave Delay Correction Underflow */ +#define		AT91CAP9_DDRSDRC_SDERF	(1 << 5)		/* Slave Delay Correction error */  #define		AT91_DDRSDRC_MDVAL	(0xff <<  8)		/* Master Delay value */ +#define		AT91CAP9_DDRSDRC_SDVAL	(0xff << 16)		/* Slave Delay value */ +#define		AT91CAP9_DDRSDRC_SDCVAL	(0xff << 24)		/* Slave Delay Correction value */ -#define AT91_DDRSDRC_HS		0x2C	/* High Speed Register */ +#define AT91_DDRSDRC_HS		0x2C	/* High Speed Register [SAM9 Only] */  #define		AT91_DDRSDRC_DIS_ATCP_RD	(1 << 2)	/* Anticip read access is disabled */  #define AT91_DDRSDRC_DELAY(n)	(0x30 + (0x4 * (n)))	/* Delay I/O Register n */ -#define AT91_DDRSDRC_WPMR	0xE4	/* Write Protect Mode Register */ +#define AT91_DDRSDRC_WPMR	0xE4	/* Write Protect Mode Register [SAM9 Only] */  #define		AT91_DDRSDRC_WP		(1 << 0)		/* Write protect enable */  #define		AT91_DDRSDRC_WPKEY	(0xffffff << 8)		/* Write protect key */  #define		AT91_DDRSDRC_KEY	(0x444452 << 8)		/* Write protect key = "DDR" */ -#define AT91_DDRSDRC_WPSR	0xE8	/* Write Protect Status Register */ +#define AT91_DDRSDRC_WPSR	0xE8	/* Write Protect Status Register [SAM9 Only] */  #define		AT91_DDRSDRC_WPVS	(1 << 0)		/* Write protect violation status */  #define		AT91_DDRSDRC_WPVSRC	(0xffff << 8)		/* Write protect violation source */ diff --git a/arch/arm/mach-at91/include/mach/at91sam9_smc.h b/arch/arm/mach-at91/include/mach/at91sam9_smc.h index eb18a70fa64..175e1fdd9fe 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9_smc.h +++ b/arch/arm/mach-at91/include/mach/at91sam9_smc.h @@ -18,6 +18,35 @@  #include <mach/cpu.h> +#ifndef __ASSEMBLY__ +struct sam9_smc_config { +	/* Setup register */ +	u8 ncs_read_setup; +	u8 nrd_setup; +	u8 ncs_write_setup; +	u8 nwe_setup; + +	/* Pulse register */ +	u8 ncs_read_pulse; +	u8 nrd_pulse; +	u8 ncs_write_pulse; +	u8 nwe_pulse; + +	/* Cycle register */ +	u16 read_cycle; +	u16 write_cycle; + +	/* Mode register */ +	u32 mode; +	u8 tdf_cycles:4; +}; + +extern void sam9_smc_configure(int id, int cs, struct sam9_smc_config *config); +extern void sam9_smc_read(int id, int cs, struct sam9_smc_config *config); +extern void sam9_smc_read_mode(int id, int cs, struct sam9_smc_config *config); +extern void sam9_smc_write_mode(int id, int cs, struct sam9_smc_config *config); +#endif +  #define AT91_SMC_SETUP		0x00				/* Setup Register for CS n */  #define		AT91_SMC_NWESETUP	(0x3f << 0)			/* NWE Setup Length */  #define			AT91_SMC_NWESETUP_(x)	((x) << 0) diff --git a/arch/arm/mach-at91/include/mach/at91sam9g45.h b/arch/arm/mach-at91/include/mach/at91sam9g45.h index f0c23c960de..dd9c95ea086 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9g45.h +++ b/arch/arm/mach-at91/include/mach/at91sam9g45.h @@ -90,7 +90,6 @@  #define AT91_DDRSDRC0	(0xffffe600 - AT91_BASE_SYS)  #define AT91_MATRIX	(0xffffea00 - AT91_BASE_SYS)  #define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) -#define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS)  #define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS)  #define AT91SAM9G45_BASE_ECC	0xffffe200 @@ -102,6 +101,7 @@  #define AT91SAM9G45_BASE_PIOC	0xfffff600  #define AT91SAM9G45_BASE_PIOD	0xfffff800  #define AT91SAM9G45_BASE_PIOE	0xfffffa00 +#define AT91SAM9G45_BASE_RSTC	0xfffffd00  #define AT91SAM9G45_BASE_SHDWC	0xfffffd10  #define AT91SAM9G45_BASE_RTT	0xfffffd20  #define AT91SAM9G45_BASE_PIT	0xfffffd30 diff --git a/arch/arm/mach-at91/include/mach/at91sam9rl.h b/arch/arm/mach-at91/include/mach/at91sam9rl.h index 2bb359e60b9..d7bead7118d 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9rl.h +++ b/arch/arm/mach-at91/include/mach/at91sam9rl.h @@ -72,7 +72,6 @@  #define AT91_SDRAMC0	(0xffffea00 - AT91_BASE_SYS)  #define AT91_MATRIX	(0xffffee00 - AT91_BASE_SYS)  #define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) -#define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS)  #define AT91_SCKCR	(0xfffffd50 - AT91_BASE_SYS)  #define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS) @@ -84,6 +83,7 @@  #define AT91SAM9RL_BASE_PIOB	0xfffff600  #define AT91SAM9RL_BASE_PIOC	0xfffff800  #define AT91SAM9RL_BASE_PIOD	0xfffffa00 +#define AT91SAM9RL_BASE_RSTC	0xfffffd00  #define AT91SAM9RL_BASE_SHDWC	0xfffffd10  #define AT91SAM9RL_BASE_RTT	0xfffffd20  #define AT91SAM9RL_BASE_PIT	0xfffffd30 diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index d0b377b21bd..3b33f07b1e1 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h @@ -88,7 +88,7 @@ extern void __init at91_add_device_eth(struct macb_platform_data *data);  struct at91_usbh_data {  	u8		ports;		/* number of ports on root hub */  	int		vbus_pin[2];	/* port power-control pin */ -	u8              vbus_pin_inverted; +	u8              vbus_pin_active_low[2];  	u8              overcurrent_supported;  	int             overcurrent_pin[2];  	u8              overcurrent_status[2]; diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 62ad95556c3..1606379ac28 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c @@ -34,7 +34,6 @@  /*   * Show the reason for the previous system reset.   */ -#if defined(AT91_RSTC)  #include <mach/at91_rstc.h>  #include <mach/at91_shdwc.h> @@ -58,10 +57,10 @@ static void __init show_reset_status(void)  	char *reason, *r2 = reset;  	u32 reset_type, wake_type; -	if (!at91_shdwc_base) +	if (!at91_shdwc_base || !at91_rstc_base)  		return; -	reset_type = at91_sys_read(AT91_RSTC_SR) & AT91_RSTC_RSTTYP; +	reset_type = at91_rstc_read(AT91_RSTC_SR) & AT91_RSTC_RSTTYP;  	wake_type = at91_shdwc_read(AT91_SHDW_SR);  	switch (reset_type) { @@ -102,10 +101,6 @@ static void __init show_reset_status(void)  	}  	pr_info("AT91: Starting after %s %s\n", reason, r2);  } -#else -static void __init show_reset_status(void) {} -#endif -  static int at91_pm_valid_state(suspend_state_t state)  { diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h index ce9a2069911..7eb40d24242 100644 --- a/arch/arm/mach-at91/pm.h +++ b/arch/arm/mach-at91/pm.h @@ -25,21 +25,21 @@ static inline u32 sdram_selfrefresh_enable(void)  								: : "r" (0))  #elif defined(CONFIG_ARCH_AT91CAP9) -#include <mach/at91cap9_ddrsdr.h> +#include <mach/at91sam9_ddrsdr.h>  static inline u32 sdram_selfrefresh_enable(void)  {  	u32 saved_lpr, lpr; -	saved_lpr = at91_ramc_read(0, AT91_DDRSDRC_LPR); +	saved_lpr = at91_ramc_read(0, AT91CAP9_DDRSDRC_LPR);  	lpr = saved_lpr & ~AT91_DDRSDRC_LPCB; -	at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr | AT91_DDRSDRC_LPCB_SELF_REFRESH); +	at91_ramc_write(0, AT91CAP9_DDRSDRC_LPR, lpr | AT91_DDRSDRC_LPCB_SELF_REFRESH);  	return saved_lpr;  } -#define sdram_selfrefresh_disable(saved_lpr)	at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr) +#define sdram_selfrefresh_disable(saved_lpr)	at91_ramc_write(0, AT91CAP9_DDRSDRC_LPR, saved_lpr)  #define wait_for_interrupt_enable()		cpu_do_idle()  #elif defined(CONFIG_ARCH_AT91SAM9G45) diff --git a/arch/arm/mach-at91/pm_slowclock.S b/arch/arm/mach-at91/pm_slowclock.S index f7922a43617..92dfb846139 100644 --- a/arch/arm/mach-at91/pm_slowclock.S +++ b/arch/arm/mach-at91/pm_slowclock.S @@ -18,9 +18,8 @@  #if defined(CONFIG_ARCH_AT91RM9200)  #include <mach/at91rm9200_mc.h> -#elif defined(CONFIG_ARCH_AT91CAP9) -#include <mach/at91cap9_ddrsdr.h> -#elif defined(CONFIG_ARCH_AT91SAM9G45) +#elif defined(CONFIG_ARCH_AT91CAP9) \ +	|| defined(CONFIG_ARCH_AT91SAM9G45)  #include <mach/at91sam9_ddrsdr.h>  #else  #include <mach/at91sam9_sdramc.h> diff --git a/arch/arm/mach-at91/sam9_smc.c b/arch/arm/mach-at91/sam9_smc.c index 8294783b679..99a0a1d2b7d 100644 --- a/arch/arm/mach-at91/sam9_smc.c +++ b/arch/arm/mach-at91/sam9_smc.c @@ -2,6 +2,7 @@   * linux/arch/arm/mach-at91/sam9_smc.c   *   * Copyright (C) 2008 Andrew Victor + * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License version 2 as @@ -22,7 +23,22 @@  static void __iomem *smc_base_addr[2]; -static void __init sam9_smc_cs_configure(void __iomem *base, struct sam9_smc_config* config) +static void sam9_smc_cs_write_mode(void __iomem *base, +					struct sam9_smc_config *config) +{ +	__raw_writel(config->mode +		   | AT91_SMC_TDF_(config->tdf_cycles), +		   base + AT91_SMC_MODE); +} + +void sam9_smc_write_mode(int id, int cs, +					struct sam9_smc_config *config) +{ +	sam9_smc_cs_write_mode(AT91_SMC_CS(id, cs), config); +} + +static void sam9_smc_cs_configure(void __iomem *base, +					struct sam9_smc_config *config)  {  	/* Setup register */ @@ -45,16 +61,66 @@ static void __init sam9_smc_cs_configure(void __iomem *base, struct sam9_smc_con  		   base + AT91_SMC_CYCLE);  	/* Mode register */ -	__raw_writel(config->mode -		   | AT91_SMC_TDF_(config->tdf_cycles), -		   base + AT91_SMC_MODE); +	sam9_smc_cs_write_mode(base, config);  } -void __init sam9_smc_configure(int id, int cs, struct sam9_smc_config* config) +void sam9_smc_configure(int id, int cs, +					struct sam9_smc_config *config)  {  	sam9_smc_cs_configure(AT91_SMC_CS(id, cs), config);  } +static void sam9_smc_cs_read_mode(void __iomem *base, +					struct sam9_smc_config *config) +{ +	u32 val = __raw_readl(base + AT91_SMC_MODE); + +	config->mode = (val & ~AT91_SMC_NWECYCLE); +	config->tdf_cycles = (val & AT91_SMC_NWECYCLE) >> 16 ; +} + +void sam9_smc_read_mode(int id, int cs, +					struct sam9_smc_config *config) +{ +	sam9_smc_cs_read_mode(AT91_SMC_CS(id, cs), config); +} + +static void sam9_smc_cs_read(void __iomem *base, +					struct sam9_smc_config *config) +{ +	u32 val; + +	/* Setup register */ +	val = __raw_readl(base + AT91_SMC_SETUP); + +	config->nwe_setup = val & AT91_SMC_NWESETUP; +	config->ncs_write_setup = (val & AT91_SMC_NCS_WRSETUP) >> 8; +	config->nrd_setup = (val & AT91_SMC_NRDSETUP) >> 16; +	config->ncs_read_setup = (val & AT91_SMC_NCS_RDSETUP) >> 24; + +	/* Pulse register */ +	val = __raw_readl(base + AT91_SMC_PULSE); + +	config->nwe_setup = val & AT91_SMC_NWEPULSE; +	config->ncs_write_pulse = (val & AT91_SMC_NCS_WRPULSE) >> 8; +	config->nrd_pulse = (val & AT91_SMC_NRDPULSE) >> 16; +	config->ncs_read_pulse = (val & AT91_SMC_NCS_RDPULSE) >> 24; + +	/* Cycle register */ +	val = __raw_readl(base + AT91_SMC_CYCLE); + +	config->write_cycle = val & AT91_SMC_NWECYCLE; +	config->read_cycle = (val & AT91_SMC_NRDCYCLE) >> 16; + +	/* Mode register */ +	sam9_smc_cs_read_mode(base, config); +} + +void sam9_smc_read(int id, int cs, struct sam9_smc_config *config) +{ +	sam9_smc_cs_read(AT91_SMC_CS(id, cs), config); +} +  void __init at91sam9_ioremap_smc(int id, u32 addr)  {  	if (id > 1) { diff --git a/arch/arm/mach-at91/sam9_smc.h b/arch/arm/mach-at91/sam9_smc.h index 039c5ce17ae..3e52dcd4a59 100644 --- a/arch/arm/mach-at91/sam9_smc.h +++ b/arch/arm/mach-at91/sam9_smc.h @@ -8,27 +8,4 @@   * published by the Free Software Foundation.   */ -struct sam9_smc_config { -	/* Setup register */ -	u8 ncs_read_setup; -	u8 nrd_setup; -	u8 ncs_write_setup; -	u8 nwe_setup; - -	/* Pulse register */ -	u8 ncs_read_pulse; -	u8 nrd_pulse; -	u8 ncs_write_pulse; -	u8 nwe_pulse; - -	/* Cycle register */ -	u16 read_cycle; -	u16 write_cycle; - -	/* Mode register */ -	u32 mode; -	u8 tdf_cycles:4; -}; - -extern void __init sam9_smc_configure(int id, int cs, struct sam9_smc_config* config);  extern void __init at91sam9_ioremap_smc(int id, u32 addr); diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c index 8bdcc3cb601..69d3fc4c46f 100644 --- a/arch/arm/mach-at91/setup.c +++ b/arch/arm/mach-at91/setup.c @@ -29,9 +29,12 @@ EXPORT_SYMBOL(at91_soc_initdata);  void __init at91rm9200_set_type(int type)  {  	if (type == ARCH_REVISON_9200_PQFP) -		at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA; -	else  		at91_soc_initdata.subtype = AT91_SOC_RM9200_PQFP; +	else +		at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA; + +	pr_info("AT91: filled in soc subtype: %s\n", +		at91_get_soc_subtype(&at91_soc_initdata));  }  void __init at91_init_irq_default(void) @@ -281,6 +284,15 @@ void __init at91_ioremap_shdwc(u32 base_addr)  	pm_power_off = at91sam9_poweroff;  } +void __iomem *at91_rstc_base; + +void __init at91_ioremap_rstc(u32 base_addr) +{ +	at91_rstc_base = ioremap(base_addr, 16); +	if (!at91_rstc_base) +		panic("Impossible to ioremap at91_rstc_base\n"); +} +  void __init at91_initialize(unsigned long main_clock)  {  	at91_boot_soc.ioremap_registers(); diff --git a/arch/arm/mach-bcmring/arch.c b/arch/arm/mach-bcmring/arch.c index 9e5e7552498..45c97b1ee9b 100644 --- a/arch/arm/mach-bcmring/arch.c +++ b/arch/arm/mach-bcmring/arch.c @@ -194,6 +194,6 @@ MACHINE_START(BCMRING, "BCMRING")  	.init_early = bcmring_init_early,  	.init_irq = bcmring_init_irq,  	.timer = &bcmring_timer, -	.init_machine = bcmring_init_machine +	.init_machine = bcmring_init_machine,  	.restart = bcmring_restart,  MACHINE_END diff --git a/arch/arm/mach-bcmring/dma.c b/arch/arm/mach-bcmring/dma.c index 1a1a27dd565..1024396797e 100644 --- a/arch/arm/mach-bcmring/dma.c +++ b/arch/arm/mach-bcmring/dma.c @@ -33,17 +33,11 @@  #include <mach/timer.h> -#include <linux/mm.h>  #include <linux/pfn.h>  #include <linux/atomic.h>  #include <linux/sched.h>  #include <mach/dma.h> -/* I don't quite understand why dc4 fails when this is set to 1 and DMA is enabled */ -/* especially since dc4 doesn't use kmalloc'd memory. */ - -#define ALLOW_MAP_OF_KMALLOC_MEMORY 0 -  /* ---- Public Variables ------------------------------------------------- */  /* ---- Private Constants and Types -------------------------------------- */ @@ -53,24 +47,12 @@  #define CONTROLLER_FROM_HANDLE(handle)    (((handle) >> 4) & 0x0f)  #define CHANNEL_FROM_HANDLE(handle)       ((handle) & 0x0f) -#define DMA_MAP_DEBUG   0 - -#if DMA_MAP_DEBUG -#   define  DMA_MAP_PRINT(fmt, args...)   printk("%s: " fmt, __func__,  ## args) -#else -#   define  DMA_MAP_PRINT(fmt, args...) -#endif  /* ---- Private Variables ------------------------------------------------ */  static DMA_Global_t gDMA;  static struct proc_dir_entry *gDmaDir; -static atomic_t gDmaStatMemTypeKmalloc = ATOMIC_INIT(0); -static atomic_t gDmaStatMemTypeVmalloc = ATOMIC_INIT(0); -static atomic_t gDmaStatMemTypeUser = ATOMIC_INIT(0); -static atomic_t gDmaStatMemTypeCoherent = ATOMIC_INIT(0); -  #include "dma_device.c"  /* ---- Private Function Prototypes -------------------------------------- */ @@ -79,34 +61,6 @@ static atomic_t gDmaStatMemTypeCoherent = ATOMIC_INIT(0);  /****************************************************************************/  /** -*   Displays information for /proc/dma/mem-type -*/ -/****************************************************************************/ - -static int dma_proc_read_mem_type(char *buf, char **start, off_t offset, -				  int count, int *eof, void *data) -{ -	int len = 0; - -	len += sprintf(buf + len, "dma_map_mem statistics\n"); -	len += -	    sprintf(buf + len, "coherent: %d\n", -		    atomic_read(&gDmaStatMemTypeCoherent)); -	len += -	    sprintf(buf + len, "kmalloc:  %d\n", -		    atomic_read(&gDmaStatMemTypeKmalloc)); -	len += -	    sprintf(buf + len, "vmalloc:  %d\n", -		    atomic_read(&gDmaStatMemTypeVmalloc)); -	len += -	    sprintf(buf + len, "user:     %d\n", -		    atomic_read(&gDmaStatMemTypeUser)); - -	return len; -} - -/****************************************************************************/ -/**  *   Displays information for /proc/dma/channels  */  /****************************************************************************/ @@ -846,8 +800,6 @@ int dma_init(void)  				       dma_proc_read_channels, NULL);  		create_proc_read_entry("devices", 0, gDmaDir,  				       dma_proc_read_devices, NULL); -		create_proc_read_entry("mem-type", 0, gDmaDir, -				       dma_proc_read_mem_type, NULL);  	}  out: @@ -1565,767 +1517,3 @@ int dma_set_device_handler(DMA_Device_t dev,	/* Device to set the callback for.  }  EXPORT_SYMBOL(dma_set_device_handler); - -/****************************************************************************/ -/** -*   Initializes a memory mapping structure -*/ -/****************************************************************************/ - -int dma_init_mem_map(DMA_MemMap_t *memMap) -{ -	memset(memMap, 0, sizeof(*memMap)); - -	sema_init(&memMap->lock, 1); - -	return 0; -} - -EXPORT_SYMBOL(dma_init_mem_map); - -/****************************************************************************/ -/** -*   Releases any memory currently being held by a memory mapping structure. -*/ -/****************************************************************************/ - -int dma_term_mem_map(DMA_MemMap_t *memMap) -{ -	down(&memMap->lock);	/* Just being paranoid */ - -	/* Free up any allocated memory */ - -	up(&memMap->lock); -	memset(memMap, 0, sizeof(*memMap)); - -	return 0; -} - -EXPORT_SYMBOL(dma_term_mem_map); - -/****************************************************************************/ -/** -*   Looks at a memory address and categorizes it. -* -*   @return One of the values from the DMA_MemType_t enumeration. -*/ -/****************************************************************************/ - -DMA_MemType_t dma_mem_type(void *addr) -{ -	unsigned long addrVal = (unsigned long)addr; - -	if (addrVal >= CONSISTENT_BASE) { -		/* NOTE: DMA virtual memory space starts at 0xFFxxxxxx */ - -		/* dma_alloc_xxx pages are physically and virtually contiguous */ - -		return DMA_MEM_TYPE_DMA; -	} - -	/* Technically, we could add one more classification. Addresses between VMALLOC_END */ -	/* and the beginning of the DMA virtual address could be considered to be I/O space. */ -	/* Right now, nobody cares about this particular classification, so we ignore it. */ - -	if (is_vmalloc_addr(addr)) { -		/* Address comes from the vmalloc'd region. Pages are virtually */ -		/* contiguous but NOT physically contiguous */ - -		return DMA_MEM_TYPE_VMALLOC; -	} - -	if (addrVal >= PAGE_OFFSET) { -		/* PAGE_OFFSET is typically 0xC0000000 */ - -		/* kmalloc'd pages are physically contiguous */ - -		return DMA_MEM_TYPE_KMALLOC; -	} - -	return DMA_MEM_TYPE_USER; -} - -EXPORT_SYMBOL(dma_mem_type); - -/****************************************************************************/ -/** -*   Looks at a memory address and determines if we support DMA'ing to/from -*   that type of memory. -* -*   @return boolean - -*               return value != 0 means dma supported -*               return value == 0 means dma not supported -*/ -/****************************************************************************/ - -int dma_mem_supports_dma(void *addr) -{ -	DMA_MemType_t memType = dma_mem_type(addr); - -	return (memType == DMA_MEM_TYPE_DMA) -#if ALLOW_MAP_OF_KMALLOC_MEMORY -	    || (memType == DMA_MEM_TYPE_KMALLOC) -#endif -	    || (memType == DMA_MEM_TYPE_USER); -} - -EXPORT_SYMBOL(dma_mem_supports_dma); - -/****************************************************************************/ -/** -*   Maps in a memory region such that it can be used for performing a DMA. -* -*   @return -*/ -/****************************************************************************/ - -int dma_map_start(DMA_MemMap_t *memMap,	/* Stores state information about the map */ -		  enum dma_data_direction dir	/* Direction that the mapping will be going */ -    ) { -	int rc; - -	down(&memMap->lock); - -	DMA_MAP_PRINT("memMap: %p\n", memMap); - -	if (memMap->inUse) { -		printk(KERN_ERR "%s: memory map %p is already being used\n", -		       __func__, memMap); -		rc = -EBUSY; -		goto out; -	} - -	memMap->inUse = 1; -	memMap->dir = dir; -	memMap->numRegionsUsed = 0; - -	rc = 0; - -out: - -	DMA_MAP_PRINT("returning %d", rc); - -	up(&memMap->lock); - -	return rc; -} - -EXPORT_SYMBOL(dma_map_start); - -/****************************************************************************/ -/** -*   Adds a segment of memory to a memory map. Each segment is both -*   physically and virtually contiguous. -* -*   @return     0 on success, error code otherwise. -*/ -/****************************************************************************/ - -static int dma_map_add_segment(DMA_MemMap_t *memMap,	/* Stores state information about the map */ -			       DMA_Region_t *region,	/* Region that the segment belongs to */ -			       void *virtAddr,	/* Virtual address of the segment being added */ -			       dma_addr_t physAddr,	/* Physical address of the segment being added */ -			       size_t numBytes	/* Number of bytes of the segment being added */ -    ) { -	DMA_Segment_t *segment; - -	DMA_MAP_PRINT("memMap:%p va:%p pa:0x%x #:%d\n", memMap, virtAddr, -		      physAddr, numBytes); - -	/* Sanity check */ - -	if (((unsigned long)virtAddr < (unsigned long)region->virtAddr) -	    || (((unsigned long)virtAddr + numBytes)) > -	    ((unsigned long)region->virtAddr + region->numBytes)) { -		printk(KERN_ERR -		       "%s: virtAddr %p is outside region @ %p len: %d\n", -		       __func__, virtAddr, region->virtAddr, region->numBytes); -		return -EINVAL; -	} - -	if (region->numSegmentsUsed > 0) { -		/* Check to see if this segment is physically contiguous with the previous one */ - -		segment = ®ion->segment[region->numSegmentsUsed - 1]; - -		if ((segment->physAddr + segment->numBytes) == physAddr) { -			/* It is - just add on to the end */ - -			DMA_MAP_PRINT("appending %d bytes to last segment\n", -				      numBytes); - -			segment->numBytes += numBytes; - -			return 0; -		} -	} - -	/* Reallocate to hold more segments, if required. */ - -	if (region->numSegmentsUsed >= region->numSegmentsAllocated) { -		DMA_Segment_t *newSegment; -		size_t oldSize = -		    region->numSegmentsAllocated * sizeof(*newSegment); -		int newAlloc = region->numSegmentsAllocated + 4; -		size_t newSize = newAlloc * sizeof(*newSegment); - -		newSegment = kmalloc(newSize, GFP_KERNEL); -		if (newSegment == NULL) { -			return -ENOMEM; -		} -		memcpy(newSegment, region->segment, oldSize); -		memset(&((uint8_t *) newSegment)[oldSize], 0, -		       newSize - oldSize); -		kfree(region->segment); - -		region->numSegmentsAllocated = newAlloc; -		region->segment = newSegment; -	} - -	segment = ®ion->segment[region->numSegmentsUsed]; -	region->numSegmentsUsed++; - -	segment->virtAddr = virtAddr; -	segment->physAddr = physAddr; -	segment->numBytes = numBytes; - -	DMA_MAP_PRINT("returning success\n"); - -	return 0; -} - -/****************************************************************************/ -/** -*   Adds a region of memory to a memory map. Each region is virtually -*   contiguous, but not necessarily physically contiguous. -* -*   @return     0 on success, error code otherwise. -*/ -/****************************************************************************/ - -int dma_map_add_region(DMA_MemMap_t *memMap,	/* Stores state information about the map */ -		       void *mem,	/* Virtual address that we want to get a map of */ -		       size_t numBytes	/* Number of bytes being mapped */ -    ) { -	unsigned long addr = (unsigned long)mem; -	unsigned int offset; -	int rc = 0; -	DMA_Region_t *region; -	dma_addr_t physAddr; - -	down(&memMap->lock); - -	DMA_MAP_PRINT("memMap:%p va:%p #:%d\n", memMap, mem, numBytes); - -	if (!memMap->inUse) { -		printk(KERN_ERR "%s: Make sure you call dma_map_start first\n", -		       __func__); -		rc = -EINVAL; -		goto out; -	} - -	/* Reallocate to hold more regions. */ - -	if (memMap->numRegionsUsed >= memMap->numRegionsAllocated) { -		DMA_Region_t *newRegion; -		size_t oldSize = -		    memMap->numRegionsAllocated * sizeof(*newRegion); -		int newAlloc = memMap->numRegionsAllocated + 4; -		size_t newSize = newAlloc * sizeof(*newRegion); - -		newRegion = kmalloc(newSize, GFP_KERNEL); -		if (newRegion == NULL) { -			rc = -ENOMEM; -			goto out; -		} -		memcpy(newRegion, memMap->region, oldSize); -		memset(&((uint8_t *) newRegion)[oldSize], 0, newSize - oldSize); - -		kfree(memMap->region); - -		memMap->numRegionsAllocated = newAlloc; -		memMap->region = newRegion; -	} - -	region = &memMap->region[memMap->numRegionsUsed]; -	memMap->numRegionsUsed++; - -	offset = addr & ~PAGE_MASK; - -	region->memType = dma_mem_type(mem); -	region->virtAddr = mem; -	region->numBytes = numBytes; -	region->numSegmentsUsed = 0; -	region->numLockedPages = 0; -	region->lockedPages = NULL; - -	switch (region->memType) { -	case DMA_MEM_TYPE_VMALLOC: -		{ -			atomic_inc(&gDmaStatMemTypeVmalloc); - -			/* printk(KERN_ERR "%s: vmalloc'd pages are not supported\n", __func__); */ - -			/* vmalloc'd pages are not physically contiguous */ - -			rc = -EINVAL; -			break; -		} - -	case DMA_MEM_TYPE_KMALLOC: -		{ -			atomic_inc(&gDmaStatMemTypeKmalloc); - -			/* kmalloc'd pages are physically contiguous, so they'll have exactly */ -			/* one segment */ - -#if ALLOW_MAP_OF_KMALLOC_MEMORY -			physAddr = -			    dma_map_single(NULL, mem, numBytes, memMap->dir); -			rc = dma_map_add_segment(memMap, region, mem, physAddr, -						 numBytes); -#else -			rc = -EINVAL; -#endif -			break; -		} - -	case DMA_MEM_TYPE_DMA: -		{ -			/* dma_alloc_xxx pages are physically contiguous */ - -			atomic_inc(&gDmaStatMemTypeCoherent); - -			physAddr = (vmalloc_to_pfn(mem) << PAGE_SHIFT) + offset; - -			dma_sync_single_for_cpu(NULL, physAddr, numBytes, -						memMap->dir); -			rc = dma_map_add_segment(memMap, region, mem, physAddr, -						 numBytes); -			break; -		} - -	case DMA_MEM_TYPE_USER: -		{ -			size_t firstPageOffset; -			size_t firstPageSize; -			struct page **pages; -			struct task_struct *userTask; - -			atomic_inc(&gDmaStatMemTypeUser); - -#if 1 -			/* If the pages are user pages, then the dma_mem_map_set_user_task function */ -			/* must have been previously called. */ - -			if (memMap->userTask == NULL) { -				printk(KERN_ERR -				       "%s: must call dma_mem_map_set_user_task when using user-mode memory\n", -				       __func__); -				return -EINVAL; -			} - -			/* User pages need to be locked. */ - -			firstPageOffset = -			    (unsigned long)region->virtAddr & (PAGE_SIZE - 1); -			firstPageSize = PAGE_SIZE - firstPageOffset; - -			region->numLockedPages = (firstPageOffset -						  + region->numBytes + -						  PAGE_SIZE - 1) / PAGE_SIZE; -			pages = -			    kmalloc(region->numLockedPages * -				    sizeof(struct page *), GFP_KERNEL); - -			if (pages == NULL) { -				region->numLockedPages = 0; -				return -ENOMEM; -			} - -			userTask = memMap->userTask; - -			down_read(&userTask->mm->mmap_sem); -			rc = get_user_pages(userTask,	/* task */ -					    userTask->mm,	/* mm */ -					    (unsigned long)region->virtAddr,	/* start */ -					    region->numLockedPages,	/* len */ -					    memMap->dir == DMA_FROM_DEVICE,	/* write */ -					    0,	/* force */ -					    pages,	/* pages (array of pointers to page) */ -					    NULL);	/* vmas */ -			up_read(&userTask->mm->mmap_sem); - -			if (rc != region->numLockedPages) { -				kfree(pages); -				region->numLockedPages = 0; - -				if (rc >= 0) { -					rc = -EINVAL; -				} -			} else { -				uint8_t *virtAddr = region->virtAddr; -				size_t bytesRemaining; -				int pageIdx; - -				rc = 0;	/* Since get_user_pages returns +ve number */ - -				region->lockedPages = pages; - -				/* We've locked the user pages. Now we need to walk them and figure */ -				/* out the physical addresses. */ - -				/* The first page may be partial */ - -				dma_map_add_segment(memMap, -						    region, -						    virtAddr, -						    PFN_PHYS(page_to_pfn -							     (pages[0])) + -						    firstPageOffset, -						    firstPageSize); - -				virtAddr += firstPageSize; -				bytesRemaining = -				    region->numBytes - firstPageSize; - -				for (pageIdx = 1; -				     pageIdx < region->numLockedPages; -				     pageIdx++) { -					size_t bytesThisPage = -					    (bytesRemaining > -					     PAGE_SIZE ? PAGE_SIZE : -					     bytesRemaining); - -					DMA_MAP_PRINT -					    ("pageIdx:%d pages[pageIdx]=%p pfn=%u phys=%u\n", -					     pageIdx, pages[pageIdx], -					     page_to_pfn(pages[pageIdx]), -					     PFN_PHYS(page_to_pfn -						      (pages[pageIdx]))); - -					dma_map_add_segment(memMap, -							    region, -							    virtAddr, -							    PFN_PHYS(page_to_pfn -								     (pages -								      [pageIdx])), -							    bytesThisPage); - -					virtAddr += bytesThisPage; -					bytesRemaining -= bytesThisPage; -				} -			} -#else -			printk(KERN_ERR -			       "%s: User mode pages are not yet supported\n", -			       __func__); - -			/* user pages are not physically contiguous */ - -			rc = -EINVAL; -#endif -			break; -		} - -	default: -		{ -			printk(KERN_ERR "%s: Unsupported memory type: %d\n", -			       __func__, region->memType); - -			rc = -EINVAL; -			break; -		} -	} - -	if (rc != 0) { -		memMap->numRegionsUsed--; -	} - -out: - -	DMA_MAP_PRINT("returning %d\n", rc); - -	up(&memMap->lock); - -	return rc; -} - -EXPORT_SYMBOL(dma_map_add_segment); - -/****************************************************************************/ -/** -*   Maps in a memory region such that it can be used for performing a DMA. -* -*   @return     0 on success, error code otherwise. -*/ -/****************************************************************************/ - -int dma_map_mem(DMA_MemMap_t *memMap,	/* Stores state information about the map */ -		void *mem,	/* Virtual address that we want to get a map of */ -		size_t numBytes,	/* Number of bytes being mapped */ -		enum dma_data_direction dir	/* Direction that the mapping will be going */ -    ) { -	int rc; - -	rc = dma_map_start(memMap, dir); -	if (rc == 0) { -		rc = dma_map_add_region(memMap, mem, numBytes); -		if (rc < 0) { -			/* Since the add fails, this function will fail, and the caller won't */ -			/* call unmap, so we need to do it here. */ - -			dma_unmap(memMap, 0); -		} -	} - -	return rc; -} - -EXPORT_SYMBOL(dma_map_mem); - -/****************************************************************************/ -/** -*   Setup a descriptor ring for a given memory map. -* -*   It is assumed that the descriptor ring has already been initialized, and -*   this routine will only reallocate a new descriptor ring if the existing -*   one is too small. -* -*   @return     0 on success, error code otherwise. -*/ -/****************************************************************************/ - -int dma_map_create_descriptor_ring(DMA_Device_t dev,	/* DMA device (where the ring is stored) */ -				   DMA_MemMap_t *memMap,	/* Memory map that will be used */ -				   dma_addr_t devPhysAddr	/* Physical address of device */ -    ) { -	int rc; -	int numDescriptors; -	DMA_DeviceAttribute_t *devAttr; -	DMA_Region_t *region; -	DMA_Segment_t *segment; -	dma_addr_t srcPhysAddr; -	dma_addr_t dstPhysAddr; -	int regionIdx; -	int segmentIdx; - -	devAttr = &DMA_gDeviceAttribute[dev]; - -	down(&memMap->lock); - -	/* Figure out how many descriptors we need */ - -	numDescriptors = 0; -	for (regionIdx = 0; regionIdx < memMap->numRegionsUsed; regionIdx++) { -		region = &memMap->region[regionIdx]; - -		for (segmentIdx = 0; segmentIdx < region->numSegmentsUsed; -		     segmentIdx++) { -			segment = ®ion->segment[segmentIdx]; - -			if (memMap->dir == DMA_TO_DEVICE) { -				srcPhysAddr = segment->physAddr; -				dstPhysAddr = devPhysAddr; -			} else { -				srcPhysAddr = devPhysAddr; -				dstPhysAddr = segment->physAddr; -			} - -			rc = -			     dma_calculate_descriptor_count(dev, srcPhysAddr, -							    dstPhysAddr, -							    segment-> -							    numBytes); -			if (rc < 0) { -				printk(KERN_ERR -				       "%s: dma_calculate_descriptor_count failed: %d\n", -				       __func__, rc); -				goto out; -			} -			numDescriptors += rc; -		} -	} - -	/* Adjust the size of the ring, if it isn't big enough */ - -	if (numDescriptors > devAttr->ring.descriptorsAllocated) { -		dma_free_descriptor_ring(&devAttr->ring); -		rc = -		     dma_alloc_descriptor_ring(&devAttr->ring, -					       numDescriptors); -		if (rc < 0) { -			printk(KERN_ERR -			       "%s: dma_alloc_descriptor_ring failed: %d\n", -			       __func__, rc); -			goto out; -		} -	} else { -		rc = -		     dma_init_descriptor_ring(&devAttr->ring, -					      numDescriptors); -		if (rc < 0) { -			printk(KERN_ERR -			       "%s: dma_init_descriptor_ring failed: %d\n", -			       __func__, rc); -			goto out; -		} -	} - -	/* Populate the descriptors */ - -	for (regionIdx = 0; regionIdx < memMap->numRegionsUsed; regionIdx++) { -		region = &memMap->region[regionIdx]; - -		for (segmentIdx = 0; segmentIdx < region->numSegmentsUsed; -		     segmentIdx++) { -			segment = ®ion->segment[segmentIdx]; - -			if (memMap->dir == DMA_TO_DEVICE) { -				srcPhysAddr = segment->physAddr; -				dstPhysAddr = devPhysAddr; -			} else { -				srcPhysAddr = devPhysAddr; -				dstPhysAddr = segment->physAddr; -			} - -			rc = -			     dma_add_descriptors(&devAttr->ring, dev, -						 srcPhysAddr, dstPhysAddr, -						 segment->numBytes); -			if (rc < 0) { -				printk(KERN_ERR -				       "%s: dma_add_descriptors failed: %d\n", -				       __func__, rc); -				goto out; -			} -		} -	} - -	rc = 0; - -out: - -	up(&memMap->lock); -	return rc; -} - -EXPORT_SYMBOL(dma_map_create_descriptor_ring); - -/****************************************************************************/ -/** -*   Maps in a memory region such that it can be used for performing a DMA. -* -*   @return -*/ -/****************************************************************************/ - -int dma_unmap(DMA_MemMap_t *memMap,	/* Stores state information about the map */ -	      int dirtied	/* non-zero if any of the pages were modified */ -    ) { - -	int rc = 0; -	int regionIdx; -	int segmentIdx; -	DMA_Region_t *region; -	DMA_Segment_t *segment; - -	down(&memMap->lock); - -	for (regionIdx = 0; regionIdx < memMap->numRegionsUsed; regionIdx++) { -		region = &memMap->region[regionIdx]; - -		for (segmentIdx = 0; segmentIdx < region->numSegmentsUsed; -		     segmentIdx++) { -			segment = ®ion->segment[segmentIdx]; - -			switch (region->memType) { -			case DMA_MEM_TYPE_VMALLOC: -				{ -					printk(KERN_ERR -					       "%s: vmalloc'd pages are not yet supported\n", -					       __func__); -					rc = -EINVAL; -					goto out; -				} - -			case DMA_MEM_TYPE_KMALLOC: -				{ -#if ALLOW_MAP_OF_KMALLOC_MEMORY -					dma_unmap_single(NULL, -							 segment->physAddr, -							 segment->numBytes, -							 memMap->dir); -#endif -					break; -				} - -			case DMA_MEM_TYPE_DMA: -				{ -					dma_sync_single_for_cpu(NULL, -								segment-> -								physAddr, -								segment-> -								numBytes, -								memMap->dir); -					break; -				} - -			case DMA_MEM_TYPE_USER: -				{ -					/* Nothing to do here. */ - -					break; -				} - -			default: -				{ -					printk(KERN_ERR -					       "%s: Unsupported memory type: %d\n", -					       __func__, region->memType); -					rc = -EINVAL; -					goto out; -				} -			} - -			segment->virtAddr = NULL; -			segment->physAddr = 0; -			segment->numBytes = 0; -		} - -		if (region->numLockedPages > 0) { -			int pageIdx; - -			/* Some user pages were locked. We need to go and unlock them now. */ - -			for (pageIdx = 0; pageIdx < region->numLockedPages; -			     pageIdx++) { -				struct page *page = -				    region->lockedPages[pageIdx]; - -				if (memMap->dir == DMA_FROM_DEVICE) { -					SetPageDirty(page); -				} -				page_cache_release(page); -			} -			kfree(region->lockedPages); -			region->numLockedPages = 0; -			region->lockedPages = NULL; -		} - -		region->memType = DMA_MEM_TYPE_NONE; -		region->virtAddr = NULL; -		region->numBytes = 0; -		region->numSegmentsUsed = 0; -	} -	memMap->userTask = NULL; -	memMap->numRegionsUsed = 0; -	memMap->inUse = 0; - -out: -	up(&memMap->lock); - -	return rc; -} - -EXPORT_SYMBOL(dma_unmap); diff --git a/arch/arm/mach-bcmring/include/mach/dma.h b/arch/arm/mach-bcmring/include/mach/dma.h index 1f2c5319c05..72543781207 100644 --- a/arch/arm/mach-bcmring/include/mach/dma.h +++ b/arch/arm/mach-bcmring/include/mach/dma.h @@ -26,15 +26,9 @@  /* ---- Include Files ---------------------------------------------------- */  #include <linux/kernel.h> -#include <linux/wait.h>  #include <linux/semaphore.h>  #include <csp/dmacHw.h>  #include <mach/timer.h> -#include <linux/scatterlist.h> -#include <linux/dma-mapping.h> -#include <linux/mm.h> -#include <linux/vmalloc.h> -#include <linux/pagemap.h>  /* ---- Constants and Types ---------------------------------------------- */ @@ -113,78 +107,6 @@ typedef struct {  /****************************************************************************  * -*   The DMA_MemType_t and DMA_MemMap_t are helper structures used to setup -*   DMA chains from a variety of memory sources. -* -*****************************************************************************/ - -#define DMA_MEM_MAP_MIN_SIZE    4096	/* Pages less than this size are better */ -					/* off not being DMA'd. */ - -typedef enum { -	DMA_MEM_TYPE_NONE,	/* Not a valid setting */ -	DMA_MEM_TYPE_VMALLOC,	/* Memory came from vmalloc call */ -	DMA_MEM_TYPE_KMALLOC,	/* Memory came from kmalloc call */ -	DMA_MEM_TYPE_DMA,	/* Memory came from dma_alloc_xxx call */ -	DMA_MEM_TYPE_USER,	/* Memory came from user space. */ - -} DMA_MemType_t; - -/* A segment represents a physically and virtually contiguous chunk of memory. */ -/* i.e. each segment can be DMA'd */ -/* A user of the DMA code will add memory regions. Each region may need to be */ -/* represented by one or more segments. */ - -typedef struct { -	void *virtAddr;		/* Virtual address used for this segment */ -	dma_addr_t physAddr;	/* Physical address this segment maps to */ -	size_t numBytes;	/* Size of the segment, in bytes */ - -} DMA_Segment_t; - -/* A region represents a virtually contiguous chunk of memory, which may be */ -/* made up of multiple segments. */ - -typedef struct { -	DMA_MemType_t memType; -	void *virtAddr; -	size_t numBytes; - -	/* Each region (virtually contiguous) consists of one or more segments. Each */ -	/* segment is virtually and physically contiguous. */ - -	int numSegmentsUsed; -	int numSegmentsAllocated; -	DMA_Segment_t *segment; - -	/* When a region corresponds to user memory, we need to lock all of the pages */ -	/* down before we can figure out the physical addresses. The lockedPage array contains */ -	/* the pages that were locked, and which subsequently need to be unlocked once the */ -	/* memory is unmapped. */ - -	unsigned numLockedPages; -	struct page **lockedPages; - -} DMA_Region_t; - -typedef struct { -	int inUse;		/* Is this mapping currently being used? */ -	struct semaphore lock;	/* Acquired when using this structure */ -	enum dma_data_direction dir;	/* Direction this transfer is intended for */ - -	/* In the event that we're mapping user memory, we need to know which task */ -	/* the memory is for, so that we can obtain the correct mm locks. */ - -	struct task_struct *userTask; - -	int numRegionsUsed; -	int numRegionsAllocated; -	DMA_Region_t *region; - -} DMA_MemMap_t; - -/**************************************************************************** -*  *   The DMA_DeviceAttribute_t contains information which describes a  *   particular DMA device (or peripheral).  * @@ -570,124 +492,6 @@ int dma_alloc_double_dst_descriptors(DMA_Handle_t handle,	/* DMA Handle */  /****************************************************************************/  /** -*   Initializes a DMA_MemMap_t data structure -*/ -/****************************************************************************/ - -int dma_init_mem_map(DMA_MemMap_t *memMap	/* Stores state information about the map */ -    ); - -/****************************************************************************/ -/** -*   Releases any memory currently being held by a memory mapping structure. -*/ -/****************************************************************************/ - -int dma_term_mem_map(DMA_MemMap_t *memMap	/* Stores state information about the map */ -    ); - -/****************************************************************************/ -/** -*   Looks at a memory address and categorizes it. -* -*   @return One of the values from the DMA_MemType_t enumeration. -*/ -/****************************************************************************/ - -DMA_MemType_t dma_mem_type(void *addr); - -/****************************************************************************/ -/** -*   Sets the process (aka userTask) associated with a mem map. This is -*   required if user-mode segments will be added to the mapping. -*/ -/****************************************************************************/ - -static inline void dma_mem_map_set_user_task(DMA_MemMap_t *memMap, -					     struct task_struct *task) -{ -	memMap->userTask = task; -} - -/****************************************************************************/ -/** -*   Looks at a memory address and determines if we support DMA'ing to/from -*   that type of memory. -* -*   @return boolean - -*               return value != 0 means dma supported -*               return value == 0 means dma not supported -*/ -/****************************************************************************/ - -int dma_mem_supports_dma(void *addr); - -/****************************************************************************/ -/** -*   Initializes a memory map for use. Since this function acquires a -*   sempaphore within the memory map, it is VERY important that dma_unmap -*   be called when you're finished using the map. -*/ -/****************************************************************************/ - -int dma_map_start(DMA_MemMap_t *memMap,	/* Stores state information about the map */ -		  enum dma_data_direction dir	/* Direction that the mapping will be going */ -    ); - -/****************************************************************************/ -/** -*   Adds a segment of memory to a memory map. -* -*   @return     0 on success, error code otherwise. -*/ -/****************************************************************************/ - -int dma_map_add_region(DMA_MemMap_t *memMap,	/* Stores state information about the map */ -		       void *mem,	/* Virtual address that we want to get a map of */ -		       size_t numBytes	/* Number of bytes being mapped */ -    ); - -/****************************************************************************/ -/** -*   Creates a descriptor ring from a memory mapping. -* -*   @return 0 on success, error code otherwise. -*/ -/****************************************************************************/ - -int dma_map_create_descriptor_ring(DMA_Device_t dev,	/* DMA device (where the ring is stored) */ -				   DMA_MemMap_t *memMap,	/* Memory map that will be used */ -				   dma_addr_t devPhysAddr	/* Physical address of device */ -    ); - -/****************************************************************************/ -/** -*   Maps in a memory region such that it can be used for performing a DMA. -* -*   @return -*/ -/****************************************************************************/ - -int dma_map_mem(DMA_MemMap_t *memMap,	/* Stores state information about the map */ -		void *addr,	/* Virtual address that we want to get a map of */ -		size_t count,	/* Number of bytes being mapped */ -		enum dma_data_direction dir	/* Direction that the mapping will be going */ -    ); - -/****************************************************************************/ -/** -*   Maps in a memory region such that it can be used for performing a DMA. -* -*   @return -*/ -/****************************************************************************/ - -int dma_unmap(DMA_MemMap_t *memMap,	/* Stores state information about the map */ -	      int dirtied	/* non-zero if any of the pages were modified */ -    ); - -/****************************************************************************/ -/**  *   Initiates a transfer when the descriptors have already been setup.  *  *   This is a special case, and normally, the dma_transfer_xxx functions should diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index 6b22b543a83..d5088900af6 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c @@ -44,7 +44,7 @@  #include <mach/aemif.h>  #include <mach/spi.h> -#define DA850_EVM_PHY_ID		"0:00" +#define DA850_EVM_PHY_ID		"davinci_mdio-0:00"  #define DA850_LCD_PWR_PIN		GPIO_TO_PIN(2, 8)  #define DA850_LCD_BL_PIN		GPIO_TO_PIN(2, 15) diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c index 346e1de2f5a..849311d3cb7 100644 --- a/arch/arm/mach-davinci/board-dm365-evm.c +++ b/arch/arm/mach-davinci/board-dm365-evm.c @@ -54,7 +54,7 @@ static inline int have_tvp7002(void)  	return 0;  } -#define DM365_EVM_PHY_ID		"0:01" +#define DM365_EVM_PHY_ID		"davinci_mdio-0:01"  /*   * A MAX-II CPLD is used for various board control functions.   */ diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index a64b49cfedc..1247ecdcf75 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c @@ -40,7 +40,7 @@  #include <mach/usb.h>  #include <mach/aemif.h> -#define DM644X_EVM_PHY_ID		"0:01" +#define DM644X_EVM_PHY_ID		"davinci_mdio-0:01"  #define LXT971_PHY_ID	(0x001378e2)  #define LXT971_PHY_MASK	(0xfffffff0) diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c index 64017558860..872ac69fa04 100644 --- a/arch/arm/mach-davinci/board-dm646x-evm.c +++ b/arch/arm/mach-davinci/board-dm646x-evm.c @@ -736,7 +736,7 @@ static struct davinci_uart_config uart_config __initdata = {  	.enabled_uarts = (1 << 0),  }; -#define DM646X_EVM_PHY_ID		"0:01" +#define DM646X_EVM_PHY_ID		"davinci_mdio-0:01"  /*   * The following EDMA channels/slots are not being used by drivers (for   * example: Timer, GPIO, UART events etc) on dm646x, hence they are being diff --git a/arch/arm/mach-davinci/board-neuros-osd2.c b/arch/arm/mach-davinci/board-neuros-osd2.c index 6c4a16415d4..8d34f513d41 100644 --- a/arch/arm/mach-davinci/board-neuros-osd2.c +++ b/arch/arm/mach-davinci/board-neuros-osd2.c @@ -39,7 +39,7 @@  #include <mach/mmc.h>  #include <mach/usb.h> -#define NEUROS_OSD2_PHY_ID		"0:01" +#define NEUROS_OSD2_PHY_ID		"davinci_mdio-0:01"  #define LXT971_PHY_ID			0x001378e2  #define LXT971_PHY_MASK			0xfffffff0 diff --git a/arch/arm/mach-davinci/board-omapl138-hawk.c b/arch/arm/mach-davinci/board-omapl138-hawk.c index e7c0c7c5349..45e815760a2 100644 --- a/arch/arm/mach-davinci/board-omapl138-hawk.c +++ b/arch/arm/mach-davinci/board-omapl138-hawk.c @@ -21,7 +21,7 @@  #include <mach/da8xx.h>  #include <mach/mux.h> -#define HAWKBOARD_PHY_ID		"0:07" +#define HAWKBOARD_PHY_ID		"davinci_mdio-0:07"  #define DA850_HAWK_MMCSD_CD_PIN		GPIO_TO_PIN(3, 12)  #define DA850_HAWK_MMCSD_WP_PIN		GPIO_TO_PIN(3, 13) diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c index 0b136a831c5..31da3c5b2ba 100644 --- a/arch/arm/mach-davinci/board-sffsdr.c +++ b/arch/arm/mach-davinci/board-sffsdr.c @@ -42,7 +42,7 @@  #include <mach/mux.h>  #include <mach/usb.h> -#define SFFSDR_PHY_ID		"0:01" +#define SFFSDR_PHY_ID		"davinci_mdio-0:01"  static struct mtd_partition davinci_sffsdr_nandflash_partition[] = {  	/* U-Boot Environment: Block 0  	 * UBL:                Block 1 diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c index 0ed7fdb64ef..992c4c41018 100644 --- a/arch/arm/mach-davinci/da850.c +++ b/arch/arm/mach-davinci/da850.c @@ -153,34 +153,6 @@ static struct clk pll1_sysclk3 = {  	.div_reg	= PLLDIV3,  }; -static struct clk pll1_sysclk4 = { -	.name		= "pll1_sysclk4", -	.parent		= &pll1_clk, -	.flags		= CLK_PLL, -	.div_reg	= PLLDIV4, -}; - -static struct clk pll1_sysclk5 = { -	.name		= "pll1_sysclk5", -	.parent		= &pll1_clk, -	.flags		= CLK_PLL, -	.div_reg	= PLLDIV5, -}; - -static struct clk pll1_sysclk6 = { -	.name		= "pll0_sysclk6", -	.parent		= &pll0_clk, -	.flags		= CLK_PLL, -	.div_reg	= PLLDIV6, -}; - -static struct clk pll1_sysclk7 = { -	.name		= "pll1_sysclk7", -	.parent		= &pll1_clk, -	.flags		= CLK_PLL, -	.div_reg	= PLLDIV7, -}; -  static struct clk i2c0_clk = {  	.name		= "i2c0",  	.parent		= &pll0_aux_clk, @@ -397,10 +369,6 @@ static struct clk_lookup da850_clks[] = {  	CLK(NULL,		"pll1_aux",	&pll1_aux_clk),  	CLK(NULL,		"pll1_sysclk2",	&pll1_sysclk2),  	CLK(NULL,		"pll1_sysclk3",	&pll1_sysclk3), -	CLK(NULL,		"pll1_sysclk4",	&pll1_sysclk4), -	CLK(NULL,		"pll1_sysclk5",	&pll1_sysclk5), -	CLK(NULL,		"pll1_sysclk6",	&pll1_sysclk6), -	CLK(NULL,		"pll1_sysclk7",	&pll1_sysclk7),  	CLK("i2c_davinci.1",	NULL,		&i2c0_clk),  	CLK(NULL,		"timer0",	&timerp64_0_clk),  	CLK("watchdog",		NULL,		&timerp64_1_clk), diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index dd1429ae640..bda7aca04ca 100644 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c @@ -28,6 +28,7 @@  #include <asm/mach/arch.h>  #include <linux/irq.h>  #include <plat/time.h> +#include <plat/ehci-orion.h>  #include <plat/common.h>  #include <plat/addr-map.h>  #include "common.h" @@ -71,7 +72,7 @@ void __init dove_map_io(void)   ****************************************************************************/  void __init dove_ehci0_init(void)  { -	orion_ehci_init(DOVE_USB0_PHYS_BASE, IRQ_DOVE_USB0); +	orion_ehci_init(DOVE_USB0_PHYS_BASE, IRQ_DOVE_USB0, EHCI_PHY_NA);  }  /***************************************************************************** diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c index 03dd4012043..d67d0b4feb6 100644 --- a/arch/arm/mach-ep93xx/vision_ep9307.c +++ b/arch/arm/mach-ep93xx/vision_ep9307.c @@ -32,7 +32,9 @@  #include <mach/hardware.h>  #include <mach/fb.h>  #include <mach/ep93xx_spi.h> +#include <mach/gpio-ep93xx.h> +#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/map.h>  #include <asm/mach/arch.h> @@ -153,7 +155,6 @@ static struct i2c_board_info vision_i2c_info[] __initdata = {  	}, {  		I2C_BOARD_INFO("pca9539", 0x74),  		.platform_data	= &pca953x_74_gpio_data, -		.irq		= gpio_to_irq(EP93XX_GPIO_LINE_F(7)),  	}, {  		I2C_BOARD_INFO("pca9539", 0x75),  		.platform_data	= &pca953x_75_gpio_data, @@ -348,6 +349,8 @@ static void __init vision_init_machine(void)  				"pca9539:74"))  		pr_warn("cannot request interrupt gpio for pca9539:74\n"); +	vision_i2c_info[1].irq = gpio_to_irq(EP93XX_GPIO_LINE_F(7)); +  	ep93xx_register_i2c(&vision_i2c_gpio_data, vision_i2c_info,  				ARRAY_SIZE(vision_i2c_info));  	ep93xx_register_spi(&vision_spi_master, vision_spi_board_info, @@ -359,6 +362,7 @@ MACHINE_START(VISION_EP9307, "Vision Engraving Systems EP9307")  	.atag_offset	= 0x100,  	.map_io		= vision_map_io,  	.init_irq	= ep93xx_init_irq, +	.handle_irq	= vic_handle_irq,  	.timer		= &ep93xx_timer,  	.init_machine	= vision_init_machine,  	.restart	= ep93xx_restart, diff --git a/arch/arm/mach-exynos/clock-exynos4210.c b/arch/arm/mach-exynos/clock-exynos4210.c index a5823a7f249..13312ccb2d9 100644 --- a/arch/arm/mach-exynos/clock-exynos4210.c +++ b/arch/arm/mach-exynos/clock-exynos4210.c @@ -32,6 +32,7 @@  #include "common.h" +#ifdef CONFIG_PM_SLEEP  static struct sleep_save exynos4210_clock_save[] = {  	SAVE_ITEM(S5P_CLKSRC_IMAGE),  	SAVE_ITEM(S5P_CLKSRC_LCD1), @@ -42,6 +43,7 @@ static struct sleep_save exynos4210_clock_save[] = {  	SAVE_ITEM(S5P_CLKGATE_IP_LCD1),  	SAVE_ITEM(S5P_CLKGATE_IP_PERIR_4210),  }; +#endif  static struct clksrc_clk *sysclks[] = {  	/* nothing here yet */ diff --git a/arch/arm/mach-exynos/clock-exynos4212.c b/arch/arm/mach-exynos/clock-exynos4212.c index 26a668b0d10..48af28566fa 100644 --- a/arch/arm/mach-exynos/clock-exynos4212.c +++ b/arch/arm/mach-exynos/clock-exynos4212.c @@ -32,12 +32,14 @@  #include "common.h" +#ifdef CONFIG_PM_SLEEP  static struct sleep_save exynos4212_clock_save[] = {  	SAVE_ITEM(S5P_CLKSRC_IMAGE),  	SAVE_ITEM(S5P_CLKDIV_IMAGE),  	SAVE_ITEM(S5P_CLKGATE_IP_IMAGE_4212),  	SAVE_ITEM(S5P_CLKGATE_IP_PERIR_4212),  }; +#endif  static struct clk *clk_src_mpll_user_list[] = {  	[0] = &clk_fin_mpll, diff --git a/arch/arm/mach-exynos/clock.c b/arch/arm/mach-exynos/clock.c index 5a8c42e9000..187287aa57a 100644 --- a/arch/arm/mach-exynos/clock.c +++ b/arch/arm/mach-exynos/clock.c @@ -30,6 +30,7 @@  #include "common.h" +#ifdef CONFIG_PM_SLEEP  static struct sleep_save exynos4_clock_save[] = {  	SAVE_ITEM(S5P_CLKDIV_LEFTBUS),  	SAVE_ITEM(S5P_CLKGATE_IP_LEFTBUS), @@ -93,6 +94,7 @@ static struct sleep_save exynos4_clock_save[] = {  	SAVE_ITEM(S5P_CLKGATE_SCLKCPU),  	SAVE_ITEM(S5P_CLKGATE_IP_CPU),  }; +#endif  struct clk clk_sclk_hdmi27m = {  	.name		= "sclk_hdmi27m", diff --git a/arch/arm/mach-exynos/hotplug.c b/arch/arm/mach-exynos/hotplug.c index da70e7e3993..dd1ad55524c 100644 --- a/arch/arm/mach-exynos/hotplug.c +++ b/arch/arm/mach-exynos/hotplug.c @@ -16,6 +16,7 @@  #include <linux/io.h>  #include <asm/cacheflush.h> +#include <asm/smp_plat.h>  #include <mach/regs-pmu.h> diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c index 85fa02767d6..e6b02fdf1b0 100644 --- a/arch/arm/mach-exynos/mach-exynos4-dt.c +++ b/arch/arm/mach-exynos/mach-exynos4-dt.c @@ -15,11 +15,13 @@  #include <linux/serial_core.h>  #include <asm/mach/arch.h> +#include <asm/hardware/gic.h>  #include <mach/map.h>  #include <plat/cpu.h>  #include <plat/regs-serial.h> -#include <plat/exynos4.h> + +#include "common.h"  /*   * The following lookup table is used to override device names when devices @@ -60,7 +62,7 @@ static const struct of_dev_auxdata exynos4210_auxdata_lookup[] __initconst = {  static void __init exynos4210_dt_map_io(void)  { -	s5p_init_io(NULL, 0, S5P_VA_CHIPID); +	exynos_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  } @@ -79,7 +81,9 @@ DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4 (Flattened Device Tree)")  	/* Maintainer: Thomas Abraham <thomas.abraham@linaro.org> */  	.init_irq	= exynos4_init_irq,  	.map_io		= exynos4210_dt_map_io, +	.handle_irq	= gic_handle_irq,  	.init_machine	= exynos4210_dt_machine_init,  	.timer		= &exynos4_timer,  	.dt_compat	= exynos4210_dt_compat, +	.restart        = exynos4_restart,  MACHINE_END diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c index b895ec03110..435261f83f4 100644 --- a/arch/arm/mach-exynos/mach-nuri.c +++ b/arch/arm/mach-exynos/mach-nuri.c @@ -220,14 +220,14 @@ static struct s3c_fb_pd_win nuri_fb_win0 = {  		.lower_margin	= 1,  		.hsync_len	= 48,  		.vsync_len	= 3, -		.xres		= 1280, -		.yres		= 800, +		.xres		= 1024, +		.yres		= 600,  		.refresh	= 60,  	},  	.max_bpp	= 24,  	.default_bpp	= 16, -	.virtual_x	= 1280, -	.virtual_y	= 800, +	.virtual_x	= 1024, +	.virtual_y	= 2 * 600,  };  static struct s3c_fb_platdata nuri_fb_pdata __initdata = { diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index 37ac93e8d6d..38939956c34 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c @@ -13,6 +13,7 @@  #include <linux/i2c.h>  #include <linux/gpio_keys.h>  #include <linux/gpio.h> +#include <linux/interrupt.h>  #include <linux/fb.h>  #include <linux/mfd/max8998.h>  #include <linux/regulator/machine.h> @@ -595,6 +596,7 @@ static struct mxt_platform_data qt602240_platform_data = {  	.threshold	= 0x28,  	.voltage	= 2800000,		/* 2.8V */  	.orient		= MXT_DIAGONAL, +	.irqflags	= IRQF_TRIGGER_FALLING,  };  static struct i2c_board_info i2c3_devs[] __initdata = { @@ -910,7 +912,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = {  		.bus_type	= FIMC_MIPI_CSI2,  		.board_info	= &m5mols_board_info,  		.i2c_bus_num	= 0, -		.clk_frequency	= 21600000UL, +		.clk_frequency	= 24000000UL,  		.csi_data_align	= 32,  	},  }; diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index 683aec786b7..0f2035a1eb6 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c @@ -23,6 +23,7 @@  #include <asm/cacheflush.h>  #include <asm/hardware/gic.h> +#include <asm/smp_plat.h>  #include <asm/smp_scu.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index a4f61a43c7b..e1901305177 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c @@ -206,7 +206,7 @@ static void exynos4_pm_prepare(void)  } -static int exynos4_pm_add(struct device *dev) +static int exynos4_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = exynos4_pm_prepare;  	pm_cpu_sleep = exynos4_cpu_suspend; @@ -384,7 +384,9 @@ static void exynos4_pm_resume(void)  	exynos4_restore_pll(); +#ifdef CONFIG_SMP  	scu_enable(S5P_VA_SCU); +#endif  #ifdef CONFIG_CACHE_L2X0  	s3c_pm_do_restore_core(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save)); diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index 7afbe1e55be..8394d512a40 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c @@ -25,6 +25,7 @@  #include <linux/smp.h>  #include <asm/cacheflush.h> +#include <asm/smp_plat.h>  #include <asm/smp_scu.h>  #include <asm/hardware/arm_timer.h>  #include <asm/hardware/timer-sp.h> @@ -72,9 +73,7 @@ static void __init highbank_map_io(void)  void highbank_set_cpu_jump(int cpu, void *jump_addr)  { -#ifdef CONFIG_SMP  	cpu = cpu_logical_map(cpu); -#endif  	writel(virt_to_phys(jump_addr), HB_JUMP_TABLE_VIRT(cpu));  	__cpuc_flush_dcache_area(HB_JUMP_TABLE_VIRT(cpu), 16);  	outer_clean_range(HB_JUMP_TABLE_PHYS(cpu), diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 0e6de366c64..4defb97bbfc 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -22,6 +22,18 @@ config ARCH_MX25  config MACH_MX27  	bool +config ARCH_MX5 +	bool + +config ARCH_MX50 +	bool + +config ARCH_MX51 +	bool + +config ARCH_MX53 +	bool +  config SOC_IMX1  	bool  	select ARCH_MX1 @@ -73,6 +85,31 @@ config SOC_IMX35  	select MXC_AVIC  	select SMP_ON_UP if SMP +config SOC_IMX5 +	select CPU_V7 +	select MXC_TZIC +	select ARCH_MXC_IOMUX_V3 +	select ARCH_MXC_AUDMUX_V2 +	select ARCH_HAS_CPUFREQ +	select ARCH_MX5 +	bool + +config SOC_IMX50 +	bool +	select SOC_IMX5 +	select ARCH_MX50 + +config	SOC_IMX51 +	bool +	select SOC_IMX5 +	select ARCH_MX5 +	select ARCH_MX51 + +config	SOC_IMX53 +	bool +	select SOC_IMX5 +	select ARCH_MX5 +	select ARCH_MX53  if ARCH_IMX_V4_V5 @@ -592,6 +629,207 @@ config MACH_VPR200  	  Include support for VPR200 platform. This includes specific  	  configurations for the board and its peripherals. +comment "i.MX5 platforms:" + +config MACH_MX50_RDP +	bool "Support MX50 reference design platform" +	depends on BROKEN +	select SOC_IMX50 +	select IMX_HAVE_PLATFORM_IMX_I2C +	select IMX_HAVE_PLATFORM_IMX_UART +	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX +	select IMX_HAVE_PLATFORM_SPI_IMX +	help +	  Include support for MX50 reference design platform (RDP) board. This +	  includes specific configurations for the board and its peripherals. + +comment "i.MX51 machines:" + +config MACH_IMX51_DT +	bool "Support i.MX51 platforms from device tree" +	select SOC_IMX51 +	select USE_OF +	select MACH_MX51_BABBAGE +	help +	  Include support for Freescale i.MX51 based platforms +	  using the device tree for discovery + +config MACH_MX51_BABBAGE +	bool "Support MX51 BABBAGE platforms" +	select SOC_IMX51 +	select IMX_HAVE_PLATFORM_FSL_USB2_UDC +	select IMX_HAVE_PLATFORM_IMX2_WDT +	select IMX_HAVE_PLATFORM_IMX_I2C +	select IMX_HAVE_PLATFORM_IMX_UART +	select IMX_HAVE_PLATFORM_MXC_EHCI +	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX +	select IMX_HAVE_PLATFORM_SPI_IMX +	help +	  Include support for MX51 Babbage platform, also known as MX51EVK in +	  u-boot. This includes specific configurations for the board and its +	  peripherals. + +config MACH_MX51_3DS +	bool "Support MX51PDK (3DS)" +	select SOC_IMX51 +	select IMX_HAVE_PLATFORM_IMX2_WDT +	select IMX_HAVE_PLATFORM_IMX_KEYPAD +	select IMX_HAVE_PLATFORM_IMX_UART +	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX +	select IMX_HAVE_PLATFORM_SPI_IMX +	select MXC_DEBUG_BOARD +	help +	  Include support for MX51PDK (3DS) platform. This includes specific +	  configurations for the board and its peripherals. + +config MACH_EUKREA_CPUIMX51 +	bool "Support Eukrea CPUIMX51 module" +	select SOC_IMX51 +	select IMX_HAVE_PLATFORM_FSL_USB2_UDC +	select IMX_HAVE_PLATFORM_IMX_I2C +	select IMX_HAVE_PLATFORM_IMX_UART +	select IMX_HAVE_PLATFORM_MXC_EHCI +	select IMX_HAVE_PLATFORM_MXC_NAND +	select IMX_HAVE_PLATFORM_SPI_IMX +	help +	  Include support for Eukrea CPUIMX51 platform. This includes +	  specific configurations for the module and its peripherals. + +choice +	prompt "Baseboard" +	depends on MACH_EUKREA_CPUIMX51 +	default MACH_EUKREA_MBIMX51_BASEBOARD + +config MACH_EUKREA_MBIMX51_BASEBOARD +	prompt "Eukrea MBIMX51 development board" +	bool +	select IMX_HAVE_PLATFORM_IMX_KEYPAD +	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX +	select LEDS_GPIO_REGISTER +	help +	  This adds board specific devices that can be found on Eukrea's +	  MBIMX51 evaluation board. + +endchoice + +config MACH_EUKREA_CPUIMX51SD +	bool "Support Eukrea CPUIMX51SD module" +	select SOC_IMX51 +	select IMX_HAVE_PLATFORM_FSL_USB2_UDC +	select IMX_HAVE_PLATFORM_IMX_I2C +	select IMX_HAVE_PLATFORM_IMX_UART +	select IMX_HAVE_PLATFORM_MXC_EHCI +	select IMX_HAVE_PLATFORM_MXC_NAND +	select IMX_HAVE_PLATFORM_SPI_IMX +	help +	  Include support for Eukrea CPUIMX51SD platform. This includes +	  specific configurations for the module and its peripherals. + +choice +	prompt "Baseboard" +	depends on MACH_EUKREA_CPUIMX51SD +	default MACH_EUKREA_MBIMXSD51_BASEBOARD + +config MACH_EUKREA_MBIMXSD51_BASEBOARD +	prompt "Eukrea MBIMXSD development board" +	bool +	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX +	select LEDS_GPIO_REGISTER +	help +	  This adds board specific devices that can be found on Eukrea's +	  MBIMXSD evaluation board. + +endchoice + +config MX51_EFIKA_COMMON +	bool +	select SOC_IMX51 +	select IMX_HAVE_PLATFORM_IMX_UART +	select IMX_HAVE_PLATFORM_MXC_EHCI +	select IMX_HAVE_PLATFORM_PATA_IMX +	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX +	select IMX_HAVE_PLATFORM_SPI_IMX +	select MXC_ULPI if USB_ULPI + +config MACH_MX51_EFIKAMX +	bool "Support MX51 Genesi Efika MX nettop" +	select LEDS_GPIO_REGISTER +	select MX51_EFIKA_COMMON +	help +	  Include support for Genesi Efika MX nettop. This includes specific +	  configurations for the board and its peripherals. + +config MACH_MX51_EFIKASB +	bool "Support MX51 Genesi Efika Smartbook" +	select LEDS_GPIO_REGISTER +	select MX51_EFIKA_COMMON +	help +	  Include support for Genesi Efika Smartbook. This includes specific +	  configurations for the board and its peripherals. + +comment "i.MX53 machines:" + +config MACH_IMX53_DT +	bool "Support i.MX53 platforms from device tree" +	select SOC_IMX53 +	select USE_OF +	select MACH_MX53_ARD +	select MACH_MX53_EVK +	select MACH_MX53_LOCO +	select MACH_MX53_SMD +	help +	  Include support for Freescale i.MX53 based platforms +	  using the device tree for discovery + +config MACH_MX53_EVK +	bool "Support MX53 EVK platforms" +	select SOC_IMX53 +	select IMX_HAVE_PLATFORM_IMX2_WDT +	select IMX_HAVE_PLATFORM_IMX_UART +	select IMX_HAVE_PLATFORM_IMX_I2C +	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX +	select IMX_HAVE_PLATFORM_SPI_IMX +	select LEDS_GPIO_REGISTER +	help +	  Include support for MX53 EVK platform. This includes specific +	  configurations for the board and its peripherals. + +config MACH_MX53_SMD +	bool "Support MX53 SMD platforms" +	select SOC_IMX53 +	select IMX_HAVE_PLATFORM_IMX2_WDT +	select IMX_HAVE_PLATFORM_IMX_I2C +	select IMX_HAVE_PLATFORM_IMX_UART +	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX +	help +	  Include support for MX53 SMD platform. This includes specific +	  configurations for the board and its peripherals. + +config MACH_MX53_LOCO +	bool "Support MX53 LOCO platforms" +	select SOC_IMX53 +	select IMX_HAVE_PLATFORM_IMX2_WDT +	select IMX_HAVE_PLATFORM_IMX_I2C +	select IMX_HAVE_PLATFORM_IMX_UART +	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX +	select IMX_HAVE_PLATFORM_GPIO_KEYS +	select LEDS_GPIO_REGISTER +	help +	  Include support for MX53 LOCO platform. This includes specific +	  configurations for the board and its peripherals. + +config MACH_MX53_ARD +	bool "Support MX53 ARD platforms" +	select SOC_IMX53 +	select IMX_HAVE_PLATFORM_IMX2_WDT +	select IMX_HAVE_PLATFORM_IMX_I2C +	select IMX_HAVE_PLATFORM_IMX_UART +	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX +	select IMX_HAVE_PLATFORM_GPIO_KEYS +	help +	  Include support for MX53 ARD platform. This includes specific +	  configurations for the board and its peripherals. +  comment "i.MX6 family:"  config SOC_IMX6Q diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index f5920c24f7d..55db9c488f2 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile @@ -11,6 +11,8 @@ obj-$(CONFIG_SOC_IMX27) += clock-imx27.o mm-imx27.o ehci-imx27.o  obj-$(CONFIG_SOC_IMX31) += mm-imx3.o cpu-imx31.o clock-imx31.o iomux-imx31.o ehci-imx31.o  obj-$(CONFIG_SOC_IMX35) += mm-imx3.o cpu-imx35.o clock-imx35.o ehci-imx35.o +obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o mm-imx5.o clock-mx51-mx53.o ehci-imx5.o pm-imx5.o cpu_op-mx51.o +  # Support for CMOS sensor interface  obj-$(CONFIG_MX1_VIDEO) += mx1-camera-fiq.o mx1-camera-fiq-ksym.o @@ -75,3 +77,22 @@ obj-$(CONFIG_SOC_IMX6Q) += clock-imx6q.o mach-imx6q.o  ifeq ($(CONFIG_PM),y)  obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o  endif + +# i.MX5 based machines +obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o +obj-$(CONFIG_MACH_MX51_3DS) += mach-mx51_3ds.o +obj-$(CONFIG_MACH_MX53_EVK) += mach-mx53_evk.o +obj-$(CONFIG_MACH_MX53_SMD) += mach-mx53_smd.o +obj-$(CONFIG_MACH_MX53_LOCO) += mach-mx53_loco.o +obj-$(CONFIG_MACH_MX53_ARD) += mach-mx53_ard.o +obj-$(CONFIG_MACH_EUKREA_CPUIMX51) += mach-cpuimx51.o +obj-$(CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD) += eukrea_mbimx51-baseboard.o +obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += mach-cpuimx51sd.o +obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd-baseboard.o +obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o +obj-$(CONFIG_MACH_MX51_EFIKAMX) += mach-mx51_efikamx.o +obj-$(CONFIG_MACH_MX51_EFIKASB) += mach-mx51_efikasb.o +obj-$(CONFIG_MACH_MX50_RDP) += mach-mx50_rdp.o + +obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o +obj-$(CONFIG_MACH_IMX53_DT) += imx53-dt.o diff --git a/arch/arm/mach-imx/Makefile.boot b/arch/arm/mach-imx/Makefile.boot index 5f4d06af491..6dfdbcc83af 100644 --- a/arch/arm/mach-imx/Makefile.boot +++ b/arch/arm/mach-imx/Makefile.boot @@ -22,6 +22,18 @@ zreladdr-$(CONFIG_SOC_IMX35)	+= 0x80008000  params_phys-$(CONFIG_SOC_IMX35)	:= 0x80000100  initrd_phys-$(CONFIG_SOC_IMX35)	:= 0x80800000 +zreladdr-$(CONFIG_SOC_IMX50)	+= 0x70008000 +params_phys-$(CONFIG_SOC_IMX50)	:= 0x70000100 +initrd_phys-$(CONFIG_SOC_IMX50)	:= 0x70800000 + +zreladdr-$(CONFIG_SOC_IMX51)	+= 0x90008000 +params_phys-$(CONFIG_SOC_IMX51)	:= 0x90000100 +initrd_phys-$(CONFIG_SOC_IMX51)	:= 0x90800000 + +zreladdr-$(CONFIG_SOC_IMX53)	+= 0x70008000 +params_phys-$(CONFIG_SOC_IMX53)	:= 0x70000100 +initrd_phys-$(CONFIG_SOC_IMX53)	:= 0x70800000 +  zreladdr-$(CONFIG_SOC_IMX6Q)	+= 0x10008000  params_phys-$(CONFIG_SOC_IMX6Q)	:= 0x10000100  initrd_phys-$(CONFIG_SOC_IMX6Q)	:= 0x10800000 diff --git a/arch/arm/mach-imx/clock-imx6q.c b/arch/arm/mach-imx/clock-imx6q.c index 9273c2a24b5..2d88f8b9a45 100644 --- a/arch/arm/mach-imx/clock-imx6q.c +++ b/arch/arm/mach-imx/clock-imx6q.c @@ -814,6 +814,16 @@ DEF_PFD(pll3_pfd_540m, PFD_480, PFD1, &pll3_usb_otg);  DEF_PFD(pll3_pfd_508m, PFD_480, PFD2, &pll3_usb_otg);  DEF_PFD(pll3_pfd_454m, PFD_480, PFD3, &pll3_usb_otg); +static unsigned long twd_clk_get_rate(struct clk *clk) +{ +	return clk_get_rate(clk->parent) / 2; +} + +static struct clk twd_clk = { +	.parent = &arm_clk, +	.get_rate = twd_clk_get_rate, +}; +  static unsigned long pll2_200m_get_rate(struct clk *clk)  {  	return clk_get_rate(clk->parent) / 2; @@ -1894,6 +1904,7 @@ static struct clk_lookup lookups[] = {  	_REGISTER_CLOCK("20ec000.sdma", NULL, sdma_clk),  	_REGISTER_CLOCK("20bc000.wdog", NULL, dummy_clk),  	_REGISTER_CLOCK("20c0000.wdog", NULL, dummy_clk), +	_REGISTER_CLOCK("smp_twd", NULL, twd_clk),  	_REGISTER_CLOCK(NULL, "ckih", ckih_clk),  	_REGISTER_CLOCK(NULL, "ckil_clk", ckil_clk),  	_REGISTER_CLOCK(NULL, "aips_tz1_clk", aips_tz1_clk), diff --git a/arch/arm/mach-mx5/clock-mx51-mx53.c b/arch/arm/mach-imx/clock-mx51-mx53.c index 4cb27697719..08470504a08 100644 --- a/arch/arm/mach-mx5/clock-mx51-mx53.c +++ b/arch/arm/mach-imx/clock-mx51-mx53.c @@ -23,7 +23,7 @@  #include <mach/common.h>  #include <mach/clock.h> -#include "crm_regs.h" +#include "crm-regs-imx5.h"  /* External clock values passed-in by the board code */  static unsigned long external_high_reference, external_low_reference; diff --git a/arch/arm/mach-mx5/cpu.c b/arch/arm/mach-imx/cpu-imx5.c index 5e2e7a84386..5e2e7a84386 100644 --- a/arch/arm/mach-mx5/cpu.c +++ b/arch/arm/mach-imx/cpu-imx5.c diff --git a/arch/arm/mach-mx5/cpu_op-mx51.c b/arch/arm/mach-imx/cpu_op-mx51.c index 9d34c3d4c02..9d34c3d4c02 100644 --- a/arch/arm/mach-mx5/cpu_op-mx51.c +++ b/arch/arm/mach-imx/cpu_op-mx51.c diff --git a/arch/arm/mach-mx5/cpu_op-mx51.h b/arch/arm/mach-imx/cpu_op-mx51.h index 97477fecb46..97477fecb46 100644 --- a/arch/arm/mach-mx5/cpu_op-mx51.h +++ b/arch/arm/mach-imx/cpu_op-mx51.h diff --git a/arch/arm/mach-mx5/crm_regs.h b/arch/arm/mach-imx/crm-regs-imx5.h index 5e11ba7daee..5e11ba7daee 100644 --- a/arch/arm/mach-mx5/crm_regs.h +++ b/arch/arm/mach-imx/crm-regs-imx5.h diff --git a/arch/arm/mach-mx5/devices-imx50.h b/arch/arm/mach-imx/devices-imx50.h index 7216667eaaf..7216667eaaf 100644 --- a/arch/arm/mach-mx5/devices-imx50.h +++ b/arch/arm/mach-imx/devices-imx50.h diff --git a/arch/arm/mach-mx5/devices-imx51.h b/arch/arm/mach-imx/devices-imx51.h index af488bc0e22..af488bc0e22 100644 --- a/arch/arm/mach-mx5/devices-imx51.h +++ b/arch/arm/mach-imx/devices-imx51.h diff --git a/arch/arm/mach-mx5/devices-imx53.h b/arch/arm/mach-imx/devices-imx53.h index 6e1e5d1f8c3..6e1e5d1f8c3 100644 --- a/arch/arm/mach-mx5/devices-imx53.h +++ b/arch/arm/mach-imx/devices-imx53.h diff --git a/arch/arm/mach-mx5/efika.h b/arch/arm/mach-imx/efika.h index 014aa985faa..014aa985faa 100644 --- a/arch/arm/mach-mx5/efika.h +++ b/arch/arm/mach-imx/efika.h diff --git a/arch/arm/mach-mx5/ehci.c b/arch/arm/mach-imx/ehci-imx5.c index c17fa131728..c17fa131728 100644 --- a/arch/arm/mach-mx5/ehci.c +++ b/arch/arm/mach-imx/ehci-imx5.c diff --git a/arch/arm/mach-mx5/eukrea_mbimx51-baseboard.c b/arch/arm/mach-imx/eukrea_mbimx51-baseboard.c index a6a3ab8f1b1..a6a3ab8f1b1 100644 --- a/arch/arm/mach-mx5/eukrea_mbimx51-baseboard.c +++ b/arch/arm/mach-imx/eukrea_mbimx51-baseboard.c diff --git a/arch/arm/mach-mx5/eukrea_mbimxsd-baseboard.c b/arch/arm/mach-imx/eukrea_mbimxsd-baseboard.c index d817fc80b98..d817fc80b98 100644 --- a/arch/arm/mach-mx5/eukrea_mbimxsd-baseboard.c +++ b/arch/arm/mach-imx/eukrea_mbimxsd-baseboard.c diff --git a/arch/arm/mach-mx5/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c index e6bad17b908..e6bad17b908 100644 --- a/arch/arm/mach-mx5/imx51-dt.c +++ b/arch/arm/mach-imx/imx51-dt.c diff --git a/arch/arm/mach-mx5/imx53-dt.c b/arch/arm/mach-imx/imx53-dt.c index 05ebb3e6867..05ebb3e6867 100644 --- a/arch/arm/mach-mx5/imx53-dt.c +++ b/arch/arm/mach-imx/imx53-dt.c diff --git a/arch/arm/mach-mx5/board-cpuimx51.c b/arch/arm/mach-imx/mach-cpuimx51.c index 944025da833..944025da833 100644 --- a/arch/arm/mach-mx5/board-cpuimx51.c +++ b/arch/arm/mach-imx/mach-cpuimx51.c diff --git a/arch/arm/mach-mx5/board-cpuimx51sd.c b/arch/arm/mach-imx/mach-cpuimx51sd.c index 9fbe923c8b0..9fbe923c8b0 100644 --- a/arch/arm/mach-mx5/board-cpuimx51sd.c +++ b/arch/arm/mach-imx/mach-cpuimx51sd.c diff --git a/arch/arm/mach-mx5/board-mx50_rdp.c b/arch/arm/mach-imx/mach-mx50_rdp.c index 42b66e8d961..42b66e8d961 100644 --- a/arch/arm/mach-mx5/board-mx50_rdp.c +++ b/arch/arm/mach-imx/mach-mx50_rdp.c diff --git a/arch/arm/mach-mx5/board-mx51_3ds.c b/arch/arm/mach-imx/mach-mx51_3ds.c index 83eab4176ca..83eab4176ca 100644 --- a/arch/arm/mach-mx5/board-mx51_3ds.c +++ b/arch/arm/mach-imx/mach-mx51_3ds.c diff --git a/arch/arm/mach-mx5/board-mx51_babbage.c b/arch/arm/mach-imx/mach-mx51_babbage.c index e4b822e9f71..e4b822e9f71 100644 --- a/arch/arm/mach-mx5/board-mx51_babbage.c +++ b/arch/arm/mach-imx/mach-mx51_babbage.c diff --git a/arch/arm/mach-mx5/board-mx51_efikamx.c b/arch/arm/mach-imx/mach-mx51_efikamx.c index 3a5ed2dd885..3a5ed2dd885 100644 --- a/arch/arm/mach-mx5/board-mx51_efikamx.c +++ b/arch/arm/mach-imx/mach-mx51_efikamx.c diff --git a/arch/arm/mach-mx5/board-mx51_efikasb.c b/arch/arm/mach-imx/mach-mx51_efikasb.c index ea5f65b0381..ea5f65b0381 100644 --- a/arch/arm/mach-mx5/board-mx51_efikasb.c +++ b/arch/arm/mach-imx/mach-mx51_efikasb.c diff --git a/arch/arm/mach-mx5/board-mx53_ard.c b/arch/arm/mach-imx/mach-mx53_ard.c index 5f224f1c3eb..753f4fc9ec0 100644 --- a/arch/arm/mach-mx5/board-mx53_ard.c +++ b/arch/arm/mach-imx/mach-mx53_ard.c @@ -32,7 +32,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/time.h> -#include "crm_regs.h"  #include "devices-imx53.h"  #define ARD_ETHERNET_INT_B	IMX_GPIO_NR(2, 31) @@ -189,8 +188,10 @@ static int weim_cs_config(void)  		return -ENOMEM;  	iomuxc_base = ioremap(MX53_IOMUXC_BASE_ADDR, SZ_4K); -	if (!iomuxc_base) +	if (!iomuxc_base) { +		iounmap(weim_base);  		return -ENOMEM; +	}  	/* CS1 timings for LAN9220 */  	writel(0x20001, (weim_base + 0x18)); diff --git a/arch/arm/mach-mx5/board-mx53_evk.c b/arch/arm/mach-imx/mach-mx53_evk.c index d6ce137896d..5a72188b9cd 100644 --- a/arch/arm/mach-mx5/board-mx53_evk.c +++ b/arch/arm/mach-imx/mach-mx53_evk.c @@ -37,7 +37,6 @@  #define EVK_ECSPI1_CS1		IMX_GPIO_NR(3, 19)  #define MX53EVK_LED		IMX_GPIO_NR(7, 7) -#include "crm_regs.h"  #include "devices-imx53.h"  static iomux_v3_cfg_t mx53_evk_pads[] = { diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-imx/mach-mx53_loco.c index fd8b524e1c5..37f67cac15a 100644 --- a/arch/arm/mach-mx5/board-mx53_loco.c +++ b/arch/arm/mach-imx/mach-mx53_loco.c @@ -32,7 +32,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/time.h> -#include "crm_regs.h"  #include "devices-imx53.h"  #define MX53_LOCO_POWER			IMX_GPIO_NR(1, 8) diff --git a/arch/arm/mach-mx5/board-mx53_smd.c b/arch/arm/mach-imx/mach-mx53_smd.c index 22c53c9b18a..8e972c5c3e1 100644 --- a/arch/arm/mach-mx5/board-mx53_smd.c +++ b/arch/arm/mach-imx/mach-mx53_smd.c @@ -31,7 +31,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/time.h> -#include "crm_regs.h"  #include "devices-imx53.h"  #define SMD_FEC_PHY_RST		IMX_GPIO_NR(7, 6) diff --git a/arch/arm/mach-mx5/mm.c b/arch/arm/mach-imx/mm-imx5.c index bc17dfea381..bc17dfea381 100644 --- a/arch/arm/mach-mx5/mm.c +++ b/arch/arm/mach-imx/mm-imx5.c diff --git a/arch/arm/mach-mx5/mx51_efika.c b/arch/arm/mach-imx/mx51_efika.c index ec6ca91b299..ec6ca91b299 100644 --- a/arch/arm/mach-mx5/mx51_efika.c +++ b/arch/arm/mach-imx/mx51_efika.c diff --git a/arch/arm/mach-mx5/system.c b/arch/arm/mach-imx/pm-imx5.c index 5eebfaad122..6dc09344805 100644 --- a/arch/arm/mach-mx5/system.c +++ b/arch/arm/mach-imx/pm-imx5.c @@ -1,8 +1,6 @@  /* - * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved. - */ - -/* + *  Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved. + *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License   * Version 2 or later at the following locations: @@ -10,14 +8,22 @@   * http://www.opensource.org/licenses/gpl-license.html   * http://www.gnu.org/copyleft/gpl.html   */ -#include <linux/platform_device.h> +#include <linux/suspend.h> +#include <linux/clk.h>  #include <linux/io.h> -#include <mach/hardware.h> +#include <linux/err.h> +#include <asm/cacheflush.h> +#include <asm/tlbflush.h>  #include <mach/common.h> -#include "crm_regs.h" +#include <mach/hardware.h> +#include "crm-regs-imx5.h" + +static struct clk *gpc_dvfs_clk; -/* set cpu low power mode before WFI instruction. This function is called -  * mx5 because it can be used for mx50, mx51, and mx53.*/ +/* + * set cpu low power mode before WFI instruction. This function is called + * mx5 because it can be used for mx50, mx51, and mx53. + */  void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)  {  	u32 plat_lpc, arm_srpgcr, ccm_clpcr; @@ -80,3 +86,68 @@ void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)  		__raw_writel(empgc1, MXC_SRPG_EMPGC1_SRPGCR);  	}  } + +static int mx5_suspend_prepare(void) +{ +	return clk_enable(gpc_dvfs_clk); +} + +static int mx5_suspend_enter(suspend_state_t state) +{ +	switch (state) { +	case PM_SUSPEND_MEM: +		mx5_cpu_lp_set(STOP_POWER_OFF); +		break; +	case PM_SUSPEND_STANDBY: +		mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); +		break; +	default: +		return -EINVAL; +	} + +	if (state == PM_SUSPEND_MEM) { +		local_flush_tlb_all(); +		flush_cache_all(); + +		/*clear the EMPGC0/1 bits */ +		__raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR); +		__raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR); +	} +	cpu_do_idle(); +	return 0; +} + +static void mx5_suspend_finish(void) +{ +	clk_disable(gpc_dvfs_clk); +} + +static int mx5_pm_valid(suspend_state_t state) +{ +	return (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX); +} + +static const struct platform_suspend_ops mx5_suspend_ops = { +	.valid = mx5_pm_valid, +	.prepare = mx5_suspend_prepare, +	.enter = mx5_suspend_enter, +	.finish = mx5_suspend_finish, +}; + +static int __init mx5_pm_init(void) +{ +	if (!cpu_is_mx51() && !cpu_is_mx53()) +		return 0; + +	if (gpc_dvfs_clk == NULL) +		gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); + +	if (!IS_ERR(gpc_dvfs_clk)) { +		if (cpu_is_mx51()) +			suspend_set_ops(&mx5_suspend_ops); +	} else +		return -EPERM; + +	return 0; +} +device_initcall(mx5_pm_init); diff --git a/arch/arm/mach-imx/src.c b/arch/arm/mach-imx/src.c index 29bd1243781..e15f1555c59 100644 --- a/arch/arm/mach-imx/src.c +++ b/arch/arm/mach-imx/src.c @@ -15,6 +15,7 @@  #include <linux/of.h>  #include <linux/of_address.h>  #include <linux/smp.h> +#include <asm/smp_plat.h>  #define SRC_SCR				0x000  #define SRC_GPR1			0x020 @@ -24,10 +25,6 @@  static void __iomem *src_base; -#ifndef CONFIG_SMP -#define cpu_logical_map(cpu)		0 -#endif -  void imx_enable_cpu(int cpu, bool enable)  {  	u32 mask, val; diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index cc15426787b..77d4852e19f 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c @@ -27,6 +27,7 @@  #include <plat/cache-feroceon-l2.h>  #include <plat/mvsdio.h>  #include <plat/orion_nand.h> +#include <plat/ehci-orion.h>  #include <plat/common.h>  #include <plat/time.h>  #include <plat/addr-map.h> @@ -73,7 +74,7 @@ unsigned int kirkwood_clk_ctrl = CGC_DUNIT | CGC_RESERVED;  void __init kirkwood_ehci_init(void)  {  	kirkwood_clk_ctrl |= CGC_USB0; -	orion_ehci_init(USB_PHYS_BASE, IRQ_KIRKWOOD_USB); +	orion_ehci_init(USB_PHYS_BASE, IRQ_KIRKWOOD_USB, EHCI_PHY_NA);  } diff --git a/arch/arm/mach-kirkwood/mpp.h b/arch/arm/mach-kirkwood/mpp.h index e8fda45c073..d5a0d1da2e0 100644 --- a/arch/arm/mach-kirkwood/mpp.h +++ b/arch/arm/mach-kirkwood/mpp.h @@ -31,314 +31,314 @@  #define MPP_F6282_MASK		MPP(  0, 0x0, 0, 0, 0,   0,   0,   0,   1 )  #define MPP0_GPIO		MPP(  0, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP0_NF_IO2		MPP(  0, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP0_SPI_SCn		MPP(  0, 0x2, 0, 1, 1,   1,   1,   1,   1 ) +#define MPP0_NF_IO2		MPP(  0, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP0_SPI_SCn		MPP(  0, 0x2, 0, 0, 1,   1,   1,   1,   1 )  #define MPP1_GPO		MPP(  1, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP1_NF_IO3		MPP(  1, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP1_SPI_MOSI		MPP(  1, 0x2, 0, 1, 1,   1,   1,   1,   1 ) +#define MPP1_NF_IO3		MPP(  1, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP1_SPI_MOSI		MPP(  1, 0x2, 0, 0, 1,   1,   1,   1,   1 )  #define MPP2_GPO		MPP(  2, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP2_NF_IO4		MPP(  2, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP2_SPI_SCK		MPP(  2, 0x2, 0, 1, 1,   1,   1,   1,   1 ) +#define MPP2_NF_IO4		MPP(  2, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP2_SPI_SCK		MPP(  2, 0x2, 0, 0, 1,   1,   1,   1,   1 )  #define MPP3_GPO		MPP(  3, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP3_NF_IO5		MPP(  3, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP3_SPI_MISO		MPP(  3, 0x2, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP3_NF_IO5		MPP(  3, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP3_SPI_MISO		MPP(  3, 0x2, 0, 0, 1,   1,   1,   1,   1 )  #define MPP4_GPIO		MPP(  4, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP4_NF_IO6		MPP(  4, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP4_UART0_RXD		MPP(  4, 0x2, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP4_SATA1_ACTn		MPP(  4, 0x5, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP4_NF_IO6		MPP(  4, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP4_UART0_RXD		MPP(  4, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP4_SATA1_ACTn		MPP(  4, 0x5, 0, 0, 0,   0,   1,   1,   1 )  #define MPP4_LCD_VGA_HSYNC	MPP(  4, 0xb, 0, 0, 0,   0,   0,   0,   1 ) -#define MPP4_PTP_CLK		MPP(  4, 0xd, 1, 0, 1,   1,   1,   1,   0 ) +#define MPP4_PTP_CLK		MPP(  4, 0xd, 0, 0, 1,   1,   1,   1,   0 )  #define MPP5_GPO		MPP(  5, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP5_NF_IO7		MPP(  5, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP5_UART0_TXD		MPP(  5, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP5_PTP_TRIG_GEN	MPP(  5, 0x4, 0, 1, 1,   1,   1,   1,   0 ) -#define MPP5_SATA0_ACTn		MPP(  5, 0x5, 0, 1, 0,   1,   1,   1,   1 ) +#define MPP5_NF_IO7		MPP(  5, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP5_UART0_TXD		MPP(  5, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP5_PTP_TRIG_GEN	MPP(  5, 0x4, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP5_SATA0_ACTn		MPP(  5, 0x5, 0, 0, 0,   1,   1,   1,   1 )  #define MPP5_LCD_VGA_VSYNC	MPP(  5, 0xb, 0, 0, 0,   0,   0,   0,   1 ) -#define MPP6_SYSRST_OUTn	MPP(  6, 0x1, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP6_SPI_MOSI		MPP(  6, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP6_PTP_TRIG_GEN	MPP(  6, 0x3, 0, 1, 1,   1,   1,   1,   0 ) +#define MPP6_SYSRST_OUTn	MPP(  6, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP6_SPI_MOSI		MPP(  6, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP6_PTP_TRIG_GEN	MPP(  6, 0x3, 0, 0, 1,   1,   1,   1,   0 )  #define MPP7_GPO		MPP(  7, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP7_PEX_RST_OUTn	MPP(  7, 0x1, 0, 1, 1,   1,   1,   1,   0 ) -#define MPP7_SPI_SCn		MPP(  7, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP7_PTP_TRIG_GEN	MPP(  7, 0x3, 0, 1, 1,   1,   1,   1,   0 ) -#define MPP7_LCD_PWM		MPP(  7, 0xb, 0, 1, 0,   0,   0,   0,   1 ) +#define MPP7_PEX_RST_OUTn	MPP(  7, 0x1, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP7_SPI_SCn		MPP(  7, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP7_PTP_TRIG_GEN	MPP(  7, 0x3, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP7_LCD_PWM		MPP(  7, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP8_GPIO		MPP(  8, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP8_TW0_SDA		MPP(  8, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP8_UART0_RTS		MPP(  8, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP8_UART1_RTS		MPP(  8, 0x3, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP8_MII0_RXERR		MPP(  8, 0x4, 1, 0, 0,   1,   1,   1,   1 ) -#define MPP8_SATA1_PRESENTn	MPP(  8, 0x5, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP8_PTP_CLK		MPP(  8, 0xc, 1, 0, 1,   1,   1,   1,   0 ) -#define MPP8_MII0_COL		MPP(  8, 0xd, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP8_TW0_SDA		MPP(  8, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP8_UART0_RTS		MPP(  8, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP8_UART1_RTS		MPP(  8, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP8_MII0_RXERR		MPP(  8, 0x4, 0, 0, 0,   1,   1,   1,   1 ) +#define MPP8_SATA1_PRESENTn	MPP(  8, 0x5, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP8_PTP_CLK		MPP(  8, 0xc, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP8_MII0_COL		MPP(  8, 0xd, 0, 0, 1,   1,   1,   1,   1 )  #define MPP9_GPIO		MPP(  9, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP9_TW0_SCK		MPP(  9, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP9_UART0_CTS		MPP(  9, 0x2, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP9_UART1_CTS		MPP(  9, 0x3, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP9_SATA0_PRESENTn	MPP(  9, 0x5, 0, 1, 0,   1,   1,   1,   1 ) -#define MPP9_PTP_EVENT_REQ	MPP(  9, 0xc, 1, 0, 1,   1,   1,   1,   0 ) -#define MPP9_MII0_CRS		MPP(  9, 0xd, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP9_TW0_SCK		MPP(  9, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP9_UART0_CTS		MPP(  9, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP9_UART1_CTS		MPP(  9, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP9_SATA0_PRESENTn	MPP(  9, 0x5, 0, 0, 0,   1,   1,   1,   1 ) +#define MPP9_PTP_EVENT_REQ	MPP(  9, 0xc, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP9_MII0_CRS		MPP(  9, 0xd, 0, 0, 1,   1,   1,   1,   1 )  #define MPP10_GPO		MPP( 10, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP10_SPI_SCK		MPP( 10, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP10_UART0_TXD		MPP( 10, 0X3, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP10_SATA1_ACTn	MPP( 10, 0x5, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP10_PTP_TRIG_GEN	MPP( 10, 0xc, 0, 1, 1,   1,   1,   1,   0 ) +#define MPP10_SPI_SCK		MPP( 10, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP10_UART0_TXD		MPP( 10, 0X3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP10_SATA1_ACTn	MPP( 10, 0x5, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP10_PTP_TRIG_GEN	MPP( 10, 0xc, 0, 0, 1,   1,   1,   1,   0 )  #define MPP11_GPIO		MPP( 11, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP11_SPI_MISO		MPP( 11, 0x2, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP11_UART0_RXD		MPP( 11, 0x3, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP11_PTP_EVENT_REQ	MPP( 11, 0x4, 1, 0, 1,   1,   1,   1,   0 ) -#define MPP11_PTP_TRIG_GEN	MPP( 11, 0xc, 0, 1, 1,   1,   1,   1,   0 ) -#define MPP11_PTP_CLK		MPP( 11, 0xd, 1, 0, 1,   1,   1,   1,   0 ) -#define MPP11_SATA0_ACTn	MPP( 11, 0x5, 0, 1, 0,   1,   1,   1,   1 ) +#define MPP11_SPI_MISO		MPP( 11, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP11_UART0_RXD		MPP( 11, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP11_PTP_EVENT_REQ	MPP( 11, 0x4, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP11_PTP_TRIG_GEN	MPP( 11, 0xc, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP11_PTP_CLK		MPP( 11, 0xd, 0, 0, 1,   1,   1,   1,   0 ) +#define MPP11_SATA0_ACTn	MPP( 11, 0x5, 0, 0, 0,   1,   1,   1,   1 )  #define MPP12_GPO		MPP( 12, 0x0, 0, 1, 1,   1,   1,   1,   1 )  #define MPP12_GPIO		MPP( 12, 0x0, 1, 1, 0,   0,   0,   1,   0 ) -#define MPP12_SD_CLK		MPP( 12, 0x1, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP12_AU_SPDIF0		MPP( 12, 0xa, 0, 1, 0,   0,   0,   0,   1 ) -#define MPP12_SPI_MOSI		MPP( 12, 0xb, 0, 1, 0,   0,   0,   0,   1 ) -#define MPP12_TW1_SDA		MPP( 12, 0xd, 1, 0, 0,   0,   0,   0,   1 ) +#define MPP12_SD_CLK		MPP( 12, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP12_AU_SPDIF0		MPP( 12, 0xa, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP12_SPI_MOSI		MPP( 12, 0xb, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP12_TW1_SDA		MPP( 12, 0xd, 0, 0, 0,   0,   0,   0,   1 )  #define MPP13_GPIO		MPP( 13, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP13_SD_CMD		MPP( 13, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP13_UART1_TXD		MPP( 13, 0x3, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP13_AU_SPDIFRMCLK	MPP( 13, 0xa, 0, 1, 0,   0,   0,   0,   1 ) -#define MPP13_LCDPWM		MPP( 13, 0xb, 0, 1, 0,   0,   0,   0,   1 ) +#define MPP13_SD_CMD		MPP( 13, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP13_UART1_TXD		MPP( 13, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP13_AU_SPDIFRMCLK	MPP( 13, 0xa, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP13_LCDPWM		MPP( 13, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP14_GPIO		MPP( 14, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP14_SD_D0		MPP( 14, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP14_UART1_RXD		MPP( 14, 0x3, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP14_SATA1_PRESENTn	MPP( 14, 0x4, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP14_AU_SPDIFI		MPP( 14, 0xa, 1, 0, 0,   0,   0,   0,   1 ) -#define MPP14_AU_I2SDI		MPP( 14, 0xb, 1, 0, 0,   0,   0,   0,   1 ) -#define MPP14_MII0_COL		MPP( 14, 0xd, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP14_SD_D0		MPP( 14, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP14_UART1_RXD		MPP( 14, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP14_SATA1_PRESENTn	MPP( 14, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP14_AU_SPDIFI		MPP( 14, 0xa, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP14_AU_I2SDI		MPP( 14, 0xb, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP14_MII0_COL		MPP( 14, 0xd, 0, 0, 1,   1,   1,   1,   1 )  #define MPP15_GPIO		MPP( 15, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP15_SD_D1		MPP( 15, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP15_UART0_RTS		MPP( 15, 0x2, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP15_UART1_TXD		MPP( 15, 0x3, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP15_SATA0_ACTn	MPP( 15, 0x4, 0, 1, 0,   1,   1,   1,   1 ) -#define MPP15_SPI_CSn		MPP( 15, 0xb, 0, 1, 0,   0,   0,   0,   1 ) +#define MPP15_SD_D1		MPP( 15, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP15_UART0_RTS		MPP( 15, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP15_UART1_TXD		MPP( 15, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP15_SATA0_ACTn	MPP( 15, 0x4, 0, 0, 0,   1,   1,   1,   1 ) +#define MPP15_SPI_CSn		MPP( 15, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP16_GPIO		MPP( 16, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP16_SD_D2		MPP( 16, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP16_UART0_CTS		MPP( 16, 0x2, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP16_UART1_RXD		MPP( 16, 0x3, 1, 0, 1,   1,   1,   1,   1 ) -#define MPP16_SATA1_ACTn	MPP( 16, 0x4, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP16_LCD_EXT_REF_CLK	MPP( 16, 0xb, 1, 0, 0,   0,   0,   0,   1 ) -#define MPP16_MII0_CRS		MPP( 16, 0xd, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP16_SD_D2		MPP( 16, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP16_UART0_CTS		MPP( 16, 0x2, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP16_UART1_RXD		MPP( 16, 0x3, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP16_SATA1_ACTn	MPP( 16, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP16_LCD_EXT_REF_CLK	MPP( 16, 0xb, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP16_MII0_CRS		MPP( 16, 0xd, 0, 0, 1,   1,   1,   1,   1 )  #define MPP17_GPIO		MPP( 17, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP17_SD_D3		MPP( 17, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP17_SATA0_PRESENTn	MPP( 17, 0x4, 0, 1, 0,   1,   1,   1,   1 ) -#define MPP17_SATA1_ACTn	MPP( 17, 0xa, 0, 1, 0,   0,   0,   0,   1 ) -#define MPP17_TW1_SCK		MPP( 17, 0xd, 1, 1, 0,   0,   0,   0,   1 ) +#define MPP17_SD_D3		MPP( 17, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP17_SATA0_PRESENTn	MPP( 17, 0x4, 0, 0, 0,   1,   1,   1,   1 ) +#define MPP17_SATA1_ACTn	MPP( 17, 0xa, 0, 0, 0,   0,   0,   0,   1 ) +#define MPP17_TW1_SCK		MPP( 17, 0xd, 0, 0, 0,   0,   0,   0,   1 )  #define MPP18_GPO		MPP( 18, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP18_NF_IO0		MPP( 18, 0x1, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP18_PEX0_CLKREQ	MPP( 18, 0x2, 0, 1, 0,   0,   0,   0,   1 ) +#define MPP18_NF_IO0		MPP( 18, 0x1, 0, 0, 1,   1,   1,   1,   1 ) +#define MPP18_PEX0_CLKREQ	MPP( 18, 0x2, 0, 0, 0,   0,   0,   0,   1 )  #define MPP19_GPO		MPP( 19, 0x0, 0, 1, 1,   1,   1,   1,   1 ) -#define MPP19_NF_IO1		MPP( 19, 0x1, 1, 1, 1,   1,   1,   1,   1 ) +#define MPP19_NF_IO1		MPP( 19, 0x1, 0, 0, 1,   1,   1,   1,   1 )  #define MPP20_GPIO		MPP( 20, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP20_TSMP0		MPP( 20, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP20_TDM_CH0_TX_QL	MPP( 20, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP20_TSMP0		MPP( 20, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP20_TDM_CH0_TX_QL	MPP( 20, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP20_GE1_TXD0		MPP( 20, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP20_AU_SPDIFI		MPP( 20, 0x4, 1, 0, 0,   0,   1,   1,   1 ) -#define MPP20_SATA1_ACTn	MPP( 20, 0x5, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP20_AU_SPDIFI		MPP( 20, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP20_SATA1_ACTn	MPP( 20, 0x5, 0, 0, 0,   0,   1,   1,   1 )  #define MPP20_LCD_D0		MPP( 20, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP21_GPIO		MPP( 21, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP21_TSMP1		MPP( 21, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP21_TDM_CH0_RX_QL	MPP( 21, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP21_TSMP1		MPP( 21, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP21_TDM_CH0_RX_QL	MPP( 21, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP21_GE1_TXD1		MPP( 21, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP21_AU_SPDIFO		MPP( 21, 0x4, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP21_SATA0_ACTn	MPP( 21, 0x5, 0, 1, 0,   1,   1,   1,   1 ) +#define MPP21_AU_SPDIFO		MPP( 21, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP21_SATA0_ACTn	MPP( 21, 0x5, 0, 0, 0,   1,   1,   1,   1 )  #define MPP21_LCD_D1		MPP( 21, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP22_GPIO		MPP( 22, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP22_TSMP2		MPP( 22, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP22_TDM_CH2_TX_QL	MPP( 22, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP22_TSMP2		MPP( 22, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP22_TDM_CH2_TX_QL	MPP( 22, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP22_GE1_TXD2		MPP( 22, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP22_AU_SPDIFRMKCLK	MPP( 22, 0x4, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP22_SATA1_PRESENTn	MPP( 22, 0x5, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP22_AU_SPDIFRMKCLK	MPP( 22, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP22_SATA1_PRESENTn	MPP( 22, 0x5, 0, 0, 0,   0,   1,   1,   1 )  #define MPP22_LCD_D2		MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP23_GPIO		MPP( 23, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP23_TSMP3		MPP( 23, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP23_TDM_CH2_RX_QL	MPP( 23, 0x2, 1, 0, 0,   0,   1,   1,   1 ) +#define MPP23_TSMP3		MPP( 23, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP23_TDM_CH2_RX_QL	MPP( 23, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP23_GE1_TXD3		MPP( 23, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP23_AU_I2SBCLK	MPP( 23, 0x4, 0, 1, 0,   0,   1,   1,   1 ) -#define MPP23_SATA0_PRESENTn	MPP( 23, 0x5, 0, 1, 0,   1,   1,   1,   1 ) +#define MPP23_AU_I2SBCLK	MPP( 23, 0x4, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP23_SATA0_PRESENTn	MPP( 23, 0x5, 0, 0, 0,   1,   1,   1,   1 )  #define MPP23_LCD_D3		MPP( 23, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP24_GPIO		MPP( 24, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP24_TSMP4		MPP( 24, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP24_TDM_SPI_CS0	MPP( 24, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP24_TSMP4		MPP( 24, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP24_TDM_SPI_CS0	MPP( 24, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP24_GE1_RXD0		MPP( 24, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP24_AU_I2SDO		MPP( 24, 0x4, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP24_AU_I2SDO		MPP( 24, 0x4, 0, 0, 0,   0,   1,   1,   1 )  #define MPP24_LCD_D4		MPP( 24, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP25_GPIO		MPP( 25, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP25_TSMP5		MPP( 25, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP25_TDM_SPI_SCK	MPP( 25, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP25_TSMP5		MPP( 25, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP25_TDM_SPI_SCK	MPP( 25, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP25_GE1_RXD1		MPP( 25, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP25_AU_I2SLRCLK	MPP( 25, 0x4, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP25_AU_I2SLRCLK	MPP( 25, 0x4, 0, 0, 0,   0,   1,   1,   1 )  #define MPP25_LCD_D5		MPP( 25, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP26_GPIO		MPP( 26, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP26_TSMP6		MPP( 26, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP26_TDM_SPI_MISO	MPP( 26, 0x2, 1, 0, 0,   0,   1,   1,   1 ) +#define MPP26_TSMP6		MPP( 26, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP26_TDM_SPI_MISO	MPP( 26, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP26_GE1_RXD2		MPP( 26, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP26_AU_I2SMCLK	MPP( 26, 0x4, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP26_AU_I2SMCLK	MPP( 26, 0x4, 0, 0, 0,   0,   1,   1,   1 )  #define MPP26_LCD_D6		MPP( 26, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP27_GPIO		MPP( 27, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP27_TSMP7		MPP( 27, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP27_TDM_SPI_MOSI	MPP( 27, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP27_TSMP7		MPP( 27, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP27_TDM_SPI_MOSI	MPP( 27, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP27_GE1_RXD3		MPP( 27, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP27_AU_I2SDI		MPP( 27, 0x4, 1, 0, 0,   0,   1,   1,   1 ) +#define MPP27_AU_I2SDI		MPP( 27, 0x4, 0, 0, 0,   0,   1,   1,   1 )  #define MPP27_LCD_D7		MPP( 27, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP28_GPIO		MPP( 28, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP28_TSMP8		MPP( 28, 0x1, 1, 1, 0,   0,   1,   1,   1 ) +#define MPP28_TSMP8		MPP( 28, 0x1, 0, 0, 0,   0,   1,   1,   1 )  #define MPP28_TDM_CODEC_INTn	MPP( 28, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP28_GE1_COL		MPP( 28, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP28_AU_EXTCLK		MPP( 28, 0x4, 1, 0, 0,   0,   1,   1,   1 ) +#define MPP28_AU_EXTCLK		MPP( 28, 0x4, 0, 0, 0,   0,   1,   1,   1 )  #define MPP28_LCD_D8		MPP( 28, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP29_GPIO		MPP( 29, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP29_TSMP9		MPP( 29, 0x1, 1, 1, 0,   0,   1,   1,   1 ) +#define MPP29_TSMP9		MPP( 29, 0x1, 0, 0, 0,   0,   1,   1,   1 )  #define MPP29_TDM_CODEC_RSTn	MPP( 29, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP29_GE1_TCLK		MPP( 29, 0x3, 0, 0, 0,   1,   1,   1,   1 )  #define MPP29_LCD_D9		MPP( 29, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP30_GPIO		MPP( 30, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP30_TSMP10		MPP( 30, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP30_TDM_PCLK		MPP( 30, 0x2, 1, 1, 0,   0,   1,   1,   1 ) +#define MPP30_TSMP10		MPP( 30, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP30_TDM_PCLK		MPP( 30, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP30_GE1_RXCTL		MPP( 30, 0x3, 0, 0, 0,   1,   1,   1,   1 )  #define MPP30_LCD_D10		MPP( 30, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP31_GPIO		MPP( 31, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP31_TSMP11		MPP( 31, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP31_TDM_FS		MPP( 31, 0x2, 1, 1, 0,   0,   1,   1,   1 ) +#define MPP31_TSMP11		MPP( 31, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP31_TDM_FS		MPP( 31, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP31_GE1_RXCLK		MPP( 31, 0x3, 0, 0, 0,   1,   1,   1,   1 )  #define MPP31_LCD_D11		MPP( 31, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP32_GPIO		MPP( 32, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP32_TSMP12		MPP( 32, 0x1, 1, 1, 0,   0,   1,   1,   1 ) -#define MPP32_TDM_DRX		MPP( 32, 0x2, 1, 0, 0,   0,   1,   1,   1 ) +#define MPP32_TSMP12		MPP( 32, 0x1, 0, 0, 0,   0,   1,   1,   1 ) +#define MPP32_TDM_DRX		MPP( 32, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP32_GE1_TCLKOUT	MPP( 32, 0x3, 0, 0, 0,   1,   1,   1,   1 )  #define MPP32_LCD_D12		MPP( 32, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP33_GPO		MPP( 33, 0x0, 0, 1, 0,   1,   1,   1,   1 ) -#define MPP33_TDM_DTX		MPP( 33, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP33_TDM_DTX		MPP( 33, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP33_GE1_TXCTL		MPP( 33, 0x3, 0, 0, 0,   1,   1,   1,   1 )  #define MPP33_LCD_D13		MPP( 33, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP34_GPIO		MPP( 34, 0x0, 1, 1, 0,   1,   1,   1,   1 ) -#define MPP34_TDM_SPI_CS1	MPP( 34, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP34_TDM_SPI_CS1	MPP( 34, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP34_GE1_TXEN		MPP( 34, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP34_SATA1_ACTn	MPP( 34, 0x5, 0, 1, 0,   0,   0,   1,   1 ) +#define MPP34_SATA1_ACTn	MPP( 34, 0x5, 0, 0, 0,   0,   0,   1,   1 )  #define MPP34_LCD_D14		MPP( 34, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP35_GPIO		MPP( 35, 0x0, 1, 1, 1,   1,   1,   1,   1 ) -#define MPP35_TDM_CH0_TX_QL	MPP( 35, 0x2, 0, 1, 0,   0,   1,   1,   1 ) +#define MPP35_TDM_CH0_TX_QL	MPP( 35, 0x2, 0, 0, 0,   0,   1,   1,   1 )  #define MPP35_GE1_RXERR		MPP( 35, 0x3, 0, 0, 0,   1,   1,   1,   1 ) -#define MPP35_SATA0_ACTn	MPP( 35, 0x5, 0, 1, 0,   1,   1,   1,   1 ) +#define MPP35_SATA0_ACTn	MPP( 35, 0x5, 0, 0, 0,   1,   1,   1,   1 )  #define MPP35_LCD_D15		MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 ) -#define MPP35_MII0_RXERR	MPP( 35, 0xc, 1, 0, 1,   1,   1,   1,   1 ) +#define MPP35_MII0_RXERR	MPP( 35, 0xc, 0, 0, 1,   1,   1,   1,   1 )  #define MPP36_GPIO		MPP( 36, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP36_TSMP0		MPP( 36, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP36_TDM_SPI_CS1	MPP( 36, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP36_AU_SPDIFI		MPP( 36, 0x4, 1, 0, 1,   0,   0,   1,   1 ) -#define MPP36_TW1_SDA		MPP( 36, 0xb, 1, 1, 0,   0,   0,   0,   1 ) +#define MPP36_TSMP0		MPP( 36, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP36_TDM_SPI_CS1	MPP( 36, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP36_AU_SPDIFI		MPP( 36, 0x4, 0, 0, 1,   0,   0,   1,   1 ) +#define MPP36_TW1_SDA		MPP( 36, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP37_GPIO		MPP( 37, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP37_TSMP1		MPP( 37, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP37_TDM_CH2_TX_QL	MPP( 37, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP37_AU_SPDIFO		MPP( 37, 0x4, 0, 1, 1,   0,   0,   1,   1 ) -#define MPP37_TW1_SCK		MPP( 37, 0xb, 1, 1, 0,   0,   0,   0,   1 ) +#define MPP37_TSMP1		MPP( 37, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP37_TDM_CH2_TX_QL	MPP( 37, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP37_AU_SPDIFO		MPP( 37, 0x4, 0, 0, 1,   0,   0,   1,   1 ) +#define MPP37_TW1_SCK		MPP( 37, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP38_GPIO		MPP( 38, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP38_TSMP2		MPP( 38, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP38_TDM_CH2_RX_QL	MPP( 38, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP38_AU_SPDIFRMLCLK	MPP( 38, 0x4, 0, 1, 1,   0,   0,   1,   1 ) +#define MPP38_TSMP2		MPP( 38, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP38_TDM_CH2_RX_QL	MPP( 38, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP38_AU_SPDIFRMLCLK	MPP( 38, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP38_LCD_D18		MPP( 38, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP39_GPIO		MPP( 39, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP39_TSMP3		MPP( 39, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP39_TDM_SPI_CS0	MPP( 39, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP39_AU_I2SBCLK	MPP( 39, 0x4, 0, 1, 1,   0,   0,   1,   1 ) +#define MPP39_TSMP3		MPP( 39, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP39_TDM_SPI_CS0	MPP( 39, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP39_AU_I2SBCLK	MPP( 39, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP39_LCD_D19		MPP( 39, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP40_GPIO		MPP( 40, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP40_TSMP4		MPP( 40, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP40_TDM_SPI_SCK	MPP( 40, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP40_AU_I2SDO		MPP( 40, 0x4, 0, 1, 1,   0,   0,   1,   1 ) +#define MPP40_TSMP4		MPP( 40, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP40_TDM_SPI_SCK	MPP( 40, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP40_AU_I2SDO		MPP( 40, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP40_LCD_D20		MPP( 40, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP41_GPIO		MPP( 41, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP41_TSMP5		MPP( 41, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP41_TDM_SPI_MISO	MPP( 41, 0x2, 1, 0, 0,   0,   0,   1,   1 ) -#define MPP41_AU_I2SLRCLK	MPP( 41, 0x4, 0, 1, 1,   0,   0,   1,   1 ) +#define MPP41_TSMP5		MPP( 41, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP41_TDM_SPI_MISO	MPP( 41, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP41_AU_I2SLRCLK	MPP( 41, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP41_LCD_D21		MPP( 41, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP42_GPIO		MPP( 42, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP42_TSMP6		MPP( 42, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP42_TDM_SPI_MOSI	MPP( 42, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP42_AU_I2SMCLK	MPP( 42, 0x4, 0, 1, 1,   0,   0,   1,   1 ) +#define MPP42_TSMP6		MPP( 42, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP42_TDM_SPI_MOSI	MPP( 42, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP42_AU_I2SMCLK	MPP( 42, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP42_LCD_D22		MPP( 42, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP43_GPIO		MPP( 43, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP43_TSMP7		MPP( 43, 0x1, 1, 1, 0,   0,   0,   1,   1 ) +#define MPP43_TSMP7		MPP( 43, 0x1, 0, 0, 0,   0,   0,   1,   1 )  #define MPP43_TDM_CODEC_INTn	MPP( 43, 0x2, 0, 0, 0,   0,   0,   1,   1 ) -#define MPP43_AU_I2SDI		MPP( 43, 0x4, 1, 0, 1,   0,   0,   1,   1 ) +#define MPP43_AU_I2SDI		MPP( 43, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP43_LCD_D23		MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP44_GPIO		MPP( 44, 0x0, 1, 1, 1,   0,   0,   1,   1 ) -#define MPP44_TSMP8		MPP( 44, 0x1, 1, 1, 0,   0,   0,   1,   1 ) +#define MPP44_TSMP8		MPP( 44, 0x1, 0, 0, 0,   0,   0,   1,   1 )  #define MPP44_TDM_CODEC_RSTn	MPP( 44, 0x2, 0, 0, 0,   0,   0,   1,   1 ) -#define MPP44_AU_EXTCLK		MPP( 44, 0x4, 1, 0, 1,   0,   0,   1,   1 ) +#define MPP44_AU_EXTCLK		MPP( 44, 0x4, 0, 0, 1,   0,   0,   1,   1 )  #define MPP44_LCD_CLK		MPP( 44, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP45_GPIO		MPP( 45, 0x0, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP45_TSMP9		MPP( 45, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP45_TDM_PCLK		MPP( 45, 0x2, 1, 1, 0,   0,   0,   1,   1 ) +#define MPP45_TSMP9		MPP( 45, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP45_TDM_PCLK		MPP( 45, 0x2, 0, 0, 0,   0,   0,   1,   1 )  #define MPP245_LCD_E		MPP( 45, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP46_GPIO		MPP( 46, 0x0, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP46_TSMP10		MPP( 46, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP46_TDM_FS		MPP( 46, 0x2, 1, 1, 0,   0,   0,   1,   1 ) +#define MPP46_TSMP10		MPP( 46, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP46_TDM_FS		MPP( 46, 0x2, 0, 0, 0,   0,   0,   1,   1 )  #define MPP46_LCD_HSYNC		MPP( 46, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP47_GPIO		MPP( 47, 0x0, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP47_TSMP11		MPP( 47, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP47_TDM_DRX		MPP( 47, 0x2, 1, 0, 0,   0,   0,   1,   1 ) +#define MPP47_TSMP11		MPP( 47, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP47_TDM_DRX		MPP( 47, 0x2, 0, 0, 0,   0,   0,   1,   1 )  #define MPP47_LCD_VSYNC		MPP( 47, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP48_GPIO		MPP( 48, 0x0, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP48_TSMP12		MPP( 48, 0x1, 1, 1, 0,   0,   0,   1,   1 ) -#define MPP48_TDM_DTX		MPP( 48, 0x2, 0, 1, 0,   0,   0,   1,   1 ) +#define MPP48_TSMP12		MPP( 48, 0x1, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP48_TDM_DTX		MPP( 48, 0x2, 0, 0, 0,   0,   0,   1,   1 )  #define MPP48_LCD_D16		MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP49_GPIO		MPP( 49, 0x0, 1, 1, 0,   0,   0,   1,   0 )  #define MPP49_GPO		MPP( 49, 0x0, 0, 1, 0,   0,   0,   0,   1 ) -#define MPP49_TSMP9		MPP( 49, 0x1, 1, 1, 0,   0,   0,   1,   0 ) -#define MPP49_TDM_CH0_RX_QL	MPP( 49, 0x2, 0, 1, 0,   0,   0,   1,   1 ) -#define MPP49_PTP_CLK		MPP( 49, 0x5, 1, 0, 0,   0,   0,   1,   0 ) -#define MPP49_PEX0_CLKREQ	MPP( 49, 0xa, 0, 1, 0,   0,   0,   0,   1 ) +#define MPP49_TSMP9		MPP( 49, 0x1, 0, 0, 0,   0,   0,   1,   0 ) +#define MPP49_TDM_CH0_RX_QL	MPP( 49, 0x2, 0, 0, 0,   0,   0,   1,   1 ) +#define MPP49_PTP_CLK		MPP( 49, 0x5, 0, 0, 0,   0,   0,   1,   0 ) +#define MPP49_PEX0_CLKREQ	MPP( 49, 0xa, 0, 0, 0,   0,   0,   0,   1 )  #define MPP49_LCD_D17		MPP( 49, 0xb, 0, 0, 0,   0,   0,   0,   1 )  #define MPP_MAX			49 diff --git a/arch/arm/mach-lpc32xx/include/mach/irqs.h b/arch/arm/mach-lpc32xx/include/mach/irqs.h index 2667f52e3b0..9e3b90df32e 100644 --- a/arch/arm/mach-lpc32xx/include/mach/irqs.h +++ b/arch/arm/mach-lpc32xx/include/mach/irqs.h @@ -61,7 +61,7 @@   */  #define IRQ_LPC32XX_JTAG_COMM_TX	LPC32XX_SIC1_IRQ(1)  #define IRQ_LPC32XX_JTAG_COMM_RX	LPC32XX_SIC1_IRQ(2) -#define IRQ_LPC32XX_GPI_11		LPC32XX_SIC1_IRQ(4) +#define IRQ_LPC32XX_GPI_28		LPC32XX_SIC1_IRQ(4)  #define IRQ_LPC32XX_TS_P		LPC32XX_SIC1_IRQ(6)  #define IRQ_LPC32XX_TS_IRQ		LPC32XX_SIC1_IRQ(7)  #define IRQ_LPC32XX_TS_AUX		LPC32XX_SIC1_IRQ(8) diff --git a/arch/arm/mach-lpc32xx/irq.c b/arch/arm/mach-lpc32xx/irq.c index 4eae566dfdc..c74de01ab5b 100644 --- a/arch/arm/mach-lpc32xx/irq.c +++ b/arch/arm/mach-lpc32xx/irq.c @@ -118,6 +118,10 @@ static const struct lpc32xx_event_info lpc32xx_events[NR_IRQS] = {  		.event_group = &lpc32xx_event_pin_regs,  		.mask = LPC32XX_CLKPWR_EXTSRC_GPI_06_BIT,  	}, +	[IRQ_LPC32XX_GPI_28] = { +		.event_group = &lpc32xx_event_pin_regs, +		.mask = LPC32XX_CLKPWR_EXTSRC_GPI_28_BIT, +	},  	[IRQ_LPC32XX_GPIO_00] = {  		.event_group = &lpc32xx_event_int_regs,  		.mask = LPC32XX_CLKPWR_INTSRC_GPIO_00_BIT, @@ -305,9 +309,18 @@ static int lpc32xx_irq_wake(struct irq_data *d, unsigned int state)  		if (state)  			eventreg |= lpc32xx_events[d->irq].mask; -		else +		else {  			eventreg &= ~lpc32xx_events[d->irq].mask; +			/* +			 * When disabling the wakeup, clear the latched +			 * event +			 */ +			__raw_writel(lpc32xx_events[d->irq].mask, +				lpc32xx_events[d->irq]. +				event_group->rawstat_reg); +		} +  		__raw_writel(eventreg,  			lpc32xx_events[d->irq].event_group->enab_reg); @@ -380,13 +393,15 @@ void __init lpc32xx_init_irq(void)  	/* Setup SIC1 */  	__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE)); -	__raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC1_BASE)); -	__raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC1_BASE)); +	__raw_writel(SIC1_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC1_BASE)); +	__raw_writel(SIC1_ATR_DEFAULT, +				LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC1_BASE));  	/* Setup SIC2 */  	__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE)); -	__raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC2_BASE)); -	__raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC2_BASE)); +	__raw_writel(SIC2_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC2_BASE)); +	__raw_writel(SIC2_ATR_DEFAULT, +				LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC2_BASE));  	/* Configure supported IRQ's */  	for (i = 0; i < NR_IRQS; i++) { diff --git a/arch/arm/mach-lpc32xx/serial.c b/arch/arm/mach-lpc32xx/serial.c index 429cfdbb2b3..f2735281616 100644 --- a/arch/arm/mach-lpc32xx/serial.c +++ b/arch/arm/mach-lpc32xx/serial.c @@ -88,6 +88,7 @@ struct uartinit {  	char *uart_ck_name;  	u32 ck_mode_mask;  	void __iomem *pdiv_clk_reg; +	resource_size_t mapbase;  };  static struct uartinit uartinit_data[] __initdata = { @@ -97,6 +98,7 @@ static struct uartinit uartinit_data[] __initdata = {  		.ck_mode_mask =  			LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 5),  		.pdiv_clk_reg = LPC32XX_CLKPWR_UART5_CLK_CTRL, +		.mapbase = LPC32XX_UART5_BASE,  	},  #endif  #ifdef CONFIG_ARCH_LPC32XX_UART3_SELECT @@ -105,6 +107,7 @@ static struct uartinit uartinit_data[] __initdata = {  		.ck_mode_mask =  			LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 3),  		.pdiv_clk_reg = LPC32XX_CLKPWR_UART3_CLK_CTRL, +		.mapbase = LPC32XX_UART3_BASE,  	},  #endif  #ifdef CONFIG_ARCH_LPC32XX_UART4_SELECT @@ -113,6 +116,7 @@ static struct uartinit uartinit_data[] __initdata = {  		.ck_mode_mask =  			LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 4),  		.pdiv_clk_reg = LPC32XX_CLKPWR_UART4_CLK_CTRL, +		.mapbase = LPC32XX_UART4_BASE,  	},  #endif  #ifdef CONFIG_ARCH_LPC32XX_UART6_SELECT @@ -121,6 +125,7 @@ static struct uartinit uartinit_data[] __initdata = {  		.ck_mode_mask =  			LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 6),  		.pdiv_clk_reg = LPC32XX_CLKPWR_UART6_CLK_CTRL, +		.mapbase = LPC32XX_UART6_BASE,  	},  #endif  }; @@ -165,11 +170,24 @@ void __init lpc32xx_serial_init(void)  		/* pre-UART clock divider set to 1 */  		__raw_writel(0x0101, uartinit_data[i].pdiv_clk_reg); + +		/* +		 * Force a flush of the RX FIFOs to work around a +		 * HW bug +		 */ +		puart = uartinit_data[i].mapbase; +		__raw_writel(0xC1, LPC32XX_UART_IIR_FCR(puart)); +		__raw_writel(0x00, LPC32XX_UART_DLL_FIFO(puart)); +		j = LPC32XX_SUART_FIFO_SIZE; +		while (j--) +			tmp = __raw_readl( +				LPC32XX_UART_DLL_FIFO(puart)); +		__raw_writel(0, LPC32XX_UART_IIR_FCR(puart));  	}  	/* This needs to be done after all UART clocks are setup */  	__raw_writel(clkmodes, LPC32XX_UARTCTL_CLKMODE); -	for (i = 0; i < ARRAY_SIZE(uartinit_data) - 1; i++) { +	for (i = 0; i < ARRAY_SIZE(uartinit_data); i++) {  		/* Force a flush of the RX FIFOs to work around a HW bug */  		puart = serial_std_platform_data[i].mapbase;  		__raw_writel(0xC1, LPC32XX_UART_IIR_FCR(puart)); diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c index 17cb7606012..3588a558415 100644 --- a/arch/arm/mach-mmp/aspenite.c +++ b/arch/arm/mach-mmp/aspenite.c @@ -17,7 +17,6 @@  #include <linux/mtd/partitions.h>  #include <linux/mtd/nand.h>  #include <linux/interrupt.h> -#include <linux/gpio.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c index 7bc17eaa12e..ada1213982b 100644 --- a/arch/arm/mach-mmp/pxa168.c +++ b/arch/arm/mach-mmp/pxa168.c @@ -24,7 +24,6 @@  #include <mach/dma.h>  #include <mach/devices.h>  #include <mach/mfp.h> -#include <linux/platform_device.h>  #include <linux/dma-mapping.h>  #include <mach/pxa168.h> diff --git a/arch/arm/mach-mmp/tavorevb.c b/arch/arm/mach-mmp/tavorevb.c index 8e3b5af04a5..bc97170125b 100644 --- a/arch/arm/mach-mmp/tavorevb.c +++ b/arch/arm/mach-mmp/tavorevb.c @@ -12,7 +12,6 @@  #include <linux/kernel.h>  #include <linux/platform_device.h>  #include <linux/smc91x.h> -#include <linux/gpio.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-msm/hotplug.c b/arch/arm/mach-msm/hotplug.c index 41c252de021..a446fc14221 100644 --- a/arch/arm/mach-msm/hotplug.c +++ b/arch/arm/mach-msm/hotplug.c @@ -11,6 +11,7 @@  #include <linux/smp.h>  #include <asm/cacheflush.h> +#include <asm/smp_plat.h>  extern volatile int pen_release; diff --git a/arch/arm/mach-msm/platsmp.c b/arch/arm/mach-msm/platsmp.c index 0b3e357c4c8..db0117ec55f 100644 --- a/arch/arm/mach-msm/platsmp.c +++ b/arch/arm/mach-msm/platsmp.c @@ -20,6 +20,7 @@  #include <asm/cacheflush.h>  #include <asm/cputype.h>  #include <asm/mach-types.h> +#include <asm/smp_plat.h>  #include <mach/msm_iomap.h> diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index 0cdd41004ad..a5dcf766a3f 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c @@ -19,6 +19,7 @@  #include <mach/mv78xx0.h>  #include <mach/bridge-regs.h>  #include <plat/cache-feroceon-l2.h> +#include <plat/ehci-orion.h>  #include <plat/orion_nand.h>  #include <plat/time.h>  #include <plat/common.h> @@ -169,7 +170,7 @@ void __init mv78xx0_map_io(void)   ****************************************************************************/  void __init mv78xx0_ehci0_init(void)  { -	orion_ehci_init(USB0_PHYS_BASE, IRQ_MV78XX0_USB_0); +	orion_ehci_init(USB0_PHYS_BASE, IRQ_MV78XX0_USB_0, EHCI_PHY_NA);  } diff --git a/arch/arm/mach-mv78xx0/mpp.h b/arch/arm/mach-mv78xx0/mpp.h index b61b5092712..3752302ae2e 100644 --- a/arch/arm/mach-mv78xx0/mpp.h +++ b/arch/arm/mach-mv78xx0/mpp.h @@ -24,296 +24,296 @@  #define MPP_78100_A0_MASK    MPP(0, 0x0, 0, 0, 1)  #define MPP0_GPIO        MPP(0, 0x0, 1, 1, 1) -#define MPP0_GE0_COL        MPP(0, 0x1, 1, 0, 1) -#define MPP0_GE1_TXCLK        MPP(0, 0x2, 0, 1, 1) +#define MPP0_GE0_COL        MPP(0, 0x1, 0, 0, 1) +#define MPP0_GE1_TXCLK        MPP(0, 0x2, 0, 0, 1)  #define MPP0_UNUSED        MPP(0, 0x3, 0, 0, 1)  #define MPP1_GPIO        MPP(1, 0x0, 1, 1, 1) -#define MPP1_GE0_RXERR        MPP(1, 0x1, 1, 0, 1) -#define MPP1_GE1_TXCTL        MPP(1, 0x2, 0, 1, 1) +#define MPP1_GE0_RXERR        MPP(1, 0x1, 0, 0, 1) +#define MPP1_GE1_TXCTL        MPP(1, 0x2, 0, 0, 1)  #define MPP1_UNUSED        MPP(1, 0x3, 0, 0, 1)  #define MPP2_GPIO        MPP(2, 0x0, 1, 1, 1) -#define MPP2_GE0_CRS        MPP(2, 0x1, 1, 0, 1) -#define MPP2_GE1_RXCTL        MPP(2, 0x2, 1, 0, 1) +#define MPP2_GE0_CRS        MPP(2, 0x1, 0, 0, 1) +#define MPP2_GE1_RXCTL        MPP(2, 0x2, 0, 0, 1)  #define MPP2_UNUSED        MPP(2, 0x3, 0, 0, 1)  #define MPP3_GPIO        MPP(3, 0x0, 1, 1, 1) -#define MPP3_GE0_TXERR        MPP(3, 0x1, 0, 1, 1) -#define MPP3_GE1_RXCLK        MPP(3, 0x2, 1, 0, 1) +#define MPP3_GE0_TXERR        MPP(3, 0x1, 0, 0, 1) +#define MPP3_GE1_RXCLK        MPP(3, 0x2, 0, 0, 1)  #define MPP3_UNUSED        MPP(3, 0x3, 0, 0, 1)  #define MPP4_GPIO        MPP(4, 0x0, 1, 1, 1) -#define MPP4_GE0_TXD4        MPP(4, 0x1, 0, 1, 1) -#define MPP4_GE1_TXD0        MPP(4, 0x2, 0, 1, 1) +#define MPP4_GE0_TXD4        MPP(4, 0x1, 0, 0, 1) +#define MPP4_GE1_TXD0        MPP(4, 0x2, 0, 0, 1)  #define MPP4_UNUSED        MPP(4, 0x3, 0, 0, 1)  #define MPP5_GPIO        MPP(5, 0x0, 1, 1, 1) -#define MPP5_GE0_TXD5        MPP(5, 0x1, 0, 1, 1) -#define MPP5_GE1_TXD1        MPP(5, 0x2, 0, 1, 1) +#define MPP5_GE0_TXD5        MPP(5, 0x1, 0, 0, 1) +#define MPP5_GE1_TXD1        MPP(5, 0x2, 0, 0, 1)  #define MPP5_UNUSED        MPP(5, 0x3, 0, 0, 1)  #define MPP6_GPIO        MPP(6, 0x0, 1, 1, 1) -#define MPP6_GE0_TXD6        MPP(6, 0x1, 0, 1, 1) -#define MPP6_GE1_TXD2        MPP(6, 0x2, 0, 1, 1) +#define MPP6_GE0_TXD6        MPP(6, 0x1, 0, 0, 1) +#define MPP6_GE1_TXD2        MPP(6, 0x2, 0, 0, 1)  #define MPP6_UNUSED        MPP(6, 0x3, 0, 0, 1)  #define MPP7_GPIO        MPP(7, 0x0, 1, 1, 1) -#define MPP7_GE0_TXD7        MPP(7, 0x1, 0, 1, 1) -#define MPP7_GE1_TXD3        MPP(7, 0x2, 0, 1, 1) +#define MPP7_GE0_TXD7        MPP(7, 0x1, 0, 0, 1) +#define MPP7_GE1_TXD3        MPP(7, 0x2, 0, 0, 1)  #define MPP7_UNUSED        MPP(7, 0x3, 0, 0, 1)  #define MPP8_GPIO        MPP(8, 0x0, 1, 1, 1) -#define MPP8_GE0_RXD4        MPP(8, 0x1, 1, 0, 1) -#define MPP8_GE1_RXD0        MPP(8, 0x2, 1, 0, 1) +#define MPP8_GE0_RXD4        MPP(8, 0x1, 0, 0, 1) +#define MPP8_GE1_RXD0        MPP(8, 0x2, 0, 0, 1)  #define MPP8_UNUSED        MPP(8, 0x3, 0, 0, 1)  #define MPP9_GPIO        MPP(9, 0x0, 1, 1, 1) -#define MPP9_GE0_RXD5        MPP(9, 0x1, 1, 0, 1) -#define MPP9_GE1_RXD1        MPP(9, 0x2, 1, 0, 1) +#define MPP9_GE0_RXD5        MPP(9, 0x1, 0, 0, 1) +#define MPP9_GE1_RXD1        MPP(9, 0x2, 0, 0, 1)  #define MPP9_UNUSED        MPP(9, 0x3, 0, 0, 1)  #define MPP10_GPIO        MPP(10, 0x0, 1, 1, 1) -#define MPP10_GE0_RXD6        MPP(10, 0x1, 1, 0, 1) -#define MPP10_GE1_RXD2        MPP(10, 0x2, 1, 0, 1) +#define MPP10_GE0_RXD6        MPP(10, 0x1, 0, 0, 1) +#define MPP10_GE1_RXD2        MPP(10, 0x2, 0, 0, 1)  #define MPP10_UNUSED        MPP(10, 0x3, 0, 0, 1)  #define MPP11_GPIO        MPP(11, 0x0, 1, 1, 1) -#define MPP11_GE0_RXD7        MPP(11, 0x1, 1, 0, 1) -#define MPP11_GE1_RXD3        MPP(11, 0x2, 1, 0, 1) +#define MPP11_GE0_RXD7        MPP(11, 0x1, 0, 0, 1) +#define MPP11_GE1_RXD3        MPP(11, 0x2, 0, 0, 1)  #define MPP11_UNUSED        MPP(11, 0x3, 0, 0, 1)  #define MPP12_GPIO        MPP(12, 0x0, 1, 1, 1) -#define MPP12_M_BB        MPP(12, 0x3, 1, 0, 1) -#define MPP12_UA0_CTSn        MPP(12, 0x4, 1, 0, 1) -#define MPP12_NAND_FLASH_REn0    MPP(12, 0x5, 0, 1, 1) -#define MPP12_TDM0_SCSn        MPP(12, 0X6, 0, 1, 1) +#define MPP12_M_BB        MPP(12, 0x3, 0, 0, 1) +#define MPP12_UA0_CTSn        MPP(12, 0x4, 0, 0, 1) +#define MPP12_NAND_FLASH_REn0    MPP(12, 0x5, 0, 0, 1) +#define MPP12_TDM0_SCSn        MPP(12, 0X6, 0, 0, 1)  #define MPP12_UNUSED        MPP(12, 0x1, 0, 0, 1)  #define MPP13_GPIO        MPP(13, 0x0, 1, 1, 1) -#define MPP13_SYSRST_OUTn    MPP(13, 0x3, 0, 1, 1) -#define MPP13_UA0_RTSn        MPP(13, 0x4, 0, 1, 1) -#define MPP13_NAN_FLASH_WEn0    MPP(13, 0x5, 0, 1, 1) -#define MPP13_TDM_SCLK        MPP(13, 0x6, 0, 1, 1) +#define MPP13_SYSRST_OUTn    MPP(13, 0x3, 0, 0, 1) +#define MPP13_UA0_RTSn        MPP(13, 0x4, 0, 0, 1) +#define MPP13_NAN_FLASH_WEn0    MPP(13, 0x5, 0, 0, 1) +#define MPP13_TDM_SCLK        MPP(13, 0x6, 0, 0, 1)  #define MPP13_UNUSED        MPP(13, 0x1, 0, 0, 1)  #define MPP14_GPIO        MPP(14, 0x0, 1, 1, 1) -#define MPP14_SATA1_ACTn    MPP(14, 0x3, 0, 1, 1) -#define MPP14_UA1_CTSn        MPP(14, 0x4, 1, 0, 1) -#define MPP14_NAND_FLASH_REn1    MPP(14, 0x5, 0, 1, 1) -#define MPP14_TDM_SMOSI        MPP(14, 0x6, 0, 1, 1) +#define MPP14_SATA1_ACTn    MPP(14, 0x3, 0, 0, 1) +#define MPP14_UA1_CTSn        MPP(14, 0x4, 0, 0, 1) +#define MPP14_NAND_FLASH_REn1    MPP(14, 0x5, 0, 0, 1) +#define MPP14_TDM_SMOSI        MPP(14, 0x6, 0, 0, 1)  #define MPP14_UNUSED        MPP(14, 0x1, 0, 0, 1)  #define MPP15_GPIO        MPP(15, 0x0, 1, 1, 1) -#define MPP15_SATA0_ACTn    MPP(15, 0x3, 0, 1, 1) -#define MPP15_UA1_RTSn        MPP(15, 0x4, 0, 1, 1) -#define MPP15_NAND_FLASH_WEn1    MPP(15, 0x5, 0, 1, 1) -#define MPP15_TDM_SMISO        MPP(15, 0x6, 1, 0, 1) +#define MPP15_SATA0_ACTn    MPP(15, 0x3, 0, 0, 1) +#define MPP15_UA1_RTSn        MPP(15, 0x4, 0, 0, 1) +#define MPP15_NAND_FLASH_WEn1    MPP(15, 0x5, 0, 0, 1) +#define MPP15_TDM_SMISO        MPP(15, 0x6, 0, 0, 1)  #define MPP15_UNUSED        MPP(15, 0x1, 0, 0, 1)  #define MPP16_GPIO        MPP(16, 0x0, 1, 1, 1) -#define MPP16_SATA1_PRESENTn    MPP(16, 0x3, 0, 1, 1) -#define MPP16_UA2_TXD        MPP(16, 0x4, 0, 1, 1) -#define MPP16_NAND_FLASH_REn3    MPP(16, 0x5, 0, 1, 1) -#define MPP16_TDM_INTn        MPP(16, 0x6, 1, 0, 1) +#define MPP16_SATA1_PRESENTn    MPP(16, 0x3, 0, 0, 1) +#define MPP16_UA2_TXD        MPP(16, 0x4, 0, 0, 1) +#define MPP16_NAND_FLASH_REn3    MPP(16, 0x5, 0, 0, 1) +#define MPP16_TDM_INTn        MPP(16, 0x6, 0, 0, 1)  #define MPP16_UNUSED        MPP(16, 0x1, 0, 0, 1)  #define MPP17_GPIO        MPP(17, 0x0, 1, 1, 1) -#define MPP17_SATA0_PRESENTn    MPP(17, 0x3, 0, 1, 1) -#define MPP17_UA2_RXD        MPP(17, 0x4, 1, 0, 1) -#define MPP17_NAND_FLASH_WEn3    MPP(17, 0x5, 0, 1, 1) -#define MPP17_TDM_RSTn        MPP(17, 0x6, 0, 1, 1) +#define MPP17_SATA0_PRESENTn    MPP(17, 0x3, 0, 0, 1) +#define MPP17_UA2_RXD        MPP(17, 0x4, 0, 0, 1) +#define MPP17_NAND_FLASH_WEn3    MPP(17, 0x5, 0, 0, 1) +#define MPP17_TDM_RSTn        MPP(17, 0x6, 0, 0, 1)  #define MPP17_UNUSED        MPP(17, 0x1, 0, 0, 1)  #define MPP18_GPIO        MPP(18, 0x0, 1, 1, 1) -#define MPP18_UA0_CTSn        MPP(18, 0x4, 1, 0, 1) -#define MPP18_BOOT_FLASH_REn    MPP(18, 0x5, 0, 1, 1) +#define MPP18_UA0_CTSn        MPP(18, 0x4, 0, 0, 1) +#define MPP18_BOOT_FLASH_REn    MPP(18, 0x5, 0, 0, 1)  #define MPP18_UNUSED        MPP(18, 0x1, 0, 0, 1)  #define MPP19_GPIO        MPP(19, 0x0, 1, 1, 1) -#define MPP19_UA0_CTSn        MPP(19, 0x4, 0, 1, 1) -#define MPP19_BOOT_FLASH_WEn    MPP(19, 0x5, 0, 1, 1) +#define MPP19_UA0_CTSn        MPP(19, 0x4, 0, 0, 1) +#define MPP19_BOOT_FLASH_WEn    MPP(19, 0x5, 0, 0, 1)  #define MPP19_UNUSED        MPP(19, 0x1, 0, 0, 1)  #define MPP20_GPIO        MPP(20, 0x0, 1, 1, 1) -#define MPP20_UA1_CTSs        MPP(20, 0x4, 1, 0, 1) -#define MPP20_TDM_PCLK        MPP(20, 0x6, 1, 1, 0) +#define MPP20_UA1_CTSs        MPP(20, 0x4, 0, 0, 1) +#define MPP20_TDM_PCLK        MPP(20, 0x6, 0, 0, 0)  #define MPP20_UNUSED        MPP(20, 0x1, 0, 0, 1)  #define MPP21_GPIO        MPP(21, 0x0, 1, 1, 1) -#define MPP21_UA1_CTSs        MPP(21, 0x4, 0, 1, 1) -#define MPP21_TDM_FSYNC        MPP(21, 0x6, 1, 1, 0) +#define MPP21_UA1_CTSs        MPP(21, 0x4, 0, 0, 1) +#define MPP21_TDM_FSYNC        MPP(21, 0x6, 0, 0, 0)  #define MPP21_UNUSED        MPP(21, 0x1, 0, 0, 1)  #define MPP22_GPIO        MPP(22, 0x0, 1, 1, 1) -#define MPP22_UA3_TDX        MPP(22, 0x4, 0, 1, 1) -#define MPP22_NAND_FLASH_REn2    MPP(22, 0x5, 0, 1, 1) -#define MPP22_TDM_DRX        MPP(22, 0x6, 1, 0, 1) +#define MPP22_UA3_TDX        MPP(22, 0x4, 0, 0, 1) +#define MPP22_NAND_FLASH_REn2    MPP(22, 0x5, 0, 0, 1) +#define MPP22_TDM_DRX        MPP(22, 0x6, 0, 0, 1)  #define MPP22_UNUSED        MPP(22, 0x1, 0, 0, 1)  #define MPP23_GPIO        MPP(23, 0x0, 1, 1, 1) -#define MPP23_UA3_RDX        MPP(23, 0x4, 1, 0, 1) -#define MPP23_NAND_FLASH_WEn2    MPP(23, 0x5, 0, 1, 1) -#define MPP23_TDM_DTX        MPP(23, 0x6, 0, 1, 1) +#define MPP23_UA3_RDX        MPP(23, 0x4, 0, 0, 1) +#define MPP23_NAND_FLASH_WEn2    MPP(23, 0x5, 0, 0, 1) +#define MPP23_TDM_DTX        MPP(23, 0x6, 0, 0, 1)  #define MPP23_UNUSED        MPP(23, 0x1, 0, 0, 1)  #define MPP24_GPIO        MPP(24, 0x0, 1, 1, 1) -#define MPP24_UA2_TXD        MPP(24, 0x4, 0, 1, 1) -#define MPP24_TDM_INTn        MPP(24, 0x6, 1, 0, 1) +#define MPP24_UA2_TXD        MPP(24, 0x4, 0, 0, 1) +#define MPP24_TDM_INTn        MPP(24, 0x6, 0, 0, 1)  #define MPP24_UNUSED        MPP(24, 0x1, 0, 0, 1)  #define MPP25_GPIO        MPP(25, 0x0, 1, 1, 1) -#define MPP25_UA2_RXD        MPP(25, 0x4, 1, 0, 1) -#define MPP25_TDM_RSTn        MPP(25, 0x6, 0, 1, 1) +#define MPP25_UA2_RXD        MPP(25, 0x4, 0, 0, 1) +#define MPP25_TDM_RSTn        MPP(25, 0x6, 0, 0, 1)  #define MPP25_UNUSED        MPP(25, 0x1, 0, 0, 1)  #define MPP26_GPIO        MPP(26, 0x0, 1, 1, 1) -#define MPP26_UA2_CTSn        MPP(26, 0x4, 1, 0, 1) -#define MPP26_TDM_PCLK        MPP(26, 0x6, 1, 1, 1) +#define MPP26_UA2_CTSn        MPP(26, 0x4, 0, 0, 1) +#define MPP26_TDM_PCLK        MPP(26, 0x6, 0, 0, 1)  #define MPP26_UNUSED        MPP(26, 0x1, 0, 0, 1)  #define MPP27_GPIO        MPP(27, 0x0, 1, 1, 1) -#define MPP27_UA2_RTSn        MPP(27, 0x4, 0, 1, 1) -#define MPP27_TDM_FSYNC        MPP(27, 0x6, 1, 1, 1) +#define MPP27_UA2_RTSn        MPP(27, 0x4, 0, 0, 1) +#define MPP27_TDM_FSYNC        MPP(27, 0x6, 0, 0, 1)  #define MPP27_UNUSED        MPP(27, 0x1, 0, 0, 1)  #define MPP28_GPIO        MPP(28, 0x0, 1, 1, 1) -#define MPP28_UA3_TXD        MPP(28, 0x4, 0, 1, 1) -#define MPP28_TDM_DRX        MPP(28, 0x6, 1, 0, 1) +#define MPP28_UA3_TXD        MPP(28, 0x4, 0, 0, 1) +#define MPP28_TDM_DRX        MPP(28, 0x6, 0, 0, 1)  #define MPP28_UNUSED        MPP(28, 0x1, 0, 0, 1)  #define MPP29_GPIO        MPP(29, 0x0, 1, 1, 1) -#define MPP29_UA3_RXD        MPP(29, 0x4, 1, 0, 1) -#define MPP29_SYSRST_OUTn    MPP(29, 0x5, 0, 1, 1) -#define MPP29_TDM_DTX        MPP(29, 0x6, 0, 1, 1) +#define MPP29_UA3_RXD        MPP(29, 0x4, 0, 0, 1) +#define MPP29_SYSRST_OUTn    MPP(29, 0x5, 0, 0, 1) +#define MPP29_TDM_DTX        MPP(29, 0x6, 0, 0, 1)  #define MPP29_UNUSED        MPP(29, 0x1, 0, 0, 1)  #define MPP30_GPIO        MPP(30, 0x0, 1, 1, 1) -#define MPP30_UA3_CTSn        MPP(30, 0x4, 1, 0, 1) +#define MPP30_UA3_CTSn        MPP(30, 0x4, 0, 0, 1)  #define MPP30_UNUSED        MPP(30, 0x1, 0, 0, 1)  #define MPP31_GPIO        MPP(31, 0x0, 1, 1, 1) -#define MPP31_UA3_RTSn        MPP(31, 0x4, 0, 1, 1) -#define MPP31_TDM1_SCSn        MPP(31, 0x6, 0, 1, 1) +#define MPP31_UA3_RTSn        MPP(31, 0x4, 0, 0, 1) +#define MPP31_TDM1_SCSn        MPP(31, 0x6, 0, 0, 1)  #define MPP31_UNUSED        MPP(31, 0x1, 0, 0, 1)  #define MPP32_GPIO        MPP(32, 0x1, 1, 1, 1) -#define MPP32_UA3_TDX        MPP(32, 0x4, 0, 1, 1) -#define MPP32_SYSRST_OUTn    MPP(32, 0x5, 0, 1, 1) -#define MPP32_TDM0_RXQ        MPP(32, 0x6, 0, 1, 1) +#define MPP32_UA3_TDX        MPP(32, 0x4, 0, 0, 1) +#define MPP32_SYSRST_OUTn    MPP(32, 0x5, 0, 0, 1) +#define MPP32_TDM0_RXQ        MPP(32, 0x6, 0, 0, 1)  #define MPP32_UNUSED        MPP(32, 0x3, 0, 0, 1)  #define MPP33_GPIO        MPP(33, 0x1, 1, 1, 1) -#define MPP33_UA3_RDX        MPP(33, 0x4, 1, 0, 1) -#define MPP33_TDM0_TXQ        MPP(33, 0x6, 0, 1, 1) +#define MPP33_UA3_RDX        MPP(33, 0x4, 0, 0, 1) +#define MPP33_TDM0_TXQ        MPP(33, 0x6, 0, 0, 1)  #define MPP33_UNUSED        MPP(33, 0x3, 0, 0, 1)  #define MPP34_GPIO        MPP(34, 0x1, 1, 1, 1) -#define MPP34_UA2_TDX        MPP(34, 0x4, 0, 1, 1) -#define MPP34_TDM1_RXQ        MPP(34, 0x6, 0, 1, 1) +#define MPP34_UA2_TDX        MPP(34, 0x4, 0, 0, 1) +#define MPP34_TDM1_RXQ        MPP(34, 0x6, 0, 0, 1)  #define MPP34_UNUSED        MPP(34, 0x3, 0, 0, 1)  #define MPP35_GPIO        MPP(35, 0x1, 1, 1, 1) -#define MPP35_UA2_RDX        MPP(35, 0x4, 1, 0, 1) -#define MPP35_TDM1_TXQ        MPP(35, 0x6, 0, 1, 1) +#define MPP35_UA2_RDX        MPP(35, 0x4, 0, 0, 1) +#define MPP35_TDM1_TXQ        MPP(35, 0x6, 0, 0, 1)  #define MPP35_UNUSED        MPP(35, 0x3, 0, 0, 1)  #define MPP36_GPIO        MPP(36, 0x1, 1, 1, 1) -#define MPP36_UA0_CTSn        MPP(36, 0x2, 1, 0, 1) -#define MPP36_UA2_TDX        MPP(36, 0x4, 0, 1, 1) -#define MPP36_TDM0_SCSn        MPP(36, 0x6, 0, 1, 1) +#define MPP36_UA0_CTSn        MPP(36, 0x2, 0, 0, 1) +#define MPP36_UA2_TDX        MPP(36, 0x4, 0, 0, 1) +#define MPP36_TDM0_SCSn        MPP(36, 0x6, 0, 0, 1)  #define MPP36_UNUSED        MPP(36, 0x3, 0, 0, 1)  #define MPP37_GPIO        MPP(37, 0x1, 1, 1, 1) -#define MPP37_UA0_RTSn        MPP(37, 0x2, 0, 1, 1) -#define MPP37_UA2_RXD        MPP(37, 0x4, 1, 0, 1) -#define MPP37_SYSRST_OUTn    MPP(37, 0x5, 0, 1, 1) -#define MPP37_TDM_SCLK        MPP(37, 0x6, 0, 1, 1) +#define MPP37_UA0_RTSn        MPP(37, 0x2, 0, 0, 1) +#define MPP37_UA2_RXD        MPP(37, 0x4, 0, 0, 1) +#define MPP37_SYSRST_OUTn    MPP(37, 0x5, 0, 0, 1) +#define MPP37_TDM_SCLK        MPP(37, 0x6, 0, 0, 1)  #define MPP37_UNUSED        MPP(37, 0x3, 0, 0, 1)  #define MPP38_GPIO        MPP(38, 0x1, 1, 1, 1) -#define MPP38_UA1_CTSn        MPP(38, 0x2, 1, 0, 1) -#define MPP38_UA3_TXD        MPP(38, 0x4, 0, 1, 1) -#define MPP38_SYSRST_OUTn    MPP(38, 0x5, 0, 1, 1) -#define MPP38_TDM_SMOSI        MPP(38, 0x6, 0, 1, 1) +#define MPP38_UA1_CTSn        MPP(38, 0x2, 0, 0, 1) +#define MPP38_UA3_TXD        MPP(38, 0x4, 0, 0, 1) +#define MPP38_SYSRST_OUTn    MPP(38, 0x5, 0, 0, 1) +#define MPP38_TDM_SMOSI        MPP(38, 0x6, 0, 0, 1)  #define MPP38_UNUSED        MPP(38, 0x3, 0, 0, 1)  #define MPP39_GPIO        MPP(39, 0x1, 1, 1, 1) -#define MPP39_UA1_RTSn        MPP(39, 0x2, 0, 1, 1) -#define MPP39_UA3_RXD        MPP(39, 0x4, 1, 0, 1) -#define MPP39_SYSRST_OUTn    MPP(39, 0x5, 0, 1, 1) -#define MPP39_TDM_SMISO        MPP(39, 0x6, 1, 0, 1) +#define MPP39_UA1_RTSn        MPP(39, 0x2, 0, 0, 1) +#define MPP39_UA3_RXD        MPP(39, 0x4, 0, 0, 1) +#define MPP39_SYSRST_OUTn    MPP(39, 0x5, 0, 0, 1) +#define MPP39_TDM_SMISO        MPP(39, 0x6, 0, 0, 1)  #define MPP39_UNUSED        MPP(39, 0x3, 0, 0, 1)  #define MPP40_GPIO        MPP(40, 0x1, 1, 1, 1) -#define MPP40_TDM_INTn        MPP(40, 0x6, 1, 0, 1) +#define MPP40_TDM_INTn        MPP(40, 0x6, 0, 0, 1)  #define MPP40_UNUSED        MPP(40, 0x0, 0, 0, 1)  #define MPP41_GPIO        MPP(41, 0x1, 1, 1, 1) -#define MPP41_TDM_RSTn        MPP(41, 0x6, 0, 1, 1) +#define MPP41_TDM_RSTn        MPP(41, 0x6, 0, 0, 1)  #define MPP41_UNUSED        MPP(41, 0x0, 0, 0, 1)  #define MPP42_GPIO        MPP(42, 0x1, 1, 1, 1) -#define MPP42_TDM_PCLK        MPP(42, 0x6, 1, 1, 1) +#define MPP42_TDM_PCLK        MPP(42, 0x6, 0, 0, 1)  #define MPP42_UNUSED        MPP(42, 0x0, 0, 0, 1)  #define MPP43_GPIO        MPP(43, 0x1, 1, 1, 1) -#define MPP43_TDM_FSYNC        MPP(43, 0x6, 1, 1, 1) +#define MPP43_TDM_FSYNC        MPP(43, 0x6, 0, 0, 1)  #define MPP43_UNUSED        MPP(43, 0x0, 0, 0, 1)  #define MPP44_GPIO        MPP(44, 0x1, 1, 1, 1) -#define MPP44_TDM_DRX        MPP(44, 0x6, 1, 0, 1) +#define MPP44_TDM_DRX        MPP(44, 0x6, 0, 0, 1)  #define MPP44_UNUSED        MPP(44, 0x0, 0, 0, 1)  #define MPP45_GPIO        MPP(45, 0x1, 1, 1, 1) -#define MPP45_SATA0_ACTn    MPP(45, 0x3, 0, 1, 1) -#define MPP45_TDM_DRX        MPP(45, 0x6, 0, 1, 1) +#define MPP45_SATA0_ACTn    MPP(45, 0x3, 0, 0, 1) +#define MPP45_TDM_DRX        MPP(45, 0x6, 0, 0, 1)  #define MPP45_UNUSED        MPP(45, 0x0, 0, 0, 1)  #define MPP46_GPIO        MPP(46, 0x1, 1, 1, 1) -#define MPP46_TDM_SCSn        MPP(46, 0x6, 0, 1, 1) +#define MPP46_TDM_SCSn        MPP(46, 0x6, 0, 0, 1)  #define MPP46_UNUSED        MPP(46, 0x0, 0, 0, 1) @@ -323,14 +323,14 @@  #define MPP48_GPIO        MPP(48, 0x1, 1, 1, 1) -#define MPP48_SATA1_ACTn    MPP(48, 0x3, 0, 1, 1) +#define MPP48_SATA1_ACTn    MPP(48, 0x3, 0, 0, 1)  #define MPP48_UNUSED        MPP(48, 0x2, 0, 0, 1)  #define MPP49_GPIO        MPP(49, 0x1, 1, 1, 1) -#define MPP49_SATA0_ACTn    MPP(49, 0x3, 0, 1, 1) -#define MPP49_M_BB        MPP(49, 0x4, 1, 0, 1) +#define MPP49_SATA0_ACTn    MPP(49, 0x3, 0, 0, 1) +#define MPP49_M_BB        MPP(49, 0x4, 0, 0, 1)  #define MPP49_UNUSED        MPP(49, 0x2, 0, 0, 1) diff --git a/arch/arm/mach-mx5/Kconfig b/arch/arm/mach-mx5/Kconfig deleted file mode 100644 index af0c212e3c7..00000000000 --- a/arch/arm/mach-mx5/Kconfig +++ /dev/null @@ -1,244 +0,0 @@ -if ARCH_MX5 - -# ARCH_MX5/50/53 are left to mark places where prevent multi-soc in single -# image. So for most time, SOC_IMX50/51/53 should be used. - -config ARCH_MX51 -	bool - -config ARCH_MX50 -	bool - -config ARCH_MX53 -	bool - -config SOC_IMX50 -	bool -	select CPU_V7 -	select ARM_L1_CACHE_SHIFT_6 -	select MXC_TZIC -	select ARCH_MXC_IOMUX_V3 -	select ARCH_MXC_AUDMUX_V2 -	select ARCH_HAS_CPUFREQ -	select ARCH_MX50 - -config	SOC_IMX51 -	bool -	select CPU_V7 -	select ARM_L1_CACHE_SHIFT_6 -	select MXC_TZIC -	select ARCH_MXC_IOMUX_V3 -	select ARCH_MXC_AUDMUX_V2 -	select ARCH_HAS_CPUFREQ -	select ARCH_MX51 - -config	SOC_IMX53 -	bool -	select CPU_V7 -	select ARM_L1_CACHE_SHIFT_6 -	select MXC_TZIC -	select ARCH_MXC_IOMUX_V3 -	select ARCH_MX53 - -#comment "i.MX50 machines:" - -config MACH_MX50_RDP -	bool "Support MX50 reference design platform" -	depends on BROKEN -	select SOC_IMX50 -	select IMX_HAVE_PLATFORM_IMX_I2C -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	select IMX_HAVE_PLATFORM_SPI_IMX -	help -	  Include support for MX50 reference design platform (RDP) board. This -	  includes specific configurations for the board and its peripherals. - -comment "i.MX51 machines:" - -config MACH_IMX51_DT -	bool "Support i.MX51 platforms from device tree" -	select SOC_IMX51 -	select USE_OF -	select MACH_MX51_BABBAGE -	help -	  Include support for Freescale i.MX51 based platforms -	  using the device tree for discovery - -config MACH_MX51_BABBAGE -	bool "Support MX51 BABBAGE platforms" -	select SOC_IMX51 -	select IMX_HAVE_PLATFORM_FSL_USB2_UDC -	select IMX_HAVE_PLATFORM_IMX2_WDT -	select IMX_HAVE_PLATFORM_IMX_I2C -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_MXC_EHCI -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	select IMX_HAVE_PLATFORM_SPI_IMX -	help -	  Include support for MX51 Babbage platform, also known as MX51EVK in -	  u-boot. This includes specific configurations for the board and its -	  peripherals. - -config MACH_MX51_3DS -	bool "Support MX51PDK (3DS)" -	select SOC_IMX51 -	select IMX_HAVE_PLATFORM_IMX2_WDT -	select IMX_HAVE_PLATFORM_IMX_KEYPAD -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	select IMX_HAVE_PLATFORM_SPI_IMX -	select MXC_DEBUG_BOARD -	help -	  Include support for MX51PDK (3DS) platform. This includes specific -	  configurations for the board and its peripherals. - -config MACH_EUKREA_CPUIMX51 -	bool "Support Eukrea CPUIMX51 module" -	select SOC_IMX51 -	select IMX_HAVE_PLATFORM_FSL_USB2_UDC -	select IMX_HAVE_PLATFORM_IMX_I2C -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_MXC_EHCI -	select IMX_HAVE_PLATFORM_MXC_NAND -	select IMX_HAVE_PLATFORM_SPI_IMX -	help -	  Include support for Eukrea CPUIMX51 platform. This includes -	  specific configurations for the module and its peripherals. - -choice -	prompt "Baseboard" -	depends on MACH_EUKREA_CPUIMX51 -	default MACH_EUKREA_MBIMX51_BASEBOARD - -config MACH_EUKREA_MBIMX51_BASEBOARD -	prompt "Eukrea MBIMX51 development board" -	bool -	select IMX_HAVE_PLATFORM_IMX_KEYPAD -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	select LEDS_GPIO_REGISTER -	help -	  This adds board specific devices that can be found on Eukrea's -	  MBIMX51 evaluation board. - -endchoice - -config MACH_EUKREA_CPUIMX51SD -	bool "Support Eukrea CPUIMX51SD module" -	select SOC_IMX51 -	select IMX_HAVE_PLATFORM_FSL_USB2_UDC -	select IMX_HAVE_PLATFORM_IMX_I2C -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_MXC_EHCI -	select IMX_HAVE_PLATFORM_MXC_NAND -	select IMX_HAVE_PLATFORM_SPI_IMX -	help -	  Include support for Eukrea CPUIMX51SD platform. This includes -	  specific configurations for the module and its peripherals. - -choice -	prompt "Baseboard" -	depends on MACH_EUKREA_CPUIMX51SD -	default MACH_EUKREA_MBIMXSD51_BASEBOARD - -config MACH_EUKREA_MBIMXSD51_BASEBOARD -	prompt "Eukrea MBIMXSD development board" -	bool -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	select LEDS_GPIO_REGISTER -	help -	  This adds board specific devices that can be found on Eukrea's -	  MBIMXSD evaluation board. - -endchoice - -config MX51_EFIKA_COMMON -	bool -	select SOC_IMX51 -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_MXC_EHCI -	select IMX_HAVE_PLATFORM_PATA_IMX -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	select IMX_HAVE_PLATFORM_SPI_IMX -	select MXC_ULPI if USB_ULPI - -config MACH_MX51_EFIKAMX -	bool "Support MX51 Genesi Efika MX nettop" -	select LEDS_GPIO_REGISTER -	select MX51_EFIKA_COMMON -	help -	  Include support for Genesi Efika MX nettop. This includes specific -	  configurations for the board and its peripherals. - -config MACH_MX51_EFIKASB -	bool "Support MX51 Genesi Efika Smartbook" -	select LEDS_GPIO_REGISTER -	select MX51_EFIKA_COMMON -	help -	  Include support for Genesi Efika Smartbook. This includes specific -	  configurations for the board and its peripherals. - -comment "i.MX53 machines:" - -config MACH_IMX53_DT -	bool "Support i.MX53 platforms from device tree" -	select SOC_IMX53 -	select USE_OF -	select MACH_MX53_ARD -	select MACH_MX53_EVK -	select MACH_MX53_LOCO -	select MACH_MX53_SMD -	help -	  Include support for Freescale i.MX53 based platforms -	  using the device tree for discovery - -config MACH_MX53_EVK -	bool "Support MX53 EVK platforms" -	select SOC_IMX53 -	select IMX_HAVE_PLATFORM_IMX2_WDT -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_IMX_I2C -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	select IMX_HAVE_PLATFORM_SPI_IMX -	select LEDS_GPIO_REGISTER -	help -	  Include support for MX53 EVK platform. This includes specific -	  configurations for the board and its peripherals. - -config MACH_MX53_SMD -	bool "Support MX53 SMD platforms" -	select SOC_IMX53 -	select IMX_HAVE_PLATFORM_IMX2_WDT -	select IMX_HAVE_PLATFORM_IMX_I2C -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	help -	  Include support for MX53 SMD platform. This includes specific -	  configurations for the board and its peripherals. - -config MACH_MX53_LOCO -	bool "Support MX53 LOCO platforms" -	select SOC_IMX53 -	select IMX_HAVE_PLATFORM_IMX2_WDT -	select IMX_HAVE_PLATFORM_IMX_I2C -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	select IMX_HAVE_PLATFORM_GPIO_KEYS -	select LEDS_GPIO_REGISTER -	help -	  Include support for MX53 LOCO platform. This includes specific -	  configurations for the board and its peripherals. - -config MACH_MX53_ARD -	bool "Support MX53 ARD platforms" -	select SOC_IMX53 -	select IMX_HAVE_PLATFORM_IMX2_WDT -	select IMX_HAVE_PLATFORM_IMX_I2C -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	select IMX_HAVE_PLATFORM_GPIO_KEYS -	help -	  Include support for MX53 ARD platform. This includes specific -	  configurations for the board and its peripherals. - -endif diff --git a/arch/arm/mach-mx5/Makefile b/arch/arm/mach-mx5/Makefile deleted file mode 100644 index 0fc60807fa2..00000000000 --- a/arch/arm/mach-mx5/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -# -# Makefile for the linux kernel. -# - -# Object file lists. -obj-y   := cpu.o mm.o clock-mx51-mx53.o ehci.o system.o - -obj-$(CONFIG_PM) += pm-imx5.o -obj-$(CONFIG_CPU_FREQ_IMX)    += cpu_op-mx51.o -obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o -obj-$(CONFIG_MACH_MX51_3DS) += board-mx51_3ds.o -obj-$(CONFIG_MACH_MX53_EVK) += board-mx53_evk.o -obj-$(CONFIG_MACH_MX53_SMD) += board-mx53_smd.o -obj-$(CONFIG_MACH_MX53_LOCO) += board-mx53_loco.o -obj-$(CONFIG_MACH_MX53_ARD) += board-mx53_ard.o -obj-$(CONFIG_MACH_EUKREA_CPUIMX51) += board-cpuimx51.o -obj-$(CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD) += eukrea_mbimx51-baseboard.o -obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += board-cpuimx51sd.o -obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd-baseboard.o -obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o -obj-$(CONFIG_MACH_MX51_EFIKAMX) += board-mx51_efikamx.o -obj-$(CONFIG_MACH_MX51_EFIKASB) += board-mx51_efikasb.o -obj-$(CONFIG_MACH_MX50_RDP) += board-mx50_rdp.o - -obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o -obj-$(CONFIG_MACH_IMX53_DT) += imx53-dt.o diff --git a/arch/arm/mach-mx5/Makefile.boot b/arch/arm/mach-mx5/Makefile.boot deleted file mode 100644 index ca207ca305e..00000000000 --- a/arch/arm/mach-mx5/Makefile.boot +++ /dev/null @@ -1,9 +0,0 @@ -   zreladdr-$(CONFIG_ARCH_MX50)	+= 0x70008000 -params_phys-$(CONFIG_ARCH_MX50)	:= 0x70000100 -initrd_phys-$(CONFIG_ARCH_MX50)	:= 0x70800000 -   zreladdr-$(CONFIG_ARCH_MX51)	+= 0x90008000 -params_phys-$(CONFIG_ARCH_MX51)	:= 0x90000100 -initrd_phys-$(CONFIG_ARCH_MX51)	:= 0x90800000 -   zreladdr-$(CONFIG_ARCH_MX53)	+= 0x70008000 -params_phys-$(CONFIG_ARCH_MX53)	:= 0x70000100 -initrd_phys-$(CONFIG_ARCH_MX53)	:= 0x70800000 diff --git a/arch/arm/mach-mx5/pm-imx5.c b/arch/arm/mach-mx5/pm-imx5.c deleted file mode 100644 index 98052fc852c..00000000000 --- a/arch/arm/mach-mx5/pm-imx5.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - *  Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved. - * - * The code contained herein is licensed under the GNU General Public - * License. You may obtain a copy of the GNU General Public License - * Version 2 or later at the following locations: - * - * http://www.opensource.org/licenses/gpl-license.html - * http://www.gnu.org/copyleft/gpl.html - */ -#include <linux/suspend.h> -#include <linux/clk.h> -#include <linux/io.h> -#include <linux/err.h> -#include <asm/cacheflush.h> -#include <asm/tlbflush.h> -#include <mach/common.h> -#include <mach/hardware.h> -#include "crm_regs.h" - -static struct clk *gpc_dvfs_clk; - -static int mx5_suspend_prepare(void) -{ -	return clk_enable(gpc_dvfs_clk); -} - -static int mx5_suspend_enter(suspend_state_t state) -{ -	switch (state) { -	case PM_SUSPEND_MEM: -		mx5_cpu_lp_set(STOP_POWER_OFF); -		break; -	case PM_SUSPEND_STANDBY: -		mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); -		break; -	default: -		return -EINVAL; -	} - -	if (state == PM_SUSPEND_MEM) { -		local_flush_tlb_all(); -		flush_cache_all(); - -		/*clear the EMPGC0/1 bits */ -		__raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR); -		__raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR); -	} -	cpu_do_idle(); -	return 0; -} - -static void mx5_suspend_finish(void) -{ -	clk_disable(gpc_dvfs_clk); -} - -static int mx5_pm_valid(suspend_state_t state) -{ -	return (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX); -} - -static const struct platform_suspend_ops mx5_suspend_ops = { -	.valid = mx5_pm_valid, -	.prepare = mx5_suspend_prepare, -	.enter = mx5_suspend_enter, -	.finish = mx5_suspend_finish, -}; - -static int __init mx5_pm_init(void) -{ -	if (gpc_dvfs_clk == NULL) -		gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs"); - -	if (!IS_ERR(gpc_dvfs_clk)) { -		if (cpu_is_mx51()) -			suspend_set_ops(&mx5_suspend_ops); -	} else -		return -EPERM; - -	return 0; -} -device_initcall(mx5_pm_init); diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 309369ea697..be2002f42de 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c @@ -416,13 +416,13 @@ static void __init innovator_init(void)  #ifdef CONFIG_ARCH_OMAP15XX  	if (cpu_is_omap1510()) {  		omap1_usb_init(&innovator1510_usb_config); -		innovator_config[1].data = &innovator1510_lcd_config; +		innovator_config[0].data = &innovator1510_lcd_config;  	}  #endif  #ifdef CONFIG_ARCH_OMAP16XX  	if (cpu_is_omap1610()) {  		omap1_usb_init(&h2_usb_config); -		innovator_config[1].data = &innovator1610_lcd_config; +		innovator_config[0].data = &innovator1610_lcd_config;  	}  #endif  	omap_board_config = innovator_config; diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index a8ba7b96dcd..e20c8ab80b0 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -33,7 +33,6 @@ config ARCH_OMAP3  	default y  	select CPU_V7  	select USB_ARCH_HAS_EHCI -	select ARM_L1_CACHE_SHIFT_6 if !ARCH_OMAP4  	select ARCH_HAS_OPP  	select PM_OPP if PM  	select ARM_CPU_SUSPEND if PM @@ -214,13 +213,12 @@ config MACH_OMAP3_PANDORA  	depends on ARCH_OMAP3  	default y  	select OMAP_PACKAGE_CBB -	select REGULATOR_FIXED_VOLTAGE +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_OMAP3_TOUCHBOOK  	bool "OMAP3 Touch Book"  	depends on ARCH_OMAP3  	default y -	select BACKLIGHT_CLASS_DEVICE  config MACH_OMAP_3430SDP  	bool "OMAP 3430 SDP board" @@ -266,7 +264,7 @@ config MACH_OMAP_ZOOM2  	select SERIAL_8250  	select SERIAL_CORE_CONSOLE  	select SERIAL_8250_CONSOLE -	select REGULATOR_FIXED_VOLTAGE +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_OMAP_ZOOM3  	bool "OMAP3630 Zoom3 board" @@ -276,7 +274,7 @@ config MACH_OMAP_ZOOM3  	select SERIAL_8250  	select SERIAL_CORE_CONSOLE  	select SERIAL_8250_CONSOLE -	select REGULATOR_FIXED_VOLTAGE +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_CM_T35  	bool "CompuLab CM-T35/CM-T3730 modules" @@ -335,7 +333,7 @@ config MACH_OMAP_4430SDP  	depends on ARCH_OMAP4  	select OMAP_PACKAGE_CBL  	select OMAP_PACKAGE_CBS -	select REGULATOR_FIXED_VOLTAGE +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config MACH_OMAP4_PANDA  	bool "OMAP4 Panda Board" @@ -343,7 +341,7 @@ config MACH_OMAP4_PANDA  	depends on ARCH_OMAP4  	select OMAP_PACKAGE_CBL  	select OMAP_PACKAGE_CBS -	select REGULATOR_FIXED_VOLTAGE +	select REGULATOR_FIXED_VOLTAGE if REGULATOR  config OMAP3_EMU  	bool "OMAP3 debugging peripherals" @@ -366,8 +364,8 @@ config OMAP3_SDRC_AC_TIMING  	  going on could result in system crashes;  config OMAP4_ERRATA_I688 -	bool "OMAP4 errata: Async Bridge Corruption (BROKEN)" -	depends on ARCH_OMAP4 && BROKEN +	bool "OMAP4 errata: Async Bridge Corruption" +	depends on ARCH_OMAP4  	select ARCH_HAS_BARRIERS  	help  	  If a data is stalled inside asynchronous bridge because of back diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index fc9b238cbc1..bd76394ccaf 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -11,9 +11,9 @@ hwmod-common				= omap_hwmod.o \  					  omap_hwmod_common_data.o  clock-common				= clock.o clock_common_data.o \  					  clkt_dpll.o clkt_clksel.o -secure-common                          = omap-smc.o omap-secure.o +secure-common				= omap-smc.o omap-secure.o -obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common) $(secure-common) +obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common)  obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common)  obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common) diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 39fba9df17f..4e9071589bf 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c @@ -52,8 +52,9 @@  #define ETH_KS8851_QUART		138  #define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO	184  #define OMAP4_SFH7741_ENABLE_GPIO		188 -#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ +#define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */  #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ +#define HDMI_GPIO_HPD  63 /* Hotplug detect */  #define DISPLAY_SEL_GPIO	59	/* LCD2/PicoDLP switch */  #define DLP_POWER_ON_GPIO	40 @@ -603,8 +604,9 @@ static void __init omap_sfh7741prox_init(void)  }  static struct gpio sdp4430_hdmi_gpios[] = { -	{ HDMI_GPIO_HPD,	GPIOF_OUT_INIT_HIGH,	"hdmi_gpio_hpd"   }, +	{ HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" },  	{ HDMI_GPIO_LS_OE,	GPIOF_OUT_INIT_HIGH,	"hdmi_gpio_ls_oe" }, +	{ HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" },  };  static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev) @@ -621,8 +623,7 @@ static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev)  static void sdp4430_panel_disable_hdmi(struct omap_dss_device *dssdev)  { -	gpio_free(HDMI_GPIO_LS_OE); -	gpio_free(HDMI_GPIO_HPD); +	gpio_free_array(sdp4430_hdmi_gpios, ARRAY_SIZE(sdp4430_hdmi_gpios));  }  static struct nokia_dsi_panel_data dsi1_panel = { @@ -738,6 +739,10 @@ static void sdp4430_lcd_init(void)  		pr_err("%s: Could not get lcd2_reset_gpio\n", __func__);  } +static struct omap_dss_hdmi_data sdp4430_hdmi_data = { +	.hpd_gpio = HDMI_GPIO_HPD, +}; +  static struct omap_dss_device sdp4430_hdmi_device = {  	.name = "hdmi",  	.driver_name = "hdmi_panel", @@ -745,6 +750,7 @@ static struct omap_dss_device sdp4430_hdmi_device = {  	.platform_enable = sdp4430_panel_enable_hdmi,  	.platform_disable = sdp4430_panel_disable_hdmi,  	.channel = OMAP_DSS_CHANNEL_DIGIT, +	.data = &sdp4430_hdmi_data,  };  static struct picodlp_panel_data sdp4430_picodlp_pdata = { @@ -808,7 +814,7 @@ static struct omap_dss_board_info sdp4430_dss_data = {  	.default_device	= &sdp4430_lcd_device,  }; -static void omap_4430sdp_display_init(void) +static void __init omap_4430sdp_display_init(void)  {  	int r; @@ -829,6 +835,10 @@ static void omap_4430sdp_display_init(void)  		omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP);  	else  		omap_hdmi_init(0); + +	omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN);  }  #ifdef CONFIG_OMAP_MUX @@ -841,7 +851,7 @@ static struct omap_board_mux board_mux[] __initdata = {  #define board_mux	NULL   #endif -static void omap4_sdp4430_wifi_mux_init(void) +static void __init omap4_sdp4430_wifi_mux_init(void)  {  	omap_mux_init_gpio(GPIO_WIFI_IRQ, OMAP_PIN_INPUT |  				OMAP_PIN_OFF_WAKEUPENABLE); @@ -868,12 +878,17 @@ static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = {  	.board_tcxo_clock = WL12XX_TCXOCLOCK_26,  }; -static void omap4_sdp4430_wifi_init(void) +static void __init omap4_sdp4430_wifi_init(void)  { +	int ret; +  	omap4_sdp4430_wifi_mux_init(); -	if (wl12xx_set_platform_data(&omap4_sdp4430_wlan_data)) -		pr_err("Error setting wl12xx data\n"); -	platform_device_register(&omap_vwlan_device); +	ret = wl12xx_set_platform_data(&omap4_sdp4430_wlan_data); +	if (ret) +		pr_err("Error setting wl12xx data: %d\n", ret); +	ret = platform_device_register(&omap_vwlan_device); +	if (ret) +		pr_err("Error registering wl12xx device: %d\n", ret);  }  static void __init omap_4430sdp_init(void) diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index e921e3be24a..d73316ed420 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c @@ -437,7 +437,7 @@ static struct usbhs_omap_board_data usbhs_bdata __initdata = {  	.reset_gpio_port[2]  = -EINVAL  }; -static void cm_t35_init_usbh(void) +static void  __init cm_t35_init_usbh(void)  {  	int err; diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index d5875606048..ad497620539 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -17,6 +17,7 @@  #include <linux/i2c/twl.h>  #include <mach/hardware.h> +#include <asm/hardware/gic.h>  #include <asm/mach/arch.h>  #include <plat/board.h> @@ -102,6 +103,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)")  	.map_io		= omap242x_map_io,  	.init_early	= omap2420_init_early,  	.init_irq	= omap2_init_irq, +	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= omap_generic_init,  	.timer		= &omap2_timer,  	.dt_compat	= omap242x_boards_compat, @@ -141,6 +143,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")  	.map_io		= omap3_map_io,  	.init_early	= omap3430_init_early,  	.init_irq	= omap3_init_irq, +	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap3_init,  	.timer		= &omap3_timer,  	.dt_compat	= omap3_boards_compat, @@ -160,6 +163,7 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)")  	.map_io		= omap4_map_io,  	.init_early	= omap4430_init_early,  	.init_irq	= gic_init_irq, +	.handle_irq	= gic_handle_irq,  	.init_machine	= omap4_init,  	.timer		= &omap4_timer,  	.dt_compat	= omap4_boards_compat, diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index 42a4d11fad2..67226271760 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c @@ -371,7 +371,11 @@ static void n8x0_mmc_callback(void *data, u8 card_mask)  	else  		*openp = 0; +#ifdef CONFIG_MMC_OMAP  	omap_mmc_notify_cover_event(mmc_device, index, *openp); +#else +	pr_warn("MMC: notify cover event not available\n"); +#endif  }  static int n8x0_mmc_late_init(struct device *dev) diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 003fe34c934..c877236a844 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c @@ -381,7 +381,7 @@ static int omap3evm_twl_gpio_setup(struct device *dev,  	gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI");  	/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ -	gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; +	gpio_leds[0].gpio = gpio + TWL4030_GPIO_MAX + 1;  	platform_device_register(&leds_gpio); @@ -617,6 +617,21 @@ static struct gpio omap3_evm_ehci_gpios[] __initdata = {  	{ OMAP3_EVM_EHCI_SELECT, GPIOF_OUT_INIT_LOW,   "select EHCI port" },  }; +static void __init omap3_evm_wl12xx_init(void) +{ +#ifdef CONFIG_WL12XX_PLATFORM_DATA +	int ret; + +	/* WL12xx WLAN Init */ +	ret = wl12xx_set_platform_data(&omap3evm_wlan_data); +	if (ret) +		pr_err("error setting wl12xx data: %d\n", ret); +	ret = platform_device_register(&omap3evm_wlan_regulator); +	if (ret) +		pr_err("error registering wl12xx device: %d\n", ret); +#endif +} +  static void __init omap3_evm_init(void)  {  	omap3_evm_get_revision(); @@ -665,13 +680,7 @@ static void __init omap3_evm_init(void)  	omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL);  	omap3evm_init_smsc911x();  	omap3_evm_display_init(); - -#ifdef CONFIG_WL12XX_PLATFORM_DATA -	/* WL12xx WLAN Init */ -	if (wl12xx_set_platform_data(&omap3evm_wlan_data)) -		pr_err("error setting wl12xx data\n"); -	platform_device_register(&omap3evm_wlan_regulator); -#endif +	omap3_evm_wl12xx_init();  }  MACHINE_START(OMAP3EVM, "OMAP3 EVM") diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 30ad40db2cf..28fc271f703 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c @@ -51,8 +51,9 @@  #define GPIO_HUB_NRESET		62  #define GPIO_WIFI_PMENA		43  #define GPIO_WIFI_IRQ		53 -#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ +#define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */  #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ +#define HDMI_GPIO_HPD  63 /* Hotplug detect */  /* wl127x BT, FM, GPS connectivity chip */  static int wl1271_gpios[] = {46, -1, -1}; @@ -413,8 +414,9 @@ int __init omap4_panda_dvi_init(void)  }  static struct gpio panda_hdmi_gpios[] = { -	{ HDMI_GPIO_HPD,	GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd"   }, +	{ HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" },  	{ HDMI_GPIO_LS_OE,	GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" }, +	{ HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" },  };  static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev) @@ -431,10 +433,13 @@ static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev)  static void omap4_panda_panel_disable_hdmi(struct omap_dss_device *dssdev)  { -	gpio_free(HDMI_GPIO_LS_OE); -	gpio_free(HDMI_GPIO_HPD); +	gpio_free_array(panda_hdmi_gpios, ARRAY_SIZE(panda_hdmi_gpios));  } +static struct omap_dss_hdmi_data omap4_panda_hdmi_data = { +	.hpd_gpio = HDMI_GPIO_HPD, +}; +  static struct omap_dss_device  omap4_panda_hdmi_device = {  	.name = "hdmi",  	.driver_name = "hdmi_panel", @@ -442,6 +447,7 @@ static struct omap_dss_device  omap4_panda_hdmi_device = {  	.platform_enable = omap4_panda_panel_enable_hdmi,  	.platform_disable = omap4_panda_panel_disable_hdmi,  	.channel = OMAP_DSS_CHANNEL_DIGIT, +	.data = &omap4_panda_hdmi_data,  };  static struct omap_dss_device *omap4_panda_dss_devices[] = { @@ -473,18 +479,24 @@ void omap4_panda_display_init(void)  		omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP);  	else  		omap_hdmi_init(0); + +	omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT); +	omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN);  }  static void __init omap4_panda_init(void)  {  	int package = OMAP_PACKAGE_CBS; +	int ret;  	if (omap_rev() == OMAP4430_REV_ES1_0)  		package = OMAP_PACKAGE_CBL;  	omap4_mux_init(board_mux, NULL, package); -	if (wl12xx_set_platform_data(&omap_panda_wlan_data)) -		pr_err("error setting wl12xx data\n"); +	ret = wl12xx_set_platform_data(&omap_panda_wlan_data); +	if (ret) +		pr_err("error setting wl12xx data: %d\n", ret);  	omap4_panda_i2c_init();  	platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices)); diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 8d7ce11cfea..c126461836a 100644 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c @@ -296,8 +296,10 @@ static void enable_board_wakeup_source(void)  void __init zoom_peripherals_init(void)  { -	if (wl12xx_set_platform_data(&omap_zoom_wlan_data)) -		pr_err("error setting wl12xx data\n"); +	int ret = wl12xx_set_platform_data(&omap_zoom_wlan_data); + +	if (ret) +		pr_err("error setting wl12xx data: %d\n", ret);  	omap_i2c_init();  	platform_device_register(&omap_vwlan_device); diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index febffde2ff1..7e9338e8d68 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h @@ -132,6 +132,7 @@ void omap3_map_io(void);  void am33xx_map_io(void);  void omap4_map_io(void);  void ti81xx_map_io(void); +void omap_barriers_init(void);  /**   * omap_test_timeout - busy-loop, testing a condition diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c index cfdbb86bc84..72e018b9b26 100644 --- a/arch/arm/mach-omap2/cpuidle44xx.c +++ b/arch/arm/mach-omap2/cpuidle44xx.c @@ -65,7 +65,6 @@ static int omap4_enter_idle(struct cpuidle_device *dev,  	struct timespec ts_preidle, ts_postidle, ts_idle;  	u32 cpu1_state;  	int idle_time; -	int new_state_idx;  	int cpu_id = smp_processor_id();  	/* Used to keep track of the total time in idle */ @@ -84,8 +83,8 @@ static int omap4_enter_idle(struct cpuidle_device *dev,  	 */  	cpu1_state = pwrdm_read_pwrst(cpu1_pd);  	if (cpu1_state != PWRDM_POWER_OFF) { -		new_state_idx = drv->safe_state_index; -		cx = cpuidle_get_statedata(&dev->states_usage[new_state_idx]); +		index = drv->safe_state_index; +		cx = cpuidle_get_statedata(&dev->states_usage[index]);  	}  	if (index > 0) diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 0b510ad01a0..283d11eae69 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -405,6 +405,7 @@ static int omap_mcspi_init(struct omap_hwmod *oh, void *unused)  			break;  	default:  			pr_err("Invalid McSPI Revision value\n"); +			kfree(pdata);  			return -EINVAL;  	} diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index 3c446d1a178..3677b1f58b8 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c @@ -103,12 +103,8 @@ static void omap4_hdmi_mux_pads(enum omap_hdmi_flags flags)  	u32 reg;  	u16 control_i2c_1; -	/* PAD0_HDMI_HPD_PAD1_HDMI_CEC */ -	omap_mux_init_signal("hdmi_hpd", -			OMAP_PIN_INPUT_PULLUP);  	omap_mux_init_signal("hdmi_cec",  			OMAP_PIN_INPUT_PULLUP); -	/* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */  	omap_mux_init_signal("hdmi_ddc_scl",  			OMAP_PIN_INPUT_PULLUP);  	omap_mux_init_signal("hdmi_ddc_sda", diff --git a/arch/arm/mach-omap2/gpmc-smsc911x.c b/arch/arm/mach-omap2/gpmc-smsc911x.c index 997033129d2..bbb870c04a5 100644 --- a/arch/arm/mach-omap2/gpmc-smsc911x.c +++ b/arch/arm/mach-omap2/gpmc-smsc911x.c @@ -19,6 +19,8 @@  #include <linux/interrupt.h>  #include <linux/io.h>  #include <linux/smsc911x.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <plat/board.h>  #include <plat/gpmc.h> @@ -42,6 +44,50 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = {  	.flags		= SMSC911X_USE_16BIT,  }; +static struct regulator_consumer_supply gpmc_smsc911x_supply[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x.0"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), +}; + +/* Generic regulator definition to satisfy smsc911x */ +static struct regulator_init_data gpmc_smsc911x_reg_init_data = { +	.constraints = { +		.min_uV			= 3300000, +		.max_uV			= 3300000, +		.valid_modes_mask	= REGULATOR_MODE_NORMAL +					| REGULATOR_MODE_STANDBY, +		.valid_ops_mask		= REGULATOR_CHANGE_MODE +					| REGULATOR_CHANGE_STATUS, +	}, +	.num_consumer_supplies	= ARRAY_SIZE(gpmc_smsc911x_supply), +	.consumer_supplies	= gpmc_smsc911x_supply, +}; + +static struct fixed_voltage_config gpmc_smsc911x_fixed_reg_data = { +	.supply_name		= "gpmc_smsc911x", +	.microvolts		= 3300000, +	.gpio			= -EINVAL, +	.startup_delay		= 0, +	.enable_high		= 0, +	.enabled_at_boot	= 1, +	.init_data		= &gpmc_smsc911x_reg_init_data, +}; + +/* + * Platform device id of 42 is a temporary fix to avoid conflicts + * with other reg-fixed-voltage devices. The real fix should + * involve the driver core providing a way of dynamically + * assigning a unique id on registration for platform devices + * in the same name space. + */ +static struct platform_device gpmc_smsc911x_regulator = { +	.name		= "reg-fixed-voltage", +	.id		= 42, +	.dev = { +		.platform_data	= &gpmc_smsc911x_fixed_reg_data, +	}, +}; +  /*   * Initialize smsc911x device connected to the GPMC. Note that we   * assume that pin multiplexing is done in the board-*.c file, @@ -55,6 +101,12 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data)  	gpmc_cfg = board_data; +	ret = platform_device_register(&gpmc_smsc911x_regulator); +	if (ret < 0) { +		pr_err("Unable to register smsc911x regulators: %d\n", ret); +		return; +	} +  	if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) {  		pr_err("Failed to request GPMC mem region\n");  		return; diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 130034bf01d..dfffbbf4c00 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c @@ -528,7 +528,13 @@ int gpmc_cs_configure(int cs, int cmd, int wval)  	case GPMC_CONFIG_DEV_SIZE:  		regval  = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); + +		/* clear 2 target bits */ +		regval &= ~GPMC_CONFIG1_DEVICESIZE(3); + +		/* set the proper value */  		regval |= GPMC_CONFIG1_DEVICESIZE(wval); +  		gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, regval);  		break; diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index bd844af13af..19dd1657245 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c @@ -175,14 +175,15 @@ static void hsmmc2_select_input_clk_src(struct omap_mmc_platform_data *mmc)  {  	u32 reg; -	if (mmc->slots[0].internal_clock) { -		reg = omap_ctrl_readl(control_devconf1_offset); +	reg = omap_ctrl_readl(control_devconf1_offset); +	if (mmc->slots[0].internal_clock)  		reg |= OMAP2_MMCSDIO2ADPCLKISEL; -		omap_ctrl_writel(reg, control_devconf1_offset); -	} +	else +		reg &= ~OMAP2_MMCSDIO2ADPCLKISEL; +	omap_ctrl_writel(reg, control_devconf1_offset);  } -static void hsmmc23_before_set_reg(struct device *dev, int slot, +static void hsmmc2_before_set_reg(struct device *dev, int slot,  				   int power_on, int vdd)  {  	struct omap_mmc_platform_data *mmc = dev->platform_data; @@ -292,8 +293,8 @@ static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller,  	}  } -static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, -					struct omap_mmc_platform_data *mmc) +static int omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, +				 struct omap_mmc_platform_data *mmc)  {  	char *hc_name; @@ -407,14 +408,13 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,  			c->caps &= ~MMC_CAP_8_BIT_DATA;  			c->caps |= MMC_CAP_4_BIT_DATA;  		} -		/* FALLTHROUGH */ -	case 3:  		if (mmc->slots[0].features & HSMMC_HAS_PBIAS) {  			/* off-chip level shifting, or none */ -			mmc->slots[0].before_set_reg = hsmmc23_before_set_reg; +			mmc->slots[0].before_set_reg = hsmmc2_before_set_reg;  			mmc->slots[0].after_set_reg = NULL;  		}  		break; +	case 3:  	case 4:  	case 5:  		mmc->slots[0].before_set_reg = NULL; @@ -428,9 +428,10 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,  	return 0;  } +static int omap_hsmmc_done;  #define MAX_OMAP_MMC_HWMOD_NAME_LEN		16 -void __init omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) +void omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr)  {  	struct omap_hwmod *oh;  	struct platform_device *pdev; @@ -487,10 +488,15 @@ done:  	kfree(mmc_data);  } -void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers) +void omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)  {  	u32 reg; +	if (omap_hsmmc_done) +		return; + +	omap_hsmmc_done = 1; +  	if (!cpu_is_omap44xx()) {  		if (cpu_is_omap2430()) {  			control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE; diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 6c5826605ea..719ee423abe 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -343,6 +343,7 @@ static void __init omap3_check_revision(const char **cpu_rev)  	case 0xb944:  		omap_revision = AM335X_REV_ES1_0;  		*cpu_rev = "1.0"; +		break;  	case 0xb8f2:  		switch (rev) {  		case 0: diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 3f174d51f67..fb11b44fbde 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c @@ -307,6 +307,7 @@ void __init omapam33xx_map_common_io(void)  void __init omap44xx_map_common_io(void)  {  	iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc)); +	omap_barriers_init();  }  #endif @@ -388,7 +389,7 @@ static void __init omap_hwmod_init_postsetup(void)  	omap_pm_if_early_init();  } -#ifdef CONFIG_ARCH_OMAP2 +#ifdef CONFIG_SOC_OMAP2420  void __init omap2420_init_early(void)  {  	omap2_set_globals_242x(); @@ -400,7 +401,9 @@ void __init omap2420_init_early(void)  	omap_hwmod_init_postsetup();  	omap2420_clk_init();  } +#endif +#ifdef CONFIG_SOC_OMAP2430  void __init omap2430_init_early(void)  {  	omap2_set_globals_243x(); diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 609ea2ded7e..415a6f1cf41 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c @@ -281,8 +281,16 @@ static struct omap_mbox mbox_iva_info = {  	.ops	= &omap2_mbox_ops,  	.priv	= &omap2_mbox_iva_priv,  }; +#endif -struct omap_mbox *omap2_mboxes[] = { &mbox_dsp_info, &mbox_iva_info, NULL }; +#ifdef CONFIG_ARCH_OMAP2 +struct omap_mbox *omap2_mboxes[] = { +	&mbox_dsp_info, +#ifdef CONFIG_SOC_OMAP2420 +	&mbox_iva_info, +#endif +	NULL +};  #endif  #if defined(CONFIG_ARCH_OMAP4) diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index e1cc75d1a57..611a0e3d54c 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c @@ -100,8 +100,8 @@ void omap_mux_write_array(struct omap_mux_partition *partition,  static char *omap_mux_options; -static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition, -				      int gpio, int val) +static int _omap_mux_init_gpio(struct omap_mux_partition *partition, +			       int gpio, int val)  {  	struct omap_mux_entry *e;  	struct omap_mux *gpio_mux = NULL; @@ -145,7 +145,7 @@ static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition,  	return 0;  } -int __init omap_mux_init_gpio(int gpio, int val) +int omap_mux_init_gpio(int gpio, int val)  {  	struct omap_mux_partition *partition;  	int ret; @@ -159,9 +159,9 @@ int __init omap_mux_init_gpio(int gpio, int val)  	return -ENODEV;  } -static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition, -					const char *muxname, -					struct omap_mux **found_mux) +static int _omap_mux_get_by_name(struct omap_mux_partition *partition, +				 const char *muxname, +				 struct omap_mux **found_mux)  {  	struct omap_mux *mux = NULL;  	struct omap_mux_entry *e; @@ -218,7 +218,7 @@ static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition,  	return -ENODEV;  } -static int __init +static int  omap_mux_get_by_name(const char *muxname,  			struct omap_mux_partition **found_partition,  			struct omap_mux **found_mux) @@ -240,7 +240,7 @@ omap_mux_get_by_name(const char *muxname,  	return -ENODEV;  } -int __init omap_mux_init_signal(const char *muxname, int val) +int omap_mux_init_signal(const char *muxname, int val)  {  	struct omap_mux_partition *partition = NULL;  	struct omap_mux *mux = NULL; @@ -1094,8 +1094,8 @@ static void omap_mux_init_package(struct omap_mux *superset,  		omap_mux_package_init_balls(package_balls, superset);  } -static void omap_mux_init_signals(struct omap_mux_partition *partition, -				  struct omap_board_mux *board_mux) +static void __init omap_mux_init_signals(struct omap_mux_partition *partition, +					 struct omap_board_mux *board_mux)  {  	omap_mux_set_cmdline_signals();  	omap_mux_write_array(partition, board_mux); @@ -1109,8 +1109,8 @@ static void omap_mux_init_package(struct omap_mux *superset,  {  } -static void omap_mux_init_signals(struct omap_mux_partition *partition, -				  struct omap_board_mux *board_mux) +static void __init omap_mux_init_signals(struct omap_mux_partition *partition, +					 struct omap_board_mux *board_mux)  {  } diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S index b13ef7ef5ef..503ac777a2b 100644 --- a/arch/arm/mach-omap2/omap-headsmp.S +++ b/arch/arm/mach-omap2/omap-headsmp.S @@ -18,6 +18,7 @@  #include <linux/linkage.h>  #include <linux/init.h> +	__CPUINIT  /*   * OMAP4 specific entry point for secondary CPU to jump from ROM   * code.  This routine also provides a holding flag into which diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 40a8fbc07e4..70de277f5c1 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c @@ -24,12 +24,14 @@  #include <plat/irqs.h>  #include <plat/sram.h> +#include <plat/omap-secure.h>  #include <mach/hardware.h>  #include <mach/omap-wakeupgen.h>  #include "common.h"  #include "omap4-sar-layout.h" +#include <linux/export.h>  #ifdef CONFIG_CACHE_L2X0  static void __iomem *l2cache_base; @@ -43,6 +45,9 @@ static void __iomem *sar_ram_base;  void __iomem *dram_sync, *sram_sync; +static phys_addr_t paddr; +static u32 size; +  void omap_bus_sync(void)  {  	if (dram_sync && sram_sync) { @@ -51,19 +56,22 @@ void omap_bus_sync(void)  		isb();  	}  } +EXPORT_SYMBOL(omap_bus_sync); -static int __init omap_barriers_init(void) +/* Steal one page physical memory for barrier implementation */ +int __init omap_barrier_reserve_memblock(void)  { -	struct map_desc dram_io_desc[1]; -	phys_addr_t paddr; -	u32 size; - -	if (!cpu_is_omap44xx()) -		return -ENODEV;  	size = ALIGN(PAGE_SIZE, SZ_1M);  	paddr = arm_memblock_steal(size, SZ_1M); +	return 0; +} + +void __init omap_barriers_init(void) +{ +	struct map_desc dram_io_desc[1]; +  	dram_io_desc[0].virtual = OMAP4_DRAM_BARRIER_VA;  	dram_io_desc[0].pfn = __phys_to_pfn(paddr);  	dram_io_desc[0].length = size; @@ -75,9 +83,10 @@ static int __init omap_barriers_init(void)  	pr_info("OMAP4: Map 0x%08llx to 0x%08lx for dram barrier\n",  		(long long) paddr, dram_io_desc[0].virtual); -	return 0;  } -core_initcall(omap_barriers_init); +#else +void __init omap_barriers_init(void) +{}  #endif  void __init gic_init_irq(void) diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 5192cabb40e..eba6cd3816f 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -1517,8 +1517,8 @@ static int _enable(struct omap_hwmod *oh)  	if (oh->_state != _HWMOD_STATE_INITIALIZED &&  	    oh->_state != _HWMOD_STATE_IDLE &&  	    oh->_state != _HWMOD_STATE_DISABLED) { -		WARN(1, "omap_hwmod: %s: enabled state can only be entered " -		     "from initialized, idle, or disabled state\n", oh->name); +		WARN(1, "omap_hwmod: %s: enabled state can only be entered from initialized, idle, or disabled state\n", +			oh->name);  		return -EINVAL;  	} @@ -1600,8 +1600,8 @@ static int _idle(struct omap_hwmod *oh)  	pr_debug("omap_hwmod: %s: idling\n", oh->name);  	if (oh->_state != _HWMOD_STATE_ENABLED) { -		WARN(1, "omap_hwmod: %s: idle state can only be entered from " -		     "enabled state\n", oh->name); +		WARN(1, "omap_hwmod: %s: idle state can only be entered from enabled state\n", +			oh->name);  		return -EINVAL;  	} @@ -1682,8 +1682,8 @@ static int _shutdown(struct omap_hwmod *oh)  	if (oh->_state != _HWMOD_STATE_IDLE &&  	    oh->_state != _HWMOD_STATE_ENABLED) { -		WARN(1, "omap_hwmod: %s: disabled state can only be entered " -		     "from idle, or enabled state\n", oh->name); +		WARN(1, "omap_hwmod: %s: disabled state can only be entered from idle, or enabled state\n", +			oh->name);  		return -EINVAL;  	} @@ -2240,8 +2240,8 @@ void omap_hwmod_ocp_barrier(struct omap_hwmod *oh)  	BUG_ON(!oh);  	if (!oh->class->sysc || !oh->class->sysc->sysc_flags) { -		WARN(1, "omap_device: %s: OCP barrier impossible due to " -		      "device configuration\n", oh->name); +		WARN(1, "omap_device: %s: OCP barrier impossible due to device configuration\n", +			oh->name);  		return;  	} diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c index c11273da5dc..f08e442af39 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c @@ -56,27 +56,6 @@ struct omap_hwmod_class omap2_dss_hwmod_class = {  };  /* - * 'dispc' class - * display controller - */ - -static struct omap_hwmod_class_sysconfig omap2_dispc_sysc = { -	.rev_offs	= 0x0000, -	.sysc_offs	= 0x0010, -	.syss_offs	= 0x0014, -	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE | -			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), -	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | -			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), -	.sysc_fields	= &omap_hwmod_sysc_type1, -}; - -struct omap_hwmod_class omap2_dispc_hwmod_class = { -	.name	= "dispc", -	.sysc	= &omap2_dispc_sysc, -}; - -/*   * 'rfbi' class   * remote frame buffer interface   */ diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c index 177dee20fae..2a6729741b0 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c @@ -28,6 +28,28 @@ struct omap_hwmod_dma_info omap2xxx_dss_sdma_chs[] = {  	{ .name = "dispc", .dma_req = 5 },  	{ .dma_req = -1 }  }; + +/* + * 'dispc' class + * display controller + */ + +static struct omap_hwmod_class_sysconfig omap2_dispc_sysc = { +	.rev_offs	= 0x0000, +	.sysc_offs	= 0x0010, +	.syss_offs	= 0x0014, +	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE | +			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), +	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | +			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), +	.sysc_fields	= &omap_hwmod_sysc_type1, +}; + +struct omap_hwmod_class omap2_dispc_hwmod_class = { +	.name	= "dispc", +	.sysc	= &omap2_dispc_sysc, +}; +  /* OMAP2xxx Timer Common */  static struct omap_hwmod_class_sysconfig omap2xxx_timer_sysc = {  	.rev_offs	= 0x0000, diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 5324e8d93bc..3c8dd928628 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c @@ -1480,6 +1480,28 @@ static struct omap_hwmod omap3xxx_dss_core_hwmod = {  	.masters_cnt	= ARRAY_SIZE(omap3xxx_dss_masters),  }; +/* + * 'dispc' class + * display controller + */ + +static struct omap_hwmod_class_sysconfig omap3_dispc_sysc = { +	.rev_offs	= 0x0000, +	.sysc_offs	= 0x0010, +	.syss_offs	= 0x0014, +	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE | +			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | +			   SYSC_HAS_ENAWAKEUP), +	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | +			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), +	.sysc_fields	= &omap_hwmod_sysc_type1, +}; + +static struct omap_hwmod_class omap3_dispc_hwmod_class = { +	.name	= "dispc", +	.sysc	= &omap3_dispc_sysc, +}; +  /* l4_core -> dss_dispc */  static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dispc = {  	.master		= &omap3xxx_l4_core_hwmod, @@ -1503,7 +1525,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_dss_dispc_slaves[] = {  static struct omap_hwmod omap3xxx_dss_dispc_hwmod = {  	.name		= "dss_dispc", -	.class		= &omap2_dispc_hwmod_class, +	.class		= &omap3_dispc_hwmod_class,  	.mpu_irqs	= omap2_dispc_irqs,  	.main_clk	= "dss1_alwon_fck",  	.prcm		= { @@ -3523,12 +3545,6 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {  	&omap3xxx_uart2_hwmod,  	&omap3xxx_uart3_hwmod, -	/* dss class */ -	&omap3xxx_dss_dispc_hwmod, -	&omap3xxx_dss_dsi1_hwmod, -	&omap3xxx_dss_rfbi_hwmod, -	&omap3xxx_dss_venc_hwmod, -  	/* i2c class */  	&omap3xxx_i2c1_hwmod,  	&omap3xxx_i2c2_hwmod, @@ -3635,6 +3651,15 @@ static __initdata struct omap_hwmod *am35xx_hwmods[] = {  	NULL  }; +static __initdata struct omap_hwmod *omap3xxx_dss_hwmods[] = { +	/* dss class */ +	&omap3xxx_dss_dispc_hwmod, +	&omap3xxx_dss_dsi1_hwmod, +	&omap3xxx_dss_rfbi_hwmod, +	&omap3xxx_dss_venc_hwmod, +	NULL +}; +  int __init omap3xxx_hwmod_init(void)  {  	int r; @@ -3708,6 +3733,21 @@ int __init omap3xxx_hwmod_init(void)  	if (h)  		r = omap_hwmod_register(h); +	if (r < 0) +		return r; + +	/* +	 * DSS code presumes that dss_core hwmod is handled first, +	 * _before_ any other DSS related hwmods so register common +	 * DSS hwmods last to ensure that dss_core is already registered. +	 * Otherwise some change things may happen, for ex. if dispc +	 * is handled before dss_core and DSS is enabled in bootloader +	 * DIPSC will be reset with outputs enabled which sometimes leads +	 * to unrecoverable L3 error. +	 * XXX The long-term fix to this is to ensure modules are set up +	 * in dependency order in the hwmod core code. +	 */ +	r = omap_hwmod_register(omap3xxx_dss_hwmods);  	return r;  } diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index f9f15108176..ef0524c10a8 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c @@ -1031,6 +1031,7 @@ static struct omap_hwmod_dma_info omap44xx_dmic_sdma_reqs[] = {  static struct omap_hwmod_addr_space omap44xx_dmic_addrs[] = {  	{ +		.name		= "mpu",  		.pa_start	= 0x4012e000,  		.pa_end		= 0x4012e07f,  		.flags		= ADDR_TYPE_RT @@ -1049,6 +1050,7 @@ static struct omap_hwmod_ocp_if omap44xx_l4_abe__dmic = {  static struct omap_hwmod_addr_space omap44xx_dmic_dma_addrs[] = {  	{ +		.name		= "dma",  		.pa_start	= 0x4902e000,  		.pa_end		= 0x4902e07f,  		.flags		= ADDR_TYPE_RT diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 1881fe91514..5a65dd04aa3 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c @@ -174,14 +174,17 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,  	freq = clk->rate;  	clk_put(clk); +	rcu_read_lock();  	opp = opp_find_freq_ceil(dev, &freq);  	if (IS_ERR(opp)) { +		rcu_read_unlock();  		pr_err("%s: unable to find boot up OPP for vdd_%s\n",  			__func__, vdd_name);  		goto exit;  	}  	bootup_volt = opp_get_voltage(opp); +	rcu_read_unlock();  	if (!bootup_volt) {  		pr_err("%s: unable to find voltage corresponding "  			"to the bootup OPP for vdd_%s\n", __func__, vdd_name); diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index b8822f8b289..23de98d0384 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c @@ -82,13 +82,7 @@ static int omap2_fclks_active(void)  	f1 = omap2_cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);  	f2 = omap2_cm_read_mod_reg(CORE_MOD, OMAP24XX_CM_FCLKEN2); -	/* Ignore UART clocks.  These are handled by UART core (serial.c) */ -	f1 &= ~(OMAP24XX_EN_UART1_MASK | OMAP24XX_EN_UART2_MASK); -	f2 &= ~OMAP24XX_EN_UART3_MASK; - -	if (f1 | f2) -		return 1; -	return 0; +	return (f1 | f2) ? 1 : 0;  }  static void omap2_enter_full_retention(void) diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c index c1c4d86a79a..9ce765407ad 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c @@ -19,6 +19,7 @@  #include "common.h"  #include <plat/cpu.h>  #include <plat/prcm.h> +#include <plat/irqs.h>  #include "vp.h" diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index 33dd655e6aa..a1d6154dc12 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c @@ -19,6 +19,7 @@  #include "common.h"  #include <plat/cpu.h> +#include <plat/irqs.h>  #include <plat/prcm.h>  #include "vp.h" diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 247d89478f2..f590afc1f67 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -107,18 +107,18 @@ static void omap_uart_set_noidle(struct platform_device *pdev)  	omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_NO);  } -static void omap_uart_set_forceidle(struct platform_device *pdev) +static void omap_uart_set_smartidle(struct platform_device *pdev)  {  	struct omap_device *od = to_omap_device(pdev); -	omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_FORCE); +	omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_SMART);  }  #else  static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)  {}  static void omap_uart_set_noidle(struct platform_device *pdev) {} -static void omap_uart_set_forceidle(struct platform_device *pdev) {} +static void omap_uart_set_smartidle(struct platform_device *pdev) {}  #endif /* CONFIG_PM */  #ifdef CONFIG_OMAP_MUX @@ -349,7 +349,7 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,  	omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;  	omap_up.flags = UPF_BOOT_AUTOCONF;  	omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count; -	omap_up.set_forceidle = omap_uart_set_forceidle; +	omap_up.set_forceidle = omap_uart_set_smartidle;  	omap_up.set_noidle = omap_uart_set_noidle;  	omap_up.enable_wakeup = omap_uart_enable_wakeup;  	omap_up.dma_rx_buf_size = info->dma_rx_buf_size; diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c index 9dd93453e56..7e755bb0ffc 100644 --- a/arch/arm/mach-omap2/smartreflex.c +++ b/arch/arm/mach-omap2/smartreflex.c @@ -897,7 +897,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)  		ret = sr_late_init(sr_info);  		if (ret) {  			pr_warning("%s: Error in SR late init\n", __func__); -			return ret; +			goto err_iounmap;  		}  	} diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 6eeff0e0ae0..5c9acea9576 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c @@ -270,7 +270,7 @@ static struct clocksource clocksource_gpt = {  static u32 notrace dmtimer_read_sched_clock(void)  {  	if (clksrc.reserved) -		return __omap_dm_timer_read_counter(clksrc.io_base, 1); +		return __omap_dm_timer_read_counter(&clksrc, 1);  	return 0;  } diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index 10b20c652e5..4b57757bf9d 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c @@ -270,7 +270,6 @@ static struct regulator_init_data omap4_vusb_idata = {  	.constraints = {  		.min_uV			= 3300000,  		.max_uV			= 3300000, -		.apply_uV		= true,  		.valid_modes_mask	= REGULATOR_MODE_NORMAL  					| REGULATOR_MODE_STANDBY,  		.valid_ops_mask		= REGULATOR_CHANGE_MODE diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c index 771dc781b74..f51348dafaf 100644 --- a/arch/arm/mach-omap2/usb-host.c +++ b/arch/arm/mach-omap2/usb-host.c @@ -486,7 +486,7 @@ static void setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode)  void __init usbhs_init(const struct usbhs_omap_board_data *pdata)  {  	struct omap_hwmod	*oh[2]; -	struct omap_device	*od; +	struct platform_device	*pdev;  	int			bus_id = -1;  	int			i; @@ -522,11 +522,11 @@ void __init usbhs_init(const struct usbhs_omap_board_data *pdata)  		return;  	} -	od = omap_device_build_ss(OMAP_USBHS_DEVICE, bus_id, oh, 2, +	pdev = omap_device_build_ss(OMAP_USBHS_DEVICE, bus_id, oh, 2,  				(void *)&usbhs_data, sizeof(usbhs_data),  				omap_uhhtll_latency,  				ARRAY_SIZE(omap_uhhtll_latency), false); -	if (IS_ERR(od)) { +	if (IS_ERR(pdev)) {  		pr_err("Could not build hwmod devices %s,%s\n",  			USBHS_UHH_HWMODNAME, USBHS_TLL_HWMODNAME);  		return; diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c index 031d116fbf1..175b7d86d86 100644 --- a/arch/arm/mach-omap2/vc.c +++ b/arch/arm/mach-omap2/vc.c @@ -247,7 +247,7 @@ static void __init omap4_vc_init_channel(struct voltagedomain *voltdm)   * omap_vc_i2c_init - initialize I2C interface to PMIC   * @voltdm: voltage domain containing VC data   * - * Use PMIC supplied seetings for I2C high-speed mode and + * Use PMIC supplied settings for I2C high-speed mode and   * master code (if set) and program the VC I2C configuration   * register.   * @@ -265,8 +265,8 @@ static void __init omap_vc_i2c_init(struct voltagedomain *voltdm)  	if (initialized) {  		if (voltdm->pmic->i2c_high_speed != i2c_high_speed) -			pr_warn("%s: I2C config for all channels must match.", -				__func__); +			pr_warn("%s: I2C config for vdd_%s does not match other channels (%u).", +				__func__, voltdm->name, i2c_high_speed);  		return;  	} @@ -292,9 +292,7 @@ void __init omap_vc_init_channel(struct voltagedomain *voltdm)  	u32 val;  	if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) { -		pr_err("%s: PMIC info requried to configure vc for" -			"vdd_%s not populated.Hence cannot initialize vc\n", -			__func__, voltdm->name); +		pr_err("%s: No PMIC info for vdd_%s\n", __func__, voltdm->name);  		return;  	} diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c index c005e2f5e38..57db2038b23 100644 --- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c +++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c @@ -108,6 +108,7 @@ void __init omap3xxx_voltagedomains_init(void)  	 * XXX Will depend on the process, validation, and binning  	 * for the currently-running IC  	 */ +#ifdef CONFIG_PM_OPP  	if (cpu_is_omap3630()) {  		omap3_voltdm_mpu.volt_data = omap36xx_vddmpu_volt_data;  		omap3_voltdm_core.volt_data = omap36xx_vddcore_volt_data; @@ -115,6 +116,7 @@ void __init omap3xxx_voltagedomains_init(void)  		omap3_voltdm_mpu.volt_data = omap34xx_vddmpu_volt_data;  		omap3_voltdm_core.volt_data = omap34xx_vddcore_volt_data;  	} +#endif  	if (cpu_is_omap3517() || cpu_is_omap3505())  		voltdms = voltagedomains_am35xx; diff --git a/arch/arm/mach-omap2/voltagedomains44xx_data.c b/arch/arm/mach-omap2/voltagedomains44xx_data.c index 4e11d022595..c3115f6853d 100644 --- a/arch/arm/mach-omap2/voltagedomains44xx_data.c +++ b/arch/arm/mach-omap2/voltagedomains44xx_data.c @@ -100,9 +100,11 @@ void __init omap44xx_voltagedomains_init(void)  	 * XXX Will depend on the process, validation, and binning  	 * for the currently-running IC  	 */ +#ifdef CONFIG_PM_OPP  	omap4_voltdm_mpu.volt_data = omap44xx_vdd_mpu_volt_data;  	omap4_voltdm_iva.volt_data = omap44xx_vdd_iva_volt_data;  	omap4_voltdm_core.volt_data = omap44xx_vdd_core_volt_data; +#endif  	for (i = 0; voltdm = voltagedomains_omap4[i], voltdm; i++)  		voltdm->sys_clk.name = sys_clk_name; diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c index 807391d84a9..0df88820978 100644 --- a/arch/arm/mach-omap2/vp.c +++ b/arch/arm/mach-omap2/vp.c @@ -41,6 +41,11 @@ void __init omap_vp_init(struct voltagedomain *voltdm)  	u32 val, sys_clk_rate, timeout, waittime;  	u32 vddmin, vddmax, vstepmin, vstepmax; +	if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) { +		pr_err("%s: No PMIC info for vdd_%s\n", __func__, voltdm->name); +		return; +	} +  	if (!voltdm->read || !voltdm->write) {  		pr_err("%s: No read/write API for accessing vdd_%s regs\n",  			__func__, voltdm->name); diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 0e28bae20bd..5dad38ec00e 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c @@ -29,6 +29,7 @@  #include <mach/hardware.h>  #include <mach/orion5x.h>  #include <plat/orion_nand.h> +#include <plat/ehci-orion.h>  #include <plat/time.h>  #include <plat/common.h>  #include <plat/addr-map.h> @@ -72,7 +73,8 @@ void __init orion5x_map_io(void)   ****************************************************************************/  void __init orion5x_ehci0_init(void)  { -	orion_ehci_init(ORION5X_USB0_PHYS_BASE, IRQ_ORION5X_USB0_CTRL); +	orion_ehci_init(ORION5X_USB0_PHYS_BASE, IRQ_ORION5X_USB0_CTRL, +			EHCI_PHY_ORION);  } diff --git a/arch/arm/mach-pxa/devices.c b/arch/arm/mach-pxa/devices.c index 18fd177073f..5bc13121eac 100644 --- a/arch/arm/mach-pxa/devices.c +++ b/arch/arm/mach-pxa/devices.c @@ -415,29 +415,9 @@ static struct resource pxa_rtc_resources[] = {  	},  }; -static struct resource sa1100_rtc_resources[] = { -	[0] = { -		.start  = 0x40900000, -		.end	= 0x409000ff, -		.flags  = IORESOURCE_MEM, -	}, -	[1] = { -		.start  = IRQ_RTC1Hz, -		.end    = IRQ_RTC1Hz, -		.flags  = IORESOURCE_IRQ, -	}, -	[2] = { -		.start  = IRQ_RTCAlrm, -		.end    = IRQ_RTCAlrm, -		.flags  = IORESOURCE_IRQ, -	}, -}; -  struct platform_device sa1100_device_rtc = {  	.name		= "sa1100-rtc",  	.id		= -1, -	.num_resources  = ARRAY_SIZE(sa1100_rtc_resources), -	.resource       = sa1100_rtc_resources,  };  struct platform_device pxa_device_rtc = { diff --git a/arch/arm/mach-pxa/generic.h b/arch/arm/mach-pxa/generic.h index 0d729e6619d..42d5cca6625 100644 --- a/arch/arm/mach-pxa/generic.h +++ b/arch/arm/mach-pxa/generic.h @@ -49,7 +49,6 @@ extern unsigned pxa3xx_get_clk_frequency_khz(int);  #endif  extern struct syscore_ops pxa_irq_syscore_ops; -extern struct syscore_ops pxa_gpio_syscore_ops;  extern struct syscore_ops pxa2xx_mfp_syscore_ops;  extern struct syscore_ops pxa3xx_mfp_syscore_ops; diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c index fb9b62dcf4c..208eef1c048 100644 --- a/arch/arm/mach-pxa/hx4700.c +++ b/arch/arm/mach-pxa/hx4700.c @@ -45,6 +45,7 @@  #include <mach/hx4700.h>  #include <mach/irda.h> +#include <sound/ak4641.h>  #include <video/platform_lcd.h>  #include <video/w100fb.h> @@ -765,6 +766,28 @@ static struct i2c_board_info __initdata pi2c_board_info[] = {  };  /* + * Asahi Kasei AK4641 on I2C + */ + +static struct ak4641_platform_data ak4641_info = { +	.gpio_power = GPIO27_HX4700_CODEC_ON, +	.gpio_npdn  = GPIO109_HX4700_CODEC_nPDN, +}; + +static struct i2c_board_info i2c_board_info[] __initdata = { +	{ +		I2C_BOARD_INFO("ak4641", 0x12), +		.platform_data = &ak4641_info, +	}, +}; + +static struct platform_device audio = { +	.name	= "hx4700-audio", +	.id	= -1, +}; + + +/*   * PCMCIA   */ @@ -790,6 +813,7 @@ static struct platform_device *devices[] __initdata = {  	&gpio_vbus,  	&power_supply,  	&strataflash, +	&audio,  	&pcmcia,  }; @@ -827,6 +851,7 @@ static void __init hx4700_init(void)  	pxa_set_ficp_info(&ficp_info);  	pxa27x_set_i2c_power_info(NULL);  	pxa_set_i2c_info(NULL); +	i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info));  	i2c_register_board_info(1, ARRAY_AND_SIZE(pi2c_board_info));  	pxa2xx_set_spi_info(2, &pxa_ssp2_master_info);  	spi_register_board_info(ARRAY_AND_SIZE(tsc2046_board_info)); diff --git a/arch/arm/mach-pxa/mfp-pxa2xx.c b/arch/arm/mach-pxa/mfp-pxa2xx.c index f14775536b8..29b62afc6f7 100644 --- a/arch/arm/mach-pxa/mfp-pxa2xx.c +++ b/arch/arm/mach-pxa/mfp-pxa2xx.c @@ -226,6 +226,12 @@ static void __init pxa25x_mfp_init(void)  {  	int i; +	/* running before pxa_gpio_probe() */ +#ifdef CONFIG_CPU_PXA26x +	pxa_last_gpio = 89; +#else +	pxa_last_gpio = 84; +#endif  	for (i = 0; i <= pxa_last_gpio; i++)  		gpio_desc[i].valid = 1; @@ -295,6 +301,7 @@ static void __init pxa27x_mfp_init(void)  {  	int i, gpio; +	pxa_last_gpio = 120;	/* running before pxa_gpio_probe() */  	for (i = 0; i <= pxa_last_gpio; i++) {  		/* skip GPIO2, 5, 6, 7, 8, they are not  		 * valid pins allow configuration diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index adf058fa97e..3352b37b60c 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c @@ -25,7 +25,6 @@  #include <linux/suspend.h>  #include <linux/syscore_ops.h>  #include <linux/irq.h> -#include <linux/gpio.h>  #include <asm/mach/map.h>  #include <asm/suspend.h> @@ -210,7 +209,6 @@ static struct clk_lookup pxa25x_clkregs[] = {  	INIT_CLKREG(&clk_pxa25x_gpio12, NULL, "GPIO12_CLK"),  	INIT_CLKREG(&clk_pxa25x_mem, "pxa2xx-pcmcia", NULL),  	INIT_CLKREG(&clk_dummy, "pxa-gpio", NULL), -	INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL),  };  static struct clk_lookup pxa25x_hwuart_clkreg = @@ -370,7 +368,6 @@ static int __init pxa25x_init(void)  		register_syscore_ops(&pxa_irq_syscore_ops);  		register_syscore_ops(&pxa2xx_mfp_syscore_ops); -		register_syscore_ops(&pxa_gpio_syscore_ops);  		register_syscore_ops(&pxa2xx_clock_syscore_ops);  		ret = platform_add_devices(pxa25x_devices, diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index 180bd8675d4..6bce78edce7 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c @@ -22,7 +22,6 @@  #include <linux/io.h>  #include <linux/irq.h>  #include <linux/i2c/pxa-i2c.h> -#include <linux/gpio.h>  #include <asm/mach/map.h>  #include <mach/hardware.h> @@ -231,7 +230,6 @@ static struct clk_lookup pxa27x_clkregs[] = {  	INIT_CLKREG(&clk_pxa27x_memc, NULL, "MEMCLK"),  	INIT_CLKREG(&clk_pxa27x_mem, "pxa2xx-pcmcia", NULL),  	INIT_CLKREG(&clk_dummy, "pxa-gpio", NULL), -	INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL),  };  #ifdef CONFIG_PM @@ -458,7 +456,6 @@ static int __init pxa27x_init(void)  		register_syscore_ops(&pxa_irq_syscore_ops);  		register_syscore_ops(&pxa2xx_mfp_syscore_ops); -		register_syscore_ops(&pxa_gpio_syscore_ops);  		register_syscore_ops(&pxa2xx_clock_syscore_ops);  		ret = platform_add_devices(devices, ARRAY_SIZE(devices)); diff --git a/arch/arm/mach-pxa/pxa300.c b/arch/arm/mach-pxa/pxa300.c index 0388eda7878..40bb16501d8 100644 --- a/arch/arm/mach-pxa/pxa300.c +++ b/arch/arm/mach-pxa/pxa300.c @@ -89,7 +89,6 @@ static DEFINE_PXA3_CKEN(gcu, PXA300_GCU, 0, 0);  static struct clk_lookup common_clkregs[] = {  	INIT_CLKREG(&clk_common_nand, "pxa3xx-nand", NULL),  	INIT_CLKREG(&clk_gcu, "pxa3xx-gcu", NULL), -	INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL),  };  static DEFINE_PXA3_CKEN(pxa310_mmc3, MMC3, 19500000, 0); diff --git a/arch/arm/mach-pxa/pxa320.c b/arch/arm/mach-pxa/pxa320.c index d487e1ff4c9..8d614ecd8e9 100644 --- a/arch/arm/mach-pxa/pxa320.c +++ b/arch/arm/mach-pxa/pxa320.c @@ -83,7 +83,6 @@ static DEFINE_PXA3_CKEN(gcu, PXA320_GCU, 0, 0);  static struct clk_lookup pxa320_clkregs[] = {  	INIT_CLKREG(&clk_pxa320_nand, "pxa3xx-nand", NULL),  	INIT_CLKREG(&clk_gcu, "pxa3xx-gcu", NULL), -	INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL),  };  static int __init pxa320_init(void) diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c index f107c71c758..3918a672238 100644 --- a/arch/arm/mach-pxa/pxa3xx.c +++ b/arch/arm/mach-pxa/pxa3xx.c @@ -67,7 +67,6 @@ static struct clk_lookup pxa3xx_clkregs[] = {  	INIT_CLKREG(&clk_pxa3xx_pout, NULL, "CLK_POUT"),  	/* Power I2C clock is always on */  	INIT_CLKREG(&clk_dummy, "pxa3xx-pwri2c.1", NULL), -	INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL),  	INIT_CLKREG(&clk_pxa3xx_lcd, "pxa2xx-fb", NULL),  	INIT_CLKREG(&clk_pxa3xx_camera, NULL, "CAMCLK"),  	INIT_CLKREG(&clk_pxa3xx_ac97, NULL, "AC97CLK"), @@ -463,7 +462,6 @@ static int __init pxa3xx_init(void)  		register_syscore_ops(&pxa_irq_syscore_ops);  		register_syscore_ops(&pxa3xx_mfp_syscore_ops); -		register_syscore_ops(&pxa_gpio_syscore_ops);  		register_syscore_ops(&pxa3xx_clock_syscore_ops);  		ret = platform_add_devices(devices, ARRAY_SIZE(devices)); diff --git a/arch/arm/mach-pxa/pxa95x.c b/arch/arm/mach-pxa/pxa95x.c index fccc644702e..5ce434b95e8 100644 --- a/arch/arm/mach-pxa/pxa95x.c +++ b/arch/arm/mach-pxa/pxa95x.c @@ -217,7 +217,6 @@ static struct clk_lookup pxa95x_clkregs[] = {  	INIT_CLKREG(&clk_pxa95x_pout, NULL, "CLK_POUT"),  	/* Power I2C clock is always on */  	INIT_CLKREG(&clk_dummy, "pxa3xx-pwri2c.1", NULL), -	INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL),  	INIT_CLKREG(&clk_pxa95x_lcd, "pxa2xx-fb", NULL),  	INIT_CLKREG(&clk_pxa95x_ffuart, "pxa2xx-uart.0", NULL),  	INIT_CLKREG(&clk_pxa95x_btuart, "pxa2xx-uart.1", NULL), @@ -284,7 +283,6 @@ static int __init pxa95x_init(void)  			return ret;  		register_syscore_ops(&pxa_irq_syscore_ops); -		register_syscore_ops(&pxa_gpio_syscore_ops);  		register_syscore_ops(&pxa3xx_clock_syscore_ops);  		ret = platform_add_devices(devices, ARRAY_SIZE(devices)); diff --git a/arch/arm/mach-pxa/saarb.c b/arch/arm/mach-pxa/saarb.c index febc809ed5a..5aded5e6148 100644 --- a/arch/arm/mach-pxa/saarb.c +++ b/arch/arm/mach-pxa/saarb.c @@ -15,7 +15,6 @@  #include <linux/i2c.h>  #include <linux/i2c/pxa-i2c.h>  #include <linux/mfd/88pm860x.h> -#include <linux/gpio.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-pxa/sharpsl_pm.c b/arch/arm/mach-pxa/sharpsl_pm.c index 8d5168d253a..30989baf7f2 100644 --- a/arch/arm/mach-pxa/sharpsl_pm.c +++ b/arch/arm/mach-pxa/sharpsl_pm.c @@ -168,6 +168,7 @@ struct battery_thresh sharpsl_battery_levels_noac[] = {  #define MAXCTRL_SEL_SH   4  #define MAXCTRL_STR      (1u << 7) +extern int max1111_read_channel(int);  /*   * Read MAX1111 ADC   */ @@ -177,8 +178,6 @@ int sharpsl_pm_pxa_read_max1111(int channel)  	if (machine_is_tosa())  	    return 0; -	extern int max1111_read_channel(int); -  	/* max1111 accepts channels from 0-3, however,  	 * it is encoded from 0-7 here in the code.  	 */ diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c index 34cbdac5152..438f02fe122 100644 --- a/arch/arm/mach-pxa/spitz_pm.c +++ b/arch/arm/mach-pxa/spitz_pm.c @@ -172,10 +172,9 @@ static int spitz_should_wakeup(unsigned int resume_on_alarm)  static unsigned long spitz_charger_wakeup(void)  {  	unsigned long ret; -	ret = (!gpio_get_value(SPITZ_GPIO_KEY_INT) +	ret = ((!gpio_get_value(SPITZ_GPIO_KEY_INT)  		<< GPIO_bit(SPITZ_GPIO_KEY_INT)) -		| (!gpio_get_value(SPITZ_GPIO_SYNC) -		<< GPIO_bit(SPITZ_GPIO_SYNC)); +		| gpio_get_value(SPITZ_GPIO_SYNC));  	return ret;  } diff --git a/arch/arm/mach-realview/hotplug.c b/arch/arm/mach-realview/hotplug.c index ac1aed2a8da..eb55f05bef3 100644 --- a/arch/arm/mach-realview/hotplug.c +++ b/arch/arm/mach-realview/hotplug.c @@ -13,6 +13,7 @@  #include <linux/smp.h>  #include <asm/cacheflush.h> +#include <asm/smp_plat.h>  extern volatile int pen_release; diff --git a/arch/arm/mach-realview/include/mach/board-eb.h b/arch/arm/mach-realview/include/mach/board-eb.h index 794a8d91a6a..124bce6b4d7 100644 --- a/arch/arm/mach-realview/include/mach/board-eb.h +++ b/arch/arm/mach-realview/include/mach/board-eb.h @@ -47,21 +47,23 @@  #define REALVIEW_EB_USB_BASE		0x4F000000	/* USB */  #ifdef CONFIG_REALVIEW_EB_ARM11MP_REVB -#define REALVIEW_EB11MP_SCU_BASE	0x10100000	/* SCU registers */ -#define REALVIEW_EB11MP_GIC_CPU_BASE	0x10100100	/* Generic interrupt controller CPU interface */ -#define REALVIEW_EB11MP_TWD_BASE	0x10100600 -#define REALVIEW_EB11MP_GIC_DIST_BASE	0x10101000	/* Generic interrupt controller distributor */ +#define REALVIEW_EB11MP_PRIV_MEM_BASE	0x1F000000  #define REALVIEW_EB11MP_L220_BASE	0x10102000	/* L220 registers */  #define REALVIEW_EB11MP_SYS_PLD_CTRL1	0xD8		/* Register offset for MPCore sysctl */  #else -#define REALVIEW_EB11MP_SCU_BASE	0x1F000000	/* SCU registers */ -#define REALVIEW_EB11MP_GIC_CPU_BASE	0x1F000100	/* Generic interrupt controller CPU interface */ -#define REALVIEW_EB11MP_TWD_BASE	0x1F000600 -#define REALVIEW_EB11MP_GIC_DIST_BASE	0x1F001000	/* Generic interrupt controller distributor */ +#define REALVIEW_EB11MP_PRIV_MEM_BASE	0x1F000000  #define REALVIEW_EB11MP_L220_BASE	0x1F002000	/* L220 registers */  #define REALVIEW_EB11MP_SYS_PLD_CTRL1	0x74		/* Register offset for MPCore sysctl */  #endif +#define REALVIEW_EB11MP_PRIV_MEM_SIZE	SZ_8K +#define REALVIEW_EB11MP_PRIV_MEM_OFF(x)	(REALVIEW_EB11MP_PRIV_MEM_BASE + (x)) + +#define REALVIEW_EB11MP_SCU_BASE	REALVIEW_EB11MP_PRIV_MEM_OFF(0)		/* SCU registers */ +#define REALVIEW_EB11MP_GIC_CPU_BASE	REALVIEW_EB11MP_PRIV_MEM_OFF(0x0100)	/* Generic interrupt controller CPU interface */ +#define REALVIEW_EB11MP_TWD_BASE	REALVIEW_EB11MP_PRIV_MEM_OFF(0x0600) +#define REALVIEW_EB11MP_GIC_DIST_BASE	REALVIEW_EB11MP_PRIV_MEM_OFF(0x1000)	/* Generic interrupt controller distributor */ +  /*   * Core tile identification (REALVIEW_SYS_PROCID)   */ diff --git a/arch/arm/mach-realview/include/mach/board-pb11mp.h b/arch/arm/mach-realview/include/mach/board-pb11mp.h index 7abf918b77e..aa2d4e02ea2 100644 --- a/arch/arm/mach-realview/include/mach/board-pb11mp.h +++ b/arch/arm/mach-realview/include/mach/board-pb11mp.h @@ -75,6 +75,8 @@  /*   * Testchip peripheral and fpga gic regions   */ +#define REALVIEW_TC11MP_PRIV_MEM_BASE		0x1F000000 +#define REALVIEW_TC11MP_PRIV_MEM_SIZE		SZ_8K  #define REALVIEW_TC11MP_SCU_BASE		0x1F000000	/* IRQ, Test chip */  #define REALVIEW_TC11MP_GIC_CPU_BASE		0x1F000100	/* Test chip interrupt controller CPU interface */  #define REALVIEW_TC11MP_TWD_BASE		0x1F000600 diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index e6296211776..9578145f2df 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c @@ -91,14 +91,9 @@ static struct map_desc realview_eb_io_desc[] __initdata = {  static struct map_desc realview_eb11mp_io_desc[] __initdata = {  	{ -		.virtual	= IO_ADDRESS(REALVIEW_EB11MP_SCU_BASE), -		.pfn		= __phys_to_pfn(REALVIEW_EB11MP_SCU_BASE), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= IO_ADDRESS(REALVIEW_EB11MP_GIC_DIST_BASE), -		.pfn		= __phys_to_pfn(REALVIEW_EB11MP_GIC_DIST_BASE), -		.length		= SZ_4K, +		.virtual	= IO_ADDRESS(REALVIEW_EB11MP_PRIV_MEM_BASE), +		.pfn		= __phys_to_pfn(REALVIEW_EB11MP_PRIV_MEM_BASE), +		.length		= REALVIEW_EB11MP_PRIV_MEM_SIZE,  		.type		= MT_DEVICE,  	}, {  		.virtual	= IO_ADDRESS(REALVIEW_EB11MP_L220_BASE), diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index 127a3fd42ab..2147335f66f 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c @@ -64,15 +64,10 @@ static struct map_desc realview_pb11mp_io_desc[] __initdata = {  		.pfn		= __phys_to_pfn(REALVIEW_PB11MP_GIC_DIST_BASE),  		.length		= SZ_4K,  		.type		= MT_DEVICE, -	}, { -		.virtual	= IO_ADDRESS(REALVIEW_TC11MP_GIC_CPU_BASE), -		.pfn		= __phys_to_pfn(REALVIEW_TC11MP_GIC_CPU_BASE), -		.length		= SZ_4K, -		.type		= MT_DEVICE, -	}, { -		.virtual	= IO_ADDRESS(REALVIEW_TC11MP_GIC_DIST_BASE), -		.pfn		= __phys_to_pfn(REALVIEW_TC11MP_GIC_DIST_BASE), -		.length		= SZ_4K, +	}, {	/* Maps the SCU, GIC CPU interface, TWD, GIC DIST */ +		.virtual	= IO_ADDRESS(REALVIEW_TC11MP_PRIV_MEM_BASE), +		.pfn		= __phys_to_pfn(REALVIEW_TC11MP_PRIV_MEM_BASE), +		.length		= REALVIEW_TC11MP_PRIV_MEM_SIZE,  		.type		= MT_DEVICE,  	}, {  		.virtual	= IO_ADDRESS(REALVIEW_SCTL_BASE), diff --git a/arch/arm/mach-s3c2410/cpu-freq.c b/arch/arm/mach-s3c2410/cpu-freq.c index 7dc6c46b5e2..5404535da1a 100644 --- a/arch/arm/mach-s3c2410/cpu-freq.c +++ b/arch/arm/mach-s3c2410/cpu-freq.c @@ -115,7 +115,8 @@ static struct s3c_cpufreq_info s3c2410_cpufreq_info = {  	.debug_io_show	= s3c_cpufreq_debugfs_call(s3c2410_iotiming_debugfs),  }; -static int s3c2410_cpufreq_add(struct device *dev) +static int s3c2410_cpufreq_add(struct device *dev, +			       struct subsys_interface *sif)  {  	return s3c_cpufreq_register(&s3c2410_cpufreq_info);  } @@ -133,7 +134,8 @@ static int __init s3c2410_cpufreq_init(void)  arch_initcall(s3c2410_cpufreq_init); -static int s3c2410a_cpufreq_add(struct device *dev) +static int s3c2410a_cpufreq_add(struct device *dev, +				struct subsys_interface *sif)  {  	/* alter the maximum freq settings for S3C2410A. If a board knows  	 * it only has a maximum of 200, then it should register its own @@ -144,7 +146,7 @@ static int s3c2410a_cpufreq_add(struct device *dev)  	s3c2410_cpufreq_info.max.pclk =  66500000;  	s3c2410_cpufreq_info.name = "s3c2410a"; -	return s3c2410_cpufreq_add(dev); +	return s3c2410_cpufreq_add(dev, sif);  }  static struct subsys_interface s3c2410a_cpufreq_interface = { diff --git a/arch/arm/mach-s3c2410/dma.c b/arch/arm/mach-s3c2410/dma.c index 2afd00014a7..4803338cf56 100644 --- a/arch/arm/mach-s3c2410/dma.c +++ b/arch/arm/mach-s3c2410/dma.c @@ -132,7 +132,8 @@ static struct s3c24xx_dma_order __initdata s3c2410_dma_order = {  	},  }; -static int __init s3c2410_dma_add(struct device *dev) +static int __init s3c2410_dma_add(struct device *dev, +				  struct subsys_interface *sif)  {  	s3c2410_dma_init();  	s3c24xx_dma_order_set(&s3c2410_dma_order); @@ -148,7 +149,7 @@ static struct subsys_interface s3c2410_dma_interface = {  static int __init s3c2410_dma_drvinit(void)  { -	return subsys_interface_register(&s3c2410_interface); +	return subsys_interface_register(&s3c2410_dma_interface);  }  arch_initcall(s3c2410_dma_drvinit); diff --git a/arch/arm/mach-s3c2410/pll.c b/arch/arm/mach-s3c2410/pll.c index c07438bfc99..e0b3b347da8 100644 --- a/arch/arm/mach-s3c2410/pll.c +++ b/arch/arm/mach-s3c2410/pll.c @@ -66,7 +66,7 @@ static struct cpufreq_frequency_table pll_vals_12MHz[] = {      { .frequency = 270000000, .index = PLLVAL(127, 1, 1),  },  }; -static int s3c2410_plls_add(struct device *dev) +static int s3c2410_plls_add(struct device *dev, struct subsys_interface *sif)  {  	return s3c_plltab_register(pll_vals_12MHz, ARRAY_SIZE(pll_vals_12MHz));  } diff --git a/arch/arm/mach-s3c2410/pm.c b/arch/arm/mach-s3c2410/pm.c index fda5385deff..03f706dd600 100644 --- a/arch/arm/mach-s3c2410/pm.c +++ b/arch/arm/mach-s3c2410/pm.c @@ -111,7 +111,7 @@ struct syscore_ops s3c2410_pm_syscore_ops = {  	.resume		= s3c2410_pm_resume,  }; -static int s3c2410_pm_add(struct device *dev) +static int s3c2410_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = s3c2410_pm_prepare;  	pm_cpu_sleep = s3c2410_cpu_suspend; diff --git a/arch/arm/mach-s3c2412/cpu-freq.c b/arch/arm/mach-s3c2412/cpu-freq.c index d8664b7652c..125be7d5fa6 100644 --- a/arch/arm/mach-s3c2412/cpu-freq.c +++ b/arch/arm/mach-s3c2412/cpu-freq.c @@ -194,7 +194,8 @@ static struct s3c_cpufreq_info s3c2412_cpufreq_info = {  	.debug_io_show  = s3c_cpufreq_debugfs_call(s3c2412_iotiming_debugfs),  }; -static int s3c2412_cpufreq_add(struct device *dev) +static int s3c2412_cpufreq_add(struct device *dev, +			       struct subsys_interface *sif)  {  	unsigned long fclk_rate; diff --git a/arch/arm/mach-s3c2412/dma.c b/arch/arm/mach-s3c2412/dma.c index 142acd3b5e1..38472ac920f 100644 --- a/arch/arm/mach-s3c2412/dma.c +++ b/arch/arm/mach-s3c2412/dma.c @@ -159,7 +159,8 @@ static struct s3c24xx_dma_selection __initdata s3c2412_dma_sel = {  	.map_size	= ARRAY_SIZE(s3c2412_dma_mappings),  }; -static int __init s3c2412_dma_add(struct device *dev) +static int __init s3c2412_dma_add(struct device *dev, +				  struct subsys_interface *sif)  {  	s3c2410_dma_init();  	return s3c24xx_dma_init_map(&s3c2412_dma_sel); diff --git a/arch/arm/mach-s3c2412/irq.c b/arch/arm/mach-s3c2412/irq.c index a8a46c1644f..e65619ddbcc 100644 --- a/arch/arm/mach-s3c2412/irq.c +++ b/arch/arm/mach-s3c2412/irq.c @@ -170,7 +170,7 @@ static int s3c2412_irq_rtc_wake(struct irq_data *data, unsigned int state)  static struct irq_chip s3c2412_irq_rtc_chip; -static int s3c2412_irq_add(struct device *dev) +static int s3c2412_irq_add(struct device *dev, struct subsys_interface *sif)  {  	unsigned int irqno; diff --git a/arch/arm/mach-s3c2412/pm.c b/arch/arm/mach-s3c2412/pm.c index d1adfa65f66..d04588506ec 100644 --- a/arch/arm/mach-s3c2412/pm.c +++ b/arch/arm/mach-s3c2412/pm.c @@ -56,7 +56,7 @@ static void s3c2412_pm_prepare(void)  {  } -static int s3c2412_pm_add(struct device *dev) +static int s3c2412_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = s3c2412_pm_prepare;  	pm_cpu_sleep = s3c2412_cpu_suspend; diff --git a/arch/arm/mach-s3c2416/irq.c b/arch/arm/mach-s3c2416/irq.c index 36df761061d..fd49f35e448 100644 --- a/arch/arm/mach-s3c2416/irq.c +++ b/arch/arm/mach-s3c2416/irq.c @@ -213,7 +213,8 @@ static int __init s3c2416_add_sub(unsigned int base,  	return 0;  } -static int __init s3c2416_irq_add(struct device *dev) +static int __init s3c2416_irq_add(struct device *dev, +				  struct subsys_interface *sif)  {  	printk(KERN_INFO "S3C2416: IRQ Support\n"); diff --git a/arch/arm/mach-s3c2416/pm.c b/arch/arm/mach-s3c2416/pm.c index 3bdb15a0d41..1bd4817b8eb 100644 --- a/arch/arm/mach-s3c2416/pm.c +++ b/arch/arm/mach-s3c2416/pm.c @@ -48,7 +48,7 @@ static void s3c2416_pm_prepare(void)  	__raw_writel(virt_to_phys(s3c_cpu_resume), S3C2412_INFORM1);  } -static int s3c2416_pm_add(struct device *dev) +static int s3c2416_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = s3c2416_pm_prepare;  	pm_cpu_sleep = s3c2416_cpu_suspend; diff --git a/arch/arm/mach-s3c2440/clock.c b/arch/arm/mach-s3c2440/clock.c index bedbc87a342..414364eb426 100644 --- a/arch/arm/mach-s3c2440/clock.c +++ b/arch/arm/mach-s3c2440/clock.c @@ -149,7 +149,7 @@ static struct clk_lookup s3c2440_clk_lookup[] = {  	CLKDEV_INIT(NULL, "clk_uart_baud3", &s3c2440_clk_fclk_n),  }; -static int s3c2440_clk_add(struct device *dev) +static int s3c2440_clk_add(struct device *dev, struct subsys_interface *sif)  {  	struct clk *clock_upll;  	struct clk *clock_h; diff --git a/arch/arm/mach-s3c2440/common.h b/arch/arm/mach-s3c2440/common.h index db8a98ac68c..0c1eb1dfc53 100644 --- a/arch/arm/mach-s3c2440/common.h +++ b/arch/arm/mach-s3c2440/common.h @@ -12,6 +12,6 @@  #ifndef __ARCH_ARM_MACH_S3C2440_COMMON_H  #define __ARCH_ARM_MACH_S3C2440_COMMON_H -void s3c2440_restart(char mode, const char *cmd); +void s3c244x_restart(char mode, const char *cmd);  #endif /* __ARCH_ARM_MACH_S3C2440_COMMON_H */ diff --git a/arch/arm/mach-s3c2440/dma.c b/arch/arm/mach-s3c2440/dma.c index 15b1ddf8f62..5f0a0c8ef84 100644 --- a/arch/arm/mach-s3c2440/dma.c +++ b/arch/arm/mach-s3c2440/dma.c @@ -174,7 +174,8 @@ static struct s3c24xx_dma_order __initdata s3c2440_dma_order = {  	},  }; -static int __init s3c2440_dma_add(struct device *dev) +static int __init s3c2440_dma_add(struct device *dev, +				  struct subsys_interface *sif)  {  	s3c2410_dma_init();  	s3c24xx_dma_order_set(&s3c2440_dma_order); diff --git a/arch/arm/mach-s3c2440/irq.c b/arch/arm/mach-s3c2440/irq.c index 4fee9bc6bcb..4a18cde439c 100644 --- a/arch/arm/mach-s3c2440/irq.c +++ b/arch/arm/mach-s3c2440/irq.c @@ -92,7 +92,7 @@ static struct irq_chip s3c_irq_wdtac97 = {  	.irq_ack	= s3c_irq_wdtac97_ack,  }; -static int s3c2440_irq_add(struct device *dev) +static int s3c2440_irq_add(struct device *dev, struct subsys_interface *sif)  {  	unsigned int irqno; diff --git a/arch/arm/mach-s3c2440/mach-anubis.c b/arch/arm/mach-s3c2440/mach-anubis.c index 24569550de1..19b577bc09b 100644 --- a/arch/arm/mach-s3c2440/mach-anubis.c +++ b/arch/arm/mach-s3c2440/mach-anubis.c @@ -487,5 +487,5 @@ MACHINE_START(ANUBIS, "Simtec-Anubis")  	.init_machine	= anubis_init,  	.init_irq	= s3c24xx_init_irq,  	.timer		= &s3c24xx_timer, -	.restart	= s3c2440_restart, +	.restart	= s3c244x_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-at2440evb.c b/arch/arm/mach-s3c2440/mach-at2440evb.c index d6a9763110c..d7ae49c9011 100644 --- a/arch/arm/mach-s3c2440/mach-at2440evb.c +++ b/arch/arm/mach-s3c2440/mach-at2440evb.c @@ -222,5 +222,5 @@ MACHINE_START(AT2440EVB, "AT2440EVB")  	.init_machine	= at2440evb_init,  	.init_irq	= s3c24xx_init_irq,  	.timer		= &s3c24xx_timer, -	.restart	= s3c2440_restart, +	.restart	= s3c244x_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c index 5859e609d28..9a4a5bc008e 100644 --- a/arch/arm/mach-s3c2440/mach-gta02.c +++ b/arch/arm/mach-s3c2440/mach-gta02.c @@ -601,5 +601,5 @@ MACHINE_START(NEO1973_GTA02, "GTA02")  	.init_irq	= s3c24xx_init_irq,  	.init_machine	= gta02_machine_init,  	.timer		= &s3c24xx_timer, -	.restart	= s3c2440_restart, +	.restart	= s3c244x_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-mini2440.c b/arch/arm/mach-s3c2440/mach-mini2440.c index adbbb85bc4c..5d66fb218a4 100644 --- a/arch/arm/mach-s3c2440/mach-mini2440.c +++ b/arch/arm/mach-s3c2440/mach-mini2440.c @@ -701,5 +701,5 @@ MACHINE_START(MINI2440, "MINI2440")  	.init_machine	= mini2440_init,  	.init_irq	= s3c24xx_init_irq,  	.timer		= &s3c24xx_timer, -	.restart	= s3c2440_restart, +	.restart	= s3c244x_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-nexcoder.c b/arch/arm/mach-s3c2440/mach-nexcoder.c index 40eaf844bc1..5198e3e1c5b 100644 --- a/arch/arm/mach-s3c2440/mach-nexcoder.c +++ b/arch/arm/mach-s3c2440/mach-nexcoder.c @@ -158,5 +158,5 @@ MACHINE_START(NEXCODER_2440, "NexVision - Nexcoder 2440")  	.init_machine	= nexcoder_init,  	.init_irq	= s3c24xx_init_irq,  	.timer		= &s3c24xx_timer, -	.restart	= s3c2440_restart, +	.restart	= s3c244x_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-osiris.c b/arch/arm/mach-s3c2440/mach-osiris.c index 4c480ef734f..c5daeb612a8 100644 --- a/arch/arm/mach-s3c2440/mach-osiris.c +++ b/arch/arm/mach-s3c2440/mach-osiris.c @@ -436,5 +436,5 @@ MACHINE_START(OSIRIS, "Simtec-OSIRIS")  	.init_irq	= s3c24xx_init_irq,  	.init_machine	= osiris_init,  	.timer		= &s3c24xx_timer, -	.restart	= s3c2440_restart, +	.restart	= s3c244x_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-rx1950.c b/arch/arm/mach-s3c2440/mach-rx1950.c index 80077f6472e..6f68abf44fa 100644 --- a/arch/arm/mach-s3c2440/mach-rx1950.c +++ b/arch/arm/mach-s3c2440/mach-rx1950.c @@ -822,5 +822,5 @@ MACHINE_START(RX1950, "HP iPAQ RX1950")  	.init_irq = s3c24xx_init_irq,  	.init_machine = rx1950_init_machine,  	.timer = &s3c24xx_timer, -	.restart	= s3c2440_restart, +	.restart	= s3c244x_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-rx3715.c b/arch/arm/mach-s3c2440/mach-rx3715.c index 20103bafbd4..56af3544759 100644 --- a/arch/arm/mach-s3c2440/mach-rx3715.c +++ b/arch/arm/mach-s3c2440/mach-rx3715.c @@ -213,5 +213,5 @@ MACHINE_START(RX3715, "IPAQ-RX3715")  	.init_irq	= rx3715_init_irq,  	.init_machine	= rx3715_init_machine,  	.timer		= &s3c24xx_timer, -	.restart	= s3c2440_restart, +	.restart	= s3c244x_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/mach-smdk2440.c b/arch/arm/mach-s3c2440/mach-smdk2440.c index 1deb60d12a6..83a1036d7dc 100644 --- a/arch/arm/mach-s3c2440/mach-smdk2440.c +++ b/arch/arm/mach-s3c2440/mach-smdk2440.c @@ -183,5 +183,5 @@ MACHINE_START(S3C2440, "SMDK2440")  	.map_io		= smdk2440_map_io,  	.init_machine	= smdk2440_machine_init,  	.timer		= &s3c24xx_timer, -	.restart	= s3c2440_restart, +	.restart	= s3c244x_restart,  MACHINE_END diff --git a/arch/arm/mach-s3c2440/s3c2440-cpufreq.c b/arch/arm/mach-s3c2440/s3c2440-cpufreq.c index cf7596694ef..61776764d9f 100644 --- a/arch/arm/mach-s3c2440/s3c2440-cpufreq.c +++ b/arch/arm/mach-s3c2440/s3c2440-cpufreq.c @@ -270,7 +270,8 @@ struct s3c_cpufreq_info s3c2440_cpufreq_info = {  	.debug_io_show  = s3c_cpufreq_debugfs_call(s3c2410_iotiming_debugfs),  }; -static int s3c2440_cpufreq_add(struct device *dev) +static int s3c2440_cpufreq_add(struct device *dev, +			       struct subsys_interface *sif)  {  	xtal = s3c_cpufreq_clk_get(NULL, "xtal");  	hclk = s3c_cpufreq_clk_get(NULL, "hclk"); diff --git a/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c b/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c index b5368ae8d7f..551fb433be8 100644 --- a/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c +++ b/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c @@ -51,7 +51,7 @@ static struct cpufreq_frequency_table s3c2440_plls_12[] __initdata = {  	{ .frequency = 400000000,	.index = PLLVAL(0x5c, 1, 1),  }, 	/* FVco 800.000000 */  }; -static int s3c2440_plls12_add(struct device *dev) +static int s3c2440_plls12_add(struct device *dev, struct subsys_interface *sif)  {  	struct clk *xtal_clk;  	unsigned long xtal; diff --git a/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c b/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c index 42f2b5cd239..3f15bcf6429 100644 --- a/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c +++ b/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c @@ -79,7 +79,8 @@ static struct cpufreq_frequency_table s3c2440_plls_169344[] __initdata = {  	{ .frequency = 402192000,	.index = PLLVAL(87, 2, 1), 	}, 	/* FVco 804.384000 */  }; -static int s3c2440_plls169344_add(struct device *dev) +static int s3c2440_plls169344_add(struct device *dev, +				  struct subsys_interface *sif)  {  	struct clk *xtal_clk;  	unsigned long xtal; diff --git a/arch/arm/mach-s3c2440/s3c2440.c b/arch/arm/mach-s3c2440/s3c2440.c index 517623a09fc..2b3dddb49af 100644 --- a/arch/arm/mach-s3c2440/s3c2440.c +++ b/arch/arm/mach-s3c2440/s3c2440.c @@ -35,7 +35,6 @@  #include <plat/cpu.h>  #include <plat/s3c244x.h>  #include <plat/pm.h> -#include <plat/watchdog-reset.h>  #include <plat/gpio-core.h>  #include <plat/gpio-cfg.h> @@ -74,15 +73,3 @@ void __init s3c2440_map_io(void)  	s3c24xx_gpiocfg_default.set_pull = s3c24xx_gpio_setpull_1up;  	s3c24xx_gpiocfg_default.get_pull = s3c24xx_gpio_getpull_1up;  } - -void s3c2440_restart(char mode, const char *cmd) -{ -	if (mode == 's') { -		soft_restart(0); -	} - -	arch_wdt_reset(); - -	/* we'll take a jump through zero as a poor second */ -	soft_restart(0); -} diff --git a/arch/arm/mach-s3c2440/s3c2442.c b/arch/arm/mach-s3c2440/s3c2442.c index 8004e0497bf..22cb7c94a8c 100644 --- a/arch/arm/mach-s3c2440/s3c2442.c +++ b/arch/arm/mach-s3c2440/s3c2442.c @@ -122,7 +122,7 @@ static struct clk s3c2442_clk_cam_upll = {  	},  }; -static int s3c2442_clk_add(struct device *dev) +static int s3c2442_clk_add(struct device *dev, struct subsys_interface *sif)  {  	struct clk *clock_upll;  	struct clk *clock_h; diff --git a/arch/arm/mach-s3c2440/s3c244x-clock.c b/arch/arm/mach-s3c2440/s3c244x-clock.c index b3fdbdda3d5..6d9b688c442 100644 --- a/arch/arm/mach-s3c2440/s3c244x-clock.c +++ b/arch/arm/mach-s3c2440/s3c244x-clock.c @@ -72,7 +72,7 @@ static struct clk clk_arm = {  	},  }; -static int s3c244x_clk_add(struct device *dev) +static int s3c244x_clk_add(struct device *dev, struct subsys_interface *sif)  {  	unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN);  	unsigned long clkdivn; diff --git a/arch/arm/mach-s3c2440/s3c244x-irq.c b/arch/arm/mach-s3c2440/s3c244x-irq.c index 74d3dcf46a4..5fe8e58d3af 100644 --- a/arch/arm/mach-s3c2440/s3c244x-irq.c +++ b/arch/arm/mach-s3c2440/s3c244x-irq.c @@ -91,7 +91,7 @@ static struct irq_chip s3c_irq_cam = {  	.irq_ack	= s3c_irq_cam_ack,  }; -static int s3c244x_irq_add(struct device *dev) +static int s3c244x_irq_add(struct device *dev, struct subsys_interface *sif)  {  	unsigned int irqno; diff --git a/arch/arm/mach-s3c2440/s3c244x.c b/arch/arm/mach-s3c2440/s3c244x.c index 36bc60f61d0..d15852f642b 100644 --- a/arch/arm/mach-s3c2440/s3c244x.c +++ b/arch/arm/mach-s3c2440/s3c244x.c @@ -46,6 +46,7 @@  #include <plat/pm.h>  #include <plat/pll.h>  #include <plat/nand-core.h> +#include <plat/watchdog-reset.h>  static struct map_desc s3c244x_iodesc[] __initdata = {  	IODESC_ENT(CLKPWR), @@ -196,3 +197,14 @@ struct syscore_ops s3c244x_pm_syscore_ops = {  	.suspend	= s3c244x_suspend,  	.resume		= s3c244x_resume,  }; + +void s3c244x_restart(char mode, const char *cmd) +{ +	if (mode == 's') +		soft_restart(0); + +	arch_wdt_reset(); + +	/* we'll take a jump through zero as a poor second */ +	soft_restart(0); +} diff --git a/arch/arm/mach-s3c2443/dma.c b/arch/arm/mach-s3c2443/dma.c index de6b4a23c9e..14224517e62 100644 --- a/arch/arm/mach-s3c2443/dma.c +++ b/arch/arm/mach-s3c2443/dma.c @@ -135,7 +135,8 @@ static struct s3c24xx_dma_selection __initdata s3c2443_dma_sel = {  	.map_size	= ARRAY_SIZE(s3c2443_dma_mappings),  }; -static int __init s3c2443_dma_add(struct device *dev) +static int __init s3c2443_dma_add(struct device *dev, +				  struct subsys_interface *sif)  {  	s3c24xx_dma_init(6, IRQ_S3C2443_DMA0, 0x100);  	return s3c24xx_dma_init_map(&s3c2443_dma_sel); diff --git a/arch/arm/mach-s3c2443/irq.c b/arch/arm/mach-s3c2443/irq.c index 35e4ff24fb4..ac2829f56d1 100644 --- a/arch/arm/mach-s3c2443/irq.c +++ b/arch/arm/mach-s3c2443/irq.c @@ -241,7 +241,8 @@ static int __init s3c2443_add_sub(unsigned int base,  	return 0;  } -static int __init s3c2443_irq_add(struct device *dev) +static int __init s3c2443_irq_add(struct device *dev, +				  struct subsys_interface *sif)  {  	printk("S3C2443: IRQ Support\n"); diff --git a/arch/arm/mach-s3c64xx/clock.c b/arch/arm/mach-s3c64xx/clock.c index 31bb27dc4ae..aebbcc291b4 100644 --- a/arch/arm/mach-s3c64xx/clock.c +++ b/arch/arm/mach-s3c64xx/clock.c @@ -138,6 +138,11 @@ static struct clk init_clocks_off[] = {  		.ctrlbit	= S3C_CLKCON_PCLK_TSADC,  	}, {  		.name		= "i2c", +#ifdef CONFIG_S3C_DEV_I2C1 +		.devname        = "s3c2440-i2c.0", +#else +		.devname	= "s3c2440-i2c", +#endif  		.parent		= &clk_p,  		.enable		= s3c64xx_pclk_ctrl,  		.ctrlbit	= S3C_CLKCON_PCLK_IIC, diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c index 4a7394d4bd9..bee7dcd4df7 100644 --- a/arch/arm/mach-s3c64xx/common.c +++ b/arch/arm/mach-s3c64xx/common.c @@ -49,7 +49,7 @@  /* uart registration process */ -void __init s3c64xx_init_uarts(struct s3c2410_uartcfg *cfg, int no) +static void __init s3c64xx_init_uarts(struct s3c2410_uartcfg *cfg, int no)  {  	s3c24xx_init_uartdevs("s3c6400-uart", s3c64xx_uart_resources, cfg, no);  } diff --git a/arch/arm/mach-s5p64x0/pm.c b/arch/arm/mach-s5p64x0/pm.c index 23f9b22439c..9cba18bfe47 100644 --- a/arch/arm/mach-s5p64x0/pm.c +++ b/arch/arm/mach-s5p64x0/pm.c @@ -160,7 +160,7 @@ static void s5p64x0_pm_prepare(void)  } -static int s5p64x0_pm_add(struct device *dev) +static int s5p64x0_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = s5p64x0_pm_prepare;  	pm_cpu_sleep = s5p64x0_cpu_suspend; diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c index c78dfddd77f..b9ec0c35379 100644 --- a/arch/arm/mach-s5pv210/clock.c +++ b/arch/arm/mach-s5pv210/clock.c @@ -175,7 +175,7 @@ static int s5pv210_clk_mask1_ctrl(struct clk *clk, int enable)  	return s5p_gatectrl(S5P_CLK_SRC_MASK1, clk, enable);  } -static int exynos4_clk_hdmiphy_ctrl(struct clk *clk, int enable) +static int s5pv210_clk_hdmiphy_ctrl(struct clk *clk, int enable)  {  	return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable);  } @@ -372,7 +372,7 @@ static struct clk init_clocks_off[] = {  	}, {  		.name		= "hdmiphy",  		.devname	= "s5pv210-hdmi", -		.enable		= exynos4_clk_hdmiphy_ctrl, +		.enable		= s5pv210_clk_hdmiphy_ctrl,  		.ctrlbit	= (1 << 0),  	}, {  		.name		= "dacphy", diff --git a/arch/arm/mach-s5pv210/pm.c b/arch/arm/mach-s5pv210/pm.c index 677c71c41e5..736bfb103cb 100644 --- a/arch/arm/mach-s5pv210/pm.c +++ b/arch/arm/mach-s5pv210/pm.c @@ -133,7 +133,7 @@ static void s5pv210_pm_prepare(void)  	s3c_pm_do_save(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save));  } -static int s5pv210_pm_add(struct device *dev) +static int s5pv210_pm_add(struct device *dev, struct subsys_interface *sif)  {  	pm_cpu_prep = s5pv210_pm_prepare;  	pm_cpu_sleep = s5pv210_cpu_suspend; diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index ebafe8aa895..0c4b76ab4d8 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c @@ -202,7 +202,6 @@ static struct irda_platform_data assabet_irda_data = {  static struct mcp_plat_data assabet_mcp_data = {  	.mccr0		= MCCR0_ADM,  	.sclk_rate	= 11981000, -	.codec		= "ucb1x00",  };  static void __init assabet_init(void) @@ -253,17 +252,6 @@ static void __init assabet_init(void)  	sa11x0_register_mtd(&assabet_flash_data, assabet_flash_resources,  			    ARRAY_SIZE(assabet_flash_resources));  	sa11x0_register_irda(&assabet_irda_data); - -	/* -	 * Setup the PPC unit correctly. -	 */ -	PPDR &= ~PPC_RXD4; -	PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; -	PSDR |= PPC_RXD4; -	PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); -	PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); - -	ASSABET_BCR_set(ASSABET_BCR_CODEC_RST);  	sa11x0_register_mcp(&assabet_mcp_data);  } diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c index d12d0f48b1d..11bb6d0b9be 100644 --- a/arch/arm/mach-sa1100/cerf.c +++ b/arch/arm/mach-sa1100/cerf.c @@ -124,23 +124,12 @@ static void __init cerf_map_io(void)  static struct mcp_plat_data cerf_mcp_data = {  	.mccr0		= MCCR0_ADM,  	.sclk_rate	= 11981000, -	.codec		= "ucb1x00",  };  static void __init cerf_init(void)  {  	platform_add_devices(cerf_devices, ARRAY_SIZE(cerf_devices));  	sa11x0_register_mtd(&cerf_flash_data, &cerf_flash_resource, 1); - -	/* -	 * Setup the PPC unit correctly. -	 */ -	PPDR &= ~PPC_RXD4; -	PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; -	PSDR |= PPC_RXD4; -	PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); -	PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); -  	sa11x0_register_mcp(&cerf_mcp_data);  } diff --git a/arch/arm/mach-sa1100/clock.c b/arch/arm/mach-sa1100/clock.c index d6df9f6c9f7..dab3c6347a8 100644 --- a/arch/arm/mach-sa1100/clock.c +++ b/arch/arm/mach-sa1100/clock.c @@ -11,39 +11,17 @@  #include <linux/clk.h>  #include <linux/spinlock.h>  #include <linux/mutex.h> -#include <linux/io.h> -#include <linux/clkdev.h>  #include <mach/hardware.h> -struct clkops { -	void			(*enable)(struct clk *); -	void			(*disable)(struct clk *); -	unsigned long		(*getrate)(struct clk *); -}; - +/* + * Very simple clock implementation - we only have one clock to deal with. + */  struct clk { -	const struct clkops	*ops; -	unsigned long		rate;  	unsigned int		enabled;  }; -#define INIT_CLKREG(_clk, _devname, _conname)		\ -	{						\ -		.clk		= _clk,			\ -		.dev_id		= _devname,		\ -		.con_id		= _conname,		\ -	} - -#define DEFINE_CLK(_name, _ops, _rate)			\ -struct clk clk_##_name = {				\ -		.ops	= _ops,				\ -		.rate	= _rate,			\ -	} - -static DEFINE_SPINLOCK(clocks_lock); - -static void clk_gpio27_enable(struct clk *clk) +static void clk_gpio27_enable(void)  {  	/*  	 * First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111: @@ -54,22 +32,38 @@ static void clk_gpio27_enable(struct clk *clk)  	TUCR = TUCR_3_6864MHz;  } -static void clk_gpio27_disable(struct clk *clk) +static void clk_gpio27_disable(void)  {  	TUCR = 0;  	GPDR &= ~GPIO_32_768kHz;  	GAFR &= ~GPIO_32_768kHz;  } +static struct clk clk_gpio27; + +static DEFINE_SPINLOCK(clocks_lock); + +struct clk *clk_get(struct device *dev, const char *id) +{ +	const char *devname = dev_name(dev); + +	return strcmp(devname, "sa1111.0") ? ERR_PTR(-ENOENT) : &clk_gpio27; +} +EXPORT_SYMBOL(clk_get); + +void clk_put(struct clk *clk) +{ +} +EXPORT_SYMBOL(clk_put); +  int clk_enable(struct clk *clk)  {  	unsigned long flags;  	spin_lock_irqsave(&clocks_lock, flags);  	if (clk->enabled++ == 0) -		clk->ops->enable(clk); +		clk_gpio27_enable();  	spin_unlock_irqrestore(&clocks_lock, flags); -  	return 0;  }  EXPORT_SYMBOL(clk_enable); @@ -82,48 +76,13 @@ void clk_disable(struct clk *clk)  	spin_lock_irqsave(&clocks_lock, flags);  	if (--clk->enabled == 0) -		clk->ops->disable(clk); +		clk_gpio27_disable();  	spin_unlock_irqrestore(&clocks_lock, flags);  }  EXPORT_SYMBOL(clk_disable);  unsigned long clk_get_rate(struct clk *clk)  { -	unsigned long rate; - -	rate = clk->rate; -	if (clk->ops->getrate) -		rate = clk->ops->getrate(clk); - -	return rate; +	return 3686400;  }  EXPORT_SYMBOL(clk_get_rate); - -const struct clkops clk_gpio27_ops = { -	.enable		= clk_gpio27_enable, -	.disable	= clk_gpio27_disable, -}; - -static void clk_dummy_enable(struct clk *clk) { } -static void clk_dummy_disable(struct clk *clk) { } - -const struct clkops clk_dummy_ops = { -	.enable		= clk_dummy_enable, -	.disable	= clk_dummy_disable, -}; - -static DEFINE_CLK(gpio27, &clk_gpio27_ops, 3686400); -static DEFINE_CLK(dummy, &clk_dummy_ops, 0); - -static struct clk_lookup sa11xx_clkregs[] = { -	INIT_CLKREG(&clk_gpio27, "sa1111.0", NULL), -	INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL), -}; - -static int __init sa11xx_clk_init(void) -{ -	clkdev_add_table(sa11xx_clkregs, ARRAY_SIZE(sa11xx_clkregs)); -	return 0; -} - -postcore_initcall(sa11xx_clk_init); diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index c483912d08a..fd5652118ed 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c @@ -27,7 +27,6 @@  #include <linux/timer.h>  #include <linux/gpio.h>  #include <linux/pda_power.h> -#include <linux/mfd/ucb1x00.h>  #include <mach/hardware.h>  #include <asm/mach-types.h> @@ -86,15 +85,10 @@ static struct scoop_pcmcia_config collie_pcmcia_config = {  	.num_devs	= 1,  }; -static struct ucb1x00_plat_data collie_ucb1x00_data = { -	.gpio_base	= COLLIE_TC35143_GPIO_BASE, -}; -  static struct mcp_plat_data collie_mcp_data = {  	.mccr0		= MCCR0_ADM | MCCR0_ExtClk,  	.sclk_rate	= 9216000, -	.codec		= "ucb1x00", -	.codec_pdata	= &collie_ucb1x00_data, +	.gpio_base	= COLLIE_TC35143_GPIO_BASE,  };  /* @@ -144,8 +138,6 @@ static struct pda_power_pdata collie_power_data = {  static struct resource collie_power_resource[] = {  	{  		.name		= "ac", -		.start		= gpio_to_irq(COLLIE_GPIO_AC_IN), -		.end		= gpio_to_irq(COLLIE_GPIO_AC_IN),  		.flags		= IORESOURCE_IRQ |  				  IORESOURCE_IRQ_HIGHEDGE |  				  IORESOURCE_IRQ_LOWEDGE, @@ -347,7 +339,8 @@ static void __init collie_init(void)  	GPSR |= _COLLIE_GPIO_UCB1x00_RESET; - +	collie_power_resource[0].start = gpio_to_irq(COLLIE_GPIO_AC_IN); +	collie_power_resource[0].end = gpio_to_irq(COLLIE_GPIO_AC_IN);  	platform_scoop_config = &collie_pcmcia_config;  	ret = platform_add_devices(devices, ARRAY_SIZE(devices)); @@ -357,16 +350,6 @@ static void __init collie_init(void)  	sa11x0_register_mtd(&collie_flash_data, collie_flash_resources,  			    ARRAY_SIZE(collie_flash_resources)); - -	/* -	 * Setup the PPC unit correctly. -	 */ -	PPDR &= ~PPC_RXD4; -	PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; -	PSDR |= PPC_RXD4; -	PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); -	PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); -  	sa11x0_register_mcp(&collie_mcp_data);  	sharpsl_save_param(); diff --git a/arch/arm/mach-sa1100/cpu-sa1100.c b/arch/arm/mach-sa1100/cpu-sa1100.c index aaa8acf76b7..19b2053f5af 100644 --- a/arch/arm/mach-sa1100/cpu-sa1100.c +++ b/arch/arm/mach-sa1100/cpu-sa1100.c @@ -228,7 +228,7 @@ static int __init sa1100_cpu_init(struct cpufreq_policy *policy)  	return 0;  } -static struct cpufreq_driver sa1100_driver = { +static struct cpufreq_driver sa1100_driver __refdata = {  	.flags		= CPUFREQ_STICKY,  	.verify		= sa11x0_verify_speed,  	.target		= sa1100_target, diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index e3a28ca2a7b..bb10ee2cb89 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c @@ -217,15 +217,10 @@ static struct platform_device sa11x0uart3_device = {  static struct resource sa11x0mcp_resources[] = {  	[0] = {  		.start	= __PREG(Ser4MCCR0), -		.end	= __PREG(Ser4MCCR0) + 0x1C - 1, +		.end	= __PREG(Ser4MCCR0) + 0xffff,  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= __PREG(Ser4MCCR1), -		.end	= __PREG(Ser4MCCR1) + 0x4 - 1, -		.flags	= IORESOURCE_MEM, -	}, -	[2] = {  		.start	= IRQ_Ser4MCP,  		.end	= IRQ_Ser4MCP,  		.flags	= IORESOURCE_IRQ, @@ -350,29 +345,9 @@ void sa11x0_register_irda(struct irda_platform_data *irda)  	sa11x0_register_device(&sa11x0ir_device, irda);  } -static struct resource sa11x0rtc_resources[] = { -	[0] = { -		.start	= 0x90010000, -		.end	= 0x900100ff, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= IRQ_RTC1Hz, -		.end	= IRQ_RTC1Hz, -		.flags	= IORESOURCE_IRQ, -	}, -	[2] = { -		.start	= IRQ_RTCAlrm, -		.end	= IRQ_RTCAlrm, -		.flags	= IORESOURCE_IRQ, -	}, -}; -  static struct platform_device sa11x0rtc_device = {  	.name		= "sa1100-rtc",  	.id		= -1, -	.resource	= sa11x0rtc_resources, -	.num_resources	= ARRAY_SIZE(sa11x0rtc_resources),  };  static struct platform_device *sa11x0_devices[] __initdata = { diff --git a/arch/arm/mach-sa1100/include/mach/mcp.h b/arch/arm/mach-sa1100/include/mach/mcp.h index 586cec898b3..ed1a331508a 100644 --- a/arch/arm/mach-sa1100/include/mach/mcp.h +++ b/arch/arm/mach-sa1100/include/mach/mcp.h @@ -17,8 +17,6 @@ struct mcp_plat_data {  	u32 mccr1;  	unsigned int sclk_rate;  	int gpio_base; -	const char *codec; -	void *codec_pdata;  };  #endif diff --git a/arch/arm/mach-sa1100/jornada720_ssp.c b/arch/arm/mach-sa1100/jornada720_ssp.c index f50b00bd18a..b412fc09c80 100644 --- a/arch/arm/mach-sa1100/jornada720_ssp.c +++ b/arch/arm/mach-sa1100/jornada720_ssp.c @@ -198,3 +198,5 @@ static int __init jornada_ssp_init(void)  {  	return platform_driver_register(&jornadassp_driver);  } + +module_init(jornada_ssp_init); diff --git a/arch/arm/mach-sa1100/lart.c b/arch/arm/mach-sa1100/lart.c index d117ceab621..af4e2761f3d 100644 --- a/arch/arm/mach-sa1100/lart.c +++ b/arch/arm/mach-sa1100/lart.c @@ -24,20 +24,10 @@  static struct mcp_plat_data lart_mcp_data = {  	.mccr0		= MCCR0_ADM,  	.sclk_rate	= 11981000, -	.codec		= "ucb1x00",  };  static void __init lart_init(void)  { -	/* -	 * Setup the PPC unit correctly. -	 */ -	PPDR &= ~PPC_RXD4; -	PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; -	PSDR |= PPC_RXD4; -	PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); -	PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); -  	sa11x0_register_mcp(&lart_mcp_data);  } diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c index 748d34435b3..318b2b766a0 100644 --- a/arch/arm/mach-sa1100/shannon.c +++ b/arch/arm/mach-sa1100/shannon.c @@ -55,22 +55,11 @@ static struct resource shannon_flash_resource = {  static struct mcp_plat_data shannon_mcp_data = {  	.mccr0		= MCCR0_ADM,  	.sclk_rate	= 11981000, -	.codec		= "ucb1x00",  };  static void __init shannon_init(void)  {  	sa11x0_register_mtd(&shannon_flash_data, &shannon_flash_resource, 1); - -	/* -	 * Setup the PPC unit correctly. -	 */ -	PPDR &= ~PPC_RXD4; -	PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; -	PSDR |= PPC_RXD4; -	PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); -	PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); -  	sa11x0_register_mcp(&shannon_mcp_data);  } diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c index 458ececefa5..e17c04d6e32 100644 --- a/arch/arm/mach-sa1100/simpad.c +++ b/arch/arm/mach-sa1100/simpad.c @@ -14,7 +14,6 @@  #include <linux/mtd/partitions.h>  #include <linux/io.h>  #include <linux/gpio.h> -#include <linux/mfd/ucb1x00.h>  #include <asm/irq.h>  #include <mach/hardware.h> @@ -188,15 +187,10 @@ static struct resource simpad_flash_resources [] = {  	}  }; -static struct ucb1x00_plat_data simpad_ucb1x00_data = { -	.gpio_base	= SIMPAD_UCB1X00_GPIO_BASE, -}; -  static struct mcp_plat_data simpad_mcp_data = {  	.mccr0		= MCCR0_ADM,  	.sclk_rate	= 11981000, -	.codec		= "ucb1300", -	.codec_pdata	= &simpad_ucb1x00_data, +	.gpio_base	= SIMPAD_UCB1X00_GPIO_BASE,  }; @@ -384,16 +378,6 @@ static int __init simpad_init(void)  	sa11x0_register_mtd(&simpad_flash_data, simpad_flash_resources,  			      ARRAY_SIZE(simpad_flash_resources)); - -	/* -	 * Setup the PPC unit correctly. -	 */ -	PPDR &= ~PPC_RXD4; -	PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; -	PSDR |= PPC_RXD4; -	PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); -	PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); -  	sa11x0_register_mcp(&simpad_mcp_data);  	ret = platform_add_devices(devices, ARRAY_SIZE(devices)); diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index eff8a96c75e..068b754bc34 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c @@ -30,6 +30,7 @@  #include <linux/serial_sci.h>  #include <linux/smsc911x.h>  #include <linux/gpio.h> +#include <linux/videodev2.h>  #include <linux/input.h>  #include <linux/input/sh_keysc.h>  #include <linux/mmc/host.h> @@ -37,7 +38,6 @@  #include <linux/mmc/sh_mobile_sdhi.h>  #include <linux/mfd/tmio.h>  #include <linux/sh_clk.h> -#include <linux/dma-mapping.h>  #include <video/sh_mobile_lcdc.h>  #include <video/sh_mipi_dsi.h>  #include <sound/sh_fsi.h> @@ -159,19 +159,12 @@ static struct resource sh_mmcif_resources[] = {  	},  }; -static struct sh_mmcif_dma sh_mmcif_dma = { -	.chan_priv_rx	= { -		.slave_id	= SHDMA_SLAVE_MMCIF_RX, -	}, -	.chan_priv_tx	= { -		.slave_id	= SHDMA_SLAVE_MMCIF_TX, -	}, -};  static struct sh_mmcif_plat_data sh_mmcif_platdata = {  	.sup_pclk	= 0,  	.ocr		= MMC_VDD_165_195,  	.caps		= MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE, -	.dma		= &sh_mmcif_dma, +	.slave_id_tx	= SHDMA_SLAVE_MMCIF_TX, +	.slave_id_rx	= SHDMA_SLAVE_MMCIF_RX,  };  static struct platform_device mmc_device = { @@ -321,12 +314,11 @@ static struct resource mipidsi0_resources[] = {  	},  }; -#define DSI0PHYCR	0xe615006c  static int sh_mipi_set_dot_clock(struct platform_device *pdev,  				 void __iomem *base,  				 int enable)  { -	struct clk *pck; +	struct clk *pck, *phy;  	int ret;  	pck = clk_get(&pdev->dev, "dsip_clk"); @@ -335,18 +327,27 @@ static int sh_mipi_set_dot_clock(struct platform_device *pdev,  		goto sh_mipi_set_dot_clock_pck_err;  	} +	phy = clk_get(&pdev->dev, "dsiphy_clk"); +	if (IS_ERR(phy)) { +		ret = PTR_ERR(phy); +		goto sh_mipi_set_dot_clock_phy_err; +	} +  	if (enable) {  		clk_set_rate(pck, clk_round_rate(pck,  24000000)); -		__raw_writel(0x2a809010, DSI0PHYCR); +		clk_set_rate(phy, clk_round_rate(pck, 510000000));  		clk_enable(pck); +		clk_enable(phy);  	} else {  		clk_disable(pck); +		clk_disable(phy);  	}  	ret = 0; +	clk_put(phy); +sh_mipi_set_dot_clock_phy_err:  	clk_put(pck); -  sh_mipi_set_dot_clock_pck_err:  	return ret;  } diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index aab0a349f75..eeb4d966458 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c @@ -295,15 +295,6 @@ static struct resource sh_mmcif_resources[] = {  	},  }; -static struct sh_mmcif_dma sh_mmcif_dma = { -	.chan_priv_rx	= { -		.slave_id	= SHDMA_SLAVE_MMCIF_RX, -	}, -	.chan_priv_tx	= { -		.slave_id	= SHDMA_SLAVE_MMCIF_TX, -	}, -}; -  static struct sh_mmcif_plat_data sh_mmcif_plat = {  	.sup_pclk	= 0,  	.ocr		= MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, @@ -311,7 +302,8 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = {  			  MMC_CAP_8_BIT_DATA |  			  MMC_CAP_NEEDS_POLL,  	.get_cd		= slot_cn7_get_cd, -	.dma		= &sh_mmcif_dma, +	.slave_id_tx	= SHDMA_SLAVE_MMCIF_TX, +	.slave_id_rx	= SHDMA_SLAVE_MMCIF_RX,  };  static struct platform_device sh_mmcif_device = { diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c index 857ceeec1bb..c8e7ca23fc0 100644 --- a/arch/arm/mach-shmobile/board-kota2.c +++ b/arch/arm/mach-shmobile/board-kota2.c @@ -143,11 +143,10 @@ static struct gpio_keys_button gpio_buttons[] = {  static struct gpio_keys_platform_data gpio_key_info = {  	.buttons        = gpio_buttons,  	.nbuttons       = ARRAY_SIZE(gpio_buttons), -	.poll_interval  = 250, /* polled for now */  };  static struct platform_device gpio_keys_device = { -	.name   = "gpio-keys-polled", /* polled for now */ +	.name   = "gpio-keys",  	.id     = -1,  	.dev    = {  		.platform_data  = &gpio_key_info, diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 9b42fbd10f8..a2813247b45 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c @@ -43,7 +43,6 @@  #include <linux/smsc911x.h>  #include <linux/sh_intc.h>  #include <linux/tca6416_keypad.h> -#include <linux/usb/r8a66597.h>  #include <linux/usb/renesas_usbhs.h>  #include <linux/dma-mapping.h> @@ -145,11 +144,6 @@   * 1-2 short | VBUS 5V       | Host   * open      | external VBUS | Function   * - * *1 - * CN31 is used as - * CONFIG_USB_R8A66597_HCD	Host - * CONFIG_USB_RENESAS_USBHS	Function - *   * CAUTION   *   * renesas_usbhs driver can use external interrupt mode @@ -161,15 +155,6 @@   * mackerel can not use external interrupt (IRQ7-PORT167) mode on "USB0",   * because Touchscreen is using IRQ7-PORT40.   * It is impossible to use IRQ7 demux on this board. - * - * We can use external interrupt mode USB-Function on "USB1". - * 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_SHARED / IORESOURCE_IRQ_SHAREABLE. - * - * Actually these are old/new version of USB driver. - * This mean its register will be broken if it supports shared IRQ,   */  /* @@ -208,6 +193,16 @@   */  /* + * FSI - AK4642 + * + * it needs amixer settings for playing + * + * amixer set "Headphone" on + * amixer set "HPOUTL Mixer DACH" on + * amixer set "HPOUTR Mixer DACH" on + */ + +/*   * FIXME !!   *   * gpio_no_direction @@ -676,51 +671,16 @@ static struct platform_device usbhs0_device = {   * Use J30 to select between Host and Function. This setting   * can however not be detected by software. Hotplug of USBHS1   * is provided via IRQ8. + * + * Current USB1 works as "USB Host". + *  - set J30 "short" + * + * If you want to use it as "USB gadget", + *  - J30 "open" + *  - modify usbhs1_get_id() USBHS_HOST -> USBHS_GADGET + *  - add .get_vbus = usbhs_get_vbus in usbhs1_private   */  #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 */ -		return; - -	/* set VBOUT/PWEN and EXTLP1 in DVSTCTR */ -	__raw_writew(__raw_readw(0xE68B0008) | 0x600, 0xE68B0008); -} - -static struct r8a66597_platdata usb1_host_data = { -	.on_chip	= 1, -	.port_power	= usb1_host_port_power, -}; - -static struct resource usb1_host_resources[] = { -	[0] = { -		.name	= "USBHS1", -		.start	= 0xe68b0000, -		.end	= 0xe68b00e6 - 1, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= evt2irq(0x1ce0) /* USB1_USB1I0 */, -		.flags	= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device usb1_host_device = { -	.name	= "r8a66597_hcd", -	.id	= 1, -	.dev = { -		.dma_mask		= NULL,         /*  not use dma */ -		.coherent_dma_mask	= 0xffffffff, -		.platform_data		= &usb1_host_data, -	}, -	.num_resources	= ARRAY_SIZE(usb1_host_resources), -	.resource	= usb1_host_resources, -}; - -/* 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) @@ -776,7 +736,7 @@ static void usbhs1_hardware_exit(struct platform_device *pdev)  static int usbhs1_get_id(struct platform_device *pdev)  { -	return USBHS_GADGET; +	return USBHS_HOST;  }  static u32 usbhs1_pipe_cfg[] = { @@ -807,7 +767,6 @@ static struct usbhs_private usbhs1_private = {  			.hardware_exit	= usbhs1_hardware_exit,  			.get_id		= usbhs1_get_id,  			.phy_reset	= usbhs_phy_reset, -			.get_vbus	= usbhs_get_vbus,  		},  		.driver_param = {  			.buswait_bwait	= 4, @@ -1184,15 +1143,6 @@ static struct resource sh_mmcif_resources[] = {  	},  }; -static struct sh_mmcif_dma sh_mmcif_dma = { -	.chan_priv_rx	= { -		.slave_id	= SHDMA_SLAVE_MMCIF_RX, -	}, -	.chan_priv_tx	= { -		.slave_id	= SHDMA_SLAVE_MMCIF_TX, -	}, -}; -  static struct sh_mmcif_plat_data sh_mmcif_plat = {  	.sup_pclk	= 0,  	.ocr		= MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, @@ -1200,7 +1150,8 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = {  			  MMC_CAP_8_BIT_DATA |  			  MMC_CAP_NEEDS_POLL,  	.get_cd		= slot_cn7_get_cd, -	.dma		= &sh_mmcif_dma, +	.slave_id_tx	= SHDMA_SLAVE_MMCIF_TX, +	.slave_id_rx	= SHDMA_SLAVE_MMCIF_RX,  };  static struct platform_device sh_mmcif_device = { @@ -1311,7 +1262,6 @@ static struct platform_device *mackerel_devices[] __initdata = {  	&nor_flash_device,  	&smc911x_device,  	&lcdc_device, -	&usb1_host_device,  	&usbhs1_device,  	&usbhs0_device,  	&leds_device, @@ -1473,9 +1423,6 @@ static void __init mackerel_init(void)  	gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */  	gpio_request(GPIO_FN_IDIN_1_113, NULL); -	/* 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);  	gpio_request(GPIO_FN_FSIAILR,	NULL); diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index afbead6a6e1..7727cca6136 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c @@ -365,6 +365,114 @@ static struct clk div6_clks[DIV6_NR] = {  			dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3),  }; +/* DSI DIV */ +static unsigned long dsiphy_recalc(struct clk *clk) +{ +	u32 value; + +	value = __raw_readl(clk->mapping->base); + +	/* FIXME */ +	if (!(value & 0x000B8000)) +		return clk->parent->rate; + +	value &= 0x3f; +	value += 1; + +	if ((value < 12) || +	    (value > 33)) { +		pr_err("DSIPHY has wrong value (%d)", value); +		return 0; +	} + +	return clk->parent->rate / value; +} + +static long dsiphy_round_rate(struct clk *clk, unsigned long rate) +{ +	return clk_rate_mult_range_round(clk, 12, 33, rate); +} + +static void dsiphy_disable(struct clk *clk) +{ +	u32 value; + +	value = __raw_readl(clk->mapping->base); +	value &= ~0x000B8000; + +	__raw_writel(value , clk->mapping->base); +} + +static int dsiphy_enable(struct clk *clk) +{ +	u32 value; +	int multi; + +	value = __raw_readl(clk->mapping->base); +	multi = (value & 0x3f) + 1; + +	if ((multi < 12) || (multi > 33)) +		return -EIO; + +	__raw_writel(value | 0x000B8000, clk->mapping->base); + +	return 0; +} + +static int dsiphy_set_rate(struct clk *clk, unsigned long rate) +{ +	u32 value; +	int idx; + +	idx = rate / clk->parent->rate; +	if ((idx < 12) || (idx > 33)) +		return -EINVAL; + +	idx += -1; + +	value = __raw_readl(clk->mapping->base); +	value = (value & ~0x3f) + idx; + +	__raw_writel(value, clk->mapping->base); + +	return 0; +} + +static struct clk_ops dsiphy_clk_ops = { +	.recalc		= dsiphy_recalc, +	.round_rate	= dsiphy_round_rate, +	.set_rate	= dsiphy_set_rate, +	.enable		= dsiphy_enable, +	.disable	= dsiphy_disable, +}; + +static struct clk_mapping dsi0phy_clk_mapping = { +	.phys	= DSI0PHYCR, +	.len	= 4, +}; + +static struct clk_mapping dsi1phy_clk_mapping = { +	.phys	= DSI1PHYCR, +	.len	= 4, +}; + +static struct clk dsi0phy_clk = { +	.ops		= &dsiphy_clk_ops, +	.parent		= &div6_clks[DIV6_DSI0P], /* late install */ +	.mapping	= &dsi0phy_clk_mapping, +}; + +static struct clk dsi1phy_clk = { +	.ops		= &dsiphy_clk_ops, +	.parent		= &div6_clks[DIV6_DSI1P], /* late install */ +	.mapping	= &dsi1phy_clk_mapping, +}; + +static struct clk *late_main_clks[] = { +	&dsi0phy_clk, +	&dsi1phy_clk, +}; +  enum { MSTP001,  	MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100,  	MSTP219, @@ -429,6 +537,8 @@ static struct clk_lookup lookups[] = {  	CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]),  	CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]),  	CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSI1P]), +	CLKDEV_ICK_ID("dsiphy_clk", "sh-mipi-dsi.0", &dsi0phy_clk), +	CLKDEV_ICK_ID("dsiphy_clk", "sh-mipi-dsi.1", &dsi1phy_clk),  	/* MSTP32 clocks */  	CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ @@ -504,6 +614,9 @@ void __init sh73a0_clock_init(void)  	if (!ret)  		ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); +	for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++) +		ret = clk_register(late_main_clks[k]); +  	clkdev_add_table(lookups, ARRAY_SIZE(lookups));  	if (!ret) diff --git a/arch/arm/mach-shmobile/include/mach/sh73a0.h b/arch/arm/mach-shmobile/include/mach/sh73a0.h index 881d515a968..cad57578cee 100644 --- a/arch/arm/mach-shmobile/include/mach/sh73a0.h +++ b/arch/arm/mach-shmobile/include/mach/sh73a0.h @@ -515,8 +515,8 @@ enum {  	SHDMA_SLAVE_MMCIF_RX,  }; -/* PINT interrupts are located at Linux IRQ 768 and up */ -#define SH73A0_PINT0_IRQ(irq) ((irq) + 768) -#define SH73A0_PINT1_IRQ(irq) ((irq) + 800) +/* PINT interrupts are located at Linux IRQ 800 and up */ +#define SH73A0_PINT0_IRQ(irq) ((irq) + 800) +#define SH73A0_PINT1_IRQ(irq) ((irq) + 832)  #endif /* __ASM_SH73A0_H__ */ diff --git a/arch/arm/mach-shmobile/intc-sh73a0.c b/arch/arm/mach-shmobile/intc-sh73a0.c index 1eda6b0b69e..9857595eaa7 100644 --- a/arch/arm/mach-shmobile/intc-sh73a0.c +++ b/arch/arm/mach-shmobile/intc-sh73a0.c @@ -19,6 +19,7 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/interrupt.h> +#include <linux/module.h>  #include <linux/irq.h>  #include <linux/io.h>  #include <linux/sh_intc.h> @@ -445,6 +446,7 @@ void __init sh73a0_init_irq(void)  		setup_irq(gic_spi(1 + k), &sh73a0_irq_pin_cascade[k]);  		n = intcs_evt2irq(to_intc_vect(gic_spi(1 + k))); +		WARN_ON(irq_alloc_desc_at(n, numa_node_id()) != n);  		irq_set_chip_and_handler_name(n, &intca_gic_irq_chip,  					      handle_level_irq, "level");  		set_irq_flags(n, IRQF_VALID); /* yuck */ diff --git a/arch/arm/mach-shmobile/pfc-r8a7779.c b/arch/arm/mach-shmobile/pfc-r8a7779.c index 963532f2b2c..d14c9b04807 100644 --- a/arch/arm/mach-shmobile/pfc-r8a7779.c +++ b/arch/arm/mach-shmobile/pfc-r8a7779.c @@ -2120,7 +2120,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {  	    FN_AUDATA3, 0, 0, 0 }  	},  	{ PINMUX_CFG_REG_VAR("IPSR4", 0xfffc0030, 32, -			     3, 1, 1, 1, 1, 1, 1, 3, 3, 1, +			     3, 1, 1, 1, 1, 1, 1, 3, 3,  			     1, 1, 1, 1, 1, 1, 3, 3, 3, 2) {  	    /* IP4_31_29 [3] */  	    FN_DU1_DB0, FN_VI2_DATA4_VI2_B4, FN_SCL2_B, FN_SD3_DAT0, diff --git a/arch/arm/mach-shmobile/pfc-sh7372.c b/arch/arm/mach-shmobile/pfc-sh7372.c index 1bd6585a6ac..336093f9210 100644 --- a/arch/arm/mach-shmobile/pfc-sh7372.c +++ b/arch/arm/mach-shmobile/pfc-sh7372.c @@ -23,6 +23,7 @@  #include <linux/init.h>  #include <linux/kernel.h>  #include <linux/gpio.h> +#include <mach/irqs.h>  #include <mach/sh7372.h>  #define CPU_ALL_PORT(fn, pfx, sfx) \ @@ -1594,6 +1595,43 @@ static struct pinmux_data_reg pinmux_data_regs[] = {  	{ },  }; +#define EXT_IRQ16L(n) evt2irq(0x200 + ((n) << 5)) +#define EXT_IRQ16H(n) evt2irq(0x3200 + (((n) - 16) << 5)) +static struct pinmux_irq pinmux_irqs[] = { +	PINMUX_IRQ(EXT_IRQ16L(0), PORT6_FN0, PORT162_FN0), +	PINMUX_IRQ(EXT_IRQ16L(1), PORT12_FN0), +	PINMUX_IRQ(EXT_IRQ16L(2), PORT4_FN0, PORT5_FN0), +	PINMUX_IRQ(EXT_IRQ16L(3), PORT8_FN0, PORT16_FN0), +	PINMUX_IRQ(EXT_IRQ16L(4), PORT17_FN0, PORT163_FN0), +	PINMUX_IRQ(EXT_IRQ16L(5), PORT18_FN0), +	PINMUX_IRQ(EXT_IRQ16L(6), PORT39_FN0, PORT164_FN0), +	PINMUX_IRQ(EXT_IRQ16L(7), PORT40_FN0, PORT167_FN0), +	PINMUX_IRQ(EXT_IRQ16L(8), PORT41_FN0, PORT168_FN0), +	PINMUX_IRQ(EXT_IRQ16L(9), PORT42_FN0, PORT169_FN0), +	PINMUX_IRQ(EXT_IRQ16L(10), PORT65_FN0), +	PINMUX_IRQ(EXT_IRQ16L(11), PORT67_FN0), +	PINMUX_IRQ(EXT_IRQ16L(12), PORT80_FN0, PORT137_FN0), +	PINMUX_IRQ(EXT_IRQ16L(13), PORT81_FN0, PORT145_FN0), +	PINMUX_IRQ(EXT_IRQ16L(14), PORT82_FN0, PORT146_FN0), +	PINMUX_IRQ(EXT_IRQ16L(15), PORT83_FN0, PORT147_FN0), +	PINMUX_IRQ(EXT_IRQ16H(16), PORT84_FN0, PORT170_FN0), +	PINMUX_IRQ(EXT_IRQ16H(17), PORT85_FN0), +	PINMUX_IRQ(EXT_IRQ16H(18), PORT86_FN0), +	PINMUX_IRQ(EXT_IRQ16H(19), PORT87_FN0), +	PINMUX_IRQ(EXT_IRQ16H(20), PORT92_FN0), +	PINMUX_IRQ(EXT_IRQ16H(21), PORT93_FN0), +	PINMUX_IRQ(EXT_IRQ16H(22), PORT94_FN0), +	PINMUX_IRQ(EXT_IRQ16H(23), PORT95_FN0), +	PINMUX_IRQ(EXT_IRQ16H(24), PORT112_FN0), +	PINMUX_IRQ(EXT_IRQ16H(25), PORT119_FN0), +	PINMUX_IRQ(EXT_IRQ16H(26), PORT121_FN0, PORT172_FN0), +	PINMUX_IRQ(EXT_IRQ16H(27), PORT122_FN0, PORT180_FN0), +	PINMUX_IRQ(EXT_IRQ16H(28), PORT123_FN0, PORT181_FN0), +	PINMUX_IRQ(EXT_IRQ16H(29), PORT129_FN0, PORT182_FN0), +	PINMUX_IRQ(EXT_IRQ16H(30), PORT130_FN0, PORT183_FN0), +	PINMUX_IRQ(EXT_IRQ16H(31), PORT138_FN0, PORT184_FN0), +}; +  static struct pinmux_info sh7372_pinmux_info = {  	.name = "sh7372_pfc",  	.reserved_id = PINMUX_RESERVED, @@ -1614,6 +1652,9 @@ static struct pinmux_info sh7372_pinmux_info = {  	.gpio_data = pinmux_data,  	.gpio_data_size = ARRAY_SIZE(pinmux_data), + +	.gpio_irq = pinmux_irqs, +	.gpio_irq_size = ARRAY_SIZE(pinmux_irqs),  };  void sh7372_pinmux_init(void) diff --git a/arch/arm/mach-shmobile/setup-sh7372.c b/arch/arm/mach-shmobile/setup-sh7372.c index 6fcf304d3cd..a83cf51fc09 100644 --- a/arch/arm/mach-shmobile/setup-sh7372.c +++ b/arch/arm/mach-shmobile/setup-sh7372.c @@ -662,6 +662,7 @@ static struct sh_dmae_pdata usb_dma0_platform_data = {  	.dmaor_is_32bit	= 1,  	.needs_tend_set	= 1,  	.no_dmars	= 1, +	.slave_only	= 1,  };  static struct resource sh7372_usb_dmae0_resources[] = { @@ -723,6 +724,7 @@ static struct sh_dmae_pdata usb_dma1_platform_data = {  	.dmaor_is_32bit	= 1,  	.needs_tend_set	= 1,  	.no_dmars	= 1, +	.slave_only	= 1,  };  static struct resource sh7372_usb_dmae1_resources[] = { diff --git a/arch/arm/mach-shmobile/smp-r8a7779.c b/arch/arm/mach-shmobile/smp-r8a7779.c index cc97ef892d1..4fe2e9eaf50 100644 --- a/arch/arm/mach-shmobile/smp-r8a7779.c +++ b/arch/arm/mach-shmobile/smp-r8a7779.c @@ -25,6 +25,7 @@  #include <linux/delay.h>  #include <mach/common.h>  #include <mach/r8a7779.h> +#include <asm/smp_plat.h>  #include <asm/smp_scu.h>  #include <asm/smp_twd.h>  #include <asm/hardware/gic.h> diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index be1ade76ccc..2d0d4212be4 100644 --- a/arch/arm/mach-shmobile/smp-sh73a0.c +++ b/arch/arm/mach-shmobile/smp-sh73a0.c @@ -23,6 +23,7 @@  #include <linux/spinlock.h>  #include <linux/io.h>  #include <mach/common.h> +#include <asm/smp_plat.h>  #include <asm/smp_scu.h>  #include <asm/smp_twd.h>  #include <asm/hardware/gic.h> @@ -79,7 +80,7 @@ int __cpuinit sh73a0_boot_secondary(unsigned int cpu)  	/* enable cache coherency */  	modify_scu_cpu_psr(0, 3 << (cpu * 8)); -	if (((__raw_readw(__io(PSTR)) >> (4 * cpu)) & 3) == 3) +	if (((__raw_readl(__io(PSTR)) >> (4 * cpu)) & 3) == 3)  		__raw_writel(1 << cpu, __io(WUPCR));	/* wake up */  	else  		__raw_writel(1 << cpu, __io(SRESCR));	/* reset */ diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c index fcf4f377b1d..330afdfa247 100644 --- a/arch/arm/mach-tegra/board-paz00.c +++ b/arch/arm/mach-tegra/board-paz00.c @@ -60,9 +60,9 @@ static struct plat_serial8250_port debug_uart_platform_data[] = {  		.uartclk	= 216000000,  	}, {  		/* serial port on mini-pcie */ -		.membase	= IO_ADDRESS(TEGRA_UARTD_BASE), -		.mapbase	= TEGRA_UARTD_BASE, -		.irq		= INT_UARTD, +		.membase	= IO_ADDRESS(TEGRA_UARTC_BASE), +		.mapbase	= TEGRA_UARTC_BASE, +		.irq		= INT_UARTC,  		.flags		= UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE,  		.type		= PORT_TEGRA,  		.iotype		= UPIO_MEM, @@ -174,7 +174,7 @@ static void __init tegra_paz00_fixup(struct tag *tags, char **cmdline,  static __initdata struct tegra_clk_init_table paz00_clk_init_table[] = {  	/* name		parent		rate		enabled */  	{ "uarta",	"pll_p",	216000000,	true }, -	{ "uartd",	"pll_p",	216000000,	true }, +	{ "uartc",	"pll_p",	216000000,	true },  	{ "pll_p_out4",	"pll_p",	24000000,	true },  	{ "usbd",	"clk_m",	12000000,	false }, diff --git a/arch/arm/mach-tegra/board-paz00.h b/arch/arm/mach-tegra/board-paz00.h index ffa83f580db..3c9f8da37ea 100644 --- a/arch/arm/mach-tegra/board-paz00.h +++ b/arch/arm/mach-tegra/board-paz00.h @@ -22,7 +22,7 @@  /* SDCARD */  #define TEGRA_GPIO_SD1_CD		TEGRA_GPIO_PV5  #define TEGRA_GPIO_SD1_WP		TEGRA_GPIO_PH1 -#define TEGRA_GPIO_SD1_POWER		TEGRA_GPIO_PT3 +#define TEGRA_GPIO_SD1_POWER		TEGRA_GPIO_PV1  /* ULPI */  #define TEGRA_ULPI_RST			TEGRA_GPIO_PV0 diff --git a/arch/arm/mach-tegra/include/mach/dma.h b/arch/arm/mach-tegra/include/mach/dma.h index d0132e8031a..3c9339058be 100644 --- a/arch/arm/mach-tegra/include/mach/dma.h +++ b/arch/arm/mach-tegra/include/mach/dma.h @@ -23,11 +23,6 @@  #include <linux/list.h> -#if defined(CONFIG_TEGRA_SYSTEM_DMA) - -struct tegra_dma_req; -struct tegra_dma_channel; -  #define TEGRA_DMA_REQ_SEL_CNTR			0  #define TEGRA_DMA_REQ_SEL_I2S_2			1  #define TEGRA_DMA_REQ_SEL_I2S_1			2 @@ -56,6 +51,11 @@ struct tegra_dma_channel;  #define TEGRA_DMA_REQ_SEL_OWR			25  #define TEGRA_DMA_REQ_SEL_INVALID		31 +#if defined(CONFIG_TEGRA_SYSTEM_DMA) + +struct tegra_dma_req; +struct tegra_dma_channel; +  enum tegra_dma_mode {  	TEGRA_DMA_SHARED = 1,  	TEGRA_DMA_MODE_CONTINOUS = 2, diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index a3e0c8692f0..c59e8b892d6 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig @@ -5,8 +5,9 @@ config UX500_SOC_COMMON  	default y  	select ARM_GIC  	select HAS_MTU -	select ARM_ERRATA_753970 +	select PL310_ERRATA_753970  	select ARM_ERRATA_754322 +	select ARM_ERRATA_764369  menu "Ux500 SoC" diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c index 23be34b3bb6..5dde4d4ebe8 100644 --- a/arch/arm/mach-ux500/board-mop500-sdi.c +++ b/arch/arm/mach-ux500/board-mop500-sdi.c @@ -261,6 +261,8 @@ void __init mop500_sdi_init(void)  void __init snowball_sdi_init(void)  { +	/* On Snowball MMC_CAP_SD_HIGHSPEED isn't supported (Hardware issue?) */ +	mop500_sdi0_data.capabilities &= ~MMC_CAP_SD_HIGHSPEED;  	/* On-board eMMC */  	db8500_add_sdi4(&mop500_sdi4_data, U8500_SDI_V2_PERIPHID);  	/* External Micro SD slot */ diff --git a/arch/arm/mach-ux500/cache-l2x0.c b/arch/arm/mach-ux500/cache-l2x0.c index 122ddde00ba..da5569d83d5 100644 --- a/arch/arm/mach-ux500/cache-l2x0.c +++ b/arch/arm/mach-ux500/cache-l2x0.c @@ -12,44 +12,6 @@  static void __iomem *l2x0_base; -static inline void ux500_cache_wait(void __iomem *reg, unsigned long mask) -{ -	/* wait for the operation to complete */ -	while (readl_relaxed(reg) & mask) -		cpu_relax(); -} - -static inline void ux500_cache_sync(void) -{ -	writel_relaxed(0, l2x0_base + L2X0_CACHE_SYNC); -	ux500_cache_wait(l2x0_base + L2X0_CACHE_SYNC, 1); -} - -/* - * The L2 cache cannot be turned off in the non-secure world. - * Dummy until a secure service is in place. - */ -static void ux500_l2x0_disable(void) -{ -} - -/* - * This is only called when doing a kexec, just after turning off the L2 - * and L1 cache, and it is surrounded by a spinlock in the generic version. - * However, we're not really turning off the L2 cache right now and the - * PL310 does not support exclusive accesses (used to implement the spinlock). - * So, the invalidation needs to be done without the spinlock. - */ -static void ux500_l2x0_inv_all(void) -{ -	uint32_t l2x0_way_mask = (1<<16) - 1;	/* Bitmask of active ways */ - -	/* invalidate all ways */ -	writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_INV_WAY); -	ux500_cache_wait(l2x0_base + L2X0_INV_WAY, l2x0_way_mask); -	ux500_cache_sync(); -} -  static int __init ux500_l2x0_unlock(void)  {  	int i; @@ -85,9 +47,13 @@ static int __init ux500_l2x0_init(void)  	/* 64KB way size, 8 way associativity, force WA */  	l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff); -	/* Override invalidate function */ -	outer_cache.disable = ux500_l2x0_disable; -	outer_cache.inv_all = ux500_l2x0_inv_all; +	/* +	 * We can't disable l2 as we are in non secure mode, currently +	 * this seems be called only during kexec path. So let's +	 * override outer.disable with nasty assignment until we have +	 * some SMI service available. +	 */ +	outer_cache.disable = NULL;  	return 0;  } diff --git a/arch/arm/mach-ux500/hotplug.c b/arch/arm/mach-ux500/hotplug.c index 572015e57cd..c76f0f456f0 100644 --- a/arch/arm/mach-ux500/hotplug.c +++ b/arch/arm/mach-ux500/hotplug.c @@ -13,6 +13,7 @@  #include <linux/smp.h>  #include <asm/cacheflush.h> +#include <asm/smp_plat.h>  extern volatile int pen_release; diff --git a/arch/arm/mach-ux500/platsmp.c b/arch/arm/mach-ux500/platsmp.c index a19e398dade..d2058ef8345 100644 --- a/arch/arm/mach-ux500/platsmp.c +++ b/arch/arm/mach-ux500/platsmp.c @@ -19,6 +19,7 @@  #include <asm/cacheflush.h>  #include <asm/hardware/gic.h> +#include <asm/smp_plat.h>  #include <asm/smp_scu.h>  #include <mach/hardware.h>  #include <mach/setup.h> diff --git a/arch/arm/mach-ux500/usb.c b/arch/arm/mach-ux500/usb.c index 0a01cbdfe06..9f9e1c20306 100644 --- a/arch/arm/mach-ux500/usb.c +++ b/arch/arm/mach-ux500/usb.c @@ -95,13 +95,7 @@ static struct musb_hdrc_config musb_hdrc_config = {  };  static struct musb_hdrc_platform_data musb_platform_data = { -#if defined(CONFIG_USB_MUSB_OTG)  	.mode = MUSB_OTG, -#elif defined(CONFIG_USB_MUSB_PERIPHERAL) -	.mode = MUSB_PERIPHERAL, -#else /* defined(CONFIG_USB_MUSB_HOST) */ -	.mode = MUSB_HOST, -#endif  	.config = &musb_hdrc_config,  	.board_data = &musb_board_data,  }; diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig index 9b3d0fbaee7..88c3ba151e8 100644 --- a/arch/arm/mach-vexpress/Kconfig +++ b/arch/arm/mach-vexpress/Kconfig @@ -7,7 +7,7 @@ config ARCH_VEXPRESS_CA9X4  	select ARM_GIC  	select ARM_ERRATA_720789  	select ARM_ERRATA_751472 -	select ARM_ERRATA_753970 +	select PL310_ERRATA_753970  	select HAVE_SMP  	select MIGHT_HAVE_CACHE_L2X0 diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c index 2b1e836a76e..b1e87c184e5 100644 --- a/arch/arm/mach-vexpress/ct-ca9x4.c +++ b/arch/arm/mach-vexpress/ct-ca9x4.c @@ -217,7 +217,7 @@ static void __init ct_ca9x4_init(void)  }  #ifdef CONFIG_SMP -static void ct_ca9x4_init_cpu_map(void) +static void __init ct_ca9x4_init_cpu_map(void)  {  	int i, ncores = scu_get_core_count(MMIO_P2V(A9_MPCORE_SCU)); @@ -233,7 +233,7 @@ static void ct_ca9x4_init_cpu_map(void)  	set_smp_cross_call(gic_raise_softirq);  } -static void ct_ca9x4_smp_enable(unsigned int max_cpus) +static void __init ct_ca9x4_smp_enable(unsigned int max_cpus)  {  	scu_enable(MMIO_P2V(A9_MPCORE_SCU));  } diff --git a/arch/arm/mach-vexpress/hotplug.c b/arch/arm/mach-vexpress/hotplug.c index 813ee08f96e..3034a4dab4a 100644 --- a/arch/arm/mach-vexpress/hotplug.c +++ b/arch/arm/mach-vexpress/hotplug.c @@ -13,6 +13,7 @@  #include <linux/smp.h>  #include <asm/cacheflush.h> +#include <asm/smp_plat.h>  #include <asm/system.h>  extern volatile int pen_release; diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 4cefb57d9ed..7edef912163 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig @@ -631,7 +631,8 @@ comment "Processor Features"  config ARM_LPAE  	bool "Support for the Large Physical Address Extension" -	depends on MMU && CPU_V7 +	depends on MMU && CPU_32v7 && !CPU_32v6 && !CPU_32v5 && \ +		!CPU_32v4 && !CPU_32v3  	help  	  Say Y if you have an ARMv7 processor supporting the LPAE page  	  table format and you would like to access memory beyond the @@ -882,6 +883,7 @@ config CACHE_XSC3L2  config ARM_L1_CACHE_SHIFT_6  	bool +	default y if CPU_V7  	help  	  Setting ARM L1 cache line size to 64 Bytes. diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index 07c4bc8ea0a..a655d3da386 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S @@ -54,9 +54,15 @@ loop1:  	and	r1, r1, #7			@ mask of the bits for current cache only  	cmp	r1, #2				@ see what cache we have at this level  	blt	skip				@ skip if no cache, or just i-cache +#ifdef CONFIG_PREEMPT +	save_and_disable_irqs_notrace r9	@ make cssr&csidr read atomic +#endif  	mcr	p15, 2, r10, c0, c0, 0		@ select current cache level in cssr  	isb					@ isb to sych the new cssr&csidr  	mrc	p15, 1, r1, c0, c0, 0		@ read the new csidr +#ifdef CONFIG_PREEMPT +	restore_irqs_notrace r9 +#endif  	and	r2, r1, #7			@ extract the length of the cache lines  	add	r2, r2, #4			@ add 4 (line length offset)  	ldr	r4, =0x3ff diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 6ec1226fc62..5dc7d127a40 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -310,7 +310,7 @@ static void arm_memory_present(void)  static bool arm_memblock_steal_permitted = true; -phys_addr_t arm_memblock_steal(phys_addr_t size, phys_addr_t align) +phys_addr_t __init arm_memblock_steal(phys_addr_t size, phys_addr_t align)  {  	phys_addr_t phys; diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 7e9b5bf910c..f1c8486f750 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S @@ -148,10 +148,6 @@ ENDPROC(cpu_v7_do_resume)   *	Initialise TLB, Caches, and MMU state ready to switch the MMU   *	on.  Return in r0 the new CP15 C1 control register setting.   * - *	We automatically detect if we have a Harvard cache, and use the - *	Harvard cache control instructions insead of the unified cache - *	control instructions. - *   *	This should be able to cover all ARMv7 cores.   *   *	It is assumed that: @@ -234,9 +230,7 @@ __v7_setup:  	mcreq	p15, 0, r10, c15, c0, 1		@ write diagnostic register  #endif  #ifdef CONFIG_ARM_ERRATA_743622 -	teq	r6, #0x20			@ present in r2p0 -	teqne	r6, #0x21			@ present in r2p1 -	teqne	r6, #0x22			@ present in r2p2 +	teq	r5, #0x00200000			@ only present in r2p*  	mrceq	p15, 0, r10, c15, c0, 1		@ read diagnostic register  	orreq	r10, r10, #1 << 6		@ set bit #6  	mcreq	p15, 0, r10, c15, c0, 1		@ write diagnostic register @@ -251,9 +245,7 @@ __v7_setup:  #endif  3:	mov	r10, #0 -#ifdef HARVARD_CACHE  	mcr	p15, 0, r10, c7, c5, 0		@ I+BTB cache invalidate -#endif  	dsb  #ifdef CONFIG_MMU  	mcr	p15, 0, r10, c8, c7, 0		@ invalidate I + D TLBs @@ -330,16 +322,6 @@ __v7_ca5mp_proc_info:  	.size	__v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info  	/* -	 * ARM Ltd. Cortex A7 processor. -	 */ -	.type	__v7_ca7mp_proc_info, #object -__v7_ca7mp_proc_info: -	.long	0x410fc070 -	.long	0xff0ffff0 -	__v7_proc __v7_ca7mp_setup, hwcaps = HWCAP_IDIV -	.size	__v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info - -	/*  	 * ARM Ltd. Cortex A9 processor.  	 */  	.type   __v7_ca9mp_proc_info, #object @@ -351,6 +333,16 @@ __v7_ca9mp_proc_info:  #endif	/* CONFIG_ARM_LPAE */  	/* +	 * ARM Ltd. Cortex A7 processor. +	 */ +	.type	__v7_ca7mp_proc_info, #object +__v7_ca7mp_proc_info: +	.long	0x410fc070 +	.long	0xff0ffff0 +	__v7_proc __v7_ca7mp_setup, hwcaps = HWCAP_IDIV +	.size	__v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info + +	/*  	 * ARM Ltd. Cortex A15 processor.  	 */  	.type	__v7_ca15mp_proc_info, #object diff --git a/arch/arm/plat-mxc/Kconfig b/arch/arm/plat-mxc/Kconfig index b30708e28c1..dcebb1230f7 100644 --- a/arch/arm/plat-mxc/Kconfig +++ b/arch/arm/plat-mxc/Kconfig @@ -17,26 +17,17 @@ config ARCH_IMX_V4_V5  	  and ARMv5 SoCs  config ARCH_IMX_V6_V7 -	bool "i.MX3, i.MX6" +	bool "i.MX3, i.MX5, i.MX6"  	select AUTO_ZRELADDR if !ZBOOT_ROM  	select ARM_PATCH_PHYS_VIRT  	select MIGHT_HAVE_CACHE_L2X0  	help -	  This enables support for systems based on the Freescale i.MX3 and i.MX6 -	  family. - -config ARCH_MX5 -	bool "i.MX50, i.MX51, i.MX53" -	select AUTO_ZRELADDR if !ZBOOT_ROM -	select ARM_PATCH_PHYS_VIRT -	help -	  This enables support for machines using Freescale's i.MX50 and i.MX53 -	  processors. +	  This enables support for systems based on the Freescale i.MX3, i.MX5 +	  and i.MX6 family.  endchoice  source "arch/arm/mach-imx/Kconfig" -source "arch/arm/mach-mx5/Kconfig"  endmenu diff --git a/arch/arm/plat-mxc/include/mach/iomux-v1.h b/arch/arm/plat-mxc/include/mach/iomux-v1.h index 6fa8a707b9a..f7d18046c04 100644 --- a/arch/arm/plat-mxc/include/mach/iomux-v1.h +++ b/arch/arm/plat-mxc/include/mach/iomux-v1.h @@ -96,6 +96,6 @@ extern int mxc_gpio_mode(int gpio_mode);  extern int mxc_gpio_setup_multiple_pins(const int *pin_list, unsigned count,  		const char *label); -extern int __init imx_iomuxv1_init(void __iomem *base, int numports); +extern int imx_iomuxv1_init(void __iomem *base, int numports);  #endif /* __MACH_IOMUX_V1_H__ */ diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c index 06383b51e65..4de7d1e79e7 100644 --- a/arch/arm/plat-omap/common.c +++ b/arch/arm/plat-omap/common.c @@ -69,6 +69,7 @@ void __init omap_reserve(void)  	omap_vram_reserve_sdram_memblock();  	omap_dsp_reserve_sdram_memblock();  	omap_secure_ram_reserve_memblock(); +	omap_barrier_reserve_memblock();  }  void __init omap_init_consistent_dma_size(void) diff --git a/arch/arm/plat-omap/include/plat/irqs.h b/arch/arm/plat-omap/include/plat/irqs.h index 2efd6454bce..37bbbbb981b 100644 --- a/arch/arm/plat-omap/include/plat/irqs.h +++ b/arch/arm/plat-omap/include/plat/irqs.h @@ -428,8 +428,16 @@  #define OMAP_GPMC_NR_IRQS	8  #define OMAP_GPMC_IRQ_END	(OMAP_GPMC_IRQ_BASE + OMAP_GPMC_NR_IRQS) +/* PRCM IRQ handler */ +#ifdef CONFIG_ARCH_OMAP2PLUS +#define OMAP_PRCM_IRQ_BASE	(OMAP_GPMC_IRQ_END) +#define OMAP_PRCM_NR_IRQS	64 +#define OMAP_PRCM_IRQ_END	(OMAP_PRCM_IRQ_BASE + OMAP_PRCM_NR_IRQS) +#else +#define OMAP_PRCM_IRQ_END	OMAP_GPMC_IRQ_END +#endif -#define NR_IRQS			OMAP_GPMC_IRQ_END +#define NR_IRQS			OMAP_PRCM_IRQ_END  #define OMAP_IRQ_BIT(irq)	(1 << ((irq) % 32)) diff --git a/arch/arm/plat-omap/include/plat/omap-secure.h b/arch/arm/plat-omap/include/plat/omap-secure.h index 64f9d1c7f1b..8c7994ce986 100644 --- a/arch/arm/plat-omap/include/plat/omap-secure.h +++ b/arch/arm/plat-omap/include/plat/omap-secure.h @@ -3,11 +3,17 @@  #include <linux/types.h> -#ifdef CONFIG_ARCH_OMAP2PLUS +#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)  extern int omap_secure_ram_reserve_memblock(void);  #else  static inline void omap_secure_ram_reserve_memblock(void)  { }  #endif +#ifdef CONFIG_OMAP4_ERRATA_I688 +extern int omap_barrier_reserve_memblock(void); +#else +static inline void omap_barrier_reserve_memblock(void) +{ } +#endif  #endif /* __OMAP_SECURE_H__ */ diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c index e5a2fde29b1..089899a7db7 100644 --- a/arch/arm/plat-orion/common.c +++ b/arch/arm/plat-orion/common.c @@ -789,10 +789,7 @@ void __init orion_xor1_init(unsigned long mapbase_low,  /*****************************************************************************   * EHCI   ****************************************************************************/ -static struct orion_ehci_data orion_ehci_data = { -	.phy_version	= EHCI_PHY_NA, -}; - +static struct orion_ehci_data orion_ehci_data;  static u64 ehci_dmamask = DMA_BIT_MASK(32); @@ -812,8 +809,10 @@ static struct platform_device orion_ehci = {  };  void __init orion_ehci_init(unsigned long mapbase, -			    unsigned long irq) +			    unsigned long irq, +			    enum orion_ehci_phy_ver phy_version)  { +	orion_ehci_data.phy_version = phy_version;  	fill_resources(&orion_ehci, orion_ehci_resources, mapbase, SZ_4K - 1,  		       irq); diff --git a/arch/arm/plat-orion/include/plat/common.h b/arch/arm/plat-orion/include/plat/common.h index 0fe08d77e83..a7fa005a5a0 100644 --- a/arch/arm/plat-orion/include/plat/common.h +++ b/arch/arm/plat-orion/include/plat/common.h @@ -89,7 +89,8 @@ void __init orion_xor1_init(unsigned long mapbase_low,  			    unsigned long irq_1);  void __init orion_ehci_init(unsigned long mapbase, -			    unsigned long irq); +			    unsigned long irq, +			    enum orion_ehci_phy_ver phy_version);  void __init orion_ehci_1_init(unsigned long mapbase,  			      unsigned long irq); diff --git a/arch/arm/plat-orion/mpp.c b/arch/arm/plat-orion/mpp.c index 91553432711..3b1e17bd3d1 100644 --- a/arch/arm/plat-orion/mpp.c +++ b/arch/arm/plat-orion/mpp.c @@ -64,8 +64,7 @@ void __init orion_mpp_conf(unsigned int *mpp_list, unsigned int variant_mask,  			gpio_mode |= GPIO_INPUT_OK;  		if (*mpp_list & MPP_OUTPUT_MASK)  			gpio_mode |= GPIO_OUTPUT_OK; -		if (sel != 0) -			gpio_mode = 0; +  		orion_gpio_set_valid(num, gpio_mode);  	} diff --git a/arch/arm/plat-s3c24xx/dma.c b/arch/arm/plat-s3c24xx/dma.c index 9fe35348e03..2bab4c99a23 100644 --- a/arch/arm/plat-s3c24xx/dma.c +++ b/arch/arm/plat-s3c24xx/dma.c @@ -1249,7 +1249,7 @@ static void s3c2410_dma_resume(void)  	struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1;  	int channel; -	for (channel = dma_channels - 1; channel >= 0; cp++, channel--) +	for (channel = dma_channels - 1; channel >= 0; cp--, channel--)  		s3c2410_dma_resume_chan(cp);  } diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index 32a6e394db2..d21d744e4d9 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c @@ -468,8 +468,10 @@ void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)  {  	struct s3c2410_platform_i2c *npd; -	if (!pd) +	if (!pd) {  		pd = &default_i2c_data; +		pd->bus_num = 0; +	}  	npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),  			       &s3c_device_i2c0); @@ -1407,7 +1409,7 @@ void __init s5p_ehci_set_platdata(struct s5p_ehci_platdata *pd)  #ifdef CONFIG_S3C_DEV_USB_HSOTG  static struct resource s3c_usb_hsotg_resources[] = { -	[0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_16K), +	[0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_128K),  	[1] = DEFINE_RES_IRQ(IRQ_OTG),  }; diff --git a/arch/arm/plat-spear/time.c b/arch/arm/plat-spear/time.c index 0c77e429867..abb5bdecd50 100644 --- a/arch/arm/plat-spear/time.c +++ b/arch/arm/plat-spear/time.c @@ -145,11 +145,13 @@ static void clockevent_set_mode(enum clock_event_mode mode,  static int clockevent_next_event(unsigned long cycles,  				 struct clock_event_device *clk_event_dev)  { -	u16 val; +	u16 val = readw(gpt_base + CR(CLKEVT)); + +	if (val & CTRL_ENABLE) +		writew(val & ~CTRL_ENABLE, gpt_base + CR(CLKEVT));  	writew(cycles, gpt_base + LOAD(CLKEVT)); -	val = readw(gpt_base + CR(CLKEVT));  	val |= CTRL_ENABLE | CTRL_INT_ENABLE;  	writew(val, gpt_base + CR(CLKEVT)); diff --git a/arch/arm/plat-versatile/platsmp.c b/arch/arm/plat-versatile/platsmp.c index 92f18d372b6..49c7db48c7f 100644 --- a/arch/arm/plat-versatile/platsmp.c +++ b/arch/arm/plat-versatile/platsmp.c @@ -16,6 +16,7 @@  #include <linux/smp.h>  #include <asm/cacheflush.h> +#include <asm/smp_plat.h>  #include <asm/hardware/gic.h>  /* diff --git a/arch/avr32/Kconfig b/arch/avr32/Kconfig index 197e96f7040..3dea7231f63 100644 --- a/arch/avr32/Kconfig +++ b/arch/avr32/Kconfig @@ -8,6 +8,7 @@ config AVR32  	select HAVE_KPROBES  	select HAVE_GENERIC_HARDIRQS  	select GENERIC_IRQ_PROBE +	select GENERIC_ATOMIC64  	select HARDIRQS_SW_RESEND  	select GENERIC_IRQ_SHOW  	select ARCH_HAVE_NMI_SAFE_CMPXCHG diff --git a/arch/c6x/boot/Makefile b/arch/c6x/boot/Makefile index ecca820e604..6891257d514 100644 --- a/arch/c6x/boot/Makefile +++ b/arch/c6x/boot/Makefile @@ -13,7 +13,7 @@ obj-y += linked_dtb.o  endif  $(obj)/%.dtb: $(src)/dts/%.dts FORCE -	$(call cmd,dtc) +	$(call if_changed_dep,dtc)  quiet_cmd_cp = CP      $< $@$2  	cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) diff --git a/arch/m68k/atari/config.c b/arch/m68k/atari/config.c index 4203d101363..c4ac15c4f06 100644 --- a/arch/m68k/atari/config.c +++ b/arch/m68k/atari/config.c @@ -414,9 +414,9 @@ void __init config_atari(void)  					 * FDC val = 4 -> Supervisor only */  		asm volatile ("\n"  			"	.chip	68030\n" -			"	pmove	%0@,%/tt1\n" +			"	pmove	%0,%/tt1\n"  			"	.chip	68k" -			: : "a" (&tt1_val)); +			: : "m" (tt1_val));  	} else {  	        asm volatile ("\n"  			"	.chip	68040\n" @@ -569,10 +569,10 @@ static void atari_reset(void)  			: "d0");  	} else  		asm volatile ("\n" -			"	pmove	%0@,%%tc\n" +			"	pmove	%0,%%tc\n"  			"	jmp	%1@"  			: /* no outputs */ -			: "a" (&tc_val), "a" (reset_addr)); +			: "m" (tc_val), "a" (reset_addr));  } diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h index 0e89fa05de0..c1155f0e22c 100644 --- a/arch/m68k/include/asm/irq.h +++ b/arch/m68k/include/asm/irq.h @@ -50,19 +50,6 @@  #define IRQ_USER	8 -/* - * various flags for request_irq() - the Amiga now uses the standard - * mechanism like all other architectures - IRQF_DISABLED and - * IRQF_SHARED are your friends. - */ -#ifndef MACH_AMIGA_ONLY -#define IRQ_FLG_LOCK	(0x0001)	/* handler is not replaceable	*/ -#define IRQ_FLG_REPLACE	(0x0002)	/* replace existing handler	*/ -#define IRQ_FLG_FAST	(0x0004) -#define IRQ_FLG_SLOW	(0x0008) -#define IRQ_FLG_STD	(0x8000)	/* internally used		*/ -#endif -  struct irq_data;  struct irq_chip;  struct irq_desc; diff --git a/arch/m68k/include/asm/mcf_pgtable.h b/arch/m68k/include/asm/mcf_pgtable.h index 756bde4fb4f..3c793682e5d 100644 --- a/arch/m68k/include/asm/mcf_pgtable.h +++ b/arch/m68k/include/asm/mcf_pgtable.h @@ -78,7 +78,8 @@  				 | CF_PAGE_READABLE \  				 | CF_PAGE_WRITABLE \  				 | CF_PAGE_EXEC \ -				 | CF_PAGE_SYSTEM) +				 | CF_PAGE_SYSTEM \ +				 | CF_PAGE_SHARED)  #define PAGE_COPY	__pgprot(CF_PAGE_VALID \  				 | CF_PAGE_ACCESSED \ diff --git a/arch/m68k/kernel/process_mm.c b/arch/m68k/kernel/process_mm.c index 125f34e00bf..099283ee1a8 100644 --- a/arch/m68k/kernel/process_mm.c +++ b/arch/m68k/kernel/process_mm.c @@ -172,7 +172,7 @@ void flush_thread(void)  	current->thread.fs = __USER_DS;  	if (!FPU_IS_EMU) -		asm volatile ("frestore %0@" : : "a" (&zero) : "memory"); +		asm volatile("frestore %0": :"m" (zero));  }  /* diff --git a/arch/m68k/kernel/process_no.c b/arch/m68k/kernel/process_no.c index 69c1803fcf1..5e1078cabe0 100644 --- a/arch/m68k/kernel/process_no.c +++ b/arch/m68k/kernel/process_no.c @@ -163,8 +163,8 @@ void flush_thread(void)  #ifdef CONFIG_FPU  	if (!FPU_IS_EMU)  		asm volatile (".chip 68k/68881\n\t" -			      "frestore %0@\n\t" -			      ".chip 68k" : : "a" (&zero)); +			      "frestore %0\n\t" +			      ".chip 68k" : : "m" (zero));  #endif  } diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c index a76452ca964..daaa9187654 100644 --- a/arch/m68k/kernel/traps.c +++ b/arch/m68k/kernel/traps.c @@ -552,13 +552,13 @@ static inline void bus_error030 (struct frame *fp)  #ifdef DEBUG  		asm volatile ("ptestr %3,%2@,#7,%0\n\t" -			      "pmove %%psr,%1@" -			      : "=a&" (desc) -			      : "a" (&temp), "a" (addr), "d" (ssw)); +			      "pmove %%psr,%1" +			      : "=a&" (desc), "=m" (temp) +			      : "a" (addr), "d" (ssw));  #else  		asm volatile ("ptestr %2,%1@,#7\n\t" -			      "pmove %%psr,%0@" -			      : : "a" (&temp), "a" (addr), "d" (ssw)); +			      "pmove %%psr,%0" +			      : "=m" (temp) : "a" (addr), "d" (ssw));  #endif  		mmusr = temp; @@ -605,20 +605,18 @@ static inline void bus_error030 (struct frame *fp)  			       !(ssw & RW) ? "write" : "read", addr,  			       fp->ptregs.pc, ssw);  			asm volatile ("ptestr #1,%1@,#0\n\t" -				      "pmove %%psr,%0@" -				      : /* no outputs */ -				      : "a" (&temp), "a" (addr)); +				      "pmove %%psr,%0" +				      : "=m" (temp) +				      : "a" (addr));  			mmusr = temp;  			printk ("level 0 mmusr is %#x\n", mmusr);  #if 0 -			asm volatile ("pmove %%tt0,%0@" -				      : /* no outputs */ -				      : "a" (&tlong)); +			asm volatile ("pmove %%tt0,%0" +				      : "=m" (tlong));  			printk("tt0 is %#lx, ", tlong); -			asm volatile ("pmove %%tt1,%0@" -				      : /* no outputs */ -				      : "a" (&tlong)); +			asm volatile ("pmove %%tt1,%0" +				      : "=m" (tlong));  			printk("tt1 is %#lx\n", tlong);  #endif  #ifdef DEBUG @@ -668,13 +666,13 @@ static inline void bus_error030 (struct frame *fp)  #ifdef DEBUG  	asm volatile ("ptestr #1,%2@,#7,%0\n\t" -		      "pmove %%psr,%1@" -		      : "=a&" (desc) -		      : "a" (&temp), "a" (addr)); +		      "pmove %%psr,%1" +		      : "=a&" (desc), "=m" (temp) +		      : "a" (addr));  #else  	asm volatile ("ptestr #1,%1@,#7\n\t" -		      "pmove %%psr,%0@" -		      : : "a" (&temp), "a" (addr)); +		      "pmove %%psr,%0" +		      : "=m" (temp) : "a" (addr));  #endif  	mmusr = temp; diff --git a/arch/m68k/mm/cache.c b/arch/m68k/mm/cache.c index 95d0bf66e2e..3d84c1f2ffb 100644 --- a/arch/m68k/mm/cache.c +++ b/arch/m68k/mm/cache.c @@ -52,9 +52,9 @@ static unsigned long virt_to_phys_slow(unsigned long vaddr)  		unsigned long *descaddr;  		asm volatile ("ptestr %3,%2@,#7,%0\n\t" -			      "pmove %%psr,%1@" -			      : "=a&" (descaddr) -			      : "a" (&mmusr), "a" (vaddr), "d" (get_fs().seg)); +			      "pmove %%psr,%1" +			      : "=a&" (descaddr), "=m" (mmusr) +			      : "a" (vaddr), "d" (get_fs().seg));  		if (mmusr & (MMU_I|MMU_B|MMU_L))  			return 0;  		descaddr = phys_to_virt((unsigned long)descaddr); diff --git a/arch/m68k/mm/mcfmmu.c b/arch/m68k/mm/mcfmmu.c index babd5a97cdc..875b800ef0d 100644 --- a/arch/m68k/mm/mcfmmu.c +++ b/arch/m68k/mm/mcfmmu.c @@ -87,7 +87,7 @@ void __init paging_init(void)  int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word)  { -	unsigned long flags, mmuar; +	unsigned long flags, mmuar, mmutr;  	struct mm_struct *mm;  	pgd_t *pgd;  	pmd_t *pmd; @@ -137,9 +137,10 @@ int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word)  	if (!pte_dirty(*pte) && !KMAPAREA(mmuar))  		set_pte(pte, pte_wrprotect(*pte)); -	mmu_write(MMUTR, (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) | -		(((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK) -		>> CF_PAGE_MMUTR_SHIFT) | MMUTR_V); +	mmutr = (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) | MMUTR_V; +	if ((mmuar < TASK_UNMAPPED_BASE) || (mmuar >= TASK_SIZE)) +		mmutr |= (pte->pte & CF_PAGE_MMUTR_MASK) >> CF_PAGE_MMUTR_SHIFT; +	mmu_write(MMUTR, mmutr);  	mmu_write(MMUDR, (pte_val(*pte) & PAGE_MASK) |  		((pte->pte) & CF_PAGE_MMUDR_MASK) | MMUDR_SZ_8KB | MMUDR_X); diff --git a/arch/m68k/platform/coldfire/entry.S b/arch/m68k/platform/coldfire/entry.S index 863889fc31c..281e38c2b6c 100644 --- a/arch/m68k/platform/coldfire/entry.S +++ b/arch/m68k/platform/coldfire/entry.S @@ -136,7 +136,7 @@ Luser_return:  	movel	%sp,%d1			/* get thread_info pointer */  	andl	#-THREAD_SIZE,%d1	/* at base of kernel stack */  	movel	%d1,%a0 -	movel	%a0@(TINFO_FLAGS),%d1	/* get thread_info->flags */ +	moveb	%a0@(TINFO_FLAGS+3),%d1	/* thread_info->flags (low 8 bits) */  	jne	Lwork_to_do		/* still work to do */  Lreturn: @@ -148,8 +148,6 @@ Lwork_to_do:  	btst	#TIF_NEED_RESCHED,%d1  	jne	reschedule -	/* GERG: do we need something here for TRACEing?? */ -  Lsignal_return:  	subql	#4,%sp			/* dummy return address */  	SAVE_SWITCH_STACK diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 74f23a460ba..c8d6efb99db 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -19,6 +19,7 @@ config MICROBLAZE  	select GENERIC_IRQ_SHOW  	select GENERIC_PCI_IOMAP  	select GENERIC_CPU_DEVICES +	select GENERIC_ATOMIC64  config SWAP  	def_bool n diff --git a/arch/microblaze/include/asm/atomic.h b/arch/microblaze/include/asm/atomic.h index 6d2e1d418be..615f53992c6 100644 --- a/arch/microblaze/include/asm/atomic.h +++ b/arch/microblaze/include/asm/atomic.h @@ -2,6 +2,7 @@  #define _ASM_MICROBLAZE_ATOMIC_H  #include <asm-generic/atomic.h> +#include <asm-generic/atomic64.h>  /*   * Atomically test *v and decrement if it is greater than 0. diff --git a/arch/microblaze/kernel/setup.c b/arch/microblaze/kernel/setup.c index d4fc1a97177..604cd9dd133 100644 --- a/arch/microblaze/kernel/setup.c +++ b/arch/microblaze/kernel/setup.c @@ -26,7 +26,6 @@  #include <linux/cache.h>  #include <linux/of_platform.h>  #include <linux/dma-mapping.h> -#include <linux/cpu.h>  #include <asm/cacheflush.h>  #include <asm/entry.h>  #include <asm/cpuinfo.h> @@ -227,23 +226,5 @@ static int __init setup_bus_notifier(void)  	return 0;  } -arch_initcall(setup_bus_notifier); - -static DEFINE_PER_CPU(struct cpu, cpu_devices); - -static int __init topology_init(void) -{ -	int i, ret; - -	for_each_present_cpu(i) { -		struct cpu *c = &per_cpu(cpu_devices, i); -		ret = register_cpu(c, i); -		if (ret) -			printk(KERN_WARNING "topology_init: register_cpu %d " -						"failed (%d)\n", i, ret); -	} - -	return 0; -} -subsys_initcall(topology_init); +arch_initcall(setup_bus_notifier); diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index c4c1312473f..5ab6e89603c 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -2356,6 +2356,7 @@ config PCI  	depends on HW_HAS_PCI  	select PCI_DOMAINS  	select GENERIC_PCI_IOMAP +	select NO_GENERIC_PCI_IOPORT_MAP  	help  	  Find out whether you have a PCI motherboard. PCI is the name of a  	  bus system, i.e. the way the CPU talks to the other stuff inside diff --git a/arch/mips/alchemy/common/time.c b/arch/mips/alchemy/common/time.c index 7da4d008148..a7193ae13a5 100644 --- a/arch/mips/alchemy/common/time.c +++ b/arch/mips/alchemy/common/time.c @@ -146,7 +146,7 @@ static int __init alchemy_time_init(unsigned int m2int)  	cd->shift = 32;  	cd->mult = div_sc(32768, NSEC_PER_SEC, cd->shift);  	cd->max_delta_ns = clockevent_delta2ns(0xffffffff, cd); -	cd->min_delta_ns = clockevent_delta2ns(8, cd);	/* ~0.25ms */ +	cd->min_delta_ns = clockevent_delta2ns(9, cd);	/* ~0.28ms */  	clockevents_register_device(cd);  	setup_irq(m2int, &au1x_rtcmatch2_irqaction); diff --git a/arch/mips/ath79/dev-wmac.c b/arch/mips/ath79/dev-wmac.c index 24f546985b6..e2150705206 100644 --- a/arch/mips/ath79/dev-wmac.c +++ b/arch/mips/ath79/dev-wmac.c @@ -96,7 +96,7 @@ void __init ath79_register_wmac(u8 *cal_data)  {  	if (soc_is_ar913x())  		ar913x_wmac_setup(); -	if (soc_is_ar933x()) +	else if (soc_is_ar933x())  		ar933x_wmac_setup();  	else  		BUG(); diff --git a/arch/mips/configs/nlm_xlp_defconfig b/arch/mips/configs/nlm_xlp_defconfig index 4479fd669ac..28c6b276c21 100644 --- a/arch/mips/configs/nlm_xlp_defconfig +++ b/arch/mips/configs/nlm_xlp_defconfig @@ -8,7 +8,7 @@ CONFIG_HIGH_RES_TIMERS=y  # CONFIG_SECCOMP is not set  CONFIG_USE_OF=y  CONFIG_EXPERIMENTAL=y -CONFIG_CROSS_COMPILE="mips-linux-gnu-" +CONFIG_CROSS_COMPILE=""  # CONFIG_LOCALVERSION_AUTO is not set  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y @@ -22,7 +22,7 @@ CONFIG_AUDIT=y  CONFIG_CGROUPS=y  CONFIG_NAMESPACES=y  CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="usr/dev_file_list usr/rootfs.xlp" +CONFIG_INITRAMFS_SOURCE=""  CONFIG_RD_BZIP2=y  CONFIG_RD_LZMA=y  CONFIG_INITRAMFS_COMPRESSION_LZMA=y diff --git a/arch/mips/configs/nlm_xlr_defconfig b/arch/mips/configs/nlm_xlr_defconfig index 7c68666fdd6..d0b857d98c9 100644 --- a/arch/mips/configs/nlm_xlr_defconfig +++ b/arch/mips/configs/nlm_xlr_defconfig @@ -8,7 +8,7 @@ CONFIG_HIGH_RES_TIMERS=y  CONFIG_PREEMPT_VOLUNTARY=y  CONFIG_KEXEC=y  CONFIG_EXPERIMENTAL=y -CONFIG_CROSS_COMPILE="mips-linux-gnu-" +CONFIG_CROSS_COMPILE=""  # CONFIG_LOCALVERSION_AUTO is not set  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y @@ -22,7 +22,7 @@ CONFIG_AUDIT=y  CONFIG_NAMESPACES=y  CONFIG_SCHED_AUTOGROUP=y  CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="usr/dev_file_list usr/rootfs.xlr" +CONFIG_INITRAMFS_SOURCE=""  CONFIG_RD_BZIP2=y  CONFIG_RD_LZMA=y  CONFIG_INITRAMFS_COMPRESSION_GZIP=y diff --git a/arch/mips/configs/powertv_defconfig b/arch/mips/configs/powertv_defconfig index 3b0b6e8c853..7fda0ce5f69 100644 --- a/arch/mips/configs/powertv_defconfig +++ b/arch/mips/configs/powertv_defconfig @@ -6,7 +6,7 @@ CONFIG_HZ_1000=y  CONFIG_PREEMPT=y  # CONFIG_SECCOMP is not set  CONFIG_EXPERIMENTAL=y -CONFIG_CROSS_COMPILE="mips-linux-" +CONFIG_CROSS_COMPILE=""  # CONFIG_SWAP is not set  CONFIG_SYSVIPC=y  CONFIG_LOG_BUF_SHIFT=16 diff --git a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h index 556e1be20bf..fb9975c74c5 100644 --- a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h +++ b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h @@ -11,6 +11,9 @@  #include <asm/io.h>  #include <asm/mach-au1x00/au1000.h> +struct gpio; +struct gpio_chip; +  /* with the current GPIC design, up to 128 GPIOs are possible.   * The only implementation so far is in the Au1300, which has 75 externally   * available GPIOs. @@ -203,7 +206,22 @@ static inline int gpio_request(unsigned int gpio, const char *label)  	return 0;  } -static inline void gpio_free(unsigned int gpio) +static inline int gpio_request_one(unsigned gpio, +					unsigned long flags, const char *label) +{ +	return 0; +} + +static inline int gpio_request_array(struct gpio *array, size_t num) +{ +	return 0; +} + +static inline void gpio_free(unsigned gpio) +{ +} + +static inline void gpio_free_array(struct gpio *array, size_t num)  {  } diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h index d41790928c6..da9bd7d270d 100644 --- a/arch/mips/include/asm/page.h +++ b/arch/mips/include/asm/page.h @@ -39,9 +39,6 @@  #define HPAGE_MASK	(~(HPAGE_SIZE - 1))  #define HUGETLB_PAGE_ORDER	(HPAGE_SHIFT - PAGE_SHIFT)  #else /* !CONFIG_HUGETLB_PAGE */ -# ifndef BUILD_BUG -#  define BUILD_BUG() do { extern void __build_bug(void); __build_bug(); } while (0) -# endif  #define HPAGE_SHIFT	({BUILD_BUG(); 0; })  #define HPAGE_SIZE	({BUILD_BUG(); 0; })  #define HPAGE_MASK	({BUILD_BUG(); 0; }) diff --git a/arch/mips/kernel/smp-bmips.c b/arch/mips/kernel/smp-bmips.c index 58fe71afd87..d5e950ab852 100644 --- a/arch/mips/kernel/smp-bmips.c +++ b/arch/mips/kernel/smp-bmips.c @@ -8,7 +8,6 @@   * SMP support for BMIPS   */ -#include <linux/version.h>  #include <linux/init.h>  #include <linux/sched.h>  #include <linux/mm.h> diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index cc4a3f120f5..d79ae5437b5 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -1135,7 +1135,7 @@ asmlinkage void do_mt(struct pt_regs *regs)  		printk(KERN_DEBUG "YIELD Scheduler Exception\n");  		break;  	case 5: -		printk(KERN_DEBUG "Gating Storage Schedulier Exception\n"); +		printk(KERN_DEBUG "Gating Storage Scheduler Exception\n");  		break;  	default:  		printk(KERN_DEBUG "*** UNKNOWN THREAD EXCEPTION %d ***\n", diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index a81176f44c7..924da5eb703 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -69,7 +69,6 @@ SECTIONS  	RODATA  	/* writeable */ -	_sdata = .;				/* Start of data section */  	.data : {	/* Data */  		. = . + DATAOFFSET;		/* for CONFIG_MAPPED_KERNEL */ diff --git a/arch/mips/lib/iomap-pci.c b/arch/mips/lib/iomap-pci.c index 2635b1a9633..fd35daa4531 100644 --- a/arch/mips/lib/iomap-pci.c +++ b/arch/mips/lib/iomap-pci.c @@ -10,8 +10,8 @@  #include <linux/module.h>  #include <asm/io.h> -static void __iomem *ioport_map_pci(struct pci_dev *dev, -                                     unsigned long port, unsigned int nr) +void __iomem *__pci_ioport_map(struct pci_dev *dev, +			       unsigned long port, unsigned int nr)  {  	struct pci_controller *ctrl = dev->bus->sysdata;  	unsigned long base = ctrl->io_map_base; diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c index 937cf336816..69ebd586d7f 100644 --- a/arch/mips/mm/fault.c +++ b/arch/mips/mm/fault.c @@ -42,6 +42,8 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, unsigned long writ  	const int field = sizeof(unsigned long) * 2;  	siginfo_t info;  	int fault; +	unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | +						 (write ? FAULT_FLAG_WRITE : 0);  #if 0  	printk("Cpu%d[%s:%d:%0*lx:%ld:%0*lx]\n", raw_smp_processor_id(), @@ -91,6 +93,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, unsigned long writ  	if (in_atomic() || !mm)  		goto bad_area_nosemaphore; +retry:  	down_read(&mm->mmap_sem);  	vma = find_vma(mm, address);  	if (!vma) @@ -144,7 +147,11 @@ good_area:  	 * make sure we exit gracefully rather than endlessly redo  	 * the fault.  	 */ -	fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0); +	fault = handle_mm_fault(mm, vma, address, flags); + +	if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) +		return; +  	perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);  	if (unlikely(fault & VM_FAULT_ERROR)) {  		if (fault & VM_FAULT_OOM) @@ -153,12 +160,27 @@ good_area:  			goto do_sigbus;  		BUG();  	} -	if (fault & VM_FAULT_MAJOR) { -		perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address); -		tsk->maj_flt++; -	} else { -		perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address); -		tsk->min_flt++; +	if (flags & FAULT_FLAG_ALLOW_RETRY) { +		if (fault & VM_FAULT_MAJOR) { +			perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, +						  regs, address); +			tsk->maj_flt++; +		} else { +			perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, +						  regs, address); +			tsk->min_flt++; +		} +		if (fault & VM_FAULT_RETRY) { +			flags &= ~FAULT_FLAG_ALLOW_RETRY; + +			/* +			 * No need to up_read(&mm->mmap_sem) as we would +			 * have already released it in __lock_page_or_retry +			 * in mm/filemap.c. +			 */ + +			goto retry; +		}  	}  	up_read(&mm->mmap_sem); diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c index aec2b111d35..15521505ebe 100644 --- a/arch/mips/pci/pci.c +++ b/arch/mips/pci/pci.c @@ -279,7 +279,6 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)  {  	/* Propagate hose info into the subordinate devices.  */ -	struct list_head *ln;  	struct pci_dev *dev = bus->self;  	if (pci_probe_only && dev && @@ -288,9 +287,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)  		pcibios_fixup_device_resources(dev, bus);  	} -	for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) { -		dev = pci_dev_b(ln); - +	list_for_each_entry(dev, &bus->devices, bus_list) {  		if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI)  			pcibios_fixup_device_resources(dev, bus);  	} diff --git a/arch/mips/pmc-sierra/yosemite/ht-irq.c b/arch/mips/pmc-sierra/yosemite/ht-irq.c index 86b98e98fb4..62ead6601c6 100644 --- a/arch/mips/pmc-sierra/yosemite/ht-irq.c +++ b/arch/mips/pmc-sierra/yosemite/ht-irq.c @@ -35,16 +35,6 @@   */  void __init titan_ht_pcibios_fixup_bus(struct pci_bus *bus)  { -	struct pci_bus *current_bus = bus; -	struct pci_dev *devices; -	struct list_head *devices_link; - -	list_for_each(devices_link, &(current_bus->devices)) { -		devices = pci_dev_b(devices_link); -		if (devices == NULL) -			continue; -	} -  	/*  	 * PLX and SPKT related changes go here  	 */ diff --git a/arch/mips/txx9/generic/7segled.c b/arch/mips/txx9/generic/7segled.c index 8e93b212252..4642f56e70e 100644 --- a/arch/mips/txx9/generic/7segled.c +++ b/arch/mips/txx9/generic/7segled.c @@ -102,7 +102,7 @@ static int __init tx_7segled_init_sysfs(void)  			break;  		}  		dev->id = i; -		dev->dev = &tx_7segled_subsys; +		dev->bus = &tx_7segled_subsys;  		error = device_register(dev);  		if (!error) {  			device_create_file(dev, &dev_attr_ascii); diff --git a/arch/openrisc/include/asm/ptrace.h b/arch/openrisc/include/asm/ptrace.h index 054537c5f9c..e612ce4512c 100644 --- a/arch/openrisc/include/asm/ptrace.h +++ b/arch/openrisc/include/asm/ptrace.h @@ -77,7 +77,6 @@ struct pt_regs {  	long  syscallno;	/* Syscall number (used by strace) */  	long dummy;		/* Cheap alignment fix */  }; -#endif /* __ASSEMBLY__ */  /* TODO: Rename this to REDZONE because that's what it is */  #define STACK_FRAME_OVERHEAD  128  /* size of minimum stack frame */ @@ -87,6 +86,13 @@ struct pt_regs {  #define user_stack_pointer(regs)	((unsigned long)(regs)->sp)  #define profile_pc(regs)		instruction_pointer(regs) +static inline long regs_return_value(struct pt_regs *regs) +{ +	return regs->gpr[11]; +} + +#endif /* __ASSEMBLY__ */ +  /*   * Offsets used by 'ptrace' system call interface.   */ diff --git a/arch/openrisc/kernel/init_task.c b/arch/openrisc/kernel/init_task.c index 45744a38492..ca534082d5f 100644 --- a/arch/openrisc/kernel/init_task.c +++ b/arch/openrisc/kernel/init_task.c @@ -17,6 +17,7 @@  #include <linux/init_task.h>  #include <linux/mqueue.h> +#include <linux/export.h>  static struct signal_struct init_signals = INIT_SIGNALS(init_signals);  static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); diff --git a/arch/openrisc/kernel/irq.c b/arch/openrisc/kernel/irq.c index 59b30233833..4bfead22095 100644 --- a/arch/openrisc/kernel/irq.c +++ b/arch/openrisc/kernel/irq.c @@ -23,6 +23,7 @@  #include <linux/irq.h>  #include <linux/seq_file.h>  #include <linux/kernel_stat.h> +#include <linux/export.h>  #include <linux/irqflags.h> diff --git a/arch/openrisc/kernel/ptrace.c b/arch/openrisc/kernel/ptrace.c index 656b94beab8..7259047d5f9 100644 --- a/arch/openrisc/kernel/ptrace.c +++ b/arch/openrisc/kernel/ptrace.c @@ -188,11 +188,9 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)  		 */  		ret = -1L; -	/* Are these regs right??? */ -	if (unlikely(current->audit_context)) -		audit_syscall_entry(audit_arch(), regs->syscallno, -				    regs->gpr[3], regs->gpr[4], -				    regs->gpr[5], regs->gpr[6]); +	audit_syscall_entry(audit_arch(), regs->syscallno, +			    regs->gpr[3], regs->gpr[4], +			    regs->gpr[5], regs->gpr[6]);  	return ret ? : regs->syscallno;  } @@ -201,9 +199,7 @@ asmlinkage void do_syscall_trace_leave(struct pt_regs *regs)  {  	int step; -	if (unlikely(current->audit_context)) -		audit_syscall_exit(AUDITSC_RESULT(regs->gpr[11]), -				   regs->gpr[11]); +	audit_syscall_exit(regs);  	step = test_thread_flag(TIF_SINGLESTEP);  	if (step || test_thread_flag(TIF_SYSCALL_TRACE)) diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile index 55cca1dac43..19ab7b2ea1c 100644 --- a/arch/parisc/Makefile +++ b/arch/parisc/Makefile @@ -31,7 +31,11 @@ ifdef CONFIG_64BIT  UTS_MACHINE	:= parisc64  CHECKFLAGS	+= -D__LP64__=1 -m64  WIDTH		:= 64 + +# FIXME: if no default set, should really try to locate dynamically +ifeq ($(CROSS_COMPILE),)  CROSS_COMPILE	:= hppa64-linux-gnu- +endif  else # 32-bit  WIDTH		:=  endif diff --git a/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi b/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi index 89af6263770..b37da56018b 100644 --- a/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi @@ -236,6 +236,10 @@  	};  /include/ "pq3-esdhc-0.dtsi" +	sdhc@2e000 { +		compatible = "fsl,mpc8536-esdhc", "fsl,esdhc"; +	}; +  /include/ "pq3-sec3.0-0.dtsi"  /include/ "pq3-mpic.dtsi"  /include/ "pq3-mpic-timer-B.dtsi" diff --git a/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi index bd9e163c764..a97d1263372 100644 --- a/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi @@ -158,7 +158,8 @@  /include/ "pq3-usb2-dr-0.dtsi"  /include/ "pq3-esdhc-0.dtsi"  	sdhc@2e000 { -		fsl,sdhci-auto-cmd12; +		compatible = "fsl,p1010-esdhc", "fsl,esdhc"; +		sdhci,auto-cmd12;  	};  /include/ "pq3-sec4.4-0.dtsi" diff --git a/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi index fc924c5ffeb..5de5fc35131 100644 --- a/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi @@ -145,6 +145,10 @@  /include/ "pq3-usb2-dr-1.dtsi"  /include/ "pq3-esdhc-0.dtsi" +	sdhc@2e000 { +		compatible = "fsl,p1020-esdhc", "fsl,esdhc"; +		sdhci,auto-cmd12; +	};  /include/ "pq3-sec3.3-0.dtsi"  /include/ "pq3-mpic.dtsi" diff --git a/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi index 16239b199d0..ff9ed1d8792 100644 --- a/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi @@ -203,7 +203,8 @@  /include/ "pq3-esdhc-0.dtsi"  	sdhc@2e000 { -		fsl,sdhci-auto-cmd12; +		compatible = "fsl,p1022-esdhc", "fsl,esdhc"; +		sdhci,auto-cmd12;  	};  /include/ "pq3-sec3.3-0.dtsi" diff --git a/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi index c041050561a..332e9e75e6c 100644 --- a/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi @@ -182,6 +182,10 @@  /include/ "pq3-etsec1-1.dtsi"  /include/ "pq3-etsec1-2.dtsi"  /include/ "pq3-esdhc-0.dtsi" +	sdhc@2e000 { +		compatible = "fsl,p2020-esdhc", "fsl,esdhc"; +	}; +  /include/ "pq3-sec3.1-0.dtsi"  /include/ "pq3-mpic.dtsi"  /include/ "pq3-mpic-timer-B.dtsi" diff --git a/arch/powerpc/boot/dts/p1020rdb.dtsi b/arch/powerpc/boot/dts/p1020rdb.dtsi index b5bd86f4baf..1fb7e0e0940 100644 --- a/arch/powerpc/boot/dts/p1020rdb.dtsi +++ b/arch/powerpc/boot/dts/p1020rdb.dtsi @@ -1,7 +1,7 @@  /*   * P1020 RDB Device Tree Source stub (no addresses or top-level ranges)   * - * Copyright 2011 Freescale Semiconductor Inc. + * Copyright 2011-2012 Freescale Semiconductor Inc.   *   * Redistribution and use in source and binary forms, with or without   * modification, are permitted provided that the following conditions are met: @@ -190,17 +190,16 @@  	usb@22000 {  		phy_type = "ulpi"; +		dr_mode = "host";  	}; -	/* USB2 is shared with localbus, so it must be disabled -	   by default. We can't put 'status = "disabled";' here -	   since U-Boot doesn't clear the status property when -	   it enables USB2. OTOH, U-Boot does create a new node -	   when there isn't any. So, just comment it out. +	/* USB2 is shared with localbus. It is used +	   only in case of SPI and SD boot after +	   appropriate device-tree fixup done by uboot */  	usb@23000 {  		phy_type = "ulpi"; +		dr_mode = "host";  	}; -	*/  	mdio@24000 {  		phy0: ethernet-phy@0 { diff --git a/arch/powerpc/boot/dts/p1021mds.dts b/arch/powerpc/boot/dts/p1021mds.dts index d9540791e43..97116f198a3 100644 --- a/arch/powerpc/boot/dts/p1021mds.dts +++ b/arch/powerpc/boot/dts/p1021mds.dts @@ -1,7 +1,7 @@  /*   * P1021 MDS Device Tree Source   * - * Copyright 2010 Freescale Semiconductor Inc. + * Copyright 2010,2012 Freescale Semiconductor Inc.   *   * 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 @@ -151,6 +151,7 @@  		usb@22000 {  			phy_type = "ulpi"; +			dr_mode = "host";  		};  		mdio@24000 { diff --git a/arch/powerpc/boot/dts/p2020ds.dtsi b/arch/powerpc/boot/dts/p2020ds.dtsi index c1cf6cef4dd..d3b939c573b 100644 --- a/arch/powerpc/boot/dts/p2020ds.dtsi +++ b/arch/powerpc/boot/dts/p2020ds.dtsi @@ -1,7 +1,7 @@  /*   * P2020DS Device Tree Source stub (no addresses or top-level ranges)   * - * Copyright 2011 Freescale Semiconductor Inc. + * Copyright 2011-2012 Freescale Semiconductor Inc.   *   * Redistribution and use in source and binary forms, with or without   * modification, are permitted provided that the following conditions are met: @@ -134,6 +134,7 @@  &board_soc {  	usb@22000 {  		phy_type = "ulpi"; +		dr_mode = "host";  	};  	mdio@24520 { diff --git a/arch/powerpc/boot/dts/p2020rdb.dts b/arch/powerpc/boot/dts/p2020rdb.dts index 26759a59171..eb8a6aa2bda 100644 --- a/arch/powerpc/boot/dts/p2020rdb.dts +++ b/arch/powerpc/boot/dts/p2020rdb.dts @@ -1,7 +1,7 @@  /*   * P2020 RDB Device Tree Source   * - * Copyright 2009-2011 Freescale Semiconductor Inc. + * Copyright 2009-2012 Freescale Semiconductor Inc.   *   * 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 @@ -197,6 +197,7 @@  		usb@22000 {  			phy_type = "ulpi"; +			dr_mode = "host";  		};  		mdio@24520 { diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig index 2156e077859..1acf6502677 100644 --- a/arch/powerpc/configs/ppc64_defconfig +++ b/arch/powerpc/configs/ppc64_defconfig @@ -24,10 +24,6 @@ CONFIG_PPC_SPLPAR=y  CONFIG_SCANLOG=m  CONFIG_PPC_SMLPAR=y  CONFIG_DTL=y -CONFIG_PPC_ISERIES=y -CONFIG_VIODASD=y -CONFIG_VIOCD=m -CONFIG_VIOTAPE=m  CONFIG_PPC_MAPLE=y  CONFIG_PPC_PASEMI=y  CONFIG_PPC_PASEMI_IOMMU=y @@ -259,7 +255,6 @@ CONFIG_PASEMI_MAC=y  CONFIG_MLX4_EN=m  CONFIG_QLGE=m  CONFIG_BE2NET=m -CONFIG_ISERIES_VETH=m  CONFIG_PPP=m  CONFIG_PPP_ASYNC=m  CONFIG_PPP_SYNC_TTY=m diff --git a/arch/powerpc/include/asm/ppc-pci.h b/arch/powerpc/include/asm/ppc-pci.h index 43268f15004..6d422979eba 100644 --- a/arch/powerpc/include/asm/ppc-pci.h +++ b/arch/powerpc/include/asm/ppc-pci.h @@ -142,6 +142,11 @@ static inline const char *eeh_pci_name(struct pci_dev *pdev)  	return pdev ? pci_name(pdev) : "<null>";  }  +static inline const char *eeh_driver_name(struct pci_dev *pdev) +{ +	return (pdev && pdev->driver) ? pdev->driver->name : "<null>"; +} +  #endif /* CONFIG_EEH */  #else /* CONFIG_PCI */ diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h index 78a205162fd..84cc7840cd1 100644 --- a/arch/powerpc/include/asm/ptrace.h +++ b/arch/powerpc/include/asm/ptrace.h @@ -83,8 +83,18 @@ struct pt_regs {  #ifndef __ASSEMBLY__ -#define instruction_pointer(regs) ((regs)->nip) -#define user_stack_pointer(regs) ((regs)->gpr[1]) +#define GET_IP(regs)		((regs)->nip) +#define GET_USP(regs)		((regs)->gpr[1]) +#define GET_FP(regs)		(0) +#define SET_FP(regs, val) + +#ifdef CONFIG_SMP +extern unsigned long profile_pc(struct pt_regs *regs); +#define profile_pc profile_pc +#endif + +#include <asm-generic/ptrace.h> +  #define kernel_stack_pointer(regs) ((regs)->gpr[1])  static inline int is_syscall_success(struct pt_regs *regs)  { @@ -99,12 +109,6 @@ static inline long regs_return_value(struct pt_regs *regs)  		return -regs->gpr[3];  } -#ifdef CONFIG_SMP -extern unsigned long profile_pc(struct pt_regs *regs); -#else -#define profile_pc(regs) instruction_pointer(regs) -#endif -  #ifdef __powerpc64__  #define user_mode(regs) ((((regs)->msr) >> MSR_PR_LG) & 0x1)  #else diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c index 28be3452e67..abef75176c0 100644 --- a/arch/powerpc/kernel/crash.c +++ b/arch/powerpc/kernel/crash.c @@ -46,7 +46,6 @@  /* This keeps a track of which one is the crashing cpu. */  int crashing_cpu = -1; -static atomic_t cpus_in_crash;  static int time_to_dump;  #define CRASH_HANDLER_MAX 3 @@ -66,6 +65,7 @@ static int handle_fault(struct pt_regs *regs)  #ifdef CONFIG_SMP +static atomic_t cpus_in_crash;  void crash_ipi_callback(struct pt_regs *regs)  {  	static cpumask_t cpus_state_saved = CPU_MASK_NONE; diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 4f80cf1ce77..3e57a00b8cb 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S @@ -1213,7 +1213,7 @@ do_user_signal:			/* r10 contains MSR_KERNEL here */  	stw	r3,_TRAP(r1)  2:	addi	r3,r1,STACK_FRAME_OVERHEAD  	mr	r4,r9 -	bl	do_signal +	bl	do_notify_resume  	REST_NVGPRS(r1)  	b	recheck diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index d834425186a..866462cbe2d 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S @@ -751,12 +751,16 @@ user_work:  	andi.	r0,r4,_TIF_NEED_RESCHED  	beq	1f +	li	r5,1 +	TRACE_AND_RESTORE_IRQ(r5);  	bl	.schedule  	b	.ret_from_except_lite  1:	bl	.save_nvgprs +	li	r5,1 +	TRACE_AND_RESTORE_IRQ(r5);  	addi	r3,r1,STACK_FRAME_OVERHEAD -	bl	.do_signal +	bl	.do_notify_resume  	b	.ret_from_except  unrecov_restore: diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index d4be7bb3dbd..15c5a4f6de0 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -774,8 +774,8 @@ alignment_common:  program_check_common:  	EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN)  	bl	.save_nvgprs +	DISABLE_INTS  	addi	r3,r1,STACK_FRAME_OVERHEAD -	ENABLE_INTS  	bl	.program_check_exception  	b	.ret_from_except diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 701d4aceb4f..01e2877e8e0 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c @@ -118,10 +118,14 @@ static inline notrace void set_soft_enabled(unsigned long enable)  static inline notrace void decrementer_check_overflow(void)  {  	u64 now = get_tb_or_rtc(); -	u64 *next_tb = &__get_cpu_var(decrementers_next_tb); +	u64 *next_tb; + +	preempt_disable(); +	next_tb = &__get_cpu_var(decrementers_next_tb);  	if (now >= *next_tb)  		set_dec(1); +	preempt_enable();  }  notrace void arch_local_irq_restore(unsigned long en) diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c index 3fea3689527..bedd12e1cfb 100644 --- a/arch/powerpc/kernel/legacy_serial.c +++ b/arch/powerpc/kernel/legacy_serial.c @@ -442,8 +442,10 @@ static void __init fixup_port_irq(int index,  	port->irq = virq; +#ifdef CONFIG_SERIAL_8250_FSL  	if (of_device_is_compatible(np, "fsl,ns16550"))  		port->handle_irq = fsl8250_handle_irq; +#endif  }  static void __init fixup_port_pio(int index, diff --git a/arch/powerpc/kernel/perf_event.c b/arch/powerpc/kernel/perf_event.c index 10a140f82cb..64483fde95c 100644 --- a/arch/powerpc/kernel/perf_event.c +++ b/arch/powerpc/kernel/perf_event.c @@ -865,6 +865,7 @@ static void power_pmu_start(struct perf_event *event, int ef_flags)  {  	unsigned long flags;  	s64 left; +	unsigned long val;  	if (!event->hw.idx || !event->hw.sample_period)  		return; @@ -880,7 +881,12 @@ static void power_pmu_start(struct perf_event *event, int ef_flags)  	event->hw.state = 0;  	left = local64_read(&event->hw.period_left); -	write_pmc(event->hw.idx, left); + +	val = 0; +	if (left < 0x80000000L) +		val = 0x80000000L - left; + +	write_pmc(event->hw.idx, val);  	perf_event_update_userpage(event);  	perf_pmu_enable(event->pmu); diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index ebe5766781a..d817ab01848 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -566,12 +566,12 @@ static void show_instructions(struct pt_regs *regs)  		 */  		if (!__kernel_text_address(pc) ||  		     __get_user(instr, (unsigned int __user *)pc)) { -			printk("XXXXXXXX "); +			printk(KERN_CONT "XXXXXXXX ");  		} else {  			if (regs->nip == pc) -				printk("<%08x> ", instr); +				printk(KERN_CONT "<%08x> ", instr);  			else -				printk("%08x ", instr); +				printk(KERN_CONT "%08x ", instr);  		}  		pc += sizeof(int); diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 517b1d8f455..9f843cdfee9 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c @@ -716,7 +716,6 @@ static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_w  	int cpu;  	slb_set_size(SLB_MIN_SIZE); -	stop_topology_update();  	printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", smp_processor_id());  	while (rc == H_MULTI_THREADS_ACTIVE && !atomic_read(&data->done) && @@ -732,7 +731,6 @@ static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_w  		rc = atomic_read(&data->error);  	atomic_set(&data->error, rc); -	start_topology_update();  	pSeries_coalesce_init();  	if (wake_when_done) { @@ -846,6 +844,7 @@ int rtas_ibm_suspend_me(struct rtas_args *args)  	atomic_set(&data.error, 0);  	data.token = rtas_token("ibm,suspend-me");  	data.complete = &done; +	stop_topology_update();  	/* Call function on all CPUs.  One of us will make the  	 * rtas call @@ -858,6 +857,8 @@ int rtas_ibm_suspend_me(struct rtas_args *args)  	if (atomic_read(&data.error) != 0)  		printk(KERN_ERR "Error doing global join\n"); +	start_topology_update(); +  	return atomic_read(&data.error);  }  #else /* CONFIG_PPC_PSERIES */ diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index 2300426e531..ac6e437b102 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c @@ -11,6 +11,7 @@  #include <linux/tracehook.h>  #include <linux/signal.h> +#include <linux/key.h>  #include <asm/hw_breakpoint.h>  #include <asm/uaccess.h>  #include <asm/unistd.h> @@ -113,8 +114,9 @@ static void check_syscall_restart(struct pt_regs *regs, struct k_sigaction *ka,  	}  } -static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs) +static int do_signal(struct pt_regs *regs)  { +	sigset_t *oldset;  	siginfo_t info;  	int signr;  	struct k_sigaction ka; @@ -123,7 +125,7 @@ static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs)  	if (current_thread_info()->local_flags & _TLF_RESTORE_SIGMASK)  		oldset = ¤t->saved_sigmask; -	else if (!oldset) +	else  		oldset = ¤t->blocked;  	signr = get_signal_to_deliver(&info, &ka, regs, NULL); @@ -191,14 +193,16 @@ static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs)  	return ret;  } -void do_signal(struct pt_regs *regs, unsigned long thread_info_flags) +void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)  {  	if (thread_info_flags & _TIF_SIGPENDING) -		do_signal_pending(NULL, regs); +		do_signal(regs);  	if (thread_info_flags & _TIF_NOTIFY_RESUME) {  		clear_thread_flag(TIF_NOTIFY_RESUME);  		tracehook_notify_resume(regs); +		if (current->replacement_session_keyring) +			key_replace_session_keyring();  	}  } diff --git a/arch/powerpc/kernel/signal.h b/arch/powerpc/kernel/signal.h index 6c0ddfc0603..8dde973aaaf 100644 --- a/arch/powerpc/kernel/signal.h +++ b/arch/powerpc/kernel/signal.h @@ -12,7 +12,7 @@  #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) -extern void do_signal(struct pt_regs *regs, unsigned long thread_info_flags); +extern void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags);  extern void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,  				  size_t frame_size, int is_32); diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c index bb3d84f4046..b0984ada3f8 100644 --- a/arch/powerpc/platforms/85xx/p1022_ds.c +++ b/arch/powerpc/platforms/85xx/p1022_ds.c @@ -25,6 +25,7 @@  #include <sysdev/fsl_soc.h>  #include <sysdev/fsl_pci.h> +#include <asm/udbg.h>  #include <asm/fsl_guts.h>  #include "smp.h" diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index f31162cfdaa..5e155dfc432 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -204,11 +204,10 @@ static void __devinit pnv_ioda_offset_bus(struct pci_bus *bus,  	pr_devel("  -> OBR %s [%x] +%016llx\n",  		 bus->self ? pci_name(bus->self) : "root", flags, offset); -	for (i = 0; i < 2; i++) { -		r = bus->resource[i]; +	pci_bus_for_each_resource(bus, r, i) {  		if (r && (r->flags & flags)) { -			bus->resource[i]->start += offset; -			bus->resource[i]->end += offset; +			r->start += offset; +			r->end += offset;  		}  	}  	list_for_each_entry(dev, &bus->devices, bus_list) @@ -288,12 +287,17 @@ static void __devinit pnv_ioda_calc_bus(struct pci_bus *bus, unsigned int flags,  	 * assignment algorithm is going to be uber-trivial for now, we  	 * can try to be smarter later at filling out holes.  	 */ -	start = bus->self ? 0 : bus->resource[bres]->start; - -	/* Don't hand out IO 0 */ -	if ((flags & IORESOURCE_IO) && !bus->self) -		start += 0x1000; - +	if (bus->self) { +		/* No offset for downstream bridges */ +		start = 0; +	} else { +		/* Offset from the root */ +		if (flags & IORESOURCE_IO) +			/* Don't hand out IO 0 */ +			start = hose->io_resource.start + 0x1000; +		else +			start = hose->mem_resources[0].start; +	}  	while(!list_empty(&head)) {  		w = list_first_entry(&head, struct resource_wrap, link);  		list_del(&w->link); @@ -321,13 +325,20 @@ static void __devinit pnv_ioda_calc_bus(struct pci_bus *bus, unsigned int flags,   empty:  	/* Only setup P2P's, not the PHB itself */  	if (bus->self) { -		WARN_ON(bus->resource[bres] == NULL); -		bus->resource[bres]->start = 0; -		bus->resource[bres]->flags = (*size) ? flags : 0; -		bus->resource[bres]->end = (*size) ? (*size - 1) : 0; +		struct resource *res = bus->resource[bres]; + +		if (WARN_ON(res == NULL)) +			return; -		/* Clear prefetch bus resources for now */ -		bus->resource[2]->flags = 0; +		/* +		 * FIXME: We should probably export and call +		 * pci_bridge_check_ranges() to properly re-initialize +		 * the PCI portion of the flags here, and to detect +		 * what the bridge actually supports. +		 */ +		res->start = 0; +		res->flags = (*size) ? flags : 0; +		res->end = (*size) ? (*size - 1) : 0;  	}  	pr_devel("<- CBR %s [%x] *size=%016llx *align=%016llx\n", diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index a70bc1e385e..f92b9ef7340 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c @@ -52,32 +52,38 @@ static int pnv_msi_check_device(struct pci_dev* pdev, int nvec, int type)  static unsigned int pnv_get_one_msi(struct pnv_phb *phb)  { -	unsigned int id; +	unsigned long flags; +	unsigned int id, rc; + +	spin_lock_irqsave(&phb->lock, flags); -	spin_lock(&phb->lock);  	id = find_next_zero_bit(phb->msi_map, phb->msi_count, phb->msi_next);  	if (id >= phb->msi_count && phb->msi_next)  		id = find_next_zero_bit(phb->msi_map, phb->msi_count, 0);  	if (id >= phb->msi_count) { -		spin_unlock(&phb->lock); -		return 0; +		rc = 0; +		goto out;  	}  	__set_bit(id, phb->msi_map); -	spin_unlock(&phb->lock); -	return id + phb->msi_base; +	rc = id + phb->msi_base; +out: +	spin_unlock_irqrestore(&phb->lock, flags); +	return rc;  }  static void pnv_put_msi(struct pnv_phb *phb, unsigned int hwirq)  { +	unsigned long flags;  	unsigned int id;  	if (WARN_ON(hwirq < phb->msi_base ||  		    hwirq >= (phb->msi_base + phb->msi_count)))  		return;  	id = hwirq - phb->msi_base; -	spin_lock(&phb->lock); + +	spin_lock_irqsave(&phb->lock, flags);  	__clear_bit(id, phb->msi_map); -	spin_unlock(&phb->lock); +	spin_unlock_irqrestore(&phb->lock, flags);  }  static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig index ae7b6d41fed..31f22c1f657 100644 --- a/arch/powerpc/platforms/pseries/Kconfig +++ b/arch/powerpc/platforms/pseries/Kconfig @@ -122,7 +122,7 @@ config DTL  	  Say N if you are unsure.  config PSERIES_IDLE -	tristate "Cpuidle driver for pSeries platforms" +	bool "Cpuidle driver for pSeries platforms"  	depends on CPU_IDLE  	depends on PPC_PSERIES  	default y diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c index 565869022e3..c0b40af4ce4 100644 --- a/arch/powerpc/platforms/pseries/eeh.c +++ b/arch/powerpc/platforms/pseries/eeh.c @@ -551,9 +551,9 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)  			printk (KERN_ERR "EEH: %d reads ignored for recovering device at "  				"location=%s driver=%s pci addr=%s\n",  				pdn->eeh_check_count, location, -				dev->driver->name, eeh_pci_name(dev)); +				eeh_driver_name(dev), eeh_pci_name(dev));  			printk (KERN_ERR "EEH: Might be infinite loop in %s driver\n", -				dev->driver->name); +				eeh_driver_name(dev));  			dump_stack();  		}  		goto dn_unlock; diff --git a/arch/powerpc/platforms/pseries/suspend.c b/arch/powerpc/platforms/pseries/suspend.c index b84a8b2238d..47226e04126 100644 --- a/arch/powerpc/platforms/pseries/suspend.c +++ b/arch/powerpc/platforms/pseries/suspend.c @@ -24,6 +24,7 @@  #include <asm/machdep.h>  #include <asm/mmu.h>  #include <asm/rtas.h> +#include <asm/topology.h>  static u64 stream_id;  static struct device suspend_dev; @@ -138,8 +139,11 @@ static ssize_t store_hibernate(struct device *dev,  			ssleep(1);  	} while (rc == -EAGAIN); -	if (!rc) +	if (!rc) { +		stop_topology_update();  		rc = pm_suspend(PM_SUSPEND_MEM); +		start_topology_update(); +	}  	stream_id = 0; diff --git a/arch/powerpc/platforms/wsp/ics.c b/arch/powerpc/platforms/wsp/ics.c index 57687439254..97fe82ee863 100644 --- a/arch/powerpc/platforms/wsp/ics.c +++ b/arch/powerpc/platforms/wsp/ics.c @@ -346,7 +346,7 @@ static int wsp_chip_set_affinity(struct irq_data *d,  	 * For the moment only implement delivery to all cpus or one cpu.  	 * Get current irq_server for the given irq  	 */ -	ret = cache_hwirq_map(ics, d->irq, cpumask); +	ret = cache_hwirq_map(ics, hw_irq, cpumask);  	if (ret == -1) {  		char cpulist[128];  		cpumask_scnprintf(cpulist, sizeof(cpulist), cpumask); diff --git a/arch/powerpc/platforms/wsp/smp.c b/arch/powerpc/platforms/wsp/smp.c index 71bd105f386..0ba103ae83a 100644 --- a/arch/powerpc/platforms/wsp/smp.c +++ b/arch/powerpc/platforms/wsp/smp.c @@ -71,7 +71,7 @@ int __devinit smp_a2_kick_cpu(int nr)  static int __init smp_a2_probe(void)  { -	return cpus_weight(cpu_possible_map); +	return num_possible_cpus();  }  static struct smp_ops_t a2_smp_ops = { diff --git a/arch/powerpc/platforms/wsp/wsp_pci.c b/arch/powerpc/platforms/wsp/wsp_pci.c index e0262cd0e2d..d24b3acf858 100644 --- a/arch/powerpc/platforms/wsp/wsp_pci.c +++ b/arch/powerpc/platforms/wsp/wsp_pci.c @@ -468,15 +468,15 @@ static void __init wsp_pcie_configure_hw(struct pci_controller *hose)  #define DUMP_REG(x) \  	pr_debug("%-30s : 0x%016llx\n", #x, in_be64(hose->cfg_data + x)) -#ifdef CONFIG_WSP_DD1_WORKAROUND_BAD_PCIE_CLASS -	/* WSP DD1 has a bogus class code by default in the PCI-E -	 * root complex's built-in P2P bridge */ +	/* +	 * Some WSP variants  has a bogus class code by default in the PCI-E +	 * root complex's built-in P2P bridge +	 */  	val = in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1);  	pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", val);  	out_be64(hose->cfg_data + PCIE_REG_SYS_CFG1,  		 (val & ~PCIE_REG_SYS_CFG1_CLASS_CODE) | (PCI_CLASS_BRIDGE_PCI << 8));  	pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1)); -#endif /* CONFIG_WSP_DD1_WORKAROUND_BAD_PCIE_CLASS */  #ifdef CONFIG_WSP_DD1_WORKAROUND_DD1_TCE_BUGS  	/* XXX Disable TCE caching, it doesn't work on DD1 */ diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 3b61e8cf342..6073288fed2 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c @@ -205,12 +205,12 @@ static void __init setup_pci_atmu(struct pci_controller *hose,  	if (paddr_hi == paddr_lo) {  		pr_err("%s: No outbound window space\n", name); -		return ; +		goto out;  	}  	if (paddr_lo == 0) {  		pr_err("%s: No space for inbound window\n", name); -		return ; +		goto out;  	}  	/* setup PCSRBAR/PEXCSRBAR */ @@ -357,6 +357,7 @@ static void __init setup_pci_atmu(struct pci_controller *hose,  			(u64)hose->dma_window_size);  	} +out:  	iounmap(pci);  } @@ -384,26 +385,36 @@ static void __init setup_pci_cmd(struct pci_controller *hose)  void fsl_pcibios_fixup_bus(struct pci_bus *bus)  {  	struct pci_controller *hose = pci_bus_to_host(bus); -	int i; +	int i, is_pcie = 0, no_link; -	if ((bus->parent == hose->bus) && -	    ((fsl_pcie_bus_fixup && -	      early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) || -	     (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK))) -	{ -		for (i = 0; i < 4; ++i) { +	/* The root complex bridge comes up with bogus resources, +	 * we copy the PHB ones in. +	 * +	 * With the current generic PCI code, the PHB bus no longer +	 * has bus->resource[0..4] set, so things are a bit more +	 * tricky. +	 */ + +	if (fsl_pcie_bus_fixup) +		is_pcie = early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP); +	no_link = !!(hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK); + +	if (bus->parent == hose->bus && (is_pcie || no_link)) { +		for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; ++i) {  			struct resource *res = bus->resource[i]; -			struct resource *par = bus->parent->resource[i]; -			if (res) { -				res->start = 0; -				res->end   = 0; -				res->flags = 0; -			} -			if (res && par) { -				res->start = par->start; -				res->end   = par->end; -				res->flags = par->flags; -			} +			struct resource *par; + +			if (!res) +				continue; +			if (i == 0) +				par = &hose->io_resource; +			else if (i < 4) +				par = &hose->mem_resources[i-1]; +			else par = NULL; + +			res->start = par ? par->start : 0; +			res->end   = par ? par->end   : 0; +			res->flags = par ? par->flags : 0;  		}  	}  } diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index d1727584230..6d99a5fcc09 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -227,6 +227,9 @@ config COMPAT  config SYSVIPC_COMPAT  	def_bool y if COMPAT && SYSVIPC +config KEYS_COMPAT +	def_bool y if COMPAT && KEYS +  config AUDIT_ARCH  	def_bool y diff --git a/arch/s390/Makefile b/arch/s390/Makefile index e9f35334169..0ad2f1e1ce9 100644 --- a/arch/s390/Makefile +++ b/arch/s390/Makefile @@ -88,7 +88,6 @@ KBUILD_CFLAGS	+= -pipe -fno-strength-reduce -Wno-sign-compare  KBUILD_AFLAGS	+= $(aflags-y)  OBJCOPYFLAGS	:= -O binary -LDFLAGS_vmlinux := -e start  head-y		:= arch/s390/kernel/head.o  head-y		+= arch/s390/kernel/$(if $(CONFIG_64BIT),head64.o,head31.o) diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h index 2e49748b27d..234f1d859ce 100644 --- a/arch/s390/include/asm/compat.h +++ b/arch/s390/include/asm/compat.h @@ -172,13 +172,6 @@ static inline int is_compat_task(void)  	return is_32bit_task();  } -#else - -static inline int is_compat_task(void) -{ -	return 0; -} -  #endif  static inline void __user *arch_compat_alloc_user_space(long len) diff --git a/arch/s390/include/asm/kexec.h b/arch/s390/include/asm/kexec.h index cf4e47b0948..3f30dac804e 100644 --- a/arch/s390/include/asm/kexec.h +++ b/arch/s390/include/asm/kexec.h @@ -42,6 +42,24 @@  /* The native architecture */  #define KEXEC_ARCH KEXEC_ARCH_S390 +/* + * Size for s390x ELF notes per CPU + * + * Seven notes plus zero note at the end: prstatus, fpregset, timer, + * tod_cmp, tod_reg, control regs, and prefix + */ +#define KEXEC_NOTE_BYTES \ +	(ALIGN(sizeof(struct elf_note), 4) * 8 + \ +	 ALIGN(sizeof("CORE"), 4) * 7 + \ +	 ALIGN(sizeof(struct elf_prstatus), 4) + \ +	 ALIGN(sizeof(elf_fpregset_t), 4) + \ +	 ALIGN(sizeof(u64), 4) + \ +	 ALIGN(sizeof(u64), 4) + \ +	 ALIGN(sizeof(u32), 4) + \ +	 ALIGN(sizeof(u64) * 16, 4) + \ +	 ALIGN(sizeof(u32), 4) \ +	) +  /* Provide a dummy definition to avoid build failures. */  static inline void crash_setup_regs(struct pt_regs *newregs,  					struct pt_regs *oldregs) { } diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 18c51df9fe0..ff605a39cf4 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S @@ -662,7 +662,7 @@ ENTRY(sys32_getresuid16_wrapper)  ENTRY(sys32_poll_wrapper)  	llgtr	%r2,%r2			# struct pollfd *  	llgfr	%r3,%r3			# unsigned int -	lgfr	%r4,%r4			# long +	lgfr	%r4,%r4			# int  	jg	sys_poll		# branch to system call  ENTRY(sys32_setresgid16_wrapper) diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c index 39f8fd4438f..c383ce440d9 100644 --- a/arch/s390/kernel/crash_dump.c +++ b/arch/s390/kernel/crash_dump.c @@ -11,7 +11,6 @@  #include <linux/module.h>  #include <linux/gfp.h>  #include <linux/slab.h> -#include <linux/crash_dump.h>  #include <linux/bootmem.h>  #include <linux/elf.h>  #include <asm/ipl.h> diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 3201ae44799..e795933eb2c 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c @@ -29,7 +29,6 @@  #include <asm/irq.h>  #include <asm/timer.h>  #include <asm/nmi.h> -#include <asm/compat.h>  #include <asm/smp.h>  #include "entry.h" @@ -76,7 +75,6 @@ static void default_idle(void)  	if (test_thread_flag(TIF_MCCK_PENDING)) {  		local_mcck_enable();  		local_irq_enable(); -		s390_handle_mcck();  		return;  	}  	trace_hardirqs_on(); @@ -93,10 +91,12 @@ void cpu_idle(void)  	for (;;) {  		tick_nohz_idle_enter();  		rcu_idle_enter(); -		while (!need_resched()) +		while (!need_resched() && !test_thread_flag(TIF_MCCK_PENDING))  			default_idle();  		rcu_idle_exit();  		tick_nohz_idle_exit(); +		if (test_thread_flag(TIF_MCCK_PENDING)) +			s390_handle_mcck();  		preempt_enable_no_resched();  		schedule();  		preempt_disable(); diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 9d82ed4bcb2..61f95489d70 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c @@ -20,8 +20,8 @@  #include <linux/regset.h>  #include <linux/tracehook.h>  #include <linux/seccomp.h> +#include <linux/compat.h>  #include <trace/syscall.h> -#include <asm/compat.h>  #include <asm/segment.h>  #include <asm/page.h>  #include <asm/pgtable.h> diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 354de0763ef..3b2efc81f34 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c @@ -46,6 +46,7 @@  #include <linux/kexec.h>  #include <linux/crash_dump.h>  #include <linux/memory.h> +#include <linux/compat.h>  #include <asm/ipl.h>  #include <asm/uaccess.h> @@ -59,7 +60,6 @@  #include <asm/ptrace.h>  #include <asm/sections.h>  #include <asm/ebcdic.h> -#include <asm/compat.h>  #include <asm/kvm_virtio.h>  #include <asm/diag.h> diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index a8ba840294f..2d421d90fad 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c @@ -30,7 +30,6 @@  #include <asm/ucontext.h>  #include <asm/uaccess.h>  #include <asm/lowcore.h> -#include <asm/compat.h>  #include "entry.h"  #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index fa02f443f5f..14da278febb 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c @@ -113,11 +113,14 @@ static void fixup_clock_comparator(unsigned long long delta)  static int s390_next_ktime(ktime_t expires,  			   struct clock_event_device *evt)  { +	struct timespec ts;  	u64 nsecs; -	nsecs = ktime_to_ns(ktime_sub(expires, ktime_get_monotonic_offset())); +	ts.tv_sec = ts.tv_nsec = 0; +	monotonic_to_bootbased(&ts); +	nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires));  	do_div(nsecs, 125); -	S390_lowcore.clock_comparator = TOD_UNIX_EPOCH + (nsecs << 9); +	S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9);  	set_clock_comparator(S390_lowcore.clock_comparator);  	return 0;  } diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index e4c79ebb40e..21109c63eb1 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S @@ -9,12 +9,12 @@  #ifndef CONFIG_64BIT  OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390")  OUTPUT_ARCH(s390) -ENTRY(_start) +ENTRY(startup)  jiffies = jiffies_64 + 4;  #else  OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")  OUTPUT_ARCH(s390:64-bit) -ENTRY(_start) +ENTRY(startup)  jiffies = jiffies_64;  #endif diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 354dd39073e..e8fcd928dc7 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c @@ -36,7 +36,6 @@  #include <asm/pgtable.h>  #include <asm/irq.h>  #include <asm/mmu_context.h> -#include <asm/compat.h>  #include "../kernel/entry.h"  #ifndef CONFIG_64BIT diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index 5d633019d8f..50236610de8 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c @@ -223,16 +223,38 @@ void free_initrd_mem(unsigned long start, unsigned long end)  #ifdef CONFIG_MEMORY_HOTPLUG  int arch_add_memory(int nid, u64 start, u64 size)  { -	struct pglist_data *pgdat; +	unsigned long zone_start_pfn, zone_end_pfn, nr_pages; +	unsigned long start_pfn = PFN_DOWN(start); +	unsigned long size_pages = PFN_DOWN(size);  	struct zone *zone;  	int rc; -	pgdat = NODE_DATA(nid); -	zone = pgdat->node_zones + ZONE_MOVABLE;  	rc = vmem_add_mapping(start, size);  	if (rc)  		return rc; -	rc = __add_pages(nid, zone, PFN_DOWN(start), PFN_DOWN(size)); +	for_each_zone(zone) { +		if (zone_idx(zone) != ZONE_MOVABLE) { +			/* Add range within existing zone limits */ +			zone_start_pfn = zone->zone_start_pfn; +			zone_end_pfn = zone->zone_start_pfn + +				       zone->spanned_pages; +		} else { +			/* Add remaining range to ZONE_MOVABLE */ +			zone_start_pfn = start_pfn; +			zone_end_pfn = start_pfn + size_pages; +		} +		if (start_pfn < zone_start_pfn || start_pfn >= zone_end_pfn) +			continue; +		nr_pages = (start_pfn + size_pages > zone_end_pfn) ? +			   zone_end_pfn - start_pfn : size_pages; +		rc = __add_pages(nid, zone, start_pfn, nr_pages); +		if (rc) +			break; +		start_pfn += nr_pages; +		size_pages -= nr_pages; +		if (!size_pages) +			break; +	}  	if (rc)  		vmem_remove_mapping(start, size);  	return rc; diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c index f09c74881b7..a0155c02e32 100644 --- a/arch/s390/mm/mmap.c +++ b/arch/s390/mm/mmap.c @@ -29,8 +29,8 @@  #include <linux/mman.h>  #include <linux/module.h>  #include <linux/random.h> +#include <linux/compat.h>  #include <asm/pgalloc.h> -#include <asm/compat.h>  static unsigned long stack_maxrandom_size(void)  { diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 9a4d02f64f1..51b0738e13d 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c @@ -574,7 +574,7 @@ static inline void page_table_free_pgste(unsigned long *table)  	page = pfn_to_page(__pa(table) >> PAGE_SHIFT);  	mp = (struct gmap_pgtable *) page->index;  	BUG_ON(!list_empty(&mp->mapper)); -	pgtable_page_ctor(page); +	pgtable_page_dtor(page);  	atomic_set(&page->_mapcount, -1);  	kfree(mp);  	__free_page(page); diff --git a/arch/score/kernel/entry.S b/arch/score/kernel/entry.S index 577abba3fac..83bb96079c4 100644 --- a/arch/score/kernel/entry.S +++ b/arch/score/kernel/entry.S @@ -408,7 +408,7 @@ ENTRY(handle_sys)  	sw	r9, [r0, PT_EPC]  	cmpi.c	r27, __NR_syscalls 	# check syscall number -	bgtu	illegal_syscall +	bgeu	illegal_syscall  	slli	r8, r27, 2		# get syscall routine  	la	r11, sys_call_table diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 3c8db65c89e..713fb58ca50 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -859,6 +859,7 @@ config PCI  	depends on SYS_SUPPORTS_PCI  	select PCI_DOMAINS  	select GENERIC_PCI_IOMAP +	select NO_GENERIC_PCI_IOPORT_MAP  	help  	  Find out whether you have a PCI motherboard. PCI is the name of a  	  bus system, i.e. the way the CPU talks to the other stuff inside diff --git a/arch/sh/boards/board-sh7757lcr.c b/arch/sh/boards/board-sh7757lcr.c index 0838154dd21..24b1ee410da 100644 --- a/arch/sh/boards/board-sh7757lcr.c +++ b/arch/sh/boards/board-sh7757lcr.c @@ -169,6 +169,11 @@ static struct resource sh_eth_giga1_resources[] = {  		.end    = 0xfee00fff,  		.flags  = IORESOURCE_MEM,  	}, { +		/* TSU */ +		.start  = 0xfee01800, +		.end    = 0xfee01fff, +		.flags  = IORESOURCE_MEM, +	}, {  		.start  = 316,  		.end    = 316,  		.flags  = IORESOURCE_IRQ, @@ -210,20 +215,13 @@ static struct resource sh_mmcif_resources[] = {  	},  }; -static struct sh_mmcif_dma sh7757lcr_mmcif_dma = { -	.chan_priv_tx	= { -		.slave_id = SHDMA_SLAVE_MMCIF_TX, -	}, -	.chan_priv_rx	= { -		.slave_id = SHDMA_SLAVE_MMCIF_RX, -	} -}; -  static struct sh_mmcif_plat_data sh_mmcif_plat = { -	.dma		= &sh7757lcr_mmcif_dma,  	.sup_pclk	= 0x0f, -	.caps		= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, +	.caps		= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA | +			  MMC_CAP_NONREMOVABLE,  	.ocr		= MMC_VDD_32_33 | MMC_VDD_33_34, +	.slave_id_tx	= SHDMA_SLAVE_MMCIF_TX, +	.slave_id_rx	= SHDMA_SLAVE_MMCIF_RX,  };  static struct platform_device sh_mmcif_device = { diff --git a/arch/sh/boards/mach-ap325rxa/setup.c b/arch/sh/boards/mach-ap325rxa/setup.c index 6418e95c2b6..ebd0f818a25 100644 --- a/arch/sh/boards/mach-ap325rxa/setup.c +++ b/arch/sh/boards/mach-ap325rxa/setup.c @@ -22,6 +22,7 @@  #include <linux/i2c.h>  #include <linux/smsc911x.h>  #include <linux/gpio.h> +#include <linux/videodev2.h>  #include <media/ov772x.h>  #include <media/soc_camera.h>  #include <media/soc_camera_platform.h> diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 033ef2ba621..cde7c0085ce 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c @@ -29,9 +29,11 @@  #include <linux/input.h>  #include <linux/input/sh_keysc.h>  #include <linux/sh_eth.h> +#include <linux/videodev2.h>  #include <video/sh_mobile_lcdc.h>  #include <sound/sh_fsi.h>  #include <media/sh_mobile_ceu.h> +#include <media/soc_camera.h>  #include <media/tw9910.h>  #include <media/mt9t112.h>  #include <asm/heartbeat.h> diff --git a/arch/sh/boards/mach-kfr2r09/setup.c b/arch/sh/boards/mach-kfr2r09/setup.c index 2a18b06abda..5b382e1afae 100644 --- a/arch/sh/boards/mach-kfr2r09/setup.c +++ b/arch/sh/boards/mach-kfr2r09/setup.c @@ -22,6 +22,7 @@  #include <linux/input/sh_keysc.h>  #include <linux/i2c.h>  #include <linux/usb/r8a66597.h> +#include <linux/videodev2.h>  #include <media/rj54n1cb0c.h>  #include <media/soc_camera.h>  #include <media/sh_mobile_ceu.h> diff --git a/arch/sh/boards/mach-migor/setup.c b/arch/sh/boards/mach-migor/setup.c index 68c3d6f4289..d37ba272052 100644 --- a/arch/sh/boards/mach-migor/setup.c +++ b/arch/sh/boards/mach-migor/setup.c @@ -21,9 +21,11 @@  #include <linux/delay.h>  #include <linux/clk.h>  #include <linux/gpio.h> +#include <linux/videodev2.h>  #include <video/sh_mobile_lcdc.h>  #include <media/sh_mobile_ceu.h>  #include <media/ov772x.h> +#include <media/soc_camera.h>  #include <media/tw9910.h>  #include <asm/clock.h>  #include <asm/machvec.h> diff --git a/arch/sh/boards/mach-se/7724/setup.c b/arch/sh/boards/mach-se/7724/setup.c index 036fe1adaef..2b07fc01695 100644 --- a/arch/sh/boards/mach-se/7724/setup.c +++ b/arch/sh/boards/mach-se/7724/setup.c @@ -24,6 +24,7 @@  #include <linux/input/sh_keysc.h>  #include <linux/usb/r8a66597.h>  #include <linux/sh_eth.h> +#include <linux/videodev2.h>  #include <video/sh_mobile_lcdc.h>  #include <media/sh_mobile_ceu.h>  #include <sound/sh_fsi.h> diff --git a/arch/sh/drivers/pci/pci-sh7780.c b/arch/sh/drivers/pci/pci-sh7780.c index fa7b978cc72..fb8f1499074 100644 --- a/arch/sh/drivers/pci/pci-sh7780.c +++ b/arch/sh/drivers/pci/pci-sh7780.c @@ -74,7 +74,7 @@ struct pci_errors {  	{ SH4_PCIINT_MLCK,	"master lock error" },  	{ SH4_PCIINT_TABT,	"target-target abort" },  	{ SH4_PCIINT_TRET,	"target retry time out" }, -	{ SH4_PCIINT_MFDE,	"master function disable erorr" }, +	{ SH4_PCIINT_MFDE,	"master function disable error" },  	{ SH4_PCIINT_PRTY,	"address parity error" },  	{ SH4_PCIINT_SERR,	"SERR" },  	{ SH4_PCIINT_TWDP,	"data parity error for target write" }, diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index 8f18dd090a6..1e7b0e2e764 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c @@ -356,8 +356,8 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,  #ifndef CONFIG_GENERIC_IOMAP -static void __iomem *ioport_map_pci(struct pci_dev *dev, -				    unsigned long port, unsigned int nr) +void __iomem *__pci_ioport_map(struct pci_dev *dev, +			       unsigned long port, unsigned int nr)  {  	struct pci_channel *chan = dev->sysdata; diff --git a/arch/sh/include/asm/device.h b/arch/sh/include/asm/device.h index a1c9c0daec1..071bcb4d4bf 100644 --- a/arch/sh/include/asm/device.h +++ b/arch/sh/include/asm/device.h @@ -3,9 +3,10 @@   *   * This file is released under the GPLv2   */ +#ifndef __ASM_SH_DEVICE_H +#define __ASM_SH_DEVICE_H -struct dev_archdata { -}; +#include <asm-generic/device.h>  struct platform_device;  /* allocate contiguous memory chunk and fill in struct resource */ @@ -14,5 +15,4 @@ int platform_resource_setup_memory(struct platform_device *pdev,  void plat_early_device_setup(void); -struct pdev_archdata { -}; +#endif /* __ASM_SH_DEVICE_H */ diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7724.c b/arch/sh/kernel/cpu/sh4a/clock-sh7724.c index b3c039a5064..70bd96646f4 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7724.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7724.c @@ -343,7 +343,7 @@ static struct clk_lookup lookups[] = {  	CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[HWBLK_CEU1]),  	CLKDEV_CON_ID("beu1", &mstp_clks[HWBLK_BEU1]),  	CLKDEV_CON_ID("2ddmac0", &mstp_clks[HWBLK_2DDMAC]), -	CLKDEV_CON_ID("spu0", &mstp_clks[HWBLK_SPU]), +	CLKDEV_DEV_ID("sh_fsi.0", &mstp_clks[HWBLK_SPU]),  	CLKDEV_CON_ID("jpu0", &mstp_clks[HWBLK_JPU]),  	CLKDEV_DEV_ID("sh-vou.0", &mstp_clks[HWBLK_VOU]),  	CLKDEV_CON_ID("beu0", &mstp_clks[HWBLK_BEU0]), diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c index a7b2da6b3a1..2875e8be4f7 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c @@ -133,7 +133,7 @@ static struct resource spi0_resources[] = {  	[0] = {  		.start	= 0xfe002000,  		.end	= 0xfe0020ff, -		.flags	= IORESOURCE_MEM, +		.flags	= IORESOURCE_MEM | IORESOURCE_MEM_32BIT,  	},  	[1] = {  		.start	= 86, @@ -661,6 +661,25 @@ static struct platform_device spi0_device = {  	.resource	= spi0_resources,  }; +static struct resource spi1_resources[] = { +	{ +		.start	= 0xffd8ee70, +		.end	= 0xffd8eeff, +		.flags	= IORESOURCE_MEM | IORESOURCE_MEM_8BIT, +	}, +	{ +		.start	= 54, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device spi1_device = { +	.name	= "sh_spi", +	.id	= 1, +	.num_resources	= ARRAY_SIZE(spi1_resources), +	.resource	= spi1_resources, +}; +  static struct resource usb_ehci_resources[] = {  	[0] = {  		.start	= 0xfe4f1000, @@ -720,6 +739,7 @@ static struct platform_device *sh7757_devices[] __initdata = {  	&dma2_device,  	&dma3_device,  	&spi0_device, +	&spi1_device,  	&usb_ehci_device,  	&usb_ohci_device,  }; diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c index 3147a9a6fb8..f624174bf23 100644 --- a/arch/sh/kernel/smp.c +++ b/arch/sh/kernel/smp.c @@ -63,7 +63,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)  	mp_ops->prepare_cpus(max_cpus);  #ifndef CONFIG_HOTPLUG_CPU -	init_cpu_present(&cpu_possible_map); +	init_cpu_present(cpu_possible_mask);  #endif  } diff --git a/arch/sh/kernel/topology.c b/arch/sh/kernel/topology.c index 4649a6ff0cf..772caffba22 100644 --- a/arch/sh/kernel/topology.c +++ b/arch/sh/kernel/topology.c @@ -27,7 +27,7 @@ static cpumask_t cpu_coregroup_map(unsigned int cpu)  	 * Presently all SH-X3 SMP cores are multi-cores, so just keep it  	 * simple until we have a method for determining topology..  	 */ -	return cpu_possible_map; +	return *cpu_possible_mask;  }  const struct cpumask *cpu_coregroup_mask(unsigned int cpu) diff --git a/arch/sh/mm/cache-sh2a.c b/arch/sh/mm/cache-sh2a.c index ae08cbbfa56..949e2d3138a 100644 --- a/arch/sh/mm/cache-sh2a.c +++ b/arch/sh/mm/cache-sh2a.c @@ -23,6 +23,7 @@  #define MAX_OCACHE_PAGES	32  #define MAX_ICACHE_PAGES	32 +#ifdef CONFIG_CACHE_WRITEBACK  static void sh2a_flush_oc_line(unsigned long v, int way)  {  	unsigned long addr = (v & 0x000007f0) | (way << 11); @@ -34,6 +35,7 @@ static void sh2a_flush_oc_line(unsigned long v, int way)  		__raw_writel(data, CACHE_OC_ADDRESS_ARRAY | addr);  	}  } +#endif  static void sh2a_invalidate_line(unsigned long cache_addr, unsigned long v)  { diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 96657992a72..ca5580e4d81 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -33,6 +33,7 @@ config SPARC  config SPARC32  	def_bool !64BIT  	select GENERIC_ATOMIC64 +	select CLZ_TAB  config SPARC64  	def_bool 64BIT diff --git a/arch/sparc/kernel/sun4m_irq.c b/arch/sparc/kernel/sun4m_irq.c index 422c16dad1f..e61165161dd 100644 --- a/arch/sparc/kernel/sun4m_irq.c +++ b/arch/sparc/kernel/sun4m_irq.c @@ -399,6 +399,9 @@ static void __init sun4m_init_timers(irq_handler_t counter_fn)  	timers_global = (void __iomem *)  		(unsigned long) addr[num_cpu_timers]; +	/* Every per-cpu timer works in timer mode */ +	sbus_writel(0x00000000, &timers_global->timer_config); +  	sbus_writel((((1000000/HZ) + 1) << 10), &timers_global->l10_limit);  	master_l10_counter = &timers_global->l10_count; diff --git a/arch/sparc/lib/divdi3.S b/arch/sparc/lib/divdi3.S index 681b3683da9..d74bc0925f2 100644 --- a/arch/sparc/lib/divdi3.S +++ b/arch/sparc/lib/divdi3.S @@ -17,23 +17,9 @@ 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.  */ -	.data -	.align 8 -	.globl	__clz_tab -__clz_tab: -	.byte	0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 -	.byte	6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 -	.byte	7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 -	.byte	7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 -	.byte	8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 -	.byte	8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 -	.byte	8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 -	.byte	8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 -	.size	 __clz_tab,256 -	.global .udiv -  	.text  	.align 4 +	.global .udiv  	.globl __divdi3  __divdi3:  	save %sp,-104,%sp diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 864cc6e6ac8..5bed94e189f 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -360,7 +360,6 @@ config X86_NUMACHIP  	depends on NUMA  	depends on SMP  	depends on X86_X2APIC -	depends on !EDAC_AMD64  	---help---  	  Adds support for Numascale NumaChip large-SMP systems. Needed to  	  enable more than ~168 cores. diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 3a19d04cebe..7116dcba0c9 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c @@ -321,6 +321,8 @@ static void parse_elf(void *output)  		default: /* Ignore other PT_* */ break;  		}  	} + +	free(phdrs);  }  asmlinkage void decompress_kernel(void *rmode, memptr heap, diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index fd843877e84..39e49091f64 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c @@ -315,6 +315,13 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)  	current->mm->free_area_cache = TASK_UNMAPPED_BASE;  	current->mm->cached_hole_size = 0; +	retval = setup_arg_pages(bprm, IA32_STACK_TOP, EXSTACK_DEFAULT); +	if (retval < 0) { +		/* Someone check-me: is this error path enough? */ +		send_sig(SIGKILL, current, 0); +		return retval; +	} +  	install_exec_creds(bprm);  	current->flags &= ~PF_FORKNOEXEC; @@ -410,13 +417,6 @@ beyond_if:  	set_brk(current->mm->start_brk, current->mm->brk); -	retval = setup_arg_pages(bprm, IA32_STACK_TOP, EXSTACK_DEFAULT); -	if (retval < 0) { -		/* Someone check-me: is this error path enough? */ -		send_sig(SIGKILL, current, 0); -		return retval; -	} -  	current->mm->start_stack =  		(unsigned long)create_aout_tables((char __user *)bprm->p, bprm);  	/* start thread */ diff --git a/arch/x86/include/asm/cmpxchg.h b/arch/x86/include/asm/cmpxchg.h index 0c9fa2745f1..b3b73326290 100644 --- a/arch/x86/include/asm/cmpxchg.h +++ b/arch/x86/include/asm/cmpxchg.h @@ -145,13 +145,13 @@ extern void __add_wrong_size(void)  #ifdef __HAVE_ARCH_CMPXCHG  #define cmpxchg(ptr, old, new)						\ -	__cmpxchg((ptr), (old), (new), sizeof(*ptr)) +	__cmpxchg(ptr, old, new, sizeof(*(ptr)))  #define sync_cmpxchg(ptr, old, new)					\ -	__sync_cmpxchg((ptr), (old), (new), sizeof(*ptr)) +	__sync_cmpxchg(ptr, old, new, sizeof(*(ptr)))  #define cmpxchg_local(ptr, old, new)					\ -	__cmpxchg_local((ptr), (old), (new), sizeof(*ptr)) +	__cmpxchg_local(ptr, old, new, sizeof(*(ptr)))  #endif  /* diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 17c5d4bdee5..8d67d428b0f 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h @@ -159,6 +159,7 @@  #define X86_FEATURE_WDT		(6*32+13) /* Watchdog timer */  #define X86_FEATURE_LWP		(6*32+15) /* Light Weight Profiling */  #define X86_FEATURE_FMA4	(6*32+16) /* 4 operands MAC instructions */ +#define X86_FEATURE_TCE		(6*32+17) /* translation cache extension */  #define X86_FEATURE_NODEID_MSR	(6*32+19) /* NodeId MSR */  #define X86_FEATURE_TBM		(6*32+21) /* trailing bit manipulations */  #define X86_FEATURE_TOPOEXT	(6*32+22) /* topology extensions CPUID leafs */ diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h index 6919e936345..247904945d3 100644 --- a/arch/x86/include/asm/i387.h +++ b/arch/x86/include/asm/i387.h @@ -29,10 +29,11 @@ extern unsigned int sig_xstate_size;  extern void fpu_init(void);  extern void mxcsr_feature_mask_init(void);  extern int init_fpu(struct task_struct *child); -extern asmlinkage void math_state_restore(void); -extern void __math_state_restore(void); +extern void math_state_restore(void);  extern int dump_fpu(struct pt_regs *, struct user_i387_struct *); +DECLARE_PER_CPU(struct task_struct *, fpu_owner_task); +  extern user_regset_active_fn fpregs_active, xfpregs_active;  extern user_regset_get_fn fpregs_get, xfpregs_get, fpregs_soft_get,  				xstateregs_get; @@ -212,19 +213,11 @@ static inline void fpu_fxsave(struct fpu *fpu)  #endif	/* CONFIG_X86_64 */ -/* We need a safe address that is cheap to find and that is already -   in L1 during context switch. The best choices are unfortunately -   different for UP and SMP */ -#ifdef CONFIG_SMP -#define safe_address (__per_cpu_offset[0]) -#else -#define safe_address (__get_cpu_var(kernel_cpustat).cpustat[CPUTIME_USER]) -#endif -  /* - * These must be called with preempt disabled + * These must be called with preempt disabled. Returns + * 'true' if the FPU state is still intact.   */ -static inline void fpu_save_init(struct fpu *fpu) +static inline int fpu_save_init(struct fpu *fpu)  {  	if (use_xsave()) {  		fpu_xsave(fpu); @@ -233,33 +226,33 @@ static inline void fpu_save_init(struct fpu *fpu)  		 * xsave header may indicate the init state of the FP.  		 */  		if (!(fpu->state->xsave.xsave_hdr.xstate_bv & XSTATE_FP)) -			return; +			return 1;  	} else if (use_fxsr()) {  		fpu_fxsave(fpu);  	} else {  		asm volatile("fnsave %[fx]; fwait"  			     : [fx] "=m" (fpu->state->fsave)); -		return; +		return 0;  	} -	if (unlikely(fpu->state->fxsave.swd & X87_FSW_ES)) +	/* +	 * If exceptions are pending, we need to clear them so +	 * that we don't randomly get exceptions later. +	 * +	 * FIXME! Is this perhaps only true for the old-style +	 * irq13 case? Maybe we could leave the x87 state +	 * intact otherwise? +	 */ +	if (unlikely(fpu->state->fxsave.swd & X87_FSW_ES)) {  		asm volatile("fnclex"); - -	/* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception -	   is pending.  Clear the x87 state here by setting it to fixed -	   values. safe_address is a random variable that should be in L1 */ -	alternative_input( -		ASM_NOP8 ASM_NOP2, -		"emms\n\t"	  	/* clear stack tags */ -		"fildl %P[addr]",	/* set F?P to defined value */ -		X86_FEATURE_FXSAVE_LEAK, -		[addr] "m" (safe_address)); +		return 0; +	} +	return 1;  } -static inline void __save_init_fpu(struct task_struct *tsk) +static inline int __save_init_fpu(struct task_struct *tsk)  { -	fpu_save_init(&tsk->thread.fpu); -	task_thread_info(tsk)->status &= ~TS_USEDFPU; +	return fpu_save_init(&tsk->thread.fpu);  }  static inline int fpu_fxrstor_checking(struct fpu *fpu) @@ -277,44 +270,212 @@ static inline int fpu_restore_checking(struct fpu *fpu)  static inline int restore_fpu_checking(struct task_struct *tsk)  { +	/* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception +	   is pending.  Clear the x87 state here by setting it to fixed +	   values. "m" is a random variable that should be in L1 */ +	alternative_input( +		ASM_NOP8 ASM_NOP2, +		"emms\n\t"	  	/* clear stack tags */ +		"fildl %P[addr]",	/* set F?P to defined value */ +		X86_FEATURE_FXSAVE_LEAK, +		[addr] "m" (tsk->thread.fpu.has_fpu)); +  	return fpu_restore_checking(&tsk->thread.fpu);  }  /* - * Signal frame handlers... + * Software FPU state helpers. Careful: these need to + * be preemption protection *and* they need to be + * properly paired with the CR0.TS changes!   */ -extern int save_i387_xstate(void __user *buf); -extern int restore_i387_xstate(void __user *buf); +static inline int __thread_has_fpu(struct task_struct *tsk) +{ +	return tsk->thread.fpu.has_fpu; +} -static inline void __unlazy_fpu(struct task_struct *tsk) +/* Must be paired with an 'stts' after! */ +static inline void __thread_clear_has_fpu(struct task_struct *tsk)  { -	if (task_thread_info(tsk)->status & TS_USEDFPU) { -		__save_init_fpu(tsk); -		stts(); -	} else -		tsk->fpu_counter = 0; +	tsk->thread.fpu.has_fpu = 0; +	percpu_write(fpu_owner_task, NULL); +} + +/* Must be paired with a 'clts' before! */ +static inline void __thread_set_has_fpu(struct task_struct *tsk) +{ +	tsk->thread.fpu.has_fpu = 1; +	percpu_write(fpu_owner_task, tsk); +} + +/* + * Encapsulate the CR0.TS handling together with the + * software flag. + * + * These generally need preemption protection to work, + * do try to avoid using these on their own. + */ +static inline void __thread_fpu_end(struct task_struct *tsk) +{ +	__thread_clear_has_fpu(tsk); +	stts(); +} + +static inline void __thread_fpu_begin(struct task_struct *tsk) +{ +	clts(); +	__thread_set_has_fpu(tsk); +} + +/* + * FPU state switching for scheduling. + * + * This is a two-stage process: + * + *  - switch_fpu_prepare() saves the old state and + *    sets the new state of the CR0.TS bit. This is + *    done within the context of the old process. + * + *  - switch_fpu_finish() restores the new state as + *    necessary. + */ +typedef struct { int preload; } fpu_switch_t; + +/* + * FIXME! We could do a totally lazy restore, but we need to + * add a per-cpu "this was the task that last touched the FPU + * on this CPU" variable, and the task needs to have a "I last + * touched the FPU on this CPU" and check them. + * + * We don't do that yet, so "fpu_lazy_restore()" always returns + * false, but some day.. + */ +static inline int fpu_lazy_restore(struct task_struct *new, unsigned int cpu) +{ +	return new == percpu_read_stable(fpu_owner_task) && +		cpu == new->thread.fpu.last_cpu; +} + +static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct task_struct *new, int cpu) +{ +	fpu_switch_t fpu; + +	fpu.preload = tsk_used_math(new) && new->fpu_counter > 5; +	if (__thread_has_fpu(old)) { +		if (!__save_init_fpu(old)) +			cpu = ~0; +		old->thread.fpu.last_cpu = cpu; +		old->thread.fpu.has_fpu = 0;	/* But leave fpu_owner_task! */ + +		/* Don't change CR0.TS if we just switch! */ +		if (fpu.preload) { +			new->fpu_counter++; +			__thread_set_has_fpu(new); +			prefetch(new->thread.fpu.state); +		} else +			stts(); +	} else { +		old->fpu_counter = 0; +		old->thread.fpu.last_cpu = ~0; +		if (fpu.preload) { +			new->fpu_counter++; +			if (fpu_lazy_restore(new, cpu)) +				fpu.preload = 0; +			else +				prefetch(new->thread.fpu.state); +			__thread_fpu_begin(new); +		} +	} +	return fpu;  } +/* + * By the time this gets called, we've already cleared CR0.TS and + * given the process the FPU if we are going to preload the FPU + * state - all we need to do is to conditionally restore the register + * state itself. + */ +static inline void switch_fpu_finish(struct task_struct *new, fpu_switch_t fpu) +{ +	if (fpu.preload) { +		if (unlikely(restore_fpu_checking(new))) +			__thread_fpu_end(new); +	} +} + +/* + * Signal frame handlers... + */ +extern int save_i387_xstate(void __user *buf); +extern int restore_i387_xstate(void __user *buf); +  static inline void __clear_fpu(struct task_struct *tsk)  { -	if (task_thread_info(tsk)->status & TS_USEDFPU) { +	if (__thread_has_fpu(tsk)) {  		/* Ignore delayed exceptions from user space */  		asm volatile("1: fwait\n"  			     "2:\n"  			     _ASM_EXTABLE(1b, 2b)); -		task_thread_info(tsk)->status &= ~TS_USEDFPU; -		stts(); +		__thread_fpu_end(tsk);  	}  } +/* + * Were we in an interrupt that interrupted kernel mode? + * + * We can do a kernel_fpu_begin/end() pair *ONLY* if that + * pair does nothing at all: the thread must not have fpu (so + * that we don't try to save the FPU state), and TS must + * be set (so that the clts/stts pair does nothing that is + * visible in the interrupted kernel thread). + */ +static inline bool interrupted_kernel_fpu_idle(void) +{ +	return !__thread_has_fpu(current) && +		(read_cr0() & X86_CR0_TS); +} + +/* + * Were we in user mode (or vm86 mode) when we were + * interrupted? + * + * Doing kernel_fpu_begin/end() is ok if we are running + * in an interrupt context from user mode - we'll just + * save the FPU state as required. + */ +static inline bool interrupted_user_mode(void) +{ +	struct pt_regs *regs = get_irq_regs(); +	return regs && user_mode_vm(regs); +} + +/* + * Can we use the FPU in kernel mode with the + * whole "kernel_fpu_begin/end()" sequence? + * + * It's always ok in process context (ie "not interrupt") + * but it is sometimes ok even from an irq. + */ +static inline bool irq_fpu_usable(void) +{ +	return !in_interrupt() || +		interrupted_user_mode() || +		interrupted_kernel_fpu_idle(); +} +  static inline void kernel_fpu_begin(void)  { -	struct thread_info *me = current_thread_info(); +	struct task_struct *me = current; + +	WARN_ON_ONCE(!irq_fpu_usable());  	preempt_disable(); -	if (me->status & TS_USEDFPU) -		__save_init_fpu(me->task); -	else +	if (__thread_has_fpu(me)) { +		__save_init_fpu(me); +		__thread_clear_has_fpu(me); +		/* We do 'stts()' in kernel_fpu_end() */ +	} else { +		percpu_write(fpu_owner_task, NULL);  		clts(); +	}  }  static inline void kernel_fpu_end(void) @@ -323,14 +484,6 @@ static inline void kernel_fpu_end(void)  	preempt_enable();  } -static inline bool irq_fpu_usable(void) -{ -	struct pt_regs *regs; - -	return !in_interrupt() || !(regs = get_irq_regs()) || \ -		user_mode(regs) || (read_cr0() & X86_CR0_TS); -} -  /*   * Some instructions like VIA's padlock instructions generate a spurious   * DNA fault but don't modify SSE registers. And these instructions @@ -363,20 +516,64 @@ static inline void irq_ts_restore(int TS_state)  }  /* + * The question "does this thread have fpu access?" + * is slightly racy, since preemption could come in + * and revoke it immediately after the test. + * + * However, even in that very unlikely scenario, + * we can just assume we have FPU access - typically + * to save the FP state - we'll just take a #NM + * fault and get the FPU access back. + * + * The actual user_fpu_begin/end() functions + * need to be preemption-safe, though. + * + * NOTE! user_fpu_end() must be used only after you + * have saved the FP state, and user_fpu_begin() must + * be used only immediately before restoring it. + * These functions do not do any save/restore on + * their own. + */ +static inline int user_has_fpu(void) +{ +	return __thread_has_fpu(current); +} + +static inline void user_fpu_end(void) +{ +	preempt_disable(); +	__thread_fpu_end(current); +	preempt_enable(); +} + +static inline void user_fpu_begin(void) +{ +	preempt_disable(); +	if (!user_has_fpu()) +		__thread_fpu_begin(current); +	preempt_enable(); +} + +/*   * These disable preemption on their own and are safe   */  static inline void save_init_fpu(struct task_struct *tsk)  { +	WARN_ON_ONCE(!__thread_has_fpu(tsk));  	preempt_disable();  	__save_init_fpu(tsk); -	stts(); +	__thread_fpu_end(tsk);  	preempt_enable();  }  static inline void unlazy_fpu(struct task_struct *tsk)  {  	preempt_disable(); -	__unlazy_fpu(tsk); +	if (__thread_has_fpu(tsk)) { +		__save_init_fpu(tsk); +		__thread_fpu_end(tsk); +	} else +		tsk->fpu_counter = 0;  	preempt_enable();  } diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h index ab4092e3214..7b9cfc4878a 100644 --- a/arch/x86/include/asm/kvm_emulate.h +++ b/arch/x86/include/asm/kvm_emulate.h @@ -190,6 +190,9 @@ struct x86_emulate_ops {  	int (*intercept)(struct x86_emulate_ctxt *ctxt,  			 struct x86_instruction_info *info,  			 enum x86_intercept_stage stage); + +	bool (*get_cpuid)(struct x86_emulate_ctxt *ctxt, +			 u32 *eax, u32 *ebx, u32 *ecx, u32 *edx);  };  typedef u32 __attribute__((vector_size(16))) sse128_t; @@ -298,6 +301,19 @@ struct x86_emulate_ctxt {  #define X86EMUL_MODE_PROT     (X86EMUL_MODE_PROT16|X86EMUL_MODE_PROT32| \  			       X86EMUL_MODE_PROT64) +/* CPUID vendors */ +#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541 +#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163 +#define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx 0x69746e65 + +#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx 0x69444d41 +#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574 +#define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273 + +#define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547 +#define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e +#define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69 +  enum x86_intercept_stage {  	X86_ICTP_NONE = 0,   /* Allow zero-init to not match anything */  	X86_ICPT_PRE_EXCEPT, diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h index 096c975e099..461ce432b1c 100644 --- a/arch/x86/include/asm/perf_event.h +++ b/arch/x86/include/asm/perf_event.h @@ -242,4 +242,12 @@ static inline void perf_get_x86_pmu_capability(struct x86_pmu_capability *cap)  static inline void perf_events_lapic_init(void)	{ }  #endif +#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_AMD) + extern void amd_pmu_enable_virt(void); + extern void amd_pmu_disable_virt(void); +#else + static inline void amd_pmu_enable_virt(void) { } + static inline void amd_pmu_disable_virt(void) { } +#endif +  #endif /* _ASM_X86_PERF_EVENT_H */ diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index aa9088c2693..58545c97d07 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -374,6 +374,8 @@ union thread_xstate {  };  struct fpu { +	unsigned int last_cpu; +	unsigned int has_fpu;  	union thread_xstate *state;  }; diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index bc817cd8b44..cfd8144d552 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h @@ -247,8 +247,6 @@ static inline struct thread_info *current_thread_info(void)   * ever touches our thread-synchronous status, so we don't   * have to worry about atomic accesses.   */ -#define TS_USEDFPU		0x0001	/* FPU was used by this task -					   this quantum (SMP) */  #define TS_COMPAT		0x0002	/* 32bit syscall active (64BIT)*/  #define TS_POLLING		0x0004	/* idle task polling need_resched,  					   skip sending interrupt */ diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index 54a13aaebc4..21f7385badb 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h @@ -318,13 +318,13 @@ uv_gpa_in_mmr_space(unsigned long gpa)  /* UV global physical address --> socket phys RAM */  static inline unsigned long uv_gpa_to_soc_phys_ram(unsigned long gpa)  { -	unsigned long paddr = gpa & uv_hub_info->gpa_mask; +	unsigned long paddr;  	unsigned long remap_base = uv_hub_info->lowmem_remap_base;  	unsigned long remap_top =  uv_hub_info->lowmem_remap_top;  	gpa = ((gpa << uv_hub_info->m_shift) >> uv_hub_info->m_shift) |  		((gpa >> uv_hub_info->n_lshift) << uv_hub_info->m_val); -	gpa = gpa & uv_hub_info->gpa_mask; +	paddr = gpa & uv_hub_info->gpa_mask;  	if (paddr >= remap_base && paddr < remap_base + remap_top)  		paddr -= remap_base;  	return paddr; diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index d43cad74f16..c0f7d68d318 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -1044,6 +1044,9 @@ DEFINE_PER_CPU(char *, irq_stack_ptr) =  DEFINE_PER_CPU(unsigned int, irq_count) = -1; +DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); +EXPORT_PER_CPU_SYMBOL(fpu_owner_task); +  /*   * Special IST stacks which the CPU switches to when it calls   * an IST-marked descriptor entry. Up to 7 stacks (hardware @@ -1111,6 +1114,8 @@ void debug_stack_reset(void)  DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task;  EXPORT_PER_CPU_SYMBOL(current_task); +DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); +EXPORT_PER_CPU_SYMBOL(fpu_owner_task);  #ifdef CONFIG_CC_STACKPROTECTOR  DEFINE_PER_CPU_ALIGNED(struct stack_canary, stack_canary); diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index 6b45e5e7a90..73d08ed98a6 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c @@ -326,8 +326,7 @@ static void __cpuinit amd_calc_l3_indices(struct amd_northbridge *nb)  	l3->indices = (max(max3(sc0, sc1, sc2), sc3) << 10) - 1;  } -static void __cpuinit amd_init_l3_cache(struct _cpuid4_info_regs *this_leaf, -					int index) +static void __cpuinit amd_init_l3_cache(struct _cpuid4_info_regs *this_leaf, int index)  {  	int node; @@ -725,14 +724,16 @@ static DEFINE_PER_CPU(struct _cpuid4_info *, ici_cpuid4_info);  #define CPUID4_INFO_IDX(x, y)	(&((per_cpu(ici_cpuid4_info, x))[y]))  #ifdef CONFIG_SMP -static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) + +static int __cpuinit cache_shared_amd_cpu_map_setup(unsigned int cpu, int index)  { -	struct _cpuid4_info	*this_leaf, *sibling_leaf; -	unsigned long num_threads_sharing; -	int index_msb, i, sibling; +	struct _cpuid4_info *this_leaf; +	int ret, i, sibling;  	struct cpuinfo_x86 *c = &cpu_data(cpu); -	if ((index == 3) && (c->x86_vendor == X86_VENDOR_AMD)) { +	ret = 0; +	if (index == 3) { +		ret = 1;  		for_each_cpu(i, cpu_llc_shared_mask(cpu)) {  			if (!per_cpu(ici_cpuid4_info, i))  				continue; @@ -743,8 +744,35 @@ static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)  				set_bit(sibling, this_leaf->shared_cpu_map);  			}  		} -		return; +	} else if ((c->x86 == 0x15) && ((index == 1) || (index == 2))) { +		ret = 1; +		for_each_cpu(i, cpu_sibling_mask(cpu)) { +			if (!per_cpu(ici_cpuid4_info, i)) +				continue; +			this_leaf = CPUID4_INFO_IDX(i, index); +			for_each_cpu(sibling, cpu_sibling_mask(cpu)) { +				if (!cpu_online(sibling)) +					continue; +				set_bit(sibling, this_leaf->shared_cpu_map); +			} +		}  	} + +	return ret; +} + +static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) +{ +	struct _cpuid4_info *this_leaf, *sibling_leaf; +	unsigned long num_threads_sharing; +	int index_msb, i; +	struct cpuinfo_x86 *c = &cpu_data(cpu); + +	if (c->x86_vendor == X86_VENDOR_AMD) { +		if (cache_shared_amd_cpu_map_setup(cpu, index)) +			return; +	} +  	this_leaf = CPUID4_INFO_IDX(cpu, index);  	num_threads_sharing = 1 + this_leaf->base.eax.split.num_threads_sharing; diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index 786e76a8632..e4eeaaf58a4 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c @@ -528,6 +528,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)  	sprintf(name, "threshold_bank%i", bank); +#ifdef CONFIG_SMP  	if (cpu_data(cpu).cpu_core_id && shared_bank[bank]) {	/* symlink */  		i = cpumask_first(cpu_llc_shared_mask(cpu)); @@ -553,6 +554,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)  		goto out;  	} +#endif  	b = kzalloc(sizeof(struct threshold_bank), GFP_KERNEL);  	if (!b) { diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index 8944062f46e..c30c807ddc7 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h @@ -147,7 +147,9 @@ struct cpu_hw_events {  	/*  	 * AMD specific bits  	 */ -	struct amd_nb		*amd_nb; +	struct amd_nb			*amd_nb; +	/* Inverted mask of bits to clear in the perf_ctr ctrl registers */ +	u64				perf_ctr_virt_mask;  	void				*kfree_on_online;  }; @@ -417,9 +419,11 @@ void x86_pmu_disable_all(void);  static inline void __x86_pmu_enable_event(struct hw_perf_event *hwc,  					  u64 enable_mask)  { +	u64 disable_mask = __this_cpu_read(cpu_hw_events.perf_ctr_virt_mask); +  	if (hwc->extra_reg.reg)  		wrmsrl(hwc->extra_reg.reg, hwc->extra_reg.config); -	wrmsrl(hwc->config_base, hwc->config | enable_mask); +	wrmsrl(hwc->config_base, (hwc->config | enable_mask) & ~disable_mask);  }  void x86_pmu_enable_all(int added); diff --git a/arch/x86/kernel/cpu/perf_event_amd.c b/arch/x86/kernel/cpu/perf_event_amd.c index 0397b23be8e..67250a52430 100644 --- a/arch/x86/kernel/cpu/perf_event_amd.c +++ b/arch/x86/kernel/cpu/perf_event_amd.c @@ -1,4 +1,5 @@  #include <linux/perf_event.h> +#include <linux/export.h>  #include <linux/types.h>  #include <linux/init.h>  #include <linux/slab.h> @@ -357,7 +358,9 @@ static void amd_pmu_cpu_starting(int cpu)  	struct amd_nb *nb;  	int i, nb_id; -	if (boot_cpu_data.x86_max_cores < 2) +	cpuc->perf_ctr_virt_mask = AMD_PERFMON_EVENTSEL_HOSTONLY; + +	if (boot_cpu_data.x86_max_cores < 2 || boot_cpu_data.x86 == 0x15)  		return;  	nb_id = amd_get_nb_id(cpu); @@ -587,9 +590,9 @@ static __initconst const struct x86_pmu amd_pmu_f15h = {  	.put_event_constraints	= amd_put_event_constraints,  	.cpu_prepare		= amd_pmu_cpu_prepare, -	.cpu_starting		= amd_pmu_cpu_starting,  	.cpu_dead		= amd_pmu_cpu_dead,  #endif +	.cpu_starting		= amd_pmu_cpu_starting,  };  __init int amd_pmu_init(void) @@ -621,3 +624,33 @@ __init int amd_pmu_init(void)  	return 0;  } + +void amd_pmu_enable_virt(void) +{ +	struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); + +	cpuc->perf_ctr_virt_mask = 0; + +	/* Reload all events */ +	x86_pmu_disable_all(); +	x86_pmu_enable_all(0); +} +EXPORT_SYMBOL_GPL(amd_pmu_enable_virt); + +void amd_pmu_disable_virt(void) +{ +	struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); + +	/* +	 * We only mask out the Host-only bit so that host-only counting works +	 * when SVM is disabled. If someone sets up a guest-only counter when +	 * SVM is disabled the Guest-only bits still gets set and the counter +	 * will not count anything. +	 */ +	cpuc->perf_ctr_virt_mask = AMD_PERFMON_EVENTSEL_HOSTONLY; + +	/* Reload all events */ +	x86_pmu_disable_all(); +	x86_pmu_enable_all(0); +} +EXPORT_SYMBOL_GPL(amd_pmu_disable_virt); diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c index 73da6b64f5b..d6bd49faa40 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c @@ -439,7 +439,6 @@ void intel_pmu_pebs_enable(struct perf_event *event)  	hwc->config &= ~ARCH_PERFMON_EVENTSEL_INT;  	cpuc->pebs_enabled |= 1ULL << hwc->idx; -	WARN_ON_ONCE(cpuc->enabled);  	if (x86_pmu.intel_cap.pebs_trap && event->attr.precise_ip > 1)  		intel_pmu_lbr_enable(event); diff --git a/arch/x86/kernel/cpu/perf_event_intel_lbr.c b/arch/x86/kernel/cpu/perf_event_intel_lbr.c index 3fab3de3ce9..47a7e63bfe5 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_lbr.c +++ b/arch/x86/kernel/cpu/perf_event_intel_lbr.c @@ -72,8 +72,6 @@ void intel_pmu_lbr_enable(struct perf_event *event)  	if (!x86_pmu.lbr_nr)  		return; -	WARN_ON_ONCE(cpuc->enabled); -  	/*  	 * Reset the LBR stack if we changed task context to  	 * avoid data leaks. diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c index 1aae78f775f..4025fe4f928 100644 --- a/arch/x86/kernel/dumpstack.c +++ b/arch/x86/kernel/dumpstack.c @@ -252,7 +252,8 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)  	unsigned short ss;  	unsigned long sp;  #endif -	printk(KERN_EMERG "%s: %04lx [#%d] ", str, err & 0xffff, ++die_counter); +	printk(KERN_DEFAULT +	       "%s: %04lx [#%d] ", str, err & 0xffff, ++die_counter);  #ifdef CONFIG_PREEMPT  	printk("PREEMPT ");  #endif diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c index 6d728d9284b..17107bd6e1f 100644 --- a/arch/x86/kernel/dumpstack_64.c +++ b/arch/x86/kernel/dumpstack_64.c @@ -129,7 +129,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,  	if (!stack) {  		if (regs)  			stack = (unsigned long *)regs->sp; -		else if (task && task != current) +		else if (task != current)  			stack = (unsigned long *)task->thread.sp;  		else  			stack = &dummy; @@ -269,11 +269,11 @@ void show_registers(struct pt_regs *regs)  		unsigned char c;  		u8 *ip; -		printk(KERN_EMERG "Stack:\n"); +		printk(KERN_DEFAULT "Stack:\n");  		show_stack_log_lvl(NULL, regs, (unsigned long *)sp, -				   0, KERN_EMERG); +				   0, KERN_DEFAULT); -		printk(KERN_EMERG "Code: "); +		printk(KERN_DEFAULT "Code: ");  		ip = (u8 *)regs->ip - code_prologue;  		if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) { diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 3fe8239fd8f..1333d985177 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -1532,10 +1532,17 @@ ENTRY(nmi)  	pushq_cfi %rdx  	/* +	 * If %cs was not the kernel segment, then the NMI triggered in user +	 * space, which means it is definitely not nested. +	 */ +	cmpl $__KERNEL_CS, 16(%rsp) +	jne first_nmi + +	/*  	 * Check the special variable on the stack to see if NMIs are  	 * executing.  	 */ -	cmp $1, -8(%rsp) +	cmpl $1, -8(%rsp)  	je nested_nmi  	/* diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index fe86493f3ed..73465aab28f 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c @@ -311,13 +311,33 @@ out:  	return state;  } +/* + * AMD microcode firmware naming convention, up to family 15h they are in + * the legacy file: + * + *    amd-ucode/microcode_amd.bin + * + * This legacy file is always smaller than 2K in size. + * + * Starting at family 15h they are in family specific firmware files: + * + *    amd-ucode/microcode_amd_fam15h.bin + *    amd-ucode/microcode_amd_fam16h.bin + *    ... + * + * These might be larger than 2K. + */  static enum ucode_state request_microcode_amd(int cpu, struct device *device)  { -	const char *fw_name = "amd-ucode/microcode_amd.bin"; +	char fw_name[36] = "amd-ucode/microcode_amd.bin";  	const struct firmware *fw;  	enum ucode_state ret = UCODE_NFOUND; +	struct cpuinfo_x86 *c = &cpu_data(cpu); + +	if (c->x86 >= 0x15) +		snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86); -	if (request_firmware(&fw, fw_name, device)) { +	if (request_firmware(&fw, (const char *)fw_name, device)) {  		pr_err("failed to load file %s\n", fw_name);  		goto out;  	} @@ -340,7 +360,6 @@ out:  static enum ucode_state  request_microcode_user(int cpu, const void __user *buf, size_t size)  { -	pr_info("AMD microcode update via /dev/cpu/microcode not supported\n");  	return UCODE_ERROR;  } diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 485204f58cd..c08d1ff12b7 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c @@ -214,6 +214,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  	task_user_gs(p) = get_user_gs(regs); +	p->fpu_counter = 0;  	p->thread.io_bitmap_ptr = NULL;  	tsk = current;  	err = -ENOMEM; @@ -299,22 +300,11 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  				 *next = &next_p->thread;  	int cpu = smp_processor_id();  	struct tss_struct *tss = &per_cpu(init_tss, cpu); -	bool preload_fpu; +	fpu_switch_t fpu;  	/* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ -	/* -	 * If the task has used fpu the last 5 timeslices, just do a full -	 * restore of the math state immediately to avoid the trap; the -	 * chances of needing FPU soon are obviously high now -	 */ -	preload_fpu = tsk_used_math(next_p) && next_p->fpu_counter > 5; - -	__unlazy_fpu(prev_p); - -	/* we're going to use this soon, after a few expensive things */ -	if (preload_fpu) -		prefetch(next->fpu.state); +	fpu = switch_fpu_prepare(prev_p, next_p, cpu);  	/*  	 * Reload esp0. @@ -354,11 +344,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  		     task_thread_info(next_p)->flags & _TIF_WORK_CTXSW_NEXT))  		__switch_to_xtra(prev_p, next_p, tss); -	/* If we're going to preload the fpu context, make sure clts -	   is run while we're batching the cpu state updates. */ -	if (preload_fpu) -		clts(); -  	/*  	 * Leave lazy mode, flushing any hypercalls made here.  	 * This must be done before restoring TLS segments so @@ -368,15 +353,14 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  	 */  	arch_end_context_switch(next_p); -	if (preload_fpu) -		__math_state_restore(); -  	/*  	 * Restore %gs if needed (which is common)  	 */  	if (prev->gs | next->gs)  		lazy_load_gs(next->gs); +	switch_fpu_finish(next_p, fpu); +  	percpu_write(current_task, next_p);  	return prev_p; diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 9b9fe4a85c8..cfa5c90c01d 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -286,6 +286,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  	set_tsk_thread_flag(p, TIF_FORK); +	p->fpu_counter = 0;  	p->thread.io_bitmap_ptr = NULL;  	savesegment(gs, p->thread.gsindex); @@ -386,18 +387,9 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  	int cpu = smp_processor_id();  	struct tss_struct *tss = &per_cpu(init_tss, cpu);  	unsigned fsindex, gsindex; -	bool preload_fpu; +	fpu_switch_t fpu; -	/* -	 * If the task has used fpu the last 5 timeslices, just do a full -	 * restore of the math state immediately to avoid the trap; the -	 * chances of needing FPU soon are obviously high now -	 */ -	preload_fpu = tsk_used_math(next_p) && next_p->fpu_counter > 5; - -	/* we're going to use this soon, after a few expensive things */ -	if (preload_fpu) -		prefetch(next->fpu.state); +	fpu = switch_fpu_prepare(prev_p, next_p, cpu);  	/*  	 * Reload esp0, LDT and the page table pointer: @@ -427,13 +419,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  	load_TLS(next, cpu); -	/* Must be after DS reload */ -	__unlazy_fpu(prev_p); - -	/* Make sure cpu is ready for new context */ -	if (preload_fpu) -		clts(); -  	/*  	 * Leave lazy mode, flushing any hypercalls made here.  	 * This must be done before restoring TLS segments so @@ -474,6 +459,8 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  		wrmsrl(MSR_KERNEL_GS_BASE, next->gs);  	prev->gsindex = gsindex; +	switch_fpu_finish(next_p, fpu); +  	/*  	 * Switch the PDA and FPU contexts.  	 */ @@ -492,13 +479,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)  		     task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV))  		__switch_to_xtra(prev_p, next_p, tss); -	/* -	 * Preload the FPU context, now that we've determined that the -	 * task is likely to be using it.  -	 */ -	if (preload_fpu) -		__math_state_restore(); -  	return prev_p;  } diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 37a458b521a..d840e69a853 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -39,6 +39,14 @@ static int reboot_mode;  enum reboot_type reboot_type = BOOT_ACPI;  int reboot_force; +/* This variable is used privately to keep track of whether or not + * reboot_type is still set to its default value (i.e., reboot= hasn't + * been set on the command line).  This is needed so that we can + * suppress DMI scanning for reboot quirks.  Without it, it's + * impossible to override a faulty reboot quirk without recompiling. + */ +static int reboot_default = 1; +  #if defined(CONFIG_X86_32) && defined(CONFIG_SMP)  static int reboot_cpu = -1;  #endif @@ -67,6 +75,12 @@ bool port_cf9_safe = false;  static int __init reboot_setup(char *str)  {  	for (;;) { +		/* Having anything passed on the command line via +		 * reboot= will cause us to disable DMI checking +		 * below. +		 */ +		reboot_default = 0; +  		switch (*str) {  		case 'w':  			reboot_mode = 0x1234; @@ -295,14 +309,6 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {  			DMI_MATCH(DMI_BOARD_NAME, "P4S800"),  		},  	}, -	{	/* Handle problems with rebooting on VersaLogic Menlow boards */ -		.callback = set_bios_reboot, -		.ident = "VersaLogic Menlow based board", -		.matches = { -			DMI_MATCH(DMI_BOARD_VENDOR, "VersaLogic Corporation"), -			DMI_MATCH(DMI_BOARD_NAME, "VersaLogic Menlow board"), -		}, -	},  	{ /* Handle reboot issue on Acer Aspire one */  		.callback = set_kbd_reboot,  		.ident = "Acer Aspire One A110", @@ -316,7 +322,12 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {  static int __init reboot_init(void)  { -	dmi_check_system(reboot_dmi_table); +	/* Only do the DMI check if reboot_type hasn't been overridden +	 * on the command line +	 */ +	if (reboot_default) { +		dmi_check_system(reboot_dmi_table); +	}  	return 0;  }  core_initcall(reboot_init); @@ -465,7 +476,12 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {  static int __init pci_reboot_init(void)  { -	dmi_check_system(pci_reboot_dmi_table); +	/* Only do the DMI check if reboot_type hasn't been overridden +	 * on the command line +	 */ +	if (reboot_default) { +		dmi_check_system(pci_reboot_dmi_table); +	}  	return 0;  }  core_initcall(pci_reboot_init); diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 482ec3af206..4bbe04d9674 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -571,41 +571,18 @@ asmlinkage void __attribute__((weak)) smp_threshold_interrupt(void)  }  /* - * __math_state_restore assumes that cr0.TS is already clear and the - * fpu state is all ready for use.  Used during context switch. - */ -void __math_state_restore(void) -{ -	struct thread_info *thread = current_thread_info(); -	struct task_struct *tsk = thread->task; - -	/* -	 * Paranoid restore. send a SIGSEGV if we fail to restore the state. -	 */ -	if (unlikely(restore_fpu_checking(tsk))) { -		stts(); -		force_sig(SIGSEGV, tsk); -		return; -	} - -	thread->status |= TS_USEDFPU;	/* So we fnsave on switch_to() */ -	tsk->fpu_counter++; -} - -/*   * 'math_state_restore()' saves the current math information in the   * old math state array, and gets the new ones from the current task   *   * Careful.. There are problems with IBM-designed IRQ13 behaviour.   * Don't touch unless you *really* know how it works.   * - * Must be called with kernel preemption disabled (in this case, - * local interrupts are disabled at the call-site in entry.S). + * Must be called with kernel preemption disabled (eg with local + * local interrupts as in the case of do_device_not_available).   */ -asmlinkage void math_state_restore(void) +void math_state_restore(void)  { -	struct thread_info *thread = current_thread_info(); -	struct task_struct *tsk = thread->task; +	struct task_struct *tsk = current;  	if (!tsk_used_math(tsk)) {  		local_irq_enable(); @@ -622,9 +599,17 @@ asmlinkage void math_state_restore(void)  		local_irq_disable();  	} -	clts();				/* Allow maths ops (or we recurse) */ +	__thread_fpu_begin(tsk); +	/* +	 * Paranoid restore. send a SIGSEGV if we fail to restore the state. +	 */ +	if (unlikely(restore_fpu_checking(tsk))) { +		__thread_fpu_end(tsk); +		force_sig(SIGSEGV, tsk); +		return; +	} -	__math_state_restore(); +	tsk->fpu_counter++;  }  EXPORT_SYMBOL_GPL(math_state_restore); diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c index a3911343976..71109111411 100644 --- a/arch/x86/kernel/xsave.c +++ b/arch/x86/kernel/xsave.c @@ -47,7 +47,7 @@ void __sanitize_i387_state(struct task_struct *tsk)  	if (!fx)  		return; -	BUG_ON(task_thread_info(tsk)->status & TS_USEDFPU); +	BUG_ON(__thread_has_fpu(tsk));  	xstate_bv = tsk->thread.fpu.state->xsave.xsave_hdr.xstate_bv; @@ -168,7 +168,7 @@ int save_i387_xstate(void __user *buf)  	if (!used_math())  		return 0; -	if (task_thread_info(tsk)->status & TS_USEDFPU) { +	if (user_has_fpu()) {  		if (use_xsave())  			err = xsave_user(buf);  		else @@ -176,8 +176,7 @@ int save_i387_xstate(void __user *buf)  		if (err)  			return err; -		task_thread_info(tsk)->status &= ~TS_USEDFPU; -		stts(); +		user_fpu_end();  	} else {  		sanitize_i387_state(tsk);  		if (__copy_to_user(buf, &tsk->thread.fpu.state->fxsave, @@ -292,10 +291,7 @@ int restore_i387_xstate(void __user *buf)  			return err;  	} -	if (!(task_thread_info(current)->status & TS_USEDFPU)) { -		clts(); -		task_thread_info(current)->status |= TS_USEDFPU; -	} +	user_fpu_begin();  	if (use_xsave())  		err = restore_user_xstate(buf);  	else diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 05a562b8502..0982507b962 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -1891,6 +1891,51 @@ setup_syscalls_segments(struct x86_emulate_ctxt *ctxt,  	ss->p = 1;  } +static bool em_syscall_is_enabled(struct x86_emulate_ctxt *ctxt) +{ +	struct x86_emulate_ops *ops = ctxt->ops; +	u32 eax, ebx, ecx, edx; + +	/* +	 * syscall should always be enabled in longmode - so only become +	 * vendor specific (cpuid) if other modes are active... +	 */ +	if (ctxt->mode == X86EMUL_MODE_PROT64) +		return true; + +	eax = 0x00000000; +	ecx = 0x00000000; +	if (ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx)) { +		/* +		 * Intel ("GenuineIntel") +		 * remark: Intel CPUs only support "syscall" in 64bit +		 * longmode. Also an 64bit guest with a +		 * 32bit compat-app running will #UD !! While this +		 * behaviour can be fixed (by emulating) into AMD +		 * response - CPUs of AMD can't behave like Intel. +		 */ +		if (ebx == X86EMUL_CPUID_VENDOR_GenuineIntel_ebx && +		    ecx == X86EMUL_CPUID_VENDOR_GenuineIntel_ecx && +		    edx == X86EMUL_CPUID_VENDOR_GenuineIntel_edx) +			return false; + +		/* AMD ("AuthenticAMD") */ +		if (ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx && +		    ecx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx && +		    edx == X86EMUL_CPUID_VENDOR_AuthenticAMD_edx) +			return true; + +		/* AMD ("AMDisbetter!") */ +		if (ebx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx && +		    ecx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx && +		    edx == X86EMUL_CPUID_VENDOR_AMDisbetterI_edx) +			return true; +	} + +	/* default: (not Intel, not AMD), apply Intel's stricter rules... */ +	return false; +} +  static int em_syscall(struct x86_emulate_ctxt *ctxt)  {  	struct x86_emulate_ops *ops = ctxt->ops; @@ -1904,9 +1949,15 @@ static int em_syscall(struct x86_emulate_ctxt *ctxt)  	    ctxt->mode == X86EMUL_MODE_VM86)  		return emulate_ud(ctxt); +	if (!(em_syscall_is_enabled(ctxt))) +		return emulate_ud(ctxt); +  	ops->get_msr(ctxt, MSR_EFER, &efer);  	setup_syscalls_segments(ctxt, &cs, &ss); +	if (!(efer & EFER_SCE)) +		return emulate_ud(ctxt); +  	ops->get_msr(ctxt, MSR_STAR, &msr_data);  	msr_data >>= 32;  	cs_sel = (u16)(msr_data & 0xfffc); diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 5fa553babe5..e385214711c 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -29,6 +29,7 @@  #include <linux/ftrace_event.h>  #include <linux/slab.h> +#include <asm/perf_event.h>  #include <asm/tlbflush.h>  #include <asm/desc.h>  #include <asm/kvm_para.h> @@ -575,6 +576,8 @@ static void svm_hardware_disable(void *garbage)  		wrmsrl(MSR_AMD64_TSC_RATIO, TSC_RATIO_DEFAULT);  	cpu_svm_disable(); + +	amd_pmu_disable_virt();  }  static int svm_hardware_enable(void *garbage) @@ -622,6 +625,8 @@ static int svm_hardware_enable(void *garbage)  	svm_init_erratum_383(); +	amd_pmu_enable_virt(); +  	return 0;  } diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index d29216c462b..3b4c8d8ad90 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -1457,7 +1457,7 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx)  #ifdef CONFIG_X86_64  	wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base);  #endif -	if (current_thread_info()->status & TS_USEDFPU) +	if (__thread_has_fpu(current))  		clts();  	load_gdt(&__get_cpu_var(host_gdt));  } diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 14d6cadc4ba..9cbfc069811 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -1495,6 +1495,8 @@ static void record_steal_time(struct kvm_vcpu *vcpu)  int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)  { +	bool pr = false; +  	switch (msr) {  	case MSR_EFER:  		return set_efer(vcpu, data); @@ -1635,6 +1637,18 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)  		pr_unimpl(vcpu, "unimplemented perfctr wrmsr: "  			"0x%x data 0x%llx\n", msr, data);  		break; +	case MSR_P6_PERFCTR0: +	case MSR_P6_PERFCTR1: +		pr = true; +	case MSR_P6_EVNTSEL0: +	case MSR_P6_EVNTSEL1: +		if (kvm_pmu_msr(vcpu, msr)) +			return kvm_pmu_set_msr(vcpu, msr, data); + +		if (pr || data != 0) +			pr_unimpl(vcpu, "disabled perfctr wrmsr: " +				"0x%x data 0x%llx\n", msr, data); +		break;  	case MSR_K7_CLK_CTL:  		/*  		 * Ignore all writes to this no longer documented MSR. @@ -1835,6 +1849,14 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata)  	case MSR_FAM10H_MMIO_CONF_BASE:  		data = 0;  		break; +	case MSR_P6_PERFCTR0: +	case MSR_P6_PERFCTR1: +	case MSR_P6_EVNTSEL0: +	case MSR_P6_EVNTSEL1: +		if (kvm_pmu_msr(vcpu, msr)) +			return kvm_pmu_get_msr(vcpu, msr, pdata); +		data = 0; +		break;  	case MSR_IA32_UCODE_REV:  		data = 0x100000000ULL;  		break; @@ -4180,6 +4202,28 @@ static int emulator_intercept(struct x86_emulate_ctxt *ctxt,  	return kvm_x86_ops->check_intercept(emul_to_vcpu(ctxt), info, stage);  } +static bool emulator_get_cpuid(struct x86_emulate_ctxt *ctxt, +			       u32 *eax, u32 *ebx, u32 *ecx, u32 *edx) +{ +	struct kvm_cpuid_entry2 *cpuid = NULL; + +	if (eax && ecx) +		cpuid = kvm_find_cpuid_entry(emul_to_vcpu(ctxt), +					    *eax, *ecx); + +	if (cpuid) { +		*eax = cpuid->eax; +		*ecx = cpuid->ecx; +		if (ebx) +			*ebx = cpuid->ebx; +		if (edx) +			*edx = cpuid->edx; +		return true; +	} + +	return false; +} +  static struct x86_emulate_ops emulate_ops = {  	.read_std            = kvm_read_guest_virt_system,  	.write_std           = kvm_write_guest_virt_system, @@ -4211,6 +4255,7 @@ static struct x86_emulate_ops emulate_ops = {  	.get_fpu             = emulator_get_fpu,  	.put_fpu             = emulator_put_fpu,  	.intercept           = emulator_intercept, +	.get_cpuid           = emulator_get_cpuid,  };  static void cache_all_regs(struct kvm_vcpu *vcpu) diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 9d74824a708..f0b4caf85c1 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -673,7 +673,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,  	stackend = end_of_stack(tsk);  	if (tsk != &init_task && *stackend != STACK_END_MAGIC) -		printk(KERN_ALERT "Thread overran stack, or stack corrupted\n"); +		printk(KERN_EMERG "Thread overran stack, or stack corrupted\n");  	tsk->thread.cr2		= address;  	tsk->thread.trap_no	= 14; @@ -684,7 +684,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,  		sig = 0;  	/* Executive summary in case the body of the oops scrolled away */ -	printk(KERN_EMERG "CR2: %016lx\n", address); +	printk(KERN_DEFAULT "CR2: %016lx\n", address);  	oops_end(flags, regs, sig);  } diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index f581a18c0d4..8ecbb4bba4b 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c @@ -333,13 +333,15 @@ try_again:  		 * Lookup failure means no vma is above this address,  		 * i.e. return with success:  		 */ -		if (!(vma = find_vma_prev(mm, addr, &prev_vma))) +		vma = find_vma(mm, addr); +		if (!vma)  			return addr;  		/*  		 * new region fits between prev_vma->vm_end and  		 * vma->vm_start, use it:  		 */ +		prev_vma = vma->vm_prev;  		if (addr + len <= vma->vm_start &&  		            (!prev_vma || (addr >= prev_vma->vm_end))) {  			/* remember the address as a hint for next time */ diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 7b65f752c5f..7c1b765ecc5 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -151,17 +151,18 @@ void bpf_jit_compile(struct sk_filter *fp)  	cleanup_addr = proglen; /* epilogue address */  	for (pass = 0; pass < 10; pass++) { +		u8 seen_or_pass0 = (pass == 0) ? (SEEN_XREG | SEEN_DATAREF | SEEN_MEM) : seen;  		/* no prologue/epilogue for trivial filters (RET something) */  		proglen = 0;  		prog = temp; -		if (seen) { +		if (seen_or_pass0) {  			EMIT4(0x55, 0x48, 0x89, 0xe5); /* push %rbp; mov %rsp,%rbp */  			EMIT4(0x48, 0x83, 0xec, 96);	/* subq  $96,%rsp	*/  			/* note : must save %rbx in case bpf_error is hit */ -			if (seen & (SEEN_XREG | SEEN_DATAREF)) +			if (seen_or_pass0 & (SEEN_XREG | SEEN_DATAREF))  				EMIT4(0x48, 0x89, 0x5d, 0xf8); /* mov %rbx, -8(%rbp) */ -			if (seen & SEEN_XREG) +			if (seen_or_pass0 & SEEN_XREG)  				CLEAR_X(); /* make sure we dont leek kernel memory */  			/* @@ -170,7 +171,7 @@ void bpf_jit_compile(struct sk_filter *fp)  			 *  r9 = skb->len - skb->data_len  			 *  r8 = skb->data  			 */ -			if (seen & SEEN_DATAREF) { +			if (seen_or_pass0 & SEEN_DATAREF) {  				if (offsetof(struct sk_buff, len) <= 127)  					/* mov    off8(%rdi),%r9d */  					EMIT4(0x44, 0x8b, 0x4f, offsetof(struct sk_buff, len)); @@ -260,9 +261,14 @@ void bpf_jit_compile(struct sk_filter *fp)  			case BPF_S_ALU_DIV_X: /* A /= X; */  				seen |= SEEN_XREG;  				EMIT2(0x85, 0xdb);	/* test %ebx,%ebx */ -				if (pc_ret0 != -1) -					EMIT_COND_JMP(X86_JE, addrs[pc_ret0] - (addrs[i] - 4)); -				else { +				if (pc_ret0 > 0) { +					/* addrs[pc_ret0 - 1] is start address of target +					 * (addrs[i] - 4) is the address following this jmp +					 * ("xor %edx,%edx; div %ebx" being 4 bytes long) +					 */ +					EMIT_COND_JMP(X86_JE, addrs[pc_ret0 - 1] - +								(addrs[i] - 4)); +				} else {  					EMIT_COND_JMP(X86_JNE, 2 + 5);  					CLEAR_A();  					EMIT1_off32(0xe9, cleanup_addr - (addrs[i] - 4)); /* jmp .+off32 */ @@ -335,12 +341,12 @@ void bpf_jit_compile(struct sk_filter *fp)  				}  				/* fallinto */  			case BPF_S_RET_A: -				if (seen) { +				if (seen_or_pass0) {  					if (i != flen - 1) {  						EMIT_JMP(cleanup_addr - addrs[i]);  						break;  					} -					if (seen & SEEN_XREG) +					if (seen_or_pass0 & SEEN_XREG)  						EMIT4(0x48, 0x8b, 0x5d, 0xf8);  /* mov  -8(%rbp),%rbx */  					EMIT1(0xc9);		/* leaveq */  				} @@ -483,8 +489,9 @@ common_load:			seen |= SEEN_DATAREF;  				goto common_load;  			case BPF_S_LDX_B_MSH:  				if ((int)K < 0) { -					if (pc_ret0 != -1) { -						EMIT_JMP(addrs[pc_ret0] - addrs[i]); +					if (pc_ret0 > 0) { +						/* addrs[pc_ret0 - 1] is the start address */ +						EMIT_JMP(addrs[pc_ret0 - 1] - addrs[i]);  						break;  					}  					CLEAR_A(); @@ -599,13 +606,14 @@ cond_branch:			f_offset = addrs[i + filter[i].jf] - addrs[i];  		 * use it to give the cleanup instruction(s) addr  		 */  		cleanup_addr = proglen - 1; /* ret */ -		if (seen) +		if (seen_or_pass0)  			cleanup_addr -= 1; /* leaveq */ -		if (seen & SEEN_XREG) +		if (seen_or_pass0 & SEEN_XREG)  			cleanup_addr -= 4; /* mov  -8(%rbp),%rbx */  		if (image) { -			WARN_ON(proglen != oldproglen); +			if (proglen != oldproglen) +				pr_err("bpb_jit_compile proglen=%u != oldproglen=%u\n", proglen, oldproglen);  			break;  		}  		if (proglen == oldproglen) { diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index a312e76063a..49a5cb55429 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -60,6 +60,16 @@ static const struct dmi_system_id pci_use_crs_table[] __initconst = {  			DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),  		},  	}, +	/* https://bugzilla.kernel.org/show_bug.cgi?id=42619 */ +	{ +		.callback = set_use_crs, +		.ident = "MSI MS-7253", +		.matches = { +			DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), +			DMI_MATCH(DMI_BOARD_NAME, "MS-7253"), +			DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), +		}, +	},  	/* Now for the blacklist.. */ @@ -282,9 +292,6 @@ static void add_resources(struct pci_root_info *info)  	int i;  	struct resource *res, *root, *conflict; -	if (!pci_use_crs) -		return; -  	coalesce_windows(info, IORESOURCE_MEM);  	coalesce_windows(info, IORESOURCE_IO); @@ -336,8 +343,13 @@ get_current_resources(struct acpi_device *device, int busnum,  	acpi_walk_resources(device->handle, METHOD_NAME__CRS, setup_resource,  				&info); -	add_resources(&info); -	return; +	if (pci_use_crs) { +		add_resources(&info); + +		return; +	} + +	kfree(info.name);  name_alloc_fail:  	kfree(info.res); diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index 492ade8c978..d99346ea8fd 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c @@ -374,7 +374,7 @@ int __init pci_xen_init(void)  int __init pci_xen_hvm_init(void)  { -	if (!xen_feature(XENFEAT_hvm_pirqs)) +	if (!xen_have_vector_callback || !xen_feature(XENFEAT_hvm_pirqs))  		return 0;  #ifdef CONFIG_ACPI diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c index 9be4cff00a2..3ae0e61abd2 100644 --- a/arch/x86/platform/uv/tlb_uv.c +++ b/arch/x86/platform/uv/tlb_uv.c @@ -1851,6 +1851,8 @@ static void __init init_per_cpu_tunables(void)  		bcp->cong_reps			= congested_reps;  		bcp->cong_period		= congested_period;  		bcp->clocks_per_100_usec =	usec_2_cycles(100); +		spin_lock_init(&bcp->queue_lock); +		spin_lock_init(&bcp->uvhub_lock);  	}  } diff --git a/arch/x86/platform/uv/uv_irq.c b/arch/x86/platform/uv/uv_irq.c index 374a05d8ad2..f25c2765a5c 100644 --- a/arch/x86/platform/uv/uv_irq.c +++ b/arch/x86/platform/uv/uv_irq.c @@ -25,7 +25,7 @@ struct uv_irq_2_mmr_pnode{  	int			irq;  }; -static spinlock_t		uv_irq_lock; +static DEFINE_SPINLOCK(uv_irq_lock);  static struct rb_root		uv_irq_root;  static int uv_set_irq_affinity(struct irq_data *, const struct cpumask *, bool); diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 12eb07bfb26..4172af8ceeb 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c @@ -1141,7 +1141,9 @@ asmlinkage void __init xen_start_kernel(void)  	/* Prevent unwanted bits from being set in PTEs. */  	__supported_pte_mask &= ~_PAGE_GLOBAL; +#if 0  	if (!xen_initial_domain()) +#endif  		__supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD);  	__supported_pte_mask |= _PAGE_IOMAP; @@ -1204,10 +1206,6 @@ asmlinkage void __init xen_start_kernel(void)  	pgd = (pgd_t *)xen_start_info->pt_base; -	if (!xen_initial_domain()) -		__supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); - -	__supported_pte_mask |= _PAGE_IOMAP;  	/* Don't do the full vcpu_info placement stuff until we have a  	   possible map and a non-dummy shared_info. */  	per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 58a0e46c404..95c1cf60c66 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c @@ -415,13 +415,13 @@ static pteval_t iomap_pte(pteval_t val)  static pteval_t xen_pte_val(pte_t pte)  {  	pteval_t pteval = pte.pte; - +#if 0  	/* If this is a WC pte, convert back from Xen WC to Linux WC */  	if ((pteval & (_PAGE_PAT | _PAGE_PCD | _PAGE_PWT)) == _PAGE_PAT) {  		WARN_ON(!pat_enabled);  		pteval = (pteval & ~_PAGE_PAT) | _PAGE_PWT;  	} - +#endif  	if (xen_initial_domain() && (pteval & _PAGE_IOMAP))  		return pteval; @@ -463,7 +463,7 @@ void xen_set_pat(u64 pat)  static pte_t xen_make_pte(pteval_t pte)  {  	phys_addr_t addr = (pte & PTE_PFN_MASK); - +#if 0  	/* If Linux is trying to set a WC pte, then map to the Xen WC.  	 * If _PAGE_PAT is set, then it probably means it is really  	 * _PAGE_PSE, so avoid fiddling with the PAT mapping and hope @@ -476,7 +476,7 @@ static pte_t xen_make_pte(pteval_t pte)  		if ((pte & (_PAGE_PCD | _PAGE_PWT)) == _PAGE_PWT)  			pte = (pte & ~(_PAGE_PCD | _PAGE_PWT)) | _PAGE_PAT;  	} - +#endif  	/*  	 * Unprivileged domains are allowed to do IOMAPpings for  	 * PCI passthrough, but not map ISA space.  The ISA diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 041d4fe9dfe..501d4e0244b 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c @@ -409,6 +409,13 @@ static void __cpuinit xen_play_dead(void) /* used only with HOTPLUG_CPU */  	play_dead_common();  	HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);  	cpu_bringup(); +	/* +	 * Balance out the preempt calls - as we are running in cpu_idle +	 * loop which has been called at bootup from cpu_bringup_and_idle. +	 * The cpucpu_bringup_and_idle called cpu_bringup which made a +	 * preempt_disable() So this preempt_enable will balance it out. +	 */ +	preempt_enable();  }  #else /* !CONFIG_HOTPLUG_CPU */ diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c index cc9b1e182fc..d69cc6c3f80 100644 --- a/arch/x86/xen/spinlock.c +++ b/arch/x86/xen/spinlock.c @@ -116,9 +116,26 @@ static inline void spin_time_accum_blocked(u64 start)  }  #endif  /* CONFIG_XEN_DEBUG_FS */ +/* + * Size struct xen_spinlock so it's the same as arch_spinlock_t. + */ +#if NR_CPUS < 256 +typedef u8 xen_spinners_t; +# define inc_spinners(xl) \ +	asm(LOCK_PREFIX " incb %0" : "+m" ((xl)->spinners) : : "memory"); +# define dec_spinners(xl) \ +	asm(LOCK_PREFIX " decb %0" : "+m" ((xl)->spinners) : : "memory"); +#else +typedef u16 xen_spinners_t; +# define inc_spinners(xl) \ +	asm(LOCK_PREFIX " incw %0" : "+m" ((xl)->spinners) : : "memory"); +# define dec_spinners(xl) \ +	asm(LOCK_PREFIX " decw %0" : "+m" ((xl)->spinners) : : "memory"); +#endif +  struct xen_spinlock {  	unsigned char lock;		/* 0 -> free; 1 -> locked */ -	unsigned short spinners;	/* count of waiting cpus */ +	xen_spinners_t spinners;	/* count of waiting cpus */  };  static int xen_spin_is_locked(struct arch_spinlock *lock) @@ -164,8 +181,7 @@ static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl)  	wmb();			/* set lock of interest before count */ -	asm(LOCK_PREFIX " incw %0" -	    : "+m" (xl->spinners) : : "memory"); +	inc_spinners(xl);  	return prev;  } @@ -176,8 +192,7 @@ static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl)   */  static inline void unspinning_lock(struct xen_spinlock *xl, struct xen_spinlock *prev)  { -	asm(LOCK_PREFIX " decw %0" -	    : "+m" (xl->spinners) : : "memory"); +	dec_spinners(xl);  	wmb();			/* decrement count before restoring lock */  	__this_cpu_write(lock_spinners, prev);  } @@ -373,6 +388,8 @@ void xen_uninit_lock_cpu(int cpu)  void __init xen_init_spinlocks(void)  { +	BUILD_BUG_ON(sizeof(struct xen_spinlock) > sizeof(arch_spinlock_t)); +  	pv_lock_ops.spin_is_locked = xen_spin_is_locked;  	pv_lock_ops.spin_is_contended = xen_spin_is_contended;  	pv_lock_ops.spin_lock = xen_spin_lock; diff --git a/arch/xtensa/include/asm/string.h b/arch/xtensa/include/asm/string.h index 5fb8c27cbef..405a8c49ff2 100644 --- a/arch/xtensa/include/asm/string.h +++ b/arch/xtensa/include/asm/string.h @@ -118,7 +118,4 @@ extern void *memmove(void *__dest, __const__ void *__src, size_t __n);  /* Don't build bcopy at all ...  */  #define __HAVE_ARCH_BCOPY -#define __HAVE_ARCH_MEMSCAN -#define memscan memchr -  #endif	/* _XTENSA_STRING_H */  |