diff options
| -rw-r--r-- | arch/arm/boot/dts/at91sam9n12.dtsi | 2 | ||||
| -rw-r--r-- | arch/arm/boot/dts/at91sam9x5.dtsi | 4 | ||||
| -rw-r--r-- | arch/arm/mach-exynos/hotplug.c | 10 | ||||
| -rw-r--r-- | arch/arm/mach-exynos/platsmp.c | 34 | ||||
| -rw-r--r-- | arch/arm/mach-imx/clk-imx6q.c | 4 | ||||
| -rw-r--r-- | arch/arm/mach-mvebu/coherency.c | 6 | ||||
| -rw-r--r-- | arch/arm/mach-mvebu/headsmp-a9.S | 9 | ||||
| -rw-r--r-- | arch/arm/mach-mvebu/pmsu.c | 10 |
8 files changed, 48 insertions, 31 deletions
diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi index 287795985e32..b84bac5bada4 100644 --- a/arch/arm/boot/dts/at91sam9n12.dtsi +++ b/arch/arm/boot/dts/at91sam9n12.dtsi | |||
| @@ -925,7 +925,7 @@ | |||
| 925 | compatible = "atmel,at91rm9200-ohci", "usb-ohci"; | 925 | compatible = "atmel,at91rm9200-ohci", "usb-ohci"; |
| 926 | reg = <0x00500000 0x00100000>; | 926 | reg = <0x00500000 0x00100000>; |
| 927 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>; | 927 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>; |
| 928 | clocks = <&usb>, <&uhphs_clk>, <&udphs_clk>, | 928 | clocks = <&usb>, <&uhphs_clk>, <&uhphs_clk>, |
| 929 | <&uhpck>; | 929 | <&uhpck>; |
| 930 | clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck"; | 930 | clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck"; |
| 931 | status = "disabled"; | 931 | status = "disabled"; |
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index 2ebc42140ea6..2c0d6ea3ab41 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi | |||
| @@ -1124,6 +1124,7 @@ | |||
| 1124 | compatible = "atmel,at91sam9rl-pwm"; | 1124 | compatible = "atmel,at91sam9rl-pwm"; |
| 1125 | reg = <0xf8034000 0x300>; | 1125 | reg = <0xf8034000 0x300>; |
| 1126 | interrupts = <18 IRQ_TYPE_LEVEL_HIGH 4>; | 1126 | interrupts = <18 IRQ_TYPE_LEVEL_HIGH 4>; |
| 1127 | clocks = <&pwm_clk>; | ||
| 1127 | #pwm-cells = <3>; | 1128 | #pwm-cells = <3>; |
| 1128 | status = "disabled"; | 1129 | status = "disabled"; |
| 1129 | }; | 1130 | }; |
| @@ -1155,8 +1156,7 @@ | |||
| 1155 | compatible = "atmel,at91rm9200-ohci", "usb-ohci"; | 1156 | compatible = "atmel,at91rm9200-ohci", "usb-ohci"; |
| 1156 | reg = <0x00600000 0x100000>; | 1157 | reg = <0x00600000 0x100000>; |
| 1157 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>; | 1158 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>; |
| 1158 | clocks = <&usb>, <&uhphs_clk>, <&udphs_clk>, | 1159 | clocks = <&usb>, <&uhphs_clk>, <&uhphs_clk>, <&uhpck>; |
| 1159 | <&uhpck>; | ||
| 1160 | clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck"; | 1160 | clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck"; |
| 1161 | status = "disabled"; | 1161 | status = "disabled"; |
| 1162 | }; | 1162 | }; |
diff --git a/arch/arm/mach-exynos/hotplug.c b/arch/arm/mach-exynos/hotplug.c index 8a134d019cb3..920a4baa53cd 100644 --- a/arch/arm/mach-exynos/hotplug.c +++ b/arch/arm/mach-exynos/hotplug.c | |||
| @@ -40,15 +40,17 @@ static inline void cpu_leave_lowpower(void) | |||
| 40 | 40 | ||
| 41 | static inline void platform_do_lowpower(unsigned int cpu, int *spurious) | 41 | static inline void platform_do_lowpower(unsigned int cpu, int *spurious) |
| 42 | { | 42 | { |
| 43 | u32 mpidr = cpu_logical_map(cpu); | ||
| 44 | u32 core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0); | ||
| 45 | |||
| 43 | for (;;) { | 46 | for (;;) { |
| 44 | 47 | ||
| 45 | /* make cpu1 to be turned off at next WFI command */ | 48 | /* Turn the CPU off on next WFI instruction. */ |
| 46 | if (cpu == 1) | 49 | exynos_cpu_power_down(core_id); |
| 47 | exynos_cpu_power_down(cpu); | ||
| 48 | 50 | ||
| 49 | wfi(); | 51 | wfi(); |
| 50 | 52 | ||
| 51 | if (pen_release == cpu_logical_map(cpu)) { | 53 | if (pen_release == core_id) { |
| 52 | /* | 54 | /* |
| 53 | * OK, proper wakeup, we're done | 55 | * OK, proper wakeup, we're done |
| 54 | */ | 56 | */ |
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index 1c8d31e39520..50b9aad5e27b 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c | |||
| @@ -90,7 +90,8 @@ static void exynos_secondary_init(unsigned int cpu) | |||
| 90 | static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle) | 90 | static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle) |
| 91 | { | 91 | { |
| 92 | unsigned long timeout; | 92 | unsigned long timeout; |
| 93 | unsigned long phys_cpu = cpu_logical_map(cpu); | 93 | u32 mpidr = cpu_logical_map(cpu); |
| 94 | u32 core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0); | ||
| 94 | int ret = -ENOSYS; | 95 | int ret = -ENOSYS; |
| 95 | 96 | ||
| 96 | /* | 97 | /* |
| @@ -104,17 +105,18 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle) | |||
| 104 | * the holding pen - release it, then wait for it to flag | 105 | * the holding pen - release it, then wait for it to flag |
| 105 | * that it has been released by resetting pen_release. | 106 | * that it has been released by resetting pen_release. |
| 106 | * | 107 | * |
| 107 | * Note that "pen_release" is the hardware CPU ID, whereas | 108 | * Note that "pen_release" is the hardware CPU core ID, whereas |
| 108 | * "cpu" is Linux's internal ID. | 109 | * "cpu" is Linux's internal ID. |
| 109 | */ | 110 | */ |
| 110 | write_pen_release(phys_cpu); | 111 | write_pen_release(core_id); |
| 111 | 112 | ||
| 112 | if (!exynos_cpu_power_state(cpu)) { | 113 | if (!exynos_cpu_power_state(core_id)) { |
| 113 | exynos_cpu_power_up(cpu); | 114 | exynos_cpu_power_up(core_id); |
| 114 | timeout = 10; | 115 | timeout = 10; |
| 115 | 116 | ||
| 116 | /* wait max 10 ms until cpu1 is on */ | 117 | /* wait max 10 ms until cpu1 is on */ |
| 117 | while (exynos_cpu_power_state(cpu) != S5P_CORE_LOCAL_PWR_EN) { | 118 | while (exynos_cpu_power_state(core_id) |
| 119 | != S5P_CORE_LOCAL_PWR_EN) { | ||
| 118 | if (timeout-- == 0) | 120 | if (timeout-- == 0) |
| 119 | break; | 121 | break; |
| 120 | 122 | ||
| @@ -145,20 +147,20 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle) | |||
| 145 | * Try to set boot address using firmware first | 147 | * Try to set boot address using firmware first |
| 146 | * and fall back to boot register if it fails. | 148 | * and fall back to boot register if it fails. |
| 147 | */ | 149 | */ |
| 148 | ret = call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr); | 150 | ret = call_firmware_op(set_cpu_boot_addr, core_id, boot_addr); |
| 149 | if (ret && ret != -ENOSYS) | 151 | if (ret && ret != -ENOSYS) |
| 150 | goto fail; | 152 | goto fail; |
| 151 | if (ret == -ENOSYS) { | 153 | if (ret == -ENOSYS) { |
| 152 | void __iomem *boot_reg = cpu_boot_reg(phys_cpu); | 154 | void __iomem *boot_reg = cpu_boot_reg(core_id); |
| 153 | 155 | ||
| 154 | if (IS_ERR(boot_reg)) { | 156 | if (IS_ERR(boot_reg)) { |
| 155 | ret = PTR_ERR(boot_reg); | 157 | ret = PTR_ERR(boot_reg); |
| 156 | goto fail; | 158 | goto fail; |
| 157 | } | 159 | } |
| 158 | __raw_writel(boot_addr, cpu_boot_reg(phys_cpu)); | 160 | __raw_writel(boot_addr, cpu_boot_reg(core_id)); |
| 159 | } | 161 | } |
| 160 | 162 | ||
| 161 | call_firmware_op(cpu_boot, phys_cpu); | 163 | call_firmware_op(cpu_boot, core_id); |
| 162 | 164 | ||
| 163 | arch_send_wakeup_ipi_mask(cpumask_of(cpu)); | 165 | arch_send_wakeup_ipi_mask(cpumask_of(cpu)); |
| 164 | 166 | ||
| @@ -227,22 +229,24 @@ static void __init exynos_smp_prepare_cpus(unsigned int max_cpus) | |||
| 227 | * boot register if it fails. | 229 | * boot register if it fails. |
| 228 | */ | 230 | */ |
| 229 | for (i = 1; i < max_cpus; ++i) { | 231 | for (i = 1; i < max_cpus; ++i) { |
| 230 | unsigned long phys_cpu; | ||
| 231 | unsigned long boot_addr; | 232 | unsigned long boot_addr; |
| 233 | u32 mpidr; | ||
| 234 | u32 core_id; | ||
| 232 | int ret; | 235 | int ret; |
| 233 | 236 | ||
| 234 | phys_cpu = cpu_logical_map(i); | 237 | mpidr = cpu_logical_map(i); |
| 238 | core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0); | ||
| 235 | boot_addr = virt_to_phys(exynos4_secondary_startup); | 239 | boot_addr = virt_to_phys(exynos4_secondary_startup); |
| 236 | 240 | ||
| 237 | ret = call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr); | 241 | ret = call_firmware_op(set_cpu_boot_addr, core_id, boot_addr); |
| 238 | if (ret && ret != -ENOSYS) | 242 | if (ret && ret != -ENOSYS) |
| 239 | break; | 243 | break; |
| 240 | if (ret == -ENOSYS) { | 244 | if (ret == -ENOSYS) { |
| 241 | void __iomem *boot_reg = cpu_boot_reg(phys_cpu); | 245 | void __iomem *boot_reg = cpu_boot_reg(core_id); |
| 242 | 246 | ||
| 243 | if (IS_ERR(boot_reg)) | 247 | if (IS_ERR(boot_reg)) |
| 244 | break; | 248 | break; |
| 245 | __raw_writel(boot_addr, cpu_boot_reg(phys_cpu)); | 249 | __raw_writel(boot_addr, cpu_boot_reg(core_id)); |
| 246 | } | 250 | } |
| 247 | } | 251 | } |
| 248 | } | 252 | } |
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index 8e795dea02ec..8556c787e59c 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
| @@ -70,7 +70,7 @@ static const char *cko_sels[] = { "cko1", "cko2", }; | |||
| 70 | static const char *lvds_sels[] = { | 70 | static const char *lvds_sels[] = { |
| 71 | "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", | 71 | "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", |
| 72 | "pll4_audio", "pll5_video", "pll8_mlb", "enet_ref", | 72 | "pll4_audio", "pll5_video", "pll8_mlb", "enet_ref", |
| 73 | "pcie_ref", "sata_ref", | 73 | "pcie_ref_125m", "sata_ref_100m", |
| 74 | }; | 74 | }; |
| 75 | 75 | ||
| 76 | enum mx6q_clks { | 76 | enum mx6q_clks { |
| @@ -491,7 +491,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) | |||
| 491 | 491 | ||
| 492 | /* All existing boards with PCIe use LVDS1 */ | 492 | /* All existing boards with PCIe use LVDS1 */ |
| 493 | if (IS_ENABLED(CONFIG_PCI_IMX6)) | 493 | if (IS_ENABLED(CONFIG_PCI_IMX6)) |
| 494 | clk_set_parent(clk[lvds1_sel], clk[sata_ref]); | 494 | clk_set_parent(clk[lvds1_sel], clk[sata_ref_100m]); |
| 495 | 495 | ||
| 496 | /* Set initial power mode */ | 496 | /* Set initial power mode */ |
| 497 | imx6q_set_lpm(WAIT_CLOCKED); | 497 | imx6q_set_lpm(WAIT_CLOCKED); |
diff --git a/arch/arm/mach-mvebu/coherency.c b/arch/arm/mach-mvebu/coherency.c index 477202fd39cc..2bdc3233abe2 100644 --- a/arch/arm/mach-mvebu/coherency.c +++ b/arch/arm/mach-mvebu/coherency.c | |||
| @@ -292,6 +292,10 @@ static struct notifier_block mvebu_hwcc_nb = { | |||
| 292 | .notifier_call = mvebu_hwcc_notifier, | 292 | .notifier_call = mvebu_hwcc_notifier, |
| 293 | }; | 293 | }; |
| 294 | 294 | ||
| 295 | static struct notifier_block mvebu_hwcc_pci_nb = { | ||
| 296 | .notifier_call = mvebu_hwcc_notifier, | ||
| 297 | }; | ||
| 298 | |||
| 295 | static void __init armada_370_coherency_init(struct device_node *np) | 299 | static void __init armada_370_coherency_init(struct device_node *np) |
| 296 | { | 300 | { |
| 297 | struct resource res; | 301 | struct resource res; |
| @@ -427,7 +431,7 @@ static int __init coherency_pci_init(void) | |||
| 427 | { | 431 | { |
| 428 | if (coherency_available()) | 432 | if (coherency_available()) |
| 429 | bus_register_notifier(&pci_bus_type, | 433 | bus_register_notifier(&pci_bus_type, |
| 430 | &mvebu_hwcc_nb); | 434 | &mvebu_hwcc_pci_nb); |
| 431 | return 0; | 435 | return 0; |
| 432 | } | 436 | } |
| 433 | 437 | ||
diff --git a/arch/arm/mach-mvebu/headsmp-a9.S b/arch/arm/mach-mvebu/headsmp-a9.S index 5925366bc03c..da5bb292b91c 100644 --- a/arch/arm/mach-mvebu/headsmp-a9.S +++ b/arch/arm/mach-mvebu/headsmp-a9.S | |||
| @@ -15,6 +15,8 @@ | |||
| 15 | #include <linux/linkage.h> | 15 | #include <linux/linkage.h> |
| 16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
| 17 | 17 | ||
| 18 | #include <asm/assembler.h> | ||
| 19 | |||
| 18 | __CPUINIT | 20 | __CPUINIT |
| 19 | #define CPU_RESUME_ADDR_REG 0xf10182d4 | 21 | #define CPU_RESUME_ADDR_REG 0xf10182d4 |
| 20 | 22 | ||
| @@ -22,13 +24,18 @@ | |||
| 22 | .global armada_375_smp_cpu1_enable_code_end | 24 | .global armada_375_smp_cpu1_enable_code_end |
| 23 | 25 | ||
| 24 | armada_375_smp_cpu1_enable_code_start: | 26 | armada_375_smp_cpu1_enable_code_start: |
| 25 | ldr r0, [pc, #4] | 27 | ARM_BE8(setend be) |
| 28 | adr r0, 1f | ||
| 29 | ldr r0, [r0] | ||
| 26 | ldr r1, [r0] | 30 | ldr r1, [r0] |
| 31 | ARM_BE8(rev r1, r1) | ||
| 27 | mov pc, r1 | 32 | mov pc, r1 |
| 33 | 1: | ||
| 28 | .word CPU_RESUME_ADDR_REG | 34 | .word CPU_RESUME_ADDR_REG |
| 29 | armada_375_smp_cpu1_enable_code_end: | 35 | armada_375_smp_cpu1_enable_code_end: |
| 30 | 36 | ||
| 31 | ENTRY(mvebu_cortex_a9_secondary_startup) | 37 | ENTRY(mvebu_cortex_a9_secondary_startup) |
| 38 | ARM_BE8(setend be) | ||
| 32 | bl v7_invalidate_l1 | 39 | bl v7_invalidate_l1 |
| 33 | b secondary_startup | 40 | b secondary_startup |
| 34 | ENDPROC(mvebu_cortex_a9_secondary_startup) | 41 | ENDPROC(mvebu_cortex_a9_secondary_startup) |
diff --git a/arch/arm/mach-mvebu/pmsu.c b/arch/arm/mach-mvebu/pmsu.c index a1d407c0febe..25aa8237d668 100644 --- a/arch/arm/mach-mvebu/pmsu.c +++ b/arch/arm/mach-mvebu/pmsu.c | |||
| @@ -201,12 +201,12 @@ static noinline int do_armada_370_xp_cpu_suspend(unsigned long deepidle) | |||
| 201 | 201 | ||
| 202 | /* Test the CR_C bit and set it if it was cleared */ | 202 | /* Test the CR_C bit and set it if it was cleared */ |
| 203 | asm volatile( | 203 | asm volatile( |
| 204 | "mrc p15, 0, %0, c1, c0, 0 \n\t" | 204 | "mrc p15, 0, r0, c1, c0, 0 \n\t" |
| 205 | "tst %0, #(1 << 2) \n\t" | 205 | "tst r0, #(1 << 2) \n\t" |
| 206 | "orreq %0, %0, #(1 << 2) \n\t" | 206 | "orreq r0, r0, #(1 << 2) \n\t" |
| 207 | "mcreq p15, 0, %0, c1, c0, 0 \n\t" | 207 | "mcreq p15, 0, r0, c1, c0, 0 \n\t" |
| 208 | "isb " | 208 | "isb " |
| 209 | : : "r" (0)); | 209 | : : : "r0"); |
| 210 | 210 | ||
| 211 | pr_warn("Failed to suspend the system\n"); | 211 | pr_warn("Failed to suspend the system\n"); |
| 212 | 212 | ||
