summaryrefslogtreecommitdiffstats
path: root/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle
diff options
context:
space:
mode:
Diffstat (limited to 'extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle')
-rw-r--r--extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0001-OMAP2-clockdomain-Add-an-api-to-read-idle-mode.patch77
-rw-r--r--extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0002-OMAP2-clockdomain-Add-SoC-support-for-clkdm_is_idle.patch86
-rw-r--r--extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0003-OMAP2-PM-Initialise-sleep_switch-to-a-non-valid-valu.patch35
-rw-r--r--extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0004-OMAP2-PM-idle-clkdms-only-if-already-in-idle.patch50
-rw-r--r--extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0005-OMAP2-hwmod-Follow-the-recomended-PRCM-sequence.patch46
-rw-r--r--extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0006-OMAP-Serial-Check-wk_st-only-if-present.patch33
6 files changed, 327 insertions, 0 deletions
diff --git a/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0001-OMAP2-clockdomain-Add-an-api-to-read-idle-mode.patch b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0001-OMAP2-clockdomain-Add-an-api-to-read-idle-mode.patch
new file mode 100644
index 00000000..d9b05173
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0001-OMAP2-clockdomain-Add-an-api-to-read-idle-mode.patch
@@ -0,0 +1,77 @@
1From 988f50cb51d18e81ed2f7673a09694d28c9d086a Mon Sep 17 00:00:00 2001
2From: Rajendra Nayak <rnayak@ti.com>
3Date: Tue, 5 Apr 2011 15:22:31 +0530
4Subject: [PATCH 1/6] OMAP2+: clockdomain: Add an api to read idle mode
5
6Add a clockdomain api to check if hardware supervised
7idle transitions are enabled on a clockdomain.
8
9Signed-off-by: Rajendra Nayak <rnayak@ti.com>
10---
11 arch/arm/mach-omap2/clockdomain.c | 21 +++++++++++++++++++++
12 arch/arm/mach-omap2/clockdomain.h | 3 +++
13 2 files changed, 24 insertions(+), 0 deletions(-)
14
15diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c
16index 6cb6c03..2ab3686 100644
17--- a/arch/arm/mach-omap2/clockdomain.c
18+++ b/arch/arm/mach-omap2/clockdomain.c
19@@ -795,6 +795,27 @@ void clkdm_deny_idle(struct clockdomain *clkdm)
20 arch_clkdm->clkdm_deny_idle(clkdm);
21 }
22
23+/**
24+ * clkdm_is_idle - Check if the clkdm hwsup/autoidle is enabled
25+ * @clkdm: struct clockdomain *
26+ *
27+ * Returns true if the clockdomain is in hardware-supervised
28+ * idle mode, or 0 otherwise.
29+ *
30+ */
31+int clkdm_is_idle(struct clockdomain *clkdm)
32+{
33+ if (!clkdm)
34+ return -EINVAL;
35+
36+ if (!arch_clkdm || !arch_clkdm->clkdm_is_idle)
37+ return -EINVAL;
38+
39+ pr_debug("clockdomain: reading idle state for %s\n", clkdm->name);
40+
41+ return arch_clkdm->clkdm_is_idle(clkdm);
42+}
43+
44
45 /* Clockdomain-to-clock framework interface code */
46
47diff --git a/arch/arm/mach-omap2/clockdomain.h b/arch/arm/mach-omap2/clockdomain.h
48index 5823584..085ed82 100644
49--- a/arch/arm/mach-omap2/clockdomain.h
50+++ b/arch/arm/mach-omap2/clockdomain.h
51@@ -138,6 +138,7 @@ struct clockdomain {
52 * @clkdm_wakeup: Force a clockdomain to wakeup
53 * @clkdm_allow_idle: Enable hw supervised idle transitions for clock domain
54 * @clkdm_deny_idle: Disable hw supervised idle transitions for clock domain
55+ * @clkdm_is_idle: Check if hw supervised idle transitions are enabled
56 * @clkdm_clk_enable: Put the clkdm in right state for a clock enable
57 * @clkdm_clk_disable: Put the clkdm in right state for a clock disable
58 */
59@@ -154,6 +155,7 @@ struct clkdm_ops {
60 int (*clkdm_wakeup)(struct clockdomain *clkdm);
61 void (*clkdm_allow_idle)(struct clockdomain *clkdm);
62 void (*clkdm_deny_idle)(struct clockdomain *clkdm);
63+ int (*clkdm_is_idle)(struct clockdomain *clkdm);
64 int (*clkdm_clk_enable)(struct clockdomain *clkdm);
65 int (*clkdm_clk_disable)(struct clockdomain *clkdm);
66 };
67@@ -177,6 +179,7 @@ int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm);
68
69 void clkdm_allow_idle(struct clockdomain *clkdm);
70 void clkdm_deny_idle(struct clockdomain *clkdm);
71+int clkdm_is_idle(struct clockdomain *clkdm);
72
73 int clkdm_wakeup(struct clockdomain *clkdm);
74 int clkdm_sleep(struct clockdomain *clkdm);
75--
761.6.6.1
77
diff --git a/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0002-OMAP2-clockdomain-Add-SoC-support-for-clkdm_is_idle.patch b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0002-OMAP2-clockdomain-Add-SoC-support-for-clkdm_is_idle.patch
new file mode 100644
index 00000000..c7c1ea0b
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0002-OMAP2-clockdomain-Add-SoC-support-for-clkdm_is_idle.patch
@@ -0,0 +1,86 @@
1From e3ba8d41bfafd782f3ee7f8930d9bf393986c662 Mon Sep 17 00:00:00 2001
2From: Rajendra Nayak <rnayak@ti.com>
3Date: Tue, 5 Apr 2011 15:22:36 +0530
4Subject: [PATCH 2/6] OMAP2+: clockdomain: Add SoC support for clkdm_is_idle
5
6Add the SoC specific implemenation for clkdm_is_idle
7for OMAP2/3 and OMAP4.
8
9Signed-off-by: Rajendra Nayak <rnayak@ti.com>
10---
11 arch/arm/mach-omap2/clockdomain2xxx_3xxx.c | 12 ++++++++++++
12 arch/arm/mach-omap2/clockdomain44xx.c | 7 +++++++
13 2 files changed, 19 insertions(+), 0 deletions(-)
14
15diff --git a/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c b/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
16index 48d0db7..db49baa 100644
17--- a/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
18+++ b/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
19@@ -13,6 +13,7 @@
20 */
21
22 #include <linux/types.h>
23+#include <linux/errno.h>
24 #include <plat/prcm.h>
25 #include "prm.h"
26 #include "prm2xxx_3xxx.h"
27@@ -146,6 +147,15 @@ static void omap2_clkdm_deny_idle(struct clockdomain *clkdm)
28 _clkdm_del_autodeps(clkdm);
29 }
30
31+static int omap2_clkdm_is_idle(struct clockdomain *clkdm)
32+{
33+ if (!clkdm->clktrctrl_mask)
34+ return -1;
35+
36+ return omap2_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs,
37+ clkdm->clktrctrl_mask);
38+}
39+
40 static void _enable_hwsup(struct clockdomain *clkdm)
41 {
42 if (cpu_is_omap24xx())
43@@ -252,6 +262,7 @@ struct clkdm_ops omap2_clkdm_operations = {
44 .clkdm_wakeup = omap2_clkdm_wakeup,
45 .clkdm_allow_idle = omap2_clkdm_allow_idle,
46 .clkdm_deny_idle = omap2_clkdm_deny_idle,
47+ .clkdm_is_idle = omap2_clkdm_is_idle,
48 .clkdm_clk_enable = omap2_clkdm_clk_enable,
49 .clkdm_clk_disable = omap2_clkdm_clk_disable,
50 };
51@@ -269,6 +280,7 @@ struct clkdm_ops omap3_clkdm_operations = {
52 .clkdm_wakeup = omap3_clkdm_wakeup,
53 .clkdm_allow_idle = omap3_clkdm_allow_idle,
54 .clkdm_deny_idle = omap3_clkdm_deny_idle,
55+ .clkdm_is_idle = omap2_clkdm_is_idle,
56 .clkdm_clk_enable = omap2_clkdm_clk_enable,
57 .clkdm_clk_disable = omap2_clkdm_clk_disable,
58 };
59diff --git a/arch/arm/mach-omap2/clockdomain44xx.c b/arch/arm/mach-omap2/clockdomain44xx.c
60index a1a4ecd..4b10727 100644
61--- a/arch/arm/mach-omap2/clockdomain44xx.c
62+++ b/arch/arm/mach-omap2/clockdomain44xx.c
63@@ -93,6 +93,12 @@ static void omap4_clkdm_deny_idle(struct clockdomain *clkdm)
64 clkdm->cm_inst, clkdm->clkdm_offs);
65 }
66
67+static int omap4_clkdm_is_idle(struct clockdomain *clkdm)
68+{
69+ return omap4_cminst_is_clkdm_in_hwsup(clkdm->prcm_partition,
70+ clkdm->cm_inst, clkdm->clkdm_offs);
71+}
72+
73 static int omap4_clkdm_clk_enable(struct clockdomain *clkdm)
74 {
75 bool hwsup = false;
76@@ -132,6 +138,7 @@ struct clkdm_ops omap4_clkdm_operations = {
77 .clkdm_wakeup = omap4_clkdm_wakeup,
78 .clkdm_allow_idle = omap4_clkdm_allow_idle,
79 .clkdm_deny_idle = omap4_clkdm_deny_idle,
80+ .clkdm_is_idle = omap4_clkdm_is_idle,
81 .clkdm_clk_enable = omap4_clkdm_clk_enable,
82 .clkdm_clk_disable = omap4_clkdm_clk_disable,
83 };
84--
851.6.6.1
86
diff --git a/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0003-OMAP2-PM-Initialise-sleep_switch-to-a-non-valid-valu.patch b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0003-OMAP2-PM-Initialise-sleep_switch-to-a-non-valid-valu.patch
new file mode 100644
index 00000000..cbe5ca20
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0003-OMAP2-PM-Initialise-sleep_switch-to-a-non-valid-valu.patch
@@ -0,0 +1,35 @@
1From 7cdc87071a4bb390ad5d7ddea210bd2b4d662114 Mon Sep 17 00:00:00 2001
2From: Rajendra Nayak <rnayak@ti.com>
3Date: Tue, 5 Apr 2011 15:22:41 +0530
4Subject: [PATCH 3/6] OMAP2+: PM: Initialise sleep_switch to a non-valid value
5
6sleep_switch which is initialised to 0 in omap_set_pwrdm_state
7happens to be a valid sleep_switch type (FORCEWAKEUP_SWITCH)
8which are defined as
9#define FORCEWAKEUP_SWITCH 0
10#define LOWPOWERSTATE_SWITCH 1
11
12This causes the function to wrongly program some clock domains
13even when the Powerdomain is in ON state.
14
15Signed-off-by: Rajendra Nayak <rnayak@ti.com>
16---
17 arch/arm/mach-omap2/pm.c | 2 +-
18 1 files changed, 1 insertions(+), 1 deletions(-)
19
20diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
21index 49486f5..d48813f 100644
22--- a/arch/arm/mach-omap2/pm.c
23+++ b/arch/arm/mach-omap2/pm.c
24@@ -106,7 +106,7 @@ static void omap2_init_processor_devices(void)
25 int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
26 {
27 u32 cur_state;
28- int sleep_switch = 0;
29+ int sleep_switch = -1;
30 int ret = 0;
31
32 if (pwrdm == NULL || IS_ERR(pwrdm))
33--
341.6.6.1
35
diff --git a/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0004-OMAP2-PM-idle-clkdms-only-if-already-in-idle.patch b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0004-OMAP2-PM-idle-clkdms-only-if-already-in-idle.patch
new file mode 100644
index 00000000..16eedf9a
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0004-OMAP2-PM-idle-clkdms-only-if-already-in-idle.patch
@@ -0,0 +1,50 @@
1From cec133850aa42c03d912c764aaa441677e782eca Mon Sep 17 00:00:00 2001
2From: Rajendra Nayak <rnayak@ti.com>
3Date: Tue, 5 Apr 2011 15:22:48 +0530
4Subject: [PATCH 4/6] OMAP2+: PM: idle clkdms only if already in idle
5
6The omap_set_pwrdm_state function forces clockdomains
7to idle, without checking the existing idle state
8programmed, instead based solely on the HW capability
9of the clockdomain to support idle.
10This is wrong and the clockdomains should be idled
11post a state_switch *only* if idle transitions on the
12clockdomain were already enabled.
13
14Signed-off-by: Rajendra Nayak <rnayak@ti.com>
15---
16 arch/arm/mach-omap2/pm.c | 4 +++-
17 1 files changed, 3 insertions(+), 1 deletions(-)
18
19diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
20index d48813f..840b0e1 100644
21--- a/arch/arm/mach-omap2/pm.c
22+++ b/arch/arm/mach-omap2/pm.c
23@@ -108,6 +108,7 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
24 u32 cur_state;
25 int sleep_switch = -1;
26 int ret = 0;
27+ int hwsup = 0;
28
29 if (pwrdm == NULL || IS_ERR(pwrdm))
30 return -EINVAL;
31@@ -127,6 +128,7 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
32 (pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) {
33 sleep_switch = LOWPOWERSTATE_SWITCH;
34 } else {
35+ hwsup = clkdm_is_idle(pwrdm->pwrdm_clkdms[0]);
36 clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);
37 pwrdm_wait_transition(pwrdm);
38 sleep_switch = FORCEWAKEUP_SWITCH;
39@@ -142,7 +144,7 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
40
41 switch (sleep_switch) {
42 case FORCEWAKEUP_SWITCH:
43- if (pwrdm->pwrdm_clkdms[0]->flags & CLKDM_CAN_ENABLE_AUTO)
44+ if (hwsup)
45 clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
46 else
47 clkdm_sleep(pwrdm->pwrdm_clkdms[0]);
48--
491.6.6.1
50
diff --git a/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0005-OMAP2-hwmod-Follow-the-recomended-PRCM-sequence.patch b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0005-OMAP2-hwmod-Follow-the-recomended-PRCM-sequence.patch
new file mode 100644
index 00000000..b0af9e7f
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0005-OMAP2-hwmod-Follow-the-recomended-PRCM-sequence.patch
@@ -0,0 +1,46 @@
1From 8fb6b7c488b31fbff5b81bdeea5dbb236342458b Mon Sep 17 00:00:00 2001
2From: Rajendra Nayak <rnayak@ti.com>
3Date: Tue, 29 Mar 2011 22:37:43 +0530
4Subject: [PATCH 5/6] OMAP2+: hwmod: Follow the recomended PRCM sequence
5
6Follow the recomended PRCM sequence.
7This still does not take care of Optional clocks.
8
9Signed-off-by: Rajendra Nayak <rnayak@ti.com>
10---
11 arch/arm/mach-omap2/omap_hwmod.c | 9 ++++++++-
12 1 files changed, 8 insertions(+), 1 deletions(-)
13
14diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
15index e034294..fc0db0c 100644
16--- a/arch/arm/mach-omap2/omap_hwmod.c
17+++ b/arch/arm/mach-omap2/omap_hwmod.c
18@@ -1223,6 +1223,7 @@ static int _reset(struct omap_hwmod *oh)
19 static int _enable(struct omap_hwmod *oh)
20 {
21 int r;
22+ int hwsup = 0;
23
24 if (oh->_state != _HWMOD_STATE_INITIALIZED &&
25 oh->_state != _HWMOD_STATE_IDLE &&
26@@ -1250,10 +1251,16 @@ static int _enable(struct omap_hwmod *oh)
27 omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED);
28
29 _add_initiator_dep(oh, mpu_oh);
30+ if (oh->_clk && oh->_clk->clkdm) {
31+ hwsup = clkdm_is_idle(oh->_clk->clkdm);
32+ clkdm_wakeup(oh->_clk->clkdm);
33+ }
34 _enable_clocks(oh);
35-
36 r = _wait_target_ready(oh);
37 if (!r) {
38+ if (oh->_clk && oh->_clk->clkdm && hwsup)
39+ clkdm_allow_idle(oh->_clk->clkdm);
40+
41 oh->_state = _HWMOD_STATE_ENABLED;
42
43 /* Access the sysconfig only if the target is ready */
44--
451.6.6.1
46
diff --git a/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0006-OMAP-Serial-Check-wk_st-only-if-present.patch b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0006-OMAP-Serial-Check-wk_st-only-if-present.patch
new file mode 100644
index 00000000..a8fc0c07
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap-2.6.39/pm/linux-omap-2.6.39-ti-pm-wip-cpuidle/0006-OMAP-Serial-Check-wk_st-only-if-present.patch
@@ -0,0 +1,33 @@
1From 7b74888d198c260992349fab214cad3adf853ef9 Mon Sep 17 00:00:00 2001
2From: Rajendra Nayak <rnayak@ti.com>
3Date: Tue, 2 Mar 2010 17:25:30 +0530
4Subject: [PATCH 6/6] OMAP: Serial: Check wk_st only if present
5
6Uart on the resume path tries to read wk_st registers, even
7on architectures were its not present/populated.
8This patch fixes the issue.
9
10Signed-off-by: Rajendra Nayak <rnayak@ti.com>
11---
12 arch/arm/mach-omap2/serial.c | 5 +++--
13 1 files changed, 3 insertions(+), 2 deletions(-)
14
15diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c
16index 1ac361b..a0046ce 100644
17--- a/arch/arm/mach-omap2/serial.c
18+++ b/arch/arm/mach-omap2/serial.c
19@@ -418,8 +418,9 @@ void omap_uart_resume_idle(int num)
20 }
21
22 /* Check for normal UART wakeup */
23- if (__raw_readl(uart->wk_st) & uart->wk_mask)
24- omap_uart_block_sleep(uart);
25+ if (uart->wk_st && uart->wk_mask)
26+ if (__raw_readl(uart->wk_st) & uart->wk_mask)
27+ omap_uart_block_sleep(uart);
28 return;
29 }
30 }
31--
321.6.6.1
33