summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYe Li <ye.li@nxp.com>2017-08-01 21:47:53 -0500
committerYe Li <ye.li@nxp.com>2018-04-27 02:32:31 -0700
commit68b9f562f46bbecdd11643bacc70fe3cd2e1243c (patch)
tree015d79d2093a265c9d0972d355773a3100db774f
parent5fa971841027db30f11aa5828b68610aaa203bf7 (diff)
MLK-16118-2 power: Add PD device lookup interface to power domain uclass
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)
-rw-r--r--drivers/power/domain/power-domain-uclass.c43
-rw-r--r--include/power-domain.h14
2 files changed, 56 insertions, 1 deletions
diff --git a/drivers/power/domain/power-domain-uclass.c b/drivers/power/domain/power-domain-uclass.c
index 1847a492a37..ddb365742d9 100644
--- a/drivers/power/domain/power-domain-uclass.c
+++ b/drivers/power/domain/power-domain-uclass.c
@@ -3,11 +3,12 @@
*
* SPDX-License-Identifier: GPL-2.0
*/
-
#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>
DECLARE_GLOBAL_DATA_PTR;
@@ -31,6 +32,46 @@ 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(struct udevice *dev, struct power_domain *power_domain)
{
struct ofnode_phandle_args args;
diff --git a/include/power-domain.h b/include/power-domain.h
index 10999790b56..7fa85640f98 100644
--- a/include/power-domain.h
+++ b/include/power-domain.h
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2016, NVIDIA CORPORATION.
+ * Copyright 2017 NXP
*
* SPDX-License-Identifier: GPL-2.0
*/
@@ -76,6 +77,19 @@ struct power_domain {
};
/**
+ * 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.
*
* This looks up and requests a power domain. Each device is assumed to have