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