OMAP2+: powerdomain: add voltage domain lookup during register
authorKevin Hilman <khilman@ti.com>
Wed, 16 Mar 2011 22:52:47 +0000 (15:52 -0700)
committerKevin Hilman <khilman@ti.com>
Thu, 15 Sep 2011 18:39:10 +0000 (11:39 -0700)
When a powerdomain is registered, lookup the voltage domain by name
and keep a pointer to the containing voltagedomain in the powerdomain
structure.

Modeled after similar method between powerdomain and clockdomain layers.

Signed-off-by: Kevin Hilman <khilman@ti.com>
arch/arm/mach-omap2/powerdomain.c
arch/arm/mach-omap2/powerdomain.h
arch/arm/mach-omap2/voltage.h

index 896cb4c5eb1a1c766453a04470c776859d842943..984457d612b71cf4027fb70f4ab6e07871ebf9a3 100644 (file)
@@ -77,6 +77,7 @@ static struct powerdomain *_pwrdm_lookup(const char *name)
 static int _pwrdm_register(struct powerdomain *pwrdm)
 {
        int i;
+       struct voltagedomain *voltdm;
 
        if (!pwrdm || !pwrdm->name)
                return -EINVAL;
@@ -91,6 +92,14 @@ static int _pwrdm_register(struct powerdomain *pwrdm)
        if (_pwrdm_lookup(pwrdm->name))
                return -EEXIST;
 
+       voltdm = voltdm_lookup(pwrdm->voltdm.name);
+       if (!voltdm) {
+               pr_err("powerdomain: %s: voltagedomain %s does not exist\n",
+                      pwrdm->name, pwrdm->voltdm.name);
+               return -EINVAL;
+       }
+       pwrdm->voltdm.ptr = voltdm;
+
        list_add(&pwrdm->node, &pwrdm_list);
 
        /* Initialize the powerdomain's state counter */
@@ -426,6 +435,18 @@ int pwrdm_for_each_clkdm(struct powerdomain *pwrdm,
        return ret;
 }
 
+/**
+ * pwrdm_get_voltdm - return a ptr to the voltdm that this pwrdm resides in
+ * @pwrdm: struct powerdomain *
+ *
+ * Return a pointer to the struct voltageomain that the specified powerdomain
+ * @pwrdm exists in.
+ */
+struct voltagedomain *pwrdm_get_voltdm(struct powerdomain *pwrdm)
+{
+       return pwrdm->voltdm.ptr;
+}
+
 /**
  * pwrdm_get_mem_bank_count - get number of memory banks in this powerdomain
  * @pwrdm: struct powerdomain *
index 898d4fc0d1608cb11bc545036cd06315e3eefb47..d8a7f914d9b369870a7cfd1b66f298bc57120163 100644 (file)
@@ -183,6 +183,7 @@ int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
 int pwrdm_for_each_clkdm(struct powerdomain *pwrdm,
                         int (*fn)(struct powerdomain *pwrdm,
                                   struct clockdomain *clkdm));
+struct voltagedomain *pwrdm_get_voltdm(struct powerdomain *pwrdm);
 
 int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm);
 
index cacd76e1e2c3ffd4ca4cff3c5054a212df6eb142..966aa888034508991a6e2320a467cba49049cb33 100644 (file)
@@ -186,4 +186,5 @@ extern void omap44xx_voltagedomains_init(void);
 
 struct voltagedomain *voltdm_lookup(const char *name);
 void voltdm_init(struct voltagedomain **voltdm_list);
+int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm);
 #endif