[PATCH linux dev-5.15] leds: pca955x: Set blink duty cycle to fifty percent

Eddie James eajames at linux.ibm.com
Thu Apr 28 04:45:13 AEST 2022


In order to blink at the specified rate, the blinking LEDs
need to maintain a 50% duty cycle. Therefore, don't use PWM0
for any attempted brightness change, and set PWM0 when
enabling blinking.

Signed-off-by: Eddie James <eajames at linux.ibm.com>
---
 drivers/leds/leds-pca955x.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/leds/leds-pca955x.c b/drivers/leds/leds-pca955x.c
index 2570f92b6754..da93f04e4d10 100644
--- a/drivers/leds/leds-pca955x.c
+++ b/drivers/leds/leds-pca955x.c
@@ -289,17 +289,12 @@ static enum led_brightness pca955x_led_get(struct led_classdev *led_cdev)
 
 	switch (pca955x_ledstate(ls, pca955x_led->led_num % 4)) {
 	case PCA955X_LS_LED_ON:
+	case PCA955X_LS_BLINK0:
 		ret = LED_FULL;
 		break;
 	case PCA955X_LS_LED_OFF:
 		ret = LED_OFF;
 		break;
-	case PCA955X_LS_BLINK0:
-		ret = pca955x_read_pwm(pca955x, 0, &pwm);
-		if (ret)
-			return ret;
-		ret = 256 - pwm;
-		break;
 	case PCA955X_LS_BLINK1:
 		ret = pca955x_read_pwm(pca955x, 1, &pwm);
 		if (ret)
@@ -332,7 +327,7 @@ static int pca955x_led_set(struct led_classdev *led_cdev,
 			clear_bit(pca955x_led->led_num, &pca955x->active_blink);
 			ls = pca955x_ledsel(ls, bit, PCA955X_LS_LED_OFF);
 		} else {
-			ret = pca955x_write_pwm(pca955x, 0, 256 - value);
+			/* No variable brightness for blinking LEDs */
 			goto out;
 		}
 	} else {
@@ -432,6 +427,14 @@ static int pca955x_led_blink(struct led_classdev *led_cdev,
 			ret = pca955x_write_ls(pca955x, reg, ls);
 			if (ret)
 				goto out;
+
+			/*
+			 * Force 50% duty cycle to maintain the specified
+			 * blink rate.
+			 */
+			ret = pca955x_write_pwm(pca955x, 0, 128);
+			if (ret)
+				goto out;
 		}
 
 		if (pca955x->blink_period != p) {
-- 
2.27.0



More information about the openbmc mailing list