aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/Kconfig5
-rw-r--r--arch/arm/boot/dts/Makefile4
-rw-r--r--arch/arm/boot/dts/cros5250-common.dtsi8
-rw-r--r--arch/arm/boot/dts/xenvm-4.2.dts13
-rw-r--r--arch/arm/configs/omap2plus_defconfig4
-rw-r--r--arch/arm/include/asm/xen/hypercall.h1
-rw-r--r--arch/arm/kernel/devtree.c7
-rw-r--r--arch/arm/kernel/setup.c13
-rw-r--r--arch/arm/mach-imx/Kconfig5
-rw-r--r--arch/arm/mach-imx/Makefile1
-rw-r--r--arch/arm/mach-imx/common.h1
-rw-r--r--arch/arm/mach-imx/headsmp.S2
-rw-r--r--arch/arm/mach-imx/hotplug.c2
-rw-r--r--arch/arm/mach-imx/iram_alloc.c73
-rw-r--r--arch/arm/mach-msm/last_radio_log.c2
-rw-r--r--arch/arm/mach-omap1/dma.c8
-rw-r--r--arch/arm/mach-omap2/Kconfig2
-rw-r--r--arch/arm/mach-omap2/Makefile8
-rw-r--r--arch/arm/mach-omap2/board-omap3beagle.c6
-rw-r--r--arch/arm/mach-omap2/board-rx51-peripherals.c4
-rw-r--r--arch/arm/mach-omap2/dma.c4
-rw-r--r--arch/arm/mach-omap2/gpmc.c38
-rw-r--r--arch/arm/mach-omap2/id.c13
-rw-r--r--arch/arm/mach-omap2/mux34xx.h6
-rw-r--r--arch/arm/mach-omap2/omap_device.c2
-rw-r--r--arch/arm/mach-omap2/soc.h2
-rw-r--r--arch/arm/mach-omap2/timer.c4
-rw-r--r--arch/arm/mach-prima2/Kconfig2
-rw-r--r--arch/arm/mach-pxa/Kconfig1
-rw-r--r--arch/arm/mach-spear/spear13xx.c2
-rw-r--r--arch/arm/mach-tegra/Kconfig1
-rw-r--r--arch/arm/mach-ux500/Kconfig2
-rw-r--r--arch/arm/mach-ux500/board-mop500.c4
-rw-r--r--arch/arm/mach-ux500/cpu-db8500.c2
-rw-r--r--arch/arm/mach-vexpress/v2m.c1
-rw-r--r--arch/arm/mach-virt/virt.c1
-rw-r--r--arch/arm/plat-orion/Makefile2
-rw-r--r--arch/arm/plat-orion/gpio.c2
-rw-r--r--arch/arm/xen/enlighten.c74
-rw-r--r--arch/arm/xen/hypercall.S1
40 files changed, 183 insertions, 150 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 34ef016626ff..d423d58f938d 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -109,9 +109,6 @@ config MIGHT_HAVE_PCI
109config SYS_SUPPORTS_APM_EMULATION 109config SYS_SUPPORTS_APM_EMULATION
110 bool 110 bool
111 111
112config GENERIC_GPIO
113 bool
114
115config HAVE_TCM 112config HAVE_TCM
116 bool 113 bool
117 select GENERIC_ALLOCATOR 114 select GENERIC_ALLOCATOR
@@ -900,7 +897,6 @@ config ARCH_MULTI_V7
900 bool "ARMv7 based platforms (Cortex-A, PJ4, Scorpion, Krait)" 897 bool "ARMv7 based platforms (Cortex-A, PJ4, Scorpion, Krait)"
901 default y 898 default y
902 select ARCH_MULTI_V6_V7 899 select ARCH_MULTI_V6_V7
903 select ARCH_VEXPRESS
904 select CPU_V7 900 select CPU_V7
905 901
906config ARCH_MULTI_V6_V7 902config ARCH_MULTI_V6_V7
@@ -1794,6 +1790,7 @@ config XEN
1794 depends on ARM && AEABI && OF 1790 depends on ARM && AEABI && OF
1795 depends on CPU_V7 && !CPU_V6 1791 depends on CPU_V7 && !CPU_V6
1796 depends on !GENERIC_ATOMIC64 1792 depends on !GENERIC_ATOMIC64
1793 select ARM_PSCI
1797 help 1794 help
1798 Say Y if you want to run Linux in a Virtual Machine on Xen on ARM. 1795 Say Y if you want to run Linux in a Virtual Machine on Xen on ARM.
1799 1796
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index 8562af4fe8fd..b9f7121e6ecf 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -200,8 +200,8 @@ dtb-$(CONFIG_ARCH_VERSATILE) += versatile-ab.dtb \
200dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \ 200dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \
201 vexpress-v2p-ca9.dtb \ 201 vexpress-v2p-ca9.dtb \
202 vexpress-v2p-ca15-tc1.dtb \ 202 vexpress-v2p-ca15-tc1.dtb \
203 vexpress-v2p-ca15_a7.dtb \ 203 vexpress-v2p-ca15_a7.dtb
204 xenvm-4.2.dtb 204dtb-$(CONFIG_ARCH_VIRT) += xenvm-4.2.dtb
205dtb-$(CONFIG_ARCH_VT8500) += vt8500-bv07.dtb \ 205dtb-$(CONFIG_ARCH_VT8500) += vt8500-bv07.dtb \
206 wm8505-ref.dtb \ 206 wm8505-ref.dtb \
207 wm8650-mid.dtb \ 207 wm8650-mid.dtb \
diff --git a/arch/arm/boot/dts/cros5250-common.dtsi b/arch/arm/boot/dts/cros5250-common.dtsi
index 0a61bbb9102f..3f0239ec1bc5 100644
--- a/arch/arm/boot/dts/cros5250-common.dtsi
+++ b/arch/arm/boot/dts/cros5250-common.dtsi
@@ -175,6 +175,14 @@
175 i2c@12C70000 { 175 i2c@12C70000 {
176 samsung,i2c-sda-delay = <100>; 176 samsung,i2c-sda-delay = <100>;
177 samsung,i2c-max-bus-freq = <378000>; 177 samsung,i2c-max-bus-freq = <378000>;
178
179 trackpad {
180 reg = <0x67>;
181 compatible = "cypress,cyapa";
182 interrupts = <2 0>;
183 interrupt-parent = <&gpx1>;
184 wakeup-source;
185 };
178 }; 186 };
179 187
180 i2c@12C80000 { 188 i2c@12C80000 {
diff --git a/arch/arm/boot/dts/xenvm-4.2.dts b/arch/arm/boot/dts/xenvm-4.2.dts
index ec3f9528e180..336915151398 100644
--- a/arch/arm/boot/dts/xenvm-4.2.dts
+++ b/arch/arm/boot/dts/xenvm-4.2.dts
@@ -29,6 +29,19 @@
29 compatible = "arm,cortex-a15"; 29 compatible = "arm,cortex-a15";
30 reg = <0>; 30 reg = <0>;
31 }; 31 };
32
33 cpu@1 {
34 device_type = "cpu";
35 compatible = "arm,cortex-a15";
36 reg = <1>;
37 };
38 };
39
40 psci {
41 compatible = "arm,psci";
42 method = "hvc";
43 cpu_off = <1>;
44 cpu_on = <2>;
32 }; 45 };
33 46
34 memory@80000000 { 47 memory@80000000 {
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig
index 33903ca0d879..c1ef64bc5abd 100644
--- a/arch/arm/configs/omap2plus_defconfig
+++ b/arch/arm/configs/omap2plus_defconfig
@@ -137,6 +137,8 @@ CONFIG_SERIAL_8250_DETECT_IRQ=y
137CONFIG_SERIAL_8250_RSA=y 137CONFIG_SERIAL_8250_RSA=y
138CONFIG_SERIAL_AMBA_PL011=y 138CONFIG_SERIAL_AMBA_PL011=y
139CONFIG_SERIAL_AMBA_PL011_CONSOLE=y 139CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
140CONFIG_SERIAL_OMAP=y
141CONFIG_SERIAL_OMAP_CONSOLE=y
140CONFIG_HW_RANDOM=y 142CONFIG_HW_RANDOM=y
141CONFIG_I2C_CHARDEV=y 143CONFIG_I2C_CHARDEV=y
142CONFIG_SPI=y 144CONFIG_SPI=y
@@ -153,6 +155,7 @@ CONFIG_OMAP_WATCHDOG=y
153CONFIG_TWL4030_WATCHDOG=y 155CONFIG_TWL4030_WATCHDOG=y
154CONFIG_MFD_TPS65217=y 156CONFIG_MFD_TPS65217=y
155CONFIG_MFD_TPS65910=y 157CONFIG_MFD_TPS65910=y
158CONFIG_TWL6040_CORE=y
156CONFIG_REGULATOR_TWL4030=y 159CONFIG_REGULATOR_TWL4030=y
157CONFIG_REGULATOR_TPS65023=y 160CONFIG_REGULATOR_TPS65023=y
158CONFIG_REGULATOR_TPS6507X=y 161CONFIG_REGULATOR_TPS6507X=y
@@ -195,6 +198,7 @@ CONFIG_SND_USB_AUDIO=m
195CONFIG_SND_SOC=m 198CONFIG_SND_SOC=m
196CONFIG_SND_OMAP_SOC=m 199CONFIG_SND_OMAP_SOC=m
197CONFIG_SND_OMAP_SOC_OMAP_TWL4030=m 200CONFIG_SND_OMAP_SOC_OMAP_TWL4030=m
201CONFIG_SND_OMAP_SOC_OMAP_ABE_TWL6040=m
198CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m 202CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m
199CONFIG_USB=y 203CONFIG_USB=y
200CONFIG_USB_DEBUG=y 204CONFIG_USB_DEBUG=y
diff --git a/arch/arm/include/asm/xen/hypercall.h b/arch/arm/include/asm/xen/hypercall.h
index 8a823253d775..799f42ecca63 100644
--- a/arch/arm/include/asm/xen/hypercall.h
+++ b/arch/arm/include/asm/xen/hypercall.h
@@ -46,6 +46,7 @@ int HYPERVISOR_event_channel_op(int cmd, void *arg);
46unsigned long HYPERVISOR_hvm_op(int op, void *arg); 46unsigned long HYPERVISOR_hvm_op(int op, void *arg);
47int HYPERVISOR_memory_op(unsigned int cmd, void *arg); 47int HYPERVISOR_memory_op(unsigned int cmd, void *arg);
48int HYPERVISOR_physdev_op(int cmd, void *arg); 48int HYPERVISOR_physdev_op(int cmd, void *arg);
49int HYPERVISOR_vcpu_op(int cmd, int vcpuid, void *extra_args);
49 50
50static inline void 51static inline void
51MULTI_update_va_mapping(struct multicall_entry *mcl, unsigned long va, 52MULTI_update_va_mapping(struct multicall_entry *mcl, unsigned long va,
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
index 70f1bdeb241b..5af04f6daa33 100644
--- a/arch/arm/kernel/devtree.c
+++ b/arch/arm/kernel/devtree.c
@@ -180,6 +180,13 @@ struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
180 unsigned long dt_root; 180 unsigned long dt_root;
181 const char *model; 181 const char *model;
182 182
183#ifdef CONFIG_ARCH_MULTIPLATFORM
184 DT_MACHINE_START(GENERIC_DT, "Generic DT based system")
185 MACHINE_END
186
187 mdesc_best = (struct machine_desc *)&__mach_desc_GENERIC_DT;
188#endif
189
183 if (!dt_phys) 190 if (!dt_phys)
184 return NULL; 191 return NULL;
185 192
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 728007c4a2b7..1522c7ae31b0 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -18,6 +18,7 @@
18#include <linux/bootmem.h> 18#include <linux/bootmem.h>
19#include <linux/seq_file.h> 19#include <linux/seq_file.h>
20#include <linux/screen_info.h> 20#include <linux/screen_info.h>
21#include <linux/of_platform.h>
21#include <linux/init.h> 22#include <linux/init.h>
22#include <linux/kexec.h> 23#include <linux/kexec.h>
23#include <linux/of_fdt.h> 24#include <linux/of_fdt.h>
@@ -659,9 +660,19 @@ struct screen_info screen_info = {
659 660
660static int __init customize_machine(void) 661static int __init customize_machine(void)
661{ 662{
662 /* customizes platform devices, or adds new ones */ 663 /*
664 * customizes platform devices, or adds new ones
665 * On DT based machines, we fall back to populating the
666 * machine from the device tree, if no callback is provided,
667 * otherwise we would always need an init_machine callback.
668 */
663 if (machine_desc->init_machine) 669 if (machine_desc->init_machine)
664 machine_desc->init_machine(); 670 machine_desc->init_machine();
671#ifdef CONFIG_OF
672 else
673 of_platform_populate(NULL, of_default_bus_match_table,
674 NULL, NULL);
675#endif
665 return 0; 676 return 0;
666} 677}
667arch_initcall(customize_machine); 678arch_initcall(customize_machine);
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 78f795d73cb6..ba44328464f3 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -5,6 +5,7 @@ config ARCH_MXC
5 select AUTO_ZRELADDR if !ZBOOT_ROM 5 select AUTO_ZRELADDR if !ZBOOT_ROM
6 select CLKDEV_LOOKUP 6 select CLKDEV_LOOKUP
7 select CLKSRC_MMIO 7 select CLKSRC_MMIO
8 select GENERIC_ALLOCATOR
8 select GENERIC_CLOCKEVENTS 9 select GENERIC_CLOCKEVENTS
9 select GENERIC_IRQ_CHIP 10 select GENERIC_IRQ_CHIP
10 select MULTI_IRQ_HANDLER 11 select MULTI_IRQ_HANDLER
@@ -61,10 +62,6 @@ config MXC_ULPI
61config ARCH_HAS_RNGA 62config ARCH_HAS_RNGA
62 bool 63 bool
63 64
64config IRAM_ALLOC
65 bool
66 select GENERIC_ALLOCATOR
67
68config HAVE_IMX_ANATOP 65config HAVE_IMX_ANATOP
69 bool 66 bool
70 67
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index 930958973f81..70ae7c490ac0 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -23,7 +23,6 @@ obj-$(CONFIG_ARCH_MXC_IOMUX_V3) += iomux-v3.o
23obj-$(CONFIG_MXC_TZIC) += tzic.o 23obj-$(CONFIG_MXC_TZIC) += tzic.o
24obj-$(CONFIG_MXC_AVIC) += avic.o 24obj-$(CONFIG_MXC_AVIC) += avic.o
25 25
26obj-$(CONFIG_IRAM_ALLOC) += iram_alloc.o
27obj-$(CONFIG_MXC_ULPI) += ulpi.o 26obj-$(CONFIG_MXC_ULPI) += ulpi.o
28obj-$(CONFIG_MXC_USE_EPIT) += epit.o 27obj-$(CONFIG_MXC_USE_EPIT) += epit.o
29obj-$(CONFIG_MXC_DEBUG_BOARD) += 3ds_debugboard.o 28obj-$(CONFIG_MXC_DEBUG_BOARD) += 3ds_debugboard.o
diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h
index 4cba7dbb079f..c08ae3f99cee 100644
--- a/arch/arm/mach-imx/common.h
+++ b/arch/arm/mach-imx/common.h
@@ -12,6 +12,7 @@
12#define __ASM_ARCH_MXC_COMMON_H__ 12#define __ASM_ARCH_MXC_COMMON_H__
13 13
14struct platform_device; 14struct platform_device;
15struct pt_regs;
15struct clk; 16struct clk;
16enum mxc_cpu_pwr_mode; 17enum mxc_cpu_pwr_mode;
17 18
diff --git a/arch/arm/mach-imx/headsmp.S b/arch/arm/mach-imx/headsmp.S
index a58c8b0527cc..67b9c48dcafe 100644
--- a/arch/arm/mach-imx/headsmp.S
+++ b/arch/arm/mach-imx/headsmp.S
@@ -24,7 +24,7 @@ ENTRY(v7_secondary_startup)
24ENDPROC(v7_secondary_startup) 24ENDPROC(v7_secondary_startup)
25#endif 25#endif
26 26
27#ifdef CONFIG_PM 27#ifdef CONFIG_ARM_CPU_SUSPEND
28/* 28/*
29 * The following code must assume it is running from physical address 29 * The following code must assume it is running from physical address
30 * where absolute virtual addresses to the data section have to be 30 * where absolute virtual addresses to the data section have to be
diff --git a/arch/arm/mach-imx/hotplug.c b/arch/arm/mach-imx/hotplug.c
index 5e91112dcbee..3daf1ed90579 100644
--- a/arch/arm/mach-imx/hotplug.c
+++ b/arch/arm/mach-imx/hotplug.c
@@ -11,7 +11,9 @@
11 */ 11 */
12 12
13#include <linux/errno.h> 13#include <linux/errno.h>
14#include <linux/jiffies.h>
14#include <asm/cp15.h> 15#include <asm/cp15.h>
16#include <asm/proc-fns.h>
15 17
16#include "common.h" 18#include "common.h"
17 19
diff --git a/arch/arm/mach-imx/iram_alloc.c b/arch/arm/mach-imx/iram_alloc.c
deleted file mode 100644
index e05cf407db65..000000000000
--- a/arch/arm/mach-imx/iram_alloc.c
+++ /dev/null
@@ -1,73 +0,0 @@
1/*
2 * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
17 * MA 02110-1301, USA.
18 */
19
20#include <linux/kernel.h>
21#include <linux/io.h>
22#include <linux/module.h>
23#include <linux/spinlock.h>
24#include <linux/genalloc.h>
25#include "linux/platform_data/imx-iram.h"
26
27static unsigned long iram_phys_base;
28static void __iomem *iram_virt_base;
29static struct gen_pool *iram_pool;
30
31static inline void __iomem *iram_phys_to_virt(unsigned long p)
32{
33 return iram_virt_base + (p - iram_phys_base);
34}
35
36void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr)
37{
38 if (!iram_pool)
39 return NULL;
40
41 *dma_addr = gen_pool_alloc(iram_pool, size);
42 pr_debug("iram alloc - %dB@0x%lX\n", size, *dma_addr);
43 if (!*dma_addr)
44 return NULL;
45 return iram_phys_to_virt(*dma_addr);
46}
47EXPORT_SYMBOL(iram_alloc);
48
49void iram_free(unsigned long addr, unsigned int size)
50{
51 if (!iram_pool)
52 return;
53
54 gen_pool_free(iram_pool, addr, size);
55}
56EXPORT_SYMBOL(iram_free);
57
58int __init iram_init(unsigned long base, unsigned long size)
59{
60 iram_phys_base = base;
61
62 iram_pool = gen_pool_create(PAGE_SHIFT, -1);
63 if (!iram_pool)
64 return -ENOMEM;
65
66 gen_pool_add(iram_pool, base, size, -1);
67 iram_virt_base = ioremap(iram_phys_base, size);
68 if (!iram_virt_base)
69 return -EIO;
70
71 pr_debug("i.MX IRAM pool: %ld KB@0x%p\n", size / 1024, iram_virt_base);
72 return 0;
73}
diff --git a/arch/arm/mach-msm/last_radio_log.c b/arch/arm/mach-msm/last_radio_log.c
index 7777767ee89a..9c392a29fc7e 100644
--- a/arch/arm/mach-msm/last_radio_log.c
+++ b/arch/arm/mach-msm/last_radio_log.c
@@ -66,6 +66,6 @@ void msm_init_last_radio_log(struct module *owner)
66 pr_err("%s: last radio log is %d bytes long\n", __func__, 66 pr_err("%s: last radio log is %d bytes long\n", __func__,
67 radio_log_size); 67 radio_log_size);
68 last_radio_log_fops.owner = owner; 68 last_radio_log_fops.owner = owner;
69 entry->size = radio_log_size; 69 proc_set_size(entry, radio_log_size);
70} 70}
71EXPORT_SYMBOL(msm_init_last_radio_log); 71EXPORT_SYMBOL(msm_init_last_radio_log);
diff --git a/arch/arm/mach-omap1/dma.c b/arch/arm/mach-omap1/dma.c
index 1a4e887f028d..68ab858e27b7 100644
--- a/arch/arm/mach-omap1/dma.c
+++ b/arch/arm/mach-omap1/dma.c
@@ -301,7 +301,7 @@ static int __init omap1_system_dma_init(void)
301 if (ret) { 301 if (ret) {
302 dev_err(&pdev->dev, "%s: Unable to add resources for %s%d\n", 302 dev_err(&pdev->dev, "%s: Unable to add resources for %s%d\n",
303 __func__, pdev->name, pdev->id); 303 __func__, pdev->name, pdev->id);
304 goto exit_device_put; 304 goto exit_iounmap;
305 } 305 }
306 306
307 p = kzalloc(sizeof(struct omap_system_dma_plat_info), GFP_KERNEL); 307 p = kzalloc(sizeof(struct omap_system_dma_plat_info), GFP_KERNEL);
@@ -309,7 +309,7 @@ static int __init omap1_system_dma_init(void)
309 dev_err(&pdev->dev, "%s: Unable to allocate 'p' for %s\n", 309 dev_err(&pdev->dev, "%s: Unable to allocate 'p' for %s\n",
310 __func__, pdev->name); 310 __func__, pdev->name);
311 ret = -ENOMEM; 311 ret = -ENOMEM;
312 goto exit_device_del; 312 goto exit_iounmap;
313 } 313 }
314 314
315 d = kzalloc(sizeof(struct omap_dma_dev_attr), GFP_KERNEL); 315 d = kzalloc(sizeof(struct omap_dma_dev_attr), GFP_KERNEL);
@@ -402,8 +402,8 @@ exit_release_d:
402 kfree(d); 402 kfree(d);
403exit_release_p: 403exit_release_p:
404 kfree(p); 404 kfree(p);
405exit_device_del: 405exit_iounmap:
406 platform_device_del(pdev); 406 iounmap(dma_base);
407exit_device_put: 407exit_device_put:
408 platform_device_put(pdev); 408 platform_device_put(pdev);
409 409
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 857b1f097fd8..f49cd51e162a 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -37,8 +37,6 @@ config ARCH_OMAP2PLUS_TYPICAL
37 select NEON if ARCH_OMAP3 || ARCH_OMAP4 || SOC_OMAP5 37 select NEON if ARCH_OMAP3 || ARCH_OMAP4 || SOC_OMAP5
38 select PM_RUNTIME 38 select PM_RUNTIME
39 select REGULATOR 39 select REGULATOR
40 select SERIAL_OMAP
41 select SERIAL_OMAP_CONSOLE
42 select TWL4030_CORE if ARCH_OMAP3 || ARCH_OMAP4 40 select TWL4030_CORE if ARCH_OMAP3 || ARCH_OMAP4
43 select TWL4030_POWER if ARCH_OMAP3 || ARCH_OMAP4 41 select TWL4030_POWER if ARCH_OMAP3 || ARCH_OMAP4
44 select VFP 42 select VFP
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 62bb352c2d37..55a9d6777683 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -32,12 +32,12 @@ obj-$(CONFIG_SOC_HAS_OMAP2_SDRC) += sdrc.o
32 32
33# SMP support ONLY available for OMAP4 33# SMP support ONLY available for OMAP4
34 34
35obj-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o 35smp-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o
36obj-$(CONFIG_HOTPLUG_CPU) += omap-hotplug.o 36smp-$(CONFIG_HOTPLUG_CPU) += omap-hotplug.o
37omap-4-5-common = omap4-common.o omap-wakeupgen.o \ 37omap-4-5-common = omap4-common.o omap-wakeupgen.o \
38 sleep44xx.o 38 sleep44xx.o
39obj-$(CONFIG_ARCH_OMAP4) += $(omap-4-5-common) 39obj-$(CONFIG_ARCH_OMAP4) += $(omap-4-5-common) $(smp-y)
40obj-$(CONFIG_SOC_OMAP5) += $(omap-4-5-common) 40obj-$(CONFIG_SOC_OMAP5) += $(omap-4-5-common) $(smp-y)
41 41
42plus_sec := $(call as-instr,.arch_extension sec,+sec) 42plus_sec := $(call as-instr,.arch_extension sec,+sec)
43AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a$(plus_sec) 43AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a$(plus_sec)
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
index 6de78605c0af..04c116555412 100644
--- a/arch/arm/mach-omap2/board-omap3beagle.c
+++ b/arch/arm/mach-omap2/board-omap3beagle.c
@@ -112,13 +112,13 @@ static u8 omap3_beagle_version;
112 */ 112 */
113static struct { 113static struct {
114 int mmc1_gpio_wp; 114 int mmc1_gpio_wp;
115 int usb_pwr_level; 115 bool usb_pwr_level; /* 0 - Active Low, 1 - Active High */
116 int dvi_pd_gpio; 116 int dvi_pd_gpio;
117 int usr_button_gpio; 117 int usr_button_gpio;
118 int mmc_caps; 118 int mmc_caps;
119} beagle_config = { 119} beagle_config = {
120 .mmc1_gpio_wp = -EINVAL, 120 .mmc1_gpio_wp = -EINVAL,
121 .usb_pwr_level = GPIOF_OUT_INIT_LOW, 121 .usb_pwr_level = 0,
122 .dvi_pd_gpio = -EINVAL, 122 .dvi_pd_gpio = -EINVAL,
123 .usr_button_gpio = 4, 123 .usr_button_gpio = 4,
124 .mmc_caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, 124 .mmc_caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
@@ -178,7 +178,7 @@ static void __init omap3_beagle_init_rev(void)
178 case 0: 178 case 0:
179 printk(KERN_INFO "OMAP3 Beagle Rev: xM Ax/Bx\n"); 179 printk(KERN_INFO "OMAP3 Beagle Rev: xM Ax/Bx\n");
180 omap3_beagle_version = OMAP3BEAGLE_BOARD_XM; 180 omap3_beagle_version = OMAP3BEAGLE_BOARD_XM;
181 beagle_config.usb_pwr_level = GPIOF_OUT_INIT_HIGH; 181 beagle_config.usb_pwr_level = 1;
182 beagle_config.mmc_caps &= ~MMC_CAP_8_BIT_DATA; 182 beagle_config.mmc_caps &= ~MMC_CAP_8_BIT_DATA;
183 break; 183 break;
184 case 2: 184 case 2:
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index 1a884670a6c4..18ca61e300b3 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -73,11 +73,11 @@
73#define LIS302_IRQ1_GPIO 181 73#define LIS302_IRQ1_GPIO 181
74#define LIS302_IRQ2_GPIO 180 /* Not yet in use */ 74#define LIS302_IRQ2_GPIO 180 /* Not yet in use */
75 75
76/* list all spi devices here */ 76/* List all SPI devices here. Note that the list/probe order seems to matter! */
77enum { 77enum {
78 RX51_SPI_WL1251, 78 RX51_SPI_WL1251,
79 RX51_SPI_MIPID, /* LCD panel */
80 RX51_SPI_TSC2005, /* Touch Controller */ 79 RX51_SPI_TSC2005, /* Touch Controller */
80 RX51_SPI_MIPID, /* LCD panel */
81}; 81};
82 82
83static struct wl12xx_platform_data wl1251_pdata; 83static struct wl12xx_platform_data wl1251_pdata;
diff --git a/arch/arm/mach-omap2/dma.c b/arch/arm/mach-omap2/dma.c
index dab9fc014b97..49fd0d501c9b 100644
--- a/arch/arm/mach-omap2/dma.c
+++ b/arch/arm/mach-omap2/dma.c
@@ -28,6 +28,7 @@
28#include <linux/init.h> 28#include <linux/init.h>
29#include <linux/device.h> 29#include <linux/device.h>
30#include <linux/dma-mapping.h> 30#include <linux/dma-mapping.h>
31#include <linux/of.h>
31#include <linux/omap-dma.h> 32#include <linux/omap-dma.h>
32 33
33#include "soc.h" 34#include "soc.h"
@@ -304,6 +305,9 @@ static int __init omap2_system_dma_init(void)
304 if (res) 305 if (res)
305 return res; 306 return res;
306 307
308 if (of_have_populated_dt())
309 return res;
310
307 pdev = platform_device_register_full(&omap_dma_dev_info); 311 pdev = platform_device_register_full(&omap_dma_dev_info);
308 if (IS_ERR(pdev)) 312 if (IS_ERR(pdev))
309 return PTR_ERR(pdev); 313 return PTR_ERR(pdev);
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c
index ed946df5ad8a..6c4da1254f53 100644
--- a/arch/arm/mach-omap2/gpmc.c
+++ b/arch/arm/mach-omap2/gpmc.c
@@ -1520,36 +1520,22 @@ static int gpmc_probe_dt(struct platform_device *pdev)
1520 return ret; 1520 return ret;
1521 } 1521 }
1522 1522
1523 for_each_node_by_name(child, "nand") { 1523 for_each_child_of_node(pdev->dev.of_node, child) {
1524 ret = gpmc_probe_nand_child(pdev, child);
1525 if (ret < 0) {
1526 of_node_put(child);
1527 return ret;
1528 }
1529 }
1530 1524
1531 for_each_node_by_name(child, "onenand") { 1525 if (!child->name)
1532 ret = gpmc_probe_onenand_child(pdev, child); 1526 continue;
1533 if (ret < 0) {
1534 of_node_put(child);
1535 return ret;
1536 }
1537 }
1538 1527
1539 for_each_node_by_name(child, "nor") { 1528 if (of_node_cmp(child->name, "nand") == 0)
1540 ret = gpmc_probe_generic_child(pdev, child); 1529 ret = gpmc_probe_nand_child(pdev, child);
1541 if (ret < 0) { 1530 else if (of_node_cmp(child->name, "onenand") == 0)
1542 of_node_put(child); 1531 ret = gpmc_probe_onenand_child(pdev, child);
1543 return ret; 1532 else if (of_node_cmp(child->name, "ethernet") == 0 ||
1544 } 1533 of_node_cmp(child->name, "nor") == 0)
1545 } 1534 ret = gpmc_probe_generic_child(pdev, child);
1546 1535
1547 for_each_node_by_name(child, "ethernet") { 1536 if (WARN(ret < 0, "%s: probing gpmc child %s failed\n",
1548 ret = gpmc_probe_generic_child(pdev, child); 1537 __func__, child->full_name))
1549 if (ret < 0) {
1550 of_node_put(child); 1538 of_node_put(child);
1551 return ret;
1552 }
1553 } 1539 }
1554 1540
1555 return 0; 1541 return 0;
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index 0f4c18e6e60c..1272c41d4749 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -419,11 +419,15 @@ void __init omap3xxx_check_revision(void)
419 cpu_rev = "1.0"; 419 cpu_rev = "1.0";
420 break; 420 break;
421 case 1: 421 case 1:
422 /* FALLTHROUGH */
423 default:
424 omap_revision = AM335X_REV_ES2_0; 422 omap_revision = AM335X_REV_ES2_0;
425 cpu_rev = "2.0"; 423 cpu_rev = "2.0";
426 break; 424 break;
425 case 2:
426 /* FALLTHROUGH */
427 default:
428 omap_revision = AM335X_REV_ES2_1;
429 cpu_rev = "2.1";
430 break;
427 } 431 }
428 break; 432 break;
429 case 0xb8f2: 433 case 0xb8f2:
@@ -644,13 +648,12 @@ void __init omap_soc_device_init(void)
644 soc_dev_attr->revision = soc_rev; 648 soc_dev_attr->revision = soc_rev;
645 649
646 soc_dev = soc_device_register(soc_dev_attr); 650 soc_dev = soc_device_register(soc_dev_attr);
647 if (IS_ERR_OR_NULL(soc_dev)) { 651 if (IS_ERR(soc_dev)) {
648 kfree(soc_dev_attr); 652 kfree(soc_dev_attr);
649 return; 653 return;
650 } 654 }
651 655
652 parent = soc_device_to_device(soc_dev); 656 parent = soc_device_to_device(soc_dev);
653 if (!IS_ERR_OR_NULL(parent)) 657 device_create_file(parent, &omap_soc_attr);
654 device_create_file(parent, &omap_soc_attr);
655} 658}
656#endif /* CONFIG_SOC_BUS */ 659#endif /* CONFIG_SOC_BUS */
diff --git a/arch/arm/mach-omap2/mux34xx.h b/arch/arm/mach-omap2/mux34xx.h
index 6543ebf8ecfc..3f26d297c082 100644
--- a/arch/arm/mach-omap2/mux34xx.h
+++ b/arch/arm/mach-omap2/mux34xx.h
@@ -393,6 +393,10 @@
393#define OMAP3_CONTROL_PADCONF_SAD2D_SWAKEUP_OFFSET 0xa1c 393#define OMAP3_CONTROL_PADCONF_SAD2D_SWAKEUP_OFFSET 0xa1c
394#define OMAP3_CONTROL_PADCONF_JTAG_RTCK_OFFSET 0xa1e 394#define OMAP3_CONTROL_PADCONF_JTAG_RTCK_OFFSET 0xa1e
395#define OMAP3_CONTROL_PADCONF_JTAG_TDO_OFFSET 0xa20 395#define OMAP3_CONTROL_PADCONF_JTAG_TDO_OFFSET 0xa20
396#define OMAP3_CONTROL_PADCONF_GPIO_127 0xa24
397#define OMAP3_CONTROL_PADCONF_GPIO_126 0xa26
398#define OMAP3_CONTROL_PADCONF_GPIO_128 0xa28
399#define OMAP3_CONTROL_PADCONF_GPIO_129 0xa2a
396 400
397#define OMAP3_CONTROL_PADCONF_MUX_SIZE \ 401#define OMAP3_CONTROL_PADCONF_MUX_SIZE \
398 (OMAP3_CONTROL_PADCONF_JTAG_TDO_OFFSET + 0x2) 402 (OMAP3_CONTROL_PADCONF_GPIO_129 + 0x2)
diff --git a/arch/arm/mach-omap2/omap_device.c b/arch/arm/mach-omap2/omap_device.c
index eeea4fa28fbc..e6d230700b2b 100644
--- a/arch/arm/mach-omap2/omap_device.c
+++ b/arch/arm/mach-omap2/omap_device.c
@@ -876,4 +876,4 @@ static int __init omap_device_late_init(void)
876 bus_for_each_dev(&platform_bus_type, NULL, NULL, omap_device_late_idle); 876 bus_for_each_dev(&platform_bus_type, NULL, NULL, omap_device_late_idle);
877 return 0; 877 return 0;
878} 878}
879omap_late_initcall(omap_device_late_init); 879omap_late_initcall_sync(omap_device_late_init);
diff --git a/arch/arm/mach-omap2/soc.h b/arch/arm/mach-omap2/soc.h
index 18fdeeb3a44a..197cc16870d9 100644
--- a/arch/arm/mach-omap2/soc.h
+++ b/arch/arm/mach-omap2/soc.h
@@ -396,6 +396,7 @@ IS_OMAP_TYPE(3430, 0x3430)
396#define AM335X_CLASS 0x33500033 396#define AM335X_CLASS 0x33500033
397#define AM335X_REV_ES1_0 AM335X_CLASS 397#define AM335X_REV_ES1_0 AM335X_CLASS
398#define AM335X_REV_ES2_0 (AM335X_CLASS | (0x1 << 8)) 398#define AM335X_REV_ES2_0 (AM335X_CLASS | (0x1 << 8))
399#define AM335X_REV_ES2_1 (AM335X_CLASS | (0x2 << 8))
399 400
400#define OMAP443X_CLASS 0x44300044 401#define OMAP443X_CLASS 0x44300044
401#define OMAP4430_REV_ES1_0 (OMAP443X_CLASS | (0x10 << 8)) 402#define OMAP4430_REV_ES1_0 (OMAP443X_CLASS | (0x10 << 8))
@@ -496,6 +497,7 @@ level(__##fn);
496#define omap_subsys_initcall(fn) omap_initcall(subsys_initcall, fn) 497#define omap_subsys_initcall(fn) omap_initcall(subsys_initcall, fn)
497#define omap_device_initcall(fn) omap_initcall(device_initcall, fn) 498#define omap_device_initcall(fn) omap_initcall(device_initcall, fn)
498#define omap_late_initcall(fn) omap_initcall(late_initcall, fn) 499#define omap_late_initcall(fn) omap_initcall(late_initcall, fn)
500#define omap_late_initcall_sync(fn) omap_initcall(late_initcall_sync, fn)
499 501
500#endif /* __ASSEMBLY__ */ 502#endif /* __ASSEMBLY__ */
501 503
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index 05481490a508..f8b23b8040d9 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -553,6 +553,8 @@ static inline void __init realtime_counter_init(void)
553 clksrc_nr, clksrc_src, clksrc_prop) \ 553 clksrc_nr, clksrc_src, clksrc_prop) \
554void __init omap##name##_gptimer_timer_init(void) \ 554void __init omap##name##_gptimer_timer_init(void) \
555{ \ 555{ \
556 if (omap_clk_init) \
557 omap_clk_init(); \
556 omap_dmtimer_init(); \ 558 omap_dmtimer_init(); \
557 omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ 559 omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
558 omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src, \ 560 omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src, \
@@ -563,6 +565,8 @@ void __init omap##name##_gptimer_timer_init(void) \
563 clksrc_nr, clksrc_src, clksrc_prop) \ 565 clksrc_nr, clksrc_src, clksrc_prop) \
564void __init omap##name##_sync32k_timer_init(void) \ 566void __init omap##name##_sync32k_timer_init(void) \
565{ \ 567{ \
568 if (omap_clk_init) \
569 omap_clk_init(); \
566 omap_dmtimer_init(); \ 570 omap_dmtimer_init(); \
567 omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ 571 omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
568 /* Enable the use of clocksource="gp_timer" kernel parameter */ \ 572 /* Enable the use of clocksource="gp_timer" kernel parameter */ \
diff --git a/arch/arm/mach-prima2/Kconfig b/arch/arm/mach-prima2/Kconfig
index 80ca974b2f82..6988b117fc17 100644
--- a/arch/arm/mach-prima2/Kconfig
+++ b/arch/arm/mach-prima2/Kconfig
@@ -38,7 +38,7 @@ config ARCH_MARCO
38 select CPU_V7 38 select CPU_V7
39 select HAVE_ARM_SCU if SMP 39 select HAVE_ARM_SCU if SMP
40 select HAVE_SMP 40 select HAVE_SMP
41 select SMP_ON_UP 41 select SMP_ON_UP if SMP
42 help 42 help
43 Support for CSR SiRFSoC ARM Cortex A9 Platform 43 Support for CSR SiRFSoC ARM Cortex A9 Platform
44 44
diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig
index 9075461999c1..96100dbf5a2e 100644
--- a/arch/arm/mach-pxa/Kconfig
+++ b/arch/arm/mach-pxa/Kconfig
@@ -162,7 +162,6 @@ config MACH_XCEP
162 select MTD 162 select MTD
163 select MTD_CFI 163 select MTD_CFI
164 select MTD_CFI_INTELEXT 164 select MTD_CFI_INTELEXT
165 select MTD_CHAR
166 select MTD_PHYSMAP 165 select MTD_PHYSMAP
167 select PXA25x 166 select PXA25x
168 select SMC91X 167 select SMC91X
diff --git a/arch/arm/mach-spear/spear13xx.c b/arch/arm/mach-spear/spear13xx.c
index 3621599c38ad..7aa6e8cf830f 100644
--- a/arch/arm/mach-spear/spear13xx.c
+++ b/arch/arm/mach-spear/spear13xx.c
@@ -35,6 +35,8 @@ void __init spear13xx_l2x0_init(void)
35 * write alloc and 'Full line of zero' options 35 * write alloc and 'Full line of zero' options
36 * 36 *
37 */ 37 */
38 if (!IS_ENABLED(CONFIG_CACHE_L2X0))
39 return;
38 40
39 writel_relaxed(0x06, VA_L2CC_BASE + L2X0_PREFETCH_CTRL); 41 writel_relaxed(0x06, VA_L2CC_BASE + L2X0_PREFETCH_CTRL);
40 42
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
index 20c3b372cdf5..84d72fc36dfe 100644
--- a/arch/arm/mach-tegra/Kconfig
+++ b/arch/arm/mach-tegra/Kconfig
@@ -63,6 +63,7 @@ config ARCH_TEGRA_114_SOC
63 select ARM_ARCH_TIMER 63 select ARM_ARCH_TIMER
64 select ARM_GIC 64 select ARM_GIC
65 select ARM_L1_CACHE_SHIFT_6 65 select ARM_L1_CACHE_SHIFT_6
66 select CPU_FREQ_TABLE if CPU_FREQ
66 select CPU_V7 67 select CPU_V7
67 select PINCTRL 68 select PINCTRL
68 select PINCTRL_TEGRA114 69 select PINCTRL_TEGRA114
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig
index f66d7deae46d..6a4387e39df8 100644
--- a/arch/arm/mach-ux500/Kconfig
+++ b/arch/arm/mach-ux500/Kconfig
@@ -19,6 +19,8 @@ if ARCH_U8500
19config UX500_SOC_COMMON 19config UX500_SOC_COMMON
20 bool 20 bool
21 default y 21 default y
22 select ABX500_CORE
23 select AB8500_CORE
22 select ARM_ERRATA_754322 24 select ARM_ERRATA_754322
23 select ARM_ERRATA_764369 if SMP 25 select ARM_ERRATA_764369 if SMP
24 select ARM_GIC 26 select ARM_GIC
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index a15dd6b63a8f..3cd555ac6d0a 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -403,8 +403,8 @@ static int mop500_prox_activate(struct device *dev)
403 "no regulator\n"); 403 "no regulator\n");
404 return PTR_ERR(prox_regulator); 404 return PTR_ERR(prox_regulator);
405 } 405 }
406 regulator_enable(prox_regulator); 406
407 return 0; 407 return regulator_enable(prox_regulator);
408} 408}
409 409
410static void mop500_prox_deactivate(struct device *dev) 410static void mop500_prox_deactivate(struct device *dev)
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c
index 995928ba22fd..e90b5ab23b6d 100644
--- a/arch/arm/mach-ux500/cpu-db8500.c
+++ b/arch/arm/mach-ux500/cpu-db8500.c
@@ -191,7 +191,7 @@ static const char *db8500_read_soc_id(void)
191 /* Throw these device-specific numbers into the entropy pool */ 191 /* Throw these device-specific numbers into the entropy pool */
192 add_device_randomness(uid, 0x14); 192 add_device_randomness(uid, 0x14);
193 return kasprintf(GFP_KERNEL, "%08x%08x%08x%08x%08x", 193 return kasprintf(GFP_KERNEL, "%08x%08x%08x%08x%08x",
194 readl((u32 *)uid+1), 194 readl((u32 *)uid+0),
195 readl((u32 *)uid+1), readl((u32 *)uid+2), 195 readl((u32 *)uid+1), readl((u32 *)uid+2),
196 readl((u32 *)uid+3), readl((u32 *)uid+4)); 196 readl((u32 *)uid+3), readl((u32 *)uid+4));
197} 197}
diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c
index b6083bb1eb8c..8802030df98d 100644
--- a/arch/arm/mach-vexpress/v2m.c
+++ b/arch/arm/mach-vexpress/v2m.c
@@ -450,7 +450,6 @@ static void __init v2m_dt_init(void)
450 450
451static const char * const v2m_dt_match[] __initconst = { 451static const char * const v2m_dt_match[] __initconst = {
452 "arm,vexpress", 452 "arm,vexpress",
453 "xen,xenvm",
454 NULL, 453 NULL,
455}; 454};
456 455
diff --git a/arch/arm/mach-virt/virt.c b/arch/arm/mach-virt/virt.c
index adc0945255ae..061f283f579e 100644
--- a/arch/arm/mach-virt/virt.c
+++ b/arch/arm/mach-virt/virt.c
@@ -32,6 +32,7 @@ static void __init virt_init(void)
32 32
33static const char *virt_dt_match[] = { 33static const char *virt_dt_match[] = {
34 "linux,dummy-virt", 34 "linux,dummy-virt",
35 "xen,xenvm",
35 NULL 36 NULL
36}; 37};
37 38
diff --git a/arch/arm/plat-orion/Makefile b/arch/arm/plat-orion/Makefile
index 2eca54b65906..9433605cd290 100644
--- a/arch/arm/plat-orion/Makefile
+++ b/arch/arm/plat-orion/Makefile
@@ -3,6 +3,6 @@
3# 3#
4ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include 4ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include
5 5
6orion-gpio-$(CONFIG_GENERIC_GPIO) += gpio.o 6orion-gpio-$(CONFIG_GPIOLIB) += gpio.o
7obj-$(CONFIG_PLAT_ORION_LEGACY) += irq.o pcie.o time.o common.o mpp.o 7obj-$(CONFIG_PLAT_ORION_LEGACY) += irq.o pcie.o time.o common.o mpp.o
8obj-$(CONFIG_PLAT_ORION_LEGACY) += $(orion-gpio-y) 8obj-$(CONFIG_PLAT_ORION_LEGACY) += $(orion-gpio-y)
diff --git a/arch/arm/plat-orion/gpio.c b/arch/arm/plat-orion/gpio.c
index e39c2ba6e2fb..249fe6333e18 100644
--- a/arch/arm/plat-orion/gpio.c
+++ b/arch/arm/plat-orion/gpio.c
@@ -150,7 +150,7 @@ err_out:
150} 150}
151 151
152/* 152/*
153 * GENERIC_GPIO primitives. 153 * GPIO primitives.
154 */ 154 */
155static int orion_gpio_request(struct gpio_chip *chip, unsigned pin) 155static int orion_gpio_request(struct gpio_chip *chip, unsigned pin)
156{ 156{
diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
index 8dc0605a9ce9..d30042e39974 100644
--- a/arch/arm/xen/enlighten.c
+++ b/arch/arm/xen/enlighten.c
@@ -2,6 +2,7 @@
2#include <xen/events.h> 2#include <xen/events.h>
3#include <xen/grant_table.h> 3#include <xen/grant_table.h>
4#include <xen/hvm.h> 4#include <xen/hvm.h>
5#include <xen/interface/vcpu.h>
5#include <xen/interface/xen.h> 6#include <xen/interface/xen.h>
6#include <xen/interface/memory.h> 7#include <xen/interface/memory.h>
7#include <xen/interface/hvm/params.h> 8#include <xen/interface/hvm/params.h>
@@ -9,9 +10,11 @@
9#include <xen/platform_pci.h> 10#include <xen/platform_pci.h>
10#include <xen/xenbus.h> 11#include <xen/xenbus.h>
11#include <xen/page.h> 12#include <xen/page.h>
13#include <xen/interface/sched.h>
12#include <xen/xen-ops.h> 14#include <xen/xen-ops.h>
13#include <asm/xen/hypervisor.h> 15#include <asm/xen/hypervisor.h>
14#include <asm/xen/hypercall.h> 16#include <asm/xen/hypercall.h>
17#include <asm/system_misc.h>
15#include <linux/interrupt.h> 18#include <linux/interrupt.h>
16#include <linux/irqreturn.h> 19#include <linux/irqreturn.h>
17#include <linux/module.h> 20#include <linux/module.h>
@@ -32,6 +35,7 @@ struct shared_info xen_dummy_shared_info;
32struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info; 35struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info;
33 36
34DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); 37DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu);
38static struct vcpu_info __percpu *xen_vcpu_info;
35 39
36/* These are unused until we support booting "pre-ballooned" */ 40/* These are unused until we support booting "pre-ballooned" */
37unsigned long xen_released_pages; 41unsigned long xen_released_pages;
@@ -148,6 +152,47 @@ int xen_unmap_domain_mfn_range(struct vm_area_struct *vma,
148} 152}
149EXPORT_SYMBOL_GPL(xen_unmap_domain_mfn_range); 153EXPORT_SYMBOL_GPL(xen_unmap_domain_mfn_range);
150 154
155static int __init xen_secondary_init(unsigned int cpu)
156{
157 struct vcpu_register_vcpu_info info;
158 struct vcpu_info *vcpup;
159 int err;
160
161 pr_info("Xen: initializing cpu%d\n", cpu);
162 vcpup = per_cpu_ptr(xen_vcpu_info, cpu);
163
164 info.mfn = __pa(vcpup) >> PAGE_SHIFT;
165 info.offset = offset_in_page(vcpup);
166
167 err = HYPERVISOR_vcpu_op(VCPUOP_register_vcpu_info, cpu, &info);
168 if (err) {
169 pr_debug("register_vcpu_info failed: err=%d\n", err);
170 } else {
171 /* This cpu is using the registered vcpu info, even if
172 later ones fail to. */
173 per_cpu(xen_vcpu, cpu) = vcpup;
174 }
175 return 0;
176}
177
178static void xen_restart(char str, const char *cmd)
179{
180 struct sched_shutdown r = { .reason = SHUTDOWN_reboot };
181 int rc;
182 rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r);
183 if (rc)
184 BUG();
185}
186
187static void xen_power_off(void)
188{
189 struct sched_shutdown r = { .reason = SHUTDOWN_poweroff };
190 int rc;
191 rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r);
192 if (rc)
193 BUG();
194}
195
151/* 196/*
152 * see Documentation/devicetree/bindings/arm/xen.txt for the 197 * see Documentation/devicetree/bindings/arm/xen.txt for the
153 * documentation of the Xen Device Tree format. 198 * documentation of the Xen Device Tree format.
@@ -163,6 +208,7 @@ static int __init xen_guest_init(void)
163 const char *version = NULL; 208 const char *version = NULL;
164 const char *xen_prefix = "xen,xen-"; 209 const char *xen_prefix = "xen,xen-";
165 struct resource res; 210 struct resource res;
211 int i;
166 212
167 node = of_find_compatible_node(NULL, NULL, "xen,xen"); 213 node = of_find_compatible_node(NULL, NULL, "xen,xen");
168 if (!node) { 214 if (!node) {
@@ -209,18 +255,26 @@ static int __init xen_guest_init(void)
209 255
210 /* xen_vcpu is a pointer to the vcpu_info struct in the shared_info 256 /* xen_vcpu is a pointer to the vcpu_info struct in the shared_info
211 * page, we use it in the event channel upcall and in some pvclock 257 * page, we use it in the event channel upcall and in some pvclock
212 * related functions. We don't need the vcpu_info placement 258 * related functions.
213 * optimizations because we don't use any pv_mmu or pv_irq op on
214 * HVM.
215 * The shared info contains exactly 1 CPU (the boot CPU). The guest 259 * The shared info contains exactly 1 CPU (the boot CPU). The guest
216 * is required to use VCPUOP_register_vcpu_info to place vcpu info 260 * is required to use VCPUOP_register_vcpu_info to place vcpu info
217 * for secondary CPUs as they are brought up. */ 261 * for secondary CPUs as they are brought up.
218 per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; 262 * For uniformity we use VCPUOP_register_vcpu_info even on cpu0.
263 */
264 xen_vcpu_info = __alloc_percpu(sizeof(struct vcpu_info),
265 sizeof(struct vcpu_info));
266 if (xen_vcpu_info == NULL)
267 return -ENOMEM;
268 for_each_online_cpu(i)
269 xen_secondary_init(i);
219 270
220 gnttab_init(); 271 gnttab_init();
221 if (!xen_initial_domain()) 272 if (!xen_initial_domain())
222 xenbus_probe(NULL); 273 xenbus_probe(NULL);
223 274
275 pm_power_off = xen_power_off;
276 arm_pm_restart = xen_restart;
277
224 return 0; 278 return 0;
225} 279}
226core_initcall(xen_guest_init); 280core_initcall(xen_guest_init);
@@ -231,6 +285,11 @@ static irqreturn_t xen_arm_callback(int irq, void *arg)
231 return IRQ_HANDLED; 285 return IRQ_HANDLED;
232} 286}
233 287
288static __init void xen_percpu_enable_events(void *unused)
289{
290 enable_percpu_irq(xen_events_irq, 0);
291}
292
234static int __init xen_init_events(void) 293static int __init xen_init_events(void)
235{ 294{
236 if (!xen_domain() || xen_events_irq < 0) 295 if (!xen_domain() || xen_events_irq < 0)
@@ -239,12 +298,12 @@ static int __init xen_init_events(void)
239 xen_init_IRQ(); 298 xen_init_IRQ();
240 299
241 if (request_percpu_irq(xen_events_irq, xen_arm_callback, 300 if (request_percpu_irq(xen_events_irq, xen_arm_callback,
242 "events", xen_vcpu)) { 301 "events", &xen_vcpu)) {
243 pr_err("Error requesting IRQ %d\n", xen_events_irq); 302 pr_err("Error requesting IRQ %d\n", xen_events_irq);
244 return -EINVAL; 303 return -EINVAL;
245 } 304 }
246 305
247 enable_percpu_irq(xen_events_irq, 0); 306 on_each_cpu(xen_percpu_enable_events, NULL, 0);
248 307
249 return 0; 308 return 0;
250} 309}
@@ -259,4 +318,5 @@ EXPORT_SYMBOL_GPL(HYPERVISOR_sched_op);
259EXPORT_SYMBOL_GPL(HYPERVISOR_hvm_op); 318EXPORT_SYMBOL_GPL(HYPERVISOR_hvm_op);
260EXPORT_SYMBOL_GPL(HYPERVISOR_memory_op); 319EXPORT_SYMBOL_GPL(HYPERVISOR_memory_op);
261EXPORT_SYMBOL_GPL(HYPERVISOR_physdev_op); 320EXPORT_SYMBOL_GPL(HYPERVISOR_physdev_op);
321EXPORT_SYMBOL_GPL(HYPERVISOR_vcpu_op);
262EXPORT_SYMBOL_GPL(privcmd_call); 322EXPORT_SYMBOL_GPL(privcmd_call);
diff --git a/arch/arm/xen/hypercall.S b/arch/arm/xen/hypercall.S
index 71f723984cbd..199cb2da7663 100644
--- a/arch/arm/xen/hypercall.S
+++ b/arch/arm/xen/hypercall.S
@@ -87,6 +87,7 @@ HYPERCALL2(event_channel_op);
87HYPERCALL2(hvm_op); 87HYPERCALL2(hvm_op);
88HYPERCALL2(memory_op); 88HYPERCALL2(memory_op);
89HYPERCALL2(physdev_op); 89HYPERCALL2(physdev_op);
90HYPERCALL3(vcpu_op);
90 91
91ENTRY(privcmd_call) 92ENTRY(privcmd_call)
92 stmdb sp!, {r4} 93 stmdb sp!, {r4}