diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-21 18:27:22 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-21 18:27:22 -0500 |
commit | bab588fcfb6335c767d811a8955979f5440328e0 (patch) | |
tree | 2a862ddf47a82be885a8e7945a17cc3ff7a658b9 /arch/arm/mach-shmobile | |
parent | 3298a3511f1e73255a8dc023efd909e569eea037 (diff) | |
parent | 9cb0d1babfcb1b4ac248c09425f7d5de1e771133 (diff) |
Merge tag 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull ARM SoC-specific updates from Arnd Bergmann:
"This is a larger set of new functionality for the existing SoC
families, including:
- vt8500 gains support for new CPU cores, notably the Cortex-A9 based
wm8850
- prima2 gains support for the "marco" SoC family, its SMP based
cousin
- tegra gains support for the new Tegra4 (Tegra114) family
- socfpga now supports a newer version of the hardware including SMP
- i.mx31 and bcm2835 are now using DT probing for their clocks
- lots of updates for sh-mobile
- OMAP updates for clocks, power management and USB
- i.mx6q and tegra now support cpuidle
- kirkwood now supports PCIe hot plugging
- tegra clock support is updated
- tegra USB PHY probing gets implemented diffently"
* tag 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (148 commits)
ARM: prima2: remove duplicate v7_invalidate_l1
ARM: shmobile: r8a7779: Correct TMU clock support again
ARM: prima2: fix __init section for cpu hotplug
ARM: OMAP: Consolidate OMAP USB-HS platform data (part 3/3)
ARM: OMAP: Consolidate OMAP USB-HS platform data (part 1/3)
arm: socfpga: Add SMP support for actual socfpga harware
arm: Add v7_invalidate_l1 to cache-v7.S
arm: socfpga: Add entries to enable make dtbs socfpga
arm: socfpga: Add new device tree source for actual socfpga HW
ARM: tegra: sort Kconfig selects for Tegra114
ARM: tegra: enable ARCH_REQUIRE_GPIOLIB for Tegra114
ARM: tegra: Fix build error w/ ARCH_TEGRA_114_SOC w/o ARCH_TEGRA_3x_SOC
ARM: tegra: Fix build error for gic update
ARM: tegra: remove empty tegra_smp_init_cpus()
ARM: shmobile: Register ARM architected timer
ARM: MARCO: fix the build issue due to gic-vic-to-irqchip move
ARM: shmobile: r8a7779: Correct TMU clock support
ARM: mxs_defconfig: Select CONFIG_DEVTMPFS_MOUNT
ARM: mxs: decrease mxs_clockevent_device.min_delta_ns to 2 clock cycles
ARM: mxs: use apbx bus clock to drive the timers on timrotv2
...
Diffstat (limited to 'arch/arm/mach-shmobile')
-rw-r--r-- | arch/arm/mach-shmobile/Makefile | 3 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/board-armadillo800eva.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/board-kzm9g.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/clock-r8a7740.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/clock-r8a7779.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/clock-sh7372.c | 9 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/clock-sh73a0.c | 35 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/headsmp-sh73a0.S | 50 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/headsmp.S | 48 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/hotplug.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/include/mach/common.h | 9 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/intc-sh73a0.c | 16 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/pm-r8a7740.c | 22 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/pm-sh73a0.c | 32 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/setup-r8a7740.c | 95 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/setup-r8a7779.c | 18 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/setup-sh73a0.c | 62 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/sleep-sh7372.S | 12 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/smp-sh73a0.c | 68 | ||||
-rw-r--r-- | arch/arm/mach-shmobile/timer.c | 3 |
20 files changed, 380 insertions, 119 deletions
diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile index a1e931337d41..e1fac57514b9 100644 --- a/arch/arm/mach-shmobile/Makefile +++ b/arch/arm/mach-shmobile/Makefile | |||
@@ -15,7 +15,7 @@ obj-$(CONFIG_ARCH_EMEV2) += setup-emev2.o clock-emev2.o | |||
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_HOTPLUG_CPU) += hotplug.o |
18 | smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o | 18 | smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o headsmp-sh73a0.o |
19 | smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o | 19 | smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o |
20 | smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o | 20 | smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o |
21 | 21 | ||
@@ -30,6 +30,7 @@ obj-$(CONFIG_ARCH_SHMOBILE) += pm-rmobile.o | |||
30 | obj-$(CONFIG_ARCH_SH7372) += pm-sh7372.o sleep-sh7372.o | 30 | obj-$(CONFIG_ARCH_SH7372) += pm-sh7372.o sleep-sh7372.o |
31 | obj-$(CONFIG_ARCH_R8A7740) += pm-r8a7740.o | 31 | obj-$(CONFIG_ARCH_R8A7740) += pm-r8a7740.o |
32 | obj-$(CONFIG_ARCH_R8A7779) += pm-r8a7779.o | 32 | obj-$(CONFIG_ARCH_R8A7779) += pm-r8a7779.o |
33 | obj-$(CONFIG_ARCH_SH73A0) += pm-sh73a0.o | ||
33 | 34 | ||
34 | # Board objects | 35 | # Board objects |
35 | obj-$(CONFIG_MACH_AP4EVB) += board-ap4evb.o | 36 | obj-$(CONFIG_MACH_AP4EVB) += board-ap4evb.o |
diff --git a/arch/arm/mach-shmobile/board-armadillo800eva.c b/arch/arm/mach-shmobile/board-armadillo800eva.c index 6bcf3cbd9223..81d91fda2d90 100644 --- a/arch/arm/mach-shmobile/board-armadillo800eva.c +++ b/arch/arm/mach-shmobile/board-armadillo800eva.c | |||
@@ -1181,6 +1181,8 @@ static void __init eva_init(void) | |||
1181 | rmobile_add_device_to_domain("A4LC", &hdmi_lcdc_device); | 1181 | rmobile_add_device_to_domain("A4LC", &hdmi_lcdc_device); |
1182 | if (usb) | 1182 | if (usb) |
1183 | rmobile_add_device_to_domain("A3SP", usb); | 1183 | rmobile_add_device_to_domain("A3SP", usb); |
1184 | |||
1185 | r8a7740_pm_init(); | ||
1184 | } | 1186 | } |
1185 | 1187 | ||
1186 | static void __init eva_earlytimer_init(void) | 1188 | static void __init eva_earlytimer_init(void) |
diff --git a/arch/arm/mach-shmobile/board-kzm9g.c b/arch/arm/mach-shmobile/board-kzm9g.c index 5394d804a716..3efff2e7b1e7 100644 --- a/arch/arm/mach-shmobile/board-kzm9g.c +++ b/arch/arm/mach-shmobile/board-kzm9g.c | |||
@@ -772,6 +772,8 @@ static void __init kzm_init(void) | |||
772 | 772 | ||
773 | sh73a0_add_standard_devices(); | 773 | sh73a0_add_standard_devices(); |
774 | platform_add_devices(kzm_devices, ARRAY_SIZE(kzm_devices)); | 774 | platform_add_devices(kzm_devices, ARRAY_SIZE(kzm_devices)); |
775 | |||
776 | sh73a0_pm_init(); | ||
775 | } | 777 | } |
776 | 778 | ||
777 | static void kzm9g_restart(char mode, const char *cmd) | 779 | static void kzm9g_restart(char mode, const char *cmd) |
diff --git a/arch/arm/mach-shmobile/clock-r8a7740.c b/arch/arm/mach-shmobile/clock-r8a7740.c index eac49d59782f..19ce885a3b43 100644 --- a/arch/arm/mach-shmobile/clock-r8a7740.c +++ b/arch/arm/mach-shmobile/clock-r8a7740.c | |||
@@ -581,10 +581,14 @@ static struct clk_lookup lookups[] = { | |||
581 | 581 | ||
582 | /* MSTP32 clocks */ | 582 | /* MSTP32 clocks */ |
583 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), | 583 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), |
584 | CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP111]), | 584 | CLKDEV_DEV_ID("sh_tmu.3", &mstp_clks[MSTP111]), |
585 | CLKDEV_DEV_ID("sh_tmu.4", &mstp_clks[MSTP111]), | ||
586 | CLKDEV_DEV_ID("sh_tmu.5", &mstp_clks[MSTP111]), | ||
585 | CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), | 587 | CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), |
586 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1", &mstp_clks[MSTP117]), | 588 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1", &mstp_clks[MSTP117]), |
587 | CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP125]), | 589 | CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP125]), |
590 | CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP125]), | ||
591 | CLKDEV_DEV_ID("sh_tmu.2", &mstp_clks[MSTP125]), | ||
588 | CLKDEV_DEV_ID("sh_mobile_ceu.0", &mstp_clks[MSTP127]), | 592 | CLKDEV_DEV_ID("sh_mobile_ceu.0", &mstp_clks[MSTP127]), |
589 | CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP128]), | 593 | CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP128]), |
590 | 594 | ||
diff --git a/arch/arm/mach-shmobile/clock-r8a7779.c b/arch/arm/mach-shmobile/clock-r8a7779.c index c019609da660..1db36537255c 100644 --- a/arch/arm/mach-shmobile/clock-r8a7779.c +++ b/arch/arm/mach-shmobile/clock-r8a7779.c | |||
@@ -162,6 +162,7 @@ static struct clk_lookup lookups[] = { | |||
162 | CLKDEV_DEV_ID("ohci-platform.0", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */ | 162 | CLKDEV_DEV_ID("ohci-platform.0", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */ |
163 | CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP016]), /* TMU00 */ | 163 | CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP016]), /* TMU00 */ |
164 | CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP016]), /* TMU01 */ | 164 | CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP016]), /* TMU01 */ |
165 | CLKDEV_DEV_ID("sh_tmu.2", &mstp_clks[MSTP016]), /* TMU02 */ | ||
165 | CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */ | 166 | CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */ |
166 | CLKDEV_DEV_ID("i2c-rcar.1", &mstp_clks[MSTP029]), /* I2C1 */ | 167 | CLKDEV_DEV_ID("i2c-rcar.1", &mstp_clks[MSTP029]), /* I2C1 */ |
167 | CLKDEV_DEV_ID("i2c-rcar.2", &mstp_clks[MSTP028]), /* I2C2 */ | 168 | CLKDEV_DEV_ID("i2c-rcar.2", &mstp_clks[MSTP028]), /* I2C2 */ |
diff --git a/arch/arm/mach-shmobile/clock-sh7372.c b/arch/arm/mach-shmobile/clock-sh7372.c index 3ca6757b129a..45d21fe317f4 100644 --- a/arch/arm/mach-shmobile/clock-sh7372.c +++ b/arch/arm/mach-shmobile/clock-sh7372.c | |||
@@ -544,6 +544,7 @@ static struct clk_lookup lookups[] = { | |||
544 | 544 | ||
545 | /* MSTP32 clocks */ | 545 | /* MSTP32 clocks */ |
546 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* IIC2 */ | 546 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* IIC2 */ |
547 | CLKDEV_DEV_ID("fff30000.i2c", &mstp_clks[MSTP001]), /* IIC2 */ | ||
547 | CLKDEV_DEV_ID("spi_sh_msiof.0", &mstp_clks[MSTP000]), /* MSIOF0 */ | 548 | CLKDEV_DEV_ID("spi_sh_msiof.0", &mstp_clks[MSTP000]), /* MSIOF0 */ |
548 | CLKDEV_DEV_ID("uio_pdrv_genirq.4", &mstp_clks[MSTP131]), /* VEU3 */ | 549 | CLKDEV_DEV_ID("uio_pdrv_genirq.4", &mstp_clks[MSTP131]), /* VEU3 */ |
549 | CLKDEV_DEV_ID("uio_pdrv_genirq.3", &mstp_clks[MSTP130]), /* VEU2 */ | 550 | CLKDEV_DEV_ID("uio_pdrv_genirq.3", &mstp_clks[MSTP130]), /* VEU2 */ |
@@ -556,6 +557,7 @@ static struct clk_lookup lookups[] = { | |||
556 | CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX0 */ | 557 | CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX0 */ |
557 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1", &mstp_clks[MSTP117]), /* LCDC1 */ | 558 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1", &mstp_clks[MSTP117]), /* LCDC1 */ |
558 | CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* IIC0 */ | 559 | CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* IIC0 */ |
560 | CLKDEV_DEV_ID("fff20000.i2c", &mstp_clks[MSTP116]), /* IIC0 */ | ||
559 | CLKDEV_DEV_ID("sh_mobile_meram.0", &mstp_clks[MSTP113]), /* MERAM */ | 561 | CLKDEV_DEV_ID("sh_mobile_meram.0", &mstp_clks[MSTP113]), /* MERAM */ |
560 | CLKDEV_DEV_ID("uio_pdrv_genirq.5", &mstp_clks[MSTP106]), /* JPU */ | 562 | CLKDEV_DEV_ID("uio_pdrv_genirq.5", &mstp_clks[MSTP106]), /* JPU */ |
561 | CLKDEV_DEV_ID("uio_pdrv_genirq.0", &mstp_clks[MSTP101]), /* VPU */ | 563 | CLKDEV_DEV_ID("uio_pdrv_genirq.0", &mstp_clks[MSTP101]), /* VPU */ |
@@ -577,18 +579,25 @@ static struct clk_lookup lookups[] = { | |||
577 | CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */ | 579 | CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */ |
578 | CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI2 */ | 580 | CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI2 */ |
579 | CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* IIC1 */ | 581 | CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* IIC1 */ |
582 | CLKDEV_DEV_ID("e6c20000.i2c", &mstp_clks[MSTP323]), /* IIC1 */ | ||
580 | CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[MSTP322]), /* USB0 */ | 583 | CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[MSTP322]), /* USB0 */ |
581 | CLKDEV_DEV_ID("r8a66597_udc.0", &mstp_clks[MSTP322]), /* USB0 */ | 584 | CLKDEV_DEV_ID("r8a66597_udc.0", &mstp_clks[MSTP322]), /* USB0 */ |
582 | CLKDEV_DEV_ID("renesas_usbhs.0", &mstp_clks[MSTP322]), /* USB0 */ | 585 | CLKDEV_DEV_ID("renesas_usbhs.0", &mstp_clks[MSTP322]), /* USB0 */ |
583 | CLKDEV_DEV_ID("sh_flctl.0", &mstp_clks[MSTP315]), /* FLCTL */ | 586 | CLKDEV_DEV_ID("sh_flctl.0", &mstp_clks[MSTP315]), /* FLCTL */ |
584 | CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */ | 587 | CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */ |
588 | CLKDEV_DEV_ID("e6850000.sdhi", &mstp_clks[MSTP314]), /* SDHI0 */ | ||
585 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ | 589 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ |
590 | CLKDEV_DEV_ID("e6860000.sdhi", &mstp_clks[MSTP313]), /* SDHI1 */ | ||
586 | CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMC */ | 591 | CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMC */ |
592 | CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMC */ | ||
587 | CLKDEV_DEV_ID("sh-mipi-dsi.1", &mstp_clks[MSTP423]), /* DSITX1 */ | 593 | CLKDEV_DEV_ID("sh-mipi-dsi.1", &mstp_clks[MSTP423]), /* DSITX1 */ |
588 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP415]), /* SDHI2 */ | 594 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP415]), /* SDHI2 */ |
595 | CLKDEV_DEV_ID("e6870000.sdhi", &mstp_clks[MSTP415]), /* SDHI2 */ | ||
589 | CLKDEV_DEV_ID("sh-mobile-hdmi", &mstp_clks[MSTP413]), /* HDMI */ | 596 | CLKDEV_DEV_ID("sh-mobile-hdmi", &mstp_clks[MSTP413]), /* HDMI */ |
590 | CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* IIC3 */ | 597 | CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* IIC3 */ |
598 | CLKDEV_DEV_ID("e6d20000.i2c", &mstp_clks[MSTP411]), /* IIC3 */ | ||
591 | CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* IIC4 */ | 599 | CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* IIC4 */ |
600 | CLKDEV_DEV_ID("e6d30000.i2c", &mstp_clks[MSTP410]), /* IIC4 */ | ||
592 | CLKDEV_DEV_ID("sh-dma-engine.4", &mstp_clks[MSTP407]), /* USB-DMAC1 */ | 601 | CLKDEV_DEV_ID("sh-dma-engine.4", &mstp_clks[MSTP407]), /* USB-DMAC1 */ |
593 | CLKDEV_DEV_ID("r8a66597_hcd.1", &mstp_clks[MSTP406]), /* USB1 */ | 602 | CLKDEV_DEV_ID("r8a66597_hcd.1", &mstp_clks[MSTP406]), /* USB1 */ |
594 | CLKDEV_DEV_ID("r8a66597_udc.1", &mstp_clks[MSTP406]), /* USB1 */ | 603 | CLKDEV_DEV_ID("r8a66597_udc.1", &mstp_clks[MSTP406]), /* USB1 */ |
diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index 516ff7f3e434..afa5423a0f93 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c | |||
@@ -264,17 +264,17 @@ enum { DIV4_I, DIV4_ZG, DIV4_M3, DIV4_B, DIV4_M1, DIV4_M2, | |||
264 | SH_CLK_DIV4(&pll1_clk, _reg, _bit, _mask, _flags) | 264 | SH_CLK_DIV4(&pll1_clk, _reg, _bit, _mask, _flags) |
265 | 265 | ||
266 | static struct clk div4_clks[DIV4_NR] = { | 266 | static struct clk div4_clks[DIV4_NR] = { |
267 | [DIV4_I] = DIV4(FRQCRA, 20, 0xfff, CLK_ENABLE_ON_INIT), | 267 | [DIV4_I] = DIV4(FRQCRA, 20, 0xdff, CLK_ENABLE_ON_INIT), |
268 | [DIV4_ZG] = DIV4(FRQCRA, 16, 0xbff, CLK_ENABLE_ON_INIT), | 268 | [DIV4_ZG] = DIV4(FRQCRA, 16, 0xd7f, CLK_ENABLE_ON_INIT), |
269 | [DIV4_M3] = DIV4(FRQCRA, 12, 0xfff, CLK_ENABLE_ON_INIT), | 269 | [DIV4_M3] = DIV4(FRQCRA, 12, 0x1dff, CLK_ENABLE_ON_INIT), |
270 | [DIV4_B] = DIV4(FRQCRA, 8, 0xfff, CLK_ENABLE_ON_INIT), | 270 | [DIV4_B] = DIV4(FRQCRA, 8, 0xdff, CLK_ENABLE_ON_INIT), |
271 | [DIV4_M1] = DIV4(FRQCRA, 4, 0xfff, 0), | 271 | [DIV4_M1] = DIV4(FRQCRA, 4, 0x1dff, 0), |
272 | [DIV4_M2] = DIV4(FRQCRA, 0, 0xfff, 0), | 272 | [DIV4_M2] = DIV4(FRQCRA, 0, 0x1dff, 0), |
273 | [DIV4_Z] = DIV4(FRQCRB, 24, 0xbff, 0), | 273 | [DIV4_Z] = DIV4(FRQCRB, 24, 0x97f, 0), |
274 | [DIV4_ZTR] = DIV4(FRQCRB, 20, 0xfff, 0), | 274 | [DIV4_ZTR] = DIV4(FRQCRB, 20, 0xdff, 0), |
275 | [DIV4_ZT] = DIV4(FRQCRB, 16, 0xfff, 0), | 275 | [DIV4_ZT] = DIV4(FRQCRB, 16, 0xdff, 0), |
276 | [DIV4_ZX] = DIV4(FRQCRB, 12, 0xfff, 0), | 276 | [DIV4_ZX] = DIV4(FRQCRB, 12, 0xdff, 0), |
277 | [DIV4_HP] = DIV4(FRQCRB, 4, 0xfff, 0), | 277 | [DIV4_HP] = DIV4(FRQCRB, 4, 0xdff, 0), |
278 | }; | 278 | }; |
279 | 279 | ||
280 | enum { DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_ZB1, | 280 | enum { DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_ZB1, |
@@ -525,6 +525,13 @@ static struct clk mstp_clks[MSTP_NR] = { | |||
525 | [MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */ | 525 | [MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */ |
526 | }; | 526 | }; |
527 | 527 | ||
528 | /* The lookups structure below includes duplicate entries for some clocks | ||
529 | * with alternate names. | ||
530 | * - The traditional name used when a device is initialised with platform data | ||
531 | * - The name used when a device is initialised using device tree | ||
532 | * The longer-term aim is to remove these duplicates, and indeed the | ||
533 | * lookups table entirely, by describing clocks using device tree. | ||
534 | */ | ||
528 | static struct clk_lookup lookups[] = { | 535 | static struct clk_lookup lookups[] = { |
529 | /* main clocks */ | 536 | /* main clocks */ |
530 | CLKDEV_CON_ID("r_clk", &r_clk), | 537 | CLKDEV_CON_ID("r_clk", &r_clk), |
@@ -545,6 +552,7 @@ static struct clk_lookup lookups[] = { | |||
545 | 552 | ||
546 | /* MSTP32 clocks */ | 553 | /* MSTP32 clocks */ |
547 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ | 554 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ |
555 | CLKDEV_DEV_ID("e6824000.i2c", &mstp_clks[MSTP001]), /* I2C2 */ | ||
548 | CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP129]), /* CEU1 */ | 556 | CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP129]), /* CEU1 */ |
549 | CLKDEV_DEV_ID("sh-mobile-csi2.1", &mstp_clks[MSTP128]), /* CSI2-RX1 */ | 557 | CLKDEV_DEV_ID("sh-mobile-csi2.1", &mstp_clks[MSTP128]), /* CSI2-RX1 */ |
550 | CLKDEV_DEV_ID("sh_mobile_ceu.0", &mstp_clks[MSTP127]), /* CEU0 */ | 558 | CLKDEV_DEV_ID("sh_mobile_ceu.0", &mstp_clks[MSTP127]), /* CEU0 */ |
@@ -553,6 +561,7 @@ static struct clk_lookup lookups[] = { | |||
553 | CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP125]), /* TMU01 */ | 561 | CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP125]), /* TMU01 */ |
554 | CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX */ | 562 | CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX */ |
555 | CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* I2C0 */ | 563 | CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* I2C0 */ |
564 | CLKDEV_DEV_ID("e6820000.i2c", &mstp_clks[MSTP116]), /* I2C0 */ | ||
556 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */ | 565 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */ |
557 | CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP219]), /* SCIFA7 */ | 566 | CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP219]), /* SCIFA7 */ |
558 | CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]), /* SY-DMAC */ | 567 | CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]), /* SY-DMAC */ |
@@ -569,17 +578,21 @@ static struct clk_lookup lookups[] = { | |||
569 | CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI */ | 578 | CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI */ |
570 | CLKDEV_DEV_ID("sh_irda.0", &mstp_clks[MSTP325]), /* IrDA */ | 579 | CLKDEV_DEV_ID("sh_irda.0", &mstp_clks[MSTP325]), /* IrDA */ |
571 | CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* I2C1 */ | 580 | CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* I2C1 */ |
581 | CLKDEV_DEV_ID("e6822000.i2c", &mstp_clks[MSTP323]), /* I2C1 */ | ||
572 | CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP322]), /* USB */ | 582 | CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP322]), /* USB */ |
573 | CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */ | 583 | CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */ |
574 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ | 584 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ |
575 | CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */ | 585 | CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */ |
586 | CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMCIF0 */ | ||
576 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */ | 587 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */ |
577 | CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */ | 588 | CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */ |
578 | CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */ | 589 | CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */ |
579 | CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */ | 590 | CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */ |
580 | CLKDEV_DEV_ID("leds-renesas-tpu.41", &mstp_clks[MSTP300]), /* TPU4 */ | 591 | CLKDEV_DEV_ID("leds-renesas-tpu.41", &mstp_clks[MSTP300]), /* TPU4 */ |
581 | CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */ | 592 | CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */ |
593 | CLKDEV_DEV_ID("e6826000.i2c", &mstp_clks[MSTP411]), /* I2C3 */ | ||
582 | CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */ | 594 | CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */ |
595 | CLKDEV_DEV_ID("e6828000.i2c", &mstp_clks[MSTP410]), /* I2C4 */ | ||
583 | CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */ | 596 | CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */ |
584 | }; | 597 | }; |
585 | 598 | ||
diff --git a/arch/arm/mach-shmobile/headsmp-sh73a0.S b/arch/arm/mach-shmobile/headsmp-sh73a0.S new file mode 100644 index 000000000000..bec4c0d9b713 --- /dev/null +++ b/arch/arm/mach-shmobile/headsmp-sh73a0.S | |||
@@ -0,0 +1,50 @@ | |||
1 | /* | ||
2 | * SMP support for SoC sh73a0 | ||
3 | * | ||
4 | * Copyright (C) 2012 Bastian Hecht | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License as | ||
8 | * published by the Free Software Foundation; either version 2 of | ||
9 | * the License, or (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||
19 | * MA 02111-1307 USA | ||
20 | */ | ||
21 | |||
22 | #include <linux/linkage.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <asm/memory.h> | ||
25 | |||
26 | __CPUINIT | ||
27 | /* | ||
28 | * Reset vector for secondary CPUs. | ||
29 | * | ||
30 | * First we turn on L1 cache coherency for our CPU. Then we jump to | ||
31 | * shmobile_invalidate_start that invalidates the cache and hands over control | ||
32 | * to the common ARM startup code. | ||
33 | * This function will be mapped to address 0 by the SBAR register. | ||
34 | * A normal branch is out of range here so we need a long jump. We jump to | ||
35 | * the physical address as the MMU is still turned off. | ||
36 | */ | ||
37 | .align 12 | ||
38 | ENTRY(sh73a0_secondary_vector) | ||
39 | mrc p15, 0, r0, c0, c0, 5 @ read MIPDR | ||
40 | and r0, r0, #3 @ mask out cpu ID | ||
41 | lsl r0, r0, #3 @ we will shift by cpu_id * 8 bits | ||
42 | mov r1, #0xf0000000 @ SCU base address | ||
43 | ldr r2, [r1, #8] @ SCU Power Status Register | ||
44 | mov r3, #3 | ||
45 | bic r2, r2, r3, lsl r0 @ Clear bits of our CPU (Run Mode) | ||
46 | str r2, [r1, #8] @ write back | ||
47 | |||
48 | ldr pc, 1f | ||
49 | 1: .long shmobile_invalidate_start - PAGE_OFFSET + PLAT_PHYS_OFFSET | ||
50 | ENDPROC(sh73a0_secondary_vector) | ||
diff --git a/arch/arm/mach-shmobile/headsmp.S b/arch/arm/mach-shmobile/headsmp.S index b202c1272526..96001fd49b6c 100644 --- a/arch/arm/mach-shmobile/headsmp.S +++ b/arch/arm/mach-shmobile/headsmp.S | |||
@@ -16,54 +16,6 @@ | |||
16 | 16 | ||
17 | __CPUINIT | 17 | __CPUINIT |
18 | 18 | ||
19 | /* Cache invalidation nicked from arch/arm/mach-imx/head-v7.S, thanks! | ||
20 | * | ||
21 | * The secondary kernel init calls v7_flush_dcache_all before it enables | ||
22 | * the L1; however, the L1 comes out of reset in an undefined state, so | ||
23 | * the clean + invalidate performed by v7_flush_dcache_all causes a bunch | ||
24 | * of cache lines with uninitialized data and uninitialized tags to get | ||
25 | * written out to memory, which does really unpleasant things to the main | ||
26 | * processor. We fix this by performing an invalidate, rather than a | ||
27 | * clean + invalidate, before jumping into the kernel. | ||
28 | * | ||
29 | * This funciton is cloned from arch/arm/mach-tegra/headsmp.S, and needs | ||
30 | * to be called for both secondary cores startup and primary core resume | ||
31 | * procedures. Ideally, it should be moved into arch/arm/mm/cache-v7.S. | ||
32 | */ | ||
33 | ENTRY(v7_invalidate_l1) | ||
34 | mov r0, #0 | ||
35 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache | ||
36 | mcr p15, 2, r0, c0, c0, 0 | ||
37 | mrc p15, 1, r0, c0, c0, 0 | ||
38 | |||
39 | ldr r1, =0x7fff | ||
40 | and r2, r1, r0, lsr #13 | ||
41 | |||
42 | ldr r1, =0x3ff | ||
43 | |||
44 | and r3, r1, r0, lsr #3 @ NumWays - 1 | ||
45 | add r2, r2, #1 @ NumSets | ||
46 | |||
47 | and r0, r0, #0x7 | ||
48 | add r0, r0, #4 @ SetShift | ||
49 | |||
50 | clz r1, r3 @ WayShift | ||
51 | add r4, r3, #1 @ NumWays | ||
52 | 1: sub r2, r2, #1 @ NumSets-- | ||
53 | mov r3, r4 @ Temp = NumWays | ||
54 | 2: subs r3, r3, #1 @ Temp-- | ||
55 | mov r5, r3, lsl r1 | ||
56 | mov r6, r2, lsl r0 | ||
57 | orr r5, r5, r6 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift) | ||
58 | mcr p15, 0, r5, c7, c6, 2 | ||
59 | bgt 2b | ||
60 | cmp r2, #0 | ||
61 | bgt 1b | ||
62 | dsb | ||
63 | isb | ||
64 | mov pc, lr | ||
65 | ENDPROC(v7_invalidate_l1) | ||
66 | |||
67 | ENTRY(shmobile_invalidate_start) | 19 | ENTRY(shmobile_invalidate_start) |
68 | bl v7_invalidate_l1 | 20 | bl v7_invalidate_l1 |
69 | b secondary_startup | 21 | b secondary_startup |
diff --git a/arch/arm/mach-shmobile/hotplug.c b/arch/arm/mach-shmobile/hotplug.c index b09a0bdbf813..a1524e3367b0 100644 --- a/arch/arm/mach-shmobile/hotplug.c +++ b/arch/arm/mach-shmobile/hotplug.c | |||
@@ -56,6 +56,12 @@ int shmobile_cpu_disable(unsigned int cpu) | |||
56 | return cpu == 0 ? -EPERM : 0; | 56 | return cpu == 0 ? -EPERM : 0; |
57 | } | 57 | } |
58 | 58 | ||
59 | int shmobile_cpu_disable_any(unsigned int cpu) | ||
60 | { | ||
61 | cpumask_clear_cpu(cpu, &dead_cpus); | ||
62 | return 0; | ||
63 | } | ||
64 | |||
59 | int shmobile_cpu_is_dead(unsigned int cpu) | 65 | int shmobile_cpu_is_dead(unsigned int cpu) |
60 | { | 66 | { |
61 | return cpumask_test_cpu(cpu, &dead_cpus); | 67 | return cpumask_test_cpu(cpu, &dead_cpus); |
diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index a57439eec11a..e48606d8a2be 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h | |||
@@ -23,6 +23,8 @@ extern void sh7372_map_io(void); | |||
23 | extern void sh7372_earlytimer_init(void); | 23 | extern void sh7372_earlytimer_init(void); |
24 | extern void sh7372_add_early_devices(void); | 24 | extern void sh7372_add_early_devices(void); |
25 | extern void sh7372_add_standard_devices(void); | 25 | extern void sh7372_add_standard_devices(void); |
26 | extern void sh7372_add_early_devices_dt(void); | ||
27 | extern void sh7372_add_standard_devices_dt(void); | ||
26 | extern void sh7372_clock_init(void); | 28 | extern void sh7372_clock_init(void); |
27 | extern void sh7372_pinmux_init(void); | 29 | extern void sh7372_pinmux_init(void); |
28 | extern void sh7372_pm_init(void); | 30 | extern void sh7372_pm_init(void); |
@@ -32,12 +34,17 @@ extern struct clk sh7372_extal1_clk; | |||
32 | extern struct clk sh7372_extal2_clk; | 34 | extern struct clk sh7372_extal2_clk; |
33 | 35 | ||
34 | extern void sh73a0_init_irq(void); | 36 | extern void sh73a0_init_irq(void); |
37 | extern void sh73a0_init_irq_dt(void); | ||
35 | extern void sh73a0_map_io(void); | 38 | extern void sh73a0_map_io(void); |
36 | extern void sh73a0_earlytimer_init(void); | 39 | extern void sh73a0_earlytimer_init(void); |
37 | extern void sh73a0_add_early_devices(void); | 40 | extern void sh73a0_add_early_devices(void); |
41 | extern void sh73a0_add_early_devices_dt(void); | ||
38 | extern void sh73a0_add_standard_devices(void); | 42 | extern void sh73a0_add_standard_devices(void); |
43 | extern void sh73a0_add_standard_devices_dt(void); | ||
39 | extern void sh73a0_clock_init(void); | 44 | extern void sh73a0_clock_init(void); |
40 | extern void sh73a0_pinmux_init(void); | 45 | extern void sh73a0_pinmux_init(void); |
46 | extern void sh73a0_pm_init(void); | ||
47 | extern void sh73a0_secondary_vector(void); | ||
41 | extern struct clk sh73a0_extal1_clk; | 48 | extern struct clk sh73a0_extal1_clk; |
42 | extern struct clk sh73a0_extal2_clk; | 49 | extern struct clk sh73a0_extal2_clk; |
43 | extern struct clk sh73a0_extcki_clk; | 50 | extern struct clk sh73a0_extcki_clk; |
@@ -49,6 +56,7 @@ extern void r8a7740_add_early_devices(void); | |||
49 | extern void r8a7740_add_standard_devices(void); | 56 | extern void r8a7740_add_standard_devices(void); |
50 | extern void r8a7740_clock_init(u8 md_ck); | 57 | extern void r8a7740_clock_init(u8 md_ck); |
51 | extern void r8a7740_pinmux_init(void); | 58 | extern void r8a7740_pinmux_init(void); |
59 | extern void r8a7740_pm_init(void); | ||
52 | 60 | ||
53 | extern void r8a7779_init_irq(void); | 61 | extern void r8a7779_init_irq(void); |
54 | extern void r8a7779_map_io(void); | 62 | extern void r8a7779_map_io(void); |
@@ -76,6 +84,7 @@ static inline int shmobile_cpuidle_init(void) { return 0; } | |||
76 | 84 | ||
77 | extern void shmobile_cpu_die(unsigned int cpu); | 85 | extern void shmobile_cpu_die(unsigned int cpu); |
78 | extern int shmobile_cpu_disable(unsigned int cpu); | 86 | extern int shmobile_cpu_disable(unsigned int cpu); |
87 | extern int shmobile_cpu_disable_any(unsigned int cpu); | ||
79 | 88 | ||
80 | #ifdef CONFIG_HOTPLUG_CPU | 89 | #ifdef CONFIG_HOTPLUG_CPU |
81 | extern int shmobile_cpu_is_dead(unsigned int cpu); | 90 | extern int shmobile_cpu_is_dead(unsigned int cpu); |
diff --git a/arch/arm/mach-shmobile/intc-sh73a0.c b/arch/arm/mach-shmobile/intc-sh73a0.c index 978369973be4..91faba666d46 100644 --- a/arch/arm/mach-shmobile/intc-sh73a0.c +++ b/arch/arm/mach-shmobile/intc-sh73a0.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | #include <linux/sh_intc.h> | 25 | #include <linux/sh_intc.h> |
26 | #include <linux/irqchip.h> | ||
26 | #include <linux/irqchip/arm-gic.h> | 27 | #include <linux/irqchip/arm-gic.h> |
27 | #include <mach/intc.h> | 28 | #include <mach/intc.h> |
28 | #include <mach/irqs.h> | 29 | #include <mach/irqs.h> |
@@ -315,11 +316,6 @@ static int intca_gic_set_type(struct irq_data *data, unsigned int type) | |||
315 | return irq_cbp(irq_set_type, to_intca_reloc_irq(data), type); | 316 | return irq_cbp(irq_set_type, to_intca_reloc_irq(data), type); |
316 | } | 317 | } |
317 | 318 | ||
318 | static int intca_gic_set_wake(struct irq_data *data, unsigned int on) | ||
319 | { | ||
320 | return irq_cbp(irq_set_wake, to_intca_reloc_irq(data), on); | ||
321 | } | ||
322 | |||
323 | #ifdef CONFIG_SMP | 319 | #ifdef CONFIG_SMP |
324 | static int intca_gic_set_affinity(struct irq_data *data, | 320 | static int intca_gic_set_affinity(struct irq_data *data, |
325 | const struct cpumask *cpumask, | 321 | const struct cpumask *cpumask, |
@@ -339,7 +335,7 @@ struct irq_chip intca_gic_irq_chip = { | |||
339 | .irq_disable = intca_gic_disable, | 335 | .irq_disable = intca_gic_disable, |
340 | .irq_shutdown = intca_gic_disable, | 336 | .irq_shutdown = intca_gic_disable, |
341 | .irq_set_type = intca_gic_set_type, | 337 | .irq_set_type = intca_gic_set_type, |
342 | .irq_set_wake = intca_gic_set_wake, | 338 | .irq_set_wake = sh73a0_set_wake, |
343 | #ifdef CONFIG_SMP | 339 | #ifdef CONFIG_SMP |
344 | .irq_set_affinity = intca_gic_set_affinity, | 340 | .irq_set_affinity = intca_gic_set_affinity, |
345 | #endif | 341 | #endif |
@@ -464,3 +460,11 @@ void __init sh73a0_init_irq(void) | |||
464 | sh73a0_pint1_cascade.handler = sh73a0_pint1_demux; | 460 | sh73a0_pint1_cascade.handler = sh73a0_pint1_demux; |
465 | setup_irq(gic_spi(34), &sh73a0_pint1_cascade); | 461 | setup_irq(gic_spi(34), &sh73a0_pint1_cascade); |
466 | } | 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/pm-r8a7740.c b/arch/arm/mach-shmobile/pm-r8a7740.c index 21e5316d2d88..40b87aa1d448 100644 --- a/arch/arm/mach-shmobile/pm-r8a7740.c +++ b/arch/arm/mach-shmobile/pm-r8a7740.c | |||
@@ -9,7 +9,9 @@ | |||
9 | * for more details. | 9 | * for more details. |
10 | */ | 10 | */ |
11 | #include <linux/console.h> | 11 | #include <linux/console.h> |
12 | #include <linux/suspend.h> | ||
12 | #include <mach/pm-rmobile.h> | 13 | #include <mach/pm-rmobile.h> |
14 | #include <mach/common.h> | ||
13 | 15 | ||
14 | #ifdef CONFIG_PM | 16 | #ifdef CONFIG_PM |
15 | static int r8a7740_pd_a4s_suspend(void) | 17 | static int r8a7740_pd_a4s_suspend(void) |
@@ -58,3 +60,23 @@ void __init r8a7740_init_pm_domains(void) | |||
58 | } | 60 | } |
59 | 61 | ||
60 | #endif /* CONFIG_PM */ | 62 | #endif /* CONFIG_PM */ |
63 | |||
64 | #ifdef CONFIG_SUSPEND | ||
65 | static int r8a7740_enter_suspend(suspend_state_t suspend_state) | ||
66 | { | ||
67 | cpu_do_idle(); | ||
68 | return 0; | ||
69 | } | ||
70 | |||
71 | static void r8a7740_suspend_init(void) | ||
72 | { | ||
73 | shmobile_suspend_ops.enter = r8a7740_enter_suspend; | ||
74 | } | ||
75 | #else | ||
76 | static void r8a7740_suspend_init(void) {} | ||
77 | #endif | ||
78 | |||
79 | void __init r8a7740_pm_init(void) | ||
80 | { | ||
81 | r8a7740_suspend_init(); | ||
82 | } | ||
diff --git a/arch/arm/mach-shmobile/pm-sh73a0.c b/arch/arm/mach-shmobile/pm-sh73a0.c new file mode 100644 index 000000000000..99086e98fbbc --- /dev/null +++ b/arch/arm/mach-shmobile/pm-sh73a0.c | |||
@@ -0,0 +1,32 @@ | |||
1 | /* | ||
2 | * sh73a0 Power management support | ||
3 | * | ||
4 | * Copyright (C) 2012 Bastian Hecht <hechtb+renesas@gmail.com> | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | #include <linux/suspend.h> | ||
12 | #include <mach/common.h> | ||
13 | |||
14 | #ifdef CONFIG_SUSPEND | ||
15 | static int sh73a0_enter_suspend(suspend_state_t suspend_state) | ||
16 | { | ||
17 | cpu_do_idle(); | ||
18 | return 0; | ||
19 | } | ||
20 | |||
21 | static void sh73a0_suspend_init(void) | ||
22 | { | ||
23 | shmobile_suspend_ops.enter = sh73a0_enter_suspend; | ||
24 | } | ||
25 | #else | ||
26 | static void sh73a0_suspend_init(void) {} | ||
27 | #endif | ||
28 | |||
29 | void __init sh73a0_pm_init(void) | ||
30 | { | ||
31 | sh73a0_suspend_init(); | ||
32 | } | ||
diff --git a/arch/arm/mach-shmobile/setup-r8a7740.c b/arch/arm/mach-shmobile/setup-r8a7740.c index b580979923eb..30ac79c7c687 100644 --- a/arch/arm/mach-shmobile/setup-r8a7740.c +++ b/arch/arm/mach-shmobile/setup-r8a7740.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/serial_sci.h> | 27 | #include <linux/serial_sci.h> |
28 | #include <linux/sh_dma.h> | 28 | #include <linux/sh_dma.h> |
29 | #include <linux/sh_timer.h> | 29 | #include <linux/sh_timer.h> |
30 | #include <linux/dma-mapping.h> | ||
31 | #include <mach/dma-register.h> | 30 | #include <mach/dma-register.h> |
32 | #include <mach/r8a7740.h> | 31 | #include <mach/r8a7740.h> |
33 | #include <mach/pm-rmobile.h> | 32 | #include <mach/pm-rmobile.h> |
@@ -288,6 +287,97 @@ static struct platform_device cmt10_device = { | |||
288 | .num_resources = ARRAY_SIZE(cmt10_resources), | 287 | .num_resources = ARRAY_SIZE(cmt10_resources), |
289 | }; | 288 | }; |
290 | 289 | ||
290 | /* TMU */ | ||
291 | static struct sh_timer_config tmu00_platform_data = { | ||
292 | .name = "TMU00", | ||
293 | .channel_offset = 0x4, | ||
294 | .timer_bit = 0, | ||
295 | .clockevent_rating = 200, | ||
296 | }; | ||
297 | |||
298 | static struct resource tmu00_resources[] = { | ||
299 | [0] = { | ||
300 | .name = "TMU00", | ||
301 | .start = 0xfff80008, | ||
302 | .end = 0xfff80014 - 1, | ||
303 | .flags = IORESOURCE_MEM, | ||
304 | }, | ||
305 | [1] = { | ||
306 | .start = intcs_evt2irq(0xe80), | ||
307 | .flags = IORESOURCE_IRQ, | ||
308 | }, | ||
309 | }; | ||
310 | |||
311 | static struct platform_device tmu00_device = { | ||
312 | .name = "sh_tmu", | ||
313 | .id = 0, | ||
314 | .dev = { | ||
315 | .platform_data = &tmu00_platform_data, | ||
316 | }, | ||
317 | .resource = tmu00_resources, | ||
318 | .num_resources = ARRAY_SIZE(tmu00_resources), | ||
319 | }; | ||
320 | |||
321 | static struct sh_timer_config tmu01_platform_data = { | ||
322 | .name = "TMU01", | ||
323 | .channel_offset = 0x10, | ||
324 | .timer_bit = 1, | ||
325 | .clocksource_rating = 200, | ||
326 | }; | ||
327 | |||
328 | static struct resource tmu01_resources[] = { | ||
329 | [0] = { | ||
330 | .name = "TMU01", | ||
331 | .start = 0xfff80014, | ||
332 | .end = 0xfff80020 - 1, | ||
333 | .flags = IORESOURCE_MEM, | ||
334 | }, | ||
335 | [1] = { | ||
336 | .start = intcs_evt2irq(0xea0), | ||
337 | .flags = IORESOURCE_IRQ, | ||
338 | }, | ||
339 | }; | ||
340 | |||
341 | static struct platform_device tmu01_device = { | ||
342 | .name = "sh_tmu", | ||
343 | .id = 1, | ||
344 | .dev = { | ||
345 | .platform_data = &tmu01_platform_data, | ||
346 | }, | ||
347 | .resource = tmu01_resources, | ||
348 | .num_resources = ARRAY_SIZE(tmu01_resources), | ||
349 | }; | ||
350 | |||
351 | static struct sh_timer_config tmu02_platform_data = { | ||
352 | .name = "TMU02", | ||
353 | .channel_offset = 0x1C, | ||
354 | .timer_bit = 2, | ||
355 | .clocksource_rating = 200, | ||
356 | }; | ||
357 | |||
358 | static struct resource tmu02_resources[] = { | ||
359 | [0] = { | ||
360 | .name = "TMU02", | ||
361 | .start = 0xfff80020, | ||
362 | .end = 0xfff8002C - 1, | ||
363 | .flags = IORESOURCE_MEM, | ||
364 | }, | ||
365 | [1] = { | ||
366 | .start = intcs_evt2irq(0xec0), | ||
367 | .flags = IORESOURCE_IRQ, | ||
368 | }, | ||
369 | }; | ||
370 | |||
371 | static struct platform_device tmu02_device = { | ||
372 | .name = "sh_tmu", | ||
373 | .id = 2, | ||
374 | .dev = { | ||
375 | .platform_data = &tmu02_platform_data, | ||
376 | }, | ||
377 | .resource = tmu02_resources, | ||
378 | .num_resources = ARRAY_SIZE(tmu02_resources), | ||
379 | }; | ||
380 | |||
291 | static struct platform_device *r8a7740_early_devices[] __initdata = { | 381 | static struct platform_device *r8a7740_early_devices[] __initdata = { |
292 | &scif0_device, | 382 | &scif0_device, |
293 | &scif1_device, | 383 | &scif1_device, |
@@ -299,6 +389,9 @@ static struct platform_device *r8a7740_early_devices[] __initdata = { | |||
299 | &scif7_device, | 389 | &scif7_device, |
300 | &scifb_device, | 390 | &scifb_device, |
301 | &cmt10_device, | 391 | &cmt10_device, |
392 | &tmu00_device, | ||
393 | &tmu01_device, | ||
394 | &tmu02_device, | ||
302 | }; | 395 | }; |
303 | 396 | ||
304 | /* DMA */ | 397 | /* DMA */ |
diff --git a/arch/arm/mach-shmobile/setup-r8a7779.c b/arch/arm/mach-shmobile/setup-r8a7779.c index 344eb79658f9..c54ff9b29fe5 100644 --- a/arch/arm/mach-shmobile/setup-r8a7779.c +++ b/arch/arm/mach-shmobile/setup-r8a7779.c | |||
@@ -91,8 +91,7 @@ static struct plat_sci_port scif0_platform_data = { | |||
91 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 91 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
92 | .scbrr_algo_id = SCBRR_ALGO_2, | 92 | .scbrr_algo_id = SCBRR_ALGO_2, |
93 | .type = PORT_SCIF, | 93 | .type = PORT_SCIF, |
94 | .irqs = { gic_spi(88), gic_spi(88), | 94 | .irqs = SCIx_IRQ_MUXED(gic_spi(88)), |
95 | gic_spi(88), gic_spi(88) }, | ||
96 | }; | 95 | }; |
97 | 96 | ||
98 | static struct platform_device scif0_device = { | 97 | static struct platform_device scif0_device = { |
@@ -109,8 +108,7 @@ static struct plat_sci_port scif1_platform_data = { | |||
109 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 108 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
110 | .scbrr_algo_id = SCBRR_ALGO_2, | 109 | .scbrr_algo_id = SCBRR_ALGO_2, |
111 | .type = PORT_SCIF, | 110 | .type = PORT_SCIF, |
112 | .irqs = { gic_spi(89), gic_spi(89), | 111 | .irqs = SCIx_IRQ_MUXED(gic_spi(89)), |
113 | gic_spi(89), gic_spi(89) }, | ||
114 | }; | 112 | }; |
115 | 113 | ||
116 | static struct platform_device scif1_device = { | 114 | static struct platform_device scif1_device = { |
@@ -127,8 +125,7 @@ static struct plat_sci_port scif2_platform_data = { | |||
127 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 125 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
128 | .scbrr_algo_id = SCBRR_ALGO_2, | 126 | .scbrr_algo_id = SCBRR_ALGO_2, |
129 | .type = PORT_SCIF, | 127 | .type = PORT_SCIF, |
130 | .irqs = { gic_spi(90), gic_spi(90), | 128 | .irqs = SCIx_IRQ_MUXED(gic_spi(90)), |
131 | gic_spi(90), gic_spi(90) }, | ||
132 | }; | 129 | }; |
133 | 130 | ||
134 | static struct platform_device scif2_device = { | 131 | static struct platform_device scif2_device = { |
@@ -145,8 +142,7 @@ static struct plat_sci_port scif3_platform_data = { | |||
145 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 142 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
146 | .scbrr_algo_id = SCBRR_ALGO_2, | 143 | .scbrr_algo_id = SCBRR_ALGO_2, |
147 | .type = PORT_SCIF, | 144 | .type = PORT_SCIF, |
148 | .irqs = { gic_spi(91), gic_spi(91), | 145 | .irqs = SCIx_IRQ_MUXED(gic_spi(91)), |
149 | gic_spi(91), gic_spi(91) }, | ||
150 | }; | 146 | }; |
151 | 147 | ||
152 | static struct platform_device scif3_device = { | 148 | static struct platform_device scif3_device = { |
@@ -163,8 +159,7 @@ static struct plat_sci_port scif4_platform_data = { | |||
163 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 159 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
164 | .scbrr_algo_id = SCBRR_ALGO_2, | 160 | .scbrr_algo_id = SCBRR_ALGO_2, |
165 | .type = PORT_SCIF, | 161 | .type = PORT_SCIF, |
166 | .irqs = { gic_spi(92), gic_spi(92), | 162 | .irqs = SCIx_IRQ_MUXED(gic_spi(92)), |
167 | gic_spi(92), gic_spi(92) }, | ||
168 | }; | 163 | }; |
169 | 164 | ||
170 | static struct platform_device scif4_device = { | 165 | static struct platform_device scif4_device = { |
@@ -181,8 +176,7 @@ static struct plat_sci_port scif5_platform_data = { | |||
181 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, | 176 | .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1, |
182 | .scbrr_algo_id = SCBRR_ALGO_2, | 177 | .scbrr_algo_id = SCBRR_ALGO_2, |
183 | .type = PORT_SCIF, | 178 | .type = PORT_SCIF, |
184 | .irqs = { gic_spi(93), gic_spi(93), | 179 | .irqs = SCIx_IRQ_MUXED(gic_spi(93)), |
185 | gic_spi(93), gic_spi(93) }, | ||
186 | }; | 180 | }; |
187 | 181 | ||
188 | static struct platform_device scif5_device = { | 182 | static struct platform_device scif5_device = { |
diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c index 48f7f583647a..2ecd6681692f 100644 --- a/arch/arm/mach-shmobile/setup-sh73a0.c +++ b/arch/arm/mach-shmobile/setup-sh73a0.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/interrupt.h> | 23 | #include <linux/interrupt.h> |
24 | #include <linux/irq.h> | 24 | #include <linux/irq.h> |
25 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
26 | #include <linux/of_platform.h> | ||
26 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
27 | #include <linux/input.h> | 28 | #include <linux/input.h> |
28 | #include <linux/io.h> | 29 | #include <linux/io.h> |
@@ -779,7 +780,7 @@ static struct platform_device pmu_device = { | |||
779 | .resource = pmu_resources, | 780 | .resource = pmu_resources, |
780 | }; | 781 | }; |
781 | 782 | ||
782 | static struct platform_device *sh73a0_early_devices[] __initdata = { | 783 | static struct platform_device *sh73a0_early_devices_dt[] __initdata = { |
783 | &scif0_device, | 784 | &scif0_device, |
784 | &scif1_device, | 785 | &scif1_device, |
785 | &scif2_device, | 786 | &scif2_device, |
@@ -790,6 +791,9 @@ static struct platform_device *sh73a0_early_devices[] __initdata = { | |||
790 | &scif7_device, | 791 | &scif7_device, |
791 | &scif8_device, | 792 | &scif8_device, |
792 | &cmt10_device, | 793 | &cmt10_device, |
794 | }; | ||
795 | |||
796 | static struct platform_device *sh73a0_early_devices[] __initdata = { | ||
793 | &tmu00_device, | 797 | &tmu00_device, |
794 | &tmu01_device, | 798 | &tmu01_device, |
795 | }; | 799 | }; |
@@ -812,6 +816,8 @@ void __init sh73a0_add_standard_devices(void) | |||
812 | /* Clear software reset bit on SY-DMAC module */ | 816 | /* Clear software reset bit on SY-DMAC module */ |
813 | __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2); | 817 | __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2); |
814 | 818 | ||
819 | platform_add_devices(sh73a0_early_devices_dt, | ||
820 | ARRAY_SIZE(sh73a0_early_devices_dt)); | ||
815 | platform_add_devices(sh73a0_early_devices, | 821 | platform_add_devices(sh73a0_early_devices, |
816 | ARRAY_SIZE(sh73a0_early_devices)); | 822 | ARRAY_SIZE(sh73a0_early_devices)); |
817 | platform_add_devices(sh73a0_late_devices, | 823 | platform_add_devices(sh73a0_late_devices, |
@@ -830,9 +836,63 @@ void __init sh73a0_earlytimer_init(void) | |||
830 | 836 | ||
831 | void __init sh73a0_add_early_devices(void) | 837 | void __init sh73a0_add_early_devices(void) |
832 | { | 838 | { |
839 | early_platform_add_devices(sh73a0_early_devices_dt, | ||
840 | ARRAY_SIZE(sh73a0_early_devices_dt)); | ||
833 | early_platform_add_devices(sh73a0_early_devices, | 841 | early_platform_add_devices(sh73a0_early_devices, |
834 | ARRAY_SIZE(sh73a0_early_devices)); | 842 | ARRAY_SIZE(sh73a0_early_devices)); |
835 | 843 | ||
836 | /* setup early console here as well */ | 844 | /* setup early console here as well */ |
837 | shmobile_setup_console(); | 845 | shmobile_setup_console(); |
838 | } | 846 | } |
847 | |||
848 | #ifdef CONFIG_USE_OF | ||
849 | |||
850 | /* Please note that the clock initialisation shcheme used in | ||
851 | * sh73a0_add_early_devices_dt() and sh73a0_add_standard_devices_dt() | ||
852 | * does not work with SMP as there is a yet to be resolved lock-up in | ||
853 | * workqueue initialisation. | ||
854 | * | ||
855 | * CONFIG_SMP should be disabled when using this code. | ||
856 | */ | ||
857 | |||
858 | void __init sh73a0_add_early_devices_dt(void) | ||
859 | { | ||
860 | shmobile_setup_delay(1196, 44, 46); /* Cortex-A9 @ 1196MHz */ | ||
861 | |||
862 | early_platform_add_devices(sh73a0_early_devices_dt, | ||
863 | ARRAY_SIZE(sh73a0_early_devices_dt)); | ||
864 | |||
865 | /* setup early console here as well */ | ||
866 | shmobile_setup_console(); | ||
867 | } | ||
868 | |||
869 | static const struct of_dev_auxdata sh73a0_auxdata_lookup[] __initconst = { | ||
870 | {}, | ||
871 | }; | ||
872 | |||
873 | void __init sh73a0_add_standard_devices_dt(void) | ||
874 | { | ||
875 | /* clocks are setup late during boot in the case of DT */ | ||
876 | sh73a0_clock_init(); | ||
877 | |||
878 | platform_add_devices(sh73a0_early_devices_dt, | ||
879 | ARRAY_SIZE(sh73a0_early_devices_dt)); | ||
880 | of_platform_populate(NULL, of_default_bus_match_table, | ||
881 | sh73a0_auxdata_lookup, NULL); | ||
882 | } | ||
883 | |||
884 | static const char *sh73a0_boards_compat_dt[] __initdata = { | ||
885 | "renesas,sh73a0", | ||
886 | NULL, | ||
887 | }; | ||
888 | |||
889 | DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)") | ||
890 | .map_io = sh73a0_map_io, | ||
891 | .init_early = sh73a0_add_early_devices_dt, | ||
892 | .nr_irqs = NR_IRQS_LEGACY, | ||
893 | .init_irq = sh73a0_init_irq_dt, | ||
894 | .init_machine = sh73a0_add_standard_devices_dt, | ||
895 | .init_time = shmobile_timer_init, | ||
896 | .dt_compat = sh73a0_boards_compat_dt, | ||
897 | MACHINE_END | ||
898 | #endif /* CONFIG_USE_OF */ | ||
diff --git a/arch/arm/mach-shmobile/sleep-sh7372.S b/arch/arm/mach-shmobile/sleep-sh7372.S index 1d564674451d..a9df53b69ab8 100644 --- a/arch/arm/mach-shmobile/sleep-sh7372.S +++ b/arch/arm/mach-shmobile/sleep-sh7372.S | |||
@@ -59,17 +59,19 @@ sh7372_do_idle_sysc: | |||
59 | mcr p15, 0, r0, c1, c0, 0 | 59 | mcr p15, 0, r0, c1, c0, 0 |
60 | isb | 60 | isb |
61 | 61 | ||
62 | /* | ||
63 | * Clean and invalidate data cache again. | ||
64 | */ | ||
65 | ldr r1, kernel_flush | ||
66 | blx r1 | ||
67 | |||
62 | /* disable L2 cache in the aux control register */ | 68 | /* disable L2 cache in the aux control register */ |
63 | mrc p15, 0, r10, c1, c0, 1 | 69 | mrc p15, 0, r10, c1, c0, 1 |
64 | bic r10, r10, #2 | 70 | bic r10, r10, #2 |
65 | mcr p15, 0, r10, c1, c0, 1 | 71 | mcr p15, 0, r10, c1, c0, 1 |
72 | isb | ||
66 | 73 | ||
67 | /* | 74 | /* |
68 | * Invalidate data cache again. | ||
69 | */ | ||
70 | ldr r1, kernel_flush | ||
71 | blx r1 | ||
72 | /* | ||
73 | * The kernel doesn't interwork: v7_flush_dcache_all in particluar will | 75 | * The kernel doesn't interwork: v7_flush_dcache_all in particluar will |
74 | * always return in Thumb state when CONFIG_THUMB2_KERNEL is enabled. | 76 | * always return in Thumb state when CONFIG_THUMB2_KERNEL is enabled. |
75 | * This sequence switches back to ARM. Note that .align may insert a | 77 | * This sequence switches back to ARM. Note that .align may insert a |
diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index 5c5bcb595350..acb46a94ccdf 100644 --- a/arch/arm/mach-shmobile/smp-sh73a0.c +++ b/arch/arm/mach-shmobile/smp-sh73a0.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
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 <asm/cacheflush.h> | ||
28 | #include <asm/smp_plat.h> | 29 | #include <asm/smp_plat.h> |
29 | #include <mach/sh73a0.h> | 30 | #include <mach/sh73a0.h> |
30 | #include <asm/smp_scu.h> | 31 | #include <asm/smp_scu.h> |
@@ -36,14 +37,13 @@ | |||
36 | #define SBAR IOMEM(0xe6180020) | 37 | #define SBAR IOMEM(0xe6180020) |
37 | #define APARMBAREA IOMEM(0xe6f10020) | 38 | #define APARMBAREA IOMEM(0xe6f10020) |
38 | 39 | ||
40 | #define PSTR_SHUTDOWN_MODE 3 | ||
41 | |||
39 | static void __iomem *scu_base_addr(void) | 42 | static void __iomem *scu_base_addr(void) |
40 | { | 43 | { |
41 | return (void __iomem *)0xf0000000; | 44 | return (void __iomem *)0xf0000000; |
42 | } | 45 | } |
43 | 46 | ||
44 | static DEFINE_SPINLOCK(scu_lock); | ||
45 | static unsigned long tmp; | ||
46 | |||
47 | #ifdef CONFIG_HAVE_ARM_TWD | 47 | #ifdef CONFIG_HAVE_ARM_TWD |
48 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); | 48 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); |
49 | void __init sh73a0_register_twd(void) | 49 | void __init sh73a0_register_twd(void) |
@@ -52,20 +52,6 @@ void __init sh73a0_register_twd(void) | |||
52 | } | 52 | } |
53 | #endif | 53 | #endif |
54 | 54 | ||
55 | static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) | ||
56 | { | ||
57 | void __iomem *scu_base = scu_base_addr(); | ||
58 | |||
59 | spin_lock(&scu_lock); | ||
60 | tmp = __raw_readl(scu_base + 8); | ||
61 | tmp &= ~clr; | ||
62 | tmp |= set; | ||
63 | spin_unlock(&scu_lock); | ||
64 | |||
65 | /* disable cache coherency after releasing the lock */ | ||
66 | __raw_writel(tmp, scu_base + 8); | ||
67 | } | ||
68 | |||
69 | static unsigned int __init sh73a0_get_core_count(void) | 55 | static unsigned int __init sh73a0_get_core_count(void) |
70 | { | 56 | { |
71 | void __iomem *scu_base = scu_base_addr(); | 57 | void __iomem *scu_base = scu_base_addr(); |
@@ -82,9 +68,6 @@ static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct | |||
82 | { | 68 | { |
83 | cpu = cpu_logical_map(cpu); | 69 | cpu = cpu_logical_map(cpu); |
84 | 70 | ||
85 | /* enable cache coherency */ | ||
86 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); | ||
87 | |||
88 | if (((__raw_readl(PSTR) >> (4 * cpu)) & 3) == 3) | 71 | if (((__raw_readl(PSTR) >> (4 * cpu)) & 3) == 3) |
89 | __raw_writel(1 << cpu, WUPCR); /* wake up */ | 72 | __raw_writel(1 << cpu, WUPCR); /* wake up */ |
90 | else | 73 | else |
@@ -95,16 +78,14 @@ static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct | |||
95 | 78 | ||
96 | static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus) | 79 | static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus) |
97 | { | 80 | { |
98 | int cpu = cpu_logical_map(0); | ||
99 | |||
100 | scu_enable(scu_base_addr()); | 81 | scu_enable(scu_base_addr()); |
101 | 82 | ||
102 | /* Map the reset vector (in headsmp.S) */ | 83 | /* Map the reset vector (in headsmp-sh73a0.S) */ |
103 | __raw_writel(0, APARMBAREA); /* 4k */ | 84 | __raw_writel(0, APARMBAREA); /* 4k */ |
104 | __raw_writel(__pa(shmobile_secondary_vector), SBAR); | 85 | __raw_writel(__pa(sh73a0_secondary_vector), SBAR); |
105 | 86 | ||
106 | /* enable cache coherency on CPU0 */ | 87 | /* enable cache coherency on booting CPU */ |
107 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); | 88 | scu_power_mode(scu_base_addr(), SCU_PM_NORMAL); |
108 | } | 89 | } |
109 | 90 | ||
110 | static void __init sh73a0_smp_init_cpus(void) | 91 | static void __init sh73a0_smp_init_cpus(void) |
@@ -114,16 +95,20 @@ static void __init sh73a0_smp_init_cpus(void) | |||
114 | shmobile_smp_init_cpus(ncores); | 95 | shmobile_smp_init_cpus(ncores); |
115 | } | 96 | } |
116 | 97 | ||
117 | static int __maybe_unused sh73a0_cpu_kill(unsigned int cpu) | 98 | #ifdef CONFIG_HOTPLUG_CPU |
99 | static int sh73a0_cpu_kill(unsigned int cpu) | ||
118 | { | 100 | { |
101 | |||
119 | int k; | 102 | int k; |
103 | u32 pstr; | ||
120 | 104 | ||
121 | /* this function is running on another CPU than the offline target, | 105 | /* |
122 | * here we need wait for shutdown code in platform_cpu_die() to | 106 | * wait until the power status register confirms the shutdown of the |
123 | * finish before asking SoC-specific code to power off the CPU core. | 107 | * offline target |
124 | */ | 108 | */ |
125 | for (k = 0; k < 1000; k++) { | 109 | for (k = 0; k < 1000; k++) { |
126 | if (shmobile_cpu_is_dead(cpu)) | 110 | pstr = (__raw_readl(PSTR) >> (4 * cpu)) & 3; |
111 | if (pstr == PSTR_SHUTDOWN_MODE) | ||
127 | return 1; | 112 | return 1; |
128 | 113 | ||
129 | mdelay(1); | 114 | mdelay(1); |
@@ -132,6 +117,23 @@ static int __maybe_unused sh73a0_cpu_kill(unsigned int cpu) | |||
132 | return 0; | 117 | return 0; |
133 | } | 118 | } |
134 | 119 | ||
120 | static void sh73a0_cpu_die(unsigned int cpu) | ||
121 | { | ||
122 | /* | ||
123 | * The ARM MPcore does not issue a cache coherency request for the L1 | ||
124 | * cache when powering off single CPUs. We must take care of this and | ||
125 | * further caches. | ||
126 | */ | ||
127 | dsb(); | ||
128 | flush_cache_all(); | ||
129 | |||
130 | /* Set power off mode. This takes the CPU out of the MP cluster */ | ||
131 | scu_power_mode(scu_base_addr(), SCU_PM_POWEROFF); | ||
132 | |||
133 | /* Enter shutdown mode */ | ||
134 | cpu_do_idle(); | ||
135 | } | ||
136 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
135 | 137 | ||
136 | struct smp_operations sh73a0_smp_ops __initdata = { | 138 | struct smp_operations sh73a0_smp_ops __initdata = { |
137 | .smp_init_cpus = sh73a0_smp_init_cpus, | 139 | .smp_init_cpus = sh73a0_smp_init_cpus, |
@@ -140,7 +142,7 @@ struct smp_operations sh73a0_smp_ops __initdata = { | |||
140 | .smp_boot_secondary = sh73a0_boot_secondary, | 142 | .smp_boot_secondary = sh73a0_boot_secondary, |
141 | #ifdef CONFIG_HOTPLUG_CPU | 143 | #ifdef CONFIG_HOTPLUG_CPU |
142 | .cpu_kill = sh73a0_cpu_kill, | 144 | .cpu_kill = sh73a0_cpu_kill, |
143 | .cpu_die = shmobile_cpu_die, | 145 | .cpu_die = sh73a0_cpu_die, |
144 | .cpu_disable = shmobile_cpu_disable, | 146 | .cpu_disable = shmobile_cpu_disable_any, |
145 | #endif | 147 | #endif |
146 | }; | 148 | }; |
diff --git a/arch/arm/mach-shmobile/timer.c b/arch/arm/mach-shmobile/timer.c index fdbe54a11555..3d16d4dff01b 100644 --- a/arch/arm/mach-shmobile/timer.c +++ b/arch/arm/mach-shmobile/timer.c | |||
@@ -20,6 +20,7 @@ | |||
20 | */ | 20 | */ |
21 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
22 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
23 | #include <asm/arch_timer.h> | ||
23 | #include <asm/mach/time.h> | 24 | #include <asm/mach/time.h> |
24 | #include <asm/smp_twd.h> | 25 | #include <asm/smp_twd.h> |
25 | 26 | ||
@@ -62,4 +63,6 @@ void __init shmobile_earlytimer_init(void) | |||
62 | 63 | ||
63 | void __init shmobile_timer_init(void) | 64 | void __init shmobile_timer_init(void) |
64 | { | 65 | { |
66 | arch_timer_of_register(); | ||
67 | arch_timer_sched_clock_init(); | ||
65 | } | 68 | } |