diff options
author | Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | 2014-04-14 09:53:58 -0400 |
---|---|---|
committer | Jason Cooper <jason@lakedaemon.net> | 2014-05-08 12:07:37 -0400 |
commit | 05ad690608098b469d6052c700d96c35e697a955 (patch) | |
tree | bf9cccb0090608a1f75cff887183983c65cb5735 /arch/arm/mach-mvebu/pmsu.c | |
parent | d269a36ae7002d96a5691cdef96b5bb6f41330f6 (diff) |
ARM: mvebu: move Armada XP specific SMP initialization to platsmp.c
The pmsu.c driver contained an armada_xp_boot_cpu() function that sets
the boot address of a secondary CPUs and deasserts the reset. However,
the Armada 375 needs a slightly different logic, so it makes more
sense to move this code into the Armada XP specific platsmp.c.
In order to achieve this, the mvebu_pmsu_set_cpu_boot_addr() function
is exported. It will be needed for both the Armada XP and Armada 38x
SMP implementations.
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Link: https://lkml.kernel.org/r/1397483648-26611-2-git-send-email-thomas.petazzoni@free-electrons.com
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
Diffstat (limited to 'arch/arm/mach-mvebu/pmsu.c')
-rw-r--r-- | arch/arm/mach-mvebu/pmsu.c | 26 |
1 files changed, 1 insertions, 25 deletions
diff --git a/arch/arm/mach-mvebu/pmsu.c b/arch/arm/mach-mvebu/pmsu.c index 8361281f9180..a1508deecd26 100644 --- a/arch/arm/mach-mvebu/pmsu.c +++ b/arch/arm/mach-mvebu/pmsu.c | |||
@@ -41,36 +41,12 @@ static struct of_device_id of_pmsu_table[] = { | |||
41 | { /* end of list */ }, | 41 | { /* end of list */ }, |
42 | }; | 42 | }; |
43 | 43 | ||
44 | static void mvebu_pmsu_set_cpu_boot_addr(int hw_cpu, void *boot_addr) | 44 | void mvebu_pmsu_set_cpu_boot_addr(int hw_cpu, void *boot_addr) |
45 | { | 45 | { |
46 | writel(virt_to_phys(boot_addr), pmsu_mp_base + | 46 | writel(virt_to_phys(boot_addr), pmsu_mp_base + |
47 | PMSU_BOOT_ADDR_REDIRECT_OFFSET(hw_cpu)); | 47 | PMSU_BOOT_ADDR_REDIRECT_OFFSET(hw_cpu)); |
48 | } | 48 | } |
49 | 49 | ||
50 | #ifdef CONFIG_SMP | ||
51 | int armada_xp_boot_cpu(unsigned int cpu_id, void *boot_addr) | ||
52 | { | ||
53 | int hw_cpu, ret; | ||
54 | |||
55 | if (!pmsu_mp_base) { | ||
56 | pr_warn("Can't boot CPU. PMSU is uninitialized\n"); | ||
57 | return -ENODEV; | ||
58 | } | ||
59 | |||
60 | hw_cpu = cpu_logical_map(cpu_id); | ||
61 | |||
62 | mvebu_pmsu_set_cpu_boot_addr(hw_cpu, boot_addr); | ||
63 | |||
64 | ret = mvebu_cpu_reset_deassert(hw_cpu); | ||
65 | if (ret) { | ||
66 | pr_warn("unable to boot CPU: %d\n", ret); | ||
67 | return ret; | ||
68 | } | ||
69 | |||
70 | return 0; | ||
71 | } | ||
72 | #endif | ||
73 | |||
74 | static int __init armada_370_xp_pmsu_init(void) | 50 | static int __init armada_370_xp_pmsu_init(void) |
75 | { | 51 | { |
76 | struct device_node *np; | 52 | struct device_node *np; |