* [PATCH 0/6] Split powerdomain framework into plat specific/independent
@ 2010-11-16 15:38 Rajendra Nayak
2010-11-16 15:38 ` [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap Rajendra Nayak
2010-11-29 0:33 ` [PATCH 0/6] Split powerdomain framework into plat specific/independent Paul Walmsley
0 siblings, 2 replies; 20+ messages in thread
From: Rajendra Nayak @ 2010-11-16 15:38 UTC (permalink / raw)
To: linux-omap; +Cc: paul, b-cousson, khilman, Rajendra Nayak
OMAP4 powerdomains have some inherent differences as compared
to OMAP2/3 powerdomains, starting with register offsets being different
to clubbing of multiple controls into one register and in some cases
splitting of control into multiple registers.
There are also new features like lowpowerstatechange bits and features
like HW SAR which are no longer present in the older form.
Supporting all these in the existing powerdomain framework would mean adding
a lot of cpu_is_* checks which makes code unmaintainable going fwd.
Hence this series is an attempt to split the existing powerdomain framework
into platform independent part (which does error checking, usecounting et al)
which can be reused across OMAP's and hook up platform specific functions to
do low level programming which varies across OMAP's.
The series is boot tested on OMAP 2430sdp/3430sdp and 4430sdp platforms.
Additionally on 3430sdp, Retention and OFF support in system suspend is
also validated with a minimal kernel config (omap3_pm_defconfig from
Kevins tree hosted here
git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-omap-pm.git)
The RFC series of these patches was posted here
http://marc.info/?l=linux-omap&m=128524530605407&w=2
This series fixes all issues discussed on the RFC series and also has
a few other changes
-1- The below patch is dropped as the dependent patches for this are
still under discussion.
[RFC 6/8] OMAP: PRM: split the prm accessor api funcs for omap2/3 and omap4
http://marc.info/?l=linux-omap&m=128524531505429&w=2
-2- The below patch is also dropped as there are more than one context
registers to be handled in some powerdomains and hence needs to be
handled differently
[RFC 7/8] omap4: powerdomain: add context_offset field
http://marc.info/?l=linux-omap&m=128524531805435&w=2
Rajendra Nayak (5):
OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap
OMAP: powerdomain: Infrastructure to put arch specific code
OMAP: powerdomain: Arch specific funcs for state control
OMAP: powerdomain: Arch specific funcs for logic control
OMAP: powerdomain: Arch specific funcs for mem control
Santosh Shilimkar (1):
OMAP4: powerdomain: Add pwrdm_clear_all_prev_pwrst
arch/arm/mach-omap2/Makefile | 9 +-
arch/arm/mach-omap2/io.c | 5 +-
arch/arm/mach-omap2/powerdomains.c | 114 ++++++
arch/arm/mach-omap2/powerdomains.h | 13 +
arch/arm/mach-omap2/powerdomains2xxx.c | 215 ++++++++++++
arch/arm/mach-omap2/powerdomains44xx.c | 175 ++++++++++
arch/arm/plat-omap/Makefile | 6 +-
arch/arm/plat-omap/include/plat/powerdomain.h | 22 ++-
arch/arm/{mach-omap2 => plat-omap}/powerdomain.c | 400 ++++++----------------
9 files changed, 660 insertions(+), 299 deletions(-)
create mode 100644 arch/arm/mach-omap2/powerdomains.c
create mode 100644 arch/arm/mach-omap2/powerdomains2xxx.c
create mode 100644 arch/arm/mach-omap2/powerdomains44xx.c
rename arch/arm/{mach-omap2 => plat-omap}/powerdomain.c (70%)
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap
2010-11-16 15:38 [PATCH 0/6] Split powerdomain framework into plat specific/independent Rajendra Nayak
@ 2010-11-16 15:38 ` Rajendra Nayak
2010-11-16 15:38 ` [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code Rajendra Nayak
2010-11-29 0:05 ` [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap Paul Walmsley
2010-11-29 0:33 ` [PATCH 0/6] Split powerdomain framework into plat specific/independent Paul Walmsley
1 sibling, 2 replies; 20+ messages in thread
From: Rajendra Nayak @ 2010-11-16 15:38 UTC (permalink / raw)
To: linux-omap; +Cc: paul, b-cousson, khilman, Rajendra Nayak
This is in preparation of splitting the powerdomain framework into
platform-independent part (for all omaps) and platform-specific
parts.
The platform-independent code would reside in plat-omap/powerdomain.c
and the platform-specific code will resides in
mach-omap2/powerdomain-xxxx.c files.
Some of the hacks to include header files are done to make sure the
patch compiles and works fine. These hacks will be removed in the
subsequent patches.
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
---
arch/arm/mach-omap2/Makefile | 2 +-
arch/arm/plat-omap/Makefile | 6 +++---
arch/arm/{mach-omap2 => plat-omap}/powerdomain.c | 14 +++++++-------
3 files changed, 11 insertions(+), 11 deletions(-)
rename arch/arm/{mach-omap2 => plat-omap}/powerdomain.c (99%)
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 60e51bc..4bfadc5 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -9,7 +9,7 @@ obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o pm.o \
omap-2-3-common = irq.o sdrc.o prm2xxx_3xxx.o
hwmod-common = omap_hwmod.o \
omap_hwmod_common_data.o
-prcm-common = prcm.o powerdomain.o
+prcm-common = prcm.o
clock-common = clock.o clock_common_data.o \
clockdomain.o clkt_dpll.o \
clkt_clksel.o
diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile
index a4a1285..424a9ae 100644
--- a/arch/arm/plat-omap/Makefile
+++ b/arch/arm/plat-omap/Makefile
@@ -13,9 +13,9 @@ obj- :=
obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o
# omap_device support (OMAP2+ only at the moment)
-obj-$(CONFIG_ARCH_OMAP2) += omap_device.o
-obj-$(CONFIG_ARCH_OMAP3) += omap_device.o
-obj-$(CONFIG_ARCH_OMAP4) += omap_device.o
+obj-$(CONFIG_ARCH_OMAP2) += omap_device.o powerdomain.o
+obj-$(CONFIG_ARCH_OMAP3) += omap_device.o powerdomain.o
+obj-$(CONFIG_ARCH_OMAP4) += omap_device.o powerdomain.o
obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o
obj-$(CONFIG_OMAP_IOMMU) += iommu.o iovmm.o
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/plat-omap/powerdomain.c
similarity index 99%
rename from arch/arm/mach-omap2/powerdomain.c
rename to arch/arm/plat-omap/powerdomain.c
index 6527ec3..9204799 100644
--- a/arch/arm/mach-omap2/powerdomain.c
+++ b/arch/arm/plat-omap/powerdomain.c
@@ -26,19 +26,19 @@
#include <asm/atomic.h>
-#include "cm.h"
-#include "cm-regbits-34xx.h"
-#include "cm-regbits-44xx.h"
-#include "prm.h"
-#include "prm-regbits-34xx.h"
-#include "prm-regbits-44xx.h"
+#include "../mach-omap2/cm.h"
+#include "../mach-omap2/cm-regbits-34xx.h"
+#include "../mach-omap2/cm-regbits-44xx.h"
+#include "../mach-omap2/prm.h"
+#include "../mach-omap2/prm-regbits-34xx.h"
+#include "../mach-omap2/prm-regbits-44xx.h"
#include <plat/cpu.h>
#include <plat/powerdomain.h>
#include <plat/clockdomain.h>
#include <plat/prcm.h>
-#include "pm.h"
+#include "../mach-omap2/pm.h"
enum {
PWRDM_STATE_NOW = 0,
--
1.7.0.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code
2010-11-16 15:38 ` [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap Rajendra Nayak
@ 2010-11-16 15:38 ` Rajendra Nayak
2010-11-16 15:38 ` [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control Rajendra Nayak
` (2 more replies)
2010-11-29 0:05 ` [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap Paul Walmsley
1 sibling, 3 replies; 20+ messages in thread
From: Rajendra Nayak @ 2010-11-16 15:38 UTC (permalink / raw)
To: linux-omap; +Cc: paul, b-cousson, khilman, Rajendra Nayak
Put infrastructure in place, so arch specific func pointers
can be hooked up to the platform-independent part of the
framework.
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
---
arch/arm/mach-omap2/io.c | 2 +-
arch/arm/plat-omap/include/plat/powerdomain.h | 22 +++++++++++++++++++++-
arch/arm/plat-omap/powerdomain.c | 10 ++++++++--
3 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index 40562dd..76c531a 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -316,7 +316,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
{
u8 skip_setup_idle = 0;
- pwrdm_init(powerdomains_omap);
+ pwrdm_init(powerdomains_omap, NULL);
clkdm_init(clockdomains_omap, clkdm_autodeps);
if (cpu_is_omap242x())
omap2420_hwmod_init();
diff --git a/arch/arm/plat-omap/include/plat/powerdomain.h b/arch/arm/plat-omap/include/plat/powerdomain.h
index 9ca420d..35e1ef7 100644
--- a/arch/arm/plat-omap/include/plat/powerdomain.h
+++ b/arch/arm/plat-omap/include/plat/powerdomain.h
@@ -117,8 +117,28 @@ struct powerdomain {
#endif
};
+struct pwrdm_functions {
+ int (*pwrdm_set_next_pwrst)(struct powerdomain *pwrdm, u8 pwrst);
+ int (*pwrdm_read_next_pwrst)(struct powerdomain *pwrdm);
+ int (*pwrdm_read_pwrst)(struct powerdomain *pwrdm);
+ int (*pwrdm_read_prev_pwrst)(struct powerdomain *pwrdm);
+ int (*pwrdm_set_logic_retst)(struct powerdomain *pwrdm, u8 pwrst);
+ int (*pwrdm_set_mem_onst)(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
+ int (*pwrdm_set_mem_retst)(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
+ int (*pwrdm_read_logic_pwrst)(struct powerdomain *pwrdm);
+ int (*pwrdm_read_prev_logic_pwrst)(struct powerdomain *pwrdm);
+ int (*pwrdm_read_logic_retst)(struct powerdomain *pwrdm);
+ int (*pwrdm_read_mem_pwrst)(struct powerdomain *pwrdm, u8 bank);
+ int (*pwrdm_read_prev_mem_pwrst)(struct powerdomain *pwrdm, u8 bank);
+ int (*pwrdm_read_mem_retst)(struct powerdomain *pwrdm, u8 bank);
+ int (*pwrdm_clear_all_prev_pwrst)(struct powerdomain *pwrdm);
+ int (*pwrdm_enable_hdwr_sar)(struct powerdomain *pwrdm);
+ int (*pwrdm_disable_hdwr_sar)(struct powerdomain *pwrdm);
+ int (*pwrdm_set_lowpwrstchange)(struct powerdomain *pwrdm);
+ int (*pwrdm_wait_transition)(struct powerdomain *pwrdm);
+};
-void pwrdm_init(struct powerdomain **pwrdm_list);
+void pwrdm_init(struct powerdomain **pwrdm_list, struct pwrdm_functions *custom_funcs);
struct powerdomain *pwrdm_lookup(const char *name);
diff --git a/arch/arm/plat-omap/powerdomain.c b/arch/arm/plat-omap/powerdomain.c
index 9204799..9e2d712 100644
--- a/arch/arm/plat-omap/powerdomain.c
+++ b/arch/arm/plat-omap/powerdomain.c
@@ -80,6 +80,8 @@ static u16 pwrstst_reg_offs;
/* pwrdm_list contains all registered struct powerdomains */
static LIST_HEAD(pwrdm_list);
+static struct pwrdm_functions *arch_pwrdm;
+
/* Private functions */
static struct powerdomain *_pwrdm_lookup(const char *name)
@@ -218,7 +220,7 @@ static int _pwrdm_post_transition_cb(struct powerdomain *pwrdm, void *unused)
* registered. No return value. XXX pwrdm_list is not really a
* "list"; it is an array. Rename appropriately.
*/
-void pwrdm_init(struct powerdomain **pwrdm_list)
+void pwrdm_init(struct powerdomain **pwrdm_list, struct pwrdm_functions *custom_funcs)
{
struct powerdomain **p = NULL;
@@ -234,6 +236,11 @@ void pwrdm_init(struct powerdomain **pwrdm_list)
return;
}
+ if (!custom_funcs)
+ WARN(1, "No custom pwrdm functions registered\n");
+ else
+ arch_pwrdm = custom_funcs;
+
if (pwrdm_list) {
for (p = pwrdm_list; *p; p++)
_pwrdm_register(*p);
@@ -1074,4 +1081,3 @@ int pwrdm_post_transition(void)
pwrdm_for_each(_pwrdm_post_transition_cb, NULL);
return 0;
}
-
--
1.7.0.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control
2010-11-16 15:38 ` [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code Rajendra Nayak
@ 2010-11-16 15:38 ` Rajendra Nayak
2010-11-16 15:38 ` [PATCH 4/6] OMAP: powerdomain: Arch specific funcs for logic control Rajendra Nayak
2010-11-29 0:14 ` [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control Paul Walmsley
2010-11-16 16:11 ` [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code Thomas Petazzoni
2010-11-29 0:07 ` Paul Walmsley
2 siblings, 2 replies; 20+ messages in thread
From: Rajendra Nayak @ 2010-11-16 15:38 UTC (permalink / raw)
To: linux-omap; +Cc: paul, b-cousson, khilman, Rajendra Nayak
Define the following architecture specific funtions for omap2/3/4
.pwrdm_set_next_pwrst
.pwrdm_read_next_pwrst
.pwrdm_read_pwrst
.pwrdm_read_prev_pwrst
Convert the platform-independent framework to call these functions.
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
---
arch/arm/mach-omap2/Makefile | 5 +++
arch/arm/mach-omap2/io.c | 5 ++-
arch/arm/mach-omap2/powerdomains.h | 8 +++++
arch/arm/mach-omap2/powerdomains2xxx.c | 53 ++++++++++++++++++++++++++++++++
arch/arm/mach-omap2/powerdomains44xx.c | 53 ++++++++++++++++++++++++++++++++
arch/arm/plat-omap/powerdomain.c | 33 ++++++++++++++------
6 files changed, 146 insertions(+), 11 deletions(-)
create mode 100644 arch/arm/mach-omap2/powerdomains2xxx.c
create mode 100644 arch/arm/mach-omap2/powerdomains44xx.c
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 4bfadc5..5f843fc 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -94,6 +94,11 @@ obj-$(CONFIG_ARCH_OMAP2430) += omap_hwmod_2430_data.o
obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_3xxx_data.o
obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o
+#powerdomain framework
+obj-$(CONFIG_ARCH_OMAP2) += powerdomains2xxx.o
+obj-$(CONFIG_ARCH_OMAP3) += powerdomains2xxx.o
+obj-$(CONFIG_ARCH_OMAP4) += powerdomains44xx.o
+
# EMU peripherals
obj-$(CONFIG_OMAP3_EMU) += emu.o
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index 76c531a..c68e989 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -316,7 +316,10 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
{
u8 skip_setup_idle = 0;
- pwrdm_init(powerdomains_omap, NULL);
+ if (cpu_is_omap24xx() || cpu_is_omap34xx())
+ pwrdm_init(powerdomains_omap, &omap2_pwrdm_functions);
+ else if (cpu_is_omap44xx())
+ pwrdm_init(powerdomains_omap, &omap4_pwrdm_functions);
clkdm_init(clockdomains_omap, clkdm_autodeps);
if (cpu_is_omap242x())
omap2420_hwmod_init();
diff --git a/arch/arm/mach-omap2/powerdomains.h b/arch/arm/mach-omap2/powerdomains.h
index 105cbca..b25b989 100644
--- a/arch/arm/mach-omap2/powerdomains.h
+++ b/arch/arm/mach-omap2/powerdomains.h
@@ -88,8 +88,16 @@ static struct powerdomain wkup_omap2_pwrdm = {
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
};
+extern struct pwrdm_functions omap2_pwrdm_functions;
+#else
+static struct pwrdm_functions omap2_pwrdm_functions;
#endif
+#ifdef CONFIG_ARCH_OMAP4
+extern struct pwrdm_functions omap4_pwrdm_functions;
+#else
+static struct pwrdm_functions omap4_pwrdm_functions;
+#endif
/* As powerdomains are added or removed above, this list must also be changed */
static struct powerdomain *powerdomains_omap[] __initdata = {
diff --git a/arch/arm/mach-omap2/powerdomains2xxx.c b/arch/arm/mach-omap2/powerdomains2xxx.c
new file mode 100644
index 0000000..dfeb8af
--- /dev/null
+++ b/arch/arm/mach-omap2/powerdomains2xxx.c
@@ -0,0 +1,53 @@
+/*
+ * OMAP2 and OMAP3 powerdomain control
+ *
+ * Copyright (C) 2009-2010 Texas Instruments, Inc.
+ * Copyright (C) 2007-2009 Nokia Corporation
+ *
+ * Derived from mach-omap2/powerdomain.c written by Paul Walmsley
+ * Rajendra Nayak <rnayak@ti.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/io.h>
+#include <linux/errno.h>
+#include <linux/delay.h>
+#include <plat/powerdomain.h>
+#include <plat/prcm.h>
+#include "powerdomains.h"
+
+static int omap2_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
+{
+ prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
+ (pwrst << OMAP_POWERSTATE_SHIFT),
+ pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
+ return 0;
+}
+
+static int omap2_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
+{
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs,
+ OMAP2_PM_PWSTCTRL, OMAP_POWERSTATE_MASK);
+}
+
+static int omap2_pwrdm_read_pwrst(struct powerdomain *pwrdm)
+{
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs,
+ OMAP2_PM_PWSTST, OMAP_POWERSTATEST_MASK);
+}
+
+static int omap2_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
+{
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST,
+ OMAP3430_LASTPOWERSTATEENTERED_MASK);
+}
+
+struct pwrdm_functions omap2_pwrdm_functions = {
+ .pwrdm_set_next_pwrst = omap2_pwrdm_set_next_pwrst,
+ .pwrdm_read_next_pwrst = omap2_pwrdm_read_next_pwrst,
+ .pwrdm_read_pwrst = omap2_pwrdm_read_pwrst,
+ .pwrdm_read_prev_pwrst = omap2_pwrdm_read_prev_pwrst,
+};
diff --git a/arch/arm/mach-omap2/powerdomains44xx.c b/arch/arm/mach-omap2/powerdomains44xx.c
new file mode 100644
index 0000000..b3aaf9b
--- /dev/null
+++ b/arch/arm/mach-omap2/powerdomains44xx.c
@@ -0,0 +1,53 @@
+/*
+ * OMAP4 powerdomain control
+ *
+ * Copyright (C) 2009-2010 Texas Instruments, Inc.
+ * Copyright (C) 2007-2009 Nokia Corporation
+ *
+ * Derived from mach-omap2/powerdomain.c written by Paul Walmsley
+ * Rajendra Nayak <rnayak@ti.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/io.h>
+#include <linux/errno.h>
+#include <linux/delay.h>
+#include <plat/powerdomain.h>
+#include <plat/prcm.h>
+#include "powerdomains.h"
+
+static int omap4_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
+{
+ prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
+ (pwrst << OMAP_POWERSTATE_SHIFT),
+ pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
+ return 0;
+}
+
+static int omap4_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
+{
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs,
+ OMAP4_PM_PWSTCTRL, OMAP_POWERSTATE_MASK);
+}
+
+static int omap4_pwrdm_read_pwrst(struct powerdomain *pwrdm)
+{
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs,
+ OMAP4_PM_PWSTST, OMAP_POWERSTATEST_MASK);
+}
+
+static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
+{
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTST,
+ OMAP4430_LASTPOWERSTATEENTERED_MASK);
+}
+
+struct pwrdm_functions omap4_pwrdm_functions = {
+ .pwrdm_set_next_pwrst = omap4_pwrdm_set_next_pwrst,
+ .pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst,
+ .pwrdm_read_pwrst = omap4_pwrdm_read_pwrst,
+ .pwrdm_read_prev_pwrst = omap4_pwrdm_read_prev_pwrst,
+};
diff --git a/arch/arm/plat-omap/powerdomain.c b/arch/arm/plat-omap/powerdomain.c
index 9e2d712..73d6dad 100644
--- a/arch/arm/plat-omap/powerdomain.c
+++ b/arch/arm/plat-omap/powerdomain.c
@@ -438,6 +438,8 @@ int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm)
*/
int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
{
+ int ret = -EINVAL;
+
if (!pwrdm)
return -EINVAL;
@@ -447,11 +449,10 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
pr_debug("powerdomain: setting next powerstate for %s to %0x\n",
pwrdm->name, pwrst);
- prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
- (pwrst << OMAP_POWERSTATE_SHIFT),
- pwrdm->prcm_offs, pwrstctrl_reg_offs);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst)
+ ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst);
- return 0;
+ return ret;
}
/**
@@ -464,11 +465,15 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
*/
int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
{
+ int ret = -EINVAL;
+
if (!pwrdm)
return -EINVAL;
- return prm_read_mod_bits_shift(pwrdm->prcm_offs,
- pwrstctrl_reg_offs, OMAP_POWERSTATE_MASK);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_next_pwrst)
+ ret = arch_pwrdm->pwrdm_read_next_pwrst(pwrdm);
+
+ return ret;
}
/**
@@ -481,11 +486,15 @@ int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
*/
int pwrdm_read_pwrst(struct powerdomain *pwrdm)
{
+ int ret = -EINVAL;
+
if (!pwrdm)
return -EINVAL;
- return prm_read_mod_bits_shift(pwrdm->prcm_offs,
- pwrstst_reg_offs, OMAP_POWERSTATEST_MASK);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_pwrst)
+ ret = arch_pwrdm->pwrdm_read_pwrst(pwrdm);
+
+ return ret;
}
/**
@@ -498,11 +507,15 @@ int pwrdm_read_pwrst(struct powerdomain *pwrdm)
*/
int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
{
+ int ret = -EINVAL;
+
if (!pwrdm)
return -EINVAL;
- return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST,
- OMAP3430_LASTPOWERSTATEENTERED_MASK);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_pwrst)
+ ret = arch_pwrdm->pwrdm_read_prev_pwrst(pwrdm);
+
+ return ret;
}
/**
--
1.7.0.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 4/6] OMAP: powerdomain: Arch specific funcs for logic control
2010-11-16 15:38 ` [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control Rajendra Nayak
@ 2010-11-16 15:38 ` Rajendra Nayak
2010-11-16 15:38 ` [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control Rajendra Nayak
2010-11-29 0:17 ` [PATCH 4/6] OMAP: powerdomain: Arch specific funcs for logic control Paul Walmsley
2010-11-29 0:14 ` [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control Paul Walmsley
1 sibling, 2 replies; 20+ messages in thread
From: Rajendra Nayak @ 2010-11-16 15:38 UTC (permalink / raw)
To: linux-omap; +Cc: paul, b-cousson, khilman, Rajendra Nayak
Define the following architecture specific funtions for omap2/3/4
.pwrdm_set_logic_retst
.pwrdm_read_logic_pwrst
.pwrdm_read_prev_logic_pwrst
.pwrdm_read_logic_retst
Convert the platform-independent framework to call these functions.
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
---
arch/arm/mach-omap2/powerdomains2xxx.c | 34 +++++++++++++++++++++
arch/arm/mach-omap2/powerdomains44xx.c | 26 ++++++++++++++++
arch/arm/plat-omap/powerdomain.c | 51 ++++++++++++++------------------
3 files changed, 82 insertions(+), 29 deletions(-)
diff --git a/arch/arm/mach-omap2/powerdomains2xxx.c b/arch/arm/mach-omap2/powerdomains2xxx.c
index dfeb8af..779529d 100644
--- a/arch/arm/mach-omap2/powerdomains2xxx.c
+++ b/arch/arm/mach-omap2/powerdomains2xxx.c
@@ -45,9 +45,43 @@ static int omap2_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
OMAP3430_LASTPOWERSTATEENTERED_MASK);
}
+static int omap2_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
+{
+ u32 v;
+
+ v = pwrst << __ffs(OMAP3430_LOGICL1CACHERETSTATE_MASK);
+ prm_rmw_mod_reg_bits(OMAP3430_LOGICL1CACHERETSTATE_MASK, v,
+ pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
+
+ return 0;
+}
+
+static int omap2_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
+{
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP2_PM_PWSTST,
+ OMAP3430_LOGICSTATEST_MASK);
+}
+
+
+static int omap2_pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm)
+{
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST,
+ OMAP3430_LASTLOGICSTATEENTERED_MASK);
+}
+
+static int omap2_pwrdm_read_logic_retst(struct powerdomain *pwrdm)
+{
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL,
+ OMAP3430_LOGICSTATEST_MASK);
+}
+
struct pwrdm_functions omap2_pwrdm_functions = {
.pwrdm_set_next_pwrst = omap2_pwrdm_set_next_pwrst,
.pwrdm_read_next_pwrst = omap2_pwrdm_read_next_pwrst,
.pwrdm_read_pwrst = omap2_pwrdm_read_pwrst,
.pwrdm_read_prev_pwrst = omap2_pwrdm_read_prev_pwrst,
+ .pwrdm_set_logic_retst = omap2_pwrdm_set_logic_retst,
+ .pwrdm_read_logic_pwrst = omap2_pwrdm_read_logic_pwrst,
+ .pwrdm_read_prev_logic_pwrst = omap2_pwrdm_read_prev_logic_pwrst,
+ .pwrdm_read_logic_retst = omap2_pwrdm_read_logic_retst,
};
diff --git a/arch/arm/mach-omap2/powerdomains44xx.c b/arch/arm/mach-omap2/powerdomains44xx.c
index b3aaf9b..016a425 100644
--- a/arch/arm/mach-omap2/powerdomains44xx.c
+++ b/arch/arm/mach-omap2/powerdomains44xx.c
@@ -45,9 +45,35 @@ static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
OMAP4430_LASTPOWERSTATEENTERED_MASK);
}
+static int omap4_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
+{
+ u32 v;
+
+ v = pwrst << __ffs(OMAP4430_LOGICRETSTATE_MASK);
+ prm_rmw_mod_reg_bits(OMAP4430_LOGICRETSTATE_MASK, v,
+ pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
+
+ return 0;
+}
+
+static int omap4_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
+{
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTST,
+ OMAP4430_LOGICSTATEST_MASK);
+}
+
+static int omap4_pwrdm_read_logic_retst(struct powerdomain *pwrdm)
+{
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL,
+ OMAP4430_LOGICRETSTATE_MASK);
+}
+
struct pwrdm_functions omap4_pwrdm_functions = {
.pwrdm_set_next_pwrst = omap4_pwrdm_set_next_pwrst,
.pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst,
.pwrdm_read_pwrst = omap4_pwrdm_read_pwrst,
.pwrdm_read_prev_pwrst = omap4_pwrdm_read_prev_pwrst,
+ .pwrdm_set_logic_retst = omap4_pwrdm_set_logic_retst,
+ .pwrdm_read_logic_pwrst = omap4_pwrdm_read_logic_pwrst,
+ .pwrdm_read_logic_retst = omap4_pwrdm_read_logic_retst,
};
diff --git a/arch/arm/plat-omap/powerdomain.c b/arch/arm/plat-omap/powerdomain.c
index 73d6dad..9177fbb 100644
--- a/arch/arm/plat-omap/powerdomain.c
+++ b/arch/arm/plat-omap/powerdomain.c
@@ -531,7 +531,7 @@ int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
*/
int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
{
- u32 v;
+ int ret = -EINVAL;
if (!pwrdm)
return -EINVAL;
@@ -542,17 +542,10 @@ int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
pr_debug("powerdomain: setting next logic powerstate for %s to %0x\n",
pwrdm->name, pwrst);
- /*
- * The register bit names below may not correspond to the
- * actual names of the bits in each powerdomain's register,
- * but the type of value returned is the same for each
- * powerdomain.
- */
- v = pwrst << __ffs(OMAP3430_LOGICL1CACHERETSTATE_MASK);
- prm_rmw_mod_reg_bits(OMAP3430_LOGICL1CACHERETSTATE_MASK, v,
- pwrdm->prcm_offs, pwrstctrl_reg_offs);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_set_logic_retst)
+ ret = arch_pwrdm->pwrdm_set_logic_retst(pwrdm, pwrst);
- return 0;
+ return ret;
}
/**
@@ -695,11 +688,15 @@ int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
*/
int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
{
+ int ret = -EINVAL;
+
if (!pwrdm)
return -EINVAL;
- return prm_read_mod_bits_shift(pwrdm->prcm_offs, pwrstst_reg_offs,
- OMAP3430_LOGICSTATEST_MASK);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_logic_pwrst)
+ ret = arch_pwrdm->pwrdm_read_logic_pwrst(pwrdm);
+
+ return ret;
}
/**
@@ -712,17 +709,15 @@ int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
*/
int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm)
{
+ int ret = -EINVAL;
+
if (!pwrdm)
return -EINVAL;
- /*
- * The register bit names below may not correspond to the
- * actual names of the bits in each powerdomain's register,
- * but the type of value returned is the same for each
- * powerdomain.
- */
- return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST,
- OMAP3430_LASTLOGICSTATEENTERED_MASK);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_logic_pwrst)
+ ret = arch_pwrdm->pwrdm_read_prev_logic_pwrst(pwrdm);
+
+ return ret;
}
/**
@@ -735,17 +730,15 @@ int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm)
*/
int pwrdm_read_logic_retst(struct powerdomain *pwrdm)
{
+ int ret = -EINVAL;
+
if (!pwrdm)
return -EINVAL;
- /*
- * The register bit names below may not correspond to the
- * actual names of the bits in each powerdomain's register,
- * but the type of value returned is the same for each
- * powerdomain.
- */
- return prm_read_mod_bits_shift(pwrdm->prcm_offs, pwrstctrl_reg_offs,
- OMAP3430_LOGICSTATEST_MASK);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_logic_retst)
+ ret = arch_pwrdm->pwrdm_read_logic_retst(pwrdm);
+
+ return ret;
}
/**
--
1.7.0.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control
2010-11-16 15:38 ` [PATCH 4/6] OMAP: powerdomain: Arch specific funcs for logic control Rajendra Nayak
@ 2010-11-16 15:38 ` Rajendra Nayak
2010-11-16 15:38 ` [PATCH 6/6] OMAP4: powerdomain: Add pwrdm_clear_all_prev_pwrst Rajendra Nayak
` (2 more replies)
2010-11-29 0:17 ` [PATCH 4/6] OMAP: powerdomain: Arch specific funcs for logic control Paul Walmsley
1 sibling, 3 replies; 20+ messages in thread
From: Rajendra Nayak @ 2010-11-16 15:38 UTC (permalink / raw)
To: linux-omap; +Cc: paul, b-cousson, khilman, Rajendra Nayak
Define the following architecture specific funtions for omap2/3/4
.pwrdm_set_mem_onst
.pwrdm_set_mem_retst
.pwrdm_read_mem_pwrst
.pwrdm_read_prev_mem_pwrst
.pwrdm_read_mem_retst
.pwrdm_clear_all_prev_pwrst
.pwrdm_enable_hdwr_sar
.pwrdm_disable_hdwr_sar
.pwrdm_wait_transition
Convert the platform-independent framework to call these functions.
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
---
arch/arm/mach-omap2/Makefile | 2 +-
arch/arm/mach-omap2/powerdomains.c | 114 ++++++++++++
arch/arm/mach-omap2/powerdomains.h | 5 +
arch/arm/mach-omap2/powerdomains2xxx.c | 129 ++++++++++++++
arch/arm/mach-omap2/powerdomains44xx.c | 87 +++++++++
arch/arm/plat-omap/powerdomain.c | 306 ++++++--------------------------
6 files changed, 391 insertions(+), 252 deletions(-)
create mode 100644 arch/arm/mach-omap2/powerdomains.c
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 5f843fc..87a73b7 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -4,7 +4,7 @@
# Common support
obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o pm.o \
- common.o
+ common.o powerdomains.o
omap-2-3-common = irq.o sdrc.o prm2xxx_3xxx.o
hwmod-common = omap_hwmod.o \
diff --git a/arch/arm/mach-omap2/powerdomains.c b/arch/arm/mach-omap2/powerdomains.c
new file mode 100644
index 0000000..876bebe
--- /dev/null
+++ b/arch/arm/mach-omap2/powerdomains.c
@@ -0,0 +1,114 @@
+/*
+ * linux/arch/arm/mach-omap2/powerdomains.c
+ * Contains common powerdomain framework functions
+ *
+ * Copyright (C) 2010 Texas Instruments, Inc.
+ * Copyright (C) 2010 Nokia Corporation
+ *
+ * Derived from mach-omap2/powerdomain.c written by Paul Walmsley
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include "pm.h"
+#include "cm.h"
+#include "cm-regbits-34xx.h"
+#include "cm-regbits-44xx.h"
+#include "prm-regbits-34xx.h"
+#include "prm-regbits-44xx.h"
+
+/*
+ * OMAP3 and OMAP4 specific register bit initialisations
+ * Notice that the names here are not according to each power
+ * domain but the bit mapping used applies to all of them
+ */
+/* OMAP3 and OMAP4 Memory Onstate Masks (common across all power domains) */
+#define OMAP_MEM0_ONSTATE_MASK OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK
+#define OMAP_MEM1_ONSTATE_MASK OMAP3430_L1FLATMEMONSTATE_MASK
+#define OMAP_MEM2_ONSTATE_MASK OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK
+#define OMAP_MEM3_ONSTATE_MASK OMAP3430_L2FLATMEMONSTATE_MASK
+#define OMAP_MEM4_ONSTATE_MASK OMAP4430_OCP_NRET_BANK_ONSTATE_MASK
+
+/* OMAP3 and OMAP4 Memory Retstate Masks (common across all power domains) */
+#define OMAP_MEM0_RETSTATE_MASK OMAP3430_SHAREDL1CACHEFLATRETSTATE_MASK
+#define OMAP_MEM1_RETSTATE_MASK OMAP3430_L1FLATMEMRETSTATE_MASK
+#define OMAP_MEM2_RETSTATE_MASK OMAP3430_SHAREDL2CACHEFLATRETSTATE_MASK
+#define OMAP_MEM3_RETSTATE_MASK OMAP3430_L2FLATMEMRETSTATE_MASK
+#define OMAP_MEM4_RETSTATE_MASK OMAP4430_OCP_NRET_BANK_RETSTATE_MASK
+
+/* OMAP3 and OMAP4 Memory Status bits */
+#define OMAP_MEM0_STATEST_MASK OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK
+#define OMAP_MEM1_STATEST_MASK OMAP3430_L1FLATMEMSTATEST_MASK
+#define OMAP_MEM2_STATEST_MASK OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK
+#define OMAP_MEM3_STATEST_MASK OMAP3430_L2FLATMEMSTATEST_MASK
+#define OMAP_MEM4_STATEST_MASK OMAP4430_OCP_NRET_BANK_STATEST_MASK
+
+int _get_mem_bank_onstate_mask(u8 bank);
+int _get_mem_bank_retst_mask(u8 bank);
+int _get_mem_bank_stst_mask(u8 bank);
+
+/* Common Internal functions used across OMAP rev's*/
+int _get_mem_bank_onstate_mask(u8 bank)
+{
+ switch (bank) {
+ case 0:
+ return OMAP_MEM0_ONSTATE_MASK;
+ case 1:
+ return OMAP_MEM1_ONSTATE_MASK;
+ case 2:
+ return OMAP_MEM2_ONSTATE_MASK;
+ case 3:
+ return OMAP_MEM3_ONSTATE_MASK;
+ case 4:
+ return OMAP_MEM4_ONSTATE_MASK;
+ default:
+ WARN_ON(1); /* should never happen */
+ return -EEXIST;
+ }
+ return 0;
+}
+
+int _get_mem_bank_retst_mask(u8 bank)
+{
+ switch (bank) {
+ case 0:
+ return OMAP_MEM0_RETSTATE_MASK;
+ case 1:
+ return OMAP_MEM1_RETSTATE_MASK;
+ case 2:
+ return OMAP_MEM2_RETSTATE_MASK;
+ case 3:
+ return OMAP_MEM3_RETSTATE_MASK;
+ case 4:
+ return OMAP_MEM4_RETSTATE_MASK;
+ default:
+ WARN_ON(1); /* should never happen */
+ return -EEXIST;
+ }
+ return 0;
+}
+
+int _get_mem_bank_stst_mask(u8 bank)
+{
+ switch (bank) {
+ case 0:
+ return OMAP_MEM0_STATEST_MASK;
+ case 1:
+ return OMAP_MEM1_STATEST_MASK;
+ case 2:
+ return OMAP_MEM2_STATEST_MASK;
+ case 3:
+ return OMAP_MEM3_STATEST_MASK;
+ case 4:
+ return OMAP_MEM4_STATEST_MASK;
+ default:
+ WARN_ON(1); /* should never happen */
+ return -EEXIST;
+ }
+ return 0;
+}
+
diff --git a/arch/arm/mach-omap2/powerdomains.h b/arch/arm/mach-omap2/powerdomains.h
index b25b989..e6d0d5b 100644
--- a/arch/arm/mach-omap2/powerdomains.h
+++ b/arch/arm/mach-omap2/powerdomains.h
@@ -99,6 +99,11 @@ extern struct pwrdm_functions omap4_pwrdm_functions;
static struct pwrdm_functions omap4_pwrdm_functions;
#endif
+int _get_mem_bank_onstate_mask(u8 bank);
+int _get_mem_bank_retst_mask(u8 bank);
+int _get_mem_bank_stst_mask(u8 bank);
+int _get_mem_bank_lastmemst_mask(u8 bank);
+
/* As powerdomains are added or removed above, this list must also be changed */
static struct powerdomain *powerdomains_omap[] __initdata = {
diff --git a/arch/arm/mach-omap2/powerdomains2xxx.c b/arch/arm/mach-omap2/powerdomains2xxx.c
index 779529d..903701f 100644
--- a/arch/arm/mach-omap2/powerdomains2xxx.c
+++ b/arch/arm/mach-omap2/powerdomains2xxx.c
@@ -19,6 +19,24 @@
#include <plat/prcm.h>
#include "powerdomains.h"
+static int omap2_get_mem_bank_lastmemst_mask(u8 bank)
+{
+ switch (bank) {
+ case 0:
+ return OMAP3430_LASTMEM1STATEENTERED_MASK;
+ case 1:
+ return OMAP3430_LASTMEM2STATEENTERED_MASK;
+ case 2:
+ return OMAP3430_LASTSHAREDL2CACHEFLATSTATEENTERED_MASK;
+ case 3:
+ return OMAP3430_LASTL2FLATMEMSTATEENTERED_MASK;
+ default:
+ WARN_ON(1); /* should never happen */
+ return -EEXIST;
+ }
+ return 0;
+}
+
static int omap2_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
{
prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
@@ -56,6 +74,32 @@ static int omap2_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
return 0;
}
+static int omap2_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank,
+ u8 pwrst)
+{
+ u32 m;
+
+ m = _get_mem_bank_onstate_mask(bank);
+
+ prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)),
+ pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
+
+ return 0;
+}
+
+static int omap2_pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank,
+ u8 pwrst)
+{
+ u32 m;
+
+ m = _get_mem_bank_retst_mask(bank);
+
+ prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), pwrdm->prcm_offs,
+ OMAP2_PM_PWSTCTRL);
+
+ return 0;
+}
+
static int omap2_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
{
return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP2_PM_PWSTST,
@@ -75,13 +119,98 @@ static int omap2_pwrdm_read_logic_retst(struct powerdomain *pwrdm)
OMAP3430_LOGICSTATEST_MASK);
}
+static int omap2_pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
+{
+ u32 m;
+
+ m = _get_mem_bank_stst_mask(bank);
+
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs,
+ OMAP2_PM_PWSTST, m);
+}
+
+static int omap2_pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
+{
+ u32 m;
+
+ m = omap2_get_mem_bank_lastmemst_mask(bank);
+
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs,
+ OMAP3430_PM_PREPWSTST, m);
+}
+
+static int omap2_pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank)
+{
+ u32 m;
+
+ m = _get_mem_bank_retst_mask(bank);
+
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs,
+ OMAP2_PM_PWSTCTRL, m);
+}
+
+static int omap2_pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
+{
+ prm_write_mod_reg(0, pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST);
+ return 0;
+}
+
+static int omap2_pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm)
+{
+ return prm_rmw_mod_reg_bits(0, 1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT,
+ pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
+}
+
+static int omap2_pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm)
+{
+ return prm_rmw_mod_reg_bits(1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT, 0,
+ pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
+}
+
+static int omap2_pwrdm_wait_transition(struct powerdomain *pwrdm)
+{
+ u32 c = 0;
+
+ /*
+ * REVISIT: pwrdm_wait_transition() may be better implemented
+ * via a callback and a periodic timer check -- how long do we expect
+ * powerdomain transitions to take?
+ */
+
+ /* XXX Is this udelay() value meaningful? */
+ while ((prm_read_mod_reg(pwrdm->prcm_offs, OMAP2_PM_PWSTST) &
+ OMAP_INTRANSITION_MASK) &&
+ (c++ < PWRDM_TRANSITION_BAILOUT))
+ udelay(1);
+
+ if (c > PWRDM_TRANSITION_BAILOUT) {
+ printk(KERN_ERR "powerdomain: waited too long for "
+ "powerdomain %s to complete transition\n", pwrdm->name);
+ return -EAGAIN;
+ }
+
+ pr_debug("powerdomain: completed transition in %d loops\n", c);
+
+ return 0;
+}
+
+
struct pwrdm_functions omap2_pwrdm_functions = {
.pwrdm_set_next_pwrst = omap2_pwrdm_set_next_pwrst,
.pwrdm_read_next_pwrst = omap2_pwrdm_read_next_pwrst,
.pwrdm_read_pwrst = omap2_pwrdm_read_pwrst,
.pwrdm_read_prev_pwrst = omap2_pwrdm_read_prev_pwrst,
.pwrdm_set_logic_retst = omap2_pwrdm_set_logic_retst,
+ .pwrdm_set_mem_onst = omap2_pwrdm_set_mem_onst,
+ .pwrdm_set_mem_retst = omap2_pwrdm_set_mem_retst,
.pwrdm_read_logic_pwrst = omap2_pwrdm_read_logic_pwrst,
.pwrdm_read_prev_logic_pwrst = omap2_pwrdm_read_prev_logic_pwrst,
.pwrdm_read_logic_retst = omap2_pwrdm_read_logic_retst,
+ .pwrdm_read_mem_pwrst = omap2_pwrdm_read_mem_pwrst,
+ .pwrdm_read_prev_mem_pwrst = omap2_pwrdm_read_prev_mem_pwrst,
+ .pwrdm_read_mem_retst = omap2_pwrdm_read_mem_retst,
+ .pwrdm_clear_all_prev_pwrst = omap2_pwrdm_clear_all_prev_pwrst,
+ .pwrdm_enable_hdwr_sar = omap2_pwrdm_enable_hdwr_sar,
+ .pwrdm_disable_hdwr_sar = omap2_pwrdm_disable_hdwr_sar,
+ .pwrdm_wait_transition = omap2_pwrdm_wait_transition,
};
diff --git a/arch/arm/mach-omap2/powerdomains44xx.c b/arch/arm/mach-omap2/powerdomains44xx.c
index 016a425..79be2cd 100644
--- a/arch/arm/mach-omap2/powerdomains44xx.c
+++ b/arch/arm/mach-omap2/powerdomains44xx.c
@@ -45,6 +45,14 @@ static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
OMAP4430_LASTPOWERSTATEENTERED_MASK);
}
+static int omap4_pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
+{
+ prm_rmw_mod_reg_bits(OMAP4430_LOWPOWERSTATECHANGE_MASK,
+ (1 << OMAP4430_LOWPOWERSTATECHANGE_SHIFT),
+ pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
+ return 0;
+}
+
static int omap4_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
{
u32 v;
@@ -56,6 +64,32 @@ static int omap4_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
return 0;
}
+static int omap4_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank,
+ u8 pwrst)
+{
+ u32 m;
+
+ m = _get_mem_bank_onstate_mask(bank);
+
+ prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)),
+ pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
+
+ return 0;
+}
+
+static int omap4_pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank,
+ u8 pwrst)
+{
+ u32 m;
+
+ m = _get_mem_bank_retst_mask(bank);
+
+ prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), pwrdm->prcm_offs,
+ OMAP4_PM_PWSTCTRL);
+
+ return 0;
+}
+
static int omap4_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
{
return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTST,
@@ -68,12 +102,65 @@ static int omap4_pwrdm_read_logic_retst(struct powerdomain *pwrdm)
OMAP4430_LOGICRETSTATE_MASK);
}
+static int omap4_pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
+{
+ u32 m;
+
+ m = _get_mem_bank_stst_mask(bank);
+
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs,
+ OMAP4_PM_PWSTST, m);
+}
+
+static int omap4_pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank)
+{
+ u32 m;
+
+ m = _get_mem_bank_retst_mask(bank);
+
+ return prm_read_mod_bits_shift(pwrdm->prcm_offs,
+ OMAP4_PM_PWSTCTRL, m);
+}
+
+static int omap4_pwrdm_wait_transition(struct powerdomain *pwrdm)
+{
+ u32 c = 0;
+
+ /*
+ * REVISIT: pwrdm_wait_transition() may be better implemented
+ * via a callback and a periodic timer check -- how long do we expect
+ * powerdomain transitions to take?
+ */
+
+ /* XXX Is this udelay() value meaningful? */
+ while ((prm_read_mod_reg(pwrdm->prcm_offs, OMAP4_PM_PWSTST) &
+ OMAP_INTRANSITION_MASK) &&
+ (c++ < PWRDM_TRANSITION_BAILOUT))
+ udelay(1);
+
+ if (c > PWRDM_TRANSITION_BAILOUT) {
+ printk(KERN_ERR "powerdomain: waited too long for "
+ "powerdomain %s to complete transition\n", pwrdm->name);
+ return -EAGAIN;
+ }
+
+ pr_debug("powerdomain: completed transition in %d loops\n", c);
+
+ return 0;
+}
+
struct pwrdm_functions omap4_pwrdm_functions = {
.pwrdm_set_next_pwrst = omap4_pwrdm_set_next_pwrst,
.pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst,
.pwrdm_read_pwrst = omap4_pwrdm_read_pwrst,
.pwrdm_read_prev_pwrst = omap4_pwrdm_read_prev_pwrst,
+ .pwrdm_set_lowpwrstchange = omap4_pwrdm_set_lowpwrstchange,
.pwrdm_set_logic_retst = omap4_pwrdm_set_logic_retst,
.pwrdm_read_logic_pwrst = omap4_pwrdm_read_logic_pwrst,
.pwrdm_read_logic_retst = omap4_pwrdm_read_logic_retst,
+ .pwrdm_read_mem_pwrst = omap4_pwrdm_read_mem_pwrst,
+ .pwrdm_read_mem_retst = omap4_pwrdm_read_mem_retst,
+ .pwrdm_set_mem_onst = omap4_pwrdm_set_mem_onst,
+ .pwrdm_set_mem_retst = omap4_pwrdm_set_mem_retst,
+ .pwrdm_wait_transition = omap4_pwrdm_wait_transition,
};
diff --git a/arch/arm/plat-omap/powerdomain.c b/arch/arm/plat-omap/powerdomain.c
index 9177fbb..d8e29dc 100644
--- a/arch/arm/plat-omap/powerdomain.c
+++ b/arch/arm/plat-omap/powerdomain.c
@@ -17,27 +17,9 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
-#include <linux/delay.h>
-#include <linux/spinlock.h>
#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/io.h>
-
-#include <asm/atomic.h>
-
-#include "../mach-omap2/cm.h"
-#include "../mach-omap2/cm-regbits-34xx.h"
-#include "../mach-omap2/cm-regbits-44xx.h"
-#include "../mach-omap2/prm.h"
-#include "../mach-omap2/prm-regbits-34xx.h"
-#include "../mach-omap2/prm-regbits-44xx.h"
-
-#include <plat/cpu.h>
#include <plat/powerdomain.h>
#include <plat/clockdomain.h>
-#include <plat/prcm.h>
-
#include "../mach-omap2/pm.h"
enum {
@@ -45,37 +27,6 @@ enum {
PWRDM_STATE_PREV,
};
-/* Variable holding value of the CPU dependent PWRSTCTRL Register Offset */
-static u16 pwrstctrl_reg_offs;
-
-/* Variable holding value of the CPU dependent PWRSTST Register Offset */
-static u16 pwrstst_reg_offs;
-
-/* OMAP3 and OMAP4 specific register bit initialisations
- * Notice that the names here are not according to each power
- * domain but the bit mapping used applies to all of them
- */
-
-/* OMAP3 and OMAP4 Memory Onstate Masks (common across all power domains) */
-#define OMAP_MEM0_ONSTATE_MASK OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK
-#define OMAP_MEM1_ONSTATE_MASK OMAP3430_L1FLATMEMONSTATE_MASK
-#define OMAP_MEM2_ONSTATE_MASK OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK
-#define OMAP_MEM3_ONSTATE_MASK OMAP3430_L2FLATMEMONSTATE_MASK
-#define OMAP_MEM4_ONSTATE_MASK OMAP4430_OCP_NRET_BANK_ONSTATE_MASK
-
-/* OMAP3 and OMAP4 Memory Retstate Masks (common across all power domains) */
-#define OMAP_MEM0_RETSTATE_MASK OMAP3430_SHAREDL1CACHEFLATRETSTATE_MASK
-#define OMAP_MEM1_RETSTATE_MASK OMAP3430_L1FLATMEMRETSTATE_MASK
-#define OMAP_MEM2_RETSTATE_MASK OMAP3430_SHAREDL2CACHEFLATRETSTATE_MASK
-#define OMAP_MEM3_RETSTATE_MASK OMAP3430_L2FLATMEMRETSTATE_MASK
-#define OMAP_MEM4_RETSTATE_MASK OMAP4430_OCP_NRET_BANK_RETSTATE_MASK
-
-/* OMAP3 and OMAP4 Memory Status bits */
-#define OMAP_MEM0_STATEST_MASK OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK
-#define OMAP_MEM1_STATEST_MASK OMAP3430_L1FLATMEMSTATEST_MASK
-#define OMAP_MEM2_STATEST_MASK OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK
-#define OMAP_MEM3_STATEST_MASK OMAP3430_L2FLATMEMSTATEST_MASK
-#define OMAP_MEM4_STATEST_MASK OMAP4430_OCP_NRET_BANK_STATEST_MASK
/* pwrdm_list contains all registered struct powerdomains */
static LIST_HEAD(pwrdm_list);
@@ -224,18 +175,6 @@ void pwrdm_init(struct powerdomain **pwrdm_list, struct pwrdm_functions *custom_
{
struct powerdomain **p = NULL;
- if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
- pwrstctrl_reg_offs = OMAP2_PM_PWSTCTRL;
- pwrstst_reg_offs = OMAP2_PM_PWSTST;
- } else if (cpu_is_omap44xx()) {
- pwrstctrl_reg_offs = OMAP4_PM_PWSTCTRL;
- pwrstst_reg_offs = OMAP4_PM_PWSTST;
- } else {
- printk(KERN_ERR "Power Domain struct not supported for " \
- "this CPU\n");
- return;
- }
-
if (!custom_funcs)
WARN(1, "No custom pwrdm functions registered\n");
else
@@ -565,7 +504,7 @@ int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
*/
int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
{
- u32 m;
+ int ret = -EINVAL;
if (!pwrdm)
return -EINVAL;
@@ -579,37 +518,10 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
pr_debug("powerdomain: setting next memory powerstate for domain %s "
"bank %0x while pwrdm-ON to %0x\n", pwrdm->name, bank, pwrst);
- /*
- * The register bit names below may not correspond to the
- * actual names of the bits in each powerdomain's register,
- * but the type of value returned is the same for each
- * powerdomain.
- */
- switch (bank) {
- case 0:
- m = OMAP_MEM0_ONSTATE_MASK;
- break;
- case 1:
- m = OMAP_MEM1_ONSTATE_MASK;
- break;
- case 2:
- m = OMAP_MEM2_ONSTATE_MASK;
- break;
- case 3:
- m = OMAP_MEM3_ONSTATE_MASK;
- break;
- case 4:
- m = OMAP_MEM4_ONSTATE_MASK;
- break;
- default:
- WARN_ON(1); /* should never happen */
- return -EEXIST;
- }
-
- prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)),
- pwrdm->prcm_offs, pwrstctrl_reg_offs);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_set_mem_onst)
+ ret = arch_pwrdm->pwrdm_set_mem_onst(pwrdm, bank, pwrst);
- return 0;
+ return ret;
}
/**
@@ -630,7 +542,7 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
*/
int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
{
- u32 m;
+ int ret = -EINVAL;
if (!pwrdm)
return -EINVAL;
@@ -644,37 +556,10 @@ int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
pr_debug("powerdomain: setting next memory powerstate for domain %s "
"bank %0x while pwrdm-RET to %0x\n", pwrdm->name, bank, pwrst);
- /*
- * The register bit names below may not correspond to the
- * actual names of the bits in each powerdomain's register,
- * but the type of value returned is the same for each
- * powerdomain.
- */
- switch (bank) {
- case 0:
- m = OMAP_MEM0_RETSTATE_MASK;
- break;
- case 1:
- m = OMAP_MEM1_RETSTATE_MASK;
- break;
- case 2:
- m = OMAP_MEM2_RETSTATE_MASK;
- break;
- case 3:
- m = OMAP_MEM3_RETSTATE_MASK;
- break;
- case 4:
- m = OMAP_MEM4_RETSTATE_MASK;
- break;
- default:
- WARN_ON(1); /* should never happen */
- return -EEXIST;
- }
+ if (arch_pwrdm && arch_pwrdm->pwrdm_set_mem_retst)
+ ret = arch_pwrdm->pwrdm_set_mem_retst(pwrdm, bank, pwrst);
- prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), pwrdm->prcm_offs,
- pwrstctrl_reg_offs);
-
- return 0;
+ return ret;
}
/**
@@ -753,46 +638,21 @@ int pwrdm_read_logic_retst(struct powerdomain *pwrdm)
*/
int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
{
- u32 m;
+ int ret = -EINVAL;
if (!pwrdm)
- return -EINVAL;
+ return ret;
if (pwrdm->banks < (bank + 1))
- return -EEXIST;
+ return ret;
if (pwrdm->flags & PWRDM_HAS_MPU_QUIRK)
bank = 1;
- /*
- * The register bit names below may not correspond to the
- * actual names of the bits in each powerdomain's register,
- * but the type of value returned is the same for each
- * powerdomain.
- */
- switch (bank) {
- case 0:
- m = OMAP_MEM0_STATEST_MASK;
- break;
- case 1:
- m = OMAP_MEM1_STATEST_MASK;
- break;
- case 2:
- m = OMAP_MEM2_STATEST_MASK;
- break;
- case 3:
- m = OMAP_MEM3_STATEST_MASK;
- break;
- case 4:
- m = OMAP_MEM4_STATEST_MASK;
- break;
- default:
- WARN_ON(1); /* should never happen */
- return -EEXIST;
- }
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_mem_pwrst)
+ ret = arch_pwrdm->pwrdm_read_mem_pwrst(pwrdm, bank);
- return prm_read_mod_bits_shift(pwrdm->prcm_offs,
- pwrstst_reg_offs, m);
+ return ret;
}
/**
@@ -808,43 +668,21 @@ int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
*/
int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
{
- u32 m;
+ int ret = -EINVAL;
if (!pwrdm)
- return -EINVAL;
+ return ret;
if (pwrdm->banks < (bank + 1))
- return -EEXIST;
+ return ret;
if (pwrdm->flags & PWRDM_HAS_MPU_QUIRK)
bank = 1;
- /*
- * The register bit names below may not correspond to the
- * actual names of the bits in each powerdomain's register,
- * but the type of value returned is the same for each
- * powerdomain.
- */
- switch (bank) {
- case 0:
- m = OMAP3430_LASTMEM1STATEENTERED_MASK;
- break;
- case 1:
- m = OMAP3430_LASTMEM2STATEENTERED_MASK;
- break;
- case 2:
- m = OMAP3430_LASTSHAREDL2CACHEFLATSTATEENTERED_MASK;
- break;
- case 3:
- m = OMAP3430_LASTL2FLATMEMSTATEENTERED_MASK;
- break;
- default:
- WARN_ON(1); /* should never happen */
- return -EEXIST;
- }
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_mem_pwrst)
+ ret = arch_pwrdm->pwrdm_read_prev_mem_pwrst(pwrdm, bank);
- return prm_read_mod_bits_shift(pwrdm->prcm_offs,
- OMAP3430_PM_PREPWSTST, m);
+ return ret;
}
/**
@@ -859,43 +697,18 @@ int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
*/
int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank)
{
- u32 m;
+ int ret = -EINVAL;
if (!pwrdm)
- return -EINVAL;
+ return ret;
if (pwrdm->banks < (bank + 1))
- return -EEXIST;
+ return ret;
- /*
- * The register bit names below may not correspond to the
- * actual names of the bits in each powerdomain's register,
- * but the type of value returned is the same for each
- * powerdomain.
- */
- switch (bank) {
- case 0:
- m = OMAP_MEM0_RETSTATE_MASK;
- break;
- case 1:
- m = OMAP_MEM1_RETSTATE_MASK;
- break;
- case 2:
- m = OMAP_MEM2_RETSTATE_MASK;
- break;
- case 3:
- m = OMAP_MEM3_RETSTATE_MASK;
- break;
- case 4:
- m = OMAP_MEM4_RETSTATE_MASK;
- break;
- default:
- WARN_ON(1); /* should never happen */
- return -EEXIST;
- }
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_mem_retst)
+ ret = arch_pwrdm->pwrdm_read_mem_retst(pwrdm, bank);
- return prm_read_mod_bits_shift(pwrdm->prcm_offs,
- pwrstctrl_reg_offs, m);
+ return ret;
}
/**
@@ -909,8 +722,10 @@ int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank)
*/
int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
{
+ int ret = -EINVAL;
+
if (!pwrdm)
- return -EINVAL;
+ return ret;
/*
* XXX should get the powerdomain's current state here;
@@ -920,9 +735,10 @@ int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
pr_debug("powerdomain: clearing previous power state reg for %s\n",
pwrdm->name);
- prm_write_mod_reg(0, pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_clear_all_prev_pwrst)
+ ret = arch_pwrdm->pwrdm_clear_all_prev_pwrst(pwrdm);
- return 0;
+ return ret;
}
/**
@@ -938,19 +754,21 @@ int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
*/
int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm)
{
+ int ret = -EINVAL;
+
if (!pwrdm)
- return -EINVAL;
+ return ret;
if (!(pwrdm->flags & PWRDM_HAS_HDWR_SAR))
- return -EINVAL;
+ return ret;
pr_debug("powerdomain: %s: setting SAVEANDRESTORE bit\n",
pwrdm->name);
- prm_rmw_mod_reg_bits(0, 1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT,
- pwrdm->prcm_offs, pwrstctrl_reg_offs);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_enable_hdwr_sar)
+ ret = arch_pwrdm->pwrdm_enable_hdwr_sar(pwrdm);
- return 0;
+ return ret;
}
/**
@@ -966,19 +784,21 @@ int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm)
*/
int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm)
{
+ int ret = -EINVAL;
+
if (!pwrdm)
- return -EINVAL;
+ return ret;
if (!(pwrdm->flags & PWRDM_HAS_HDWR_SAR))
- return -EINVAL;
+ return ret;
pr_debug("powerdomain: %s: clearing SAVEANDRESTORE bit\n",
pwrdm->name);
- prm_rmw_mod_reg_bits(1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT, 0,
- pwrdm->prcm_offs, pwrstctrl_reg_offs);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_disable_hdwr_sar)
+ ret = arch_pwrdm->pwrdm_disable_hdwr_sar(pwrdm);
- return 0;
+ return ret;
}
/**
@@ -1005,6 +825,8 @@ bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm)
*/
int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
{
+ int ret = -EINVAL;
+
if (!pwrdm)
return -EINVAL;
@@ -1014,11 +836,10 @@ int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
pr_debug("powerdomain: %s: setting LOWPOWERSTATECHANGE bit\n",
pwrdm->name);
- prm_rmw_mod_reg_bits(OMAP4430_LOWPOWERSTATECHANGE_MASK,
- (1 << OMAP4430_LOWPOWERSTATECHANGE_SHIFT),
- pwrdm->prcm_offs, pwrstctrl_reg_offs);
+ if (arch_pwrdm && arch_pwrdm->pwrdm_set_lowpwrstchange)
+ ret = arch_pwrdm->pwrdm_set_lowpwrstchange(pwrdm);
- return 0;
+ return ret;
}
/**
@@ -1033,32 +854,15 @@ int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
*/
int pwrdm_wait_transition(struct powerdomain *pwrdm)
{
- u32 c = 0;
+ int ret = -EINVAL;
if (!pwrdm)
return -EINVAL;
- /*
- * REVISIT: pwrdm_wait_transition() may be better implemented
- * via a callback and a periodic timer check -- how long do we expect
- * powerdomain transitions to take?
- */
+ if (arch_pwrdm && arch_pwrdm->pwrdm_wait_transition)
+ ret = arch_pwrdm->pwrdm_wait_transition(pwrdm);
- /* XXX Is this udelay() value meaningful? */
- while ((prm_read_mod_reg(pwrdm->prcm_offs, pwrstst_reg_offs) &
- OMAP_INTRANSITION_MASK) &&
- (c++ < PWRDM_TRANSITION_BAILOUT))
- udelay(1);
-
- if (c > PWRDM_TRANSITION_BAILOUT) {
- printk(KERN_ERR "powerdomain: waited too long for "
- "powerdomain %s to complete transition\n", pwrdm->name);
- return -EAGAIN;
- }
-
- pr_debug("powerdomain: completed transition in %d loops\n", c);
-
- return 0;
+ return ret;
}
int pwrdm_state_switch(struct powerdomain *pwrdm)
--
1.7.0.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6/6] OMAP4: powerdomain: Add pwrdm_clear_all_prev_pwrst
2010-11-16 15:38 ` [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control Rajendra Nayak
@ 2010-11-16 15:38 ` Rajendra Nayak
2010-11-29 0:31 ` Paul Walmsley
2010-11-16 16:09 ` [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control Thomas Petazzoni
2010-11-29 0:28 ` Paul Walmsley
2 siblings, 1 reply; 20+ messages in thread
From: Rajendra Nayak @ 2010-11-16 15:38 UTC (permalink / raw)
To: linux-omap; +Cc: paul, b-cousson, khilman, Santosh Shilimkar, Rajendra Nayak
From: Santosh Shilimkar <santosh.shilimkar@ti.com>
OMAP4430 ES2 has additional bitfields in PWRSTST register which help
identify the previous power state entered by the powerdomain.
Add pwrdm_clear_all_prev_pwrst api to support this.
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
---
arch/arm/mach-omap2/powerdomains44xx.c | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/powerdomains44xx.c b/arch/arm/mach-omap2/powerdomains44xx.c
index 79be2cd..0414e6a 100644
--- a/arch/arm/mach-omap2/powerdomains44xx.c
+++ b/arch/arm/mach-omap2/powerdomains44xx.c
@@ -45,6 +45,14 @@ static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
OMAP4430_LASTPOWERSTATEENTERED_MASK);
}
+static int omap4_pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
+{
+ prm_rmw_mod_reg_bits(OMAP4430_LASTPOWERSTATEENTERED_MASK,
+ 0x3 << OMAP4430_LASTPOWERSTATEENTERED_SHIFT,
+ pwrdm->prcm_offs, OMAP4_PM_PWSTST);
+ return 0;
+}
+
static int omap4_pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
{
prm_rmw_mod_reg_bits(OMAP4430_LOWPOWERSTATECHANGE_MASK,
@@ -154,6 +162,7 @@ struct pwrdm_functions omap4_pwrdm_functions = {
.pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst,
.pwrdm_read_pwrst = omap4_pwrdm_read_pwrst,
.pwrdm_read_prev_pwrst = omap4_pwrdm_read_prev_pwrst,
+ .pwrdm_clear_all_prev_pwrst = omap4_pwrdm_clear_all_prev_pwrst,
.pwrdm_set_lowpwrstchange = omap4_pwrdm_set_lowpwrstchange,
.pwrdm_set_logic_retst = omap4_pwrdm_set_logic_retst,
.pwrdm_read_logic_pwrst = omap4_pwrdm_read_logic_pwrst,
--
1.7.0.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control
2010-11-16 15:38 ` [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control Rajendra Nayak
2010-11-16 15:38 ` [PATCH 6/6] OMAP4: powerdomain: Add pwrdm_clear_all_prev_pwrst Rajendra Nayak
@ 2010-11-16 16:09 ` Thomas Petazzoni
2010-11-29 0:28 ` Paul Walmsley
2 siblings, 0 replies; 20+ messages in thread
From: Thomas Petazzoni @ 2010-11-16 16:09 UTC (permalink / raw)
To: Rajendra Nayak; +Cc: linux-omap, paul, b-cousson, khilman
Hello,
On Tue, 16 Nov 2010 21:08:05 +0530
Rajendra Nayak <rnayak@ti.com> wrote:
> Define the following architecture specific funtions for omap2/3/4
funtions -> functions.
> +/* Common Internal functions used across OMAP rev's*/
> +int _get_mem_bank_onstate_mask(u8 bank)
> +{
> + switch (bank) {
> + case 0:
> + return OMAP_MEM0_ONSTATE_MASK;
> + case 1:
> + return OMAP_MEM1_ONSTATE_MASK;
> + case 2:
> + return OMAP_MEM2_ONSTATE_MASK;
> + case 3:
> + return OMAP_MEM3_ONSTATE_MASK;
> + case 4:
> + return OMAP_MEM4_ONSTATE_MASK;
> + default:
> + WARN_ON(1); /* should never happen */
> + return -EEXIST;
EEXIST is the error code for "File exists", so here I would rather
expect something like ENOENT. But I understand that it was already
-EEXIST in the existing code.
Thanks,
Thomas
--
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code
2010-11-16 15:38 ` [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code Rajendra Nayak
2010-11-16 15:38 ` [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control Rajendra Nayak
@ 2010-11-16 16:11 ` Thomas Petazzoni
2010-11-22 6:21 ` Rajendra Nayak
2010-11-29 0:07 ` Paul Walmsley
2 siblings, 1 reply; 20+ messages in thread
From: Thomas Petazzoni @ 2010-11-16 16:11 UTC (permalink / raw)
To: Rajendra Nayak; +Cc: linux-omap, paul, b-cousson, khilman
On Tue, 16 Nov 2010 21:08:02 +0530
Rajendra Nayak <rnayak@ti.com> wrote:
> +struct pwrdm_functions {
> + int (*pwrdm_set_next_pwrst)(struct powerdomain *pwrdm, u8 pwrst);
> + int (*pwrdm_read_next_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_read_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_read_prev_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_set_logic_retst)(struct powerdomain *pwrdm, u8 pwrst);
> + int (*pwrdm_set_mem_onst)(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
> + int (*pwrdm_set_mem_retst)(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
> + int (*pwrdm_read_logic_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_read_prev_logic_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_read_logic_retst)(struct powerdomain *pwrdm);
> + int (*pwrdm_read_mem_pwrst)(struct powerdomain *pwrdm, u8 bank);
> + int (*pwrdm_read_prev_mem_pwrst)(struct powerdomain *pwrdm, u8 bank);
> + int (*pwrdm_read_mem_retst)(struct powerdomain *pwrdm, u8 bank);
> + int (*pwrdm_clear_all_prev_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_enable_hdwr_sar)(struct powerdomain *pwrdm);
> + int (*pwrdm_disable_hdwr_sar)(struct powerdomain *pwrdm);
> + int (*pwrdm_set_lowpwrstchange)(struct powerdomain *pwrdm);
> + int (*pwrdm_wait_transition)(struct powerdomain *pwrdm);
> +};
It would probably be great to have some short documentation on this
structure, to detail what are the different operations, what they
should do, etc.
By the way, would pwrdm_operations be more linux-ish than
pwrdm_functions ?
Thanks,
Thomas
--
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
^ permalink raw reply [flat|nested] 20+ messages in thread
* RE: [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code
2010-11-16 16:11 ` [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code Thomas Petazzoni
@ 2010-11-22 6:21 ` Rajendra Nayak
0 siblings, 0 replies; 20+ messages in thread
From: Rajendra Nayak @ 2010-11-22 6:21 UTC (permalink / raw)
To: Thomas Petazzoni; +Cc: linux-omap, paul, Benoit Cousson, khilman
Hi Thomas,
> -----Original Message-----
> From: Thomas Petazzoni [mailto:thomas.petazzoni@free-electrons.com]
> Sent: Tuesday, November 16, 2010 9:41 PM
> To: Rajendra Nayak
> Cc: linux-omap@vger.kernel.org; paul@pwsan.com; b-cousson@ti.com;
khilman@deeprootsystems.com
> Subject: Re: [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch
specific code
>
> On Tue, 16 Nov 2010 21:08:02 +0530
> Rajendra Nayak <rnayak@ti.com> wrote:
>
> > +struct pwrdm_functions {
> > + int (*pwrdm_set_next_pwrst)(struct powerdomain *pwrdm, u8
pwrst);
> > + int (*pwrdm_read_next_pwrst)(struct powerdomain *pwrdm);
> > + int (*pwrdm_read_pwrst)(struct powerdomain *pwrdm);
> > + int (*pwrdm_read_prev_pwrst)(struct powerdomain *pwrdm);
> > + int (*pwrdm_set_logic_retst)(struct powerdomain *pwrdm, u8
pwrst);
> > + int (*pwrdm_set_mem_onst)(struct powerdomain *pwrdm, u8 bank,
u8 pwrst);
> > + int (*pwrdm_set_mem_retst)(struct powerdomain *pwrdm, u8 bank,
u8 pwrst);
> > + int (*pwrdm_read_logic_pwrst)(struct powerdomain *pwrdm);
> > + int (*pwrdm_read_prev_logic_pwrst)(struct powerdomain *pwrdm);
> > + int (*pwrdm_read_logic_retst)(struct powerdomain *pwrdm);
> > + int (*pwrdm_read_mem_pwrst)(struct powerdomain *pwrdm, u8
bank);
> > + int (*pwrdm_read_prev_mem_pwrst)(struct powerdomain *pwrdm, u8
bank);
> > + int (*pwrdm_read_mem_retst)(struct powerdomain *pwrdm, u8
bank);
> > + int (*pwrdm_clear_all_prev_pwrst)(struct powerdomain *pwrdm);
> > + int (*pwrdm_enable_hdwr_sar)(struct powerdomain *pwrdm);
> > + int (*pwrdm_disable_hdwr_sar)(struct powerdomain *pwrdm);
> > + int (*pwrdm_set_lowpwrstchange)(struct powerdomain *pwrdm);
> > + int (*pwrdm_wait_transition)(struct powerdomain *pwrdm);
> > +};
>
> It would probably be great to have some short documentation on this
> structure, to detail what are the different operations, what they
> should do, etc.
Sure, I can add some kerneldoc style headers to the structure to better
understand
what these functions should do on each OMAP.
>
> By the way, would pwrdm_operations be more linux-ish than
> pwrdm_functions ?
I agree. I'll do this as well before I post a V2.
Thanks for the review.
Regards,
Rajendra
>
> Thanks,
>
> Thomas
> --
> Thomas Petazzoni, Free Electrons
> Kernel, drivers, real-time and embedded Linux
> development, consulting, training and support.
> http://free-electrons.com
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap
2010-11-16 15:38 ` [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap Rajendra Nayak
2010-11-16 15:38 ` [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code Rajendra Nayak
@ 2010-11-29 0:05 ` Paul Walmsley
2010-11-29 9:22 ` Rajendra Nayak
1 sibling, 1 reply; 20+ messages in thread
From: Paul Walmsley @ 2010-11-29 0:05 UTC (permalink / raw)
To: Rajendra Nayak; +Cc: linux-omap, b-cousson, khilman
Hello Rajendra,
some comments:
On Tue, 16 Nov 2010, Rajendra Nayak wrote:
> This is in preparation of splitting the powerdomain framework into
> platform-independent part (for all omaps) and platform-specific
> parts.
> The platform-independent code would reside in plat-omap/powerdomain.c
> and the platform-specific code will resides in
> mach-omap2/powerdomain-xxxx.c files.
Since we're not implementing powerdomain support for OMAP1 right now, is
there any reason why we can't just leave the powerdomain-common stuff in
the mach-omap2/ directory for now?
> Some of the hacks to include header files are done to make sure the
> patch compiles and works fine. These hacks will be removed in the
> subsequent patches.
>
> Signed-off-by: Rajendra Nayak <rnayak@ti.com>
> Cc: Paul Walmsley <paul@pwsan.com>
> Cc: Benoit Cousson <b-cousson@ti.com>
> Cc: Kevin Hilman <khilman@deeprootsystems.com>
> ---
> arch/arm/mach-omap2/Makefile | 2 +-
> arch/arm/plat-omap/Makefile | 6 +++---
> arch/arm/{mach-omap2 => plat-omap}/powerdomain.c | 14 +++++++-------
> 3 files changed, 11 insertions(+), 11 deletions(-)
> rename arch/arm/{mach-omap2 => plat-omap}/powerdomain.c (99%)
>
> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
> index 60e51bc..4bfadc5 100644
> --- a/arch/arm/mach-omap2/Makefile
> +++ b/arch/arm/mach-omap2/Makefile
> @@ -9,7 +9,7 @@ obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o pm.o \
> omap-2-3-common = irq.o sdrc.o prm2xxx_3xxx.o
> hwmod-common = omap_hwmod.o \
> omap_hwmod_common_data.o
> -prcm-common = prcm.o powerdomain.o
> +prcm-common = prcm.o
> clock-common = clock.o clock_common_data.o \
> clockdomain.o clkt_dpll.o \
> clkt_clksel.o
> diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile
> index a4a1285..424a9ae 100644
> --- a/arch/arm/plat-omap/Makefile
> +++ b/arch/arm/plat-omap/Makefile
> @@ -13,9 +13,9 @@ obj- :=
> obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o
>
> # omap_device support (OMAP2+ only at the moment)
> -obj-$(CONFIG_ARCH_OMAP2) += omap_device.o
> -obj-$(CONFIG_ARCH_OMAP3) += omap_device.o
> -obj-$(CONFIG_ARCH_OMAP4) += omap_device.o
> +obj-$(CONFIG_ARCH_OMAP2) += omap_device.o powerdomain.o
> +obj-$(CONFIG_ARCH_OMAP3) += omap_device.o powerdomain.o
> +obj-$(CONFIG_ARCH_OMAP4) += omap_device.o powerdomain.o
The powerdomain code isn't directly related to the omap_device code, so
please create a new section in the mach-omap2/Makefile for this stuff.
Perhaps something like:
# OMAP PRCM powerdomain support
obj-$(CONFIG_ARCH_OMAP2) += powerdomain.o
obj-$(CONFIG_ARCH_OMAP3) += powerdomain.o
obj-$(CONFIG_ARCH_OMAP4) += powerdomain.o
>
> obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o
> obj-$(CONFIG_OMAP_IOMMU) += iommu.o iovmm.o
> diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/plat-omap/powerdomain.c
> similarity index 99%
> rename from arch/arm/mach-omap2/powerdomain.c
> rename to arch/arm/plat-omap/powerdomain.c
(see the first comment)
> index 6527ec3..9204799 100644
> --- a/arch/arm/mach-omap2/powerdomain.c
> +++ b/arch/arm/plat-omap/powerdomain.c
> @@ -26,19 +26,19 @@
>
> #include <asm/atomic.h>
>
> -#include "cm.h"
> -#include "cm-regbits-34xx.h"
> -#include "cm-regbits-44xx.h"
> -#include "prm.h"
> -#include "prm-regbits-34xx.h"
> -#include "prm-regbits-44xx.h"
> +#include "../mach-omap2/cm.h"
> +#include "../mach-omap2/cm-regbits-34xx.h"
> +#include "../mach-omap2/cm-regbits-44xx.h"
> +#include "../mach-omap2/prm.h"
> +#include "../mach-omap2/prm-regbits-34xx.h"
> +#include "../mach-omap2/prm-regbits-44xx.h"
>
> #include <plat/cpu.h>
> #include <plat/powerdomain.h>
> #include <plat/clockdomain.h>
> #include <plat/prcm.h>
>
> -#include "pm.h"
> +#include "../mach-omap2/pm.h"
>
> enum {
> PWRDM_STATE_NOW = 0,
> --
> 1.7.0.4
>
- Paul
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code
2010-11-16 15:38 ` [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code Rajendra Nayak
2010-11-16 15:38 ` [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control Rajendra Nayak
2010-11-16 16:11 ` [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code Thomas Petazzoni
@ 2010-11-29 0:07 ` Paul Walmsley
2 siblings, 0 replies; 20+ messages in thread
From: Paul Walmsley @ 2010-11-29 0:07 UTC (permalink / raw)
To: Rajendra Nayak; +Cc: linux-omap, b-cousson, khilman
One minor comment here:
On Tue, 16 Nov 2010, Rajendra Nayak wrote:
> Put infrastructure in place, so arch specific func pointers
> can be hooked up to the platform-independent part of the
> framework.
>
> Signed-off-by: Rajendra Nayak <rnayak@ti.com>
> Cc: Paul Walmsley <paul@pwsan.com>
> Cc: Benoit Cousson <b-cousson@ti.com>
> Cc: Kevin Hilman <khilman@deeprootsystems.com>
> ---
> arch/arm/mach-omap2/io.c | 2 +-
> arch/arm/plat-omap/include/plat/powerdomain.h | 22 +++++++++++++++++++++-
> arch/arm/plat-omap/powerdomain.c | 10 ++++++++--
> 3 files changed, 30 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
> index 40562dd..76c531a 100644
> --- a/arch/arm/mach-omap2/io.c
> +++ b/arch/arm/mach-omap2/io.c
> @@ -316,7 +316,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
> {
> u8 skip_setup_idle = 0;
>
> - pwrdm_init(powerdomains_omap);
> + pwrdm_init(powerdomains_omap, NULL);
> clkdm_init(clockdomains_omap, clkdm_autodeps);
> if (cpu_is_omap242x())
> omap2420_hwmod_init();
> diff --git a/arch/arm/plat-omap/include/plat/powerdomain.h b/arch/arm/plat-omap/include/plat/powerdomain.h
> index 9ca420d..35e1ef7 100644
> --- a/arch/arm/plat-omap/include/plat/powerdomain.h
> +++ b/arch/arm/plat-omap/include/plat/powerdomain.h
> @@ -117,8 +117,28 @@ struct powerdomain {
> #endif
> };
>
> +struct pwrdm_functions {
> + int (*pwrdm_set_next_pwrst)(struct powerdomain *pwrdm, u8 pwrst);
> + int (*pwrdm_read_next_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_read_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_read_prev_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_set_logic_retst)(struct powerdomain *pwrdm, u8 pwrst);
> + int (*pwrdm_set_mem_onst)(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
> + int (*pwrdm_set_mem_retst)(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
> + int (*pwrdm_read_logic_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_read_prev_logic_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_read_logic_retst)(struct powerdomain *pwrdm);
> + int (*pwrdm_read_mem_pwrst)(struct powerdomain *pwrdm, u8 bank);
> + int (*pwrdm_read_prev_mem_pwrst)(struct powerdomain *pwrdm, u8 bank);
> + int (*pwrdm_read_mem_retst)(struct powerdomain *pwrdm, u8 bank);
> + int (*pwrdm_clear_all_prev_pwrst)(struct powerdomain *pwrdm);
> + int (*pwrdm_enable_hdwr_sar)(struct powerdomain *pwrdm);
> + int (*pwrdm_disable_hdwr_sar)(struct powerdomain *pwrdm);
> + int (*pwrdm_set_lowpwrstchange)(struct powerdomain *pwrdm);
> + int (*pwrdm_wait_transition)(struct powerdomain *pwrdm);
> +};
>
> -void pwrdm_init(struct powerdomain **pwrdm_list);
> +void pwrdm_init(struct powerdomain **pwrdm_list, struct pwrdm_functions *custom_funcs);
>
> struct powerdomain *pwrdm_lookup(const char *name);
>
> diff --git a/arch/arm/plat-omap/powerdomain.c b/arch/arm/plat-omap/powerdomain.c
> index 9204799..9e2d712 100644
> --- a/arch/arm/plat-omap/powerdomain.c
> +++ b/arch/arm/plat-omap/powerdomain.c
> @@ -80,6 +80,8 @@ static u16 pwrstst_reg_offs;
> /* pwrdm_list contains all registered struct powerdomains */
> static LIST_HEAD(pwrdm_list);
>
> +static struct pwrdm_functions *arch_pwrdm;
> +
> /* Private functions */
>
> static struct powerdomain *_pwrdm_lookup(const char *name)
> @@ -218,7 +220,7 @@ static int _pwrdm_post_transition_cb(struct powerdomain *pwrdm, void *unused)
> * registered. No return value. XXX pwrdm_list is not really a
> * "list"; it is an array. Rename appropriately.
> */
> -void pwrdm_init(struct powerdomain **pwrdm_list)
> +void pwrdm_init(struct powerdomain **pwrdm_list, struct pwrdm_functions *custom_funcs)
> {
> struct powerdomain **p = NULL;
>
> @@ -234,6 +236,11 @@ void pwrdm_init(struct powerdomain **pwrdm_list)
> return;
> }
>
> + if (!custom_funcs)
> + WARN(1, "No custom pwrdm functions registered\n");
It's probably best to prefix this message with "powerdomain: "
> + else
> + arch_pwrdm = custom_funcs;
> +
> if (pwrdm_list) {
> for (p = pwrdm_list; *p; p++)
> _pwrdm_register(*p);
> @@ -1074,4 +1081,3 @@ int pwrdm_post_transition(void)
> pwrdm_for_each(_pwrdm_post_transition_cb, NULL);
> return 0;
> }
> -
> --
> 1.7.0.4
>
- Paul
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control
2010-11-16 15:38 ` [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control Rajendra Nayak
2010-11-16 15:38 ` [PATCH 4/6] OMAP: powerdomain: Arch specific funcs for logic control Rajendra Nayak
@ 2010-11-29 0:14 ` Paul Walmsley
2010-11-30 15:47 ` Rajendra Nayak
1 sibling, 1 reply; 20+ messages in thread
From: Paul Walmsley @ 2010-11-29 0:14 UTC (permalink / raw)
To: Rajendra Nayak; +Cc: linux-omap, b-cousson, khilman
Some comments below:
On Tue, 16 Nov 2010, Rajendra Nayak wrote:
> Define the following architecture specific funtions for omap2/3/4
> .pwrdm_set_next_pwrst
> .pwrdm_read_next_pwrst
> .pwrdm_read_pwrst
> .pwrdm_read_prev_pwrst
>
> Convert the platform-independent framework to call these functions.
>
> Signed-off-by: Rajendra Nayak <rnayak@ti.com>
> Cc: Paul Walmsley <paul@pwsan.com>
> Cc: Benoit Cousson <b-cousson@ti.com>
> Cc: Kevin Hilman <khilman@deeprootsystems.com>
> ---
> arch/arm/mach-omap2/Makefile | 5 +++
> arch/arm/mach-omap2/io.c | 5 ++-
> arch/arm/mach-omap2/powerdomains.h | 8 +++++
> arch/arm/mach-omap2/powerdomains2xxx.c | 53 ++++++++++++++++++++++++++++++++
> arch/arm/mach-omap2/powerdomains44xx.c | 53 ++++++++++++++++++++++++++++++++
> arch/arm/plat-omap/powerdomain.c | 33 ++++++++++++++------
> 6 files changed, 146 insertions(+), 11 deletions(-)
> create mode 100644 arch/arm/mach-omap2/powerdomains2xxx.c
> create mode 100644 arch/arm/mach-omap2/powerdomains44xx.c
>
> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
> index 4bfadc5..5f843fc 100644
> --- a/arch/arm/mach-omap2/Makefile
> +++ b/arch/arm/mach-omap2/Makefile
> @@ -94,6 +94,11 @@ obj-$(CONFIG_ARCH_OMAP2430) += omap_hwmod_2430_data.o
> obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_3xxx_data.o
> obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o
>
> +#powerdomain framework
> +obj-$(CONFIG_ARCH_OMAP2) += powerdomains2xxx.o
> +obj-$(CONFIG_ARCH_OMAP3) += powerdomains2xxx.o
We're going to need a separate file for OMAP3, because there are some
PRCM powerdomain features that are not present on OMAP2.
Please move the functions that are common between OMAP2xxx and OMAP3 into
a separate file -- maybe something like powerdomain_2xxx_3xxx.o. Then
powerdomain2xxx.c and powerdomain3xxx.c can just put pointers into
pwrdm_functions in that file for the common stuff. Unfortunately, we
won't be able to keep those common functions static at that point.
> +obj-$(CONFIG_ARCH_OMAP4) += powerdomains44xx.o
> +
> # EMU peripherals
> obj-$(CONFIG_OMAP3_EMU) += emu.o
>
> diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
> index 76c531a..c68e989 100644
> --- a/arch/arm/mach-omap2/io.c
> +++ b/arch/arm/mach-omap2/io.c
> @@ -316,7 +316,10 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
> {
> u8 skip_setup_idle = 0;
>
> - pwrdm_init(powerdomains_omap, NULL);
> + if (cpu_is_omap24xx() || cpu_is_omap34xx())
> + pwrdm_init(powerdomains_omap, &omap2_pwrdm_functions);
> + else if (cpu_is_omap44xx())
> + pwrdm_init(powerdomains_omap, &omap4_pwrdm_functions);
> clkdm_init(clockdomains_omap, clkdm_autodeps);
> if (cpu_is_omap242x())
> omap2420_hwmod_init();
> diff --git a/arch/arm/mach-omap2/powerdomains.h b/arch/arm/mach-omap2/powerdomains.h
> index 105cbca..b25b989 100644
> --- a/arch/arm/mach-omap2/powerdomains.h
> +++ b/arch/arm/mach-omap2/powerdomains.h
> @@ -88,8 +88,16 @@ static struct powerdomain wkup_omap2_pwrdm = {
> .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
> };
>
> +extern struct pwrdm_functions omap2_pwrdm_functions;
> +#else
> +static struct pwrdm_functions omap2_pwrdm_functions;
> #endif
>
> +#ifdef CONFIG_ARCH_OMAP4
> +extern struct pwrdm_functions omap4_pwrdm_functions;
> +#else
> +static struct pwrdm_functions omap4_pwrdm_functions;
> +#endif
>
> /* As powerdomains are added or removed above, this list must also be changed */
> static struct powerdomain *powerdomains_omap[] __initdata = {
> diff --git a/arch/arm/mach-omap2/powerdomains2xxx.c b/arch/arm/mach-omap2/powerdomains2xxx.c
> new file mode 100644
> index 0000000..dfeb8af
> --- /dev/null
> +++ b/arch/arm/mach-omap2/powerdomains2xxx.c
> @@ -0,0 +1,53 @@
> +/*
> + * OMAP2 and OMAP3 powerdomain control
> + *
> + * Copyright (C) 2009-2010 Texas Instruments, Inc.
> + * Copyright (C) 2007-2009 Nokia Corporation
> + *
> + * Derived from mach-omap2/powerdomain.c written by Paul Walmsley
> + * Rajendra Nayak <rnayak@ti.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include <linux/io.h>
> +#include <linux/errno.h>
> +#include <linux/delay.h>
> +#include <plat/powerdomain.h>
> +#include <plat/prcm.h>
> +#include "powerdomains.h"
> +
> +static int omap2_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
> +{
> + prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
> + (pwrst << OMAP_POWERSTATE_SHIFT),
> + pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
> + return 0;
> +}
> +
> +static int omap2_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
> +{
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> + OMAP2_PM_PWSTCTRL, OMAP_POWERSTATE_MASK);
> +}
> +
> +static int omap2_pwrdm_read_pwrst(struct powerdomain *pwrdm)
> +{
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> + OMAP2_PM_PWSTST, OMAP_POWERSTATEST_MASK);
> +}
> +
> +static int omap2_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
> +{
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST,
> + OMAP3430_LASTPOWERSTATEENTERED_MASK);
> +}
this is OMAP3 only...
> +
> +struct pwrdm_functions omap2_pwrdm_functions = {
> + .pwrdm_set_next_pwrst = omap2_pwrdm_set_next_pwrst,
> + .pwrdm_read_next_pwrst = omap2_pwrdm_read_next_pwrst,
> + .pwrdm_read_pwrst = omap2_pwrdm_read_pwrst,
> + .pwrdm_read_prev_pwrst = omap2_pwrdm_read_prev_pwrst,
> +};
> diff --git a/arch/arm/mach-omap2/powerdomains44xx.c b/arch/arm/mach-omap2/powerdomains44xx.c
> new file mode 100644
> index 0000000..b3aaf9b
> --- /dev/null
> +++ b/arch/arm/mach-omap2/powerdomains44xx.c
> @@ -0,0 +1,53 @@
> +/*
> + * OMAP4 powerdomain control
> + *
> + * Copyright (C) 2009-2010 Texas Instruments, Inc.
> + * Copyright (C) 2007-2009 Nokia Corporation
> + *
> + * Derived from mach-omap2/powerdomain.c written by Paul Walmsley
> + * Rajendra Nayak <rnayak@ti.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include <linux/io.h>
> +#include <linux/errno.h>
> +#include <linux/delay.h>
> +#include <plat/powerdomain.h>
> +#include <plat/prcm.h>
> +#include "powerdomains.h"
> +
> +static int omap4_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
> +{
> + prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
> + (pwrst << OMAP_POWERSTATE_SHIFT),
> + pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
> + return 0;
> +}
> +
> +static int omap4_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
> +{
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> + OMAP4_PM_PWSTCTRL, OMAP_POWERSTATE_MASK);
> +}
> +
> +static int omap4_pwrdm_read_pwrst(struct powerdomain *pwrdm)
> +{
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> + OMAP4_PM_PWSTST, OMAP_POWERSTATEST_MASK);
> +}
> +
> +static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
> +{
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTST,
> + OMAP4430_LASTPOWERSTATEENTERED_MASK);
> +}
> +
> +struct pwrdm_functions omap4_pwrdm_functions = {
> + .pwrdm_set_next_pwrst = omap4_pwrdm_set_next_pwrst,
> + .pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst,
> + .pwrdm_read_pwrst = omap4_pwrdm_read_pwrst,
> + .pwrdm_read_prev_pwrst = omap4_pwrdm_read_prev_pwrst,
> +};
> diff --git a/arch/arm/plat-omap/powerdomain.c b/arch/arm/plat-omap/powerdomain.c
> index 9e2d712..73d6dad 100644
> --- a/arch/arm/plat-omap/powerdomain.c
> +++ b/arch/arm/plat-omap/powerdomain.c
> @@ -438,6 +438,8 @@ int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm)
> */
> int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
> {
> + int ret = -EINVAL;
> +
> if (!pwrdm)
> return -EINVAL;
>
> @@ -447,11 +449,10 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
> pr_debug("powerdomain: setting next powerstate for %s to %0x\n",
> pwrdm->name, pwrst);
>
> - prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
> - (pwrst << OMAP_POWERSTATE_SHIFT),
> - pwrdm->prcm_offs, pwrstctrl_reg_offs);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst)
> + ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst);
>
> - return 0;
> + return ret;
> }
>
> /**
> @@ -464,11 +465,15 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
> */
> int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
> {
> + int ret = -EINVAL;
> +
> if (!pwrdm)
> return -EINVAL;
>
> - return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> - pwrstctrl_reg_offs, OMAP_POWERSTATE_MASK);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_read_next_pwrst)
> + ret = arch_pwrdm->pwrdm_read_next_pwrst(pwrdm);
> +
> + return ret;
> }
>
> /**
> @@ -481,11 +486,15 @@ int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
> */
> int pwrdm_read_pwrst(struct powerdomain *pwrdm)
> {
> + int ret = -EINVAL;
> +
> if (!pwrdm)
> return -EINVAL;
>
> - return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> - pwrstst_reg_offs, OMAP_POWERSTATEST_MASK);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_read_pwrst)
> + ret = arch_pwrdm->pwrdm_read_pwrst(pwrdm);
> +
> + return ret;
> }
>
> /**
> @@ -498,11 +507,15 @@ int pwrdm_read_pwrst(struct powerdomain *pwrdm)
> */
> int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
> {
> + int ret = -EINVAL;
> +
> if (!pwrdm)
> return -EINVAL;
>
> - return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST,
> - OMAP3430_LASTPOWERSTATEENTERED_MASK);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_pwrst)
> + ret = arch_pwrdm->pwrdm_read_prev_pwrst(pwrdm);
> +
> + return ret;
> }
>
> /**
> --
> 1.7.0.4
>
- Paul
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 4/6] OMAP: powerdomain: Arch specific funcs for logic control
2010-11-16 15:38 ` [PATCH 4/6] OMAP: powerdomain: Arch specific funcs for logic control Rajendra Nayak
2010-11-16 15:38 ` [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control Rajendra Nayak
@ 2010-11-29 0:17 ` Paul Walmsley
1 sibling, 0 replies; 20+ messages in thread
From: Paul Walmsley @ 2010-11-29 0:17 UTC (permalink / raw)
To: Rajendra Nayak; +Cc: linux-omap, b-cousson, khilman
Some comments:
On Tue, 16 Nov 2010, Rajendra Nayak wrote:
> Define the following architecture specific funtions for omap2/3/4
> .pwrdm_set_logic_retst
> .pwrdm_read_logic_pwrst
> .pwrdm_read_prev_logic_pwrst
> .pwrdm_read_logic_retst
>
> Convert the platform-independent framework to call these functions.
>
> Signed-off-by: Rajendra Nayak <rnayak@ti.com>
> Cc: Paul Walmsley <paul@pwsan.com>
> Cc: Benoit Cousson <b-cousson@ti.com>
> Cc: Kevin Hilman <khilman@deeprootsystems.com>
> ---
> arch/arm/mach-omap2/powerdomains2xxx.c | 34 +++++++++++++++++++++
> arch/arm/mach-omap2/powerdomains44xx.c | 26 ++++++++++++++++
> arch/arm/plat-omap/powerdomain.c | 51 ++++++++++++++------------------
> 3 files changed, 82 insertions(+), 29 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/powerdomains2xxx.c b/arch/arm/mach-omap2/powerdomains2xxx.c
> index dfeb8af..779529d 100644
> --- a/arch/arm/mach-omap2/powerdomains2xxx.c
> +++ b/arch/arm/mach-omap2/powerdomains2xxx.c
> @@ -45,9 +45,43 @@ static int omap2_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
> OMAP3430_LASTPOWERSTATEENTERED_MASK);
> }
>
> +static int omap2_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
> +{
> + u32 v;
> +
> + v = pwrst << __ffs(OMAP3430_LOGICL1CACHERETSTATE_MASK);
> + prm_rmw_mod_reg_bits(OMAP3430_LOGICL1CACHERETSTATE_MASK, v,
> + pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
> +
> + return 0;
> +}
> +
> +static int omap2_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
> +{
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP2_PM_PWSTST,
> + OMAP3430_LOGICSTATEST_MASK);
> +}
Not present on OMAP2xxx, so, does not belong here.
> +
> +
> +static int omap2_pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm)
> +{
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST,
> + OMAP3430_LASTLOGICSTATEENTERED_MASK);
> +}
Not present on OMAP2xxx, so, does not belong here.
> +
> +static int omap2_pwrdm_read_logic_retst(struct powerdomain *pwrdm)
> +{
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL,
> + OMAP3430_LOGICSTATEST_MASK);
> +}
Not present on OMAP2xxx, so, does not belong here.
> +
> struct pwrdm_functions omap2_pwrdm_functions = {
> .pwrdm_set_next_pwrst = omap2_pwrdm_set_next_pwrst,
> .pwrdm_read_next_pwrst = omap2_pwrdm_read_next_pwrst,
> .pwrdm_read_pwrst = omap2_pwrdm_read_pwrst,
> .pwrdm_read_prev_pwrst = omap2_pwrdm_read_prev_pwrst,
> + .pwrdm_set_logic_retst = omap2_pwrdm_set_logic_retst,
> + .pwrdm_read_logic_pwrst = omap2_pwrdm_read_logic_pwrst,
> + .pwrdm_read_prev_logic_pwrst = omap2_pwrdm_read_prev_logic_pwrst,
> + .pwrdm_read_logic_retst = omap2_pwrdm_read_logic_retst,
> };
> diff --git a/arch/arm/mach-omap2/powerdomains44xx.c b/arch/arm/mach-omap2/powerdomains44xx.c
> index b3aaf9b..016a425 100644
> --- a/arch/arm/mach-omap2/powerdomains44xx.c
> +++ b/arch/arm/mach-omap2/powerdomains44xx.c
> @@ -45,9 +45,35 @@ static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
> OMAP4430_LASTPOWERSTATEENTERED_MASK);
> }
>
> +static int omap4_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
> +{
> + u32 v;
> +
> + v = pwrst << __ffs(OMAP4430_LOGICRETSTATE_MASK);
> + prm_rmw_mod_reg_bits(OMAP4430_LOGICRETSTATE_MASK, v,
> + pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
> +
> + return 0;
> +}
> +
> +static int omap4_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
> +{
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTST,
> + OMAP4430_LOGICSTATEST_MASK);
> +}
> +
> +static int omap4_pwrdm_read_logic_retst(struct powerdomain *pwrdm)
> +{
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL,
> + OMAP4430_LOGICRETSTATE_MASK);
> +}
> +
> struct pwrdm_functions omap4_pwrdm_functions = {
> .pwrdm_set_next_pwrst = omap4_pwrdm_set_next_pwrst,
> .pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst,
> .pwrdm_read_pwrst = omap4_pwrdm_read_pwrst,
> .pwrdm_read_prev_pwrst = omap4_pwrdm_read_prev_pwrst,
> + .pwrdm_set_logic_retst = omap4_pwrdm_set_logic_retst,
> + .pwrdm_read_logic_pwrst = omap4_pwrdm_read_logic_pwrst,
> + .pwrdm_read_logic_retst = omap4_pwrdm_read_logic_retst,
> };
> diff --git a/arch/arm/plat-omap/powerdomain.c b/arch/arm/plat-omap/powerdomain.c
> index 73d6dad..9177fbb 100644
> --- a/arch/arm/plat-omap/powerdomain.c
> +++ b/arch/arm/plat-omap/powerdomain.c
> @@ -531,7 +531,7 @@ int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
> */
> int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
> {
> - u32 v;
> + int ret = -EINVAL;
>
> if (!pwrdm)
> return -EINVAL;
> @@ -542,17 +542,10 @@ int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
> pr_debug("powerdomain: setting next logic powerstate for %s to %0x\n",
> pwrdm->name, pwrst);
>
> - /*
> - * The register bit names below may not correspond to the
> - * actual names of the bits in each powerdomain's register,
> - * but the type of value returned is the same for each
> - * powerdomain.
> - */
> - v = pwrst << __ffs(OMAP3430_LOGICL1CACHERETSTATE_MASK);
> - prm_rmw_mod_reg_bits(OMAP3430_LOGICL1CACHERETSTATE_MASK, v,
> - pwrdm->prcm_offs, pwrstctrl_reg_offs);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_set_logic_retst)
> + ret = arch_pwrdm->pwrdm_set_logic_retst(pwrdm, pwrst);
>
> - return 0;
> + return ret;
> }
>
> /**
> @@ -695,11 +688,15 @@ int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
> */
> int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
> {
> + int ret = -EINVAL;
> +
> if (!pwrdm)
> return -EINVAL;
>
> - return prm_read_mod_bits_shift(pwrdm->prcm_offs, pwrstst_reg_offs,
> - OMAP3430_LOGICSTATEST_MASK);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_read_logic_pwrst)
> + ret = arch_pwrdm->pwrdm_read_logic_pwrst(pwrdm);
> +
> + return ret;
> }
>
> /**
> @@ -712,17 +709,15 @@ int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
> */
> int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm)
> {
> + int ret = -EINVAL;
> +
> if (!pwrdm)
> return -EINVAL;
>
> - /*
> - * The register bit names below may not correspond to the
> - * actual names of the bits in each powerdomain's register,
> - * but the type of value returned is the same for each
> - * powerdomain.
> - */
> - return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST,
> - OMAP3430_LASTLOGICSTATEENTERED_MASK);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_logic_pwrst)
> + ret = arch_pwrdm->pwrdm_read_prev_logic_pwrst(pwrdm);
> +
> + return ret;
> }
>
> /**
> @@ -735,17 +730,15 @@ int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm)
> */
> int pwrdm_read_logic_retst(struct powerdomain *pwrdm)
> {
> + int ret = -EINVAL;
> +
> if (!pwrdm)
> return -EINVAL;
>
> - /*
> - * The register bit names below may not correspond to the
> - * actual names of the bits in each powerdomain's register,
> - * but the type of value returned is the same for each
> - * powerdomain.
> - */
> - return prm_read_mod_bits_shift(pwrdm->prcm_offs, pwrstctrl_reg_offs,
> - OMAP3430_LOGICSTATEST_MASK);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_read_logic_retst)
> + ret = arch_pwrdm->pwrdm_read_logic_retst(pwrdm);
> +
> + return ret;
> }
>
> /**
> --
> 1.7.0.4
>
- Paul
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control
2010-11-16 15:38 ` [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control Rajendra Nayak
2010-11-16 15:38 ` [PATCH 6/6] OMAP4: powerdomain: Add pwrdm_clear_all_prev_pwrst Rajendra Nayak
2010-11-16 16:09 ` [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control Thomas Petazzoni
@ 2010-11-29 0:28 ` Paul Walmsley
2 siblings, 0 replies; 20+ messages in thread
From: Paul Walmsley @ 2010-11-29 0:28 UTC (permalink / raw)
To: Rajendra Nayak; +Cc: linux-omap, b-cousson, khilman
Hi Rajendra,
On Tue, 16 Nov 2010, Rajendra Nayak wrote:
> Define the following architecture specific funtions for omap2/3/4
> .pwrdm_set_mem_onst
> .pwrdm_set_mem_retst
> .pwrdm_read_mem_pwrst
> .pwrdm_read_prev_mem_pwrst
> .pwrdm_read_mem_retst
> .pwrdm_clear_all_prev_pwrst
> .pwrdm_enable_hdwr_sar
> .pwrdm_disable_hdwr_sar
> .pwrdm_wait_transition
>
> Convert the platform-independent framework to call these functions.
>
> Signed-off-by: Rajendra Nayak <rnayak@ti.com>
> Cc: Paul Walmsley <paul@pwsan.com>
> Cc: Benoit Cousson <b-cousson@ti.com>
> Cc: Kevin Hilman <khilman@deeprootsystems.com>
> ---
> arch/arm/mach-omap2/Makefile | 2 +-
> arch/arm/mach-omap2/powerdomains.c | 114 ++++++++++++
> arch/arm/mach-omap2/powerdomains.h | 5 +
> arch/arm/mach-omap2/powerdomains2xxx.c | 129 ++++++++++++++
> arch/arm/mach-omap2/powerdomains44xx.c | 87 +++++++++
> arch/arm/plat-omap/powerdomain.c | 306 ++++++--------------------------
> 6 files changed, 391 insertions(+), 252 deletions(-)
> create mode 100644 arch/arm/mach-omap2/powerdomains.c
>
> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
> index 5f843fc..87a73b7 100644
> --- a/arch/arm/mach-omap2/Makefile
> +++ b/arch/arm/mach-omap2/Makefile
> @@ -4,7 +4,7 @@
>
> # Common support
> obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o pm.o \
> - common.o
> + common.o powerdomains.o
Please move this down to the newly-created "Powerdomains" section of the
Makefile.
>
> omap-2-3-common = irq.o sdrc.o prm2xxx_3xxx.o
> hwmod-common = omap_hwmod.o \
> diff --git a/arch/arm/mach-omap2/powerdomains.c b/arch/arm/mach-omap2/powerdomains.c
> new file mode 100644
> index 0000000..876bebe
> --- /dev/null
> +++ b/arch/arm/mach-omap2/powerdomains.c
Maybe call this file 'powerdomain-common.c' to be similar to file names
like prcm-common.c ?
> @@ -0,0 +1,114 @@
> +/*
> + * linux/arch/arm/mach-omap2/powerdomains.c
> + * Contains common powerdomain framework functions
> + *
> + * Copyright (C) 2010 Texas Instruments, Inc.
> + * Copyright (C) 2010 Nokia Corporation
> + *
> + * Derived from mach-omap2/powerdomain.c written by Paul Walmsley
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include <linux/errno.h>
> +#include <linux/kernel.h>
> +#include "pm.h"
> +#include "cm.h"
> +#include "cm-regbits-34xx.h"
> +#include "cm-regbits-44xx.h"
> +#include "prm-regbits-34xx.h"
> +#include "prm-regbits-44xx.h"
> +
> +/*
> + * OMAP3 and OMAP4 specific register bit initialisations
> + * Notice that the names here are not according to each power
> + * domain but the bit mapping used applies to all of them
> + */
> +/* OMAP3 and OMAP4 Memory Onstate Masks (common across all power domains) */
> +#define OMAP_MEM0_ONSTATE_MASK OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK
> +#define OMAP_MEM1_ONSTATE_MASK OMAP3430_L1FLATMEMONSTATE_MASK
> +#define OMAP_MEM2_ONSTATE_MASK OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK
> +#define OMAP_MEM3_ONSTATE_MASK OMAP3430_L2FLATMEMONSTATE_MASK
> +#define OMAP_MEM4_ONSTATE_MASK OMAP4430_OCP_NRET_BANK_ONSTATE_MASK
> +
> +/* OMAP3 and OMAP4 Memory Retstate Masks (common across all power domains) */
> +#define OMAP_MEM0_RETSTATE_MASK OMAP3430_SHAREDL1CACHEFLATRETSTATE_MASK
> +#define OMAP_MEM1_RETSTATE_MASK OMAP3430_L1FLATMEMRETSTATE_MASK
> +#define OMAP_MEM2_RETSTATE_MASK OMAP3430_SHAREDL2CACHEFLATRETSTATE_MASK
> +#define OMAP_MEM3_RETSTATE_MASK OMAP3430_L2FLATMEMRETSTATE_MASK
> +#define OMAP_MEM4_RETSTATE_MASK OMAP4430_OCP_NRET_BANK_RETSTATE_MASK
> +
> +/* OMAP3 and OMAP4 Memory Status bits */
> +#define OMAP_MEM0_STATEST_MASK OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK
> +#define OMAP_MEM1_STATEST_MASK OMAP3430_L1FLATMEMSTATEST_MASK
> +#define OMAP_MEM2_STATEST_MASK OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK
> +#define OMAP_MEM3_STATEST_MASK OMAP3430_L2FLATMEMSTATEST_MASK
> +#define OMAP_MEM4_STATEST_MASK OMAP4430_OCP_NRET_BANK_STATEST_MASK
> +
> +int _get_mem_bank_onstate_mask(u8 bank);
> +int _get_mem_bank_retst_mask(u8 bank);
> +int _get_mem_bank_stst_mask(u8 bank);
> +
> +/* Common Internal functions used across OMAP rev's*/
> +int _get_mem_bank_onstate_mask(u8 bank)
> +{
> + switch (bank) {
> + case 0:
> + return OMAP_MEM0_ONSTATE_MASK;
> + case 1:
> + return OMAP_MEM1_ONSTATE_MASK;
> + case 2:
> + return OMAP_MEM2_ONSTATE_MASK;
> + case 3:
> + return OMAP_MEM3_ONSTATE_MASK;
> + case 4:
> + return OMAP_MEM4_ONSTATE_MASK;
> + default:
> + WARN_ON(1); /* should never happen */
> + return -EEXIST;
> + }
> + return 0;
> +}
> +
> +int _get_mem_bank_retst_mask(u8 bank)
> +{
> + switch (bank) {
> + case 0:
> + return OMAP_MEM0_RETSTATE_MASK;
> + case 1:
> + return OMAP_MEM1_RETSTATE_MASK;
> + case 2:
> + return OMAP_MEM2_RETSTATE_MASK;
> + case 3:
> + return OMAP_MEM3_RETSTATE_MASK;
> + case 4:
> + return OMAP_MEM4_RETSTATE_MASK;
> + default:
> + WARN_ON(1); /* should never happen */
> + return -EEXIST;
> + }
> + return 0;
> +}
> +
> +int _get_mem_bank_stst_mask(u8 bank)
> +{
> + switch (bank) {
> + case 0:
> + return OMAP_MEM0_STATEST_MASK;
> + case 1:
> + return OMAP_MEM1_STATEST_MASK;
> + case 2:
> + return OMAP_MEM2_STATEST_MASK;
> + case 3:
> + return OMAP_MEM3_STATEST_MASK;
> + case 4:
> + return OMAP_MEM4_STATEST_MASK;
> + default:
> + WARN_ON(1); /* should never happen */
> + return -EEXIST;
> + }
> + return 0;
> +}
> +
> diff --git a/arch/arm/mach-omap2/powerdomains.h b/arch/arm/mach-omap2/powerdomains.h
> index b25b989..e6d0d5b 100644
> --- a/arch/arm/mach-omap2/powerdomains.h
> +++ b/arch/arm/mach-omap2/powerdomains.h
> @@ -99,6 +99,11 @@ extern struct pwrdm_functions omap4_pwrdm_functions;
> static struct pwrdm_functions omap4_pwrdm_functions;
> #endif
>
> +int _get_mem_bank_onstate_mask(u8 bank);
> +int _get_mem_bank_retst_mask(u8 bank);
> +int _get_mem_bank_stst_mask(u8 bank);
> +int _get_mem_bank_lastmemst_mask(u8 bank);
> +
> /* As powerdomains are added or removed above, this list must also be changed */
> static struct powerdomain *powerdomains_omap[] __initdata = {
>
> diff --git a/arch/arm/mach-omap2/powerdomains2xxx.c b/arch/arm/mach-omap2/powerdomains2xxx.c
> index 779529d..903701f 100644
> --- a/arch/arm/mach-omap2/powerdomains2xxx.c
> +++ b/arch/arm/mach-omap2/powerdomains2xxx.c
> @@ -19,6 +19,24 @@
> #include <plat/prcm.h>
> #include "powerdomains.h"
>
> +static int omap2_get_mem_bank_lastmemst_mask(u8 bank)
> +{
> + switch (bank) {
> + case 0:
> + return OMAP3430_LASTMEM1STATEENTERED_MASK;
> + case 1:
> + return OMAP3430_LASTMEM2STATEENTERED_MASK;
> + case 2:
> + return OMAP3430_LASTSHAREDL2CACHEFLATSTATEENTERED_MASK;
> + case 3:
> + return OMAP3430_LASTL2FLATMEMSTATEENTERED_MASK;
Since this file name is marked as being OMAP2xxx only (i.e.,
"powerdomains2xxx.c"), these should all be OMAP2* defines.
> + default:
> + WARN_ON(1); /* should never happen */
> + return -EEXIST;
> + }
> + return 0;
> +}
> +
> static int omap2_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
> {
> prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
> @@ -56,6 +74,32 @@ static int omap2_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
> return 0;
> }
>
> +static int omap2_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank,
> + u8 pwrst)
> +{
> + u32 m;
> +
> + m = _get_mem_bank_onstate_mask(bank);
> +
> + prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)),
> + pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
> +
> + return 0;
> +}
> +
> +static int omap2_pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank,
> + u8 pwrst)
> +{
> + u32 m;
> +
> + m = _get_mem_bank_retst_mask(bank);
> +
> + prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), pwrdm->prcm_offs,
> + OMAP2_PM_PWSTCTRL);
Minor comment here, it would be good if the style (indentation, line
breaks, etc) of the prm_rmw_mod_reg_bits() lines here matched the style of
the prm_rmw_mod_reg_bits() lines in omap2_pwrdm_set_mem_onst(), since
they are doing the same thing.
> +
> + return 0;
> +}
> +
> static int omap2_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
> {
> return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP2_PM_PWSTST,
> @@ -75,13 +119,98 @@ static int omap2_pwrdm_read_logic_retst(struct powerdomain *pwrdm)
> OMAP3430_LOGICSTATEST_MASK);
> }
>
> +static int omap2_pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
> +{
> + u32 m;
> +
> + m = _get_mem_bank_stst_mask(bank);
> +
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> + OMAP2_PM_PWSTST, m);
> +}
> +
> +static int omap2_pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
> +{
> + u32 m;
> +
> + m = omap2_get_mem_bank_lastmemst_mask(bank);
> +
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> + OMAP3430_PM_PREPWSTST, m);
> +}
OMAP3 only, so, does not belong here
> +
> +static int omap2_pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank)
> +{
> + u32 m;
> +
> + m = _get_mem_bank_retst_mask(bank);
> +
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> + OMAP2_PM_PWSTCTRL, m);
> +}
> +
> +static int omap2_pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
> +{
> + prm_write_mod_reg(0, pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST);
> + return 0;
> +}
OMAP3 only, so, does not belong here
> +
> +static int omap2_pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm)
> +{
> + return prm_rmw_mod_reg_bits(0, 1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT,
> + pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
> +}
OMAP3 only, so, does not belong here
> +
> +static int omap2_pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm)
> +{
> + return prm_rmw_mod_reg_bits(1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT, 0,
> + pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
> +}
OMAP3 only, so, does not belong here
> +
> +static int omap2_pwrdm_wait_transition(struct powerdomain *pwrdm)
> +{
> + u32 c = 0;
> +
> + /*
> + * REVISIT: pwrdm_wait_transition() may be better implemented
> + * via a callback and a periodic timer check -- how long do we expect
> + * powerdomain transitions to take?
> + */
> +
> + /* XXX Is this udelay() value meaningful? */
> + while ((prm_read_mod_reg(pwrdm->prcm_offs, OMAP2_PM_PWSTST) &
> + OMAP_INTRANSITION_MASK) &&
> + (c++ < PWRDM_TRANSITION_BAILOUT))
> + udelay(1);
> +
> + if (c > PWRDM_TRANSITION_BAILOUT) {
> + printk(KERN_ERR "powerdomain: waited too long for "
> + "powerdomain %s to complete transition\n", pwrdm->name);
> + return -EAGAIN;
> + }
> +
> + pr_debug("powerdomain: completed transition in %d loops\n", c);
> +
> + return 0;
> +}
> +
> +
> struct pwrdm_functions omap2_pwrdm_functions = {
> .pwrdm_set_next_pwrst = omap2_pwrdm_set_next_pwrst,
> .pwrdm_read_next_pwrst = omap2_pwrdm_read_next_pwrst,
> .pwrdm_read_pwrst = omap2_pwrdm_read_pwrst,
> .pwrdm_read_prev_pwrst = omap2_pwrdm_read_prev_pwrst,
> .pwrdm_set_logic_retst = omap2_pwrdm_set_logic_retst,
> + .pwrdm_set_mem_onst = omap2_pwrdm_set_mem_onst,
> + .pwrdm_set_mem_retst = omap2_pwrdm_set_mem_retst,
> .pwrdm_read_logic_pwrst = omap2_pwrdm_read_logic_pwrst,
> .pwrdm_read_prev_logic_pwrst = omap2_pwrdm_read_prev_logic_pwrst,
> .pwrdm_read_logic_retst = omap2_pwrdm_read_logic_retst,
> + .pwrdm_read_mem_pwrst = omap2_pwrdm_read_mem_pwrst,
> + .pwrdm_read_prev_mem_pwrst = omap2_pwrdm_read_prev_mem_pwrst,
> + .pwrdm_read_mem_retst = omap2_pwrdm_read_mem_retst,
> + .pwrdm_clear_all_prev_pwrst = omap2_pwrdm_clear_all_prev_pwrst,
> + .pwrdm_enable_hdwr_sar = omap2_pwrdm_enable_hdwr_sar,
> + .pwrdm_disable_hdwr_sar = omap2_pwrdm_disable_hdwr_sar,
> + .pwrdm_wait_transition = omap2_pwrdm_wait_transition,
> };
> diff --git a/arch/arm/mach-omap2/powerdomains44xx.c b/arch/arm/mach-omap2/powerdomains44xx.c
> index 016a425..79be2cd 100644
> --- a/arch/arm/mach-omap2/powerdomains44xx.c
> +++ b/arch/arm/mach-omap2/powerdomains44xx.c
> @@ -45,6 +45,14 @@ static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
> OMAP4430_LASTPOWERSTATEENTERED_MASK);
> }
>
> +static int omap4_pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
> +{
> + prm_rmw_mod_reg_bits(OMAP4430_LOWPOWERSTATECHANGE_MASK,
> + (1 << OMAP4430_LOWPOWERSTATECHANGE_SHIFT),
> + pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
> + return 0;
> +}
> +
> static int omap4_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
> {
> u32 v;
> @@ -56,6 +64,32 @@ static int omap4_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
> return 0;
> }
>
> +static int omap4_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank,
> + u8 pwrst)
> +{
> + u32 m;
> +
> + m = _get_mem_bank_onstate_mask(bank);
> +
> + prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)),
> + pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
> +
> + return 0;
> +}
> +
> +static int omap4_pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank,
> + u8 pwrst)
> +{
> + u32 m;
> +
> + m = _get_mem_bank_retst_mask(bank);
> +
> + prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), pwrdm->prcm_offs,
> + OMAP4_PM_PWSTCTRL);
As above, it would be good if the style (indentation, line
breaks, etc) of the prm_rmw_mod_reg_bits() lines here matched the style of
the prm_rmw_mod_reg_bits() lines in omap4_pwrdm_set_mem_onst(), since
they are doing the same thing.
> +
> + return 0;
> +}
> +
> static int omap4_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
> {
> return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTST,
> @@ -68,12 +102,65 @@ static int omap4_pwrdm_read_logic_retst(struct powerdomain *pwrdm)
> OMAP4430_LOGICRETSTATE_MASK);
> }
>
> +static int omap4_pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
> +{
> + u32 m;
> +
> + m = _get_mem_bank_stst_mask(bank);
> +
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> + OMAP4_PM_PWSTST, m);
> +}
> +
> +static int omap4_pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank)
> +{
> + u32 m;
> +
> + m = _get_mem_bank_retst_mask(bank);
> +
> + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> + OMAP4_PM_PWSTCTRL, m);
> +}
> +
> +static int omap4_pwrdm_wait_transition(struct powerdomain *pwrdm)
> +{
> + u32 c = 0;
> +
> + /*
> + * REVISIT: pwrdm_wait_transition() may be better implemented
> + * via a callback and a periodic timer check -- how long do we expect
> + * powerdomain transitions to take?
> + */
> +
> + /* XXX Is this udelay() value meaningful? */
> + while ((prm_read_mod_reg(pwrdm->prcm_offs, OMAP4_PM_PWSTST) &
> + OMAP_INTRANSITION_MASK) &&
> + (c++ < PWRDM_TRANSITION_BAILOUT))
> + udelay(1);
> +
> + if (c > PWRDM_TRANSITION_BAILOUT) {
> + printk(KERN_ERR "powerdomain: waited too long for "
> + "powerdomain %s to complete transition\n", pwrdm->name);
> + return -EAGAIN;
> + }
> +
> + pr_debug("powerdomain: completed transition in %d loops\n", c);
> +
> + return 0;
> +}
> +
> struct pwrdm_functions omap4_pwrdm_functions = {
> .pwrdm_set_next_pwrst = omap4_pwrdm_set_next_pwrst,
> .pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst,
> .pwrdm_read_pwrst = omap4_pwrdm_read_pwrst,
> .pwrdm_read_prev_pwrst = omap4_pwrdm_read_prev_pwrst,
> + .pwrdm_set_lowpwrstchange = omap4_pwrdm_set_lowpwrstchange,
> .pwrdm_set_logic_retst = omap4_pwrdm_set_logic_retst,
> .pwrdm_read_logic_pwrst = omap4_pwrdm_read_logic_pwrst,
> .pwrdm_read_logic_retst = omap4_pwrdm_read_logic_retst,
> + .pwrdm_read_mem_pwrst = omap4_pwrdm_read_mem_pwrst,
> + .pwrdm_read_mem_retst = omap4_pwrdm_read_mem_retst,
> + .pwrdm_set_mem_onst = omap4_pwrdm_set_mem_onst,
> + .pwrdm_set_mem_retst = omap4_pwrdm_set_mem_retst,
> + .pwrdm_wait_transition = omap4_pwrdm_wait_transition,
> };
> diff --git a/arch/arm/plat-omap/powerdomain.c b/arch/arm/plat-omap/powerdomain.c
> index 9177fbb..d8e29dc 100644
> --- a/arch/arm/plat-omap/powerdomain.c
> +++ b/arch/arm/plat-omap/powerdomain.c
> @@ -17,27 +17,9 @@
> #include <linux/kernel.h>
> #include <linux/module.h>
BTW, I think you can drop the above #include.
> #include <linux/types.h>
> -#include <linux/delay.h>
> -#include <linux/spinlock.h>
> #include <linux/list.h>
> -#include <linux/errno.h>
> -#include <linux/err.h>
> -#include <linux/io.h>
> -
> -#include <asm/atomic.h>
> -
> -#include "../mach-omap2/cm.h"
> -#include "../mach-omap2/cm-regbits-34xx.h"
> -#include "../mach-omap2/cm-regbits-44xx.h"
> -#include "../mach-omap2/prm.h"
> -#include "../mach-omap2/prm-regbits-34xx.h"
> -#include "../mach-omap2/prm-regbits-44xx.h"
> -
> -#include <plat/cpu.h>
> #include <plat/powerdomain.h>
> #include <plat/clockdomain.h>
> -#include <plat/prcm.h>
> -
> #include "../mach-omap2/pm.h"
>
> enum {
> @@ -45,37 +27,6 @@ enum {
> PWRDM_STATE_PREV,
> };
>
> -/* Variable holding value of the CPU dependent PWRSTCTRL Register Offset */
> -static u16 pwrstctrl_reg_offs;
> -
> -/* Variable holding value of the CPU dependent PWRSTST Register Offset */
> -static u16 pwrstst_reg_offs;
> -
> -/* OMAP3 and OMAP4 specific register bit initialisations
> - * Notice that the names here are not according to each power
> - * domain but the bit mapping used applies to all of them
> - */
> -
> -/* OMAP3 and OMAP4 Memory Onstate Masks (common across all power domains) */
> -#define OMAP_MEM0_ONSTATE_MASK OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK
> -#define OMAP_MEM1_ONSTATE_MASK OMAP3430_L1FLATMEMONSTATE_MASK
> -#define OMAP_MEM2_ONSTATE_MASK OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK
> -#define OMAP_MEM3_ONSTATE_MASK OMAP3430_L2FLATMEMONSTATE_MASK
> -#define OMAP_MEM4_ONSTATE_MASK OMAP4430_OCP_NRET_BANK_ONSTATE_MASK
> -
> -/* OMAP3 and OMAP4 Memory Retstate Masks (common across all power domains) */
> -#define OMAP_MEM0_RETSTATE_MASK OMAP3430_SHAREDL1CACHEFLATRETSTATE_MASK
> -#define OMAP_MEM1_RETSTATE_MASK OMAP3430_L1FLATMEMRETSTATE_MASK
> -#define OMAP_MEM2_RETSTATE_MASK OMAP3430_SHAREDL2CACHEFLATRETSTATE_MASK
> -#define OMAP_MEM3_RETSTATE_MASK OMAP3430_L2FLATMEMRETSTATE_MASK
> -#define OMAP_MEM4_RETSTATE_MASK OMAP4430_OCP_NRET_BANK_RETSTATE_MASK
> -
> -/* OMAP3 and OMAP4 Memory Status bits */
> -#define OMAP_MEM0_STATEST_MASK OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK
> -#define OMAP_MEM1_STATEST_MASK OMAP3430_L1FLATMEMSTATEST_MASK
> -#define OMAP_MEM2_STATEST_MASK OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK
> -#define OMAP_MEM3_STATEST_MASK OMAP3430_L2FLATMEMSTATEST_MASK
> -#define OMAP_MEM4_STATEST_MASK OMAP4430_OCP_NRET_BANK_STATEST_MASK
>
> /* pwrdm_list contains all registered struct powerdomains */
> static LIST_HEAD(pwrdm_list);
> @@ -224,18 +175,6 @@ void pwrdm_init(struct powerdomain **pwrdm_list, struct pwrdm_functions *custom_
> {
> struct powerdomain **p = NULL;
>
> - if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
> - pwrstctrl_reg_offs = OMAP2_PM_PWSTCTRL;
> - pwrstst_reg_offs = OMAP2_PM_PWSTST;
> - } else if (cpu_is_omap44xx()) {
> - pwrstctrl_reg_offs = OMAP4_PM_PWSTCTRL;
> - pwrstst_reg_offs = OMAP4_PM_PWSTST;
> - } else {
> - printk(KERN_ERR "Power Domain struct not supported for " \
> - "this CPU\n");
> - return;
> - }
> -
> if (!custom_funcs)
> WARN(1, "No custom pwrdm functions registered\n");
> else
> @@ -565,7 +504,7 @@ int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
> */
> int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
> {
> - u32 m;
> + int ret = -EINVAL;
>
> if (!pwrdm)
> return -EINVAL;
> @@ -579,37 +518,10 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
> pr_debug("powerdomain: setting next memory powerstate for domain %s "
> "bank %0x while pwrdm-ON to %0x\n", pwrdm->name, bank, pwrst);
>
> - /*
> - * The register bit names below may not correspond to the
> - * actual names of the bits in each powerdomain's register,
> - * but the type of value returned is the same for each
> - * powerdomain.
> - */
> - switch (bank) {
> - case 0:
> - m = OMAP_MEM0_ONSTATE_MASK;
> - break;
> - case 1:
> - m = OMAP_MEM1_ONSTATE_MASK;
> - break;
> - case 2:
> - m = OMAP_MEM2_ONSTATE_MASK;
> - break;
> - case 3:
> - m = OMAP_MEM3_ONSTATE_MASK;
> - break;
> - case 4:
> - m = OMAP_MEM4_ONSTATE_MASK;
> - break;
> - default:
> - WARN_ON(1); /* should never happen */
> - return -EEXIST;
> - }
> -
> - prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)),
> - pwrdm->prcm_offs, pwrstctrl_reg_offs);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_set_mem_onst)
> + ret = arch_pwrdm->pwrdm_set_mem_onst(pwrdm, bank, pwrst);
>
> - return 0;
> + return ret;
> }
>
> /**
> @@ -630,7 +542,7 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
> */
> int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
> {
> - u32 m;
> + int ret = -EINVAL;
>
> if (!pwrdm)
> return -EINVAL;
> @@ -644,37 +556,10 @@ int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
> pr_debug("powerdomain: setting next memory powerstate for domain %s "
> "bank %0x while pwrdm-RET to %0x\n", pwrdm->name, bank, pwrst);
>
> - /*
> - * The register bit names below may not correspond to the
> - * actual names of the bits in each powerdomain's register,
> - * but the type of value returned is the same for each
> - * powerdomain.
> - */
> - switch (bank) {
> - case 0:
> - m = OMAP_MEM0_RETSTATE_MASK;
> - break;
> - case 1:
> - m = OMAP_MEM1_RETSTATE_MASK;
> - break;
> - case 2:
> - m = OMAP_MEM2_RETSTATE_MASK;
> - break;
> - case 3:
> - m = OMAP_MEM3_RETSTATE_MASK;
> - break;
> - case 4:
> - m = OMAP_MEM4_RETSTATE_MASK;
> - break;
> - default:
> - WARN_ON(1); /* should never happen */
> - return -EEXIST;
> - }
> + if (arch_pwrdm && arch_pwrdm->pwrdm_set_mem_retst)
> + ret = arch_pwrdm->pwrdm_set_mem_retst(pwrdm, bank, pwrst);
>
> - prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), pwrdm->prcm_offs,
> - pwrstctrl_reg_offs);
> -
> - return 0;
> + return ret;
> }
>
> /**
> @@ -753,46 +638,21 @@ int pwrdm_read_logic_retst(struct powerdomain *pwrdm)
> */
> int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
> {
> - u32 m;
> + int ret = -EINVAL;
>
> if (!pwrdm)
> - return -EINVAL;
> + return ret;
>
> if (pwrdm->banks < (bank + 1))
> - return -EEXIST;
> + return ret;
>
> if (pwrdm->flags & PWRDM_HAS_MPU_QUIRK)
> bank = 1;
>
> - /*
> - * The register bit names below may not correspond to the
> - * actual names of the bits in each powerdomain's register,
> - * but the type of value returned is the same for each
> - * powerdomain.
> - */
> - switch (bank) {
> - case 0:
> - m = OMAP_MEM0_STATEST_MASK;
> - break;
> - case 1:
> - m = OMAP_MEM1_STATEST_MASK;
> - break;
> - case 2:
> - m = OMAP_MEM2_STATEST_MASK;
> - break;
> - case 3:
> - m = OMAP_MEM3_STATEST_MASK;
> - break;
> - case 4:
> - m = OMAP_MEM4_STATEST_MASK;
> - break;
> - default:
> - WARN_ON(1); /* should never happen */
> - return -EEXIST;
> - }
> + if (arch_pwrdm && arch_pwrdm->pwrdm_read_mem_pwrst)
> + ret = arch_pwrdm->pwrdm_read_mem_pwrst(pwrdm, bank);
>
> - return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> - pwrstst_reg_offs, m);
> + return ret;
> }
>
> /**
> @@ -808,43 +668,21 @@ int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
> */
> int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
> {
> - u32 m;
> + int ret = -EINVAL;
>
> if (!pwrdm)
> - return -EINVAL;
> + return ret;
>
> if (pwrdm->banks < (bank + 1))
> - return -EEXIST;
> + return ret;
>
> if (pwrdm->flags & PWRDM_HAS_MPU_QUIRK)
> bank = 1;
>
> - /*
> - * The register bit names below may not correspond to the
> - * actual names of the bits in each powerdomain's register,
> - * but the type of value returned is the same for each
> - * powerdomain.
> - */
> - switch (bank) {
> - case 0:
> - m = OMAP3430_LASTMEM1STATEENTERED_MASK;
> - break;
> - case 1:
> - m = OMAP3430_LASTMEM2STATEENTERED_MASK;
> - break;
> - case 2:
> - m = OMAP3430_LASTSHAREDL2CACHEFLATSTATEENTERED_MASK;
> - break;
> - case 3:
> - m = OMAP3430_LASTL2FLATMEMSTATEENTERED_MASK;
> - break;
> - default:
> - WARN_ON(1); /* should never happen */
> - return -EEXIST;
> - }
> + if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_mem_pwrst)
> + ret = arch_pwrdm->pwrdm_read_prev_mem_pwrst(pwrdm, bank);
>
> - return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> - OMAP3430_PM_PREPWSTST, m);
> + return ret;
> }
>
> /**
> @@ -859,43 +697,18 @@ int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
> */
> int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank)
> {
> - u32 m;
> + int ret = -EINVAL;
>
> if (!pwrdm)
> - return -EINVAL;
> + return ret;
>
> if (pwrdm->banks < (bank + 1))
> - return -EEXIST;
> + return ret;
>
> - /*
> - * The register bit names below may not correspond to the
> - * actual names of the bits in each powerdomain's register,
> - * but the type of value returned is the same for each
> - * powerdomain.
> - */
> - switch (bank) {
> - case 0:
> - m = OMAP_MEM0_RETSTATE_MASK;
> - break;
> - case 1:
> - m = OMAP_MEM1_RETSTATE_MASK;
> - break;
> - case 2:
> - m = OMAP_MEM2_RETSTATE_MASK;
> - break;
> - case 3:
> - m = OMAP_MEM3_RETSTATE_MASK;
> - break;
> - case 4:
> - m = OMAP_MEM4_RETSTATE_MASK;
> - break;
> - default:
> - WARN_ON(1); /* should never happen */
> - return -EEXIST;
> - }
> + if (arch_pwrdm && arch_pwrdm->pwrdm_read_mem_retst)
> + ret = arch_pwrdm->pwrdm_read_mem_retst(pwrdm, bank);
>
> - return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> - pwrstctrl_reg_offs, m);
> + return ret;
> }
>
> /**
> @@ -909,8 +722,10 @@ int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank)
> */
> int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
> {
> + int ret = -EINVAL;
> +
> if (!pwrdm)
> - return -EINVAL;
> + return ret;
>
> /*
> * XXX should get the powerdomain's current state here;
> @@ -920,9 +735,10 @@ int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
> pr_debug("powerdomain: clearing previous power state reg for %s\n",
> pwrdm->name);
>
> - prm_write_mod_reg(0, pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_clear_all_prev_pwrst)
> + ret = arch_pwrdm->pwrdm_clear_all_prev_pwrst(pwrdm);
>
> - return 0;
> + return ret;
> }
>
> /**
> @@ -938,19 +754,21 @@ int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
> */
> int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm)
> {
> + int ret = -EINVAL;
> +
> if (!pwrdm)
> - return -EINVAL;
> + return ret;
>
> if (!(pwrdm->flags & PWRDM_HAS_HDWR_SAR))
> - return -EINVAL;
> + return ret;
>
> pr_debug("powerdomain: %s: setting SAVEANDRESTORE bit\n",
> pwrdm->name);
>
> - prm_rmw_mod_reg_bits(0, 1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT,
> - pwrdm->prcm_offs, pwrstctrl_reg_offs);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_enable_hdwr_sar)
> + ret = arch_pwrdm->pwrdm_enable_hdwr_sar(pwrdm);
>
> - return 0;
> + return ret;
> }
>
> /**
> @@ -966,19 +784,21 @@ int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm)
> */
> int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm)
> {
> + int ret = -EINVAL;
> +
> if (!pwrdm)
> - return -EINVAL;
> + return ret;
>
> if (!(pwrdm->flags & PWRDM_HAS_HDWR_SAR))
> - return -EINVAL;
> + return ret;
>
> pr_debug("powerdomain: %s: clearing SAVEANDRESTORE bit\n",
> pwrdm->name);
>
> - prm_rmw_mod_reg_bits(1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT, 0,
> - pwrdm->prcm_offs, pwrstctrl_reg_offs);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_disable_hdwr_sar)
> + ret = arch_pwrdm->pwrdm_disable_hdwr_sar(pwrdm);
>
> - return 0;
> + return ret;
> }
>
> /**
> @@ -1005,6 +825,8 @@ bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm)
> */
> int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
> {
> + int ret = -EINVAL;
> +
> if (!pwrdm)
> return -EINVAL;
>
> @@ -1014,11 +836,10 @@ int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
> pr_debug("powerdomain: %s: setting LOWPOWERSTATECHANGE bit\n",
> pwrdm->name);
>
> - prm_rmw_mod_reg_bits(OMAP4430_LOWPOWERSTATECHANGE_MASK,
> - (1 << OMAP4430_LOWPOWERSTATECHANGE_SHIFT),
> - pwrdm->prcm_offs, pwrstctrl_reg_offs);
> + if (arch_pwrdm && arch_pwrdm->pwrdm_set_lowpwrstchange)
> + ret = arch_pwrdm->pwrdm_set_lowpwrstchange(pwrdm);
>
> - return 0;
> + return ret;
> }
>
> /**
> @@ -1033,32 +854,15 @@ int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
> */
> int pwrdm_wait_transition(struct powerdomain *pwrdm)
> {
> - u32 c = 0;
> + int ret = -EINVAL;
>
> if (!pwrdm)
> return -EINVAL;
>
> - /*
> - * REVISIT: pwrdm_wait_transition() may be better implemented
> - * via a callback and a periodic timer check -- how long do we expect
> - * powerdomain transitions to take?
> - */
> + if (arch_pwrdm && arch_pwrdm->pwrdm_wait_transition)
> + ret = arch_pwrdm->pwrdm_wait_transition(pwrdm);
>
> - /* XXX Is this udelay() value meaningful? */
> - while ((prm_read_mod_reg(pwrdm->prcm_offs, pwrstst_reg_offs) &
> - OMAP_INTRANSITION_MASK) &&
> - (c++ < PWRDM_TRANSITION_BAILOUT))
> - udelay(1);
> -
> - if (c > PWRDM_TRANSITION_BAILOUT) {
> - printk(KERN_ERR "powerdomain: waited too long for "
> - "powerdomain %s to complete transition\n", pwrdm->name);
> - return -EAGAIN;
> - }
> -
> - pr_debug("powerdomain: completed transition in %d loops\n", c);
> -
> - return 0;
> + return ret;
> }
>
> int pwrdm_state_switch(struct powerdomain *pwrdm)
> --
> 1.7.0.4
>
- Paul
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 6/6] OMAP4: powerdomain: Add pwrdm_clear_all_prev_pwrst
2010-11-16 15:38 ` [PATCH 6/6] OMAP4: powerdomain: Add pwrdm_clear_all_prev_pwrst Rajendra Nayak
@ 2010-11-29 0:31 ` Paul Walmsley
0 siblings, 0 replies; 20+ messages in thread
From: Paul Walmsley @ 2010-11-29 0:31 UTC (permalink / raw)
To: Rajendra Nayak; +Cc: linux-omap, b-cousson, khilman, Santosh Shilimkar
Hi
On Tue, 16 Nov 2010, Rajendra Nayak wrote:
> From: Santosh Shilimkar <santosh.shilimkar@ti.com>
>
> OMAP4430 ES2 has additional bitfields in PWRSTST register which help
> identify the previous power state entered by the powerdomain.
> Add pwrdm_clear_all_prev_pwrst api to support this.
OMAP3 has these also. Please add a similar function for OMAP3.
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> Signed-off-by: Rajendra Nayak <rnayak@ti.com>
> Cc: Paul Walmsley <paul@pwsan.com>
> Cc: Benoit Cousson <b-cousson@ti.com>
> Cc: Kevin Hilman <khilman@deeprootsystems.com>
> ---
> arch/arm/mach-omap2/powerdomains44xx.c | 9 +++++++++
> 1 files changed, 9 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/powerdomains44xx.c b/arch/arm/mach-omap2/powerdomains44xx.c
> index 79be2cd..0414e6a 100644
> --- a/arch/arm/mach-omap2/powerdomains44xx.c
> +++ b/arch/arm/mach-omap2/powerdomains44xx.c
> @@ -45,6 +45,14 @@ static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
> OMAP4430_LASTPOWERSTATEENTERED_MASK);
> }
>
> +static int omap4_pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
> +{
> + prm_rmw_mod_reg_bits(OMAP4430_LASTPOWERSTATEENTERED_MASK,
> + 0x3 << OMAP4430_LASTPOWERSTATEENTERED_SHIFT,
Please just use OMAP4430_LASTPOWERSTATEENTERED_MASK here again rather
than 0x3 << OMAP4430_LASTPOWERSTATEENTERED_SHIFT. This avoids introducing
a magic constant here.
> + pwrdm->prcm_offs, OMAP4_PM_PWSTST);
> + return 0;
> +}
> +
> static int omap4_pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
> {
> prm_rmw_mod_reg_bits(OMAP4430_LOWPOWERSTATECHANGE_MASK,
> @@ -154,6 +162,7 @@ struct pwrdm_functions omap4_pwrdm_functions = {
> .pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst,
> .pwrdm_read_pwrst = omap4_pwrdm_read_pwrst,
> .pwrdm_read_prev_pwrst = omap4_pwrdm_read_prev_pwrst,
> + .pwrdm_clear_all_prev_pwrst = omap4_pwrdm_clear_all_prev_pwrst,
> .pwrdm_set_lowpwrstchange = omap4_pwrdm_set_lowpwrstchange,
> .pwrdm_set_logic_retst = omap4_pwrdm_set_logic_retst,
> .pwrdm_read_logic_pwrst = omap4_pwrdm_read_logic_pwrst,
> --
> 1.7.0.4
>
- Paul
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 0/6] Split powerdomain framework into plat specific/independent
2010-11-16 15:38 [PATCH 0/6] Split powerdomain framework into plat specific/independent Rajendra Nayak
2010-11-16 15:38 ` [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap Rajendra Nayak
@ 2010-11-29 0:33 ` Paul Walmsley
2010-11-29 9:24 ` Rajendra Nayak
1 sibling, 1 reply; 20+ messages in thread
From: Paul Walmsley @ 2010-11-29 0:33 UTC (permalink / raw)
To: Rajendra Nayak; +Cc: linux-omap, b-cousson, khilman
Hi Rajendra,
As you've seen, I just did another review pass on these. All of the
review comments are pretty minor, although some of them will require
moving some of the functions to different files, mostly due to OMAP3
functions being present in an OMAP2xxx file.
Once those changes are made and the series reposted, I think these will be
good to merge.
regards
- Paul
^ permalink raw reply [flat|nested] 20+ messages in thread
* RE: [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap
2010-11-29 0:05 ` [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap Paul Walmsley
@ 2010-11-29 9:22 ` Rajendra Nayak
0 siblings, 0 replies; 20+ messages in thread
From: Rajendra Nayak @ 2010-11-29 9:22 UTC (permalink / raw)
To: Paul Walmsley; +Cc: linux-omap, b-cousson, khilman
Hi Paul,
> -----Original Message-----
> From: Paul Walmsley [mailto:paul@pwsan.com]
> Sent: Monday, November 29, 2010 5:36 AM
> To: Rajendra Nayak
> Cc: linux-omap@vger.kernel.org; b-cousson@ti.com;
khilman@deeprootsystems.com
> Subject: Re: [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from
mach-omap2 to plat-omap
>
> Hello Rajendra,
>
> some comments:
>
> On Tue, 16 Nov 2010, Rajendra Nayak wrote:
>
> > This is in preparation of splitting the powerdomain framework into
> > platform-independent part (for all omaps) and platform-specific
> > parts.
> > The platform-independent code would reside in plat-omap/powerdomain.c
> > and the platform-specific code will resides in
> > mach-omap2/powerdomain-xxxx.c files.
>
> Since we're not implementing powerdomain support for OMAP1 right now, is
> there any reason why we can't just leave the powerdomain-common stuff in
> the mach-omap2/ directory for now?
There was no other reason why I moved these in plat-omap
except to keep the split similar to the way clock framework
is done. I should be able to keep this in mach-omap2 itself.
Regards,
Rajendra
>
> > Some of the hacks to include header files are done to make sure the
> > patch compiles and works fine. These hacks will be removed in the
> > subsequent patches.
> >
> > Signed-off-by: Rajendra Nayak <rnayak@ti.com>
> > Cc: Paul Walmsley <paul@pwsan.com>
> > Cc: Benoit Cousson <b-cousson@ti.com>
> > Cc: Kevin Hilman <khilman@deeprootsystems.com>
> > ---
> > arch/arm/mach-omap2/Makefile | 2 +-
> > arch/arm/plat-omap/Makefile | 6 +++---
> > arch/arm/{mach-omap2 => plat-omap}/powerdomain.c | 14
+++++++-------
> > 3 files changed, 11 insertions(+), 11 deletions(-)
> > rename arch/arm/{mach-omap2 => plat-omap}/powerdomain.c (99%)
> >
> > diff --git a/arch/arm/mach-omap2/Makefile
b/arch/arm/mach-omap2/Makefile
> > index 60e51bc..4bfadc5 100644
> > --- a/arch/arm/mach-omap2/Makefile
> > +++ b/arch/arm/mach-omap2/Makefile
> > @@ -9,7 +9,7 @@ obj-y := id.o io.o control.o mux.o devices.o serial.o
gpmc.o timer-gp.o pm.o \
> > omap-2-3-common = irq.o sdrc.o
prm2xxx_3xxx.o
> > hwmod-common = omap_hwmod.o \
> > omap_hwmod_common_data.o
> > -prcm-common = prcm.o powerdomain.o
> > +prcm-common = prcm.o
> > clock-common = clock.o
clock_common_data.o \
> > clockdomain.o clkt_dpll.o \
> > clkt_clksel.o
> > diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile
> > index a4a1285..424a9ae 100644
> > --- a/arch/arm/plat-omap/Makefile
> > +++ b/arch/arm/plat-omap/Makefile
> > @@ -13,9 +13,9 @@ obj- :=
> > obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o
> >
> > # omap_device support (OMAP2+ only at the moment)
> > -obj-$(CONFIG_ARCH_OMAP2) += omap_device.o
> > -obj-$(CONFIG_ARCH_OMAP3) += omap_device.o
> > -obj-$(CONFIG_ARCH_OMAP4) += omap_device.o
> > +obj-$(CONFIG_ARCH_OMAP2) += omap_device.o powerdomain.o
> > +obj-$(CONFIG_ARCH_OMAP3) += omap_device.o powerdomain.o
> > +obj-$(CONFIG_ARCH_OMAP4) += omap_device.o powerdomain.o
>
> The powerdomain code isn't directly related to the omap_device code, so
> please create a new section in the mach-omap2/Makefile for this stuff.
> Perhaps something like:
>
> # OMAP PRCM powerdomain support
> obj-$(CONFIG_ARCH_OMAP2) += powerdomain.o
> obj-$(CONFIG_ARCH_OMAP3) += powerdomain.o
> obj-$(CONFIG_ARCH_OMAP4) += powerdomain.o
>
> >
> > obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o
> > obj-$(CONFIG_OMAP_IOMMU) += iommu.o iovmm.o
> > diff --git a/arch/arm/mach-omap2/powerdomain.c
b/arch/arm/plat-omap/powerdomain.c
> > similarity index 99%
> > rename from arch/arm/mach-omap2/powerdomain.c
> > rename to arch/arm/plat-omap/powerdomain.c
>
> (see the first comment)
>
> > index 6527ec3..9204799 100644
> > --- a/arch/arm/mach-omap2/powerdomain.c
> > +++ b/arch/arm/plat-omap/powerdomain.c
>
> > @@ -26,19 +26,19 @@
> >
> > #include <asm/atomic.h>
> >
> > -#include "cm.h"
> > -#include "cm-regbits-34xx.h"
> > -#include "cm-regbits-44xx.h"
> > -#include "prm.h"
> > -#include "prm-regbits-34xx.h"
> > -#include "prm-regbits-44xx.h"
> > +#include "../mach-omap2/cm.h"
> > +#include "../mach-omap2/cm-regbits-34xx.h"
> > +#include "../mach-omap2/cm-regbits-44xx.h"
> > +#include "../mach-omap2/prm.h"
> > +#include "../mach-omap2/prm-regbits-34xx.h"
> > +#include "../mach-omap2/prm-regbits-44xx.h"
> >
> > #include <plat/cpu.h>
> > #include <plat/powerdomain.h>
> > #include <plat/clockdomain.h>
> > #include <plat/prcm.h>
> >
> > -#include "pm.h"
> > +#include "../mach-omap2/pm.h"
> >
> > enum {
> > PWRDM_STATE_NOW = 0,
> > --
> > 1.7.0.4
> >
>
>
> - Paul
^ permalink raw reply [flat|nested] 20+ messages in thread
* RE: [PATCH 0/6] Split powerdomain framework into plat specific/independent
2010-11-29 0:33 ` [PATCH 0/6] Split powerdomain framework into plat specific/independent Paul Walmsley
@ 2010-11-29 9:24 ` Rajendra Nayak
0 siblings, 0 replies; 20+ messages in thread
From: Rajendra Nayak @ 2010-11-29 9:24 UTC (permalink / raw)
To: Paul Walmsley; +Cc: linux-omap, b-cousson, khilman
Hi Paul,
> -----Original Message-----
> From: Paul Walmsley [mailto:paul@pwsan.com]
> Sent: Monday, November 29, 2010 6:04 AM
> To: Rajendra Nayak
> Cc: linux-omap@vger.kernel.org; b-cousson@ti.com;
khilman@deeprootsystems.com
> Subject: Re: [PATCH 0/6] Split powerdomain framework into plat
specific/independent
>
> Hi Rajendra,
>
> As you've seen, I just did another review pass on these. All of the
> review comments are pretty minor, although some of them will require
> moving some of the functions to different files, mostly due to OMAP3
> functions being present in an OMAP2xxx file.
Thanks for the review. I'll do the necessary changes and post
another version of the series soon.
Regards,
Rajendra
>
> Once those changes are made and the series reposted, I think these will
be
> good to merge.
>
> regards
>
> - Paul
^ permalink raw reply [flat|nested] 20+ messages in thread
* RE: [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control
2010-11-29 0:14 ` [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control Paul Walmsley
@ 2010-11-30 15:47 ` Rajendra Nayak
0 siblings, 0 replies; 20+ messages in thread
From: Rajendra Nayak @ 2010-11-30 15:47 UTC (permalink / raw)
To: Paul Walmsley; +Cc: linux-omap, Benoit Cousson, khilman
Hi Paul,
> -----Original Message-----
> From: Paul Walmsley [mailto:paul@pwsan.com]
> Sent: Monday, November 29, 2010 5:45 AM
> To: Rajendra Nayak
> Cc: linux-omap@vger.kernel.org; b-cousson@ti.com;
khilman@deeprootsystems.com
> Subject: Re: [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for
state control
>
> Some comments below:
>
> On Tue, 16 Nov 2010, Rajendra Nayak wrote:
>
> > Define the following architecture specific funtions for omap2/3/4
> > .pwrdm_set_next_pwrst
> > .pwrdm_read_next_pwrst
> > .pwrdm_read_pwrst
> > .pwrdm_read_prev_pwrst
> >
> > Convert the platform-independent framework to call these functions.
> >
> > Signed-off-by: Rajendra Nayak <rnayak@ti.com>
> > Cc: Paul Walmsley <paul@pwsan.com>
> > Cc: Benoit Cousson <b-cousson@ti.com>
> > Cc: Kevin Hilman <khilman@deeprootsystems.com>
> > ---
> > arch/arm/mach-omap2/Makefile | 5 +++
> > arch/arm/mach-omap2/io.c | 5 ++-
> > arch/arm/mach-omap2/powerdomains.h | 8 +++++
> > arch/arm/mach-omap2/powerdomains2xxx.c | 53
++++++++++++++++++++++++++++++++
> > arch/arm/mach-omap2/powerdomains44xx.c | 53
++++++++++++++++++++++++++++++++
> > arch/arm/plat-omap/powerdomain.c | 33 ++++++++++++++------
> > 6 files changed, 146 insertions(+), 11 deletions(-)
> > create mode 100644 arch/arm/mach-omap2/powerdomains2xxx.c
> > create mode 100644 arch/arm/mach-omap2/powerdomains44xx.c
> >
> > diff --git a/arch/arm/mach-omap2/Makefile
b/arch/arm/mach-omap2/Makefile
> > index 4bfadc5..5f843fc 100644
> > --- a/arch/arm/mach-omap2/Makefile
> > +++ b/arch/arm/mach-omap2/Makefile
> > @@ -94,6 +94,11 @@ obj-$(CONFIG_ARCH_OMAP2430) +=
omap_hwmod_2430_data.o
> > obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_3xxx_data.o
> > obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o
> >
> > +#powerdomain framework
> > +obj-$(CONFIG_ARCH_OMAP2) += powerdomains2xxx.o
> > +obj-$(CONFIG_ARCH_OMAP3) += powerdomains2xxx.o
>
> We're going to need a separate file for OMAP3, because there are some
> PRCM powerdomain features that are not present on OMAP2.
>
> Please move the functions that are common between OMAP2xxx and OMAP3
into
> a separate file -- maybe something like powerdomain_2xxx_3xxx.o. Then
> powerdomain2xxx.c and powerdomain3xxx.c can just put pointers into
> pwrdm_functions in that file for the common stuff. Unfortunately, we
> won't be able to keep those common functions static at that point.
For this in the latest series that I posted, I have created just one
file powerdomain2xxx_3xxx.c which has all OMAP2xxx/3 common
funcs (named as omap2_pwrdm_*) and all OMAP3 specific funcs
as well (named as omap3_pwrdm_*).
There are different pwrdm_functions defined one for omap2
and another for omap3 (which was anyway needed to support
multiomap even if I did split them in separate files).
That way I have kept all functions static as well.
Let me know if you still feel we might need a
powerdomain2xxx.c and powerdomain3xxx.c additionally.
Regards,
Rajendra
>
> > +obj-$(CONFIG_ARCH_OMAP4) += powerdomains44xx.o
> > +
> > # EMU peripherals
> > obj-$(CONFIG_OMAP3_EMU) += emu.o
> >
> > diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
> > index 76c531a..c68e989 100644
> > --- a/arch/arm/mach-omap2/io.c
> > +++ b/arch/arm/mach-omap2/io.c
> > @@ -316,7 +316,10 @@ void __init omap2_init_common_hw(struct
omap_sdrc_params *sdrc_cs0,
> > {
> > u8 skip_setup_idle = 0;
> >
> > - pwrdm_init(powerdomains_omap, NULL);
> > + if (cpu_is_omap24xx() || cpu_is_omap34xx())
> > + pwrdm_init(powerdomains_omap, &omap2_pwrdm_functions);
> > + else if (cpu_is_omap44xx())
> > + pwrdm_init(powerdomains_omap, &omap4_pwrdm_functions);
> > clkdm_init(clockdomains_omap, clkdm_autodeps);
> > if (cpu_is_omap242x())
> > omap2420_hwmod_init();
> > diff --git a/arch/arm/mach-omap2/powerdomains.h
b/arch/arm/mach-omap2/powerdomains.h
> > index 105cbca..b25b989 100644
> > --- a/arch/arm/mach-omap2/powerdomains.h
> > +++ b/arch/arm/mach-omap2/powerdomains.h
> > @@ -88,8 +88,16 @@ static struct powerdomain wkup_omap2_pwrdm = {
> > .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
CHIP_IS_OMAP3430),
> > };
> >
> > +extern struct pwrdm_functions omap2_pwrdm_functions;
> > +#else
> > +static struct pwrdm_functions omap2_pwrdm_functions;
> > #endif
> >
> > +#ifdef CONFIG_ARCH_OMAP4
> > +extern struct pwrdm_functions omap4_pwrdm_functions;
> > +#else
> > +static struct pwrdm_functions omap4_pwrdm_functions;
> > +#endif
> >
> > /* As powerdomains are added or removed above, this list must also be
changed */
> > static struct powerdomain *powerdomains_omap[] __initdata = {
> > diff --git a/arch/arm/mach-omap2/powerdomains2xxx.c
b/arch/arm/mach-omap2/powerdomains2xxx.c
> > new file mode 100644
> > index 0000000..dfeb8af
> > --- /dev/null
> > +++ b/arch/arm/mach-omap2/powerdomains2xxx.c
> > @@ -0,0 +1,53 @@
> > +/*
> > + * OMAP2 and OMAP3 powerdomain control
> > + *
> > + * Copyright (C) 2009-2010 Texas Instruments, Inc.
> > + * Copyright (C) 2007-2009 Nokia Corporation
> > + *
> > + * Derived from mach-omap2/powerdomain.c written by Paul Walmsley
> > + * Rajendra Nayak <rnayak@ti.com>
> > + *
> > + * This program is free software; you can redistribute it and/or
modify
> > + * it under the terms of the GNU General Public License version 2 as
> > + * published by the Free Software Foundation.
> > + */
> > +
> > +#include <linux/io.h>
> > +#include <linux/errno.h>
> > +#include <linux/delay.h>
> > +#include <plat/powerdomain.h>
> > +#include <plat/prcm.h>
> > +#include "powerdomains.h"
> > +
> > +static int omap2_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8
pwrst)
> > +{
> > + prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
> > + (pwrst << OMAP_POWERSTATE_SHIFT),
> > + pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
> > + return 0;
> > +}
> > +
> > +static int omap2_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
> > +{
> > + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> > + OMAP2_PM_PWSTCTRL, OMAP_POWERSTATE_MASK);
> > +}
> > +
> > +static int omap2_pwrdm_read_pwrst(struct powerdomain *pwrdm)
> > +{
> > + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> > + OMAP2_PM_PWSTST, OMAP_POWERSTATEST_MASK);
> > +}
> > +
> > +static int omap2_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
> > +{
> > + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
OMAP3430_PM_PREPWSTST,
> > + OMAP3430_LASTPOWERSTATEENTERED_MASK);
> > +}
>
> this is OMAP3 only...
>
> > +
> > +struct pwrdm_functions omap2_pwrdm_functions = {
> > + .pwrdm_set_next_pwrst = omap2_pwrdm_set_next_pwrst,
> > + .pwrdm_read_next_pwrst = omap2_pwrdm_read_next_pwrst,
> > + .pwrdm_read_pwrst = omap2_pwrdm_read_pwrst,
> > + .pwrdm_read_prev_pwrst = omap2_pwrdm_read_prev_pwrst,
> > +};
> > diff --git a/arch/arm/mach-omap2/powerdomains44xx.c
b/arch/arm/mach-omap2/powerdomains44xx.c
> > new file mode 100644
> > index 0000000..b3aaf9b
> > --- /dev/null
> > +++ b/arch/arm/mach-omap2/powerdomains44xx.c
> > @@ -0,0 +1,53 @@
> > +/*
> > + * OMAP4 powerdomain control
> > + *
> > + * Copyright (C) 2009-2010 Texas Instruments, Inc.
> > + * Copyright (C) 2007-2009 Nokia Corporation
> > + *
> > + * Derived from mach-omap2/powerdomain.c written by Paul Walmsley
> > + * Rajendra Nayak <rnayak@ti.com>
> > + *
> > + * This program is free software; you can redistribute it and/or
modify
> > + * it under the terms of the GNU General Public License version 2 as
> > + * published by the Free Software Foundation.
> > + */
> > +
> > +#include <linux/io.h>
> > +#include <linux/errno.h>
> > +#include <linux/delay.h>
> > +#include <plat/powerdomain.h>
> > +#include <plat/prcm.h>
> > +#include "powerdomains.h"
> > +
> > +static int omap4_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8
pwrst)
> > +{
> > + prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
> > + (pwrst << OMAP_POWERSTATE_SHIFT),
> > + pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
> > + return 0;
> > +}
> > +
> > +static int omap4_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
> > +{
> > + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> > + OMAP4_PM_PWSTCTRL, OMAP_POWERSTATE_MASK);
> > +}
> > +
> > +static int omap4_pwrdm_read_pwrst(struct powerdomain *pwrdm)
> > +{
> > + return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> > + OMAP4_PM_PWSTST, OMAP_POWERSTATEST_MASK);
> > +}
> > +
> > +static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
> > +{
> > + return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTST,
> > + OMAP4430_LASTPOWERSTATEENTERED_MASK);
> > +}
> > +
> > +struct pwrdm_functions omap4_pwrdm_functions = {
> > + .pwrdm_set_next_pwrst = omap4_pwrdm_set_next_pwrst,
> > + .pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst,
> > + .pwrdm_read_pwrst = omap4_pwrdm_read_pwrst,
> > + .pwrdm_read_prev_pwrst = omap4_pwrdm_read_prev_pwrst,
> > +};
> > diff --git a/arch/arm/plat-omap/powerdomain.c
b/arch/arm/plat-omap/powerdomain.c
> > index 9e2d712..73d6dad 100644
> > --- a/arch/arm/plat-omap/powerdomain.c
> > +++ b/arch/arm/plat-omap/powerdomain.c
> > @@ -438,6 +438,8 @@ int pwrdm_get_mem_bank_count(struct powerdomain
*pwrdm)
> > */
> > int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
> > {
> > + int ret = -EINVAL;
> > +
> > if (!pwrdm)
> > return -EINVAL;
> >
> > @@ -447,11 +449,10 @@ int pwrdm_set_next_pwrst(struct powerdomain
*pwrdm, u8 pwrst)
> > pr_debug("powerdomain: setting next powerstate for %s to %0x\n",
> > pwrdm->name, pwrst);
> >
> > - prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
> > - (pwrst << OMAP_POWERSTATE_SHIFT),
> > - pwrdm->prcm_offs, pwrstctrl_reg_offs);
> > + if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst)
> > + ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst);
> >
> > - return 0;
> > + return ret;
> > }
> >
> > /**
> > @@ -464,11 +465,15 @@ int pwrdm_set_next_pwrst(struct powerdomain
*pwrdm, u8 pwrst)
> > */
> > int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
> > {
> > + int ret = -EINVAL;
> > +
> > if (!pwrdm)
> > return -EINVAL;
> >
> > - return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> > - pwrstctrl_reg_offs,
OMAP_POWERSTATE_MASK);
> > + if (arch_pwrdm && arch_pwrdm->pwrdm_read_next_pwrst)
> > + ret = arch_pwrdm->pwrdm_read_next_pwrst(pwrdm);
> > +
> > + return ret;
> > }
> >
> > /**
> > @@ -481,11 +486,15 @@ int pwrdm_read_next_pwrst(struct powerdomain
*pwrdm)
> > */
> > int pwrdm_read_pwrst(struct powerdomain *pwrdm)
> > {
> > + int ret = -EINVAL;
> > +
> > if (!pwrdm)
> > return -EINVAL;
> >
> > - return prm_read_mod_bits_shift(pwrdm->prcm_offs,
> > - pwrstst_reg_offs,
OMAP_POWERSTATEST_MASK);
> > + if (arch_pwrdm && arch_pwrdm->pwrdm_read_pwrst)
> > + ret = arch_pwrdm->pwrdm_read_pwrst(pwrdm);
> > +
> > + return ret;
> > }
> >
> > /**
> > @@ -498,11 +507,15 @@ int pwrdm_read_pwrst(struct powerdomain *pwrdm)
> > */
> > int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
> > {
> > + int ret = -EINVAL;
> > +
> > if (!pwrdm)
> > return -EINVAL;
> >
> > - return prm_read_mod_bits_shift(pwrdm->prcm_offs,
OMAP3430_PM_PREPWSTST,
> > -
OMAP3430_LASTPOWERSTATEENTERED_MASK);
> > + if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_pwrst)
> > + ret = arch_pwrdm->pwrdm_read_prev_pwrst(pwrdm);
> > +
> > + return ret;
> > }
> >
> > /**
> > --
> > 1.7.0.4
> >
>
>
> - Paul
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2010-11-30 15:47 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-16 15:38 [PATCH 0/6] Split powerdomain framework into plat specific/independent Rajendra Nayak
2010-11-16 15:38 ` [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap Rajendra Nayak
2010-11-16 15:38 ` [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code Rajendra Nayak
2010-11-16 15:38 ` [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control Rajendra Nayak
2010-11-16 15:38 ` [PATCH 4/6] OMAP: powerdomain: Arch specific funcs for logic control Rajendra Nayak
2010-11-16 15:38 ` [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control Rajendra Nayak
2010-11-16 15:38 ` [PATCH 6/6] OMAP4: powerdomain: Add pwrdm_clear_all_prev_pwrst Rajendra Nayak
2010-11-29 0:31 ` Paul Walmsley
2010-11-16 16:09 ` [PATCH 5/6] OMAP: powerdomain: Arch specific funcs for mem control Thomas Petazzoni
2010-11-29 0:28 ` Paul Walmsley
2010-11-29 0:17 ` [PATCH 4/6] OMAP: powerdomain: Arch specific funcs for logic control Paul Walmsley
2010-11-29 0:14 ` [PATCH 3/6] OMAP: powerdomain: Arch specific funcs for state control Paul Walmsley
2010-11-30 15:47 ` Rajendra Nayak
2010-11-16 16:11 ` [PATCH 2/6] OMAP: powerdomain: Infrastructure to put arch specific code Thomas Petazzoni
2010-11-22 6:21 ` Rajendra Nayak
2010-11-29 0:07 ` Paul Walmsley
2010-11-29 0:05 ` [PATCH 1/6] OMAP: powerdomain: Move powerdomain.c from mach-omap2 to plat-omap Paul Walmsley
2010-11-29 9:22 ` Rajendra Nayak
2010-11-29 0:33 ` [PATCH 0/6] Split powerdomain framework into plat specific/independent Paul Walmsley
2010-11-29 9:24 ` Rajendra Nayak
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).