power domain: Add support for multiple powerdomains per device
authorLokesh Vutla <lokeshvutla@ti.com>
Mon, 27 Aug 2018 10:27:44 +0000 (15:57 +0530)
committerTom Rini <trini@konsulko.com>
Tue, 11 Sep 2018 12:32:55 +0000 (08:32 -0400)
There are cases where there are more than one power domain
attached to the device inorder to get the device functional.
So add support for enabling power domain based on the index.

Reviewed-by: Tom Rini <trini@konsulko.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
drivers/power/domain/power-domain-uclass.c
include/power-domain.h

index 9e9ec4f41925426b60535147f85f753e1b2bf45e..2ea0ff24c7ae4651a4dfd0e11099da90449e4c6f 100644 (file)
@@ -28,7 +28,8 @@ static int power_domain_of_xlate_default(struct power_domain *power_domain,
        return 0;
 }
 
-int power_domain_get(struct udevice *dev, struct power_domain *power_domain)
+int power_domain_get_by_index(struct udevice *dev,
+                             struct power_domain *power_domain, int index)
 {
        struct ofnode_phandle_args args;
        int ret;
@@ -38,7 +39,8 @@ int power_domain_get(struct udevice *dev, struct power_domain *power_domain)
        debug("%s(dev=%p, power_domain=%p)\n", __func__, dev, power_domain);
 
        ret = dev_read_phandle_with_args(dev, "power-domains",
-                                        "#power-domain-cells", 0, 0, &args);
+                                        "#power-domain-cells", 0, index,
+                                        &args);
        if (ret) {
                debug("%s: dev_read_phandle_with_args failed: %d\n",
                      __func__, ret);
@@ -73,6 +75,11 @@ int power_domain_get(struct udevice *dev, struct power_domain *power_domain)
        return 0;
 }
 
+int power_domain_get(struct udevice *dev, struct power_domain *power_domain)
+{
+       return power_domain_get_by_index(dev, power_domain, 0);
+}
+
 int power_domain_free(struct power_domain *power_domain)
 {
        struct power_domain_ops *ops = power_domain_dev_ops(power_domain->dev);
index a558fbbdb21ab87b7465188875c66d3195a0cfc4..00996057b0d4f8fcf86e369baab01c371a3f9aca 100644 (file)
@@ -97,6 +97,27 @@ int power_domain_get(struct udevice *dev, struct power_domain *power_domain)
 }
 #endif
 
+/**
+ * power_domain_get_by_index - Get the indexed power domain for a device.
+ *
+ * @dev:               The client device.
+ * @power_domain:      A pointer to a power domain struct to initialize.
+ * @index:             Power domain index to be powered on.
+ *
+ * @return 0 if OK, or a negative error code.
+ */
+#if CONFIG_IS_ENABLED(POWER_DOMAIN)
+int power_domain_get_by_index(struct udevice *dev,
+                             struct power_domain *power_domain, int index);
+#else
+static inline
+int power_domain_get_by_index(struct udevice *dev,
+                             struct power_domain *power_domain, int index)
+{
+       return -ENOSYS;
+}
+#endif
+
 /**
  * power_domain_free - Free a previously requested power domain.
  *