From mboxrd@z Thu Jan 1 00:00:00 1970 From: t-kristo@ti.com (Tero Kristo) Date: Fri, 20 Apr 2012 12:19:49 +0300 Subject: [PATCHv4 6/8] ARM: OMAP4: PM: support ret_logic/mem_off_counters In-Reply-To: <1334913591-26312-1-git-send-email-t-kristo@ti.com> References: <1334913591-26312-1-git-send-email-t-kristo@ti.com> Message-ID: <1334913591-26312-7-git-send-email-t-kristo@ti.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org From: Axel Haslam On OMAP4, there is no support to read previous logic state or previous memory state achieved when a power domain transitions to RET. Instead there are module level context registers. In order to support the powerdomain level logic/mem_off_counters on OMAP4, instead use the previous power state achieved (RET) and the *programmed* logic/mem RET state to derive if a powerdomain lost logic or did not. If the powerdomain is programmed to enter RET state and lose logic in RET state, knowing that the powerdomain entered RET is good enough to derive that the logic was lost as well, in such cases. Signed-off-by: Axel Haslam [rnayak at ti.com: Updated changelog, updated patch to support mem counters] Signed-off-by: Rajendra Nayak Signed-off-by: Tero Kristo --- arch/arm/mach-omap2/powerdomain.c | 16 ++++++++++------ 1 files changed, 10 insertions(+), 6 deletions(-) diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 96ad3dbe..068f06b 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c @@ -124,18 +124,22 @@ static int _pwrdm_register(struct powerdomain *pwrdm) static void _update_logic_membank_counters(struct powerdomain *pwrdm) { int i; - u8 prev_logic_pwrst, prev_mem_pwrst; + int logic_pwrst, mem_pwrst; + + logic_pwrst = pwrdm_read_prev_logic_pwrst(pwrdm); + if (logic_pwrst == -EINVAL) + logic_pwrst = pwrdm_read_logic_retst(pwrdm); - prev_logic_pwrst = pwrdm_read_prev_logic_pwrst(pwrdm); if ((pwrdm->pwrsts_logic_ret == PWRSTS_OFF_RET) && - (prev_logic_pwrst == PWRDM_POWER_OFF)) + (logic_pwrst == PWRDM_POWER_OFF)) pwrdm->ret_logic_off_counter++; for (i = 0; i < pwrdm->banks; i++) { - prev_mem_pwrst = pwrdm_read_prev_mem_pwrst(pwrdm, i); - + mem_pwrst = pwrdm_read_prev_mem_pwrst(pwrdm, i); + if (mem_pwrst == -EINVAL) + mem_pwrst = pwrdm_read_mem_retst(pwrdm, i); if ((pwrdm->pwrsts_mem_ret[i] == PWRSTS_OFF_RET) && - (prev_mem_pwrst == PWRDM_POWER_OFF)) + (mem_pwrst == PWRDM_POWER_OFF)) pwrdm->ret_mem_off_counter[i]++; } } -- 1.7.4.1