MLK-16118-2 power: Add PD device lookup interface to power domain uclass
authorYe Li <ye.li@nxp.com>
Wed, 2 Aug 2017 02:47:53 +0000 (21:47 -0500)
committerYe Li <ye.li@nxp.com>
Fri, 24 May 2019 08:48:14 +0000 (01:48 -0700)
Add power_domain_lookup_name interface to power domain uclass to find
a power domain device by its DTB node name, not using its associated
client device.

Through this interface, we can operate the power domain devices directly.
This is needed for non-DM drivers.

Reviewed-by: Peng Fan <peng.fan@nxp.com>
Signed-off-by: Ye Li <ye.li@nxp.com>
(cherry picked from commit f5fcb1903d935c2e1037b6a1fc61f1c290818727)
(cherry picked from commit 68b9f562f46bbecdd11643bacc70fe3cd2e1243c)

drivers/power/domain/power-domain-uclass.c
include/power-domain.h

index 2ea0ff2..04b19f3 100644 (file)
@@ -2,11 +2,12 @@
 /*
  * Copyright (c) 2016, NVIDIA CORPORATION.
  */
-
 #include <common.h>
 #include <dm.h>
 #include <power-domain.h>
 #include <power-domain-uclass.h>
+#include <dm/uclass-internal.h>
+#include <dm/device-internal.h>
 
 static inline struct power_domain_ops *power_domain_dev_ops(struct udevice *dev)
 {
@@ -28,6 +29,45 @@ static int power_domain_of_xlate_default(struct power_domain *power_domain,
        return 0;
 }
 
+int power_domain_lookup_name(const char *name, struct power_domain *power_domain)
+{
+       struct udevice *dev;
+       struct power_domain_ops *ops;
+       int ret;
+
+       debug("%s(power_domain=%p name=%s)\n", __func__, power_domain, name);
+
+       ret = uclass_find_device_by_name(UCLASS_POWER_DOMAIN, name, &dev);
+       if (!ret) {
+               /* Probe the dev */
+               device_probe(dev);
+               ops = power_domain_dev_ops(dev);
+
+               power_domain->dev = dev;
+               if (ops->of_xlate)
+                       ret = ops->of_xlate(power_domain, NULL);
+               else
+                       ret = power_domain_of_xlate_default(power_domain, NULL);
+               if (ret) {
+                       debug("of_xlate() failed: %d\n", ret);
+                       return ret;
+               }
+
+               ret = ops->request(power_domain);
+               if (ret) {
+                       debug("ops->request() failed: %d\n", ret);
+                       return ret;
+               }
+
+               debug("%s ok: %s\n", __func__, dev->name);
+
+               return 0;
+       }
+
+       printf("%s fail: %s, ret = %d\n", __func__, name, ret);
+       return -EINVAL;
+}
+
 int power_domain_get_by_index(struct udevice *dev,
                              struct power_domain *power_domain, int index)
 {
index 0099605..f13c238 100644 (file)
@@ -1,6 +1,8 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2016, NVIDIA CORPORATION.
+ * Copyright 2017 NXP
+ *
  */
 
 #ifndef _POWER_DOMAIN_H
@@ -74,6 +76,19 @@ struct power_domain {
        unsigned long id;
 };
 
+/**
+ * power_domain_lookup_name - Lookup the power domain device by name and request it.
+ *
+ * This looks up and requests a provider power domain by using its device name. This
+ * skip the associated client device, but directly get the power domain device.
+ *
+ * @name:        The power domain device's name.
+ * @power_domain        A pointer to a power domain struct to initialize.
+ * @return 0 if OK, or a negative error code.
+ */
+
+int power_domain_lookup_name(const char *name, struct power_domain *power_domain);
+
 /**
  * power_domain_get - Get/request the power domain for a device.
  *