| From c33cd659d606591a986daaf1472d4078c634179e Mon Sep 17 00:00:00 2001 |
| From: Eddie James <eajames@linux.ibm.com> |
| Date: Wed, 6 Nov 2019 14:01:06 -0600 |
| Subject: [PATCH] hwmon: (pmbus/ibm-cffps) Fix LED blink behavior |
| |
| commit 92b39ad440968bab38eb6577d63c12994601ed94 upstream. |
| |
| The LED blink_set function incorrectly did not tell the PSU LED to blink |
| if brightness was LED_OFF. Fix this, and also correct the LED_OFF |
| command data, which should give control of the LED back to the PSU |
| firmware. Also prevent I2C failures from getting the driver LED state |
| out of sync and add some dev_dbg statements. |
| |
| Signed-off-by: Eddie James <eajames@linux.ibm.com> |
| Link: https://lore.kernel.org/r/20191106200106.29519-3-eajames@linux.ibm.com |
| Fixes: ef9e1cdf419a3 ("hwmon: (pmbus/cffps) Add led class device for power supply fault led") |
| Signed-off-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/hwmon/pmbus/ibm-cffps.c b/drivers/hwmon/pmbus/ibm-cffps.c |
| index 958384d4eda3..5a6e9b5a228b 100644 |
| --- a/drivers/hwmon/pmbus/ibm-cffps.c |
| +++ b/drivers/hwmon/pmbus/ibm-cffps.c |
| @@ -37,9 +37,13 @@ |
| #define CFFPS_MFR_VAUX_FAULT BIT(6) |
| #define CFFPS_MFR_CURRENT_SHARE_WARNING BIT(7) |
| |
| +/* |
| + * LED off state actually relinquishes LED control to PSU firmware, so it can |
| + * turn on the LED for faults. |
| + */ |
| +#define CFFPS_LED_OFF 0 |
| #define CFFPS_LED_BLINK BIT(0) |
| #define CFFPS_LED_ON BIT(1) |
| -#define CFFPS_LED_OFF BIT(2) |
| #define CFFPS_BLINK_RATE_MS 250 |
| |
| enum { |
| @@ -269,21 +273,29 @@ static int ibm_cffps_led_brightness_set(struct led_classdev *led_cdev, |
| enum led_brightness brightness) |
| { |
| int rc; |
| + u8 next_led_state; |
| struct ibm_cffps *psu = container_of(led_cdev, struct ibm_cffps, led); |
| |
| if (brightness == LED_OFF) { |
| - psu->led_state = CFFPS_LED_OFF; |
| + next_led_state = CFFPS_LED_OFF; |
| } else { |
| brightness = LED_FULL; |
| + |
| if (psu->led_state != CFFPS_LED_BLINK) |
| - psu->led_state = CFFPS_LED_ON; |
| + next_led_state = CFFPS_LED_ON; |
| + else |
| + next_led_state = CFFPS_LED_BLINK; |
| } |
| |
| + dev_dbg(&psu->client->dev, "LED brightness set: %d. Command: %d.\n", |
| + brightness, next_led_state); |
| + |
| rc = i2c_smbus_write_byte_data(psu->client, CFFPS_SYS_CONFIG_CMD, |
| - psu->led_state); |
| + next_led_state); |
| if (rc < 0) |
| return rc; |
| |
| + psu->led_state = next_led_state; |
| led_cdev->brightness = brightness; |
| |
| return 0; |
| @@ -296,16 +308,15 @@ static int ibm_cffps_led_blink_set(struct led_classdev *led_cdev, |
| int rc; |
| struct ibm_cffps *psu = container_of(led_cdev, struct ibm_cffps, led); |
| |
| - psu->led_state = CFFPS_LED_BLINK; |
| - |
| - if (led_cdev->brightness == LED_OFF) |
| - return 0; |
| + dev_dbg(&psu->client->dev, "LED blink set.\n"); |
| |
| rc = i2c_smbus_write_byte_data(psu->client, CFFPS_SYS_CONFIG_CMD, |
| CFFPS_LED_BLINK); |
| if (rc < 0) |
| return rc; |
| |
| + psu->led_state = CFFPS_LED_BLINK; |
| + led_cdev->brightness = LED_FULL; |
| *delay_on = CFFPS_BLINK_RATE_MS; |
| *delay_off = CFFPS_BLINK_RATE_MS; |
| |
| -- |
| 2.7.4 |
| |