aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/boot/dts/am4372.dtsi4
-rw-r--r--arch/arm/boot/dts/am57xx-beagle-x15.dts49
-rw-r--r--arch/arm/boot/dts/at91-sama5d3_xplained.dts6
-rw-r--r--arch/arm/boot/dts/dra7.dtsi23
-rw-r--r--arch/arm/boot/dts/dra72x.dtsi5
-rw-r--r--arch/arm/boot/dts/dra74x.dtsi5
-rw-r--r--arch/arm/boot/dts/exynos5250-spring.dts20
-rw-r--r--arch/arm/boot/dts/omap4-cpu-thermal.dtsi4
-rw-r--r--arch/arm/mach-cns3xxx/pm.c1
-rw-r--r--arch/arm/mach-exynos/exynos.c2
-rw-r--r--arch/arm/mach-exynos/pm.c2
-rw-r--r--arch/arm/mach-mvebu/pmsu.c16
-rw-r--r--arch/arm/mach-omap1/pm.c51
-rw-r--r--arch/arm/mach-omap2/Kconfig22
-rw-r--r--arch/arm/mach-omap2/common.c1
-rw-r--r--arch/arm/mach-omap2/common.h3
-rw-r--r--arch/arm/mach-omap2/io.c2
-rw-r--r--arch/arm/mach-omap2/mux.c2
-rw-r--r--arch/arm/mach-omap2/omap-secure.h7
-rw-r--r--arch/arm/mach-omap2/omap4-common.c69
-rw-r--r--arch/arm/mach-omap2/sleep44xx.S2
-rw-r--r--arch/arm/mach-s3c24xx/Kconfig19
-rw-r--r--arch/arm/mach-s3c24xx/Makefile3
-rw-r--r--arch/arm/mach-s3c24xx/include/mach/pm-core.h24
-rw-r--r--arch/arm/mach-s3c24xx/pm-s3c2416.c3
-rw-r--r--arch/arm/mach-s3c24xx/pm.c6
-rw-r--r--arch/arm/mach-s3c24xx/s3c2410.c2
-rw-r--r--arch/arm/mach-s3c24xx/s3c2412.c2
-rw-r--r--arch/arm/mach-s3c24xx/s3c2416.c2
-rw-r--r--arch/arm/mach-s3c24xx/s3c2440.c4
-rw-r--r--arch/arm/mach-s3c24xx/s3c2442.c4
-rw-r--r--arch/arm/mach-s3c24xx/s3c244x.c7
-rw-r--r--arch/arm/mach-s3c64xx/Kconfig4
-rw-r--r--arch/arm/mach-s3c64xx/Makefile3
-rw-r--r--arch/arm/mach-s3c64xx/mach-smdk6410.c2
-rw-r--r--arch/arm/mach-s3c64xx/pm.c2
-rw-r--r--arch/arm/plat-samsung/include/plat/pm.h14
-rw-r--r--arch/arm/plat-samsung/pm-debug.c1
-rw-r--r--arch/arm/plat-samsung/pm.c20
39 files changed, 212 insertions, 206 deletions
diff --git a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi
index 8a099bc10c1e..ebe4fa691860 100644
--- a/arch/arm/boot/dts/am4372.dtsi
+++ b/arch/arm/boot/dts/am4372.dtsi
@@ -796,7 +796,7 @@
796 }; 796 };
797 797
798 ocp2scp0: ocp2scp@483a8000 { 798 ocp2scp0: ocp2scp@483a8000 {
799 compatible = "ti,omap-ocp2scp"; 799 compatible = "ti,am437x-ocp2scp", "ti,omap-ocp2scp";
800 #address-cells = <1>; 800 #address-cells = <1>;
801 #size-cells = <1>; 801 #size-cells = <1>;
802 ranges; 802 ranges;
@@ -815,7 +815,7 @@
815 }; 815 };
816 816
817 ocp2scp1: ocp2scp@483e8000 { 817 ocp2scp1: ocp2scp@483e8000 {
818 compatible = "ti,omap-ocp2scp"; 818 compatible = "ti,am437x-ocp2scp", "ti,omap-ocp2scp";
819 #address-cells = <1>; 819 #address-cells = <1>;
820 #size-cells = <1>; 820 #size-cells = <1>;
821 ranges; 821 ranges;
diff --git a/arch/arm/boot/dts/am57xx-beagle-x15.dts b/arch/arm/boot/dts/am57xx-beagle-x15.dts
index bd48dba16748..e580f4ffbde0 100644
--- a/arch/arm/boot/dts/am57xx-beagle-x15.dts
+++ b/arch/arm/boot/dts/am57xx-beagle-x15.dts
@@ -87,6 +87,7 @@
87 gpios = <&tps659038_gpio 1 GPIO_ACTIVE_HIGH>; 87 gpios = <&tps659038_gpio 1 GPIO_ACTIVE_HIGH>;
88 gpio-fan,speed-map = <0 0>, 88 gpio-fan,speed-map = <0 0>,
89 <13000 1>; 89 <13000 1>;
90 #cooling-cells = <2>;
90 }; 91 };
91 92
92 extcon_usb1: extcon_usb1 { 93 extcon_usb1: extcon_usb1 {
@@ -442,6 +443,7 @@
442 pinctrl-0 = <&tmp102_pins_default>; 443 pinctrl-0 = <&tmp102_pins_default>;
443 interrupt-parent = <&gpio7>; 444 interrupt-parent = <&gpio7>;
444 interrupts = <16 IRQ_TYPE_LEVEL_LOW>; 445 interrupts = <16 IRQ_TYPE_LEVEL_LOW>;
446 #thermal-sensor-cells = <1>;
445 }; 447 };
446}; 448};
447 449
@@ -551,3 +553,50 @@
551&usb2 { 553&usb2 {
552 dr_mode = "peripheral"; 554 dr_mode = "peripheral";
553}; 555};
556
557&cpu_trips {
558 cpu_alert1: cpu_alert1 {
559 temperature = <50000>; /* millicelsius */
560 hysteresis = <2000>; /* millicelsius */
561 type = "active";
562 };
563};
564
565&cpu_cooling_maps {
566 map1 {
567 trip = <&cpu_alert1>;
568 cooling-device = <&gpio_fan THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
569 };
570};
571
572&thermal_zones {
573 board_thermal: board_thermal {
574 polling-delay-passive = <1250>; /* milliseconds */
575 polling-delay = <1500>; /* milliseconds */
576
577 /* sensor ID */
578 thermal-sensors = <&tmp102 0>;
579
580 board_trips: trips {
581 board_alert0: board_alert {
582 temperature = <40000>; /* millicelsius */
583 hysteresis = <2000>; /* millicelsius */
584 type = "active";
585 };
586
587 board_crit: board_crit {
588 temperature = <105000>; /* millicelsius */
589 hysteresis = <0>; /* millicelsius */
590 type = "critical";
591 };
592 };
593
594 board_cooling_maps: cooling-maps {
595 map0 {
596 trip = <&board_alert0>;
597 cooling-device =
598 <&gpio_fan THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
599 };
600 };
601 };
602};
diff --git a/arch/arm/boot/dts/at91-sama5d3_xplained.dts b/arch/arm/boot/dts/at91-sama5d3_xplained.dts
index fec1fca2ad66..6c4bc53cbf4e 100644
--- a/arch/arm/boot/dts/at91-sama5d3_xplained.dts
+++ b/arch/arm/boot/dts/at91-sama5d3_xplained.dts
@@ -167,7 +167,13 @@
167 167
168 macb1: ethernet@f802c000 { 168 macb1: ethernet@f802c000 {
169 phy-mode = "rmii"; 169 phy-mode = "rmii";
170 #address-cells = <1>;
171 #size-cells = <0>;
170 status = "okay"; 172 status = "okay";
173
174 ethernet-phy@1 {
175 reg = <0x1>;
176 };
171 }; 177 };
172 178
173 dbgu: serial@ffffee00 { 179 dbgu: serial@ffffee00 {
diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi
index a0afce7ad482..fe55938bc978 100644
--- a/arch/arm/boot/dts/dra7.dtsi
+++ b/arch/arm/boot/dts/dra7.dtsi
@@ -185,6 +185,18 @@
185 }; 185 };
186 }; 186 };
187 187
188 bandgap: bandgap@4a0021e0 {
189 reg = <0x4a0021e0 0xc
190 0x4a00232c 0xc
191 0x4a002380 0x2c
192 0x4a0023C0 0x3c
193 0x4a002564 0x8
194 0x4a002574 0x50>;
195 compatible = "ti,dra752-bandgap";
196 interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
197 #thermal-sensor-cells = <1>;
198 };
199
188 cm_core_aon: cm_core_aon@4a005000 { 200 cm_core_aon: cm_core_aon@4a005000 {
189 compatible = "ti,dra7-cm-core-aon"; 201 compatible = "ti,dra7-cm-core-aon";
190 reg = <0x4a005000 0x2000>; 202 reg = <0x4a005000 0x2000>;
@@ -1435,6 +1447,17 @@
1435 status = "disabled"; 1447 status = "disabled";
1436 }; 1448 };
1437 }; 1449 };
1450
1451 thermal_zones: thermal-zones {
1452 #include "omap4-cpu-thermal.dtsi"
1453 #include "omap5-gpu-thermal.dtsi"
1454 #include "omap5-core-thermal.dtsi"
1455 };
1456
1457};
1458
1459&cpu_thermal {
1460 polling-delay = <500>; /* milliseconds */
1438}; 1461};
1439 1462
1440/include/ "dra7xx-clocks.dtsi" 1463/include/ "dra7xx-clocks.dtsi"
diff --git a/arch/arm/boot/dts/dra72x.dtsi b/arch/arm/boot/dts/dra72x.dtsi
index f7fb0d0ef25a..03d742f8d572 100644
--- a/arch/arm/boot/dts/dra72x.dtsi
+++ b/arch/arm/boot/dts/dra72x.dtsi
@@ -20,6 +20,11 @@
20 device_type = "cpu"; 20 device_type = "cpu";
21 compatible = "arm,cortex-a15"; 21 compatible = "arm,cortex-a15";
22 reg = <0>; 22 reg = <0>;
23
24 /* cooling options */
25 cooling-min-level = <0>;
26 cooling-max-level = <2>;
27 #cooling-cells = <2>; /* min followed by max */
23 }; 28 };
24 }; 29 };
25 30
diff --git a/arch/arm/boot/dts/dra74x.dtsi b/arch/arm/boot/dts/dra74x.dtsi
index 00eeed789b4b..cc560a70926f 100644
--- a/arch/arm/boot/dts/dra74x.dtsi
+++ b/arch/arm/boot/dts/dra74x.dtsi
@@ -31,6 +31,11 @@
31 clock-names = "cpu"; 31 clock-names = "cpu";
32 32
33 clock-latency = <300000>; /* From omap-cpufreq driver */ 33 clock-latency = <300000>; /* From omap-cpufreq driver */
34
35 /* cooling options */
36 cooling-min-level = <0>;
37 cooling-max-level = <2>;
38 #cooling-cells = <2>; /* min followed by max */
34 }; 39 };
35 cpu@1 { 40 cpu@1 {
36 device_type = "cpu"; 41 device_type = "cpu";
diff --git a/arch/arm/boot/dts/exynos5250-spring.dts b/arch/arm/boot/dts/exynos5250-spring.dts
index f02775487cd4..d075a68ac078 100644
--- a/arch/arm/boot/dts/exynos5250-spring.dts
+++ b/arch/arm/boot/dts/exynos5250-spring.dts
@@ -429,7 +429,6 @@
429&mmc_0 { 429&mmc_0 {
430 status = "okay"; 430 status = "okay";
431 num-slots = <1>; 431 num-slots = <1>;
432 supports-highspeed;
433 broken-cd; 432 broken-cd;
434 card-detect-delay = <200>; 433 card-detect-delay = <200>;
435 samsung,dw-mshc-ciu-div = <3>; 434 samsung,dw-mshc-ciu-div = <3>;
@@ -437,11 +436,8 @@
437 samsung,dw-mshc-ddr-timing = <1 2>; 436 samsung,dw-mshc-ddr-timing = <1 2>;
438 pinctrl-names = "default"; 437 pinctrl-names = "default";
439 pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_cd &sd0_bus4 &sd0_bus8>; 438 pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_cd &sd0_bus4 &sd0_bus8>;
440 439 bus-width = <8>;
441 slot@0 { 440 cap-mmc-highspeed;
442 reg = <0>;
443 bus-width = <8>;
444 };
445}; 441};
446 442
447/* 443/*
@@ -451,7 +447,6 @@
451&mmc_1 { 447&mmc_1 {
452 status = "okay"; 448 status = "okay";
453 num-slots = <1>; 449 num-slots = <1>;
454 supports-highspeed;
455 broken-cd; 450 broken-cd;
456 card-detect-delay = <200>; 451 card-detect-delay = <200>;
457 samsung,dw-mshc-ciu-div = <3>; 452 samsung,dw-mshc-ciu-div = <3>;
@@ -459,11 +454,8 @@
459 samsung,dw-mshc-ddr-timing = <1 2>; 454 samsung,dw-mshc-ddr-timing = <1 2>;
460 pinctrl-names = "default"; 455 pinctrl-names = "default";
461 pinctrl-0 = <&sd1_clk &sd1_cmd &sd1_cd &sd1_bus4>; 456 pinctrl-0 = <&sd1_clk &sd1_cmd &sd1_cd &sd1_bus4>;
462 457 bus-width = <4>;
463 slot@0 { 458 cap-sd-highspeed;
464 reg = <0>;
465 bus-width = <4>;
466 };
467}; 459};
468 460
469&pinctrl_0 { 461&pinctrl_0 {
@@ -490,7 +482,7 @@
490 482
491 power_key_irq: power-key-irq { 483 power_key_irq: power-key-irq {
492 samsung,pins = "gpx1-3"; 484 samsung,pins = "gpx1-3";
493 samsung,pin-function = <0>; 485 samsung,pin-function = <0xf>;
494 samsung,pin-pud = <0>; 486 samsung,pin-pud = <0>;
495 samsung,pin-drv = <0>; 487 samsung,pin-drv = <0>;
496 }; 488 };
@@ -518,7 +510,7 @@
518 510
519 lid_irq: lid-irq { 511 lid_irq: lid-irq {
520 samsung,pins = "gpx3-5"; 512 samsung,pins = "gpx3-5";
521 samsung,pin-function = <0>; 513 samsung,pin-function = <0xf>;
522 samsung,pin-pud = <0>; 514 samsung,pin-pud = <0>;
523 samsung,pin-drv = <0>; 515 samsung,pin-drv = <0>;
524 }; 516 };
diff --git a/arch/arm/boot/dts/omap4-cpu-thermal.dtsi b/arch/arm/boot/dts/omap4-cpu-thermal.dtsi
index cb9458feb2e3..ab7f87ae96f0 100644
--- a/arch/arm/boot/dts/omap4-cpu-thermal.dtsi
+++ b/arch/arm/boot/dts/omap4-cpu-thermal.dtsi
@@ -18,7 +18,7 @@ cpu_thermal: cpu_thermal {
18 /* sensor ID */ 18 /* sensor ID */
19 thermal-sensors = <&bandgap 0>; 19 thermal-sensors = <&bandgap 0>;
20 20
21 trips { 21 cpu_trips: trips {
22 cpu_alert0: cpu_alert { 22 cpu_alert0: cpu_alert {
23 temperature = <100000>; /* millicelsius */ 23 temperature = <100000>; /* millicelsius */
24 hysteresis = <2000>; /* millicelsius */ 24 hysteresis = <2000>; /* millicelsius */
@@ -31,7 +31,7 @@ cpu_thermal: cpu_thermal {
31 }; 31 };
32 }; 32 };
33 33
34 cooling-maps { 34 cpu_cooling_maps: cooling-maps {
35 map0 { 35 map0 {
36 trip = <&cpu_alert0>; 36 trip = <&cpu_alert0>;
37 cooling-device = 37 cooling-device =
diff --git a/arch/arm/mach-cns3xxx/pm.c b/arch/arm/mach-cns3xxx/pm.c
index fb38c726e987..f46b78dd6136 100644
--- a/arch/arm/mach-cns3xxx/pm.c
+++ b/arch/arm/mach-cns3xxx/pm.c
@@ -73,7 +73,6 @@ static void cns3xxx_pwr_soft_rst_force(unsigned int block)
73 73
74 __raw_writel(reg, PM_SOFT_RST_REG); 74 __raw_writel(reg, PM_SOFT_RST_REG);
75} 75}
76EXPORT_SYMBOL(cns3xxx_pwr_soft_rst_force);
77 76
78void cns3xxx_pwr_soft_rst(unsigned int block) 77void cns3xxx_pwr_soft_rst(unsigned int block)
79{ 78{
diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c
index f44c2e05c82e..8576a9f734bd 100644
--- a/arch/arm/mach-exynos/exynos.c
+++ b/arch/arm/mach-exynos/exynos.c
@@ -206,7 +206,7 @@ static void __init exynos_dt_machine_init(void)
206 if (!IS_ENABLED(CONFIG_SMP)) 206 if (!IS_ENABLED(CONFIG_SMP))
207 exynos_sysram_init(); 207 exynos_sysram_init();
208 208
209#ifdef CONFIG_ARM_EXYNOS_CPUIDLE 209#if defined(CONFIG_SMP) && defined(CONFIG_ARM_EXYNOS_CPUIDLE)
210 if (of_machine_is_compatible("samsung,exynos4210")) 210 if (of_machine_is_compatible("samsung,exynos4210"))
211 exynos_cpuidle.dev.platform_data = &cpuidle_coupled_exynos_data; 211 exynos_cpuidle.dev.platform_data = &cpuidle_coupled_exynos_data;
212#endif 212#endif
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c
index e6209dadc00d..5685250693fd 100644
--- a/arch/arm/mach-exynos/pm.c
+++ b/arch/arm/mach-exynos/pm.c
@@ -181,6 +181,7 @@ void exynos_enter_aftr(void)
181 cpu_pm_exit(); 181 cpu_pm_exit();
182} 182}
183 183
184#if defined(CONFIG_SMP) && defined(CONFIG_ARM_EXYNOS_CPUIDLE)
184static atomic_t cpu1_wakeup = ATOMIC_INIT(0); 185static atomic_t cpu1_wakeup = ATOMIC_INIT(0);
185 186
186static int exynos_cpu0_enter_aftr(void) 187static int exynos_cpu0_enter_aftr(void)
@@ -302,3 +303,4 @@ struct cpuidle_exynos_data cpuidle_coupled_exynos_data = {
302 .pre_enter_aftr = exynos_pre_enter_aftr, 303 .pre_enter_aftr = exynos_pre_enter_aftr,
303 .post_enter_aftr = exynos_post_enter_aftr, 304 .post_enter_aftr = exynos_post_enter_aftr,
304}; 305};
306#endif /* CONFIG_SMP && CONFIG_ARM_EXYNOS_CPUIDLE */
diff --git a/arch/arm/mach-mvebu/pmsu.c b/arch/arm/mach-mvebu/pmsu.c
index 8b9f5e202ccf..4f4e22206ae5 100644
--- a/arch/arm/mach-mvebu/pmsu.c
+++ b/arch/arm/mach-mvebu/pmsu.c
@@ -415,6 +415,9 @@ static __init int armada_38x_cpuidle_init(void)
415 void __iomem *mpsoc_base; 415 void __iomem *mpsoc_base;
416 u32 reg; 416 u32 reg;
417 417
418 pr_warn("CPU idle is currently broken on Armada 38x: disabling");
419 return 0;
420
418 np = of_find_compatible_node(NULL, NULL, 421 np = of_find_compatible_node(NULL, NULL,
419 "marvell,armada-380-coherency-fabric"); 422 "marvell,armada-380-coherency-fabric");
420 if (!np) 423 if (!np)
@@ -476,6 +479,16 @@ static int __init mvebu_v7_cpu_pm_init(void)
476 return 0; 479 return 0;
477 of_node_put(np); 480 of_node_put(np);
478 481
482 /*
483 * Currently the CPU idle support for Armada 38x is broken, as
484 * the CPU hotplug uses some of the CPU idle functions it is
485 * broken too, so let's disable it
486 */
487 if (of_machine_is_compatible("marvell,armada380")) {
488 cpu_hotplug_disable();
489 pr_warn("CPU hotplug support is currently broken on Armada 38x: disabling");
490 }
491
479 if (of_machine_is_compatible("marvell,armadaxp")) 492 if (of_machine_is_compatible("marvell,armadaxp"))
480 ret = armada_xp_cpuidle_init(); 493 ret = armada_xp_cpuidle_init();
481 else if (of_machine_is_compatible("marvell,armada370")) 494 else if (of_machine_is_compatible("marvell,armada370"))
@@ -489,7 +502,8 @@ static int __init mvebu_v7_cpu_pm_init(void)
489 return ret; 502 return ret;
490 503
491 mvebu_v7_pmsu_enable_l2_powerdown_onidle(); 504 mvebu_v7_pmsu_enable_l2_powerdown_onidle();
492 platform_device_register(&mvebu_v7_cpuidle_device); 505 if (mvebu_v7_cpuidle_device.name)
506 platform_device_register(&mvebu_v7_cpuidle_device);
493 cpu_pm_register_notifier(&mvebu_v7_cpu_pm_notifier); 507 cpu_pm_register_notifier(&mvebu_v7_cpu_pm_notifier);
494 508
495 return 0; 509 return 0;
diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c
index 34b4c0044961..dd94567c3628 100644
--- a/arch/arm/mach-omap1/pm.c
+++ b/arch/arm/mach-omap1/pm.c
@@ -71,13 +71,7 @@ static unsigned int mpui7xx_sleep_save[MPUI7XX_SLEEP_SAVE_SIZE];
71static unsigned int mpui1510_sleep_save[MPUI1510_SLEEP_SAVE_SIZE]; 71static unsigned int mpui1510_sleep_save[MPUI1510_SLEEP_SAVE_SIZE];
72static unsigned int mpui1610_sleep_save[MPUI1610_SLEEP_SAVE_SIZE]; 72static unsigned int mpui1610_sleep_save[MPUI1610_SLEEP_SAVE_SIZE];
73 73
74#ifndef CONFIG_OMAP_32K_TIMER 74static unsigned short enable_dyn_sleep;
75
76static unsigned short enable_dyn_sleep = 0;
77
78#else
79
80static unsigned short enable_dyn_sleep = 1;
81 75
82static ssize_t idle_show(struct kobject *kobj, struct kobj_attribute *attr, 76static ssize_t idle_show(struct kobject *kobj, struct kobj_attribute *attr,
83 char *buf) 77 char *buf)
@@ -90,8 +84,9 @@ static ssize_t idle_store(struct kobject *kobj, struct kobj_attribute *attr,
90{ 84{
91 unsigned short value; 85 unsigned short value;
92 if (sscanf(buf, "%hu", &value) != 1 || 86 if (sscanf(buf, "%hu", &value) != 1 ||
93 (value != 0 && value != 1)) { 87 (value != 0 && value != 1) ||
94 printk(KERN_ERR "idle_sleep_store: Invalid value\n"); 88 (value != 0 && !IS_ENABLED(CONFIG_OMAP_32K_TIMER))) {
89 pr_err("idle_sleep_store: Invalid value\n");
95 return -EINVAL; 90 return -EINVAL;
96 } 91 }
97 enable_dyn_sleep = value; 92 enable_dyn_sleep = value;
@@ -101,7 +96,6 @@ static ssize_t idle_store(struct kobject *kobj, struct kobj_attribute *attr,
101static struct kobj_attribute sleep_while_idle_attr = 96static struct kobj_attribute sleep_while_idle_attr =
102 __ATTR(sleep_while_idle, 0644, idle_show, idle_store); 97 __ATTR(sleep_while_idle, 0644, idle_show, idle_store);
103 98
104#endif
105 99
106static void (*omap_sram_suspend)(unsigned long r0, unsigned long r1) = NULL; 100static void (*omap_sram_suspend)(unsigned long r0, unsigned long r1) = NULL;
107 101
@@ -115,16 +109,11 @@ void omap1_pm_idle(void)
115{ 109{
116 extern __u32 arm_idlect1_mask; 110 extern __u32 arm_idlect1_mask;
117 __u32 use_idlect1 = arm_idlect1_mask; 111 __u32 use_idlect1 = arm_idlect1_mask;
118 int do_sleep = 0;
119 112
120 local_fiq_disable(); 113 local_fiq_disable();
121 114
122#if defined(CONFIG_OMAP_MPU_TIMER) && !defined(CONFIG_OMAP_DM_TIMER) 115#if defined(CONFIG_OMAP_MPU_TIMER) && !defined(CONFIG_OMAP_DM_TIMER)
123#warning Enable 32kHz OS timer in order to allow sleep states in idle
124 use_idlect1 = use_idlect1 & ~(1 << 9); 116 use_idlect1 = use_idlect1 & ~(1 << 9);
125#else
126 if (enable_dyn_sleep)
127 do_sleep = 1;
128#endif 117#endif
129 118
130#ifdef CONFIG_OMAP_DM_TIMER 119#ifdef CONFIG_OMAP_DM_TIMER
@@ -134,10 +123,12 @@ void omap1_pm_idle(void)
134 if (omap_dma_running()) 123 if (omap_dma_running())
135 use_idlect1 &= ~(1 << 6); 124 use_idlect1 &= ~(1 << 6);
136 125
137 /* We should be able to remove the do_sleep variable and multiple 126 /*
127 * We should be able to remove the do_sleep variable and multiple
138 * tests above as soon as drivers, timer and DMA code have been fixed. 128 * tests above as soon as drivers, timer and DMA code have been fixed.
139 * Even the sleep block count should become obsolete. */ 129 * Even the sleep block count should become obsolete.
140 if ((use_idlect1 != ~0) || !do_sleep) { 130 */
131 if ((use_idlect1 != ~0) || !enable_dyn_sleep) {
141 132
142 __u32 saved_idlect1 = omap_readl(ARM_IDLECT1); 133 __u32 saved_idlect1 = omap_readl(ARM_IDLECT1);
143 if (cpu_is_omap15xx()) 134 if (cpu_is_omap15xx())
@@ -635,15 +626,25 @@ static const struct platform_suspend_ops omap_pm_ops = {
635 626
636static int __init omap_pm_init(void) 627static int __init omap_pm_init(void)
637{ 628{
638 629 int error = 0;
639#ifdef CONFIG_OMAP_32K_TIMER
640 int error;
641#endif
642 630
643 if (!cpu_class_is_omap1()) 631 if (!cpu_class_is_omap1())
644 return -ENODEV; 632 return -ENODEV;
645 633
646 printk("Power Management for TI OMAP.\n"); 634 pr_info("Power Management for TI OMAP.\n");
635
636 if (!IS_ENABLED(CONFIG_OMAP_32K_TIMER))
637 pr_info("OMAP1 PM: sleep states in idle disabled due to no 32KiHz timer\n");
638
639 if (!IS_ENABLED(CONFIG_OMAP_DM_TIMER))
640 pr_info("OMAP1 PM: sleep states in idle disabled due to no DMTIMER support\n");
641
642 if (IS_ENABLED(CONFIG_OMAP_32K_TIMER) &&
643 IS_ENABLED(CONFIG_OMAP_DM_TIMER)) {
644 /* OMAP16xx only */
645 pr_info("OMAP1 PM: sleep states in idle enabled\n");
646 enable_dyn_sleep = 1;
647 }
647 648
648 /* 649 /*
649 * We copy the assembler sleep/wakeup routines to SRAM. 650 * We copy the assembler sleep/wakeup routines to SRAM.
@@ -693,17 +694,15 @@ static int __init omap_pm_init(void)
693 omap_pm_init_debugfs(); 694 omap_pm_init_debugfs();
694#endif 695#endif
695 696
696#ifdef CONFIG_OMAP_32K_TIMER
697 error = sysfs_create_file(power_kobj, &sleep_while_idle_attr.attr); 697 error = sysfs_create_file(power_kobj, &sleep_while_idle_attr.attr);
698 if (error) 698 if (error)
699 printk(KERN_ERR "sysfs_create_file failed: %d\n", error); 699 printk(KERN_ERR "sysfs_create_file failed: %d\n", error);
700#endif
701 700
702 if (cpu_is_omap16xx()) { 701 if (cpu_is_omap16xx()) {
703 /* configure LOW_PWR pin */ 702 /* configure LOW_PWR pin */
704 omap_cfg_reg(T20_1610_LOW_PWR); 703 omap_cfg_reg(T20_1610_LOW_PWR);
705 } 704 }
706 705
707 return 0; 706 return error;
708} 707}
709__initcall(omap_pm_init); 708__initcall(omap_pm_init);
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 2b8e47788062..1041b19485ab 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -69,6 +69,7 @@ config SOC_DRA7XX
69 select ARM_GIC 69 select ARM_GIC
70 select HAVE_ARM_ARCH_TIMER 70 select HAVE_ARM_ARCH_TIMER
71 select IRQ_CROSSBAR 71 select IRQ_CROSSBAR
72 select ARM_ERRATA_798181 if SMP
72 73
73config ARCH_OMAP2PLUS 74config ARCH_OMAP2PLUS
74 bool 75 bool
@@ -278,27 +279,6 @@ config OMAP3_SDRC_AC_TIMING
278 wish to say no. Selecting yes without understanding what is 279 wish to say no. Selecting yes without understanding what is
279 going on could result in system crashes; 280 going on could result in system crashes;
280 281
281config OMAP4_ERRATA_I688
282 bool "OMAP4 errata: Async Bridge Corruption"
283 depends on (ARCH_OMAP4 || SOC_OMAP5) && !ARCH_MULTIPLATFORM
284 select ARCH_HAS_BARRIERS
285 help
286 If a data is stalled inside asynchronous bridge because of back
287 pressure, it may be accepted multiple times, creating pointer
288 misalignment that will corrupt next transfers on that data path
289 until next reset of the system (No recovery procedure once the
290 issue is hit, the path remains consistently broken). Async bridge
291 can be found on path between MPU to EMIF and MPU to L3 interconnect.
292 This situation can happen only when the idle is initiated by a
293 Master Request Disconnection (which is trigged by software when
294 executing WFI on CPU).
295 The work-around for this errata needs all the initiators connected
296 through async bridge must ensure that data path is properly drained
297 before issuing WFI. This condition will be met if one Strongly ordered
298 access is performed to the target right before executing the WFI.
299 In MPU case, L3 T2ASYNC FIFO and DDR T2ASYNC FIFO needs to be drained.
300 IO barrier ensure that there is no synchronisation loss on initiators
301 operating on both interconnect port simultaneously.
302endmenu 282endmenu
303 283
304endif 284endif
diff --git a/arch/arm/mach-omap2/common.c b/arch/arm/mach-omap2/common.c
index 484cdadfb187..eae6a0e87c90 100644
--- a/arch/arm/mach-omap2/common.c
+++ b/arch/arm/mach-omap2/common.c
@@ -30,5 +30,4 @@ int __weak omap_secure_ram_reserve_memblock(void)
30void __init omap_reserve(void) 30void __init omap_reserve(void)
31{ 31{
32 omap_secure_ram_reserve_memblock(); 32 omap_secure_ram_reserve_memblock();
33 omap_barrier_reserve_memblock();
34} 33}
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h
index 46e24581d624..cf3cf22ecd42 100644
--- a/arch/arm/mach-omap2/common.h
+++ b/arch/arm/mach-omap2/common.h
@@ -200,9 +200,6 @@ void __init omap4_map_io(void);
200void __init omap5_map_io(void); 200void __init omap5_map_io(void);
201void __init ti81xx_map_io(void); 201void __init ti81xx_map_io(void);
202 202
203/* omap_barriers_init() is OMAP4 only */
204void omap_barriers_init(void);
205
206/** 203/**
207 * omap_test_timeout - busy-loop, testing a condition 204 * omap_test_timeout - busy-loop, testing a condition
208 * @cond: condition to test until it evaluates to true 205 * @cond: condition to test until it evaluates to true
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index c4871c55bd8b..1eeff6be260d 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -306,7 +306,6 @@ void __init am33xx_map_io(void)
306void __init omap4_map_io(void) 306void __init omap4_map_io(void)
307{ 307{
308 iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc)); 308 iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc));
309 omap_barriers_init();
310} 309}
311#endif 310#endif
312 311
@@ -314,7 +313,6 @@ void __init omap4_map_io(void)
314void __init omap5_map_io(void) 313void __init omap5_map_io(void)
315{ 314{
316 iotable_init(omap54xx_io_desc, ARRAY_SIZE(omap54xx_io_desc)); 315 iotable_init(omap54xx_io_desc, ARRAY_SIZE(omap54xx_io_desc));
317 omap_barriers_init();
318} 316}
319#endif 317#endif
320/* 318/*
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
index 78064b0d4db5..176eef6ef338 100644
--- a/arch/arm/mach-omap2/mux.c
+++ b/arch/arm/mach-omap2/mux.c
@@ -1053,7 +1053,7 @@ static void __init omap_mux_init_list(struct omap_mux_partition *partition,
1053 struct omap_mux *entry; 1053 struct omap_mux *entry;
1054 1054
1055#ifdef CONFIG_OMAP_MUX 1055#ifdef CONFIG_OMAP_MUX
1056 if (!superset->muxnames || !superset->muxnames[0]) { 1056 if (!superset->muxnames[0]) {
1057 superset++; 1057 superset++;
1058 continue; 1058 continue;
1059 } 1059 }
diff --git a/arch/arm/mach-omap2/omap-secure.h b/arch/arm/mach-omap2/omap-secure.h
index dec2b05d184b..af2851fbcdf0 100644
--- a/arch/arm/mach-omap2/omap-secure.h
+++ b/arch/arm/mach-omap2/omap-secure.h
@@ -70,13 +70,6 @@ extern u32 rx51_secure_dispatcher(u32 idx, u32 process, u32 flag, u32 nargs,
70extern u32 rx51_secure_update_aux_cr(u32 set_bits, u32 clear_bits); 70extern u32 rx51_secure_update_aux_cr(u32 set_bits, u32 clear_bits);
71extern u32 rx51_secure_rng_call(u32 ptr, u32 count, u32 flag); 71extern u32 rx51_secure_rng_call(u32 ptr, u32 count, u32 flag);
72 72
73#ifdef CONFIG_OMAP4_ERRATA_I688
74extern int omap_barrier_reserve_memblock(void);
75#else
76static inline void omap_barrier_reserve_memblock(void)
77{ }
78#endif
79
80#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER 73#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER
81void set_cntfreq(void); 74void set_cntfreq(void);
82#else 75#else
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c
index 7bb116a6f86f..16350eefa66c 100644
--- a/arch/arm/mach-omap2/omap4-common.c
+++ b/arch/arm/mach-omap2/omap4-common.c
@@ -51,75 +51,6 @@ static void __iomem *twd_base;
51 51
52#define IRQ_LOCALTIMER 29 52#define IRQ_LOCALTIMER 29
53 53
54#ifdef CONFIG_OMAP4_ERRATA_I688
55/* Used to implement memory barrier on DRAM path */
56#define OMAP4_DRAM_BARRIER_VA 0xfe600000
57
58void __iomem *dram_sync, *sram_sync;
59
60static phys_addr_t paddr;
61static u32 size;
62
63void omap_bus_sync(void)
64{
65 if (dram_sync && sram_sync) {
66 writel_relaxed(readl_relaxed(dram_sync), dram_sync);
67 writel_relaxed(readl_relaxed(sram_sync), sram_sync);
68 isb();
69 }
70}
71EXPORT_SYMBOL(omap_bus_sync);
72
73static int __init omap4_sram_init(void)
74{
75 struct device_node *np;
76 struct gen_pool *sram_pool;
77
78 np = of_find_compatible_node(NULL, NULL, "ti,omap4-mpu");
79 if (!np)
80 pr_warn("%s:Unable to allocate sram needed to handle errata I688\n",
81 __func__);
82 sram_pool = of_get_named_gen_pool(np, "sram", 0);
83 if (!sram_pool)
84 pr_warn("%s:Unable to get sram pool needed to handle errata I688\n",
85 __func__);
86 else
87 sram_sync = (void *)gen_pool_alloc(sram_pool, PAGE_SIZE);
88
89 return 0;
90}
91omap_arch_initcall(omap4_sram_init);
92
93/* Steal one page physical memory for barrier implementation */
94int __init omap_barrier_reserve_memblock(void)
95{
96
97 size = ALIGN(PAGE_SIZE, SZ_1M);
98 paddr = arm_memblock_steal(size, SZ_1M);
99
100 return 0;
101}
102
103void __init omap_barriers_init(void)
104{
105 struct map_desc dram_io_desc[1];
106
107 dram_io_desc[0].virtual = OMAP4_DRAM_BARRIER_VA;
108 dram_io_desc[0].pfn = __phys_to_pfn(paddr);
109 dram_io_desc[0].length = size;
110 dram_io_desc[0].type = MT_MEMORY_RW_SO;
111 iotable_init(dram_io_desc, ARRAY_SIZE(dram_io_desc));
112 dram_sync = (void __iomem *) dram_io_desc[0].virtual;
113
114 pr_info("OMAP4: Map 0x%08llx to 0x%08lx for dram barrier\n",
115 (long long) paddr, dram_io_desc[0].virtual);
116
117}
118#else
119void __init omap_barriers_init(void)
120{}
121#endif
122
123void gic_dist_disable(void) 54void gic_dist_disable(void)
124{ 55{
125 if (gic_dist_base_addr) 56 if (gic_dist_base_addr)
diff --git a/arch/arm/mach-omap2/sleep44xx.S b/arch/arm/mach-omap2/sleep44xx.S
index b84a0122d823..ad1bb9431e94 100644
--- a/arch/arm/mach-omap2/sleep44xx.S
+++ b/arch/arm/mach-omap2/sleep44xx.S
@@ -333,11 +333,9 @@ ENDPROC(omap4_cpu_resume)
333 333
334#endif /* defined(CONFIG_SMP) && defined(CONFIG_PM) */ 334#endif /* defined(CONFIG_SMP) && defined(CONFIG_PM) */
335 335
336#ifndef CONFIG_OMAP4_ERRATA_I688
337ENTRY(omap_bus_sync) 336ENTRY(omap_bus_sync)
338 ret lr 337 ret lr
339ENDPROC(omap_bus_sync) 338ENDPROC(omap_bus_sync)
340#endif
341 339
342ENTRY(omap_do_wfi) 340ENTRY(omap_do_wfi)
343 stmfd sp!, {lr} 341 stmfd sp!, {lr}
diff --git a/arch/arm/mach-s3c24xx/Kconfig b/arch/arm/mach-s3c24xx/Kconfig
index 79c49ff77f6e..23bec3a85b22 100644
--- a/arch/arm/mach-s3c24xx/Kconfig
+++ b/arch/arm/mach-s3c24xx/Kconfig
@@ -39,14 +39,14 @@ config CPU_S3C2412
39 bool "SAMSUNG S3C2412" 39 bool "SAMSUNG S3C2412"
40 select CPU_ARM926T 40 select CPU_ARM926T
41 select S3C2412_COMMON_CLK 41 select S3C2412_COMMON_CLK
42 select S3C2412_PM if PM 42 select S3C2412_PM if PM_SLEEP
43 help 43 help
44 Support for the S3C2412 and S3C2413 SoCs from the S3C24XX line 44 Support for the S3C2412 and S3C2413 SoCs from the S3C24XX line
45 45
46config CPU_S3C2416 46config CPU_S3C2416
47 bool "SAMSUNG S3C2416/S3C2450" 47 bool "SAMSUNG S3C2416/S3C2450"
48 select CPU_ARM926T 48 select CPU_ARM926T
49 select S3C2416_PM if PM 49 select S3C2416_PM if PM_SLEEP
50 select S3C2443_COMMON_CLK 50 select S3C2443_COMMON_CLK
51 help 51 help
52 Support for the S3C2416 SoC from the S3C24XX line 52 Support for the S3C2416 SoC from the S3C24XX line
@@ -55,7 +55,7 @@ config CPU_S3C2440
55 bool "SAMSUNG S3C2440" 55 bool "SAMSUNG S3C2440"
56 select CPU_ARM920T 56 select CPU_ARM920T
57 select S3C2410_COMMON_CLK 57 select S3C2410_COMMON_CLK
58 select S3C2410_PM if PM 58 select S3C2410_PM if PM_SLEEP
59 help 59 help
60 Support for S3C2440 Samsung Mobile CPU based systems. 60 Support for S3C2440 Samsung Mobile CPU based systems.
61 61
@@ -63,7 +63,7 @@ config CPU_S3C2442
63 bool "SAMSUNG S3C2442" 63 bool "SAMSUNG S3C2442"
64 select CPU_ARM920T 64 select CPU_ARM920T
65 select S3C2410_COMMON_CLK 65 select S3C2410_COMMON_CLK
66 select S3C2410_PM if PM 66 select S3C2410_PM if PM_SLEEP
67 help 67 help
68 Support for S3C2442 Samsung Mobile CPU based systems. 68 Support for S3C2442 Samsung Mobile CPU based systems.
69 69
@@ -228,11 +228,6 @@ config H1940BT
228 This is a simple driver that is able to control 228 This is a simple driver that is able to control
229 the state of built in bluetooth chip on h1940. 229 the state of built in bluetooth chip on h1940.
230 230
231config PM_H1940
232 bool
233 help
234 Internal node for H1940 and related PM
235
236config MACH_N30 231config MACH_N30
237 bool "Acer N30 family" 232 bool "Acer N30 family"
238 select S3C_DEV_NAND 233 select S3C_DEV_NAND
@@ -362,6 +357,7 @@ if CPU_S3C2416
362config S3C2416_PM 357config S3C2416_PM
363 bool 358 bool
364 select S3C2412_PM_SLEEP 359 select S3C2412_PM_SLEEP
360 select SAMSUNG_WAKEMASK
365 help 361 help
366 Internal config node to apply S3C2416 power management 362 Internal config node to apply S3C2416 power management
367 363
@@ -584,6 +580,11 @@ config MACH_SMDK2443
584 580
585endif # CPU_S3C2443 581endif # CPU_S3C2443
586 582
583config PM_H1940
584 bool
585 help
586 Internal node for H1940 and related PM
587
587endmenu # SAMSUNG S3C24XX SoCs Support 588endmenu # SAMSUNG S3C24XX SoCs Support
588 589
589endif # ARCH_S3C24XX 590endif # ARCH_S3C24XX
diff --git a/arch/arm/mach-s3c24xx/Makefile b/arch/arm/mach-s3c24xx/Makefile
index b40a22fe082a..05920c8a5764 100644
--- a/arch/arm/mach-s3c24xx/Makefile
+++ b/arch/arm/mach-s3c24xx/Makefile
@@ -32,7 +32,8 @@ obj-$(CONFIG_CPU_S3C2443) += s3c2443.o
32 32
33# PM 33# PM
34 34
35obj-$(CONFIG_PM) += pm.o irq-pm.o sleep.o 35obj-$(CONFIG_PM) += pm.o
36obj-$(CONFIG_PM_SLEEP) += irq-pm.o sleep.o
36 37
37# common code 38# common code
38 39
diff --git a/arch/arm/mach-s3c24xx/include/mach/pm-core.h b/arch/arm/mach-s3c24xx/include/mach/pm-core.h
index 2eef7e6f7675..69459dbbdcad 100644
--- a/arch/arm/mach-s3c24xx/include/mach/pm-core.h
+++ b/arch/arm/mach-s3c24xx/include/mach/pm-core.h
@@ -10,6 +10,11 @@
10 * it under the terms of the GNU General Public License version 2 as 10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation. 11 * published by the Free Software Foundation.
12 */ 12 */
13#include <linux/delay.h>
14#include <linux/io.h>
15
16#include "regs-clock.h"
17#include "regs-irq.h"
13 18
14static inline void s3c_pm_debug_init_uart(void) 19static inline void s3c_pm_debug_init_uart(void)
15{ 20{
@@ -42,8 +47,23 @@ static inline void s3c_pm_arch_stop_clocks(void)
42 __raw_writel(0x00, S3C2410_CLKCON); /* turn off clocks over sleep */ 47 __raw_writel(0x00, S3C2410_CLKCON); /* turn off clocks over sleep */
43} 48}
44 49
45static void s3c_pm_show_resume_irqs(int start, unsigned long which, 50/* s3c2410_pm_show_resume_irqs
46 unsigned long mask); 51 *
52 * print any IRQs asserted at resume time (ie, we woke from)
53*/
54static inline void s3c_pm_show_resume_irqs(int start, unsigned long which,
55 unsigned long mask)
56{
57 int i;
58
59 which &= ~mask;
60
61 for (i = 0; i <= 31; i++) {
62 if (which & (1L<<i)) {
63 S3C_PMDBG("IRQ %d asserted at resume\n", start+i);
64 }
65 }
66}
47 67
48static inline void s3c_pm_arch_show_resume_irqs(void) 68static inline void s3c_pm_arch_show_resume_irqs(void)
49{ 69{
diff --git a/arch/arm/mach-s3c24xx/pm-s3c2416.c b/arch/arm/mach-s3c24xx/pm-s3c2416.c
index 44923895f558..c0e328e37bd6 100644
--- a/arch/arm/mach-s3c24xx/pm-s3c2416.c
+++ b/arch/arm/mach-s3c24xx/pm-s3c2416.c
@@ -23,6 +23,7 @@
23 23
24#include "s3c2412-power.h" 24#include "s3c2412-power.h"
25 25
26#ifdef CONFIG_PM_SLEEP
26extern void s3c2412_sleep_enter(void); 27extern void s3c2412_sleep_enter(void);
27 28
28static int s3c2416_cpu_suspend(unsigned long arg) 29static int s3c2416_cpu_suspend(unsigned long arg)
@@ -70,7 +71,7 @@ static __init int s3c2416_pm_init(void)
70} 71}
71 72
72arch_initcall(s3c2416_pm_init); 73arch_initcall(s3c2416_pm_init);
73 74#endif
74 75
75static void s3c2416_pm_resume(void) 76static void s3c2416_pm_resume(void)
76{ 77{
diff --git a/arch/arm/mach-s3c24xx/pm.c b/arch/arm/mach-s3c24xx/pm.c
index b19256ec8d40..5d510bca0844 100644
--- a/arch/arm/mach-s3c24xx/pm.c
+++ b/arch/arm/mach-s3c24xx/pm.c
@@ -50,6 +50,7 @@
50 50
51#define PFX "s3c24xx-pm: " 51#define PFX "s3c24xx-pm: "
52 52
53#ifdef CONFIG_PM_SLEEP
53static struct sleep_save core_save[] = { 54static struct sleep_save core_save[] = {
54 /* we restore the timings here, with the proviso that the board 55 /* we restore the timings here, with the proviso that the board
55 * brings the system up in an slower, or equal frequency setting 56 * brings the system up in an slower, or equal frequency setting
@@ -67,6 +68,7 @@ static struct sleep_save core_save[] = {
67 SAVE_ITEM(S3C2410_BANKCON4), 68 SAVE_ITEM(S3C2410_BANKCON4),
68 SAVE_ITEM(S3C2410_BANKCON5), 69 SAVE_ITEM(S3C2410_BANKCON5),
69}; 70};
71#endif
70 72
71/* s3c_pm_check_resume_pin 73/* s3c_pm_check_resume_pin
72 * 74 *
@@ -121,7 +123,7 @@ void s3c_pm_configure_extint(void)
121 } 123 }
122} 124}
123 125
124 126#ifdef CONFIG_PM_SLEEP
125void s3c_pm_restore_core(void) 127void s3c_pm_restore_core(void)
126{ 128{
127 s3c_pm_do_restore_core(core_save, ARRAY_SIZE(core_save)); 129 s3c_pm_do_restore_core(core_save, ARRAY_SIZE(core_save));
@@ -131,4 +133,4 @@ void s3c_pm_save_core(void)
131{ 133{
132 s3c_pm_do_save(core_save, ARRAY_SIZE(core_save)); 134 s3c_pm_do_save(core_save, ARRAY_SIZE(core_save));
133} 135}
134 136#endif
diff --git a/arch/arm/mach-s3c24xx/s3c2410.c b/arch/arm/mach-s3c24xx/s3c2410.c
index 2a6985a4a0ff..5061d66ca10c 100644
--- a/arch/arm/mach-s3c24xx/s3c2410.c
+++ b/arch/arm/mach-s3c24xx/s3c2410.c
@@ -121,7 +121,7 @@ int __init s3c2410_init(void)
121{ 121{
122 printk("S3C2410: Initialising architecture\n"); 122 printk("S3C2410: Initialising architecture\n");
123 123
124#ifdef CONFIG_PM 124#ifdef CONFIG_PM_SLEEP
125 register_syscore_ops(&s3c2410_pm_syscore_ops); 125 register_syscore_ops(&s3c2410_pm_syscore_ops);
126 register_syscore_ops(&s3c24xx_irq_syscore_ops); 126 register_syscore_ops(&s3c24xx_irq_syscore_ops);
127#endif 127#endif
diff --git a/arch/arm/mach-s3c24xx/s3c2412.c b/arch/arm/mach-s3c24xx/s3c2412.c
index ecf2c77ab88b..64a13605cfc3 100644
--- a/arch/arm/mach-s3c24xx/s3c2412.c
+++ b/arch/arm/mach-s3c24xx/s3c2412.c
@@ -172,7 +172,7 @@ int __init s3c2412_init(void)
172{ 172{
173 printk("S3C2412: Initialising architecture\n"); 173 printk("S3C2412: Initialising architecture\n");
174 174
175#ifdef CONFIG_PM 175#ifdef CONFIG_PM_SLEEP
176 register_syscore_ops(&s3c2412_pm_syscore_ops); 176 register_syscore_ops(&s3c2412_pm_syscore_ops);
177 register_syscore_ops(&s3c24xx_irq_syscore_ops); 177 register_syscore_ops(&s3c24xx_irq_syscore_ops);
178#endif 178#endif
diff --git a/arch/arm/mach-s3c24xx/s3c2416.c b/arch/arm/mach-s3c24xx/s3c2416.c
index bfd4da86deb8..3f8ca2a3ef17 100644
--- a/arch/arm/mach-s3c24xx/s3c2416.c
+++ b/arch/arm/mach-s3c24xx/s3c2416.c
@@ -98,7 +98,7 @@ int __init s3c2416_init(void)
98 s3c_adc_setname("s3c2416-adc"); 98 s3c_adc_setname("s3c2416-adc");
99 s3c_rtc_setname("s3c2416-rtc"); 99 s3c_rtc_setname("s3c2416-rtc");
100 100
101#ifdef CONFIG_PM 101#ifdef CONFIG_PM_SLEEP
102 register_syscore_ops(&s3c2416_pm_syscore_ops); 102 register_syscore_ops(&s3c2416_pm_syscore_ops);
103 register_syscore_ops(&s3c24xx_irq_syscore_ops); 103 register_syscore_ops(&s3c24xx_irq_syscore_ops);
104 register_syscore_ops(&s3c2416_irq_syscore_ops); 104 register_syscore_ops(&s3c2416_irq_syscore_ops);
diff --git a/arch/arm/mach-s3c24xx/s3c2440.c b/arch/arm/mach-s3c24xx/s3c2440.c
index 03d379f1fc52..eb733555fab5 100644
--- a/arch/arm/mach-s3c24xx/s3c2440.c
+++ b/arch/arm/mach-s3c24xx/s3c2440.c
@@ -57,11 +57,11 @@ int __init s3c2440_init(void)
57 57
58 /* register suspend/resume handlers */ 58 /* register suspend/resume handlers */
59 59
60#ifdef CONFIG_PM 60#ifdef CONFIG_PM_SLEEP
61 register_syscore_ops(&s3c2410_pm_syscore_ops); 61 register_syscore_ops(&s3c2410_pm_syscore_ops);
62 register_syscore_ops(&s3c24xx_irq_syscore_ops); 62 register_syscore_ops(&s3c24xx_irq_syscore_ops);
63#endif
64 register_syscore_ops(&s3c244x_pm_syscore_ops); 63 register_syscore_ops(&s3c244x_pm_syscore_ops);
64#endif
65 65
66 /* register our system device for everything else */ 66 /* register our system device for everything else */
67 67
diff --git a/arch/arm/mach-s3c24xx/s3c2442.c b/arch/arm/mach-s3c24xx/s3c2442.c
index 7b043349f1c8..893998ede022 100644
--- a/arch/arm/mach-s3c24xx/s3c2442.c
+++ b/arch/arm/mach-s3c24xx/s3c2442.c
@@ -60,11 +60,11 @@ int __init s3c2442_init(void)
60{ 60{
61 printk("S3C2442: Initialising architecture\n"); 61 printk("S3C2442: Initialising architecture\n");
62 62
63#ifdef CONFIG_PM 63#ifdef CONFIG_PM_SLEEP
64 register_syscore_ops(&s3c2410_pm_syscore_ops); 64 register_syscore_ops(&s3c2410_pm_syscore_ops);
65 register_syscore_ops(&s3c24xx_irq_syscore_ops); 65 register_syscore_ops(&s3c24xx_irq_syscore_ops);
66#endif
67 register_syscore_ops(&s3c244x_pm_syscore_ops); 66 register_syscore_ops(&s3c244x_pm_syscore_ops);
67#endif
68 68
69 return device_register(&s3c2442_dev); 69 return device_register(&s3c2442_dev);
70} 70}
diff --git a/arch/arm/mach-s3c24xx/s3c244x.c b/arch/arm/mach-s3c24xx/s3c244x.c
index 177f97802745..b14119585dc7 100644
--- a/arch/arm/mach-s3c24xx/s3c244x.c
+++ b/arch/arm/mach-s3c24xx/s3c244x.c
@@ -108,7 +108,7 @@ static int __init s3c2442_core_init(void)
108core_initcall(s3c2442_core_init); 108core_initcall(s3c2442_core_init);
109 109
110 110
111#ifdef CONFIG_PM 111#ifdef CONFIG_PM_SLEEP
112static struct sleep_save s3c244x_sleep[] = { 112static struct sleep_save s3c244x_sleep[] = {
113 SAVE_ITEM(S3C2440_DSC0), 113 SAVE_ITEM(S3C2440_DSC0),
114 SAVE_ITEM(S3C2440_DSC1), 114 SAVE_ITEM(S3C2440_DSC1),
@@ -127,12 +127,9 @@ static void s3c244x_resume(void)
127{ 127{
128 s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep)); 128 s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
129} 129}
130#else
131#define s3c244x_suspend NULL
132#define s3c244x_resume NULL
133#endif
134 130
135struct syscore_ops s3c244x_pm_syscore_ops = { 131struct syscore_ops s3c244x_pm_syscore_ops = {
136 .suspend = s3c244x_suspend, 132 .suspend = s3c244x_suspend,
137 .resume = s3c244x_resume, 133 .resume = s3c244x_resume,
138}; 134};
135#endif
diff --git a/arch/arm/mach-s3c64xx/Kconfig b/arch/arm/mach-s3c64xx/Kconfig
index 26ca2427e53d..eff95e950d81 100644
--- a/arch/arm/mach-s3c64xx/Kconfig
+++ b/arch/arm/mach-s3c64xx/Kconfig
@@ -189,6 +189,7 @@ endchoice
189config SMDK6410_WM1190_EV1 189config SMDK6410_WM1190_EV1
190 bool "Support Wolfson Microelectronics 1190-EV1 PMIC card" 190 bool "Support Wolfson Microelectronics 1190-EV1 PMIC card"
191 depends on MACH_SMDK6410 191 depends on MACH_SMDK6410
192 depends on I2C=y
192 select MFD_WM8350_I2C 193 select MFD_WM8350_I2C
193 select REGULATOR 194 select REGULATOR
194 select REGULATOR_WM8350 195 select REGULATOR_WM8350
@@ -203,6 +204,7 @@ config SMDK6410_WM1190_EV1
203config SMDK6410_WM1192_EV1 204config SMDK6410_WM1192_EV1
204 bool "Support Wolfson Microelectronics 1192-EV1 PMIC card" 205 bool "Support Wolfson Microelectronics 1192-EV1 PMIC card"
205 depends on MACH_SMDK6410 206 depends on MACH_SMDK6410
207 depends on I2C=y
206 select MFD_WM831X 208 select MFD_WM831X
207 select MFD_WM831X_I2C 209 select MFD_WM831X_I2C
208 select REGULATOR 210 select REGULATOR
@@ -269,8 +271,8 @@ config MACH_SMARTQ7
269 271
270config MACH_WLF_CRAGG_6410 272config MACH_WLF_CRAGG_6410
271 bool "Wolfson Cragganmore 6410" 273 bool "Wolfson Cragganmore 6410"
274 depends on I2C=y
272 select CPU_S3C6410 275 select CPU_S3C6410
273 select I2C
274 select LEDS_GPIO_REGISTER 276 select LEDS_GPIO_REGISTER
275 select S3C64XX_DEV_SPI0 277 select S3C64XX_DEV_SPI0
276 select S3C64XX_SETUP_FB_24BPP 278 select S3C64XX_SETUP_FB_24BPP
diff --git a/arch/arm/mach-s3c64xx/Makefile b/arch/arm/mach-s3c64xx/Makefile
index 12f67b61ca5f..17f4b07ec763 100644
--- a/arch/arm/mach-s3c64xx/Makefile
+++ b/arch/arm/mach-s3c64xx/Makefile
@@ -16,7 +16,8 @@ obj-$(CONFIG_CPU_S3C6410) += s3c6410.o
16 16
17# PM 17# PM
18 18
19obj-$(CONFIG_PM) += pm.o irq-pm.o sleep.o 19obj-$(CONFIG_PM) += pm.o
20obj-$(CONFIG_PM_SLEEP) += irq-pm.o sleep.o
20obj-$(CONFIG_CPU_IDLE) += cpuidle.o 21obj-$(CONFIG_CPU_IDLE) += cpuidle.o
21 22
22# DMA support 23# DMA support
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c
index 661eb662d051..b7447a92276e 100644
--- a/arch/arm/mach-s3c64xx/mach-smdk6410.c
+++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c
@@ -209,7 +209,7 @@ static struct platform_device smdk6410_smsc911x = {
209}; 209};
210 210
211#ifdef CONFIG_REGULATOR 211#ifdef CONFIG_REGULATOR
212static struct regulator_consumer_supply smdk6410_b_pwr_5v_consumers[] __initdata = { 212static struct regulator_consumer_supply smdk6410_b_pwr_5v_consumers[] = {
213 REGULATOR_SUPPLY("PVDD", "0-001b"), 213 REGULATOR_SUPPLY("PVDD", "0-001b"),
214 REGULATOR_SUPPLY("AVDD", "0-001b"), 214 REGULATOR_SUPPLY("AVDD", "0-001b"),
215}; 215};
diff --git a/arch/arm/mach-s3c64xx/pm.c b/arch/arm/mach-s3c64xx/pm.c
index aaf7bea4032f..75b14e756383 100644
--- a/arch/arm/mach-s3c64xx/pm.c
+++ b/arch/arm/mach-s3c64xx/pm.c
@@ -194,6 +194,7 @@ void s3c_pm_debug_smdkled(u32 set, u32 clear)
194} 194}
195#endif 195#endif
196 196
197#ifdef CONFIG_PM_SLEEP
197static struct sleep_save core_save[] = { 198static struct sleep_save core_save[] = {
198 SAVE_ITEM(S3C64XX_MEM0DRVCON), 199 SAVE_ITEM(S3C64XX_MEM0DRVCON),
199 SAVE_ITEM(S3C64XX_MEM1DRVCON), 200 SAVE_ITEM(S3C64XX_MEM1DRVCON),
@@ -238,6 +239,7 @@ void s3c_pm_save_core(void)
238 s3c_pm_do_save(misc_save, ARRAY_SIZE(misc_save)); 239 s3c_pm_do_save(misc_save, ARRAY_SIZE(misc_save));
239 s3c_pm_do_save(core_save, ARRAY_SIZE(core_save)); 240 s3c_pm_do_save(core_save, ARRAY_SIZE(core_save));
240} 241}
242#endif
241 243
242/* since both s3c6400 and s3c6410 share the same sleep pm calls, we 244/* since both s3c6400 and s3c6410 share the same sleep pm calls, we
243 * put the per-cpu code in here until any new cpu comes along and changes 245 * put the per-cpu code in here until any new cpu comes along and changes
diff --git a/arch/arm/plat-samsung/include/plat/pm.h b/arch/arm/plat-samsung/include/plat/pm.h
index e17d871b934c..7f415ce74591 100644
--- a/arch/arm/plat-samsung/include/plat/pm.h
+++ b/arch/arm/plat-samsung/include/plat/pm.h
@@ -43,7 +43,11 @@ extern unsigned long s3c_irqwake_eintmask;
43 43
44/* IRQ masks for IRQs allowed to go to sleep (see irq.c) */ 44/* IRQ masks for IRQs allowed to go to sleep (see irq.c) */
45extern unsigned long s3c_irqwake_intallow; 45extern unsigned long s3c_irqwake_intallow;
46#ifdef CONFIG_PM_SLEEP
46extern unsigned long s3c_irqwake_eintallow; 47extern unsigned long s3c_irqwake_eintallow;
48#else
49#define s3c_irqwake_eintallow 0
50#endif
47 51
48/* per-cpu sleep functions */ 52/* per-cpu sleep functions */
49 53
@@ -58,16 +62,20 @@ extern unsigned long s3c_pm_flags;
58 62
59extern int s3c2410_cpu_suspend(unsigned long); 63extern int s3c2410_cpu_suspend(unsigned long);
60 64
61#ifdef CONFIG_SAMSUNG_PM 65#ifdef CONFIG_PM_SLEEP
62extern int s3c_irq_wake(struct irq_data *data, unsigned int state); 66extern int s3c_irq_wake(struct irq_data *data, unsigned int state);
63extern int s3c_irqext_wake(struct irq_data *data, unsigned int state);
64extern void s3c_cpu_resume(void); 67extern void s3c_cpu_resume(void);
65#else 68#else
66#define s3c_irq_wake NULL 69#define s3c_irq_wake NULL
67#define s3c_irqext_wake NULL
68#define s3c_cpu_resume NULL 70#define s3c_cpu_resume NULL
69#endif 71#endif
70 72
73#ifdef CONFIG_SAMSUNG_PM
74extern int s3c_irqext_wake(struct irq_data *data, unsigned int state);
75#else
76#define s3c_irqext_wake NULL
77#endif
78
71#ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK 79#ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK
72/** 80/**
73 * s3c_pm_debug_smdkled() - Debug PM suspend/resume via SMDK Board LEDs 81 * s3c_pm_debug_smdkled() - Debug PM suspend/resume via SMDK Board LEDs
diff --git a/arch/arm/plat-samsung/pm-debug.c b/arch/arm/plat-samsung/pm-debug.c
index 39609601f407..64e15da33b42 100644
--- a/arch/arm/plat-samsung/pm-debug.c
+++ b/arch/arm/plat-samsung/pm-debug.c
@@ -23,6 +23,7 @@
23#include <plat/pm-common.h> 23#include <plat/pm-common.h>
24 24
25#ifdef CONFIG_SAMSUNG_ATAGS 25#ifdef CONFIG_SAMSUNG_ATAGS
26#include <plat/pm.h>
26#include <mach/pm-core.h> 27#include <mach/pm-core.h>
27#else 28#else
28static inline void s3c_pm_debug_init_uart(void) {} 29static inline void s3c_pm_debug_init_uart(void) {}
diff --git a/arch/arm/plat-samsung/pm.c b/arch/arm/plat-samsung/pm.c
index f8c0f9797dcf..82777c649774 100644
--- a/arch/arm/plat-samsung/pm.c
+++ b/arch/arm/plat-samsung/pm.c
@@ -65,26 +65,6 @@ int s3c_irqext_wake(struct irq_data *data, unsigned int state)
65 return 0; 65 return 0;
66} 66}
67 67
68/* s3c2410_pm_show_resume_irqs
69 *
70 * print any IRQs asserted at resume time (ie, we woke from)
71*/
72static void __maybe_unused s3c_pm_show_resume_irqs(int start,
73 unsigned long which,
74 unsigned long mask)
75{
76 int i;
77
78 which &= ~mask;
79
80 for (i = 0; i <= 31; i++) {
81 if (which & (1L<<i)) {
82 S3C_PMDBG("IRQ %d asserted at resume\n", start+i);
83 }
84 }
85}
86
87
88void (*pm_cpu_prep)(void); 68void (*pm_cpu_prep)(void);
89int (*pm_cpu_sleep)(unsigned long); 69int (*pm_cpu_sleep)(unsigned long);
90 70