OMAP: powerdomain: Arch specific funcs for state control
authorRajendra Nayak <rnayak@ti.com>
Wed, 22 Dec 2010 03:01:18 +0000 (20:01 -0700)
committerPaul Walmsley <paul@pwsan.com>
Wed, 22 Dec 2010 03:01:18 +0000 (20:01 -0700)
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>
[paul@pwsan.com: remove remaining static allocations in powerdomains.h file;
 remove path in file header comments, rearranged Makefile changes]
Signed-off-by: Paul Walmsley <paul@pwsan.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
Reviewed-by: Kevin Hilman <khilman@deeprootsystems.com>
Tested-by: Kevin Hilman <khilman@deeprootsystems.com>
Tested-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Tested-by: Rajendra Nayak <rnayak@ti.com>
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/powerdomain.c
arch/arm/mach-omap2/powerdomain2xxx_3xxx.c [new file with mode: 0644]
arch/arm/mach-omap2/powerdomain44xx.c [new file with mode: 0644]
arch/arm/mach-omap2/powerdomains.h [new file with mode: 0644]
arch/arm/mach-omap2/powerdomains_data.c

index 00c27ebf709dccd1cc4b303e63209e9bb540879e..c43948c8d54333a2bd27dc41545d5baf89aa804f 100644 (file)
@@ -79,7 +79,12 @@ obj-$(CONFIG_ARCH_OMAP4)             += prcm.o cm4xxx.o
 
 # OMAP powerdomain framework
 powerdomain-common                     += powerdomain.o powerdomains_data.o
-obj-y                                  += $(powerdomain-common)
+obj-$(CONFIG_ARCH_OMAP2)               += $(powerdomain-common) \
+                                          powerdomain2xxx_3xxx.o
+obj-$(CONFIG_ARCH_OMAP3)               += $(powerdomain-common) \
+                                          powerdomain2xxx_3xxx.o
+obj-$(CONFIG_ARCH_OMAP4)               += $(powerdomain-common) \
+                                          powerdomain44xx.o
 
 # Clock framework
 obj-$(CONFIG_ARCH_OMAP2)               += $(clock-common) clock2xxx.o \
index 3aa3eb3354165de03374d7d593efff22e8617c9a..0ae1ebf4e97492d65b5efed6090c200e7ecc0a82 100644 (file)
@@ -439,6 +439,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;
 
@@ -448,11 +450,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;
 }
 
 /**
@@ -465,11 +466,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;
 }
 
 /**
@@ -482,11 +487,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;
 }
 
 /**
@@ -499,11 +508,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;
 }
 
 /**
diff --git a/arch/arm/mach-omap2/powerdomain2xxx_3xxx.c b/arch/arm/mach-omap2/powerdomain2xxx_3xxx.c
new file mode 100644 (file)
index 0000000..a25dd64
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * 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/prcm.h>
+#include "prm.h"
+#include "prm-regbits-34xx.h"
+#include "powerdomains.h"
+
+/* Common functions across OMAP2 and OMAP3 */
+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);
+}
+
+/* Applicable only for OMAP3. Not supported on OMAP2 */
+static int omap3_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
+{
+       return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP3430_PM_PREPWSTST,
+                               OMAP3430_LASTPOWERSTATEENTERED_MASK);
+}
+
+struct pwrdm_ops omap2_pwrdm_operations = {
+       .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,
+};
+
+struct pwrdm_ops omap3_pwrdm_operations = {
+       .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  = omap3_pwrdm_read_prev_pwrst,
+};
diff --git a/arch/arm/mach-omap2/powerdomain44xx.c b/arch/arm/mach-omap2/powerdomain44xx.c
new file mode 100644 (file)
index 0000000..5dc337c
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * 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 "prm.h"
+#include "prm-regbits-44xx.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_ops omap4_pwrdm_operations = {
+       .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/mach-omap2/powerdomains.h b/arch/arm/mach-omap2/powerdomains.h
new file mode 100644 (file)
index 0000000..e57bc41
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * OMAP2+ powerdomain prototypes
+ *
+ * Copyright (C) 2010 Texas Instruments, Inc.
+ *
+ * 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.
+ */
+
+#ifndef ARCH_ARM_MACH_OMAP2_POWERDOMAINS
+#define ARCH_ARM_MACH_OMAP2_POWERDOMAINS
+
+#include <plat/powerdomain.h>
+
+extern struct pwrdm_ops omap2_pwrdm_operations;
+extern struct pwrdm_ops omap3_pwrdm_operations;
+extern struct pwrdm_ops omap4_pwrdm_operations;
+
+#endif /* ARCH_ARM_MACH_OMAP2_POWERDOMAINS */
index bf5b39be8240a0a13690e9786a61ce3e3cf008eb..29690c64bf1e2311c02fd72937f948c50f445c8d 100644 (file)
@@ -55,6 +55,7 @@
 #include "powerdomains24xx.h"
 #include "powerdomains34xx.h"
 #include "powerdomains44xx.h"
+#include "powerdomains.h"
 
 /* OMAP2/3-common powerdomains */
 
@@ -149,5 +150,10 @@ static struct powerdomain *powerdomains_omap[] __initdata = {
 
 void pwrdm_fw_init(void)
 {
-       pwrdm_init(powerdomains_omap, NULL);
+       if (cpu_is_omap24xx())
+               pwrdm_init(powerdomains_omap, &omap2_pwrdm_operations);
+       else if (cpu_is_omap34xx())
+               pwrdm_init(powerdomains_omap, &omap3_pwrdm_operations);
+       else if (cpu_is_omap44xx())
+               pwrdm_init(powerdomains_omap, &omap4_pwrdm_operations);
 }