diff options
author | Arnd Bergmann <arnd@arndb.de> | 2013-03-21 12:58:04 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2013-03-21 12:58:04 -0400 |
commit | 5cc25d808e5d8b5a821e35fe87530af1af745461 (patch) | |
tree | 65456d303ef3783d2200cedb1d530dcc57d57b0d | |
parent | 5f796cc9008cfa66b5f57dcaf21cb7f850ded8c7 (diff) | |
parent | d75bc78b508d0a95d7738290d8ec9923691f4301 (diff) |
Merge tag 'renesas-soc-for-v3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas into next/soc
From Simon Horman <horms+renesas@verge.net.au>:
Renesas ARM-based SoC updates for v3.10
* tag 'renesas-soc-for-v3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas: (43 commits)
r8a7779: Add Display Unit clock support
ARM: shmobile: R8A7779: use gic_iid() in SATA IRQ resource
ARM: mach-shmobile: r8a7779: add SATA support
ARM: mach-shmobile: r8a7779: SATA DT configuration
ARM: shmobile: r8a7779: add Thermal support on DT
ARM: shmobile: tidyup chip series definition order for r8a7740/r8a7779
ARM: shmobile: r8a7779: use gic_iid macro
ARM: shmobile: r8a7779: fixup DT machine name
ARM: shmobile: r8a7779: fixup dtsi typo
ARM: shmobile: add gic_iid macro for ICCIAR / interrupt ID
ARM: mach-shmobile: r8a7740: Add DT names to clock list
ARM: shmobile: Remove unused hotplug.c
ARM: shmobile: Rearrange r8a7779 cpu hotplug code
ARM: shmobile: Use sh73a0-specific cpu disable code
ARM: shmobile: Update r8a7779 to use scu_power_mode()
ARM: shmobile: Update r8a7779 to check SCU for hotplug
ARM: shmobile: Use R8A7779_SCU_BASE with TWD
ARM: shmobile: Rework SH73A0_SCU_BASE IOMEM() usage
ARM: shmobile: Fix base address readout in headsmp-scu.S
ARM: shmobile: r8a7779: Remove lan from dtsi
...
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-rw-r--r-- | arch/arm/boot/dts/r8a7779.dtsi | 98 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/Makefile | 7 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/clock-r8a7740.c | 13 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/clock-r8a7779.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/clock-sh73a0.c | 7 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/headsmp-scu.S (renamed from arch/arm/mach-shmobile/headsmp-sh73a0.S) | 15 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/hotplug.c | 68 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/include/mach/common.h | 21 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/include/mach/irqs.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/intc-r8a7779.c | 27 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/intc-sh73a0.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/setup-emev2.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/setup-r8a7779.c | 104 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/setup-sh73a0.c | 36 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/smp-emev2.c | 86 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/smp-r8a7779.c | 129 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/smp-sh73a0.c | 36 |
17 files changed, 355 insertions, 313 deletions
diff --git a/arch/arm/boot/dts/r8a7779.dtsi b/arch/arm/boot/dts/r8a7779.dtsi new file mode 100644 index 000000000000..fe5c6f213271 --- /dev/null +++ b/arch/arm/boot/dts/r8a7779.dtsi | |||
@@ -0,0 +1,98 @@ | |||
1 | /* | ||
2 | * Device Tree Source for Renesas r8a7779 | ||
3 | * | ||
4 | * Copyright (C) 2013 Renesas Solutions Corp. | ||
5 | * Copyright (C) 2013 Simon Horman | ||
6 | * | ||
7 | * This file is licensed under the terms of the GNU General Public License | ||
8 | * version 2. This program is licensed "as is" without any warranty of any | ||
9 | * kind, whether express or implied. | ||
10 | */ | ||
11 | |||
12 | /include/ "skeleton.dtsi" | ||
13 | |||
14 | / { | ||
15 | compatible = "renesas,r8a7779"; | ||
16 | |||
17 | cpus { | ||
18 | #address-cells = <1>; | ||
19 | #size-cells = <0>; | ||
20 | |||
21 | cpu@0 { | ||
22 | device_type = "cpu"; | ||
23 | compatible = "arm,cortex-a9"; | ||
24 | reg = <0>; | ||
25 | }; | ||
26 | cpu@1 { | ||
27 | device_type = "cpu"; | ||
28 | compatible = "arm,cortex-a9"; | ||
29 | reg = <1>; | ||
30 | }; | ||
31 | cpu@2 { | ||
32 | device_type = "cpu"; | ||
33 | compatible = "arm,cortex-a9"; | ||
34 | reg = <2>; | ||
35 | }; | ||
36 | cpu@3 { | ||
37 | device_type = "cpu"; | ||
38 | compatible = "arm,cortex-a9"; | ||
39 | reg = <3>; | ||
40 | }; | ||
41 | }; | ||
42 | |||
43 | gic: interrupt-controller@f0001000 { | ||
44 | compatible = "arm,cortex-a9-gic"; | ||
45 | #interrupt-cells = <3>; | ||
46 | interrupt-controller; | ||
47 | reg = <0xf0001000 0x1000>, | ||
48 | <0xf0000100 0x100>; | ||
49 | }; | ||
50 | |||
51 | i2c0: i2c@0xffc70000 { | ||
52 | #address-cells = <1>; | ||
53 | #size-cells = <0>; | ||
54 | compatible = "renesas,rmobile-iic"; | ||
55 | reg = <0xffc70000 0x1000>; | ||
56 | interrupt-parent = <&gic>; | ||
57 | interrupts = <0 79 0x4>; | ||
58 | }; | ||
59 | |||
60 | i2c1: i2c@0xffc71000 { | ||
61 | #address-cells = <1>; | ||
62 | #size-cells = <0>; | ||
63 | compatible = "renesas,rmobile-iic"; | ||
64 | reg = <0xffc71000 0x1000>; | ||
65 | interrupt-parent = <&gic>; | ||
66 | interrupts = <0 82 0x4>; | ||
67 | }; | ||
68 | |||
69 | i2c2: i2c@0xffc72000 { | ||
70 | #address-cells = <1>; | ||
71 | #size-cells = <0>; | ||
72 | compatible = "renesas,rmobile-iic"; | ||
73 | reg = <0xffc72000 0x1000>; | ||
74 | interrupt-parent = <&gic>; | ||
75 | interrupts = <0 80 0x4>; | ||
76 | }; | ||
77 | |||
78 | i2c3: i2c@0xffc73000 { | ||
79 | #address-cells = <1>; | ||
80 | #size-cells = <0>; | ||
81 | compatible = "renesas,rmobile-iic"; | ||
82 | reg = <0xffc73000 0x1000>; | ||
83 | interrupt-parent = <&gic>; | ||
84 | interrupts = <0 81 0x4>; | ||
85 | }; | ||
86 | |||
87 | thermal@ffc48000 { | ||
88 | compatible = "renesas,rcar-thermal"; | ||
89 | reg = <0xffc48000 0x38>; | ||
90 | }; | ||
91 | |||
92 | sata: sata@fc600000 { | ||
93 | compatible = "renesas,rcar-sata"; | ||
94 | reg = <0xfc600000 0x2000>; | ||
95 | interrupt-parent = <&gic>; | ||
96 | interrupts = <0 100 0x4>; | ||
97 | }; | ||
98 | }; | ||
diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile index e1fac57514b9..b646ff4d742a 100644 --- a/arch/arm/mach-shmobile/Makefile +++ b/arch/arm/mach-shmobile/Makefile | |||
@@ -14,10 +14,9 @@ obj-$(CONFIG_ARCH_EMEV2) += setup-emev2.o clock-emev2.o | |||
14 | 14 | ||
15 | # SMP objects | 15 | # SMP objects |
16 | smp-y := platsmp.o headsmp.o | 16 | smp-y := platsmp.o headsmp.o |
17 | smp-$(CONFIG_HOTPLUG_CPU) += hotplug.o | 17 | smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o headsmp-scu.o |
18 | smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o headsmp-sh73a0.o | 18 | smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o headsmp-scu.o |
19 | smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o | 19 | smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o headsmp-scu.o |
20 | smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o | ||
21 | 20 | ||
22 | # IRQ objects | 21 | # IRQ objects |
23 | obj-$(CONFIG_ARCH_SH7372) += entry-intc.o | 22 | obj-$(CONFIG_ARCH_SH7372) += entry-intc.o |
diff --git a/arch/arm/mach-shmobile/clock-r8a7740.c b/arch/arm/mach-shmobile/clock-r8a7740.c index 19ce885a3b43..1feb9a2286a8 100644 --- a/arch/arm/mach-shmobile/clock-r8a7740.c +++ b/arch/arm/mach-shmobile/clock-r8a7740.c | |||
@@ -593,29 +593,42 @@ static struct clk_lookup lookups[] = { | |||
593 | CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP128]), | 593 | CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP128]), |
594 | 594 | ||
595 | CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), | 595 | CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), |
596 | CLKDEV_DEV_ID("e6c80000.sci", &mstp_clks[MSTP200]), | ||
596 | CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP201]), | 597 | CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP201]), |
598 | CLKDEV_DEV_ID("e6c70000.sci", &mstp_clks[MSTP201]), | ||
597 | CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP202]), | 599 | CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP202]), |
600 | CLKDEV_DEV_ID("e6c60000.sci", &mstp_clks[MSTP202]), | ||
598 | CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]), | 601 | CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]), |
602 | CLKDEV_DEV_ID("e6c50000.sci", &mstp_clks[MSTP203]), | ||
599 | CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]), | 603 | CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]), |
604 | CLKDEV_DEV_ID("e6c40000.sci", &mstp_clks[MSTP204]), | ||
600 | CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP206]), | 605 | CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP206]), |
606 | CLKDEV_DEV_ID("e6c30000.sci", &mstp_clks[MSTP206]), | ||
601 | CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), | 607 | CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), |
608 | CLKDEV_DEV_ID("e6cb0000.sci", &mstp_clks[MSTP207]), | ||
602 | CLKDEV_DEV_ID("sh-dma-engine.3", &mstp_clks[MSTP214]), | 609 | CLKDEV_DEV_ID("sh-dma-engine.3", &mstp_clks[MSTP214]), |
603 | CLKDEV_DEV_ID("sh-dma-engine.2", &mstp_clks[MSTP216]), | 610 | CLKDEV_DEV_ID("sh-dma-engine.2", &mstp_clks[MSTP216]), |
604 | CLKDEV_DEV_ID("sh-dma-engine.1", &mstp_clks[MSTP217]), | 611 | CLKDEV_DEV_ID("sh-dma-engine.1", &mstp_clks[MSTP217]), |
605 | CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]), | 612 | CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]), |
606 | CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP222]), | 613 | CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP222]), |
614 | CLKDEV_DEV_ID("e6cd0000.sci", &mstp_clks[MSTP222]), | ||
607 | CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP230]), | 615 | CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP230]), |
616 | CLKDEV_DEV_ID("e6cc0000.sci", &mstp_clks[MSTP230]), | ||
608 | 617 | ||
609 | CLKDEV_DEV_ID("sh_cmt.10", &mstp_clks[MSTP329]), | 618 | CLKDEV_DEV_ID("sh_cmt.10", &mstp_clks[MSTP329]), |
610 | CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), | 619 | CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), |
611 | CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), | 620 | CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), |
612 | CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP320]), | 621 | CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP320]), |
613 | CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), | 622 | CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), |
623 | CLKDEV_DEV_ID("e6850000.sdhi", &mstp_clks[MSTP314]), | ||
614 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), | 624 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), |
625 | CLKDEV_DEV_ID("e6860000.sdhi", &mstp_clks[MSTP313]), | ||
615 | CLKDEV_DEV_ID("sh_mmcif", &mstp_clks[MSTP312]), | 626 | CLKDEV_DEV_ID("sh_mmcif", &mstp_clks[MSTP312]), |
627 | CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), | ||
616 | CLKDEV_DEV_ID("sh-eth", &mstp_clks[MSTP309]), | 628 | CLKDEV_DEV_ID("sh-eth", &mstp_clks[MSTP309]), |
617 | 629 | ||
618 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP415]), | 630 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP415]), |
631 | CLKDEV_DEV_ID("e6870000.sdhi", &mstp_clks[MSTP415]), | ||
619 | 632 | ||
620 | /* ICK */ | 633 | /* ICK */ |
621 | CLKDEV_ICK_ID("host", "renesas_usbhs", &mstp_clks[MSTP416]), | 634 | CLKDEV_ICK_ID("host", "renesas_usbhs", &mstp_clks[MSTP416]), |
diff --git a/arch/arm/mach-shmobile/clock-r8a7779.c b/arch/arm/mach-shmobile/clock-r8a7779.c index 1db36537255c..d9edeaf66007 100644 --- a/arch/arm/mach-shmobile/clock-r8a7779.c +++ b/arch/arm/mach-shmobile/clock-r8a7779.c | |||
@@ -87,7 +87,8 @@ static struct clk div4_clks[DIV4_NR] = { | |||
87 | }; | 87 | }; |
88 | 88 | ||
89 | enum { MSTP323, MSTP322, MSTP321, MSTP320, | 89 | enum { MSTP323, MSTP322, MSTP321, MSTP320, |
90 | MSTP101, MSTP100, | 90 | MSTP115, |
91 | MSTP103, MSTP101, MSTP100, | ||
91 | MSTP030, | 92 | MSTP030, |
92 | MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021, | 93 | MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021, |
93 | MSTP016, MSTP015, MSTP014, | 94 | MSTP016, MSTP015, MSTP014, |
@@ -99,6 +100,8 @@ static struct clk mstp_clks[MSTP_NR] = { | |||
99 | [MSTP322] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 22, 0), /* SDHI1 */ | 100 | [MSTP322] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 22, 0), /* SDHI1 */ |
100 | [MSTP321] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 21, 0), /* SDHI2 */ | 101 | [MSTP321] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 21, 0), /* SDHI2 */ |
101 | [MSTP320] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 20, 0), /* SDHI3 */ | 102 | [MSTP320] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 20, 0), /* SDHI3 */ |
103 | [MSTP115] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 15, 0), /* SATA */ | ||
104 | [MSTP103] = SH_CLK_MSTP32(&div4_clks[DIV4_S], MSTPCR1, 3, 0), /* DU */ | ||
102 | [MSTP101] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 1, 0), /* USB2 */ | 105 | [MSTP101] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 1, 0), /* USB2 */ |
103 | [MSTP100] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 0, 0), /* USB0/1 */ | 106 | [MSTP100] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 0, 0), /* USB0/1 */ |
104 | [MSTP030] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 30, 0), /* I2C0 */ | 107 | [MSTP030] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 30, 0), /* I2C0 */ |
@@ -156,6 +159,8 @@ static struct clk_lookup lookups[] = { | |||
156 | CLKDEV_CON_ID("peripheral_clk", &div4_clks[DIV4_P]), | 159 | CLKDEV_CON_ID("peripheral_clk", &div4_clks[DIV4_P]), |
157 | 160 | ||
158 | /* MSTP32 clocks */ | 161 | /* MSTP32 clocks */ |
162 | CLKDEV_DEV_ID("sata_rcar", &mstp_clks[MSTP115]), /* SATA */ | ||
163 | CLKDEV_DEV_ID("fc600000.sata", &mstp_clks[MSTP115]), /* SATA w/DT */ | ||
159 | CLKDEV_DEV_ID("ehci-platform.1", &mstp_clks[MSTP101]), /* USB EHCI port2 */ | 164 | CLKDEV_DEV_ID("ehci-platform.1", &mstp_clks[MSTP101]), /* USB EHCI port2 */ |
160 | CLKDEV_DEV_ID("ohci-platform.1", &mstp_clks[MSTP101]), /* USB OHCI port2 */ | 165 | CLKDEV_DEV_ID("ohci-platform.1", &mstp_clks[MSTP101]), /* USB OHCI port2 */ |
161 | CLKDEV_DEV_ID("ehci-platform.0", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */ | 166 | CLKDEV_DEV_ID("ehci-platform.0", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */ |
@@ -180,6 +185,7 @@ static struct clk_lookup lookups[] = { | |||
180 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP322]), /* SDHI1 */ | 185 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP322]), /* SDHI1 */ |
181 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP321]), /* SDHI2 */ | 186 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP321]), /* SDHI2 */ |
182 | CLKDEV_DEV_ID("sh_mobile_sdhi.3", &mstp_clks[MSTP320]), /* SDHI3 */ | 187 | CLKDEV_DEV_ID("sh_mobile_sdhi.3", &mstp_clks[MSTP320]), /* SDHI3 */ |
188 | CLKDEV_DEV_ID("rcar-du.0", &mstp_clks[MSTP103]), /* DU */ | ||
183 | }; | 189 | }; |
184 | 190 | ||
185 | void __init r8a7779_clock_init(void) | 191 | void __init r8a7779_clock_init(void) |
diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index afa5423a0f93..71843dd39e16 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c | |||
@@ -265,12 +265,12 @@ enum { DIV4_I, DIV4_ZG, DIV4_M3, DIV4_B, DIV4_M1, DIV4_M2, | |||
265 | 265 | ||
266 | static struct clk div4_clks[DIV4_NR] = { | 266 | static struct clk div4_clks[DIV4_NR] = { |
267 | [DIV4_I] = DIV4(FRQCRA, 20, 0xdff, CLK_ENABLE_ON_INIT), | 267 | [DIV4_I] = DIV4(FRQCRA, 20, 0xdff, CLK_ENABLE_ON_INIT), |
268 | [DIV4_ZG] = DIV4(FRQCRA, 16, 0xd7f, CLK_ENABLE_ON_INIT), | 268 | [DIV4_ZG] = SH_CLK_DIV4(&pll0_clk, FRQCRA, 16, 0xd7f, CLK_ENABLE_ON_INIT), |
269 | [DIV4_M3] = DIV4(FRQCRA, 12, 0x1dff, CLK_ENABLE_ON_INIT), | 269 | [DIV4_M3] = DIV4(FRQCRA, 12, 0x1dff, CLK_ENABLE_ON_INIT), |
270 | [DIV4_B] = DIV4(FRQCRA, 8, 0xdff, CLK_ENABLE_ON_INIT), | 270 | [DIV4_B] = DIV4(FRQCRA, 8, 0xdff, CLK_ENABLE_ON_INIT), |
271 | [DIV4_M1] = DIV4(FRQCRA, 4, 0x1dff, 0), | 271 | [DIV4_M1] = DIV4(FRQCRA, 4, 0x1dff, 0), |
272 | [DIV4_M2] = DIV4(FRQCRA, 0, 0x1dff, 0), | 272 | [DIV4_M2] = DIV4(FRQCRA, 0, 0x1dff, 0), |
273 | [DIV4_Z] = DIV4(FRQCRB, 24, 0x97f, 0), | 273 | [DIV4_Z] = SH_CLK_DIV4(&pll0_clk, FRQCRB, 24, 0x97f, 0), |
274 | [DIV4_ZTR] = DIV4(FRQCRB, 20, 0xdff, 0), | 274 | [DIV4_ZTR] = DIV4(FRQCRB, 20, 0xdff, 0), |
275 | [DIV4_ZT] = DIV4(FRQCRB, 16, 0xdff, 0), | 275 | [DIV4_ZT] = DIV4(FRQCRB, 16, 0xdff, 0), |
276 | [DIV4_ZX] = DIV4(FRQCRB, 12, 0xdff, 0), | 276 | [DIV4_ZX] = DIV4(FRQCRB, 12, 0xdff, 0), |
@@ -581,10 +581,13 @@ static struct clk_lookup lookups[] = { | |||
581 | CLKDEV_DEV_ID("e6822000.i2c", &mstp_clks[MSTP323]), /* I2C1 */ | 581 | CLKDEV_DEV_ID("e6822000.i2c", &mstp_clks[MSTP323]), /* I2C1 */ |
582 | CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP322]), /* USB */ | 582 | CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP322]), /* USB */ |
583 | CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */ | 583 | CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */ |
584 | CLKDEV_DEV_ID("ee100000.sdhi", &mstp_clks[MSTP314]), /* SDHI0 */ | ||
584 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ | 585 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ |
586 | CLKDEV_DEV_ID("ee120000.sdhi", &mstp_clks[MSTP313]), /* SDHI1 */ | ||
585 | CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */ | 587 | CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */ |
586 | CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMCIF0 */ | 588 | CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMCIF0 */ |
587 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */ | 589 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */ |
590 | CLKDEV_DEV_ID("ee140000.sdhi", &mstp_clks[MSTP311]), /* SDHI2 */ | ||
588 | CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */ | 591 | CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */ |
589 | CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */ | 592 | CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */ |
590 | CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */ | 593 | CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */ |
diff --git a/arch/arm/mach-shmobile/headsmp-sh73a0.S b/arch/arm/mach-shmobile/headsmp-scu.S index bec4c0d9b713..7d113f898e7f 100644 --- a/arch/arm/mach-shmobile/headsmp-sh73a0.S +++ b/arch/arm/mach-shmobile/headsmp-scu.S | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * SMP support for SoC sh73a0 | 2 | * Shared SCU setup for mach-shmobile |
3 | * | 3 | * |
4 | * Copyright (C) 2012 Bastian Hecht | 4 | * Copyright (C) 2012 Bastian Hecht |
5 | * | 5 | * |
@@ -35,11 +35,12 @@ | |||
35 | * the physical address as the MMU is still turned off. | 35 | * the physical address as the MMU is still turned off. |
36 | */ | 36 | */ |
37 | .align 12 | 37 | .align 12 |
38 | ENTRY(sh73a0_secondary_vector) | 38 | ENTRY(shmobile_secondary_vector_scu) |
39 | mrc p15, 0, r0, c0, c0, 5 @ read MIPDR | 39 | mrc p15, 0, r0, c0, c0, 5 @ read MIPDR |
40 | and r0, r0, #3 @ mask out cpu ID | 40 | and r0, r0, #3 @ mask out cpu ID |
41 | lsl r0, r0, #3 @ we will shift by cpu_id * 8 bits | 41 | lsl r0, r0, #3 @ we will shift by cpu_id * 8 bits |
42 | mov r1, #0xf0000000 @ SCU base address | 42 | ldr r1, 2f |
43 | ldr r1, [r1] @ SCU base address | ||
43 | ldr r2, [r1, #8] @ SCU Power Status Register | 44 | ldr r2, [r1, #8] @ SCU Power Status Register |
44 | mov r3, #3 | 45 | mov r3, #3 |
45 | bic r2, r2, r3, lsl r0 @ Clear bits of our CPU (Run Mode) | 46 | bic r2, r2, r3, lsl r0 @ Clear bits of our CPU (Run Mode) |
@@ -47,4 +48,10 @@ ENTRY(sh73a0_secondary_vector) | |||
47 | 48 | ||
48 | ldr pc, 1f | 49 | ldr pc, 1f |
49 | 1: .long shmobile_invalidate_start - PAGE_OFFSET + PLAT_PHYS_OFFSET | 50 | 1: .long shmobile_invalidate_start - PAGE_OFFSET + PLAT_PHYS_OFFSET |
50 | ENDPROC(sh73a0_secondary_vector) | 51 | 2: .long shmobile_scu_base - PAGE_OFFSET + PLAT_PHYS_OFFSET |
52 | ENDPROC(shmobile_secondary_vector_scu) | ||
53 | |||
54 | .text | ||
55 | .globl shmobile_scu_base | ||
56 | shmobile_scu_base: | ||
57 | .space 4 | ||
diff --git a/arch/arm/mach-shmobile/hotplug.c b/arch/arm/mach-shmobile/hotplug.c deleted file mode 100644 index a1524e3367b0..000000000000 --- a/arch/arm/mach-shmobile/hotplug.c +++ /dev/null | |||
@@ -1,68 +0,0 @@ | |||
1 | /* | ||
2 | * SMP support for R-Mobile / SH-Mobile | ||
3 | * | ||
4 | * Copyright (C) 2010 Magnus Damm | ||
5 | * | ||
6 | * Based on realview, Copyright (C) 2002 ARM Ltd, All Rights Reserved | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/errno.h> | ||
14 | #include <linux/smp.h> | ||
15 | #include <linux/cpumask.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/of.h> | ||
18 | #include <mach/common.h> | ||
19 | #include <mach/r8a7779.h> | ||
20 | #include <mach/emev2.h> | ||
21 | #include <asm/cacheflush.h> | ||
22 | #include <asm/mach-types.h> | ||
23 | |||
24 | static cpumask_t dead_cpus; | ||
25 | |||
26 | void shmobile_cpu_die(unsigned int cpu) | ||
27 | { | ||
28 | /* hardware shutdown code running on the CPU that is being offlined */ | ||
29 | flush_cache_all(); | ||
30 | dsb(); | ||
31 | |||
32 | /* notify platform_cpu_kill() that hardware shutdown is finished */ | ||
33 | cpumask_set_cpu(cpu, &dead_cpus); | ||
34 | |||
35 | /* wait for SoC code in platform_cpu_kill() to shut off CPU core | ||
36 | * power. CPU bring up starts from the reset vector. | ||
37 | */ | ||
38 | while (1) { | ||
39 | /* | ||
40 | * here's the WFI | ||
41 | */ | ||
42 | asm(".word 0xe320f003\n" | ||
43 | : | ||
44 | : | ||
45 | : "memory", "cc"); | ||
46 | } | ||
47 | } | ||
48 | |||
49 | int shmobile_cpu_disable(unsigned int cpu) | ||
50 | { | ||
51 | cpumask_clear_cpu(cpu, &dead_cpus); | ||
52 | /* | ||
53 | * we don't allow CPU 0 to be shutdown (it is still too special | ||
54 | * e.g. clock tick interrupts) | ||
55 | */ | ||
56 | return cpu == 0 ? -EPERM : 0; | ||
57 | } | ||
58 | |||
59 | int shmobile_cpu_disable_any(unsigned int cpu) | ||
60 | { | ||
61 | cpumask_clear_cpu(cpu, &dead_cpus); | ||
62 | return 0; | ||
63 | } | ||
64 | |||
65 | int shmobile_cpu_is_dead(unsigned int cpu) | ||
66 | { | ||
67 | return cpumask_test_cpu(cpu, &dead_cpus); | ||
68 | } | ||
diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index e48606d8a2be..86fcdf9fde1b 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h | |||
@@ -8,6 +8,7 @@ extern void shmobile_setup_delay(unsigned int max_cpu_core_mhz, | |||
8 | struct twd_local_timer; | 8 | struct twd_local_timer; |
9 | extern void shmobile_setup_console(void); | 9 | extern void shmobile_setup_console(void); |
10 | extern void shmobile_secondary_vector(void); | 10 | extern void shmobile_secondary_vector(void); |
11 | extern void shmobile_secondary_vector_scu(void); | ||
11 | struct clk; | 12 | struct clk; |
12 | extern int shmobile_clk_init(void); | 13 | extern int shmobile_clk_init(void); |
13 | extern void shmobile_handle_irq_intc(struct pt_regs *); | 14 | extern void shmobile_handle_irq_intc(struct pt_regs *); |
@@ -33,23 +34,23 @@ extern int sh7372_do_idle_sysc(unsigned long sleep_mode); | |||
33 | extern struct clk sh7372_extal1_clk; | 34 | extern struct clk sh7372_extal1_clk; |
34 | extern struct clk sh7372_extal2_clk; | 35 | extern struct clk sh7372_extal2_clk; |
35 | 36 | ||
37 | extern void sh73a0_init_delay(void); | ||
36 | extern void sh73a0_init_irq(void); | 38 | extern void sh73a0_init_irq(void); |
37 | extern void sh73a0_init_irq_dt(void); | 39 | extern void sh73a0_init_irq_dt(void); |
38 | extern void sh73a0_map_io(void); | 40 | extern void sh73a0_map_io(void); |
39 | extern void sh73a0_earlytimer_init(void); | 41 | extern void sh73a0_earlytimer_init(void); |
40 | extern void sh73a0_add_early_devices(void); | 42 | extern void sh73a0_add_early_devices(void); |
41 | extern void sh73a0_add_early_devices_dt(void); | ||
42 | extern void sh73a0_add_standard_devices(void); | 43 | extern void sh73a0_add_standard_devices(void); |
43 | extern void sh73a0_add_standard_devices_dt(void); | 44 | extern void sh73a0_add_standard_devices_dt(void); |
44 | extern void sh73a0_clock_init(void); | 45 | extern void sh73a0_clock_init(void); |
45 | extern void sh73a0_pinmux_init(void); | 46 | extern void sh73a0_pinmux_init(void); |
46 | extern void sh73a0_pm_init(void); | 47 | extern void sh73a0_pm_init(void); |
47 | extern void sh73a0_secondary_vector(void); | ||
48 | extern struct clk sh73a0_extal1_clk; | 48 | extern struct clk sh73a0_extal1_clk; |
49 | extern struct clk sh73a0_extal2_clk; | 49 | extern struct clk sh73a0_extal2_clk; |
50 | extern struct clk sh73a0_extcki_clk; | 50 | extern struct clk sh73a0_extcki_clk; |
51 | extern struct clk sh73a0_extalr_clk; | 51 | extern struct clk sh73a0_extalr_clk; |
52 | 52 | ||
53 | extern void r8a7740_meram_workaround(void); | ||
53 | extern void r8a7740_init_irq(void); | 54 | extern void r8a7740_init_irq(void); |
54 | extern void r8a7740_map_io(void); | 55 | extern void r8a7740_map_io(void); |
55 | extern void r8a7740_add_early_devices(void); | 56 | extern void r8a7740_add_early_devices(void); |
@@ -58,16 +59,17 @@ extern void r8a7740_clock_init(u8 md_ck); | |||
58 | extern void r8a7740_pinmux_init(void); | 59 | extern void r8a7740_pinmux_init(void); |
59 | extern void r8a7740_pm_init(void); | 60 | extern void r8a7740_pm_init(void); |
60 | 61 | ||
62 | extern void r8a7779_init_delay(void); | ||
61 | extern void r8a7779_init_irq(void); | 63 | extern void r8a7779_init_irq(void); |
64 | extern void r8a7779_init_irq_dt(void); | ||
62 | extern void r8a7779_map_io(void); | 65 | extern void r8a7779_map_io(void); |
63 | extern void r8a7779_earlytimer_init(void); | 66 | extern void r8a7779_earlytimer_init(void); |
64 | extern void r8a7779_add_early_devices(void); | 67 | extern void r8a7779_add_early_devices(void); |
65 | extern void r8a7779_add_standard_devices(void); | 68 | extern void r8a7779_add_standard_devices(void); |
69 | extern void r8a7779_add_standard_devices_dt(void); | ||
66 | extern void r8a7779_clock_init(void); | 70 | extern void r8a7779_clock_init(void); |
67 | extern void r8a7779_pinmux_init(void); | 71 | extern void r8a7779_pinmux_init(void); |
68 | extern void r8a7779_pm_init(void); | 72 | extern void r8a7779_pm_init(void); |
69 | extern void r8a7740_meram_workaround(void); | ||
70 | |||
71 | extern void r8a7779_register_twd(void); | 73 | extern void r8a7779_register_twd(void); |
72 | 74 | ||
73 | #ifdef CONFIG_SUSPEND | 75 | #ifdef CONFIG_SUSPEND |
@@ -82,16 +84,7 @@ int shmobile_cpuidle_init(void); | |||
82 | static inline int shmobile_cpuidle_init(void) { return 0; } | 84 | static inline int shmobile_cpuidle_init(void) { return 0; } |
83 | #endif | 85 | #endif |
84 | 86 | ||
85 | extern void shmobile_cpu_die(unsigned int cpu); | 87 | extern void __iomem *shmobile_scu_base; |
86 | extern int shmobile_cpu_disable(unsigned int cpu); | ||
87 | extern int shmobile_cpu_disable_any(unsigned int cpu); | ||
88 | |||
89 | #ifdef CONFIG_HOTPLUG_CPU | ||
90 | extern int shmobile_cpu_is_dead(unsigned int cpu); | ||
91 | #else | ||
92 | static inline int shmobile_cpu_is_dead(unsigned int cpu) { return 1; } | ||
93 | #endif | ||
94 | |||
95 | extern void shmobile_smp_init_cpus(unsigned int ncores); | 88 | extern void shmobile_smp_init_cpus(unsigned int ncores); |
96 | 89 | ||
97 | static inline void __init shmobile_init_late(void) | 90 | static inline void __init shmobile_init_late(void) |
diff --git a/arch/arm/mach-shmobile/include/mach/irqs.h b/arch/arm/mach-shmobile/include/mach/irqs.h index 06a5da3c3050..992ed213cec1 100644 --- a/arch/arm/mach-shmobile/include/mach/irqs.h +++ b/arch/arm/mach-shmobile/include/mach/irqs.h | |||
@@ -5,6 +5,7 @@ | |||
5 | 5 | ||
6 | /* GIC */ | 6 | /* GIC */ |
7 | #define gic_spi(nr) ((nr) + 32) | 7 | #define gic_spi(nr) ((nr) + 32) |
8 | #define gic_iid(nr) (nr) /* ICCIAR / interrupt ID */ | ||
8 | 9 | ||
9 | /* INTCS */ | 10 | /* INTCS */ |
10 | #define INTCS_VECT_BASE 0x3400 | 11 | #define INTCS_VECT_BASE 0x3400 |
diff --git a/arch/arm/mach-shmobile/intc-r8a7779.c b/arch/arm/mach-shmobile/intc-r8a7779.c index 8807c27f71f9..f9cc4bc9c798 100644 --- a/arch/arm/mach-shmobile/intc-r8a7779.c +++ b/arch/arm/mach-shmobile/intc-r8a7779.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | #include <linux/irqchip/arm-gic.h> | 25 | #include <linux/irqchip/arm-gic.h> |
26 | #include <mach/common.h> | 26 | #include <mach/common.h> |
27 | #include <linux/irqchip.h> | ||
27 | #include <mach/intc.h> | 28 | #include <mach/intc.h> |
28 | #include <mach/r8a7779.h> | 29 | #include <mach/r8a7779.h> |
29 | #include <asm/mach-types.h> | 30 | #include <asm/mach-types.h> |
@@ -43,13 +44,8 @@ static int r8a7779_set_wake(struct irq_data *data, unsigned int on) | |||
43 | return 0; /* always allow wakeup */ | 44 | return 0; /* always allow wakeup */ |
44 | } | 45 | } |
45 | 46 | ||
46 | void __init r8a7779_init_irq(void) | 47 | static void __init r8a7779_init_irq_common(void) |
47 | { | 48 | { |
48 | void __iomem *gic_dist_base = IOMEM(0xf0001000); | ||
49 | void __iomem *gic_cpu_base = IOMEM(0xf0000100); | ||
50 | |||
51 | /* use GIC to handle interrupts */ | ||
52 | gic_init(0, 29, gic_dist_base, gic_cpu_base); | ||
53 | gic_arch_extn.irq_set_wake = r8a7779_set_wake; | 49 | gic_arch_extn.irq_set_wake = r8a7779_set_wake; |
54 | 50 | ||
55 | /* route all interrupts to ARM */ | 51 | /* route all interrupts to ARM */ |
@@ -63,3 +59,22 @@ void __init r8a7779_init_irq(void) | |||
63 | __raw_writel(0xbffffffc, INT2SMSKCR3); | 59 | __raw_writel(0xbffffffc, INT2SMSKCR3); |
64 | __raw_writel(0x003fee3f, INT2SMSKCR4); | 60 | __raw_writel(0x003fee3f, INT2SMSKCR4); |
65 | } | 61 | } |
62 | |||
63 | void __init r8a7779_init_irq(void) | ||
64 | { | ||
65 | void __iomem *gic_dist_base = IOMEM(0xf0001000); | ||
66 | void __iomem *gic_cpu_base = IOMEM(0xf0000100); | ||
67 | |||
68 | /* use GIC to handle interrupts */ | ||
69 | gic_init(0, 29, gic_dist_base, gic_cpu_base); | ||
70 | |||
71 | r8a7779_init_irq_common(); | ||
72 | } | ||
73 | |||
74 | #ifdef CONFIG_OF | ||
75 | void __init r8a7779_init_irq_dt(void) | ||
76 | { | ||
77 | irqchip_init(); | ||
78 | r8a7779_init_irq_common(); | ||
79 | } | ||
80 | #endif | ||
diff --git a/arch/arm/mach-shmobile/intc-sh73a0.c b/arch/arm/mach-shmobile/intc-sh73a0.c index 91faba666d46..a81a1d804e2e 100644 --- a/arch/arm/mach-shmobile/intc-sh73a0.c +++ b/arch/arm/mach-shmobile/intc-sh73a0.c | |||
@@ -460,11 +460,3 @@ void __init sh73a0_init_irq(void) | |||
460 | sh73a0_pint1_cascade.handler = sh73a0_pint1_demux; | 460 | sh73a0_pint1_cascade.handler = sh73a0_pint1_demux; |
461 | setup_irq(gic_spi(34), &sh73a0_pint1_cascade); | 461 | setup_irq(gic_spi(34), &sh73a0_pint1_cascade); |
462 | } | 462 | } |
463 | |||
464 | #ifdef CONFIG_OF | ||
465 | void __init sh73a0_init_irq_dt(void) | ||
466 | { | ||
467 | irqchip_init(); | ||
468 | gic_arch_extn.irq_set_wake = sh73a0_set_wake; | ||
469 | } | ||
470 | #endif | ||
diff --git a/arch/arm/mach-shmobile/setup-emev2.c b/arch/arm/mach-shmobile/setup-emev2.c index 47662a581c0a..e4545c152722 100644 --- a/arch/arm/mach-shmobile/setup-emev2.c +++ b/arch/arm/mach-shmobile/setup-emev2.c | |||
@@ -404,7 +404,7 @@ void __init emev2_add_standard_devices(void) | |||
404 | ARRAY_SIZE(emev2_late_devices)); | 404 | ARRAY_SIZE(emev2_late_devices)); |
405 | } | 405 | } |
406 | 406 | ||
407 | void __init emev2_init_delay(void) | 407 | static void __init emev2_init_delay(void) |
408 | { | 408 | { |
409 | shmobile_setup_delay(533, 1, 3); /* Cortex-A9 @ 533MHz */ | 409 | shmobile_setup_delay(533, 1, 3); /* Cortex-A9 @ 533MHz */ |
410 | } | 410 | } |
@@ -439,7 +439,7 @@ static const struct of_dev_auxdata emev2_auxdata_lookup[] __initconst = { | |||
439 | { } | 439 | { } |
440 | }; | 440 | }; |
441 | 441 | ||
442 | void __init emev2_add_standard_devices_dt(void) | 442 | static void __init emev2_add_standard_devices_dt(void) |
443 | { | 443 | { |
444 | of_platform_populate(NULL, of_default_bus_match_table, | 444 | of_platform_populate(NULL, of_default_bus_match_table, |
445 | emev2_auxdata_lookup, NULL); | 445 | emev2_auxdata_lookup, NULL); |
diff --git a/arch/arm/mach-shmobile/setup-r8a7779.c b/arch/arm/mach-shmobile/setup-r8a7779.c index c54ff9b29fe5..042df35e71a0 100644 --- a/arch/arm/mach-shmobile/setup-r8a7779.c +++ b/arch/arm/mach-shmobile/setup-r8a7779.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/interrupt.h> | 22 | #include <linux/interrupt.h> |
23 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
24 | #include <linux/of_platform.h> | ||
24 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
25 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
26 | #include <linux/input.h> | 27 | #include <linux/input.h> |
@@ -28,6 +29,7 @@ | |||
28 | #include <linux/serial_sci.h> | 29 | #include <linux/serial_sci.h> |
29 | #include <linux/sh_intc.h> | 30 | #include <linux/sh_intc.h> |
30 | #include <linux/sh_timer.h> | 31 | #include <linux/sh_timer.h> |
32 | #include <linux/dma-mapping.h> | ||
31 | #include <mach/hardware.h> | 33 | #include <mach/hardware.h> |
32 | #include <mach/irqs.h> | 34 | #include <mach/irqs.h> |
33 | #include <mach/r8a7779.h> | 35 | #include <mach/r8a7779.h> |
@@ -91,7 +93,7 @@ static struct plat_sci_port scif0_platform_data = { | |||
91 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 93 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
92 | .scbrr_algo_id = SCBRR_ALGO_2, | 94 | .scbrr_algo_id = SCBRR_ALGO_2, |
93 | .type = PORT_SCIF, | 95 | .type = PORT_SCIF, |
94 | .irqs = SCIx_IRQ_MUXED(gic_spi(88)), | 96 | .irqs = SCIx_IRQ_MUXED(gic_iid(0x78)), |
95 | }; | 97 | }; |
96 | 98 | ||
97 | static struct platform_device scif0_device = { | 99 | static struct platform_device scif0_device = { |
@@ -108,7 +110,7 @@ static struct plat_sci_port scif1_platform_data = { | |||
108 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 110 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
109 | .scbrr_algo_id = SCBRR_ALGO_2, | 111 | .scbrr_algo_id = SCBRR_ALGO_2, |
110 | .type = PORT_SCIF, | 112 | .type = PORT_SCIF, |
111 | .irqs = SCIx_IRQ_MUXED(gic_spi(89)), | 113 | .irqs = SCIx_IRQ_MUXED(gic_iid(0x79)), |
112 | }; | 114 | }; |
113 | 115 | ||
114 | static struct platform_device scif1_device = { | 116 | static struct platform_device scif1_device = { |
@@ -125,7 +127,7 @@ static struct plat_sci_port scif2_platform_data = { | |||
125 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 127 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
126 | .scbrr_algo_id = SCBRR_ALGO_2, | 128 | .scbrr_algo_id = SCBRR_ALGO_2, |
127 | .type = PORT_SCIF, | 129 | .type = PORT_SCIF, |
128 | .irqs = SCIx_IRQ_MUXED(gic_spi(90)), | 130 | .irqs = SCIx_IRQ_MUXED(gic_iid(0x7a)), |
129 | }; | 131 | }; |
130 | 132 | ||
131 | static struct platform_device scif2_device = { | 133 | static struct platform_device scif2_device = { |
@@ -142,7 +144,7 @@ static struct plat_sci_port scif3_platform_data = { | |||
142 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 144 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
143 | .scbrr_algo_id = SCBRR_ALGO_2, | 145 | .scbrr_algo_id = SCBRR_ALGO_2, |
144 | .type = PORT_SCIF, | 146 | .type = PORT_SCIF, |
145 | .irqs = SCIx_IRQ_MUXED(gic_spi(91)), | 147 | .irqs = SCIx_IRQ_MUXED(gic_iid(0x7b)), |
146 | }; | 148 | }; |
147 | 149 | ||
148 | static struct platform_device scif3_device = { | 150 | static struct platform_device scif3_device = { |
@@ -159,7 +161,7 @@ static struct plat_sci_port scif4_platform_data = { | |||
159 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 161 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
160 | .scbrr_algo_id = SCBRR_ALGO_2, | 162 | .scbrr_algo_id = SCBRR_ALGO_2, |
161 | .type = PORT_SCIF, | 163 | .type = PORT_SCIF, |
162 | .irqs = SCIx_IRQ_MUXED(gic_spi(92)), | 164 | .irqs = SCIx_IRQ_MUXED(gic_iid(0x7c)), |
163 | }; | 165 | }; |
164 | 166 | ||
165 | static struct platform_device scif4_device = { | 167 | static struct platform_device scif4_device = { |
@@ -176,7 +178,7 @@ static struct plat_sci_port scif5_platform_data = { | |||
176 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 178 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
177 | .scbrr_algo_id = SCBRR_ALGO_2, | 179 | .scbrr_algo_id = SCBRR_ALGO_2, |
178 | .type = PORT_SCIF, | 180 | .type = PORT_SCIF, |
179 | .irqs = SCIx_IRQ_MUXED(gic_spi(93)), | 181 | .irqs = SCIx_IRQ_MUXED(gic_iid(0x7d)), |
180 | }; | 182 | }; |
181 | 183 | ||
182 | static struct platform_device scif5_device = { | 184 | static struct platform_device scif5_device = { |
@@ -203,7 +205,7 @@ static struct resource tmu00_resources[] = { | |||
203 | .flags = IORESOURCE_MEM, | 205 | .flags = IORESOURCE_MEM, |
204 | }, | 206 | }, |
205 | [1] = { | 207 | [1] = { |
206 | .start = gic_spi(32), | 208 | .start = gic_iid(0x40), |
207 | .flags = IORESOURCE_IRQ, | 209 | .flags = IORESOURCE_IRQ, |
208 | }, | 210 | }, |
209 | }; | 211 | }; |
@@ -233,7 +235,7 @@ static struct resource tmu01_resources[] = { | |||
233 | .flags = IORESOURCE_MEM, | 235 | .flags = IORESOURCE_MEM, |
234 | }, | 236 | }, |
235 | [1] = { | 237 | [1] = { |
236 | .start = gic_spi(33), | 238 | .start = gic_iid(0x41), |
237 | .flags = IORESOURCE_IRQ, | 239 | .flags = IORESOURCE_IRQ, |
238 | }, | 240 | }, |
239 | }; | 241 | }; |
@@ -255,7 +257,7 @@ static struct resource rcar_i2c0_res[] = { | |||
255 | .end = 0xffc70fff, | 257 | .end = 0xffc70fff, |
256 | .flags = IORESOURCE_MEM, | 258 | .flags = IORESOURCE_MEM, |
257 | }, { | 259 | }, { |
258 | .start = gic_spi(79), | 260 | .start = gic_iid(0x6f), |
259 | .flags = IORESOURCE_IRQ, | 261 | .flags = IORESOURCE_IRQ, |
260 | }, | 262 | }, |
261 | }; | 263 | }; |
@@ -273,7 +275,7 @@ static struct resource rcar_i2c1_res[] = { | |||
273 | .end = 0xffc71fff, | 275 | .end = 0xffc71fff, |
274 | .flags = IORESOURCE_MEM, | 276 | .flags = IORESOURCE_MEM, |
275 | }, { | 277 | }, { |
276 | .start = gic_spi(82), | 278 | .start = gic_iid(0x72), |
277 | .flags = IORESOURCE_IRQ, | 279 | .flags = IORESOURCE_IRQ, |
278 | }, | 280 | }, |
279 | }; | 281 | }; |
@@ -291,7 +293,7 @@ static struct resource rcar_i2c2_res[] = { | |||
291 | .end = 0xffc72fff, | 293 | .end = 0xffc72fff, |
292 | .flags = IORESOURCE_MEM, | 294 | .flags = IORESOURCE_MEM, |
293 | }, { | 295 | }, { |
294 | .start = gic_spi(80), | 296 | .start = gic_iid(0x70), |
295 | .flags = IORESOURCE_IRQ, | 297 | .flags = IORESOURCE_IRQ, |
296 | }, | 298 | }, |
297 | }; | 299 | }; |
@@ -309,7 +311,7 @@ static struct resource rcar_i2c3_res[] = { | |||
309 | .end = 0xffc73fff, | 311 | .end = 0xffc73fff, |
310 | .flags = IORESOURCE_MEM, | 312 | .flags = IORESOURCE_MEM, |
311 | }, { | 313 | }, { |
312 | .start = gic_spi(81), | 314 | .start = gic_iid(0x71), |
313 | .flags = IORESOURCE_IRQ, | 315 | .flags = IORESOURCE_IRQ, |
314 | }, | 316 | }, |
315 | }; | 317 | }; |
@@ -321,7 +323,31 @@ static struct platform_device i2c3_device = { | |||
321 | .num_resources = ARRAY_SIZE(rcar_i2c3_res), | 323 | .num_resources = ARRAY_SIZE(rcar_i2c3_res), |
322 | }; | 324 | }; |
323 | 325 | ||
324 | static struct platform_device *r8a7779_early_devices[] __initdata = { | 326 | static struct resource sata_resources[] = { |
327 | [0] = { | ||
328 | .name = "rcar-sata", | ||
329 | .start = 0xfc600000, | ||
330 | .end = 0xfc601fff, | ||
331 | .flags = IORESOURCE_MEM, | ||
332 | }, | ||
333 | [1] = { | ||
334 | .start = gic_iid(0x84), | ||
335 | .flags = IORESOURCE_IRQ, | ||
336 | }, | ||
337 | }; | ||
338 | |||
339 | static struct platform_device sata_device = { | ||
340 | .name = "sata_rcar", | ||
341 | .id = -1, | ||
342 | .resource = sata_resources, | ||
343 | .num_resources = ARRAY_SIZE(sata_resources), | ||
344 | .dev = { | ||
345 | .dma_mask = &sata_device.dev.coherent_dma_mask, | ||
346 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
347 | }, | ||
348 | }; | ||
349 | |||
350 | static struct platform_device *r8a7779_devices_dt[] __initdata = { | ||
325 | &scif0_device, | 351 | &scif0_device, |
326 | &scif1_device, | 352 | &scif1_device, |
327 | &scif2_device, | 353 | &scif2_device, |
@@ -330,13 +356,14 @@ static struct platform_device *r8a7779_early_devices[] __initdata = { | |||
330 | &scif5_device, | 356 | &scif5_device, |
331 | &tmu00_device, | 357 | &tmu00_device, |
332 | &tmu01_device, | 358 | &tmu01_device, |
359 | }; | ||
360 | |||
361 | static struct platform_device *r8a7779_late_devices[] __initdata = { | ||
333 | &i2c0_device, | 362 | &i2c0_device, |
334 | &i2c1_device, | 363 | &i2c1_device, |
335 | &i2c2_device, | 364 | &i2c2_device, |
336 | &i2c3_device, | 365 | &i2c3_device, |
337 | }; | 366 | &sata_device, |
338 | |||
339 | static struct platform_device *r8a7779_late_devices[] __initdata = { | ||
340 | }; | 367 | }; |
341 | 368 | ||
342 | void __init r8a7779_add_standard_devices(void) | 369 | void __init r8a7779_add_standard_devices(void) |
@@ -349,8 +376,8 @@ void __init r8a7779_add_standard_devices(void) | |||
349 | 376 | ||
350 | r8a7779_init_pm_domains(); | 377 | r8a7779_init_pm_domains(); |
351 | 378 | ||
352 | platform_add_devices(r8a7779_early_devices, | 379 | platform_add_devices(r8a7779_devices_dt, |
353 | ARRAY_SIZE(r8a7779_early_devices)); | 380 | ARRAY_SIZE(r8a7779_devices_dt)); |
354 | platform_add_devices(r8a7779_late_devices, | 381 | platform_add_devices(r8a7779_late_devices, |
355 | ARRAY_SIZE(r8a7779_late_devices)); | 382 | ARRAY_SIZE(r8a7779_late_devices)); |
356 | } | 383 | } |
@@ -367,8 +394,8 @@ void __init r8a7779_earlytimer_init(void) | |||
367 | 394 | ||
368 | void __init r8a7779_add_early_devices(void) | 395 | void __init r8a7779_add_early_devices(void) |
369 | { | 396 | { |
370 | early_platform_add_devices(r8a7779_early_devices, | 397 | early_platform_add_devices(r8a7779_devices_dt, |
371 | ARRAY_SIZE(r8a7779_early_devices)); | 398 | ARRAY_SIZE(r8a7779_devices_dt)); |
372 | 399 | ||
373 | /* Early serial console setup is not included here due to | 400 | /* Early serial console setup is not included here due to |
374 | * memory map collisions. The SCIF serial ports in r8a7779 | 401 | * memory map collisions. The SCIF serial ports in r8a7779 |
@@ -386,3 +413,40 @@ void __init r8a7779_add_early_devices(void) | |||
386 | * command line in case of the marzen board. | 413 | * command line in case of the marzen board. |
387 | */ | 414 | */ |
388 | } | 415 | } |
416 | |||
417 | #ifdef CONFIG_USE_OF | ||
418 | void __init r8a7779_init_delay(void) | ||
419 | { | ||
420 | shmobile_setup_delay(1000, 2, 4); /* Cortex-A9 @ 1000MHz */ | ||
421 | } | ||
422 | |||
423 | static const struct of_dev_auxdata r8a7779_auxdata_lookup[] __initconst = { | ||
424 | {}, | ||
425 | }; | ||
426 | |||
427 | void __init r8a7779_add_standard_devices_dt(void) | ||
428 | { | ||
429 | /* clocks are setup late during boot in the case of DT */ | ||
430 | r8a7779_clock_init(); | ||
431 | |||
432 | platform_add_devices(r8a7779_devices_dt, | ||
433 | ARRAY_SIZE(r8a7779_devices_dt)); | ||
434 | of_platform_populate(NULL, of_default_bus_match_table, | ||
435 | r8a7779_auxdata_lookup, NULL); | ||
436 | } | ||
437 | |||
438 | static const char *r8a7779_compat_dt[] __initdata = { | ||
439 | "renesas,r8a7779", | ||
440 | NULL, | ||
441 | }; | ||
442 | |||
443 | DT_MACHINE_START(R8A7779_DT, "Generic R8A7779 (Flattened Device Tree)") | ||
444 | .map_io = r8a7779_map_io, | ||
445 | .init_early = r8a7779_init_delay, | ||
446 | .nr_irqs = NR_IRQS_LEGACY, | ||
447 | .init_irq = r8a7779_init_irq_dt, | ||
448 | .init_machine = r8a7779_add_standard_devices_dt, | ||
449 | .init_time = shmobile_timer_init, | ||
450 | .dt_compat = r8a7779_compat_dt, | ||
451 | MACHINE_END | ||
452 | #endif /* CONFIG_USE_OF */ | ||
diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c index bdab575f88bc..2257a915746d 100644 --- a/arch/arm/mach-shmobile/setup-sh73a0.c +++ b/arch/arm/mach-shmobile/setup-sh73a0.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/interrupt.h> | 23 | #include <linux/interrupt.h> |
24 | #include <linux/irq.h> | 24 | #include <linux/irq.h> |
25 | #include <linux/irqchip.h> | ||
25 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
26 | #include <linux/of_platform.h> | 27 | #include <linux/of_platform.h> |
27 | #include <linux/delay.h> | 28 | #include <linux/delay.h> |
@@ -810,7 +811,7 @@ static struct platform_device ipmmu_device = { | |||
810 | .num_resources = ARRAY_SIZE(ipmmu_resources), | 811 | .num_resources = ARRAY_SIZE(ipmmu_resources), |
811 | }; | 812 | }; |
812 | 813 | ||
813 | static struct platform_device *sh73a0_early_devices_dt[] __initdata = { | 814 | static struct platform_device *sh73a0_devices_dt[] __initdata = { |
814 | &scif0_device, | 815 | &scif0_device, |
815 | &scif1_device, | 816 | &scif1_device, |
816 | &scif2_device, | 817 | &scif2_device, |
@@ -847,8 +848,8 @@ void __init sh73a0_add_standard_devices(void) | |||
847 | /* Clear software reset bit on SY-DMAC module */ | 848 | /* Clear software reset bit on SY-DMAC module */ |
848 | __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2); | 849 | __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2); |
849 | 850 | ||
850 | platform_add_devices(sh73a0_early_devices_dt, | 851 | platform_add_devices(sh73a0_devices_dt, |
851 | ARRAY_SIZE(sh73a0_early_devices_dt)); | 852 | ARRAY_SIZE(sh73a0_devices_dt)); |
852 | platform_add_devices(sh73a0_early_devices, | 853 | platform_add_devices(sh73a0_early_devices, |
853 | ARRAY_SIZE(sh73a0_early_devices)); | 854 | ARRAY_SIZE(sh73a0_early_devices)); |
854 | platform_add_devices(sh73a0_late_devices, | 855 | platform_add_devices(sh73a0_late_devices, |
@@ -867,8 +868,8 @@ void __init sh73a0_earlytimer_init(void) | |||
867 | 868 | ||
868 | void __init sh73a0_add_early_devices(void) | 869 | void __init sh73a0_add_early_devices(void) |
869 | { | 870 | { |
870 | early_platform_add_devices(sh73a0_early_devices_dt, | 871 | early_platform_add_devices(sh73a0_devices_dt, |
871 | ARRAY_SIZE(sh73a0_early_devices_dt)); | 872 | ARRAY_SIZE(sh73a0_devices_dt)); |
872 | early_platform_add_devices(sh73a0_early_devices, | 873 | early_platform_add_devices(sh73a0_early_devices, |
873 | ARRAY_SIZE(sh73a0_early_devices)); | 874 | ARRAY_SIZE(sh73a0_early_devices)); |
874 | 875 | ||
@@ -878,23 +879,9 @@ void __init sh73a0_add_early_devices(void) | |||
878 | 879 | ||
879 | #ifdef CONFIG_USE_OF | 880 | #ifdef CONFIG_USE_OF |
880 | 881 | ||
881 | /* Please note that the clock initialisation shcheme used in | 882 | void __init sh73a0_init_delay(void) |
882 | * sh73a0_add_early_devices_dt() and sh73a0_add_standard_devices_dt() | ||
883 | * does not work with SMP as there is a yet to be resolved lock-up in | ||
884 | * workqueue initialisation. | ||
885 | * | ||
886 | * CONFIG_SMP should be disabled when using this code. | ||
887 | */ | ||
888 | |||
889 | void __init sh73a0_add_early_devices_dt(void) | ||
890 | { | 883 | { |
891 | shmobile_setup_delay(1196, 44, 46); /* Cortex-A9 @ 1196MHz */ | 884 | shmobile_setup_delay(1196, 44, 46); /* Cortex-A9 @ 1196MHz */ |
892 | |||
893 | early_platform_add_devices(sh73a0_early_devices_dt, | ||
894 | ARRAY_SIZE(sh73a0_early_devices_dt)); | ||
895 | |||
896 | /* setup early console here as well */ | ||
897 | shmobile_setup_console(); | ||
898 | } | 885 | } |
899 | 886 | ||
900 | static const struct of_dev_auxdata sh73a0_auxdata_lookup[] __initconst = { | 887 | static const struct of_dev_auxdata sh73a0_auxdata_lookup[] __initconst = { |
@@ -906,8 +893,8 @@ void __init sh73a0_add_standard_devices_dt(void) | |||
906 | /* clocks are setup late during boot in the case of DT */ | 893 | /* clocks are setup late during boot in the case of DT */ |
907 | sh73a0_clock_init(); | 894 | sh73a0_clock_init(); |
908 | 895 | ||
909 | platform_add_devices(sh73a0_early_devices_dt, | 896 | platform_add_devices(sh73a0_devices_dt, |
910 | ARRAY_SIZE(sh73a0_early_devices_dt)); | 897 | ARRAY_SIZE(sh73a0_devices_dt)); |
911 | of_platform_populate(NULL, of_default_bus_match_table, | 898 | of_platform_populate(NULL, of_default_bus_match_table, |
912 | sh73a0_auxdata_lookup, NULL); | 899 | sh73a0_auxdata_lookup, NULL); |
913 | } | 900 | } |
@@ -918,10 +905,11 @@ static const char *sh73a0_boards_compat_dt[] __initdata = { | |||
918 | }; | 905 | }; |
919 | 906 | ||
920 | DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)") | 907 | DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)") |
908 | .smp = smp_ops(sh73a0_smp_ops), | ||
921 | .map_io = sh73a0_map_io, | 909 | .map_io = sh73a0_map_io, |
922 | .init_early = sh73a0_add_early_devices_dt, | 910 | .init_early = sh73a0_init_delay, |
923 | .nr_irqs = NR_IRQS_LEGACY, | 911 | .nr_irqs = NR_IRQS_LEGACY, |
924 | .init_irq = sh73a0_init_irq_dt, | 912 | .init_irq = irqchip_init, |
925 | .init_machine = sh73a0_add_standard_devices_dt, | 913 | .init_machine = sh73a0_add_standard_devices_dt, |
926 | .init_time = shmobile_timer_init, | 914 | .init_time = shmobile_timer_init, |
927 | .dt_compat = sh73a0_boards_compat_dt, | 915 | .dt_compat = sh73a0_boards_compat_dt, |
diff --git a/arch/arm/mach-shmobile/smp-emev2.c b/arch/arm/mach-shmobile/smp-emev2.c index 953eb1f9388d..8225c16b371b 100644 --- a/arch/arm/mach-shmobile/smp-emev2.c +++ b/arch/arm/mach-shmobile/smp-emev2.c | |||
@@ -28,63 +28,9 @@ | |||
28 | #include <mach/emev2.h> | 28 | #include <mach/emev2.h> |
29 | #include <asm/smp_plat.h> | 29 | #include <asm/smp_plat.h> |
30 | #include <asm/smp_scu.h> | 30 | #include <asm/smp_scu.h> |
31 | #include <asm/cacheflush.h> | ||
32 | 31 | ||
33 | #define EMEV2_SCU_BASE 0x1e000000 | 32 | #define EMEV2_SCU_BASE 0x1e000000 |
34 | 33 | ||
35 | static DEFINE_SPINLOCK(scu_lock); | ||
36 | static void __iomem *scu_base; | ||
37 | |||
38 | static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) | ||
39 | { | ||
40 | unsigned long tmp; | ||
41 | |||
42 | /* we assume this code is running on a different cpu | ||
43 | * than the one that is changing coherency setting */ | ||
44 | spin_lock(&scu_lock); | ||
45 | tmp = readl(scu_base + 8); | ||
46 | tmp &= ~clr; | ||
47 | tmp |= set; | ||
48 | writel(tmp, scu_base + 8); | ||
49 | spin_unlock(&scu_lock); | ||
50 | |||
51 | } | ||
52 | |||
53 | static unsigned int __init emev2_get_core_count(void) | ||
54 | { | ||
55 | if (!scu_base) { | ||
56 | scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE); | ||
57 | emev2_clock_init(); /* need ioremapped SMU */ | ||
58 | } | ||
59 | |||
60 | WARN_ON_ONCE(!scu_base); | ||
61 | |||
62 | return scu_base ? scu_get_core_count(scu_base) : 1; | ||
63 | } | ||
64 | |||
65 | static int emev2_platform_cpu_kill(unsigned int cpu) | ||
66 | { | ||
67 | return 0; /* not supported yet */ | ||
68 | } | ||
69 | |||
70 | static int __maybe_unused emev2_cpu_kill(unsigned int cpu) | ||
71 | { | ||
72 | int k; | ||
73 | |||
74 | /* this function is running on another CPU than the offline target, | ||
75 | * here we need wait for shutdown code in platform_cpu_die() to | ||
76 | * finish before asking SoC-specific code to power off the CPU core. | ||
77 | */ | ||
78 | for (k = 0; k < 1000; k++) { | ||
79 | if (shmobile_cpu_is_dead(cpu)) | ||
80 | return emev2_platform_cpu_kill(cpu); | ||
81 | mdelay(1); | ||
82 | } | ||
83 | |||
84 | return 0; | ||
85 | } | ||
86 | |||
87 | |||
88 | static void __cpuinit emev2_secondary_init(unsigned int cpu) | 34 | static void __cpuinit emev2_secondary_init(unsigned int cpu) |
89 | { | 35 | { |
90 | gic_secondary_init(0); | 36 | gic_secondary_init(0); |
@@ -92,31 +38,30 @@ static void __cpuinit emev2_secondary_init(unsigned int cpu) | |||
92 | 38 | ||
93 | static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *idle) | 39 | static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *idle) |
94 | { | 40 | { |
95 | cpu = cpu_logical_map(cpu); | 41 | arch_send_wakeup_ipi_mask(cpumask_of(cpu_logical_map(cpu))); |
96 | |||
97 | /* enable cache coherency */ | ||
98 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); | ||
99 | |||
100 | /* Tell ROM loader about our vector (in headsmp.S) */ | ||
101 | emev2_set_boot_vector(__pa(shmobile_secondary_vector)); | ||
102 | |||
103 | arch_send_wakeup_ipi_mask(cpumask_of(cpu)); | ||
104 | return 0; | 42 | return 0; |
105 | } | 43 | } |
106 | 44 | ||
107 | static void __init emev2_smp_prepare_cpus(unsigned int max_cpus) | 45 | static void __init emev2_smp_prepare_cpus(unsigned int max_cpus) |
108 | { | 46 | { |
109 | int cpu = cpu_logical_map(0); | 47 | scu_enable(shmobile_scu_base); |
110 | 48 | ||
111 | scu_enable(scu_base); | 49 | /* Tell ROM loader about our vector (in headsmp-scu.S) */ |
50 | emev2_set_boot_vector(__pa(shmobile_secondary_vector_scu)); | ||
112 | 51 | ||
113 | /* enable cache coherency on CPU0 */ | 52 | /* enable cache coherency on booting CPU */ |
114 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); | 53 | scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL); |
115 | } | 54 | } |
116 | 55 | ||
117 | static void __init emev2_smp_init_cpus(void) | 56 | static void __init emev2_smp_init_cpus(void) |
118 | { | 57 | { |
119 | unsigned int ncores = emev2_get_core_count(); | 58 | unsigned int ncores; |
59 | |||
60 | /* setup EMEV2 specific SCU base */ | ||
61 | shmobile_scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE); | ||
62 | emev2_clock_init(); /* need ioremapped SMU */ | ||
63 | |||
64 | ncores = shmobile_scu_base ? scu_get_core_count(shmobile_scu_base) : 1; | ||
120 | 65 | ||
121 | shmobile_smp_init_cpus(ncores); | 66 | shmobile_smp_init_cpus(ncores); |
122 | } | 67 | } |
@@ -126,9 +71,4 @@ struct smp_operations emev2_smp_ops __initdata = { | |||
126 | .smp_prepare_cpus = emev2_smp_prepare_cpus, | 71 | .smp_prepare_cpus = emev2_smp_prepare_cpus, |
127 | .smp_secondary_init = emev2_secondary_init, | 72 | .smp_secondary_init = emev2_secondary_init, |
128 | .smp_boot_secondary = emev2_boot_secondary, | 73 | .smp_boot_secondary = emev2_boot_secondary, |
129 | #ifdef CONFIG_HOTPLUG_CPU | ||
130 | .cpu_kill = emev2_cpu_kill, | ||
131 | .cpu_die = shmobile_cpu_die, | ||
132 | .cpu_disable = shmobile_cpu_disable, | ||
133 | #endif | ||
134 | }; | 74 | }; |
diff --git a/arch/arm/mach-shmobile/smp-r8a7779.c b/arch/arm/mach-shmobile/smp-r8a7779.c index 3a4acf23edcf..ea4535a5c4e2 100644 --- a/arch/arm/mach-shmobile/smp-r8a7779.c +++ b/arch/arm/mach-shmobile/smp-r8a7779.c | |||
@@ -26,11 +26,13 @@ | |||
26 | #include <linux/irqchip/arm-gic.h> | 26 | #include <linux/irqchip/arm-gic.h> |
27 | #include <mach/common.h> | 27 | #include <mach/common.h> |
28 | #include <mach/r8a7779.h> | 28 | #include <mach/r8a7779.h> |
29 | #include <asm/cacheflush.h> | ||
29 | #include <asm/smp_plat.h> | 30 | #include <asm/smp_plat.h> |
30 | #include <asm/smp_scu.h> | 31 | #include <asm/smp_scu.h> |
31 | #include <asm/smp_twd.h> | 32 | #include <asm/smp_twd.h> |
32 | 33 | ||
33 | #define AVECR IOMEM(0xfe700040) | 34 | #define AVECR IOMEM(0xfe700040) |
35 | #define R8A7779_SCU_BASE 0xf0000000 | ||
34 | 36 | ||
35 | static struct r8a7779_pm_ch r8a7779_ch_cpu1 = { | 37 | static struct r8a7779_pm_ch r8a7779_ch_cpu1 = { |
36 | .chan_offs = 0x40, /* PWRSR0 .. PWRER0 */ | 38 | .chan_offs = 0x40, /* PWRSR0 .. PWRER0 */ |
@@ -56,44 +58,14 @@ static struct r8a7779_pm_ch *r8a7779_ch_cpu[4] = { | |||
56 | [3] = &r8a7779_ch_cpu3, | 58 | [3] = &r8a7779_ch_cpu3, |
57 | }; | 59 | }; |
58 | 60 | ||
59 | static void __iomem *scu_base_addr(void) | ||
60 | { | ||
61 | return (void __iomem *)0xf0000000; | ||
62 | } | ||
63 | |||
64 | static DEFINE_SPINLOCK(scu_lock); | ||
65 | static unsigned long tmp; | ||
66 | |||
67 | #ifdef CONFIG_HAVE_ARM_TWD | 61 | #ifdef CONFIG_HAVE_ARM_TWD |
68 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); | 62 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, R8A7779_SCU_BASE + 0x600, 29); |
69 | |||
70 | void __init r8a7779_register_twd(void) | 63 | void __init r8a7779_register_twd(void) |
71 | { | 64 | { |
72 | twd_local_timer_register(&twd_local_timer); | 65 | twd_local_timer_register(&twd_local_timer); |
73 | } | 66 | } |
74 | #endif | 67 | #endif |
75 | 68 | ||
76 | static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) | ||
77 | { | ||
78 | void __iomem *scu_base = scu_base_addr(); | ||
79 | |||
80 | spin_lock(&scu_lock); | ||
81 | tmp = __raw_readl(scu_base + 8); | ||
82 | tmp &= ~clr; | ||
83 | tmp |= set; | ||
84 | spin_unlock(&scu_lock); | ||
85 | |||
86 | /* disable cache coherency after releasing the lock */ | ||
87 | __raw_writel(tmp, scu_base + 8); | ||
88 | } | ||
89 | |||
90 | static unsigned int __init r8a7779_get_core_count(void) | ||
91 | { | ||
92 | void __iomem *scu_base = scu_base_addr(); | ||
93 | |||
94 | return scu_get_core_count(scu_base); | ||
95 | } | ||
96 | |||
97 | static int r8a7779_platform_cpu_kill(unsigned int cpu) | 69 | static int r8a7779_platform_cpu_kill(unsigned int cpu) |
98 | { | 70 | { |
99 | struct r8a7779_pm_ch *ch = NULL; | 71 | struct r8a7779_pm_ch *ch = NULL; |
@@ -101,9 +73,6 @@ static int r8a7779_platform_cpu_kill(unsigned int cpu) | |||
101 | 73 | ||
102 | cpu = cpu_logical_map(cpu); | 74 | cpu = cpu_logical_map(cpu); |
103 | 75 | ||
104 | /* disable cache coherency */ | ||
105 | modify_scu_cpu_psr(3 << (cpu * 8), 0); | ||
106 | |||
107 | if (cpu < ARRAY_SIZE(r8a7779_ch_cpu)) | 76 | if (cpu < ARRAY_SIZE(r8a7779_ch_cpu)) |
108 | ch = r8a7779_ch_cpu[cpu]; | 77 | ch = r8a7779_ch_cpu[cpu]; |
109 | 78 | ||
@@ -113,25 +82,6 @@ static int r8a7779_platform_cpu_kill(unsigned int cpu) | |||
113 | return ret ? ret : 1; | 82 | return ret ? ret : 1; |
114 | } | 83 | } |
115 | 84 | ||
116 | static int __maybe_unused r8a7779_cpu_kill(unsigned int cpu) | ||
117 | { | ||
118 | int k; | ||
119 | |||
120 | /* this function is running on another CPU than the offline target, | ||
121 | * here we need wait for shutdown code in platform_cpu_die() to | ||
122 | * finish before asking SoC-specific code to power off the CPU core. | ||
123 | */ | ||
124 | for (k = 0; k < 1000; k++) { | ||
125 | if (shmobile_cpu_is_dead(cpu)) | ||
126 | return r8a7779_platform_cpu_kill(cpu); | ||
127 | |||
128 | mdelay(1); | ||
129 | } | ||
130 | |||
131 | return 0; | ||
132 | } | ||
133 | |||
134 | |||
135 | static void __cpuinit r8a7779_secondary_init(unsigned int cpu) | 85 | static void __cpuinit r8a7779_secondary_init(unsigned int cpu) |
136 | { | 86 | { |
137 | gic_secondary_init(0); | 87 | gic_secondary_init(0); |
@@ -144,9 +94,6 @@ static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct | |||
144 | 94 | ||
145 | cpu = cpu_logical_map(cpu); | 95 | cpu = cpu_logical_map(cpu); |
146 | 96 | ||
147 | /* enable cache coherency */ | ||
148 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); | ||
149 | |||
150 | if (cpu < ARRAY_SIZE(r8a7779_ch_cpu)) | 97 | if (cpu < ARRAY_SIZE(r8a7779_ch_cpu)) |
151 | ch = r8a7779_ch_cpu[cpu]; | 98 | ch = r8a7779_ch_cpu[cpu]; |
152 | 99 | ||
@@ -158,15 +105,13 @@ static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct | |||
158 | 105 | ||
159 | static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus) | 106 | static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus) |
160 | { | 107 | { |
161 | int cpu = cpu_logical_map(0); | 108 | scu_enable(shmobile_scu_base); |
162 | 109 | ||
163 | scu_enable(scu_base_addr()); | 110 | /* Map the reset vector (in headsmp-scu.S) */ |
111 | __raw_writel(__pa(shmobile_secondary_vector_scu), AVECR); | ||
164 | 112 | ||
165 | /* Map the reset vector (in headsmp.S) */ | 113 | /* enable cache coherency on booting CPU */ |
166 | __raw_writel(__pa(shmobile_secondary_vector), AVECR); | 114 | scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL); |
167 | |||
168 | /* enable cache coherency on CPU0 */ | ||
169 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); | ||
170 | 115 | ||
171 | r8a7779_pm_init(); | 116 | r8a7779_pm_init(); |
172 | 117 | ||
@@ -178,10 +123,60 @@ static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus) | |||
178 | 123 | ||
179 | static void __init r8a7779_smp_init_cpus(void) | 124 | static void __init r8a7779_smp_init_cpus(void) |
180 | { | 125 | { |
181 | unsigned int ncores = r8a7779_get_core_count(); | 126 | /* setup r8a7779 specific SCU base */ |
127 | shmobile_scu_base = IOMEM(R8A7779_SCU_BASE); | ||
128 | |||
129 | shmobile_smp_init_cpus(scu_get_core_count(shmobile_scu_base)); | ||
130 | } | ||
182 | 131 | ||
183 | shmobile_smp_init_cpus(ncores); | 132 | #ifdef CONFIG_HOTPLUG_CPU |
133 | static int r8a7779_scu_psr_core_disabled(int cpu) | ||
134 | { | ||
135 | unsigned long mask = 3 << (cpu * 8); | ||
136 | |||
137 | if ((__raw_readl(shmobile_scu_base + 8) & mask) == mask) | ||
138 | return 1; | ||
139 | |||
140 | return 0; | ||
141 | } | ||
142 | |||
143 | static int r8a7779_cpu_kill(unsigned int cpu) | ||
144 | { | ||
145 | int k; | ||
146 | |||
147 | /* this function is running on another CPU than the offline target, | ||
148 | * here we need wait for shutdown code in platform_cpu_die() to | ||
149 | * finish before asking SoC-specific code to power off the CPU core. | ||
150 | */ | ||
151 | for (k = 0; k < 1000; k++) { | ||
152 | if (r8a7779_scu_psr_core_disabled(cpu)) | ||
153 | return r8a7779_platform_cpu_kill(cpu); | ||
154 | |||
155 | mdelay(1); | ||
156 | } | ||
157 | |||
158 | return 0; | ||
159 | } | ||
160 | |||
161 | static void r8a7779_cpu_die(unsigned int cpu) | ||
162 | { | ||
163 | dsb(); | ||
164 | flush_cache_all(); | ||
165 | |||
166 | /* disable cache coherency */ | ||
167 | scu_power_mode(shmobile_scu_base, SCU_PM_POWEROFF); | ||
168 | |||
169 | /* Endless loop until power off from r8a7779_cpu_kill() */ | ||
170 | while (1) | ||
171 | cpu_do_idle(); | ||
172 | } | ||
173 | |||
174 | static int r8a7779_cpu_disable(unsigned int cpu) | ||
175 | { | ||
176 | /* only CPU1->3 have power domains, do not allow hotplug of CPU0 */ | ||
177 | return cpu == 0 ? -EPERM : 0; | ||
184 | } | 178 | } |
179 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
185 | 180 | ||
186 | struct smp_operations r8a7779_smp_ops __initdata = { | 181 | struct smp_operations r8a7779_smp_ops __initdata = { |
187 | .smp_init_cpus = r8a7779_smp_init_cpus, | 182 | .smp_init_cpus = r8a7779_smp_init_cpus, |
@@ -190,7 +185,7 @@ struct smp_operations r8a7779_smp_ops __initdata = { | |||
190 | .smp_boot_secondary = r8a7779_boot_secondary, | 185 | .smp_boot_secondary = r8a7779_boot_secondary, |
191 | #ifdef CONFIG_HOTPLUG_CPU | 186 | #ifdef CONFIG_HOTPLUG_CPU |
192 | .cpu_kill = r8a7779_cpu_kill, | 187 | .cpu_kill = r8a7779_cpu_kill, |
193 | .cpu_die = shmobile_cpu_die, | 188 | .cpu_die = r8a7779_cpu_die, |
194 | .cpu_disable = shmobile_cpu_disable, | 189 | .cpu_disable = r8a7779_cpu_disable, |
195 | #endif | 190 | #endif |
196 | }; | 191 | }; |
diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index acb46a94ccdf..5ae502b16437 100644 --- a/arch/arm/mach-shmobile/smp-sh73a0.c +++ b/arch/arm/mach-shmobile/smp-sh73a0.c | |||
@@ -39,26 +39,16 @@ | |||
39 | 39 | ||
40 | #define PSTR_SHUTDOWN_MODE 3 | 40 | #define PSTR_SHUTDOWN_MODE 3 |
41 | 41 | ||
42 | static void __iomem *scu_base_addr(void) | 42 | #define SH73A0_SCU_BASE 0xf0000000 |
43 | { | ||
44 | return (void __iomem *)0xf0000000; | ||
45 | } | ||
46 | 43 | ||
47 | #ifdef CONFIG_HAVE_ARM_TWD | 44 | #ifdef CONFIG_HAVE_ARM_TWD |
48 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); | 45 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, SH73A0_SCU_BASE + 0x600, 29); |
49 | void __init sh73a0_register_twd(void) | 46 | void __init sh73a0_register_twd(void) |
50 | { | 47 | { |
51 | twd_local_timer_register(&twd_local_timer); | 48 | twd_local_timer_register(&twd_local_timer); |
52 | } | 49 | } |
53 | #endif | 50 | #endif |
54 | 51 | ||
55 | static unsigned int __init sh73a0_get_core_count(void) | ||
56 | { | ||
57 | void __iomem *scu_base = scu_base_addr(); | ||
58 | |||
59 | return scu_get_core_count(scu_base); | ||
60 | } | ||
61 | |||
62 | static void __cpuinit sh73a0_secondary_init(unsigned int cpu) | 52 | static void __cpuinit sh73a0_secondary_init(unsigned int cpu) |
63 | { | 53 | { |
64 | gic_secondary_init(0); | 54 | gic_secondary_init(0); |
@@ -78,21 +68,22 @@ static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct | |||
78 | 68 | ||
79 | static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus) | 69 | static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus) |
80 | { | 70 | { |
81 | scu_enable(scu_base_addr()); | 71 | scu_enable(shmobile_scu_base); |
82 | 72 | ||
83 | /* Map the reset vector (in headsmp-sh73a0.S) */ | 73 | /* Map the reset vector (in headsmp-scu.S) */ |
84 | __raw_writel(0, APARMBAREA); /* 4k */ | 74 | __raw_writel(0, APARMBAREA); /* 4k */ |
85 | __raw_writel(__pa(sh73a0_secondary_vector), SBAR); | 75 | __raw_writel(__pa(shmobile_secondary_vector_scu), SBAR); |
86 | 76 | ||
87 | /* enable cache coherency on booting CPU */ | 77 | /* enable cache coherency on booting CPU */ |
88 | scu_power_mode(scu_base_addr(), SCU_PM_NORMAL); | 78 | scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL); |
89 | } | 79 | } |
90 | 80 | ||
91 | static void __init sh73a0_smp_init_cpus(void) | 81 | static void __init sh73a0_smp_init_cpus(void) |
92 | { | 82 | { |
93 | unsigned int ncores = sh73a0_get_core_count(); | 83 | /* setup sh73a0 specific SCU base */ |
84 | shmobile_scu_base = IOMEM(SH73A0_SCU_BASE); | ||
94 | 85 | ||
95 | shmobile_smp_init_cpus(ncores); | 86 | shmobile_smp_init_cpus(scu_get_core_count(shmobile_scu_base)); |
96 | } | 87 | } |
97 | 88 | ||
98 | #ifdef CONFIG_HOTPLUG_CPU | 89 | #ifdef CONFIG_HOTPLUG_CPU |
@@ -128,11 +119,16 @@ static void sh73a0_cpu_die(unsigned int cpu) | |||
128 | flush_cache_all(); | 119 | flush_cache_all(); |
129 | 120 | ||
130 | /* Set power off mode. This takes the CPU out of the MP cluster */ | 121 | /* Set power off mode. This takes the CPU out of the MP cluster */ |
131 | scu_power_mode(scu_base_addr(), SCU_PM_POWEROFF); | 122 | scu_power_mode(shmobile_scu_base, SCU_PM_POWEROFF); |
132 | 123 | ||
133 | /* Enter shutdown mode */ | 124 | /* Enter shutdown mode */ |
134 | cpu_do_idle(); | 125 | cpu_do_idle(); |
135 | } | 126 | } |
127 | |||
128 | static int sh73a0_cpu_disable(unsigned int cpu) | ||
129 | { | ||
130 | return 0; /* CPU0 and CPU1 supported */ | ||
131 | } | ||
136 | #endif /* CONFIG_HOTPLUG_CPU */ | 132 | #endif /* CONFIG_HOTPLUG_CPU */ |
137 | 133 | ||
138 | struct smp_operations sh73a0_smp_ops __initdata = { | 134 | struct smp_operations sh73a0_smp_ops __initdata = { |
@@ -143,6 +139,6 @@ struct smp_operations sh73a0_smp_ops __initdata = { | |||
143 | #ifdef CONFIG_HOTPLUG_CPU | 139 | #ifdef CONFIG_HOTPLUG_CPU |
144 | .cpu_kill = sh73a0_cpu_kill, | 140 | .cpu_kill = sh73a0_cpu_kill, |
145 | .cpu_die = sh73a0_cpu_die, | 141 | .cpu_die = sh73a0_cpu_die, |
146 | .cpu_disable = shmobile_cpu_disable_any, | 142 | .cpu_disable = sh73a0_cpu_disable, |
147 | #endif | 143 | #endif |
148 | }; | 144 | }; |