[PATCH 2/3] ti_pwm: Fix EHRPWM issue

theodore.oviguian at etu.esisar.grenoble-inp.fr theodore.oviguian at etu.esisar.grenoble-inp.fr
Fri Jun 19 10:32:12 CEST 2026


From: Theodore Oviguian <theodore.oviguian at etu.esisar.grenoble-inp.fr>

eHRPWM driver was disabling the module clock at every channel disable,
thats a bad idea because if the other chanel is enabled that froze it.

Signed-off-by: Theodore Oviguian <theodore.oviguian at se.com>
Cc: Tom Rini <trini at konsulko.com>
Cc: Lukasz Majewski <lukma at denx.de>

---
 drivers/pwm/pwm-ti-ehrpwm.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/pwm/pwm-ti-ehrpwm.c b/drivers/pwm/pwm-ti-ehrpwm.c
index 135ea3b4321..82422f85a7c 100644
--- a/drivers/pwm/pwm-ti-ehrpwm.c
+++ b/drivers/pwm/pwm-ti-ehrpwm.c
@@ -101,6 +101,7 @@ struct ti_ehrpwm_priv {
 	struct clk tbclk;
 	unsigned long period_cycles[TI_EHRPWM_NUM_CHANNELS];
 	bool polarity_reversed[TI_EHRPWM_NUM_CHANNELS];
+	bool enabled[TI_EHRPWM_NUM_CHANNELS];
 };
 
 static void ti_ehrpwm_modify(u16 val, u16 mask, fdt_addr_t reg)
@@ -333,6 +334,15 @@ static int ti_ehrpwm_disable(struct udevice *dev, uint channel)
 	ti_ehrpwm_modify(aqcsfrc_val, aqcsfrc_mask,
 			 priv->regs + TI_EHRPWM_AQCSFRC);
 
+	/*
+	 * Disabling TBCLK on PWM disable
+	 * Only if all channels are disabled
+	 */
+	priv->enabled[channel] = false;
+	for (uint i = 0; i < TI_EHRPWM_NUM_CHANNELS; i++) {
+		if (priv->enabled[i])
+			return 0;
+	}
 	/* Disabling TBCLK on PWM disable */
 	err = clk_disable(&priv->tbclk);
 	if (err) {
@@ -377,7 +387,7 @@ static int ti_ehrpwm_enable(struct udevice *dev, uint channel)
 		dev_err(dev, "failed to enable tbclk\n");
 		return err;
 	}
-
+	priv->enabled[channel] = true;
 	return 0;
 }
 
@@ -399,7 +409,7 @@ static int ti_ehrpwm_of_to_plat(struct udevice *dev)
 		return -EINVAL;
 	}
 
-	dev_dbg(dev, "regs=0x%08x\n", priv->regs);
+	dev_dbg(dev, "regs=0x%08llx\n", priv->regs);
 	return 0;
 }
 
@@ -439,6 +449,9 @@ static int ti_ehrpwm_probe(struct udevice *dev)
 		return err;
 	}
 
+	for (uint i = 0; i < TI_EHRPWM_NUM_CHANNELS; i++)
+		priv->enabled[i] = false;
+	
 	return 0;
 }
 
-- 
2.43.0



More information about the U-Boot mailing list