[PATCH v3] driver: pwm: pwm-imx: fix probing on imx6

Heiko Schocher hs at denx.de
Wed Aug 14 14:10:27 CEST 2024


U-Boot 2024.07 drops on aristainetos2 board the following
warning:

	Failed to enable per_clk

and bootlogo is not seen on LVDS display.

This patch uses old behaviour for systems without clock framework
if CONFIG_CLK is not enabled.

Fixes: bfc778cb93a3 ("driver: pwm: pwm-imx: get and enable per/ipg clock using dm")
Fixes: 4eea76574062 ("pwm: imx: Remove unused references to CONFIG_IMX6_PWM_PER_CLK")

Signed-off-by: Heiko Schocher <hs at denx.de>
---

Changes in v3:
add a default value for CFG_IMX6_PWM_PER_CLK
as Fabio suggested
add Fixes line for commit 4eea76574062

azure build:
https://dev.azure.com/hs0298/hs/_build/results?buildId=123&view=results

Changes in v2:
use CONFIG_IS_ENABLED instead of IS_ENABLED
as Anatolij suggested.

 drivers/pwm/pwm-imx.c | 60 +++++++++++++++++++++++++------------------
 1 file changed, 35 insertions(+), 25 deletions(-)

diff --git a/drivers/pwm/pwm-imx.c b/drivers/pwm/pwm-imx.c
index 320ea7c423..d285730694 100644
--- a/drivers/pwm/pwm-imx.c
+++ b/drivers/pwm/pwm-imx.c
@@ -14,6 +14,10 @@
 #include <asm/io.h>
 #include <clk.h>
 
+#if !defined(CFG_IMX6_PWM_PER_CLK)
+#define CFG_IMX6_PWM_PER_CLK	66000000
+#endif
+
 int pwm_config_internal(struct pwm_regs *pwm, unsigned long period_cycles,
 			unsigned long duty_cycles, unsigned long prescale)
 {
@@ -159,7 +163,11 @@ int pwm_dm_imx_get_parms(struct imx_pwm_priv *priv, int period_ns,
 {
 	unsigned long long c;
 
-	c = clk_get_rate(&priv->per_clk);
+	if (CONFIG_IS_ENABLED(CLK))
+		c = clk_get_rate(&priv->per_clk);
+	else
+		c = CFG_IMX6_PWM_PER_CLK;
+
 	c = c * period_ns;
 	do_div(c, 1000000000);
 	*period_c = c;
@@ -226,43 +234,45 @@ static int imx_pwm_set_enable(struct udevice *dev, uint channel, bool enable)
 
 static int imx_pwm_of_to_plat(struct udevice *dev)
 {
-	int ret;
+	int __maybe_unused ret;
 	struct imx_pwm_priv *priv = dev_get_priv(dev);
 
 	priv->regs = dev_read_addr_ptr(dev);
 
-	ret = clk_get_by_name(dev, "per", &priv->per_clk);
-	if (ret) {
-		printf("Failed to get per_clk\n");
-		return ret;
-	}
-
-	ret = clk_get_by_name(dev, "ipg", &priv->ipg_clk);
-	if (ret) {
-		printf("Failed to get ipg_clk\n");
-		return ret;
+	if (CONFIG_IS_ENABLED(CLK)) {
+		ret = clk_get_by_name(dev, "per", &priv->per_clk);
+		if (ret) {
+			printf("Failed to get per_clk\n");
+			return ret;
+		}
+
+		ret = clk_get_by_name(dev, "ipg", &priv->ipg_clk);
+		if (ret) {
+			printf("Failed to get ipg_clk\n");
+			return ret;
+		}
 	}
-
 	return 0;
 }
 
 static int imx_pwm_probe(struct udevice *dev)
 {
-	int ret;
+	int __maybe_unused ret;
 	struct imx_pwm_priv *priv = dev_get_priv(dev);
 
-	ret = clk_enable(&priv->per_clk);
-	if (ret) {
-		printf("Failed to enable per_clk\n");
-		return ret;
+	if (CONFIG_IS_ENABLED(CLK)) {
+		ret = clk_enable(&priv->per_clk);
+		if (ret) {
+			printf("Failed to enable per_clk\n");
+			return ret;
+		}
+
+		ret = clk_enable(&priv->ipg_clk);
+		if (ret) {
+			printf("Failed to enable ipg_clk\n");
+			return ret;
+		}
 	}
-
-	ret = clk_enable(&priv->ipg_clk);
-	if (ret) {
-		printf("Failed to enable ipg_clk\n");
-		return ret;
-	}
-
 	return 0;
 }
 
-- 
2.37.3



More information about the U-Boot mailing list