mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH master 1/3] drivers: power: ignore power domains with barebox,allow-dummy
@ 2022-07-30  9:52 Ahmad Fatoum
  2022-07-30  9:52 ` [PATCH master 2/3] ARM: i.MX8MM: assume USBOTG power domains to be powered Ahmad Fatoum
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Ahmad Fatoum @ 2022-07-30  9:52 UTC (permalink / raw)
  To: barebox; +Cc: lst, mfe, Ahmad Fatoum

With deep probe enabled, we can know for certain whether a driver will
be found for a device or not. This allows us to specially handle devices
that lack a driver. We already do that for regulators, where the device
tree can specify barebox,allow-dummy-supply for regulators that are
known to be enabled by the time barebox runs. Add the same functionality
for power domains as well.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 drivers/base/power.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/drivers/base/power.c b/drivers/base/power.c
index 96cac1a091f3..4a206051b137 100644
--- a/drivers/base/power.c
+++ b/drivers/base/power.c
@@ -139,14 +139,32 @@ static struct generic_pm_domain *genpd_get_from_provider(
 					struct of_phandle_args *genpdspec)
 {
 	struct generic_pm_domain *genpd = ERR_PTR(-ENOENT);
+	struct device_node *node = genpdspec->np;
 	struct of_genpd_provider *provider;
+	int ret;
 
 	if (!genpdspec)
 		return ERR_PTR(-EINVAL);
 
+	ret = of_device_ensure_probed(node);
+	if (ret) {
+		struct device_node *parent;
+
+		/*
+		 * If "barebox,allow-dummy" property is set for power domain
+		 * provider, assume it's turned on.
+		 */
+		parent = of_get_parent(node);
+		if (of_get_property(node, "barebox,allow-dummy", NULL) ||
+		    of_get_property(parent, "barebox,allow-dummy", NULL))
+			return NULL;
+
+		return ERR_PTR(ret);
+	}
+
 	/* Check if we have such a provider in our array */
 	list_for_each_entry(provider, &of_genpd_providers, link) {
-		if (provider->node == genpdspec->np)
+		if (provider->node == node)
 			genpd = provider->xlate(genpdspec, provider->data);
 		if (!IS_ERR(genpd))
 			break;
@@ -175,7 +193,7 @@ static int genpd_power_on(struct generic_pm_domain *genpd, unsigned int depth)
 {
 	int ret;
 
-	if (genpd_status_on(genpd))
+	if (!genpd || genpd_status_on(genpd))
 		return 0;
 
 	ret = _genpd_power_on(genpd, true);
@@ -211,7 +229,7 @@ static int __genpd_dev_pm_attach(struct device_d *dev, struct device_node *np,
 		return (ret == -ENOENT) ? -EPROBE_DEFER : ret;
 	}
 
-	dev_dbg(dev, "adding to PM domain %s\n", pd->name);
+	dev_dbg(dev, "adding to PM domain %s\n", pd ? pd->name : "dummy");
 
 	if (power_on)
 		ret = genpd_power_on(pd, 0);
-- 
2.30.2




^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH master 2/3] ARM: i.MX8MM: assume USBOTG power domains to be powered
  2022-07-30  9:52 [PATCH master 1/3] drivers: power: ignore power domains with barebox,allow-dummy Ahmad Fatoum
@ 2022-07-30  9:52 ` Ahmad Fatoum
  2022-07-30  9:52 ` [PATCH master 3/3] ARM: i.MX8MN: " Ahmad Fatoum
  2022-08-05  5:23 ` [PATCH master 1/3] drivers: power: ignore power domains with barebox,allow-dummy Ahmad Fatoum
  2 siblings, 0 replies; 4+ messages in thread
From: Ahmad Fatoum @ 2022-07-30  9:52 UTC (permalink / raw)
  To: barebox; +Cc: lst, mfe, Ahmad Fatoum

When i.MX8MM support was first added, upstream device tree did list no
power domains. Now it does and we defer probe of USB indefinitely
because we have no power domain driver. If we need to do PCI on the
i.MX8MM in barebox, there'll likely be no way around importing the power
domain driver, but for USB which used to work, only thing we need to do
is ignore the new power domain specification. Do so by adding the
new barebox,allow-dummy property to the new known-enabled power domains.

