diff mbox series

[V2,2/6] imx8: power: Add PD device lookup interface to power domain uclass

Message ID 20200504131654.17085-2-peng.fan@nxp.com
State Accepted
Commit 8c0a1c6de84387ad6264d4ea6fa03e2214908960
Headers show
Series [V2,1/6] dt-bindings: imx_rsrc: add SC_R_NONE | expand

Commit Message

Peng Fan May 4, 2020, 1:16 p.m. UTC
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.

Modified from Ye's NXP downstream patch

only for legacy imx8 power domain driver, since we have not migrated
to use new power domain driver.

Signed-off-by: Ye Li <ye.li at nxp.com>
Signed-off-by: Peng Fan <peng.fan at nxp.com>
---
 arch/arm/include/asm/arch-imx8/sys_proto.h      |  7 +++++++
 drivers/power/domain/imx8-power-domain-legacy.c | 28 +++++++++++++++++++++++++
 2 files changed, 35 insertions(+)

Comments

Stefano Babic May 11, 2020, 10:17 a.m. UTC | #1
> 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.
> Modified from Ye's NXP downstream patch
> only for legacy imx8 power domain driver, since we have not migrated
> to use new power domain driver.
> Signed-off-by: Ye Li <ye.li at nxp.com>
> Signed-off-by: Peng Fan <peng.fan at nxp.com>
Applied to u-boot-imx, master, thanks !

Best regards,
Stefano Babic
diff mbox series

Patch

diff --git a/arch/arm/include/asm/arch-imx8/sys_proto.h b/arch/arm/include/asm/arch-imx8/sys_proto.h
index 0e981ae950..fc33e6ed18 100644
--- a/arch/arm/include/asm/arch-imx8/sys_proto.h
+++ b/arch/arm/include/asm/arch-imx8/sys_proto.h
@@ -5,6 +5,11 @@ 
 
 #include <asm/arch/sci/sci.h>
 #include <asm/mach-imx/sys_proto.h>
+#include <asm/arch/power-domain.h>
+#include <dm/platdata.h>
+#include <dm/device-internal.h>
+#include <dm/device.h>
+#include <power-domain.h>
 #include <linux/types.h>
 
 struct pass_over_info_t {
@@ -21,3 +26,5 @@  void build_info(void);
 enum boot_device get_boot_device(void);
 int print_bootinfo(void);
 int sc_pm_setup_uart(sc_rsrc_t uart_rsrc, sc_pm_clock_rate_t clk_rate);
+int imx8_power_domain_lookup_name(const char *name,
+				  struct power_domain *power_domain);
diff --git a/drivers/power/domain/imx8-power-domain-legacy.c b/drivers/power/domain/imx8-power-domain-legacy.c
index 6f01a60b34..2c479744d3 100644
--- a/drivers/power/domain/imx8-power-domain-legacy.c
+++ b/drivers/power/domain/imx8-power-domain-legacy.c
@@ -19,6 +19,34 @@  struct imx8_power_domain_priv {
 	bool state_on;
 };
 
+int imx8_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_get_device_by_name(UCLASS_POWER_DOMAIN, name, &dev);
+	if (ret) {
+		printf("%s fail: %s, ret = %d\n", __func__, name, ret);
+		return ret;
+	}
+
+	ops = (struct power_domain_ops *)dev->driver->ops;
+	power_domain->dev = dev;
+	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;
+}
+
 static int imx8_power_domain_request(struct power_domain *power_domain)
 {
 	debug("%s(power_domain=%p)\n", __func__, power_domain);