diff options
25 files changed, 199 insertions, 165 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 64b49f549211..f8e0afb708b4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -974,7 +974,7 @@ S: Maintained | |||
| 974 | ARM/CORTINA SYSTEMS GEMINI ARM ARCHITECTURE | 974 | ARM/CORTINA SYSTEMS GEMINI ARM ARCHITECTURE |
| 975 | M: Hans Ulli Kroll <ulli.kroll@googlemail.com> | 975 | M: Hans Ulli Kroll <ulli.kroll@googlemail.com> |
| 976 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 976 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 977 | T: git git://git.berlios.de/gemini-board | 977 | T: git git://github.com/ulli-kroll/linux.git |
| 978 | S: Maintained | 978 | S: Maintained |
| 979 | F: arch/arm/mach-gemini/ | 979 | F: arch/arm/mach-gemini/ |
| 980 | 980 | ||
| @@ -1193,7 +1193,7 @@ ARM/MAGICIAN MACHINE SUPPORT | |||
| 1193 | M: Philipp Zabel <philipp.zabel@gmail.com> | 1193 | M: Philipp Zabel <philipp.zabel@gmail.com> |
| 1194 | S: Maintained | 1194 | S: Maintained |
| 1195 | 1195 | ||
| 1196 | ARM/Marvell Armada 370 and Armada XP SOC support | 1196 | ARM/Marvell Kirkwood and Armada 370, 375, 38x, XP SOC support |
| 1197 | M: Jason Cooper <jason@lakedaemon.net> | 1197 | M: Jason Cooper <jason@lakedaemon.net> |
| 1198 | M: Andrew Lunn <andrew@lunn.ch> | 1198 | M: Andrew Lunn <andrew@lunn.ch> |
| 1199 | M: Gregory Clement <gregory.clement@free-electrons.com> | 1199 | M: Gregory Clement <gregory.clement@free-electrons.com> |
| @@ -1202,12 +1202,17 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | |||
| 1202 | S: Maintained | 1202 | S: Maintained |
| 1203 | F: arch/arm/mach-mvebu/ | 1203 | F: arch/arm/mach-mvebu/ |
| 1204 | F: drivers/rtc/rtc-armada38x.c | 1204 | F: drivers/rtc/rtc-armada38x.c |
| 1205 | F: arch/arm/boot/dts/armada* | ||
| 1206 | F: arch/arm/boot/dts/kirkwood* | ||
| 1207 | |||
| 1205 | 1208 | ||
| 1206 | ARM/Marvell Berlin SoC support | 1209 | ARM/Marvell Berlin SoC support |
| 1207 | M: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> | 1210 | M: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> |
| 1208 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1211 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 1209 | S: Maintained | 1212 | S: Maintained |
| 1210 | F: arch/arm/mach-berlin/ | 1213 | F: arch/arm/mach-berlin/ |
| 1214 | F: arch/arm/boot/dts/berlin* | ||
| 1215 | |||
| 1211 | 1216 | ||
| 1212 | ARM/Marvell Dove/MV78xx0/Orion SOC support | 1217 | ARM/Marvell Dove/MV78xx0/Orion SOC support |
| 1213 | M: Jason Cooper <jason@lakedaemon.net> | 1218 | M: Jason Cooper <jason@lakedaemon.net> |
| @@ -1220,6 +1225,9 @@ F: arch/arm/mach-dove/ | |||
| 1220 | F: arch/arm/mach-mv78xx0/ | 1225 | F: arch/arm/mach-mv78xx0/ |
| 1221 | F: arch/arm/mach-orion5x/ | 1226 | F: arch/arm/mach-orion5x/ |
| 1222 | F: arch/arm/plat-orion/ | 1227 | F: arch/arm/plat-orion/ |
| 1228 | F: arch/arm/boot/dts/dove* | ||
| 1229 | F: arch/arm/boot/dts/orion5x* | ||
| 1230 | |||
| 1223 | 1231 | ||
| 1224 | ARM/Orion SoC/Technologic Systems TS-78xx platform support | 1232 | ARM/Orion SoC/Technologic Systems TS-78xx platform support |
| 1225 | M: Alexander Clouter <alex@digriz.org.uk> | 1233 | M: Alexander Clouter <alex@digriz.org.uk> |
| @@ -1371,6 +1379,7 @@ N: rockchip | |||
| 1371 | 1379 | ||
| 1372 | ARM/SAMSUNG EXYNOS ARM ARCHITECTURES | 1380 | ARM/SAMSUNG EXYNOS ARM ARCHITECTURES |
| 1373 | M: Kukjin Kim <kgene@kernel.org> | 1381 | M: Kukjin Kim <kgene@kernel.org> |
| 1382 | M: Krzysztof Kozlowski <k.kozlowski@samsung.com> | ||
| 1374 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1383 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 1375 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) | 1384 | L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) |
| 1376 | S: Maintained | 1385 | S: Maintained |
diff --git a/arch/arm/boot/dts/armada-375.dtsi b/arch/arm/boot/dts/armada-375.dtsi index c675257f2377..f076ff856d8b 100644 --- a/arch/arm/boot/dts/armada-375.dtsi +++ b/arch/arm/boot/dts/armada-375.dtsi | |||
| @@ -69,7 +69,7 @@ | |||
| 69 | mainpll: mainpll { | 69 | mainpll: mainpll { |
| 70 | compatible = "fixed-clock"; | 70 | compatible = "fixed-clock"; |
| 71 | #clock-cells = <0>; | 71 | #clock-cells = <0>; |
| 72 | clock-frequency = <2000000000>; | 72 | clock-frequency = <1000000000>; |
| 73 | }; | 73 | }; |
| 74 | /* 25 MHz reference crystal */ | 74 | /* 25 MHz reference crystal */ |
| 75 | refclk: oscillator { | 75 | refclk: oscillator { |
diff --git a/arch/arm/boot/dts/armada-38x.dtsi b/arch/arm/boot/dts/armada-38x.dtsi index ed2dd8ba4080..218a2acd36e5 100644 --- a/arch/arm/boot/dts/armada-38x.dtsi +++ b/arch/arm/boot/dts/armada-38x.dtsi | |||
| @@ -585,7 +585,7 @@ | |||
| 585 | mainpll: mainpll { | 585 | mainpll: mainpll { |
| 586 | compatible = "fixed-clock"; | 586 | compatible = "fixed-clock"; |
| 587 | #clock-cells = <0>; | 587 | #clock-cells = <0>; |
| 588 | clock-frequency = <2000000000>; | 588 | clock-frequency = <1000000000>; |
| 589 | }; | 589 | }; |
| 590 | 590 | ||
| 591 | /* 25 MHz reference crystal */ | 591 | /* 25 MHz reference crystal */ |
diff --git a/arch/arm/boot/dts/armada-39x.dtsi b/arch/arm/boot/dts/armada-39x.dtsi index 0e85fc15ceda..ecd1318109ba 100644 --- a/arch/arm/boot/dts/armada-39x.dtsi +++ b/arch/arm/boot/dts/armada-39x.dtsi | |||
| @@ -502,7 +502,7 @@ | |||
| 502 | mainpll: mainpll { | 502 | mainpll: mainpll { |
| 503 | compatible = "fixed-clock"; | 503 | compatible = "fixed-clock"; |
| 504 | #clock-cells = <0>; | 504 | #clock-cells = <0>; |
| 505 | clock-frequency = <2000000000>; | 505 | clock-frequency = <1000000000>; |
| 506 | }; | 506 | }; |
| 507 | }; | 507 | }; |
| 508 | }; | 508 | }; |
diff --git a/arch/arm/boot/dts/dove-cubox.dts b/arch/arm/boot/dts/dove-cubox.dts index aae7efc09b0b..e6fa251e17b9 100644 --- a/arch/arm/boot/dts/dove-cubox.dts +++ b/arch/arm/boot/dts/dove-cubox.dts | |||
| @@ -87,6 +87,7 @@ | |||
| 87 | 87 | ||
| 88 | /* connect xtal input to 25MHz reference */ | 88 | /* connect xtal input to 25MHz reference */ |
| 89 | clocks = <&ref25>; | 89 | clocks = <&ref25>; |
| 90 | clock-names = "xtal"; | ||
| 90 | 91 | ||
| 91 | /* connect xtal input as source of pll0 and pll1 */ | 92 | /* connect xtal input as source of pll0 and pll1 */ |
| 92 | silabs,pll-source = <0 0>, <1 0>; | 93 | silabs,pll-source = <0 0>, <1 0>; |
diff --git a/arch/arm/boot/dts/exynos5420-peach-pit.dts b/arch/arm/boot/dts/exynos5420-peach-pit.dts index 0788d08fb43e..146e71118a72 100644 --- a/arch/arm/boot/dts/exynos5420-peach-pit.dts +++ b/arch/arm/boot/dts/exynos5420-peach-pit.dts | |||
| @@ -711,6 +711,7 @@ | |||
| 711 | num-slots = <1>; | 711 | num-slots = <1>; |
| 712 | broken-cd; | 712 | broken-cd; |
| 713 | cap-sdio-irq; | 713 | cap-sdio-irq; |
| 714 | keep-power-in-suspend; | ||
| 714 | card-detect-delay = <200>; | 715 | card-detect-delay = <200>; |
| 715 | clock-frequency = <400000000>; | 716 | clock-frequency = <400000000>; |
| 716 | samsung,dw-mshc-ciu-div = <1>; | 717 | samsung,dw-mshc-ciu-div = <1>; |
diff --git a/arch/arm/boot/dts/exynos5800-peach-pi.dts b/arch/arm/boot/dts/exynos5800-peach-pi.dts index 412f41d62686..02eb8b15374f 100644 --- a/arch/arm/boot/dts/exynos5800-peach-pi.dts +++ b/arch/arm/boot/dts/exynos5800-peach-pi.dts | |||
| @@ -674,6 +674,7 @@ | |||
| 674 | num-slots = <1>; | 674 | num-slots = <1>; |
| 675 | broken-cd; | 675 | broken-cd; |
| 676 | cap-sdio-irq; | 676 | cap-sdio-irq; |
| 677 | keep-power-in-suspend; | ||
| 677 | card-detect-delay = <200>; | 678 | card-detect-delay = <200>; |
| 678 | clock-frequency = <400000000>; | 679 | clock-frequency = <400000000>; |
| 679 | samsung,dw-mshc-ciu-div = <1>; | 680 | samsung,dw-mshc-ciu-div = <1>; |
diff --git a/arch/arm/boot/dts/tegra124.dtsi b/arch/arm/boot/dts/tegra124.dtsi index cf01c818b8ea..13cc7ca5e031 100644 --- a/arch/arm/boot/dts/tegra124.dtsi +++ b/arch/arm/boot/dts/tegra124.dtsi | |||
| @@ -826,7 +826,7 @@ | |||
| 826 | <&tegra_car TEGRA124_CLK_PLL_U>, | 826 | <&tegra_car TEGRA124_CLK_PLL_U>, |
| 827 | <&tegra_car TEGRA124_CLK_USBD>; | 827 | <&tegra_car TEGRA124_CLK_USBD>; |
| 828 | clock-names = "reg", "pll_u", "utmi-pads"; | 828 | clock-names = "reg", "pll_u", "utmi-pads"; |
| 829 | resets = <&tegra_car 59>, <&tegra_car 22>; | 829 | resets = <&tegra_car 22>, <&tegra_car 22>; |
| 830 | reset-names = "usb", "utmi-pads"; | 830 | reset-names = "usb", "utmi-pads"; |
| 831 | nvidia,hssync-start-delay = <0>; | 831 | nvidia,hssync-start-delay = <0>; |
| 832 | nvidia,idle-wait-delay = <17>; | 832 | nvidia,idle-wait-delay = <17>; |
| @@ -838,6 +838,7 @@ | |||
| 838 | nvidia,hssquelch-level = <2>; | 838 | nvidia,hssquelch-level = <2>; |
| 839 | nvidia,hsdiscon-level = <5>; | 839 | nvidia,hsdiscon-level = <5>; |
| 840 | nvidia,xcvr-hsslew = <12>; | 840 | nvidia,xcvr-hsslew = <12>; |
| 841 | nvidia,has-utmi-pad-registers; | ||
| 841 | status = "disabled"; | 842 | status = "disabled"; |
| 842 | }; | 843 | }; |
| 843 | 844 | ||
| @@ -862,7 +863,7 @@ | |||
| 862 | <&tegra_car TEGRA124_CLK_PLL_U>, | 863 | <&tegra_car TEGRA124_CLK_PLL_U>, |
| 863 | <&tegra_car TEGRA124_CLK_USBD>; | 864 | <&tegra_car TEGRA124_CLK_USBD>; |
| 864 | clock-names = "reg", "pll_u", "utmi-pads"; | 865 | clock-names = "reg", "pll_u", "utmi-pads"; |
| 865 | resets = <&tegra_car 22>, <&tegra_car 22>; | 866 | resets = <&tegra_car 58>, <&tegra_car 22>; |
| 866 | reset-names = "usb", "utmi-pads"; | 867 | reset-names = "usb", "utmi-pads"; |
| 867 | nvidia,hssync-start-delay = <0>; | 868 | nvidia,hssync-start-delay = <0>; |
| 868 | nvidia,idle-wait-delay = <17>; | 869 | nvidia,idle-wait-delay = <17>; |
| @@ -874,7 +875,6 @@ | |||
| 874 | nvidia,hssquelch-level = <2>; | 875 | nvidia,hssquelch-level = <2>; |
| 875 | nvidia,hsdiscon-level = <5>; | 876 | nvidia,hsdiscon-level = <5>; |
| 876 | nvidia,xcvr-hsslew = <12>; | 877 | nvidia,xcvr-hsslew = <12>; |
| 877 | nvidia,has-utmi-pad-registers; | ||
| 878 | status = "disabled"; | 878 | status = "disabled"; |
| 879 | }; | 879 | }; |
| 880 | 880 | ||
| @@ -899,7 +899,7 @@ | |||
| 899 | <&tegra_car TEGRA124_CLK_PLL_U>, | 899 | <&tegra_car TEGRA124_CLK_PLL_U>, |
| 900 | <&tegra_car TEGRA124_CLK_USBD>; | 900 | <&tegra_car TEGRA124_CLK_USBD>; |
| 901 | clock-names = "reg", "pll_u", "utmi-pads"; | 901 | clock-names = "reg", "pll_u", "utmi-pads"; |
| 902 | resets = <&tegra_car 58>, <&tegra_car 22>; | 902 | resets = <&tegra_car 59>, <&tegra_car 22>; |
| 903 | reset-names = "usb", "utmi-pads"; | 903 | reset-names = "usb", "utmi-pads"; |
| 904 | nvidia,hssync-start-delay = <0>; | 904 | nvidia,hssync-start-delay = <0>; |
| 905 | nvidia,idle-wait-delay = <17>; | 905 | nvidia,idle-wait-delay = <17>; |
diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts index 7a2aeacd62c0..107395c32d82 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts | |||
| @@ -191,6 +191,7 @@ | |||
| 191 | compatible = "arm,cortex-a15-pmu"; | 191 | compatible = "arm,cortex-a15-pmu"; |
| 192 | interrupts = <0 68 4>, | 192 | interrupts = <0 68 4>, |
| 193 | <0 69 4>; | 193 | <0 69 4>; |
| 194 | interrupt-affinity = <&cpu0>, <&cpu1>; | ||
| 194 | }; | 195 | }; |
| 195 | 196 | ||
| 196 | oscclk6a: oscclk6a { | 197 | oscclk6a: oscclk6a { |
diff --git a/arch/arm/boot/dts/vexpress-v2p-ca9.dts b/arch/arm/boot/dts/vexpress-v2p-ca9.dts index 23662b5a5e9d..d949facba376 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca9.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca9.dts | |||
| @@ -33,28 +33,28 @@ | |||
| 33 | #address-cells = <1>; | 33 | #address-cells = <1>; |
| 34 | #size-cells = <0>; | 34 | #size-cells = <0>; |
| 35 | 35 | ||
| 36 | cpu@0 { | 36 | A9_0: cpu@0 { |
| 37 | device_type = "cpu"; | 37 | device_type = "cpu"; |
| 38 | compatible = "arm,cortex-a9"; | 38 | compatible = "arm,cortex-a9"; |
| 39 | reg = <0>; | 39 | reg = <0>; |
| 40 | next-level-cache = <&L2>; | 40 | next-level-cache = <&L2>; |
| 41 | }; | 41 | }; |
| 42 | 42 | ||
| 43 | cpu@1 { | 43 | A9_1: cpu@1 { |
| 44 | device_type = "cpu"; | 44 | device_type = "cpu"; |
| 45 | compatible = "arm,cortex-a9"; | 45 | compatible = "arm,cortex-a9"; |
| 46 | reg = <1>; | 46 | reg = <1>; |
| 47 | next-level-cache = <&L2>; | 47 | next-level-cache = <&L2>; |
| 48 | }; | 48 | }; |
| 49 | 49 | ||
| 50 | cpu@2 { | 50 | A9_2: cpu@2 { |
| 51 | device_type = "cpu"; | 51 | device_type = "cpu"; |
| 52 | compatible = "arm,cortex-a9"; | 52 | compatible = "arm,cortex-a9"; |
| 53 | reg = <2>; | 53 | reg = <2>; |
| 54 | next-level-cache = <&L2>; | 54 | next-level-cache = <&L2>; |
| 55 | }; | 55 | }; |
| 56 | 56 | ||
| 57 | cpu@3 { | 57 | A9_3: cpu@3 { |
| 58 | device_type = "cpu"; | 58 | device_type = "cpu"; |
| 59 | compatible = "arm,cortex-a9"; | 59 | compatible = "arm,cortex-a9"; |
| 60 | reg = <3>; | 60 | reg = <3>; |
| @@ -170,6 +170,7 @@ | |||
| 170 | compatible = "arm,pl310-cache"; | 170 | compatible = "arm,pl310-cache"; |
| 171 | reg = <0x1e00a000 0x1000>; | 171 | reg = <0x1e00a000 0x1000>; |
| 172 | interrupts = <0 43 4>; | 172 | interrupts = <0 43 4>; |
| 173 | cache-unified; | ||
| 173 | cache-level = <2>; | 174 | cache-level = <2>; |
| 174 | arm,data-latency = <1 1 1>; | 175 | arm,data-latency = <1 1 1>; |
| 175 | arm,tag-latency = <1 1 1>; | 176 | arm,tag-latency = <1 1 1>; |
| @@ -181,6 +182,8 @@ | |||
| 181 | <0 61 4>, | 182 | <0 61 4>, |
| 182 | <0 62 4>, | 183 | <0 62 4>, |
| 183 | <0 63 4>; | 184 | <0 63 4>; |
| 185 | interrupt-affinity = <&A9_0>, <&A9_1>, <&A9_2>, <&A9_3>; | ||
| 186 | |||
| 184 | }; | 187 | }; |
| 185 | 188 | ||
| 186 | dcc { | 189 | dcc { |
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h index acd5b560b728..5f5cd562c593 100644 --- a/arch/arm/mach-exynos/common.h +++ b/arch/arm/mach-exynos/common.h | |||
| @@ -159,6 +159,8 @@ extern void exynos_enter_aftr(void); | |||
| 159 | 159 | ||
| 160 | extern struct cpuidle_exynos_data cpuidle_coupled_exynos_data; | 160 | extern struct cpuidle_exynos_data cpuidle_coupled_exynos_data; |
| 161 | 161 | ||
| 162 | extern void exynos_set_delayed_reset_assertion(bool enable); | ||
| 163 | |||
| 162 | extern void s5p_init_cpu(void __iomem *cpuid_addr); | 164 | extern void s5p_init_cpu(void __iomem *cpuid_addr); |
| 163 | extern unsigned int samsung_rev(void); | 165 | extern unsigned int samsung_rev(void); |
| 164 | extern void __iomem *cpu_boot_reg_base(void); | 166 | extern void __iomem *cpu_boot_reg_base(void); |
diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c index bcde0dd668df..5917a30eee33 100644 --- a/arch/arm/mach-exynos/exynos.c +++ b/arch/arm/mach-exynos/exynos.c | |||
| @@ -167,6 +167,33 @@ static void __init exynos_init_io(void) | |||
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | /* | 169 | /* |
| 170 | * Set or clear the USE_DELAYED_RESET_ASSERTION option. Used by smp code | ||
| 171 | * and suspend. | ||
| 172 | * | ||
| 173 | * This is necessary only on Exynos4 SoCs. When system is running | ||
| 174 | * USE_DELAYED_RESET_ASSERTION should be set so the ARM CLK clock down | ||
| 175 | * feature could properly detect global idle state when secondary CPU is | ||
| 176 | * powered down. | ||
| 177 | * | ||
| 178 | * However this should not be set when such system is going into suspend. | ||
| 179 | */ | ||
| 180 | void exynos_set_delayed_reset_assertion(bool enable) | ||
| 181 | { | ||
| 182 | if (of_machine_is_compatible("samsung,exynos4")) { | ||
| 183 | unsigned int tmp, core_id; | ||
| 184 | |||
| 185 | for (core_id = 0; core_id < num_possible_cpus(); core_id++) { | ||
| 186 | tmp = pmu_raw_readl(EXYNOS_ARM_CORE_OPTION(core_id)); | ||
| 187 | if (enable) | ||
| 188 | tmp |= S5P_USE_DELAYED_RESET_ASSERTION; | ||
| 189 | else | ||
| 190 | tmp &= ~(S5P_USE_DELAYED_RESET_ASSERTION); | ||
| 191 | pmu_raw_writel(tmp, EXYNOS_ARM_CORE_OPTION(core_id)); | ||
| 192 | } | ||
| 193 | } | ||
| 194 | } | ||
| 195 | |||
| 196 | /* | ||
| 170 | * Apparently, these SoCs are not able to wake-up from suspend using | 197 | * Apparently, these SoCs are not able to wake-up from suspend using |
| 171 | * the PMU. Too bad. Should they suddenly become capable of such a | 198 | * the PMU. Too bad. Should they suddenly become capable of such a |
| 172 | * feat, the matches below should be moved to suspend.c. | 199 | * feat, the matches below should be moved to suspend.c. |
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index ebd135bb0995..a825bca2a2b6 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c | |||
| @@ -34,30 +34,6 @@ | |||
| 34 | 34 | ||
| 35 | extern void exynos4_secondary_startup(void); | 35 | extern void exynos4_secondary_startup(void); |
| 36 | 36 | ||
| 37 | /* | ||
| 38 | * Set or clear the USE_DELAYED_RESET_ASSERTION option, set on Exynos4 SoCs | ||
| 39 | * during hot-(un)plugging CPUx. | ||
| 40 | * | ||
| 41 | * The feature can be cleared safely during first boot of secondary CPU. | ||
| 42 | * | ||
| 43 | * Exynos4 SoCs require setting USE_DELAYED_RESET_ASSERTION during powering | ||
| 44 | * down a CPU so the CPU idle clock down feature could properly detect global | ||
| 45 | * idle state when CPUx is off. | ||
| 46 | */ | ||
| 47 | static void exynos_set_delayed_reset_assertion(u32 core_id, bool enable) | ||
| 48 | { | ||
| 49 | if (soc_is_exynos4()) { | ||
| 50 | unsigned int tmp; | ||
| 51 | |||
| 52 | tmp = pmu_raw_readl(EXYNOS_ARM_CORE_OPTION(core_id)); | ||
| 53 | if (enable) | ||
| 54 | tmp |= S5P_USE_DELAYED_RESET_ASSERTION; | ||
| 55 | else | ||
| 56 | tmp &= ~(S5P_USE_DELAYED_RESET_ASSERTION); | ||
| 57 | pmu_raw_writel(tmp, EXYNOS_ARM_CORE_OPTION(core_id)); | ||
| 58 | } | ||
| 59 | } | ||
| 60 | |||
| 61 | #ifdef CONFIG_HOTPLUG_CPU | 37 | #ifdef CONFIG_HOTPLUG_CPU |
| 62 | static inline void cpu_leave_lowpower(u32 core_id) | 38 | static inline void cpu_leave_lowpower(u32 core_id) |
| 63 | { | 39 | { |
| @@ -73,8 +49,6 @@ static inline void cpu_leave_lowpower(u32 core_id) | |||
| 73 | : "=&r" (v) | 49 | : "=&r" (v) |
| 74 | : "Ir" (CR_C), "Ir" (0x40) | 50 | : "Ir" (CR_C), "Ir" (0x40) |
| 75 | : "cc"); | 51 | : "cc"); |
| 76 | |||
| 77 | exynos_set_delayed_reset_assertion(core_id, false); | ||
| 78 | } | 52 | } |
| 79 | 53 | ||
| 80 | static inline void platform_do_lowpower(unsigned int cpu, int *spurious) | 54 | static inline void platform_do_lowpower(unsigned int cpu, int *spurious) |
| @@ -87,14 +61,6 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious) | |||
| 87 | /* Turn the CPU off on next WFI instruction. */ | 61 | /* Turn the CPU off on next WFI instruction. */ |
| 88 | exynos_cpu_power_down(core_id); | 62 | exynos_cpu_power_down(core_id); |
| 89 | 63 | ||
| 90 | /* | ||
| 91 | * Exynos4 SoCs require setting | ||
| 92 | * USE_DELAYED_RESET_ASSERTION so the CPU idle | ||
| 93 | * clock down feature could properly detect | ||
| 94 | * global idle state when CPUx is off. | ||
| 95 | */ | ||
| 96 | exynos_set_delayed_reset_assertion(core_id, true); | ||
| 97 | |||
| 98 | wfi(); | 64 | wfi(); |
| 99 | 65 | ||
| 100 | if (pen_release == core_id) { | 66 | if (pen_release == core_id) { |
| @@ -371,9 +337,6 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle) | |||
| 371 | udelay(10); | 337 | udelay(10); |
| 372 | } | 338 | } |
| 373 | 339 | ||
| 374 | /* No harm if this is called during first boot of secondary CPU */ | ||
| 375 | exynos_set_delayed_reset_assertion(core_id, false); | ||
| 376 | |||
| 377 | /* | 340 | /* |
| 378 | * now the secondary core is starting up let it run its | 341 | * now the secondary core is starting up let it run its |
| 379 | * calibrations, then wait for it to finish | 342 | * calibrations, then wait for it to finish |
| @@ -420,6 +383,8 @@ static void __init exynos_smp_prepare_cpus(unsigned int max_cpus) | |||
| 420 | 383 | ||
| 421 | exynos_sysram_init(); | 384 | exynos_sysram_init(); |
| 422 | 385 | ||
| 386 | exynos_set_delayed_reset_assertion(true); | ||
| 387 | |||
| 423 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) | 388 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) |
| 424 | scu_enable(scu_base_addr()); | 389 | scu_enable(scu_base_addr()); |
| 425 | 390 | ||
diff --git a/arch/arm/mach-exynos/pm_domains.c b/arch/arm/mach-exynos/pm_domains.c index cbe56b35aea0..a9686535f9ed 100644 --- a/arch/arm/mach-exynos/pm_domains.c +++ b/arch/arm/mach-exynos/pm_domains.c | |||
| @@ -188,7 +188,7 @@ no_clk: | |||
| 188 | args.np = np; | 188 | args.np = np; |
| 189 | args.args_count = 0; | 189 | args.args_count = 0; |
| 190 | child_domain = of_genpd_get_from_provider(&args); | 190 | child_domain = of_genpd_get_from_provider(&args); |
| 191 | if (!child_domain) | 191 | if (IS_ERR(child_domain)) |
| 192 | continue; | 192 | continue; |
| 193 | 193 | ||
| 194 | if (of_parse_phandle_with_args(np, "power-domains", | 194 | if (of_parse_phandle_with_args(np, "power-domains", |
| @@ -196,7 +196,7 @@ no_clk: | |||
| 196 | continue; | 196 | continue; |
| 197 | 197 | ||
| 198 | parent_domain = of_genpd_get_from_provider(&args); | 198 | parent_domain = of_genpd_get_from_provider(&args); |
| 199 | if (!parent_domain) | 199 | if (IS_ERR(parent_domain)) |
| 200 | continue; | 200 | continue; |
| 201 | 201 | ||
| 202 | if (pm_genpd_add_subdomain(parent_domain, child_domain)) | 202 | if (pm_genpd_add_subdomain(parent_domain, child_domain)) |
diff --git a/arch/arm/mach-exynos/suspend.c b/arch/arm/mach-exynos/suspend.c index 3e6aea7f83af..c0b6dccbf7bd 100644 --- a/arch/arm/mach-exynos/suspend.c +++ b/arch/arm/mach-exynos/suspend.c | |||
| @@ -342,6 +342,8 @@ static void exynos_pm_enter_sleep_mode(void) | |||
| 342 | 342 | ||
| 343 | static void exynos_pm_prepare(void) | 343 | static void exynos_pm_prepare(void) |
| 344 | { | 344 | { |
| 345 | exynos_set_delayed_reset_assertion(false); | ||
| 346 | |||
| 345 | /* Set wake-up mask registers */ | 347 | /* Set wake-up mask registers */ |
| 346 | exynos_pm_set_wakeup_mask(); | 348 | exynos_pm_set_wakeup_mask(); |
| 347 | 349 | ||
| @@ -482,6 +484,7 @@ early_wakeup: | |||
| 482 | 484 | ||
| 483 | /* Clear SLEEP mode set in INFORM1 */ | 485 | /* Clear SLEEP mode set in INFORM1 */ |
| 484 | pmu_raw_writel(0x0, S5P_INFORM1); | 486 | pmu_raw_writel(0x0, S5P_INFORM1); |
| 487 | exynos_set_delayed_reset_assertion(true); | ||
| 485 | } | 488 | } |
| 486 | 489 | ||
| 487 | static void exynos3250_pm_resume(void) | 490 | static void exynos3250_pm_resume(void) |
| @@ -723,8 +726,10 @@ void __init exynos_pm_init(void) | |||
| 723 | return; | 726 | return; |
| 724 | } | 727 | } |
| 725 | 728 | ||
| 726 | if (WARN_ON(!of_find_property(np, "interrupt-controller", NULL))) | 729 | if (WARN_ON(!of_find_property(np, "interrupt-controller", NULL))) { |
| 727 | pr_warn("Outdated DT detected, suspend/resume will NOT work\n"); | 730 | pr_warn("Outdated DT detected, suspend/resume will NOT work\n"); |
| 731 | return; | ||
| 732 | } | ||
| 728 | 733 | ||
| 729 | pm_data = (const struct exynos_pm_data *) match->data; | 734 | pm_data = (const struct exynos_pm_data *) match->data; |
| 730 | 735 | ||
diff --git a/arch/arm/mach-gemini/common.h b/arch/arm/mach-gemini/common.h index 38a45260a7c8..dd883698ff7e 100644 --- a/arch/arm/mach-gemini/common.h +++ b/arch/arm/mach-gemini/common.h | |||
| @@ -12,6 +12,8 @@ | |||
| 12 | #ifndef __GEMINI_COMMON_H__ | 12 | #ifndef __GEMINI_COMMON_H__ |
| 13 | #define __GEMINI_COMMON_H__ | 13 | #define __GEMINI_COMMON_H__ |
| 14 | 14 | ||
| 15 | #include <linux/reboot.h> | ||
| 16 | |||
| 15 | struct mtd_partition; | 17 | struct mtd_partition; |
| 16 | 18 | ||
| 17 | extern void gemini_map_io(void); | 19 | extern void gemini_map_io(void); |
| @@ -26,6 +28,6 @@ extern int platform_register_pflash(unsigned int size, | |||
| 26 | struct mtd_partition *parts, | 28 | struct mtd_partition *parts, |
| 27 | unsigned int nr_parts); | 29 | unsigned int nr_parts); |
| 28 | 30 | ||
| 29 | extern void gemini_restart(char mode, const char *cmd); | 31 | extern void gemini_restart(enum reboot_mode mode, const char *cmd); |
| 30 | 32 | ||
| 31 | #endif /* __GEMINI_COMMON_H__ */ | 33 | #endif /* __GEMINI_COMMON_H__ */ |
diff --git a/arch/arm/mach-gemini/reset.c b/arch/arm/mach-gemini/reset.c index b26659759e27..21a6d6d4f9c4 100644 --- a/arch/arm/mach-gemini/reset.c +++ b/arch/arm/mach-gemini/reset.c | |||
| @@ -14,7 +14,9 @@ | |||
| 14 | #include <mach/hardware.h> | 14 | #include <mach/hardware.h> |
| 15 | #include <mach/global_reg.h> | 15 | #include <mach/global_reg.h> |
| 16 | 16 | ||
| 17 | void gemini_restart(char mode, const char *cmd) | 17 | #include "common.h" |
| 18 | |||
| 19 | void gemini_restart(enum reboot_mode mode, const char *cmd) | ||
| 18 | { | 20 | { |
| 19 | __raw_writel(RESET_GLOBAL | RESET_CPU1, | 21 | __raw_writel(RESET_GLOBAL | RESET_CPU1, |
| 20 | IO_ADDRESS(GEMINI_GLOBAL_BASE) + GLOBAL_RESET); | 22 | IO_ADDRESS(GEMINI_GLOBAL_BASE) + GLOBAL_RESET); |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 355b08936871..752969ff9de0 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -171,6 +171,12 @@ | |||
| 171 | */ | 171 | */ |
| 172 | #define LINKS_PER_OCP_IF 2 | 172 | #define LINKS_PER_OCP_IF 2 |
| 173 | 173 | ||
| 174 | /* | ||
| 175 | * Address offset (in bytes) between the reset control and the reset | ||
| 176 | * status registers: 4 bytes on OMAP4 | ||
| 177 | */ | ||
| 178 | #define OMAP4_RST_CTRL_ST_OFFSET 4 | ||
| 179 | |||
| 174 | /** | 180 | /** |
| 175 | * struct omap_hwmod_soc_ops - fn ptrs for some SoC-specific operations | 181 | * struct omap_hwmod_soc_ops - fn ptrs for some SoC-specific operations |
| 176 | * @enable_module: function to enable a module (via MODULEMODE) | 182 | * @enable_module: function to enable a module (via MODULEMODE) |
| @@ -3016,10 +3022,12 @@ static int _omap4_deassert_hardreset(struct omap_hwmod *oh, | |||
| 3016 | if (ohri->st_shift) | 3022 | if (ohri->st_shift) |
| 3017 | pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n", | 3023 | pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n", |
| 3018 | oh->name, ohri->name); | 3024 | oh->name, ohri->name); |
| 3019 | return omap_prm_deassert_hardreset(ohri->rst_shift, 0, | 3025 | return omap_prm_deassert_hardreset(ohri->rst_shift, ohri->rst_shift, |
| 3020 | oh->clkdm->pwrdm.ptr->prcm_partition, | 3026 | oh->clkdm->pwrdm.ptr->prcm_partition, |
| 3021 | oh->clkdm->pwrdm.ptr->prcm_offs, | 3027 | oh->clkdm->pwrdm.ptr->prcm_offs, |
| 3022 | oh->prcm.omap4.rstctrl_offs, 0); | 3028 | oh->prcm.omap4.rstctrl_offs, |
| 3029 | oh->prcm.omap4.rstctrl_offs + | ||
| 3030 | OMAP4_RST_CTRL_ST_OFFSET); | ||
| 3023 | } | 3031 | } |
| 3024 | 3032 | ||
| 3025 | /** | 3033 | /** |
| @@ -3048,27 +3056,6 @@ static int _omap4_is_hardreset_asserted(struct omap_hwmod *oh, | |||
| 3048 | } | 3056 | } |
| 3049 | 3057 | ||
| 3050 | /** | 3058 | /** |
| 3051 | * _am33xx_assert_hardreset - call AM33XX PRM hardreset fn with hwmod args | ||
| 3052 | * @oh: struct omap_hwmod * to assert hardreset | ||
| 3053 | * @ohri: hardreset line data | ||
| 3054 | * | ||
| 3055 | * Call am33xx_prminst_assert_hardreset() with parameters extracted | ||
| 3056 | * from the hwmod @oh and the hardreset line data @ohri. Only | ||
| 3057 | * intended for use as an soc_ops function pointer. Passes along the | ||
| 3058 | * return value from am33xx_prminst_assert_hardreset(). XXX This | ||
| 3059 | * function is scheduled for removal when the PRM code is moved into | ||
| 3060 | * drivers/. | ||
| 3061 | */ | ||
| 3062 | static int _am33xx_assert_hardreset(struct omap_hwmod *oh, | ||
| 3063 | struct omap_hwmod_rst_info *ohri) | ||
| 3064 | |||
| 3065 | { | ||
| 3066 | return omap_prm_assert_hardreset(ohri->rst_shift, 0, | ||
| 3067 | oh->clkdm->pwrdm.ptr->prcm_offs, | ||
| 3068 | oh->prcm.omap4.rstctrl_offs); | ||
| 3069 | } | ||
| 3070 | |||
| 3071 | /** | ||
| 3072 | * _am33xx_deassert_hardreset - call AM33XX PRM hardreset fn with hwmod args | 3059 | * _am33xx_deassert_hardreset - call AM33XX PRM hardreset fn with hwmod args |
| 3073 | * @oh: struct omap_hwmod * to deassert hardreset | 3060 | * @oh: struct omap_hwmod * to deassert hardreset |
| 3074 | * @ohri: hardreset line data | 3061 | * @ohri: hardreset line data |
| @@ -3083,32 +3070,13 @@ static int _am33xx_assert_hardreset(struct omap_hwmod *oh, | |||
| 3083 | static int _am33xx_deassert_hardreset(struct omap_hwmod *oh, | 3070 | static int _am33xx_deassert_hardreset(struct omap_hwmod *oh, |
| 3084 | struct omap_hwmod_rst_info *ohri) | 3071 | struct omap_hwmod_rst_info *ohri) |
| 3085 | { | 3072 | { |
| 3086 | return omap_prm_deassert_hardreset(ohri->rst_shift, ohri->st_shift, 0, | 3073 | return omap_prm_deassert_hardreset(ohri->rst_shift, ohri->st_shift, |
| 3074 | oh->clkdm->pwrdm.ptr->prcm_partition, | ||
| 3087 | oh->clkdm->pwrdm.ptr->prcm_offs, | 3075 | oh->clkdm->pwrdm.ptr->prcm_offs, |
| 3088 | oh->prcm.omap4.rstctrl_offs, | 3076 | oh->prcm.omap4.rstctrl_offs, |
| 3089 | oh->prcm.omap4.rstst_offs); | 3077 | oh->prcm.omap4.rstst_offs); |
| 3090 | } | 3078 | } |
| 3091 | 3079 | ||
| 3092 | /** | ||
| 3093 | * _am33xx_is_hardreset_asserted - call AM33XX PRM hardreset fn with hwmod args | ||
| 3094 | * @oh: struct omap_hwmod * to test hardreset | ||
| 3095 | * @ohri: hardreset line data | ||
| 3096 | * | ||
| 3097 | * Call am33xx_prminst_is_hardreset_asserted() with parameters | ||
| 3098 | * extracted from the hwmod @oh and the hardreset line data @ohri. | ||
| 3099 | * Only intended for use as an soc_ops function pointer. Passes along | ||
| 3100 | * the return value from am33xx_prminst_is_hardreset_asserted(). XXX | ||
| 3101 | * This function is scheduled for removal when the PRM code is moved | ||
| 3102 | * into drivers/. | ||
| 3103 | */ | ||
| 3104 | static int _am33xx_is_hardreset_asserted(struct omap_hwmod *oh, | ||
| 3105 | struct omap_hwmod_rst_info *ohri) | ||
| 3106 | { | ||
| 3107 | return omap_prm_is_hardreset_asserted(ohri->rst_shift, 0, | ||
| 3108 | oh->clkdm->pwrdm.ptr->prcm_offs, | ||
| 3109 | oh->prcm.omap4.rstctrl_offs); | ||
| 3110 | } | ||
| 3111 | |||
| 3112 | /* Public functions */ | 3080 | /* Public functions */ |
| 3113 | 3081 | ||
| 3114 | u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs) | 3082 | u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs) |
| @@ -3908,21 +3876,13 @@ void __init omap_hwmod_init(void) | |||
| 3908 | soc_ops.init_clkdm = _init_clkdm; | 3876 | soc_ops.init_clkdm = _init_clkdm; |
| 3909 | soc_ops.update_context_lost = _omap4_update_context_lost; | 3877 | soc_ops.update_context_lost = _omap4_update_context_lost; |
| 3910 | soc_ops.get_context_lost = _omap4_get_context_lost; | 3878 | soc_ops.get_context_lost = _omap4_get_context_lost; |
| 3911 | } else if (soc_is_am43xx()) { | 3879 | } else if (cpu_is_ti816x() || soc_is_am33xx() || soc_is_am43xx()) { |
| 3912 | soc_ops.enable_module = _omap4_enable_module; | 3880 | soc_ops.enable_module = _omap4_enable_module; |
| 3913 | soc_ops.disable_module = _omap4_disable_module; | 3881 | soc_ops.disable_module = _omap4_disable_module; |
| 3914 | soc_ops.wait_target_ready = _omap4_wait_target_ready; | 3882 | soc_ops.wait_target_ready = _omap4_wait_target_ready; |
| 3915 | soc_ops.assert_hardreset = _omap4_assert_hardreset; | 3883 | soc_ops.assert_hardreset = _omap4_assert_hardreset; |
| 3916 | soc_ops.deassert_hardreset = _omap4_deassert_hardreset; | ||
| 3917 | soc_ops.is_hardreset_asserted = _omap4_is_hardreset_asserted; | ||
| 3918 | soc_ops.init_clkdm = _init_clkdm; | ||
| 3919 | } else if (cpu_is_ti816x() || soc_is_am33xx()) { | ||
| 3920 | soc_ops.enable_module = _omap4_enable_module; | ||
| 3921 | soc_ops.disable_module = _omap4_disable_module; | ||
| 3922 | soc_ops.wait_target_ready = _omap4_wait_target_ready; | ||
| 3923 | soc_ops.assert_hardreset = _am33xx_assert_hardreset; | ||
| 3924 | soc_ops.deassert_hardreset = _am33xx_deassert_hardreset; | 3884 | soc_ops.deassert_hardreset = _am33xx_deassert_hardreset; |
| 3925 | soc_ops.is_hardreset_asserted = _am33xx_is_hardreset_asserted; | 3885 | soc_ops.is_hardreset_asserted = _omap4_is_hardreset_asserted; |
| 3926 | soc_ops.init_clkdm = _init_clkdm; | 3886 | soc_ops.init_clkdm = _init_clkdm; |
| 3927 | } else { | 3887 | } else { |
| 3928 | WARN(1, "omap_hwmod: unknown SoC type\n"); | 3888 | WARN(1, "omap_hwmod: unknown SoC type\n"); |
diff --git a/arch/arm/mach-omap2/omap_hwmod_43xx_data.c b/arch/arm/mach-omap2/omap_hwmod_43xx_data.c index e2223148ba4d..17e8004fc20f 100644 --- a/arch/arm/mach-omap2/omap_hwmod_43xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_43xx_data.c | |||
| @@ -544,6 +544,44 @@ static struct omap_hwmod am43xx_hdq1w_hwmod = { | |||
| 544 | }, | 544 | }, |
| 545 | }; | 545 | }; |
| 546 | 546 | ||
| 547 | static struct omap_hwmod_class_sysconfig am43xx_vpfe_sysc = { | ||
| 548 | .rev_offs = 0x0, | ||
| 549 | .sysc_offs = 0x104, | ||
| 550 | .sysc_flags = SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE, | ||
| 551 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | | ||
| 552 | MSTANDBY_FORCE | MSTANDBY_SMART | MSTANDBY_NO), | ||
| 553 | .sysc_fields = &omap_hwmod_sysc_type2, | ||
| 554 | }; | ||
| 555 | |||
| 556 | static struct omap_hwmod_class am43xx_vpfe_hwmod_class = { | ||
| 557 | .name = "vpfe", | ||
| 558 | .sysc = &am43xx_vpfe_sysc, | ||
| 559 | }; | ||
| 560 | |||
| 561 | static struct omap_hwmod am43xx_vpfe0_hwmod = { | ||
| 562 | .name = "vpfe0", | ||
| 563 | .class = &am43xx_vpfe_hwmod_class, | ||
| 564 | .clkdm_name = "l3s_clkdm", | ||
| 565 | .prcm = { | ||
| 566 | .omap4 = { | ||
| 567 | .modulemode = MODULEMODE_SWCTRL, | ||
| 568 | .clkctrl_offs = AM43XX_CM_PER_VPFE0_CLKCTRL_OFFSET, | ||
| 569 | }, | ||
| 570 | }, | ||
| 571 | }; | ||
| 572 | |||
| 573 | static struct omap_hwmod am43xx_vpfe1_hwmod = { | ||
| 574 | .name = "vpfe1", | ||
| 575 | .class = &am43xx_vpfe_hwmod_class, | ||
| 576 | .clkdm_name = "l3s_clkdm", | ||
| 577 | .prcm = { | ||
| 578 | .omap4 = { | ||
| 579 | .modulemode = MODULEMODE_SWCTRL, | ||
| 580 | .clkctrl_offs = AM43XX_CM_PER_VPFE1_CLKCTRL_OFFSET, | ||
| 581 | }, | ||
| 582 | }, | ||
| 583 | }; | ||
| 584 | |||
| 547 | /* Interfaces */ | 585 | /* Interfaces */ |
| 548 | static struct omap_hwmod_ocp_if am43xx_l3_main__l4_hs = { | 586 | static struct omap_hwmod_ocp_if am43xx_l3_main__l4_hs = { |
| 549 | .master = &am33xx_l3_main_hwmod, | 587 | .master = &am33xx_l3_main_hwmod, |
| @@ -825,6 +863,34 @@ static struct omap_hwmod_ocp_if am43xx_l4_ls__hdq1w = { | |||
| 825 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 863 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 826 | }; | 864 | }; |
| 827 | 865 | ||
| 866 | static struct omap_hwmod_ocp_if am43xx_l3__vpfe0 = { | ||
| 867 | .master = &am43xx_vpfe0_hwmod, | ||
| 868 | .slave = &am33xx_l3_main_hwmod, | ||
| 869 | .clk = "l3_gclk", | ||
| 870 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 871 | }; | ||
| 872 | |||
| 873 | static struct omap_hwmod_ocp_if am43xx_l3__vpfe1 = { | ||
| 874 | .master = &am43xx_vpfe1_hwmod, | ||
| 875 | .slave = &am33xx_l3_main_hwmod, | ||
| 876 | .clk = "l3_gclk", | ||
| 877 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 878 | }; | ||
| 879 | |||
| 880 | static struct omap_hwmod_ocp_if am43xx_l4_ls__vpfe0 = { | ||
| 881 | .master = &am33xx_l4_ls_hwmod, | ||
| 882 | .slave = &am43xx_vpfe0_hwmod, | ||
| 883 | .clk = "l4ls_gclk", | ||
| 884 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 885 | }; | ||
| 886 | |||
| 887 | static struct omap_hwmod_ocp_if am43xx_l4_ls__vpfe1 = { | ||
| 888 | .master = &am33xx_l4_ls_hwmod, | ||
| 889 | .slave = &am43xx_vpfe1_hwmod, | ||
| 890 | .clk = "l4ls_gclk", | ||
| 891 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 892 | }; | ||
| 893 | |||
| 828 | static struct omap_hwmod_ocp_if *am43xx_hwmod_ocp_ifs[] __initdata = { | 894 | static struct omap_hwmod_ocp_if *am43xx_hwmod_ocp_ifs[] __initdata = { |
| 829 | &am33xx_l4_wkup__synctimer, | 895 | &am33xx_l4_wkup__synctimer, |
| 830 | &am43xx_l4_ls__timer8, | 896 | &am43xx_l4_ls__timer8, |
| @@ -925,6 +991,10 @@ static struct omap_hwmod_ocp_if *am43xx_hwmod_ocp_ifs[] __initdata = { | |||
| 925 | &am43xx_l4_ls__dss_dispc, | 991 | &am43xx_l4_ls__dss_dispc, |
| 926 | &am43xx_l4_ls__dss_rfbi, | 992 | &am43xx_l4_ls__dss_rfbi, |
| 927 | &am43xx_l4_ls__hdq1w, | 993 | &am43xx_l4_ls__hdq1w, |
| 994 | &am43xx_l3__vpfe0, | ||
| 995 | &am43xx_l3__vpfe1, | ||
| 996 | &am43xx_l4_ls__vpfe0, | ||
| 997 | &am43xx_l4_ls__vpfe1, | ||
| 928 | NULL, | 998 | NULL, |
| 929 | }; | 999 | }; |
| 930 | 1000 | ||
diff --git a/arch/arm/mach-omap2/prcm43xx.h b/arch/arm/mach-omap2/prcm43xx.h index 48df3b55057e..d0261996db6d 100644 --- a/arch/arm/mach-omap2/prcm43xx.h +++ b/arch/arm/mach-omap2/prcm43xx.h | |||
| @@ -144,5 +144,6 @@ | |||
| 144 | #define AM43XX_CM_PER_USBPHYOCP2SCP1_CLKCTRL_OFFSET 0x05C0 | 144 | #define AM43XX_CM_PER_USBPHYOCP2SCP1_CLKCTRL_OFFSET 0x05C0 |
| 145 | #define AM43XX_CM_PER_DSS_CLKCTRL_OFFSET 0x0a20 | 145 | #define AM43XX_CM_PER_DSS_CLKCTRL_OFFSET 0x0a20 |
| 146 | #define AM43XX_CM_PER_HDQ1W_CLKCTRL_OFFSET 0x04a0 | 146 | #define AM43XX_CM_PER_HDQ1W_CLKCTRL_OFFSET 0x04a0 |
| 147 | 147 | #define AM43XX_CM_PER_VPFE0_CLKCTRL_OFFSET 0x0068 | |
| 148 | #define AM43XX_CM_PER_VPFE1_CLKCTRL_OFFSET 0x0070 | ||
| 148 | #endif | 149 | #endif |
diff --git a/arch/arm/mach-omap2/prminst44xx.c b/arch/arm/mach-omap2/prminst44xx.c index c4859c4d3646..d0b15dbafa2e 100644 --- a/arch/arm/mach-omap2/prminst44xx.c +++ b/arch/arm/mach-omap2/prminst44xx.c | |||
| @@ -87,12 +87,6 @@ u32 omap4_prminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, s16 inst, | |||
| 87 | return v; | 87 | return v; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | /* | ||
| 91 | * Address offset (in bytes) between the reset control and the reset | ||
| 92 | * status registers: 4 bytes on OMAP4 | ||
| 93 | */ | ||
| 94 | #define OMAP4_RST_CTRL_ST_OFFSET 4 | ||
| 95 | |||
| 96 | /** | 90 | /** |
| 97 | * omap4_prminst_is_hardreset_asserted - read the HW reset line state of | 91 | * omap4_prminst_is_hardreset_asserted - read the HW reset line state of |
| 98 | * submodules contained in the hwmod module | 92 | * submodules contained in the hwmod module |
| @@ -141,11 +135,11 @@ int omap4_prminst_assert_hardreset(u8 shift, u8 part, s16 inst, | |||
| 141 | * omap4_prminst_deassert_hardreset - deassert a submodule hardreset line and | 135 | * omap4_prminst_deassert_hardreset - deassert a submodule hardreset line and |
| 142 | * wait | 136 | * wait |
| 143 | * @shift: register bit shift corresponding to the reset line to deassert | 137 | * @shift: register bit shift corresponding to the reset line to deassert |
| 144 | * @st_shift: status bit offset, not used for OMAP4+ | 138 | * @st_shift: status bit offset corresponding to the reset line |
| 145 | * @part: PRM partition | 139 | * @part: PRM partition |
| 146 | * @inst: PRM instance offset | 140 | * @inst: PRM instance offset |
| 147 | * @rstctrl_offs: reset register offset | 141 | * @rstctrl_offs: reset register offset |
| 148 | * @st_offs: reset status register offset, not used for OMAP4+ | 142 | * @rstst_offs: reset status register offset |
| 149 | * | 143 | * |
| 150 | * Some IPs like dsp, ipu or iva contain processors that require an HW | 144 | * Some IPs like dsp, ipu or iva contain processors that require an HW |
| 151 | * reset line to be asserted / deasserted in order to fully enable the | 145 | * reset line to be asserted / deasserted in order to fully enable the |
| @@ -157,11 +151,11 @@ int omap4_prminst_assert_hardreset(u8 shift, u8 part, s16 inst, | |||
| 157 | * of reset, or -EBUSY if the submodule did not exit reset promptly. | 151 | * of reset, or -EBUSY if the submodule did not exit reset promptly. |
| 158 | */ | 152 | */ |
| 159 | int omap4_prminst_deassert_hardreset(u8 shift, u8 st_shift, u8 part, s16 inst, | 153 | int omap4_prminst_deassert_hardreset(u8 shift, u8 st_shift, u8 part, s16 inst, |
| 160 | u16 rstctrl_offs, u16 st_offs) | 154 | u16 rstctrl_offs, u16 rstst_offs) |
| 161 | { | 155 | { |
| 162 | int c; | 156 | int c; |
| 163 | u32 mask = 1 << shift; | 157 | u32 mask = 1 << shift; |
| 164 | u16 rstst_offs = rstctrl_offs + OMAP4_RST_CTRL_ST_OFFSET; | 158 | u32 st_mask = 1 << st_shift; |
| 165 | 159 | ||
| 166 | /* Check the current status to avoid de-asserting the line twice */ | 160 | /* Check the current status to avoid de-asserting the line twice */ |
| 167 | if (omap4_prminst_is_hardreset_asserted(shift, part, inst, | 161 | if (omap4_prminst_is_hardreset_asserted(shift, part, inst, |
| @@ -169,13 +163,13 @@ int omap4_prminst_deassert_hardreset(u8 shift, u8 st_shift, u8 part, s16 inst, | |||
| 169 | return -EEXIST; | 163 | return -EEXIST; |
| 170 | 164 | ||
| 171 | /* Clear the reset status by writing 1 to the status bit */ | 165 | /* Clear the reset status by writing 1 to the status bit */ |
| 172 | omap4_prminst_rmw_inst_reg_bits(0xffffffff, mask, part, inst, | 166 | omap4_prminst_rmw_inst_reg_bits(0xffffffff, st_mask, part, inst, |
| 173 | rstst_offs); | 167 | rstst_offs); |
| 174 | /* de-assert the reset control line */ | 168 | /* de-assert the reset control line */ |
| 175 | omap4_prminst_rmw_inst_reg_bits(mask, 0, part, inst, rstctrl_offs); | 169 | omap4_prminst_rmw_inst_reg_bits(mask, 0, part, inst, rstctrl_offs); |
| 176 | /* wait the status to be set */ | 170 | /* wait the status to be set */ |
| 177 | omap_test_timeout(omap4_prminst_is_hardreset_asserted(shift, part, inst, | 171 | omap_test_timeout(omap4_prminst_is_hardreset_asserted(st_shift, part, |
| 178 | rstst_offs), | 172 | inst, rstst_offs), |
| 179 | MAX_MODULE_HARDRESET_WAIT, c); | 173 | MAX_MODULE_HARDRESET_WAIT, c); |
| 180 | 174 | ||
| 181 | return (c == MAX_MODULE_HARDRESET_WAIT) ? -EBUSY : 0; | 175 | return (c == MAX_MODULE_HARDRESET_WAIT) ? -EBUSY : 0; |
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index cef67af9e9b8..cac46d852da1 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
| @@ -298,14 +298,11 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, | |||
| 298 | if (IS_ERR(src)) | 298 | if (IS_ERR(src)) |
| 299 | return PTR_ERR(src); | 299 | return PTR_ERR(src); |
| 300 | 300 | ||
| 301 | if (clk_get_parent(timer->fclk) != src) { | 301 | r = clk_set_parent(timer->fclk, src); |
| 302 | r = clk_set_parent(timer->fclk, src); | 302 | if (r < 0) { |
| 303 | if (r < 0) { | 303 | pr_warn("%s: %s cannot set source\n", __func__, oh->name); |
| 304 | pr_warn("%s: %s cannot set source\n", __func__, | 304 | clk_put(src); |
| 305 | oh->name); | 305 | return r; |
| 306 | clk_put(src); | ||
| 307 | return r; | ||
| 308 | } | ||
| 309 | } | 306 | } |
| 310 | 307 | ||
| 311 | clk_put(src); | 308 | clk_put(src); |
diff --git a/arch/arm/mach-rockchip/pm.c b/arch/arm/mach-rockchip/pm.c index 22812fe06460..b0dcbe28f78c 100644 --- a/arch/arm/mach-rockchip/pm.c +++ b/arch/arm/mach-rockchip/pm.c | |||
| @@ -44,11 +44,9 @@ static void __iomem *rk3288_bootram_base; | |||
| 44 | static phys_addr_t rk3288_bootram_phy; | 44 | static phys_addr_t rk3288_bootram_phy; |
| 45 | 45 | ||
| 46 | static struct regmap *pmu_regmap; | 46 | static struct regmap *pmu_regmap; |
| 47 | static struct regmap *grf_regmap; | ||
| 48 | static struct regmap *sgrf_regmap; | 47 | static struct regmap *sgrf_regmap; |
| 49 | 48 | ||
| 50 | static u32 rk3288_pmu_pwr_mode_con; | 49 | static u32 rk3288_pmu_pwr_mode_con; |
| 51 | static u32 rk3288_grf_soc_con0; | ||
| 52 | static u32 rk3288_sgrf_soc_con0; | 50 | static u32 rk3288_sgrf_soc_con0; |
| 53 | 51 | ||
| 54 | static inline u32 rk3288_l2_config(void) | 52 | static inline u32 rk3288_l2_config(void) |
| @@ -72,26 +70,12 @@ static void rk3288_slp_mode_set(int level) | |||
| 72 | { | 70 | { |
| 73 | u32 mode_set, mode_set1; | 71 | u32 mode_set, mode_set1; |
| 74 | 72 | ||
| 75 | regmap_read(grf_regmap, RK3288_GRF_SOC_CON0, &rk3288_grf_soc_con0); | ||
| 76 | |||
| 77 | regmap_read(sgrf_regmap, RK3288_SGRF_SOC_CON0, &rk3288_sgrf_soc_con0); | 73 | regmap_read(sgrf_regmap, RK3288_SGRF_SOC_CON0, &rk3288_sgrf_soc_con0); |
| 78 | 74 | ||
| 79 | regmap_read(pmu_regmap, RK3288_PMU_PWRMODE_CON, | 75 | regmap_read(pmu_regmap, RK3288_PMU_PWRMODE_CON, |
| 80 | &rk3288_pmu_pwr_mode_con); | 76 | &rk3288_pmu_pwr_mode_con); |
| 81 | 77 | ||
| 82 | /* | 78 | /* |
| 83 | * We need set this bit GRF_FORCE_JTAG here, for the debug module, | ||
| 84 | * otherwise, it may become inaccessible after resume. | ||
| 85 | * This creates a potential security issue, as the sdmmc pins may | ||
| 86 | * accept jtag data for a short time during resume if no card is | ||
| 87 | * inserted. | ||
| 88 | * But this is of course also true for the regular boot, before we | ||
| 89 | * turn of the jtag/sdmmc autodetect. | ||
| 90 | */ | ||
| 91 | regmap_write(grf_regmap, RK3288_GRF_SOC_CON0, GRF_FORCE_JTAG | | ||
| 92 | GRF_FORCE_JTAG_WRITE); | ||
| 93 | |||
| 94 | /* | ||
| 95 | * SGRF_FAST_BOOT_EN - system to boot from FAST_BOOT_ADDR | 79 | * SGRF_FAST_BOOT_EN - system to boot from FAST_BOOT_ADDR |
| 96 | * PCLK_WDT_GATE - disable WDT during suspend. | 80 | * PCLK_WDT_GATE - disable WDT during suspend. |
| 97 | */ | 81 | */ |
| @@ -151,9 +135,6 @@ static void rk3288_slp_mode_set_resume(void) | |||
| 151 | regmap_write(sgrf_regmap, RK3288_SGRF_SOC_CON0, | 135 | regmap_write(sgrf_regmap, RK3288_SGRF_SOC_CON0, |
| 152 | rk3288_sgrf_soc_con0 | SGRF_PCLK_WDT_GATE_WRITE | 136 | rk3288_sgrf_soc_con0 | SGRF_PCLK_WDT_GATE_WRITE |
| 153 | | SGRF_FAST_BOOT_EN_WRITE); | 137 | | SGRF_FAST_BOOT_EN_WRITE); |
| 154 | |||
| 155 | regmap_write(grf_regmap, RK3288_GRF_SOC_CON0, rk3288_grf_soc_con0 | | ||
| 156 | GRF_FORCE_JTAG_WRITE); | ||
| 157 | } | 138 | } |
| 158 | 139 | ||
| 159 | static int rockchip_lpmode_enter(unsigned long arg) | 140 | static int rockchip_lpmode_enter(unsigned long arg) |
| @@ -212,13 +193,6 @@ static int rk3288_suspend_init(struct device_node *np) | |||
| 212 | return PTR_ERR(pmu_regmap); | 193 | return PTR_ERR(pmu_regmap); |
| 213 | } | 194 | } |
| 214 | 195 | ||
| 215 | grf_regmap = syscon_regmap_lookup_by_compatible( | ||
| 216 | "rockchip,rk3288-grf"); | ||
| 217 | if (IS_ERR(grf_regmap)) { | ||
| 218 | pr_err("%s: could not find grf regmap\n", __func__); | ||
| 219 | return PTR_ERR(pmu_regmap); | ||
| 220 | } | ||
| 221 | |||
| 222 | sram_np = of_find_compatible_node(NULL, NULL, | 196 | sram_np = of_find_compatible_node(NULL, NULL, |
| 223 | "rockchip,rk3288-pmu-sram"); | 197 | "rockchip,rk3288-pmu-sram"); |
| 224 | if (!sram_np) { | 198 | if (!sram_np) { |
diff --git a/arch/arm/mach-rockchip/pm.h b/arch/arm/mach-rockchip/pm.h index f8a747bc1437..3e8d39c0c3d5 100644 --- a/arch/arm/mach-rockchip/pm.h +++ b/arch/arm/mach-rockchip/pm.h | |||
| @@ -48,10 +48,6 @@ static inline void rockchip_suspend_init(void) | |||
| 48 | #define RK3288_PMU_WAKEUP_RST_CLR_CNT 0x44 | 48 | #define RK3288_PMU_WAKEUP_RST_CLR_CNT 0x44 |
| 49 | #define RK3288_PMU_PWRMODE_CON1 0x90 | 49 | #define RK3288_PMU_PWRMODE_CON1 0x90 |
| 50 | 50 | ||
| 51 | #define RK3288_GRF_SOC_CON0 0x244 | ||
| 52 | #define GRF_FORCE_JTAG BIT(12) | ||
| 53 | #define GRF_FORCE_JTAG_WRITE BIT(28) | ||
| 54 | |||
| 55 | #define RK3288_SGRF_SOC_CON0 (0x0000) | 51 | #define RK3288_SGRF_SOC_CON0 (0x0000) |
| 56 | #define RK3288_SGRF_FAST_BOOT_ADDR (0x0120) | 52 | #define RK3288_SGRF_FAST_BOOT_ADDR (0x0120) |
| 57 | #define SGRF_PCLK_WDT_GATE BIT(6) | 53 | #define SGRF_PCLK_WDT_GATE BIT(6) |
diff --git a/arch/arm64/boot/dts/arm/juno-motherboard.dtsi b/arch/arm64/boot/dts/arm/juno-motherboard.dtsi index c138b95a8356..351c95bda89e 100644 --- a/arch/arm64/boot/dts/arm/juno-motherboard.dtsi +++ b/arch/arm64/boot/dts/arm/juno-motherboard.dtsi | |||
| @@ -21,6 +21,20 @@ | |||
| 21 | clock-output-names = "juno_mb:clk25mhz"; | 21 | clock-output-names = "juno_mb:clk25mhz"; |
| 22 | }; | 22 | }; |
| 23 | 23 | ||
| 24 | v2m_refclk1mhz: refclk1mhz { | ||
| 25 | compatible = "fixed-clock"; | ||
| 26 | #clock-cells = <0>; | ||
| 27 | clock-frequency = <1000000>; | ||
| 28 | clock-output-names = "juno_mb:refclk1mhz"; | ||
| 29 | }; | ||
| 30 | |||
| 31 | v2m_refclk32khz: refclk32khz { | ||
| 32 | compatible = "fixed-clock"; | ||
| 33 | #clock-cells = <0>; | ||
| 34 | clock-frequency = <32768>; | ||
| 35 | clock-output-names = "juno_mb:refclk32khz"; | ||
| 36 | }; | ||
| 37 | |||
| 24 | motherboard { | 38 | motherboard { |
| 25 | compatible = "arm,vexpress,v2p-p1", "simple-bus"; | 39 | compatible = "arm,vexpress,v2p-p1", "simple-bus"; |
| 26 | #address-cells = <2>; /* SMB chipselect number and offset */ | 40 | #address-cells = <2>; /* SMB chipselect number and offset */ |
| @@ -66,6 +80,15 @@ | |||
| 66 | #size-cells = <1>; | 80 | #size-cells = <1>; |
| 67 | ranges = <0 3 0 0x200000>; | 81 | ranges = <0 3 0 0x200000>; |
| 68 | 82 | ||
| 83 | v2m_sysctl: sysctl@020000 { | ||
| 84 | compatible = "arm,sp810", "arm,primecell"; | ||
| 85 | reg = <0x020000 0x1000>; | ||
| 86 | clocks = <&v2m_refclk32khz>, <&v2m_refclk1mhz>, <&mb_clk24mhz>; | ||
| 87 | clock-names = "refclk", "timclk", "apb_pclk"; | ||
| 88 | #clock-cells = <1>; | ||
| 89 | clock-output-names = "timerclken0", "timerclken1", "timerclken2", "timerclken3"; | ||
| 90 | }; | ||
| 91 | |||
| 69 | mmci@050000 { | 92 | mmci@050000 { |
| 70 | compatible = "arm,pl180", "arm,primecell"; | 93 | compatible = "arm,pl180", "arm,primecell"; |
| 71 | reg = <0x050000 0x1000>; | 94 | reg = <0x050000 0x1000>; |
| @@ -106,16 +129,16 @@ | |||
| 106 | compatible = "arm,sp804", "arm,primecell"; | 129 | compatible = "arm,sp804", "arm,primecell"; |
| 107 | reg = <0x110000 0x10000>; | 130 | reg = <0x110000 0x10000>; |
| 108 | interrupts = <9>; | 131 | interrupts = <9>; |
| 109 | clocks = <&mb_clk24mhz>, <&soc_smc50mhz>; | 132 | clocks = <&v2m_sysctl 0>, <&v2m_sysctl 1>, <&mb_clk24mhz>; |
| 110 | clock-names = "timclken1", "apb_pclk"; | 133 | clock-names = "timclken1", "timclken2", "apb_pclk"; |
| 111 | }; | 134 | }; |
| 112 | 135 | ||
| 113 | v2m_timer23: timer@120000 { | 136 | v2m_timer23: timer@120000 { |
| 114 | compatible = "arm,sp804", "arm,primecell"; | 137 | compatible = "arm,sp804", "arm,primecell"; |
| 115 | reg = <0x120000 0x10000>; | 138 | reg = <0x120000 0x10000>; |
| 116 | interrupts = <9>; | 139 | interrupts = <9>; |
| 117 | clocks = <&mb_clk24mhz>, <&soc_smc50mhz>; | 140 | clocks = <&v2m_sysctl 2>, <&v2m_sysctl 3>, <&mb_clk24mhz>; |
| 118 | clock-names = "timclken1", "apb_pclk"; | 141 | clock-names = "timclken1", "timclken2", "apb_pclk"; |
| 119 | }; | 142 | }; |
| 120 | 143 | ||
| 121 | rtc@170000 { | 144 | rtc@170000 { |