Fixes: 3f2f5980d517 ("dts: update to v5.16-rc1")
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
Issue observed on i.MX8MM based board with deep probe enabled.
---
 arch/arm/dts/imx8mm.dtsi | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/arch/arm/dts/imx8mm.dtsi b/arch/arm/dts/imx8mm.dtsi
index 78bbacb2b1b2..cdf212820594 100644
--- a/arch/arm/dts/imx8mm.dtsi
+++ b/arch/arm/dts/imx8mm.dtsi
@@ -5,6 +5,14 @@
 	};
 };
 
+&pgc_otg1 {
+	barebox,allow-dummy;
+};
+
+&pgc_otg2 {
+	barebox,allow-dummy;
+};
+
 &src {
 	compatible = "fsl,imx8mm-src", "fsl,imx8mq-src", "syscon", "simple-mfd";
 
-- 
2.30.2




^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH master 3/3] ARM: i.MX8MN: assume USBOTG power domains to be powered
  2022-07-30  9:52 [PATCH master 1/3] drivers: power: ignore power domains with barebox,allow-dummy Ahmad Fatoum
  2022-07-30  9:52 ` [PATCH master 2/3] ARM: i.MX8MM: assume USBOTG power domains to be powered Ahmad Fatoum
@ 2022-07-30  9:52 ` Ahmad Fatoum
  2022-08-05  5:23 ` [PATCH master 1/3] drivers: power: ignore power domains with barebox,allow-dummy Ahmad Fatoum
  2 siblings, 0 replies; 4+ messages in thread
From: Ahmad Fatoum @ 2022-07-30  9:52 UTC (permalink / raw)
  To: barebox; +Cc: lst, mfe, Ahmad Fatoum

When i.MX8MN support was first added, upstream device tree did list no
power domains. Now it does and we defer probe of USB indefinitely
because we have no power domain driver. If we need to do PCI on the
i.MX8MM in barebox, there'll likely be no way around importing the power
domain driver, but for USB which used to work, only thing we need to do
is ignore the new power domain specification. Do so by adding the
new barebox,allow-dummy property to the new known-enabled power domain.

Fixes: b01786baa849 ("dts: update to v5.18-rc1")
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
Untested on actual i.MX8MN HW, but close enough i.MX8MM. i.MX8MP is
also affect since v5.19-rc1 sync, but we have no USB support there yet.
Power domains also seems more complicated on 8MPlus where we have a
blk-ctrl power domain driver in-between usbotg and gpcv2.
---
 arch/arm/dts/imx8mn-evk.dtsi | 2 ++
 arch/arm/dts/imx8mn.dtsi     | 5 +++++
 2 files changed, 7 insertions(+)
 create mode 100644 arch/arm/dts/imx8mn.dtsi

diff --git a/arch/arm/dts/imx8mn-evk.dtsi b/arch/arm/dts/imx8mn-evk.dtsi
index ceeb5f8b9384..aeb357007991 100644
--- a/arch/arm/dts/imx8mn-evk.dtsi
+++ b/arch/arm/dts/imx8mn-evk.dtsi
@@ -4,6 +4,8 @@
  * Copyright (C) 2017 Pengutronix, Lucas Stach <kernel@pengutronix.de>
  */
 
+#include "imx8mn.dtsi"
+
 / {
 	chosen {
 		environment-sd {
diff --git a/arch/arm/dts/imx8mn.dtsi b/arch/arm/dts/imx8mn.dtsi
new file mode 100644
index 000000000000..176125e73bce
--- /dev/null
+++ b/arch/arm/dts/imx8mn.dtsi
@@ -0,0 +1,5 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+
+&pgc_otg1 {
+	barebox,allow-dummy;
+};
-- 
2.30.2




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH master 1/3] drivers: power: ignore power domains with barebox,allow-dummy
  2022-07-30  9:52 [PATCH master 1/3] drivers: power: ignore power domains with barebox,allow-dummy Ahmad Fatoum
  2022-07-30  9:52 ` [PATCH master 2/3] ARM: i.MX8MM: assume USBOTG power domains to be powered Ahmad Fatoum
  2022-07-30  9:52 ` [PATCH master 3/3] ARM: i.MX8MN: " Ahmad Fatoum
@ 2022-08-05  5:23 ` Ahmad Fatoum
  2 siblings, 0 replies; 4+ messages in thread
