diff options
Diffstat (limited to 'arch/arm')
45 files changed, 183 insertions, 229 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index d423d58f938d..49d993cee512 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -38,6 +38,7 @@ config ARM | |||
38 | select HAVE_GENERIC_HARDIRQS | 38 | select HAVE_GENERIC_HARDIRQS |
39 | select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7)) | 39 | select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7)) |
40 | select HAVE_IDE if PCI || ISA || PCMCIA | 40 | select HAVE_IDE if PCI || ISA || PCMCIA |
41 | select HAVE_IRQ_TIME_ACCOUNTING | ||
41 | select HAVE_KERNEL_GZIP | 42 | select HAVE_KERNEL_GZIP |
42 | select HAVE_KERNEL_LZMA | 43 | select HAVE_KERNEL_LZMA |
43 | select HAVE_KERNEL_LZO | 44 | select HAVE_KERNEL_LZO |
@@ -488,7 +489,7 @@ config ARCH_IXP4XX | |||
488 | config ARCH_DOVE | 489 | config ARCH_DOVE |
489 | bool "Marvell Dove" | 490 | bool "Marvell Dove" |
490 | select ARCH_REQUIRE_GPIOLIB | 491 | select ARCH_REQUIRE_GPIOLIB |
491 | select CPU_V7 | 492 | select CPU_PJ4 |
492 | select GENERIC_CLOCKEVENTS | 493 | select GENERIC_CLOCKEVENTS |
493 | select MIGHT_HAVE_PCI | 494 | select MIGHT_HAVE_PCI |
494 | select PINCTRL | 495 | select PINCTRL |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 47374085befd..1ba358ba16b8 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -309,7 +309,7 @@ define archhelp | |||
309 | echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)' | 309 | echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)' |
310 | echo '* xipImage - XIP kernel image, if configured (arch/$(ARCH)/boot/xipImage)' | 310 | echo '* xipImage - XIP kernel image, if configured (arch/$(ARCH)/boot/xipImage)' |
311 | echo ' uImage - U-Boot wrapped zImage' | 311 | echo ' uImage - U-Boot wrapped zImage' |
312 | echo ' bootpImage - Combined zImage and initial RAM disk' | 312 | echo ' bootpImage - Combined zImage and initial RAM disk' |
313 | echo ' (supply initrd image via make variable INITRD=<path>)' | 313 | echo ' (supply initrd image via make variable INITRD=<path>)' |
314 | echo '* dtbs - Build device tree blobs for enabled boards' | 314 | echo '* dtbs - Build device tree blobs for enabled boards' |
315 | echo ' install - Install uncompressed kernel' | 315 | echo ' install - Install uncompressed kernel' |
diff --git a/arch/arm/boot/dts/armada-370-xp.dtsi b/arch/arm/boot/dts/armada-370-xp.dtsi index 272bbc65fab0..550eb772c30e 100644 --- a/arch/arm/boot/dts/armada-370-xp.dtsi +++ b/arch/arm/boot/dts/armada-370-xp.dtsi | |||
@@ -33,7 +33,8 @@ | |||
33 | #size-cells = <1>; | 33 | #size-cells = <1>; |
34 | compatible = "simple-bus"; | 34 | compatible = "simple-bus"; |
35 | interrupt-parent = <&mpic>; | 35 | interrupt-parent = <&mpic>; |
36 | ranges = <0 0 0xd0000000 0x100000>; | 36 | ranges = <0 0 0xd0000000 0x0100000 /* internal registers */ |
37 | 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */>; | ||
37 | 38 | ||
38 | internal-regs { | 39 | internal-regs { |
39 | compatible = "simple-bus"; | 40 | compatible = "simple-bus"; |
diff --git a/arch/arm/boot/dts/armada-370.dtsi b/arch/arm/boot/dts/armada-370.dtsi index b2c1b5af9749..aee2b1866ce2 100644 --- a/arch/arm/boot/dts/armada-370.dtsi +++ b/arch/arm/boot/dts/armada-370.dtsi | |||
@@ -29,7 +29,8 @@ | |||
29 | }; | 29 | }; |
30 | 30 | ||
31 | soc { | 31 | soc { |
32 | ranges = <0 0xd0000000 0x100000>; | 32 | ranges = <0 0xd0000000 0x0100000 /* internal registers */ |
33 | 0xe0000000 0xe0000000 0x8100000 /* PCIe */>; | ||
33 | internal-regs { | 34 | internal-regs { |
34 | system-controller@18200 { | 35 | system-controller@18200 { |
35 | compatible = "marvell,armada-370-xp-system-controller"; | 36 | compatible = "marvell,armada-370-xp-system-controller"; |
@@ -38,12 +39,12 @@ | |||
38 | 39 | ||
39 | L2: l2-cache { | 40 | L2: l2-cache { |
40 | compatible = "marvell,aurora-outer-cache"; | 41 | compatible = "marvell,aurora-outer-cache"; |
41 | reg = <0xd0008000 0x1000>; | 42 | reg = <0x08000 0x1000>; |
42 | cache-id-part = <0x100>; | 43 | cache-id-part = <0x100>; |
43 | wt-override; | 44 | wt-override; |
44 | }; | 45 | }; |
45 | 46 | ||
46 | mpic: interrupt-controller@20000 { | 47 | interrupt-controller@20000 { |
47 | reg = <0x20a00 0x1d0>, <0x21870 0x58>; | 48 | reg = <0x20a00 0x1d0>, <0x21870 0x58>; |
48 | }; | 49 | }; |
49 | 50 | ||
diff --git a/arch/arm/boot/dts/armada-xp-gp.dts b/arch/arm/boot/dts/armada-xp-gp.dts index 26ad06fc147e..3ee63d128e27 100644 --- a/arch/arm/boot/dts/armada-xp-gp.dts +++ b/arch/arm/boot/dts/armada-xp-gp.dts | |||
@@ -39,6 +39,9 @@ | |||
39 | }; | 39 | }; |
40 | 40 | ||
41 | soc { | 41 | soc { |
42 | ranges = <0 0 0xd0000000 0x100000 | ||
43 | 0xf0000000 0 0xf0000000 0x1000000>; | ||
44 | |||
42 | internal-regs { | 45 | internal-regs { |
43 | serial@12000 { | 46 | serial@12000 { |
44 | clock-frequency = <250000000>; | 47 | clock-frequency = <250000000>; |
diff --git a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts index f14d36c46159..46b785064dd8 100644 --- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts +++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts | |||
@@ -27,6 +27,9 @@ | |||
27 | }; | 27 | }; |
28 | 28 | ||
29 | soc { | 29 | soc { |
30 | ranges = <0 0 0xd0000000 0x100000 | ||
31 | 0xf0000000 0 0xf0000000 0x8000000>; | ||
32 | |||
30 | internal-regs { | 33 | internal-regs { |
31 | serial@12000 { | 34 | serial@12000 { |
32 | clock-frequency = <250000000>; | 35 | clock-frequency = <250000000>; |
diff --git a/arch/arm/boot/dts/armada-xp.dtsi b/arch/arm/boot/dts/armada-xp.dtsi index bacab11c10dc..5b902f9a3af2 100644 --- a/arch/arm/boot/dts/armada-xp.dtsi +++ b/arch/arm/boot/dts/armada-xp.dtsi | |||
@@ -31,7 +31,7 @@ | |||
31 | wt-override; | 31 | wt-override; |
32 | }; | 32 | }; |
33 | 33 | ||
34 | mpic: interrupt-controller@20000 { | 34 | interrupt-controller@20000 { |
35 | reg = <0x20a00 0x2d0>, <0x21070 0x58>; | 35 | reg = <0x20a00 0x2d0>, <0x21070 0x58>; |
36 | }; | 36 | }; |
37 | 37 | ||
diff --git a/arch/arm/boot/dts/at91sam9x25ek.dts b/arch/arm/boot/dts/at91sam9x25ek.dts index 3b40d11d65e7..315250b4995e 100644 --- a/arch/arm/boot/dts/at91sam9x25ek.dts +++ b/arch/arm/boot/dts/at91sam9x25ek.dts | |||
@@ -11,7 +11,7 @@ | |||
11 | /include/ "at91sam9x5ek.dtsi" | 11 | /include/ "at91sam9x5ek.dtsi" |
12 | 12 | ||
13 | / { | 13 | / { |
14 | model = "Atmel AT91SAM9G25-EK"; | 14 | model = "Atmel AT91SAM9X25-EK"; |
15 | compatible = "atmel,at91sam9x25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; | 15 | compatible = "atmel,at91sam9x25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; |
16 | 16 | ||
17 | ahb { | 17 | ahb { |
diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 82a404da1c0d..99ba6e14ebf3 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi | |||
@@ -516,7 +516,7 @@ | |||
516 | usb_otg_hs: usb_otg_hs@480ab000 { | 516 | usb_otg_hs: usb_otg_hs@480ab000 { |
517 | compatible = "ti,omap3-musb"; | 517 | compatible = "ti,omap3-musb"; |
518 | reg = <0x480ab000 0x1000>; | 518 | reg = <0x480ab000 0x1000>; |
519 | interrupts = <0 92 0x4>, <0 93 0x4>; | 519 | interrupts = <92>, <93>; |
520 | interrupt-names = "mc", "dma"; | 520 | interrupt-names = "mc", "dma"; |
521 | ti,hwmods = "usb_otg_hs"; | 521 | ti,hwmods = "usb_otg_hs"; |
522 | multipoint = <1>; | 522 | multipoint = <1>; |
diff --git a/arch/arm/boot/dts/sama5d3.dtsi b/arch/arm/boot/dts/sama5d3.dtsi index 2e643ea51cce..5000e0d42849 100644 --- a/arch/arm/boot/dts/sama5d3.dtsi +++ b/arch/arm/boot/dts/sama5d3.dtsi | |||
@@ -75,11 +75,6 @@ | |||
75 | compatible = "atmel,at91sam9x5-spi"; | 75 | compatible = "atmel,at91sam9x5-spi"; |
76 | reg = <0xf0004000 0x100>; | 76 | reg = <0xf0004000 0x100>; |
77 | interrupts = <24 4 3>; | 77 | interrupts = <24 4 3>; |
78 | cs-gpios = <&pioD 13 0 | ||
79 | &pioD 14 0 /* conflicts with SCK0 and CANRX0 */ | ||
80 | &pioD 15 0 /* conflicts with CTS0 and CANTX0 */ | ||
81 | &pioD 16 0 /* conflicts with RTS0 and PWMFI3 */ | ||
82 | >; | ||
83 | pinctrl-names = "default"; | 78 | pinctrl-names = "default"; |
84 | pinctrl-0 = <&pinctrl_spi0>; | 79 | pinctrl-0 = <&pinctrl_spi0>; |
85 | status = "disabled"; | 80 | status = "disabled"; |
@@ -156,7 +151,7 @@ | |||
156 | }; | 151 | }; |
157 | 152 | ||
158 | macb0: ethernet@f0028000 { | 153 | macb0: ethernet@f0028000 { |
159 | compatible = "cnds,pc302-gem", "cdns,gem"; | 154 | compatible = "cdns,pc302-gem", "cdns,gem"; |
160 | reg = <0xf0028000 0x100>; | 155 | reg = <0xf0028000 0x100>; |
161 | interrupts = <34 4 3>; | 156 | interrupts = <34 4 3>; |
162 | pinctrl-names = "default"; | 157 | pinctrl-names = "default"; |
@@ -203,11 +198,6 @@ | |||
203 | compatible = "atmel,at91sam9x5-spi"; | 198 | compatible = "atmel,at91sam9x5-spi"; |
204 | reg = <0xf8008000 0x100>; | 199 | reg = <0xf8008000 0x100>; |
205 | interrupts = <25 4 3>; | 200 | interrupts = <25 4 3>; |
206 | cs-gpios = <&pioC 25 0 | ||
207 | &pioC 26 0 /* conflitcs with TWD1 and ISI_D11 */ | ||
208 | &pioC 27 0 /* conflitcs with TWCK1 and ISI_D10 */ | ||
209 | &pioC 28 0 /* conflitcs with PWMFI0 and ISI_D9 */ | ||
210 | >; | ||
211 | pinctrl-names = "default"; | 201 | pinctrl-names = "default"; |
212 | pinctrl-0 = <&pinctrl_spi1>; | 202 | pinctrl-0 = <&pinctrl_spi1>; |
213 | status = "disabled"; | 203 | status = "disabled"; |
diff --git a/arch/arm/boot/dts/sama5d3xcm.dtsi b/arch/arm/boot/dts/sama5d3xcm.dtsi index 1f8ed404626c..b336e7787cb3 100644 --- a/arch/arm/boot/dts/sama5d3xcm.dtsi +++ b/arch/arm/boot/dts/sama5d3xcm.dtsi | |||
@@ -32,6 +32,10 @@ | |||
32 | 32 | ||
33 | ahb { | 33 | ahb { |
34 | apb { | 34 | apb { |
35 | spi0: spi@f0004000 { | ||
36 | cs-gpios = <&pioD 13 0>, <0>, <0>, <0>; | ||
37 | }; | ||
38 | |||
35 | macb0: ethernet@f0028000 { | 39 | macb0: ethernet@f0028000 { |
36 | phy-mode = "rgmii"; | 40 | phy-mode = "rgmii"; |
37 | }; | 41 | }; |
diff --git a/arch/arm/boot/dts/ste-nomadik-s8815.dts b/arch/arm/boot/dts/ste-nomadik-s8815.dts index b28fbf3408e3..6f82d9368948 100644 --- a/arch/arm/boot/dts/ste-nomadik-s8815.dts +++ b/arch/arm/boot/dts/ste-nomadik-s8815.dts | |||
@@ -14,13 +14,19 @@ | |||
14 | bootargs = "root=/dev/ram0 console=ttyAMA1,115200n8 earlyprintk"; | 14 | bootargs = "root=/dev/ram0 console=ttyAMA1,115200n8 earlyprintk"; |
15 | }; | 15 | }; |
16 | 16 | ||
17 | /* This is where the interrupt is routed on the S8815 board */ | ||
18 | external-bus@34000000 { | ||
19 | ethernet@300 { | ||
20 | interrupt-parent = <&gpio3>; | ||
21 | interrupts = <8 0x1>; | ||
22 | }; | ||
23 | }; | ||
24 | |||
17 | /* Custom board node with GPIO pins to active etc */ | 25 | /* Custom board node with GPIO pins to active etc */ |
18 | usb-s8815 { | 26 | usb-s8815 { |
19 | /* The S8815 is using this very GPIO pin for the SMSC91x IRQs */ | 27 | /* The S8815 is using this very GPIO pin for the SMSC91x IRQs */ |
20 | ethernet-gpio { | 28 | ethernet-gpio { |
21 | gpios = <&gpio3 19 0x1>; | 29 | gpios = <&gpio3 8 0x1>; |
22 | interrupts = <19 0x1>; | ||
23 | interrupt-parent = <&gpio3>; | ||
24 | }; | 30 | }; |
25 | /* This will bias the MMC/SD card detect line */ | 31 | /* This will bias the MMC/SD card detect line */ |
26 | mmcsd-gpio { | 32 | mmcsd-gpio { |
diff --git a/arch/arm/common/mcpm_platsmp.c b/arch/arm/common/mcpm_platsmp.c index 52b88d81b7bb..3caed0db6986 100644 --- a/arch/arm/common/mcpm_platsmp.c +++ b/arch/arm/common/mcpm_platsmp.c | |||
@@ -15,8 +15,6 @@ | |||
15 | #include <linux/smp.h> | 15 | #include <linux/smp.h> |
16 | #include <linux/spinlock.h> | 16 | #include <linux/spinlock.h> |
17 | 17 | ||
18 | #include <linux/irqchip/arm-gic.h> | ||
19 | |||
20 | #include <asm/mcpm.h> | 18 | #include <asm/mcpm.h> |
21 | #include <asm/smp.h> | 19 | #include <asm/smp.h> |
22 | #include <asm/smp_plat.h> | 20 | #include <asm/smp_plat.h> |
@@ -49,7 +47,6 @@ static int __cpuinit mcpm_boot_secondary(unsigned int cpu, struct task_struct *i | |||
49 | static void __cpuinit mcpm_secondary_init(unsigned int cpu) | 47 | static void __cpuinit mcpm_secondary_init(unsigned int cpu) |
50 | { | 48 | { |
51 | mcpm_cpu_powered_up(); | 49 | mcpm_cpu_powered_up(); |
52 | gic_secondary_init(0); | ||
53 | } | 50 | } |
54 | 51 | ||
55 | #ifdef CONFIG_HOTPLUG_CPU | 52 | #ifdef CONFIG_HOTPLUG_CPU |
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index c1ef64bc5abd..f59090210ec9 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig | |||
@@ -20,6 +20,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y | |||
20 | CONFIG_MODVERSIONS=y | 20 | CONFIG_MODVERSIONS=y |
21 | CONFIG_MODULE_SRCVERSION_ALL=y | 21 | CONFIG_MODULE_SRCVERSION_ALL=y |
22 | # CONFIG_BLK_DEV_BSG is not set | 22 | # CONFIG_BLK_DEV_BSG is not set |
23 | CONFIG_ARCH_MULTI_V6=y | ||
23 | CONFIG_ARCH_OMAP2PLUS=y | 24 | CONFIG_ARCH_OMAP2PLUS=y |
24 | CONFIG_OMAP_RESET_CLOCKS=y | 25 | CONFIG_OMAP_RESET_CLOCKS=y |
25 | CONFIG_OMAP_MUX_DEBUG=y | 26 | CONFIG_OMAP_MUX_DEBUG=y |
diff --git a/arch/arm/configs/tegra_defconfig b/arch/arm/configs/tegra_defconfig index a5f0485133cf..f7ba316164d4 100644 --- a/arch/arm/configs/tegra_defconfig +++ b/arch/arm/configs/tegra_defconfig | |||
@@ -153,6 +153,7 @@ CONFIG_MEDIA_CAMERA_SUPPORT=y | |||
153 | CONFIG_MEDIA_USB_SUPPORT=y | 153 | CONFIG_MEDIA_USB_SUPPORT=y |
154 | CONFIG_USB_VIDEO_CLASS=m | 154 | CONFIG_USB_VIDEO_CLASS=m |
155 | CONFIG_DRM=y | 155 | CONFIG_DRM=y |
156 | CONFIG_TEGRA_HOST1X=y | ||
156 | CONFIG_DRM_TEGRA=y | 157 | CONFIG_DRM_TEGRA=y |
157 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | 158 | CONFIG_BACKLIGHT_LCD_SUPPORT=y |
158 | # CONFIG_LCD_CLASS_DEVICE is not set | 159 | # CONFIG_LCD_CLASS_DEVICE is not set |
@@ -202,7 +203,7 @@ CONFIG_TEGRA20_APB_DMA=y | |||
202 | CONFIG_STAGING=y | 203 | CONFIG_STAGING=y |
203 | CONFIG_SENSORS_ISL29018=y | 204 | CONFIG_SENSORS_ISL29018=y |
204 | CONFIG_SENSORS_ISL29028=y | 205 | CONFIG_SENSORS_ISL29028=y |
205 | CONFIG_SENSORS_AK8975=y | 206 | CONFIG_AK8975=y |
206 | CONFIG_MFD_NVEC=y | 207 | CONFIG_MFD_NVEC=y |
207 | CONFIG_KEYBOARD_NVEC=y | 208 | CONFIG_KEYBOARD_NVEC=y |
208 | CONFIG_SERIO_NVEC_PS2=y | 209 | CONFIG_SERIO_NVEC_PS2=y |
diff --git a/arch/arm/include/asm/cmpxchg.h b/arch/arm/include/asm/cmpxchg.h index 7eb18c1d8d6c..4f009c10540d 100644 --- a/arch/arm/include/asm/cmpxchg.h +++ b/arch/arm/include/asm/cmpxchg.h | |||
@@ -233,15 +233,15 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr, | |||
233 | ((__typeof__(*(ptr)))atomic64_cmpxchg(container_of((ptr), \ | 233 | ((__typeof__(*(ptr)))atomic64_cmpxchg(container_of((ptr), \ |
234 | atomic64_t, \ | 234 | atomic64_t, \ |
235 | counter), \ | 235 | counter), \ |
236 | (unsigned long)(o), \ | 236 | (unsigned long long)(o), \ |
237 | (unsigned long)(n))) | 237 | (unsigned long long)(n))) |
238 | 238 | ||
239 | #define cmpxchg64_local(ptr, o, n) \ | 239 | #define cmpxchg64_local(ptr, o, n) \ |
240 | ((__typeof__(*(ptr)))local64_cmpxchg(container_of((ptr), \ | 240 | ((__typeof__(*(ptr)))local64_cmpxchg(container_of((ptr), \ |
241 | local64_t, \ | 241 | local64_t, \ |
242 | a), \ | 242 | a), \ |
243 | (unsigned long)(o), \ | 243 | (unsigned long long)(o), \ |
244 | (unsigned long)(n))) | 244 | (unsigned long long)(n))) |
245 | 245 | ||
246 | #endif /* __LINUX_ARM_ARCH__ >= 6 */ | 246 | #endif /* __LINUX_ARM_ARCH__ >= 6 */ |
247 | 247 | ||
diff --git a/arch/arm/include/debug/ux500.S b/arch/arm/include/debug/ux500.S index 2848857f5b62..fbd24beeb1fa 100644 --- a/arch/arm/include/debug/ux500.S +++ b/arch/arm/include/debug/ux500.S | |||
@@ -24,9 +24,9 @@ | |||
24 | #define U8500_UART0_PHYS_BASE (0x80120000) | 24 | #define U8500_UART0_PHYS_BASE (0x80120000) |
25 | #define U8500_UART1_PHYS_BASE (0x80121000) | 25 | #define U8500_UART1_PHYS_BASE (0x80121000) |
26 | #define U8500_UART2_PHYS_BASE (0x80007000) | 26 | #define U8500_UART2_PHYS_BASE (0x80007000) |
27 | #define U8500_UART0_VIRT_BASE (0xa8120000) | 27 | #define U8500_UART0_VIRT_BASE (0xf8120000) |
28 | #define U8500_UART1_VIRT_BASE (0xa8121000) | 28 | #define U8500_UART1_VIRT_BASE (0xf8121000) |
29 | #define U8500_UART2_VIRT_BASE (0xa8007000) | 29 | #define U8500_UART2_VIRT_BASE (0xf8007000) |
30 | #define __UX500_PHYS_UART(n) U8500_UART##n##_PHYS_BASE | 30 | #define __UX500_PHYS_UART(n) U8500_UART##n##_PHYS_BASE |
31 | #define __UX500_VIRT_UART(n) U8500_UART##n##_VIRT_BASE | 31 | #define __UX500_VIRT_UART(n) U8500_UART##n##_VIRT_BASE |
32 | #endif | 32 | #endif |
diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c index 2acdff4c1dfe..180b3024bec3 100644 --- a/arch/arm/mach-at91/at91rm9200_time.c +++ b/arch/arm/mach-at91/at91rm9200_time.c | |||
@@ -174,6 +174,7 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev) | |||
174 | static struct clock_event_device clkevt = { | 174 | static struct clock_event_device clkevt = { |
175 | .name = "at91_tick", | 175 | .name = "at91_tick", |
176 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, | 176 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, |
177 | .shift = 32, | ||
177 | .rating = 150, | 178 | .rating = 150, |
178 | .set_next_event = clkevt32k_next_event, | 179 | .set_next_event = clkevt32k_next_event, |
179 | .set_mode = clkevt32k_mode, | 180 | .set_mode = clkevt32k_mode, |
@@ -264,9 +265,11 @@ void __init at91rm9200_timer_init(void) | |||
264 | at91_st_write(AT91_ST_RTMR, 1); | 265 | at91_st_write(AT91_ST_RTMR, 1); |
265 | 266 | ||
266 | /* Setup timer clockevent, with minimum of two ticks (important!!) */ | 267 | /* Setup timer clockevent, with minimum of two ticks (important!!) */ |
268 | clkevt.mult = div_sc(AT91_SLOW_CLOCK, NSEC_PER_SEC, clkevt.shift); | ||
269 | clkevt.max_delta_ns = clockevent_delta2ns(AT91_ST_ALMV, &clkevt); | ||
270 | clkevt.min_delta_ns = clockevent_delta2ns(2, &clkevt) + 1; | ||
267 | clkevt.cpumask = cpumask_of(0); | 271 | clkevt.cpumask = cpumask_of(0); |
268 | clockevents_config_and_register(&clkevt, AT91_SLOW_CLOCK, | 272 | clockevents_register_device(&clkevt); |
269 | 2, AT91_ST_ALMV); | ||
270 | 273 | ||
271 | /* register clocksource */ | 274 | /* register clocksource */ |
272 | clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK); | 275 | clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK); |
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index 151259003086..dda9a2bd3acb 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
@@ -177,7 +177,8 @@ int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode) | |||
177 | static const char *step_sels[] = { "osc", "pll2_pfd2_396m", }; | 177 | static const char *step_sels[] = { "osc", "pll2_pfd2_396m", }; |
178 | static const char *pll1_sw_sels[] = { "pll1_sys", "step", }; | 178 | static const char *pll1_sw_sels[] = { "pll1_sys", "step", }; |
179 | static const char *periph_pre_sels[] = { "pll2_bus", "pll2_pfd2_396m", "pll2_pfd0_352m", "pll2_198m", }; | 179 | static const char *periph_pre_sels[] = { "pll2_bus", "pll2_pfd2_396m", "pll2_pfd0_352m", "pll2_198m", }; |
180 | static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", }; | 180 | static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", "osc", "dummy", }; |
181 | static const char *periph2_clk2_sels[] = { "pll3_usb_otg", "pll2_bus", }; | ||
181 | static const char *periph_sels[] = { "periph_pre", "periph_clk2", }; | 182 | static const char *periph_sels[] = { "periph_pre", "periph_clk2", }; |
182 | static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", }; | 183 | static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", }; |
183 | static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | 184 | static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "pll3_pfd1_540m", }; |
@@ -185,7 +186,7 @@ static const char *audio_sels[] = { "pll4_post_div", "pll3_pfd2_508m", "pll3_pfd | |||
185 | static const char *gpu_axi_sels[] = { "axi", "ahb", }; | 186 | static const char *gpu_axi_sels[] = { "axi", "ahb", }; |
186 | static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", }; | 187 | static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", }; |
187 | static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", }; | 188 | static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", }; |
188 | static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd9_720m", }; | 189 | static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll3_pfd0_720m", }; |
189 | static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; | 190 | static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; |
190 | static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", }; | 191 | static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", }; |
191 | static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | 192 | static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; |
@@ -369,8 +370,8 @@ int __init mx6q_clocks_init(void) | |||
369 | clk[pll1_sw] = imx_clk_mux("pll1_sw", base + 0xc, 2, 1, pll1_sw_sels, ARRAY_SIZE(pll1_sw_sels)); | 370 | clk[pll1_sw] = imx_clk_mux("pll1_sw", base + 0xc, 2, 1, pll1_sw_sels, ARRAY_SIZE(pll1_sw_sels)); |
370 | clk[periph_pre] = imx_clk_mux("periph_pre", base + 0x18, 18, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels)); | 371 | clk[periph_pre] = imx_clk_mux("periph_pre", base + 0x18, 18, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels)); |
371 | clk[periph2_pre] = imx_clk_mux("periph2_pre", base + 0x18, 21, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels)); | 372 | clk[periph2_pre] = imx_clk_mux("periph2_pre", base + 0x18, 21, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels)); |
372 | clk[periph_clk2_sel] = imx_clk_mux("periph_clk2_sel", base + 0x18, 12, 1, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels)); | 373 | clk[periph_clk2_sel] = imx_clk_mux("periph_clk2_sel", base + 0x18, 12, 2, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels)); |
373 | clk[periph2_clk2_sel] = imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels)); | 374 | clk[periph2_clk2_sel] = imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph2_clk2_sels, ARRAY_SIZE(periph2_clk2_sels)); |
374 | clk[axi_sel] = imx_clk_mux("axi_sel", base + 0x14, 6, 2, axi_sels, ARRAY_SIZE(axi_sels)); | 375 | clk[axi_sel] = imx_clk_mux("axi_sel", base + 0x14, 6, 2, axi_sels, ARRAY_SIZE(axi_sels)); |
375 | clk[esai_sel] = imx_clk_mux("esai_sel", base + 0x20, 19, 2, audio_sels, ARRAY_SIZE(audio_sels)); | 376 | clk[esai_sel] = imx_clk_mux("esai_sel", base + 0x20, 19, 2, audio_sels, ARRAY_SIZE(audio_sels)); |
376 | clk[asrc_sel] = imx_clk_mux("asrc_sel", base + 0x30, 7, 2, audio_sels, ARRAY_SIZE(audio_sels)); | 377 | clk[asrc_sel] = imx_clk_mux("asrc_sel", base + 0x30, 7, 2, audio_sels, ARRAY_SIZE(audio_sels)); |
@@ -498,7 +499,7 @@ int __init mx6q_clocks_init(void) | |||
498 | clk[ldb_di1] = imx_clk_gate2("ldb_di1", "ldb_di1_podf", base + 0x74, 14); | 499 | clk[ldb_di1] = imx_clk_gate2("ldb_di1", "ldb_di1_podf", base + 0x74, 14); |
499 | clk[ipu2_di1] = imx_clk_gate2("ipu2_di1", "ipu2_di1_sel", base + 0x74, 10); | 500 | clk[ipu2_di1] = imx_clk_gate2("ipu2_di1", "ipu2_di1_sel", base + 0x74, 10); |
500 | clk[hsi_tx] = imx_clk_gate2("hsi_tx", "hsi_tx_podf", base + 0x74, 16); | 501 | clk[hsi_tx] = imx_clk_gate2("hsi_tx", "hsi_tx_podf", base + 0x74, 16); |
501 | clk[mlb] = imx_clk_gate2("mlb", "pll8_mlb", base + 0x74, 18); | 502 | clk[mlb] = imx_clk_gate2("mlb", "axi", base + 0x74, 18); |
502 | clk[mmdc_ch0_axi] = imx_clk_gate2("mmdc_ch0_axi", "mmdc_ch0_axi_podf", base + 0x74, 20); | 503 | clk[mmdc_ch0_axi] = imx_clk_gate2("mmdc_ch0_axi", "mmdc_ch0_axi_podf", base + 0x74, 20); |
503 | clk[mmdc_ch1_axi] = imx_clk_gate2("mmdc_ch1_axi", "mmdc_ch1_axi_podf", base + 0x74, 22); | 504 | clk[mmdc_ch1_axi] = imx_clk_gate2("mmdc_ch1_axi", "mmdc_ch1_axi_podf", base + 0x74, 22); |
504 | clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28); | 505 | clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28); |
diff --git a/arch/arm/mach-imx/headsmp.S b/arch/arm/mach-imx/headsmp.S index 67b9c48dcafe..627f16f0e9d1 100644 --- a/arch/arm/mach-imx/headsmp.S +++ b/arch/arm/mach-imx/headsmp.S | |||
@@ -18,8 +18,20 @@ | |||
18 | .section ".text.head", "ax" | 18 | .section ".text.head", "ax" |
19 | 19 | ||
20 | #ifdef CONFIG_SMP | 20 | #ifdef CONFIG_SMP |
21 | diag_reg_offset: | ||
22 | .word g_diag_reg - . | ||
23 | |||
24 | .macro set_diag_reg | ||
25 | adr r0, diag_reg_offset | ||
26 | ldr r1, [r0] | ||
27 | add r1, r1, r0 @ r1 = physical &g_diag_reg | ||
28 | ldr r0, [r1] | ||
29 | mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register | ||
30 | .endm | ||
31 | |||
21 | ENTRY(v7_secondary_startup) | 32 | ENTRY(v7_secondary_startup) |
22 | bl v7_invalidate_l1 | 33 | bl v7_invalidate_l1 |
34 | set_diag_reg | ||
23 | b secondary_startup | 35 | b secondary_startup |
24 | ENDPROC(v7_secondary_startup) | 36 | ENDPROC(v7_secondary_startup) |
25 | #endif | 37 | #endif |
diff --git a/arch/arm/mach-imx/platsmp.c b/arch/arm/mach-imx/platsmp.c index 4a69305db65e..c6e1ab544882 100644 --- a/arch/arm/mach-imx/platsmp.c +++ b/arch/arm/mach-imx/platsmp.c | |||
@@ -12,6 +12,7 @@ | |||
12 | 12 | ||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/smp.h> | 14 | #include <linux/smp.h> |
15 | #include <asm/cacheflush.h> | ||
15 | #include <asm/page.h> | 16 | #include <asm/page.h> |
16 | #include <asm/smp_scu.h> | 17 | #include <asm/smp_scu.h> |
17 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
@@ -21,6 +22,7 @@ | |||
21 | 22 | ||
22 | #define SCU_STANDBY_ENABLE (1 << 5) | 23 | #define SCU_STANDBY_ENABLE (1 << 5) |
23 | 24 | ||
25 | u32 g_diag_reg; | ||
24 | static void __iomem *scu_base; | 26 | static void __iomem *scu_base; |
25 | 27 | ||
26 | static struct map_desc scu_io_desc __initdata = { | 28 | static struct map_desc scu_io_desc __initdata = { |
@@ -80,6 +82,18 @@ void imx_smp_prepare(void) | |||
80 | static void __init imx_smp_prepare_cpus(unsigned int max_cpus) | 82 | static void __init imx_smp_prepare_cpus(unsigned int max_cpus) |
81 | { | 83 | { |
82 | imx_smp_prepare(); | 84 | imx_smp_prepare(); |
85 | |||
86 | /* | ||
87 | * The diagnostic register holds the errata bits. Mostly bootloader | ||
88 | * does not bring up secondary cores, so that when errata bits are set | ||
89 | * in bootloader, they are set only for boot cpu. But on a SMP | ||
90 | * configuration, it should be equally done on every single core. | ||
91 | * Read the register from boot cpu here, and will replicate it into | ||
92 | * secondary cores when booting them. | ||
93 | */ | ||
94 | asm("mrc p15, 0, %0, c15, c0, 1" : "=r" (g_diag_reg) : : "cc"); | ||
95 | __cpuc_flush_dcache_area(&g_diag_reg, sizeof(g_diag_reg)); | ||
96 | outer_clean_range(__pa(&g_diag_reg), __pa(&g_diag_reg + 1)); | ||
83 | } | 97 | } |
84 | 98 | ||
85 | struct smp_operations imx_smp_ops __initdata = { | 99 | struct smp_operations imx_smp_ops __initdata = { |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index c2cae69e6d2b..f38922897563 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
@@ -528,12 +528,6 @@ void __init kirkwood_init_early(void) | |||
528 | { | 528 | { |
529 | orion_time_set_base(TIMER_VIRT_BASE); | 529 | orion_time_set_base(TIMER_VIRT_BASE); |
530 | 530 | ||
531 | /* | ||
532 | * Some Kirkwood devices allocate their coherent buffers from atomic | ||
533 | * context. Increase size of atomic coherent pool to make sure such | ||
534 | * the allocations won't fail. | ||
535 | */ | ||
536 | init_dma_coherent_pool_size(SZ_1M); | ||
537 | mvebu_mbus_init("marvell,kirkwood-mbus", | 531 | mvebu_mbus_init("marvell,kirkwood-mbus", |
538 | BRIDGE_WINS_BASE, BRIDGE_WINS_SZ, | 532 | BRIDGE_WINS_BASE, BRIDGE_WINS_SZ, |
539 | DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ); | 533 | DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ); |
diff --git a/arch/arm/mach-kirkwood/ts219-setup.c b/arch/arm/mach-kirkwood/ts219-setup.c index 283abff90228..e1267d6b468f 100644 --- a/arch/arm/mach-kirkwood/ts219-setup.c +++ b/arch/arm/mach-kirkwood/ts219-setup.c | |||
@@ -124,7 +124,7 @@ static void __init qnap_ts219_init(void) | |||
124 | static int __init ts219_pci_init(void) | 124 | static int __init ts219_pci_init(void) |
125 | { | 125 | { |
126 | if (machine_is_ts219()) | 126 | if (machine_is_ts219()) |
127 | kirkwood_pcie_init(KW_PCIE0); | 127 | kirkwood_pcie_init(KW_PCIE1 | KW_PCIE0); |
128 | 128 | ||
129 | return 0; | 129 | return 0; |
130 | } | 130 | } |
diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig index e11acbb0a46d..80a8bcacd9d5 100644 --- a/arch/arm/mach-mvebu/Kconfig +++ b/arch/arm/mach-mvebu/Kconfig | |||
@@ -15,6 +15,7 @@ config ARCH_MVEBU | |||
15 | select MVEBU_CLK_GATING | 15 | select MVEBU_CLK_GATING |
16 | select MVEBU_MBUS | 16 | select MVEBU_MBUS |
17 | select ZONE_DMA if ARM_LPAE | 17 | select ZONE_DMA if ARM_LPAE |
18 | select ARCH_REQUIRE_GPIOLIB | ||
18 | 19 | ||
19 | if ARCH_MVEBU | 20 | if ARCH_MVEBU |
20 | 21 | ||
diff --git a/arch/arm/mach-mvebu/armada-370-xp.c b/arch/arm/mach-mvebu/armada-370-xp.c index 42a4cb3087e2..1c48890bb72b 100644 --- a/arch/arm/mach-mvebu/armada-370-xp.c +++ b/arch/arm/mach-mvebu/armada-370-xp.c | |||
@@ -54,13 +54,6 @@ void __init armada_370_xp_init_early(void) | |||
54 | char *mbus_soc_name; | 54 | char *mbus_soc_name; |
55 | 55 | ||
56 | /* | 56 | /* |
57 | * Some Armada 370/XP devices allocate their coherent buffers | ||
58 | * from atomic context. Increase size of atomic coherent pool | ||
59 | * to make sure such the allocations won't fail. | ||
60 | */ | ||
61 | init_dma_coherent_pool_size(SZ_1M); | ||
62 | |||
63 | /* | ||
64 | * This initialization will be replaced by a DT-based | 57 | * This initialization will be replaced by a DT-based |
65 | * initialization once the mvebu-mbus driver gains DT support. | 58 | * initialization once the mvebu-mbus driver gains DT support. |
66 | */ | 59 | */ |
diff --git a/arch/arm/mach-omap1/dma.c b/arch/arm/mach-omap1/dma.c index 68ab858e27b7..a94b3a718d1a 100644 --- a/arch/arm/mach-omap1/dma.c +++ b/arch/arm/mach-omap1/dma.c | |||
@@ -345,6 +345,7 @@ static int __init omap1_system_dma_init(void) | |||
345 | dev_err(&pdev->dev, | 345 | dev_err(&pdev->dev, |
346 | "%s: Memory allocation failed for d->chan!\n", | 346 | "%s: Memory allocation failed for d->chan!\n", |
347 | __func__); | 347 | __func__); |
348 | ret = -ENOMEM; | ||
348 | goto exit_release_d; | 349 | goto exit_release_d; |
349 | } | 350 | } |
350 | 351 | ||
diff --git a/arch/arm/mach-omap2/cclock33xx_data.c b/arch/arm/mach-omap2/cclock33xx_data.c index 6ebc7803bc3e..af3544ce4f02 100644 --- a/arch/arm/mach-omap2/cclock33xx_data.c +++ b/arch/arm/mach-omap2/cclock33xx_data.c | |||
@@ -454,9 +454,29 @@ DEFINE_CLK_GATE(cefuse_fck, "sys_clkin_ck", &sys_clkin_ck, 0x0, | |||
454 | */ | 454 | */ |
455 | DEFINE_CLK_FIXED_FACTOR(clkdiv32k_ck, "clk_24mhz", &clk_24mhz, 0x0, 1, 732); | 455 | DEFINE_CLK_FIXED_FACTOR(clkdiv32k_ck, "clk_24mhz", &clk_24mhz, 0x0, 1, 732); |
456 | 456 | ||
457 | DEFINE_CLK_GATE(clkdiv32k_ick, "clkdiv32k_ck", &clkdiv32k_ck, 0x0, | 457 | static struct clk clkdiv32k_ick; |
458 | AM33XX_CM_PER_CLKDIV32K_CLKCTRL, AM33XX_MODULEMODE_SWCTRL_SHIFT, | 458 | |
459 | 0x0, NULL); | 459 | static const char *clkdiv32k_ick_parent_names[] = { |
460 | "clkdiv32k_ck", | ||
461 | }; | ||
462 | |||
463 | static const struct clk_ops clkdiv32k_ick_ops = { | ||
464 | .enable = &omap2_dflt_clk_enable, | ||
465 | .disable = &omap2_dflt_clk_disable, | ||
466 | .is_enabled = &omap2_dflt_clk_is_enabled, | ||
467 | .init = &omap2_init_clk_clkdm, | ||
468 | }; | ||
469 | |||
470 | static struct clk_hw_omap clkdiv32k_ick_hw = { | ||
471 | .hw = { | ||
472 | .clk = &clkdiv32k_ick, | ||
473 | }, | ||
474 | .enable_reg = AM33XX_CM_PER_CLKDIV32K_CLKCTRL, | ||
475 | .enable_bit = AM33XX_MODULEMODE_SWCTRL_SHIFT, | ||
476 | .clkdm_name = "clk_24mhz_clkdm", | ||
477 | }; | ||
478 | |||
479 | DEFINE_STRUCT_CLK(clkdiv32k_ick, clkdiv32k_ick_parent_names, clkdiv32k_ick_ops); | ||
460 | 480 | ||
461 | /* "usbotg_fck" is an additional clock and not really a modulemode */ | 481 | /* "usbotg_fck" is an additional clock and not really a modulemode */ |
462 | DEFINE_CLK_GATE(usbotg_fck, "dpll_per_ck", &dpll_per_ck, 0x0, | 482 | DEFINE_CLK_GATE(usbotg_fck, "dpll_per_ck", &dpll_per_ck, 0x0, |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index d25a95fe9921..7341eff63f56 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -1356,13 +1356,27 @@ static void _enable_sysc(struct omap_hwmod *oh) | |||
1356 | 1356 | ||
1357 | clkdm = _get_clkdm(oh); | 1357 | clkdm = _get_clkdm(oh); |
1358 | if (sf & SYSC_HAS_SIDLEMODE) { | 1358 | if (sf & SYSC_HAS_SIDLEMODE) { |
1359 | if (oh->flags & HWMOD_SWSUP_SIDLE || | ||
1360 | oh->flags & HWMOD_SWSUP_SIDLE_ACT) { | ||
1361 | idlemode = HWMOD_IDLEMODE_NO; | ||
1362 | } else { | ||
1363 | if (sf & SYSC_HAS_ENAWAKEUP) | ||
1364 | _enable_wakeup(oh, &v); | ||
1365 | if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) | ||
1366 | idlemode = HWMOD_IDLEMODE_SMART_WKUP; | ||
1367 | else | ||
1368 | idlemode = HWMOD_IDLEMODE_SMART; | ||
1369 | } | ||
1370 | |||
1371 | /* | ||
1372 | * This is special handling for some IPs like | ||
1373 | * 32k sync timer. Force them to idle! | ||
1374 | */ | ||
1359 | clkdm_act = (clkdm && clkdm->flags & CLKDM_ACTIVE_WITH_MPU); | 1375 | clkdm_act = (clkdm && clkdm->flags & CLKDM_ACTIVE_WITH_MPU); |
1360 | if (clkdm_act && !(oh->class->sysc->idlemodes & | 1376 | if (clkdm_act && !(oh->class->sysc->idlemodes & |
1361 | (SIDLE_SMART | SIDLE_SMART_WKUP))) | 1377 | (SIDLE_SMART | SIDLE_SMART_WKUP))) |
1362 | idlemode = HWMOD_IDLEMODE_FORCE; | 1378 | idlemode = HWMOD_IDLEMODE_FORCE; |
1363 | else | 1379 | |
1364 | idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? | ||
1365 | HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; | ||
1366 | _set_slave_idlemode(oh, idlemode, &v); | 1380 | _set_slave_idlemode(oh, idlemode, &v); |
1367 | } | 1381 | } |
1368 | 1382 | ||
@@ -1391,10 +1405,6 @@ static void _enable_sysc(struct omap_hwmod *oh) | |||
1391 | (sf & SYSC_HAS_CLOCKACTIVITY)) | 1405 | (sf & SYSC_HAS_CLOCKACTIVITY)) |
1392 | _set_clockactivity(oh, oh->class->sysc->clockact, &v); | 1406 | _set_clockactivity(oh, oh->class->sysc->clockact, &v); |
1393 | 1407 | ||
1394 | /* If slave is in SMARTIDLE, also enable wakeup */ | ||
1395 | if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE)) | ||
1396 | _enable_wakeup(oh, &v); | ||
1397 | |||
1398 | _write_sysconfig(v, oh); | 1408 | _write_sysconfig(v, oh); |
1399 | 1409 | ||
1400 | /* | 1410 | /* |
@@ -1430,13 +1440,16 @@ static void _idle_sysc(struct omap_hwmod *oh) | |||
1430 | sf = oh->class->sysc->sysc_flags; | 1440 | sf = oh->class->sysc->sysc_flags; |
1431 | 1441 | ||
1432 | if (sf & SYSC_HAS_SIDLEMODE) { | 1442 | if (sf & SYSC_HAS_SIDLEMODE) { |
1433 | /* XXX What about HWMOD_IDLEMODE_SMART_WKUP? */ | 1443 | if (oh->flags & HWMOD_SWSUP_SIDLE) { |
1434 | if (oh->flags & HWMOD_SWSUP_SIDLE || | ||
1435 | !(oh->class->sysc->idlemodes & | ||
1436 | (SIDLE_SMART | SIDLE_SMART_WKUP))) | ||
1437 | idlemode = HWMOD_IDLEMODE_FORCE; | 1444 | idlemode = HWMOD_IDLEMODE_FORCE; |
1438 | else | 1445 | } else { |
1439 | idlemode = HWMOD_IDLEMODE_SMART; | 1446 | if (sf & SYSC_HAS_ENAWAKEUP) |
1447 | _enable_wakeup(oh, &v); | ||
1448 | if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) | ||
1449 | idlemode = HWMOD_IDLEMODE_SMART_WKUP; | ||
1450 | else | ||
1451 | idlemode = HWMOD_IDLEMODE_SMART; | ||
1452 | } | ||
1440 | _set_slave_idlemode(oh, idlemode, &v); | 1453 | _set_slave_idlemode(oh, idlemode, &v); |
1441 | } | 1454 | } |
1442 | 1455 | ||
@@ -1455,10 +1468,6 @@ static void _idle_sysc(struct omap_hwmod *oh) | |||
1455 | _set_master_standbymode(oh, idlemode, &v); | 1468 | _set_master_standbymode(oh, idlemode, &v); |
1456 | } | 1469 | } |
1457 | 1470 | ||
1458 | /* If slave is in SMARTIDLE, also enable wakeup */ | ||
1459 | if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE)) | ||
1460 | _enable_wakeup(oh, &v); | ||
1461 | |||
1462 | _write_sysconfig(v, oh); | 1471 | _write_sysconfig(v, oh); |
1463 | } | 1472 | } |
1464 | 1473 | ||
@@ -2065,7 +2074,7 @@ static int _omap4_get_context_lost(struct omap_hwmod *oh) | |||
2065 | * do so is present in the hwmod data, then call it and pass along the | 2074 | * do so is present in the hwmod data, then call it and pass along the |
2066 | * return value; otherwise, return 0. | 2075 | * return value; otherwise, return 0. |
2067 | */ | 2076 | */ |
2068 | static int __init _enable_preprogram(struct omap_hwmod *oh) | 2077 | static int _enable_preprogram(struct omap_hwmod *oh) |
2069 | { | 2078 | { |
2070 | if (!oh->class->enable_preprogram) | 2079 | if (!oh->class->enable_preprogram) |
2071 | return 0; | 2080 | return 0; |
@@ -2246,42 +2255,6 @@ static int _idle(struct omap_hwmod *oh) | |||
2246 | } | 2255 | } |
2247 | 2256 | ||
2248 | /** | 2257 | /** |
2249 | * omap_hwmod_set_ocp_autoidle - set the hwmod's OCP autoidle bit | ||
2250 | * @oh: struct omap_hwmod * | ||
2251 | * @autoidle: desired AUTOIDLE bitfield value (0 or 1) | ||
2252 | * | ||
2253 | * Sets the IP block's OCP autoidle bit in hardware, and updates our | ||
2254 | * local copy. Intended to be used by drivers that require | ||
2255 | * direct manipulation of the AUTOIDLE bits. | ||
2256 | * Returns -EINVAL if @oh is null or is not in the ENABLED state, or passes | ||
2257 | * along the return value from _set_module_autoidle(). | ||
2258 | * | ||
2259 | * Any users of this function should be scrutinized carefully. | ||
2260 | */ | ||
2261 | int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle) | ||
2262 | { | ||
2263 | u32 v; | ||
2264 | int retval = 0; | ||
2265 | unsigned long flags; | ||
2266 | |||
2267 | if (!oh || oh->_state != _HWMOD_STATE_ENABLED) | ||
2268 | return -EINVAL; | ||
2269 | |||
2270 | spin_lock_irqsave(&oh->_lock, flags); | ||
2271 | |||
2272 | v = oh->_sysc_cache; | ||
2273 | |||
2274 | retval = _set_module_autoidle(oh, autoidle, &v); | ||
2275 | |||
2276 | if (!retval) | ||
2277 | _write_sysconfig(v, oh); | ||
2278 | |||
2279 | spin_unlock_irqrestore(&oh->_lock, flags); | ||
2280 | |||
2281 | return retval; | ||
2282 | } | ||
2283 | |||
2284 | /** | ||
2285 | * _shutdown - shutdown an omap_hwmod | 2258 | * _shutdown - shutdown an omap_hwmod |
2286 | * @oh: struct omap_hwmod * | 2259 | * @oh: struct omap_hwmod * |
2287 | * | 2260 | * |
@@ -3180,38 +3153,6 @@ error: | |||
3180 | } | 3153 | } |
3181 | 3154 | ||
3182 | /** | 3155 | /** |
3183 | * omap_hwmod_set_slave_idlemode - set the hwmod's OCP slave idlemode | ||
3184 | * @oh: struct omap_hwmod * | ||
3185 | * @idlemode: SIDLEMODE field bits (shifted to bit 0) | ||
3186 | * | ||
3187 | * Sets the IP block's OCP slave idlemode in hardware, and updates our | ||
3188 | * local copy. Intended to be used by drivers that have some erratum | ||
3189 | * that requires direct manipulation of the SIDLEMODE bits. Returns | ||
3190 | * -EINVAL if @oh is null, or passes along the return value from | ||
3191 | * _set_slave_idlemode(). | ||
3192 | * | ||
3193 | * XXX Does this function have any current users? If not, we should | ||
3194 | * remove it; it is better to let the rest of the hwmod code handle this. | ||
3195 | * Any users of this function should be scrutinized carefully. | ||
3196 | */ | ||
3197 | int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode) | ||
3198 | { | ||
3199 | u32 v; | ||
3200 | int retval = 0; | ||
3201 | |||
3202 | if (!oh) | ||
3203 | return -EINVAL; | ||
3204 | |||
3205 | v = oh->_sysc_cache; | ||
3206 | |||
3207 | retval = _set_slave_idlemode(oh, idlemode, &v); | ||
3208 | if (!retval) | ||
3209 | _write_sysconfig(v, oh); | ||
3210 | |||
3211 | return retval; | ||
3212 | } | ||
3213 | |||
3214 | /** | ||
3215 | * omap_hwmod_lookup - look up a registered omap_hwmod by name | 3156 | * omap_hwmod_lookup - look up a registered omap_hwmod by name |
3216 | * @name: name of the omap_hwmod to look up | 3157 | * @name: name of the omap_hwmod to look up |
3217 | * | 3158 | * |
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index fe5962921f07..0c898f58ac9b 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
@@ -463,6 +463,9 @@ struct omap_hwmod_omap4_prcm { | |||
463 | * is kept in force-standby mode. Failing to do so causes PM problems | 463 | * is kept in force-standby mode. Failing to do so causes PM problems |
464 | * with musb on OMAP3630 at least. Note that musb has a dedicated register | 464 | * with musb on OMAP3630 at least. Note that musb has a dedicated register |
465 | * to control MSTANDBY signal when MIDLEMODE is set to force-standby. | 465 | * to control MSTANDBY signal when MIDLEMODE is set to force-standby. |
466 | * HWMOD_SWSUP_SIDLE_ACT: omap_hwmod code should manually bring the module | ||
467 | * out of idle, but rely on smart-idle to the put it back in idle, | ||
468 | * so the wakeups are still functional (Only known case for now is UART) | ||
466 | */ | 469 | */ |
467 | #define HWMOD_SWSUP_SIDLE (1 << 0) | 470 | #define HWMOD_SWSUP_SIDLE (1 << 0) |
468 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) | 471 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) |
@@ -476,6 +479,7 @@ struct omap_hwmod_omap4_prcm { | |||
476 | #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) | 479 | #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) |
477 | #define HWMOD_BLOCK_WFI (1 << 10) | 480 | #define HWMOD_BLOCK_WFI (1 << 10) |
478 | #define HWMOD_FORCE_MSTANDBY (1 << 11) | 481 | #define HWMOD_FORCE_MSTANDBY (1 << 11) |
482 | #define HWMOD_SWSUP_SIDLE_ACT (1 << 12) | ||
479 | 483 | ||
480 | /* | 484 | /* |
481 | * omap_hwmod._int_flags definitions | 485 | * omap_hwmod._int_flags definitions |
@@ -641,9 +645,6 @@ int omap_hwmod_read_hardreset(struct omap_hwmod *oh, const char *name); | |||
641 | int omap_hwmod_enable_clocks(struct omap_hwmod *oh); | 645 | int omap_hwmod_enable_clocks(struct omap_hwmod *oh); |
642 | int omap_hwmod_disable_clocks(struct omap_hwmod *oh); | 646 | int omap_hwmod_disable_clocks(struct omap_hwmod *oh); |
643 | 647 | ||
644 | int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode); | ||
645 | int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle); | ||
646 | |||
647 | int omap_hwmod_reset(struct omap_hwmod *oh); | 648 | int omap_hwmod_reset(struct omap_hwmod *oh); |
648 | void omap_hwmod_ocp_barrier(struct omap_hwmod *oh); | 649 | void omap_hwmod_ocp_barrier(struct omap_hwmod *oh); |
649 | 650 | ||
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 c8c64b3e1acc..d05fc7b54567 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | |||
@@ -512,6 +512,7 @@ struct omap_hwmod omap2xxx_uart1_hwmod = { | |||
512 | .mpu_irqs = omap2_uart1_mpu_irqs, | 512 | .mpu_irqs = omap2_uart1_mpu_irqs, |
513 | .sdma_reqs = omap2_uart1_sdma_reqs, | 513 | .sdma_reqs = omap2_uart1_sdma_reqs, |
514 | .main_clk = "uart1_fck", | 514 | .main_clk = "uart1_fck", |
515 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
515 | .prcm = { | 516 | .prcm = { |
516 | .omap2 = { | 517 | .omap2 = { |
517 | .module_offs = CORE_MOD, | 518 | .module_offs = CORE_MOD, |
@@ -531,6 +532,7 @@ struct omap_hwmod omap2xxx_uart2_hwmod = { | |||
531 | .mpu_irqs = omap2_uart2_mpu_irqs, | 532 | .mpu_irqs = omap2_uart2_mpu_irqs, |
532 | .sdma_reqs = omap2_uart2_sdma_reqs, | 533 | .sdma_reqs = omap2_uart2_sdma_reqs, |
533 | .main_clk = "uart2_fck", | 534 | .main_clk = "uart2_fck", |
535 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
534 | .prcm = { | 536 | .prcm = { |
535 | .omap2 = { | 537 | .omap2 = { |
536 | .module_offs = CORE_MOD, | 538 | .module_offs = CORE_MOD, |
@@ -550,6 +552,7 @@ struct omap_hwmod omap2xxx_uart3_hwmod = { | |||
550 | .mpu_irqs = omap2_uart3_mpu_irqs, | 552 | .mpu_irqs = omap2_uart3_mpu_irqs, |
551 | .sdma_reqs = omap2_uart3_sdma_reqs, | 553 | .sdma_reqs = omap2_uart3_sdma_reqs, |
552 | .main_clk = "uart3_fck", | 554 | .main_clk = "uart3_fck", |
555 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
553 | .prcm = { | 556 | .prcm = { |
554 | .omap2 = { | 557 | .omap2 = { |
555 | .module_offs = CORE_MOD, | 558 | .module_offs = CORE_MOD, |
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c index 01d8f324450a..075f7cc51026 100644 --- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c | |||
@@ -1995,6 +1995,7 @@ static struct omap_hwmod am33xx_uart1_hwmod = { | |||
1995 | .name = "uart1", | 1995 | .name = "uart1", |
1996 | .class = &uart_class, | 1996 | .class = &uart_class, |
1997 | .clkdm_name = "l4_wkup_clkdm", | 1997 | .clkdm_name = "l4_wkup_clkdm", |
1998 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
1998 | .mpu_irqs = am33xx_uart1_irqs, | 1999 | .mpu_irqs = am33xx_uart1_irqs, |
1999 | .sdma_reqs = uart1_edma_reqs, | 2000 | .sdma_reqs = uart1_edma_reqs, |
2000 | .main_clk = "dpll_per_m2_div4_wkupdm_ck", | 2001 | .main_clk = "dpll_per_m2_div4_wkupdm_ck", |
@@ -2015,6 +2016,7 @@ static struct omap_hwmod am33xx_uart2_hwmod = { | |||
2015 | .name = "uart2", | 2016 | .name = "uart2", |
2016 | .class = &uart_class, | 2017 | .class = &uart_class, |
2017 | .clkdm_name = "l4ls_clkdm", | 2018 | .clkdm_name = "l4ls_clkdm", |
2019 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
2018 | .mpu_irqs = am33xx_uart2_irqs, | 2020 | .mpu_irqs = am33xx_uart2_irqs, |
2019 | .sdma_reqs = uart1_edma_reqs, | 2021 | .sdma_reqs = uart1_edma_reqs, |
2020 | .main_clk = "dpll_per_m2_div4_ck", | 2022 | .main_clk = "dpll_per_m2_div4_ck", |
@@ -2042,6 +2044,7 @@ static struct omap_hwmod am33xx_uart3_hwmod = { | |||
2042 | .name = "uart3", | 2044 | .name = "uart3", |
2043 | .class = &uart_class, | 2045 | .class = &uart_class, |
2044 | .clkdm_name = "l4ls_clkdm", | 2046 | .clkdm_name = "l4ls_clkdm", |
2047 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
2045 | .mpu_irqs = am33xx_uart3_irqs, | 2048 | .mpu_irqs = am33xx_uart3_irqs, |
2046 | .sdma_reqs = uart3_edma_reqs, | 2049 | .sdma_reqs = uart3_edma_reqs, |
2047 | .main_clk = "dpll_per_m2_div4_ck", | 2050 | .main_clk = "dpll_per_m2_div4_ck", |
@@ -2062,6 +2065,7 @@ static struct omap_hwmod am33xx_uart4_hwmod = { | |||
2062 | .name = "uart4", | 2065 | .name = "uart4", |
2063 | .class = &uart_class, | 2066 | .class = &uart_class, |
2064 | .clkdm_name = "l4ls_clkdm", | 2067 | .clkdm_name = "l4ls_clkdm", |
2068 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
2065 | .mpu_irqs = am33xx_uart4_irqs, | 2069 | .mpu_irqs = am33xx_uart4_irqs, |
2066 | .sdma_reqs = uart1_edma_reqs, | 2070 | .sdma_reqs = uart1_edma_reqs, |
2067 | .main_clk = "dpll_per_m2_div4_ck", | 2071 | .main_clk = "dpll_per_m2_div4_ck", |
@@ -2082,6 +2086,7 @@ static struct omap_hwmod am33xx_uart5_hwmod = { | |||
2082 | .name = "uart5", | 2086 | .name = "uart5", |
2083 | .class = &uart_class, | 2087 | .class = &uart_class, |
2084 | .clkdm_name = "l4ls_clkdm", | 2088 | .clkdm_name = "l4ls_clkdm", |
2089 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
2085 | .mpu_irqs = am33xx_uart5_irqs, | 2090 | .mpu_irqs = am33xx_uart5_irqs, |
2086 | .sdma_reqs = uart1_edma_reqs, | 2091 | .sdma_reqs = uart1_edma_reqs, |
2087 | .main_clk = "dpll_per_m2_div4_ck", | 2092 | .main_clk = "dpll_per_m2_div4_ck", |
@@ -2102,6 +2107,7 @@ static struct omap_hwmod am33xx_uart6_hwmod = { | |||
2102 | .name = "uart6", | 2107 | .name = "uart6", |
2103 | .class = &uart_class, | 2108 | .class = &uart_class, |
2104 | .clkdm_name = "l4ls_clkdm", | 2109 | .clkdm_name = "l4ls_clkdm", |
2110 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
2105 | .mpu_irqs = am33xx_uart6_irqs, | 2111 | .mpu_irqs = am33xx_uart6_irqs, |
2106 | .sdma_reqs = uart1_edma_reqs, | 2112 | .sdma_reqs = uart1_edma_reqs, |
2107 | .main_clk = "dpll_per_m2_div4_ck", | 2113 | .main_clk = "dpll_per_m2_div4_ck", |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 4083606ea1da..31c7126eb3bb 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -490,6 +490,7 @@ static struct omap_hwmod omap3xxx_uart1_hwmod = { | |||
490 | .mpu_irqs = omap2_uart1_mpu_irqs, | 490 | .mpu_irqs = omap2_uart1_mpu_irqs, |
491 | .sdma_reqs = omap2_uart1_sdma_reqs, | 491 | .sdma_reqs = omap2_uart1_sdma_reqs, |
492 | .main_clk = "uart1_fck", | 492 | .main_clk = "uart1_fck", |
493 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
493 | .prcm = { | 494 | .prcm = { |
494 | .omap2 = { | 495 | .omap2 = { |
495 | .module_offs = CORE_MOD, | 496 | .module_offs = CORE_MOD, |
@@ -508,6 +509,7 @@ static struct omap_hwmod omap3xxx_uart2_hwmod = { | |||
508 | .mpu_irqs = omap2_uart2_mpu_irqs, | 509 | .mpu_irqs = omap2_uart2_mpu_irqs, |
509 | .sdma_reqs = omap2_uart2_sdma_reqs, | 510 | .sdma_reqs = omap2_uart2_sdma_reqs, |
510 | .main_clk = "uart2_fck", | 511 | .main_clk = "uart2_fck", |
512 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
511 | .prcm = { | 513 | .prcm = { |
512 | .omap2 = { | 514 | .omap2 = { |
513 | .module_offs = CORE_MOD, | 515 | .module_offs = CORE_MOD, |
@@ -526,6 +528,7 @@ static struct omap_hwmod omap3xxx_uart3_hwmod = { | |||
526 | .mpu_irqs = omap2_uart3_mpu_irqs, | 528 | .mpu_irqs = omap2_uart3_mpu_irqs, |
527 | .sdma_reqs = omap2_uart3_sdma_reqs, | 529 | .sdma_reqs = omap2_uart3_sdma_reqs, |
528 | .main_clk = "uart3_fck", | 530 | .main_clk = "uart3_fck", |
531 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
529 | .prcm = { | 532 | .prcm = { |
530 | .omap2 = { | 533 | .omap2 = { |
531 | .module_offs = OMAP3430_PER_MOD, | 534 | .module_offs = OMAP3430_PER_MOD, |
@@ -555,6 +558,7 @@ static struct omap_hwmod omap36xx_uart4_hwmod = { | |||
555 | .mpu_irqs = uart4_mpu_irqs, | 558 | .mpu_irqs = uart4_mpu_irqs, |
556 | .sdma_reqs = uart4_sdma_reqs, | 559 | .sdma_reqs = uart4_sdma_reqs, |
557 | .main_clk = "uart4_fck", | 560 | .main_clk = "uart4_fck", |
561 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
558 | .prcm = { | 562 | .prcm = { |
559 | .omap2 = { | 563 | .omap2 = { |
560 | .module_offs = OMAP3430_PER_MOD, | 564 | .module_offs = OMAP3430_PER_MOD, |
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index eaba9dc91a0d..848b6dc67590 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -3434,6 +3434,7 @@ static struct omap_hwmod omap44xx_uart1_hwmod = { | |||
3434 | .name = "uart1", | 3434 | .name = "uart1", |
3435 | .class = &omap44xx_uart_hwmod_class, | 3435 | .class = &omap44xx_uart_hwmod_class, |
3436 | .clkdm_name = "l4_per_clkdm", | 3436 | .clkdm_name = "l4_per_clkdm", |
3437 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
3437 | .mpu_irqs = omap44xx_uart1_irqs, | 3438 | .mpu_irqs = omap44xx_uart1_irqs, |
3438 | .sdma_reqs = omap44xx_uart1_sdma_reqs, | 3439 | .sdma_reqs = omap44xx_uart1_sdma_reqs, |
3439 | .main_clk = "func_48m_fclk", | 3440 | .main_clk = "func_48m_fclk", |
@@ -3462,6 +3463,7 @@ static struct omap_hwmod omap44xx_uart2_hwmod = { | |||
3462 | .name = "uart2", | 3463 | .name = "uart2", |
3463 | .class = &omap44xx_uart_hwmod_class, | 3464 | .class = &omap44xx_uart_hwmod_class, |
3464 | .clkdm_name = "l4_per_clkdm", | 3465 | .clkdm_name = "l4_per_clkdm", |
3466 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
3465 | .mpu_irqs = omap44xx_uart2_irqs, | 3467 | .mpu_irqs = omap44xx_uart2_irqs, |
3466 | .sdma_reqs = omap44xx_uart2_sdma_reqs, | 3468 | .sdma_reqs = omap44xx_uart2_sdma_reqs, |
3467 | .main_clk = "func_48m_fclk", | 3469 | .main_clk = "func_48m_fclk", |
@@ -3490,7 +3492,8 @@ static struct omap_hwmod omap44xx_uart3_hwmod = { | |||
3490 | .name = "uart3", | 3492 | .name = "uart3", |
3491 | .class = &omap44xx_uart_hwmod_class, | 3493 | .class = &omap44xx_uart_hwmod_class, |
3492 | .clkdm_name = "l4_per_clkdm", | 3494 | .clkdm_name = "l4_per_clkdm", |
3493 | .flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET, | 3495 | .flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET | |
3496 | HWMOD_SWSUP_SIDLE_ACT, | ||
3494 | .mpu_irqs = omap44xx_uart3_irqs, | 3497 | .mpu_irqs = omap44xx_uart3_irqs, |
3495 | .sdma_reqs = omap44xx_uart3_sdma_reqs, | 3498 | .sdma_reqs = omap44xx_uart3_sdma_reqs, |
3496 | .main_clk = "func_48m_fclk", | 3499 | .main_clk = "func_48m_fclk", |
@@ -3519,6 +3522,7 @@ static struct omap_hwmod omap44xx_uart4_hwmod = { | |||
3519 | .name = "uart4", | 3522 | .name = "uart4", |
3520 | .class = &omap44xx_uart_hwmod_class, | 3523 | .class = &omap44xx_uart_hwmod_class, |
3521 | .clkdm_name = "l4_per_clkdm", | 3524 | .clkdm_name = "l4_per_clkdm", |
3525 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
3522 | .mpu_irqs = omap44xx_uart4_irqs, | 3526 | .mpu_irqs = omap44xx_uart4_irqs, |
3523 | .sdma_reqs = omap44xx_uart4_sdma_reqs, | 3527 | .sdma_reqs = omap44xx_uart4_sdma_reqs, |
3524 | .main_clk = "func_48m_fclk", | 3528 | .main_clk = "func_48m_fclk", |
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 8396b5b7e912..f6601563aa69 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
@@ -95,38 +95,9 @@ static void omap_uart_enable_wakeup(struct device *dev, bool enable) | |||
95 | omap_hwmod_disable_wakeup(od->hwmods[0]); | 95 | omap_hwmod_disable_wakeup(od->hwmods[0]); |
96 | } | 96 | } |
97 | 97 | ||
98 | /* | ||
99 | * Errata i291: [UART]:Cannot Acknowledge Idle Requests | ||
100 | * in Smartidle Mode When Configured for DMA Operations. | ||
101 | * WA: configure uart in force idle mode. | ||
102 | */ | ||
103 | static void omap_uart_set_noidle(struct device *dev) | ||
104 | { | ||
105 | struct platform_device *pdev = to_platform_device(dev); | ||
106 | struct omap_device *od = to_omap_device(pdev); | ||
107 | |||
108 | omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_NO); | ||
109 | } | ||
110 | |||
111 | static void omap_uart_set_smartidle(struct device *dev) | ||
112 | { | ||
113 | struct platform_device *pdev = to_platform_device(dev); | ||
114 | struct omap_device *od = to_omap_device(pdev); | ||
115 | u8 idlemode; | ||
116 | |||
117 | if (od->hwmods[0]->class->sysc->idlemodes & SIDLE_SMART_WKUP) | ||
118 | idlemode = HWMOD_IDLEMODE_SMART_WKUP; | ||
119 | else | ||
120 | idlemode = HWMOD_IDLEMODE_SMART; | ||
121 | |||
122 | omap_hwmod_set_slave_idlemode(od->hwmods[0], idlemode); | ||
123 | } | ||
124 | |||
125 | #else | 98 | #else |
126 | static void omap_uart_enable_wakeup(struct device *dev, bool enable) | 99 | static void omap_uart_enable_wakeup(struct device *dev, bool enable) |
127 | {} | 100 | {} |
128 | static void omap_uart_set_noidle(struct device *dev) {} | ||
129 | static void omap_uart_set_smartidle(struct device *dev) {} | ||
130 | #endif /* CONFIG_PM */ | 101 | #endif /* CONFIG_PM */ |
131 | 102 | ||
132 | #ifdef CONFIG_OMAP_MUX | 103 | #ifdef CONFIG_OMAP_MUX |
@@ -299,8 +270,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata, | |||
299 | omap_up.uartclk = OMAP24XX_BASE_BAUD * 16; | 270 | omap_up.uartclk = OMAP24XX_BASE_BAUD * 16; |
300 | omap_up.flags = UPF_BOOT_AUTOCONF; | 271 | omap_up.flags = UPF_BOOT_AUTOCONF; |
301 | omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count; | 272 | omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count; |
302 | omap_up.set_forceidle = omap_uart_set_smartidle; | ||
303 | omap_up.set_noidle = omap_uart_set_noidle; | ||
304 | omap_up.enable_wakeup = omap_uart_enable_wakeup; | 273 | omap_up.enable_wakeup = omap_uart_enable_wakeup; |
305 | omap_up.dma_rx_buf_size = info->dma_rx_buf_size; | 274 | omap_up.dma_rx_buf_size = info->dma_rx_buf_size; |
306 | omap_up.dma_rx_timeout = info->dma_rx_timeout; | 275 | omap_up.dma_rx_timeout = info->dma_rx_timeout; |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index b97fd672e89d..f8a6db9239bf 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
@@ -199,13 +199,6 @@ void __init orion5x_init_early(void) | |||
199 | 199 | ||
200 | orion_time_set_base(TIMER_VIRT_BASE); | 200 | orion_time_set_base(TIMER_VIRT_BASE); |
201 | 201 | ||
202 | /* | ||
203 | * Some Orion5x devices allocate their coherent buffers from atomic | ||
204 | * context. Increase size of atomic coherent pool to make sure such | ||
205 | * the allocations won't fail. | ||
206 | */ | ||
207 | init_dma_coherent_pool_size(SZ_1M); | ||
208 | |||
209 | /* Initialize the MBUS driver */ | 202 | /* Initialize the MBUS driver */ |
210 | orion5x_pcie_id(&dev, &rev); | 203 | orion5x_pcie_id(&dev, &rev); |
211 | if (dev == MV88F5281_DEV_ID) | 204 | if (dev == MV88F5281_DEV_ID) |
diff --git a/arch/arm/mach-tegra/tegra2_emc.c b/arch/arm/mach-tegra/tegra2_emc.c index 9e8bdfa2b369..31e69a019bdd 100644 --- a/arch/arm/mach-tegra/tegra2_emc.c +++ b/arch/arm/mach-tegra/tegra2_emc.c | |||
@@ -307,11 +307,6 @@ static int tegra_emc_probe(struct platform_device *pdev) | |||
307 | } | 307 | } |
308 | 308 | ||
309 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 309 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
310 | if (!res) { | ||
311 | dev_err(&pdev->dev, "missing register base\n"); | ||
312 | return -ENOMEM; | ||
313 | } | ||
314 | |||
315 | emc_regbase = devm_ioremap_resource(&pdev->dev, res); | 310 | emc_regbase = devm_ioremap_resource(&pdev->dev, res); |
316 | if (IS_ERR(emc_regbase)) | 311 | if (IS_ERR(emc_regbase)) |
317 | return PTR_ERR(emc_regbase); | 312 | return PTR_ERR(emc_regbase); |
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index 6a4387e39df8..b19b07204aaf 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig | |||
@@ -51,6 +51,7 @@ config MACH_MOP500 | |||
51 | bool "U8500 Development platform, MOP500 versions" | 51 | bool "U8500 Development platform, MOP500 versions" |
52 | select I2C | 52 | select I2C |
53 | select I2C_NOMADIK | 53 | select I2C_NOMADIK |
54 | select REGULATOR | ||
54 | select REGULATOR_FIXED_VOLTAGE | 55 | select REGULATOR_FIXED_VOLTAGE |
55 | select SOC_BUS | 56 | select SOC_BUS |
56 | select UX500_SOC_DB8500 | 57 | select UX500_SOC_DB8500 |
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 3cd555ac6d0a..78389de94dde 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -623,7 +623,7 @@ static void __init mop500_init_machine(void) | |||
623 | sdi0_reg_info.gpios[0].gpio = GPIO_SDMMC_1V8_3V_SEL; | 623 | sdi0_reg_info.gpios[0].gpio = GPIO_SDMMC_1V8_3V_SEL; |
624 | 624 | ||
625 | mop500_pinmaps_init(); | 625 | mop500_pinmaps_init(); |
626 | parent = u8500_init_devices(&ab8500_platdata); | 626 | parent = u8500_init_devices(); |
627 | 627 | ||
628 | for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++) | 628 | for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++) |
629 | mop500_platform_devs[i]->dev.parent = parent; | 629 | mop500_platform_devs[i]->dev.parent = parent; |
@@ -660,7 +660,7 @@ static void __init snowball_init_machine(void) | |||
660 | sdi0_reg_info.gpios[0].gpio = SNOWBALL_SDMMC_1V8_3V_GPIO; | 660 | sdi0_reg_info.gpios[0].gpio = SNOWBALL_SDMMC_1V8_3V_GPIO; |
661 | 661 | ||
662 | snowball_pinmaps_init(); | 662 | snowball_pinmaps_init(); |
663 | parent = u8500_init_devices(&ab8500_platdata); | 663 | parent = u8500_init_devices(); |
664 | 664 | ||
665 | for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++) | 665 | for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++) |
666 | snowball_platform_devs[i]->dev.parent = parent; | 666 | snowball_platform_devs[i]->dev.parent = parent; |
@@ -698,7 +698,7 @@ static void __init hrefv60_init_machine(void) | |||
698 | sdi0_reg_info.gpios[0].gpio = HREFV60_SDMMC_1V8_3V_GPIO; | 698 | sdi0_reg_info.gpios[0].gpio = HREFV60_SDMMC_1V8_3V_GPIO; |
699 | 699 | ||
700 | hrefv60_pinmaps_init(); | 700 | hrefv60_pinmaps_init(); |
701 | parent = u8500_init_devices(&ab8500_platdata); | 701 | parent = u8500_init_devices(); |
702 | 702 | ||
703 | for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++) | 703 | for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++) |
704 | mop500_platform_devs[i]->dev.parent = parent; | 704 | mop500_platform_devs[i]->dev.parent = parent; |
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index e90b5ab23b6d..46cca52890bc 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
@@ -206,7 +206,7 @@ static struct device * __init db8500_soc_device_init(void) | |||
206 | /* | 206 | /* |
207 | * This function is called from the board init | 207 | * This function is called from the board init |
208 | */ | 208 | */ |
209 | struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500) | 209 | struct device * __init u8500_init_devices(void) |
210 | { | 210 | { |
211 | struct device *parent; | 211 | struct device *parent; |
212 | int i; | 212 | int i; |
@@ -220,8 +220,6 @@ struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500) | |||
220 | for (i = 0; i < ARRAY_SIZE(platform_devs); i++) | 220 | for (i = 0; i < ARRAY_SIZE(platform_devs); i++) |
221 | platform_devs[i]->dev.parent = parent; | 221 | platform_devs[i]->dev.parent = parent; |
222 | 222 | ||
223 | db8500_prcmu_device.dev.platform_data = ab8500; | ||
224 | |||
225 | platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs)); | 223 | platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs)); |
226 | 224 | ||
227 | return parent; | 225 | return parent; |
@@ -278,7 +276,7 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | |||
278 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL), | 276 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL), |
279 | OF_DEV_AUXDATA("stericsson,db8500-prcmu", 0x80157000, "db8500-prcmu", | 277 | OF_DEV_AUXDATA("stericsson,db8500-prcmu", 0x80157000, "db8500-prcmu", |
280 | &db8500_prcmu_pdata), | 278 | &db8500_prcmu_pdata), |
281 | OF_DEV_AUXDATA("smsc,lan9115", 0x50000000, "smsc911x", NULL), | 279 | OF_DEV_AUXDATA("smsc,lan9115", 0x50000000, "smsc911x.0", NULL), |
282 | /* Requires device name bindings. */ | 280 | /* Requires device name bindings. */ |
283 | OF_DEV_AUXDATA("stericsson,nmk-pinctrl", U8500_PRCMU_BASE, | 281 | OF_DEV_AUXDATA("stericsson,nmk-pinctrl", U8500_PRCMU_BASE, |
284 | "pinctrl-db8500", NULL), | 282 | "pinctrl-db8500", NULL), |
diff --git a/arch/arm/mach-ux500/setup.h b/arch/arm/mach-ux500/setup.h index bddce2b49372..cad3ca86c540 100644 --- a/arch/arm/mach-ux500/setup.h +++ b/arch/arm/mach-ux500/setup.h | |||
@@ -18,7 +18,7 @@ | |||
18 | void __init ux500_map_io(void); | 18 | void __init ux500_map_io(void); |
19 | extern void __init u8500_map_io(void); | 19 | extern void __init u8500_map_io(void); |
20 | 20 | ||
21 | extern struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500); | 21 | extern struct device * __init u8500_init_devices(void); |
22 | 22 | ||
23 | extern void __init ux500_init_irq(void); | 23 | extern void __init ux500_init_irq(void); |
24 | extern void __init ux500_init_late(void); | 24 | extern void __init ux500_init_late(void); |
diff --git a/arch/arm/mach-vt8500/vt8500.c b/arch/arm/mach-vt8500/vt8500.c index 1dd281efc020..f5c33df7a597 100644 --- a/arch/arm/mach-vt8500/vt8500.c +++ b/arch/arm/mach-vt8500/vt8500.c | |||
@@ -173,6 +173,7 @@ static const char * const vt8500_dt_compat[] = { | |||
173 | "wm,wm8505", | 173 | "wm,wm8505", |
174 | "wm,wm8750", | 174 | "wm,wm8750", |
175 | "wm,wm8850", | 175 | "wm,wm8850", |
176 | NULL | ||
176 | }; | 177 | }; |
177 | 178 | ||
178 | DT_MACHINE_START(WMT_DT, "VIA/Wondermedia SoC (Device Tree Support)") | 179 | DT_MACHINE_START(WMT_DT, "VIA/Wondermedia SoC (Device Tree Support)") |
diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c index 251f827271e9..c019b7aaf776 100644 --- a/arch/arm/plat-orion/common.c +++ b/arch/arm/plat-orion/common.c | |||
@@ -383,7 +383,7 @@ static struct resource orion_ge10_shared_resources[] = { | |||
383 | 383 | ||
384 | static struct platform_device orion_ge10_shared = { | 384 | static struct platform_device orion_ge10_shared = { |
385 | .name = MV643XX_ETH_SHARED_NAME, | 385 | .name = MV643XX_ETH_SHARED_NAME, |
386 | .id = 1, | 386 | .id = 2, |
387 | .dev = { | 387 | .dev = { |
388 | .platform_data = &orion_ge10_shared_data, | 388 | .platform_data = &orion_ge10_shared_data, |
389 | }, | 389 | }, |
@@ -398,8 +398,8 @@ static struct resource orion_ge10_resources[] = { | |||
398 | 398 | ||
399 | static struct platform_device orion_ge10 = { | 399 | static struct platform_device orion_ge10 = { |
400 | .name = MV643XX_ETH_NAME, | 400 | .name = MV643XX_ETH_NAME, |
401 | .id = 1, | 401 | .id = 2, |
402 | .num_resources = 2, | 402 | .num_resources = 1, |
403 | .resource = orion_ge10_resources, | 403 | .resource = orion_ge10_resources, |
404 | .dev = { | 404 | .dev = { |
405 | .coherent_dma_mask = DMA_BIT_MASK(32), | 405 | .coherent_dma_mask = DMA_BIT_MASK(32), |
@@ -432,7 +432,7 @@ static struct resource orion_ge11_shared_resources[] = { | |||
432 | 432 | ||
433 | static struct platform_device orion_ge11_shared = { | 433 | static struct platform_device orion_ge11_shared = { |
434 | .name = MV643XX_ETH_SHARED_NAME, | 434 | .name = MV643XX_ETH_SHARED_NAME, |
435 | .id = 1, | 435 | .id = 3, |
436 | .dev = { | 436 | .dev = { |
437 | .platform_data = &orion_ge11_shared_data, | 437 | .platform_data = &orion_ge11_shared_data, |
438 | }, | 438 | }, |
@@ -447,8 +447,8 @@ static struct resource orion_ge11_resources[] = { | |||
447 | 447 | ||
448 | static struct platform_device orion_ge11 = { | 448 | static struct platform_device orion_ge11 = { |
449 | .name = MV643XX_ETH_NAME, | 449 | .name = MV643XX_ETH_NAME, |
450 | .id = 1, | 450 | .id = 3, |
451 | .num_resources = 2, | 451 | .num_resources = 1, |
452 | .resource = orion_ge11_resources, | 452 | .resource = orion_ge11_resources, |
453 | .dev = { | 453 | .dev = { |
454 | .coherent_dma_mask = DMA_BIT_MASK(32), | 454 | .coherent_dma_mask = DMA_BIT_MASK(32), |
diff --git a/arch/arm/plat-orion/include/plat/common.h b/arch/arm/plat-orion/include/plat/common.h index e06fc5fefa14..d9a24f605a2b 100644 --- a/arch/arm/plat-orion/include/plat/common.h +++ b/arch/arm/plat-orion/include/plat/common.h | |||
@@ -10,6 +10,7 @@ | |||
10 | 10 | ||
11 | #ifndef __PLAT_COMMON_H | 11 | #ifndef __PLAT_COMMON_H |
12 | #include <linux/mv643xx_eth.h> | 12 | #include <linux/mv643xx_eth.h> |
13 | #include <linux/platform_data/usb-ehci-orion.h> | ||
13 | 14 | ||
14 | struct dsa_platform_data; | 15 | struct dsa_platform_data; |
15 | struct mv_sata_platform_data; | 16 | struct mv_sata_platform_data; |
diff --git a/arch/arm/plat-samsung/adc.c b/arch/arm/plat-samsung/adc.c index ca07cb1b155a..79690f2f6d3f 100644 --- a/arch/arm/plat-samsung/adc.c +++ b/arch/arm/plat-samsung/adc.c | |||
@@ -381,11 +381,6 @@ static int s3c_adc_probe(struct platform_device *pdev) | |||
381 | } | 381 | } |
382 | 382 | ||
383 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 383 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
384 | if (!regs) { | ||
385 | dev_err(dev, "failed to find registers\n"); | ||
386 | return -ENXIO; | ||
387 | } | ||
388 | |||
389 | adc->regs = devm_ioremap_resource(dev, regs); | 384 | adc->regs = devm_ioremap_resource(dev, regs); |
390 | if (IS_ERR(adc->regs)) | 385 | if (IS_ERR(adc->regs)) |
391 | return PTR_ERR(adc->regs); | 386 | return PTR_ERR(adc->regs); |
diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index d30042e39974..13609e01f4b7 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c | |||
@@ -152,11 +152,12 @@ int xen_unmap_domain_mfn_range(struct vm_area_struct *vma, | |||
152 | } | 152 | } |
153 | EXPORT_SYMBOL_GPL(xen_unmap_domain_mfn_range); | 153 | EXPORT_SYMBOL_GPL(xen_unmap_domain_mfn_range); |
154 | 154 | ||
155 | static int __init xen_secondary_init(unsigned int cpu) | 155 | static void __init xen_percpu_init(void *unused) |
156 | { | 156 | { |
157 | struct vcpu_register_vcpu_info info; | 157 | struct vcpu_register_vcpu_info info; |
158 | struct vcpu_info *vcpup; | 158 | struct vcpu_info *vcpup; |
159 | int err; | 159 | int err; |
160 | int cpu = get_cpu(); | ||
160 | 161 | ||
161 | pr_info("Xen: initializing cpu%d\n", cpu); | 162 | pr_info("Xen: initializing cpu%d\n", cpu); |
162 | vcpup = per_cpu_ptr(xen_vcpu_info, cpu); | 163 | vcpup = per_cpu_ptr(xen_vcpu_info, cpu); |
@@ -165,14 +166,10 @@ static int __init xen_secondary_init(unsigned int cpu) | |||
165 | info.offset = offset_in_page(vcpup); | 166 | info.offset = offset_in_page(vcpup); |
166 | 167 | ||
167 | err = HYPERVISOR_vcpu_op(VCPUOP_register_vcpu_info, cpu, &info); | 168 | err = HYPERVISOR_vcpu_op(VCPUOP_register_vcpu_info, cpu, &info); |
168 | if (err) { | 169 | BUG_ON(err); |
169 | pr_debug("register_vcpu_info failed: err=%d\n", err); | 170 | per_cpu(xen_vcpu, cpu) = vcpup; |
170 | } else { | 171 | |
171 | /* This cpu is using the registered vcpu info, even if | 172 | enable_percpu_irq(xen_events_irq, 0); |
172 | later ones fail to. */ | ||
173 | per_cpu(xen_vcpu, cpu) = vcpup; | ||
174 | } | ||
175 | return 0; | ||
176 | } | 173 | } |
177 | 174 | ||
178 | static void xen_restart(char str, const char *cmd) | 175 | static void xen_restart(char str, const char *cmd) |
@@ -208,7 +205,6 @@ static int __init xen_guest_init(void) | |||
208 | const char *version = NULL; | 205 | const char *version = NULL; |
209 | const char *xen_prefix = "xen,xen-"; | 206 | const char *xen_prefix = "xen,xen-"; |
210 | struct resource res; | 207 | struct resource res; |
211 | int i; | ||
212 | 208 | ||
213 | node = of_find_compatible_node(NULL, NULL, "xen,xen"); | 209 | node = of_find_compatible_node(NULL, NULL, "xen,xen"); |
214 | if (!node) { | 210 | if (!node) { |
@@ -265,19 +261,23 @@ static int __init xen_guest_init(void) | |||
265 | sizeof(struct vcpu_info)); | 261 | sizeof(struct vcpu_info)); |
266 | if (xen_vcpu_info == NULL) | 262 | if (xen_vcpu_info == NULL) |
267 | return -ENOMEM; | 263 | return -ENOMEM; |
268 | for_each_online_cpu(i) | ||
269 | xen_secondary_init(i); | ||
270 | 264 | ||
271 | gnttab_init(); | 265 | gnttab_init(); |
272 | if (!xen_initial_domain()) | 266 | if (!xen_initial_domain()) |
273 | xenbus_probe(NULL); | 267 | xenbus_probe(NULL); |
274 | 268 | ||
269 | return 0; | ||
270 | } | ||
271 | core_initcall(xen_guest_init); | ||
272 | |||
273 | static int __init xen_pm_init(void) | ||
274 | { | ||
275 | pm_power_off = xen_power_off; | 275 | pm_power_off = xen_power_off; |
276 | arm_pm_restart = xen_restart; | 276 | arm_pm_restart = xen_restart; |
277 | 277 | ||
278 | return 0; | 278 | return 0; |
279 | } | 279 | } |
280 | core_initcall(xen_guest_init); | 280 | subsys_initcall(xen_pm_init); |
281 | 281 | ||
282 | static irqreturn_t xen_arm_callback(int irq, void *arg) | 282 | static irqreturn_t xen_arm_callback(int irq, void *arg) |
283 | { | 283 | { |
@@ -285,11 +285,6 @@ static irqreturn_t xen_arm_callback(int irq, void *arg) | |||
285 | return IRQ_HANDLED; | 285 | return IRQ_HANDLED; |
286 | } | 286 | } |
287 | 287 | ||
288 | static __init void xen_percpu_enable_events(void *unused) | ||
289 | { | ||
290 | enable_percpu_irq(xen_events_irq, 0); | ||
291 | } | ||
292 | |||
293 | static int __init xen_init_events(void) | 288 | static int __init xen_init_events(void) |
294 | { | 289 | { |
295 | if (!xen_domain() || xen_events_irq < 0) | 290 | if (!xen_domain() || xen_events_irq < 0) |
@@ -303,7 +298,7 @@ static int __init xen_init_events(void) | |||
303 | return -EINVAL; | 298 | return -EINVAL; |
304 | } | 299 | } |
305 | 300 | ||
306 | on_each_cpu(xen_percpu_enable_events, NULL, 0); | 301 | on_each_cpu(xen_percpu_init, NULL, 0); |
307 | 302 | ||
308 | return 0; | 303 | return 0; |
309 | } | 304 | } |