From: Ahmad Fatoum @ 2022-08-05  5:23 UTC (permalink / raw)
  To: barebox; +Cc: lst, mfe

On 30.07.22 11:52, Ahmad Fatoum wrote:
> With deep probe enabled, we can know for certain whether a driver will
> be found for a device or not. This allows us to specially handle devices
> that lack a driver. We already do that for regulators, where the device
> tree can specify barebox,allow-dummy-supply for regulators that are
> known to be enabled by the time barebox runs. Add the same functionality
> for power domains as well.
> 
> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
> ---

Please dismiss, sending out v2 shortly.

>  drivers/base/power.c | 24 +++++++++++++++++++++---
>  1 file changed, 21 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/base/power.c b/drivers/base/power.c
> index 96cac1a091f3..4a206051b137 100644
> --- a/drivers/base/power.c
> +++ b/drivers/base/power.c
> @@ -139,14 +139,32 @@ static struct generic_pm_domain *genpd_get_from_provider(
>  					struct of_phandle_args *genpdspec)
>  {
>  	struct generic_pm_domain *genpd = ERR_PTR(-ENOENT);
> +	struct device_node *node = genpdspec->np;
>  	struct of_genpd_provider *provider;
> +	int ret;
>  
>  	if (!genpdspec)
>  		return ERR_PTR(-EINVAL);
>  
> +	ret = of_device_ensure_probed(node);
> +	if (ret) {
> +		struct device_node *parent;
> +
> +		/*
> +		 * If "barebox,allow-dummy" property is set for power domain
> +		 * provider, assume it's turned on.
> +		 */
> +		parent = of_get_parent(node);
> +		if (of_get_property(node, "barebox,allow-dummy", NULL) ||
> +		    of_get_property(parent, "barebox,allow-dummy", NULL))
> +			return NULL;
> +
> +		return ERR_PTR(ret);
> +	}
> +
>  	/* Check if we have such a provider in our array */
>  	list_for_each_entry(provider, &of_genpd_providers, link) {
> -		if (provider->node == genpdspec->np)
> +		if (provider->node == node)
>  			genpd = provider->xlate(genpdspec, provider->data);
>  		if (!IS_ERR(genpd))
>  			break;
> @@ -175,7 +193,7 @@ static int genpd_power_on(struct generic_pm_domain *genpd, unsigned int depth)
>  {
>  	int ret;
>  
> -	if (genpd_status_on(genpd))
> +	if (!genpd || genpd_status_on(genpd))
>  		return 0;
>  
>  	ret = _genpd_power_on(genpd, true);
> @@ -211,7 +229,7 @@ static int __genpd_dev_pm_attach(struct device_d *dev, struct device_node *np,
>  		return (ret == -ENOENT) ? -EPROBE_DEFER : ret;
>  	}
>  
> -	dev_dbg(dev, "adding to PM domain %s\n", pd->name);
> +	dev_dbg(dev, "adding to PM domain %s\n", pd ? pd->name : "dummy");
>  
>  	if (power_on)
>  		ret = genpd_power_on(pd, 0);


-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-08-05  5:25 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-30  9:52 [PATCH master 1/3] drivers: power: ignore power domains with barebox,allow-dummy Ahmad Fatoum
2022-07-30  9:52 ` [PATCH master 2/3] ARM: i.MX8MM: assume USBOTG power domains to be powered Ahmad Fatoum
2022-07-30  9:52 ` [PATCH master 3/3] ARM: i.MX8MN: " Ahmad Fatoum
2022-08-05  5:23 ` [PATCH master 1/3] drivers: power: ignore power domains with barebox,allow-dummy Ahmad Fatoum

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox