Merge pull request #499 from roylee123/as7326-56x_system_led_fix

[platform] As7326-56x, update system led control on kernel module and onlpdump.
This commit is contained in:
Jeffrey Townsend
2018-12-26 09:09:09 -08:00
committed by GitHub
2 changed files with 91 additions and 45 deletions

View File

@@ -40,7 +40,7 @@ struct accton_as7326_56x_led_data {
struct mutex update_lock;
char valid; /* != 0 if registers are valid */
unsigned long last_updated; /* In jiffies */
u8 reg_val[1]; /* only 1 register*/
u8 reg_val[2];
};
static struct accton_as7326_56x_led_data *ledctl = NULL;
@@ -48,18 +48,17 @@ static struct accton_as7326_56x_led_data *ledctl = NULL;
/* LED related data
*/
/* LED has only red, green and blue.
* Amber = red + green.
* Purple = red + blue.
*/
#define LED_CNTRLER_I2C_ADDRESS (0x60)
#define LED_TYPE_DIAG_REG_MASK (0x3)
#define LED_MODE_DIAG_GREEN_VALUE (0x02)
#define LED_MODE_DIAG_RED_VALUE (0x01)
#define LED_MODE_DIAG_AMBER_VALUE (0x00) /*It's yellow actually. Green+Red=Yellow*/
#define LED_MODE_DIAG_OFF_VALUE (0x03)
#define LED_TYPE_LOC_REG_MASK (0x80)
#define LED_MODE_LOC_ON_VALUE (0)
#define LED_MODE_LOC_OFF_VALUE (0x80)
#define LED_TYPE_DIAG_REG_MASK (0x3F)
#define LED_MODE_DIAG_OFF_VALUE (0x07)
#define LED_TYPE_LOC_REG_MASK (0x3F)
#define LED_MODE_LOC_OFF_VALUE (0x07)
enum led_type {
LED_TYPE_DIAG,
@@ -75,20 +74,23 @@ struct led_reg {
};
static const struct led_reg led_reg_map[] = {
{(1<<LED_TYPE_LOC) | (1<<LED_TYPE_DIAG), 0x41},
{(1<<LED_TYPE_DIAG), 0x24},
{(1<<LED_TYPE_LOC) , 0x25},
};
enum led_light_mode {
LED_MODE_OFF = 0,
LED_MODE_GREEN,
LED_MODE_AMBER,
LED_MODE_RED,
LED_MODE_GREEN,
LED_MODE_BLUE,
LED_MODE_GREEN_BLINK,
LED_MODE_AMBER_BLINK,
LED_MODE_AMBER,
LED_MODE_PURPLE,
LED_MODE_RED_BLINK,
LED_MODE_GREEN_BLINK,
LED_MODE_BLUE_BLINK,
LED_MODE_AMBER_BLINK,
LED_MODE_PURPLE_BLINK,
LED_MODE_AUTO,
LED_MODE_UNKNOWN
};
@@ -101,12 +103,29 @@ struct led_type_mode {
};
static struct led_type_mode led_type_mode_data[] = {
{LED_TYPE_LOC, LED_MODE_OFF, LED_TYPE_LOC_REG_MASK, LED_MODE_LOC_OFF_VALUE},
{LED_TYPE_LOC, LED_MODE_AMBER, LED_TYPE_LOC_REG_MASK, LED_MODE_LOC_ON_VALUE},
{LED_TYPE_DIAG, LED_MODE_OFF, LED_TYPE_DIAG_REG_MASK, LED_MODE_DIAG_OFF_VALUE},
{LED_TYPE_DIAG, LED_MODE_GREEN, LED_TYPE_DIAG_REG_MASK, LED_MODE_DIAG_GREEN_VALUE},
{LED_TYPE_DIAG, LED_MODE_RED, LED_TYPE_DIAG_REG_MASK, LED_MODE_DIAG_RED_VALUE},
{LED_TYPE_DIAG, LED_MODE_AMBER, LED_TYPE_DIAG_REG_MASK, LED_MODE_DIAG_AMBER_VALUE},
{LED_TYPE_DIAG, LED_MODE_OFF, LED_TYPE_DIAG_REG_MASK, LED_MODE_DIAG_OFF_VALUE},
{LED_TYPE_DIAG, LED_MODE_RED, LED_TYPE_DIAG_REG_MASK, 0x06},
{LED_TYPE_DIAG, LED_MODE_GREEN, LED_TYPE_DIAG_REG_MASK, 0x05},
{LED_TYPE_DIAG, LED_MODE_BLUE, LED_TYPE_DIAG_REG_MASK, 0x03},
{LED_TYPE_DIAG, LED_MODE_AMBER, LED_TYPE_DIAG_REG_MASK, 0x04},
{LED_TYPE_DIAG, LED_MODE_PURPLE, LED_TYPE_DIAG_REG_MASK, 0x02},
{LED_TYPE_DIAG, LED_MODE_RED_BLINK, LED_TYPE_DIAG_REG_MASK, 0x0f},
{LED_TYPE_DIAG, LED_MODE_GREEN_BLINK, LED_TYPE_DIAG_REG_MASK, 0x17},
{LED_TYPE_DIAG, LED_MODE_BLUE_BLINK, LED_TYPE_DIAG_REG_MASK, 0x27},
{LED_TYPE_DIAG, LED_MODE_AMBER_BLINK, LED_TYPE_DIAG_REG_MASK, 0x1f},
{LED_TYPE_DIAG, LED_MODE_PURPLE_BLINK, LED_TYPE_DIAG_REG_MASK, 0x2f},
{LED_TYPE_LOC, LED_MODE_OFF, LED_TYPE_LOC_REG_MASK, LED_MODE_LOC_OFF_VALUE},
{LED_TYPE_LOC, LED_MODE_RED, LED_TYPE_LOC_REG_MASK, 0x06},
{LED_TYPE_LOC, LED_MODE_GREEN, LED_TYPE_LOC_REG_MASK, 0x05},
{LED_TYPE_LOC, LED_MODE_BLUE, LED_TYPE_LOC_REG_MASK, 0x03},
{LED_TYPE_LOC, LED_MODE_AMBER, LED_TYPE_LOC_REG_MASK, 0x04},
{LED_TYPE_LOC, LED_MODE_PURPLE, LED_TYPE_LOC_REG_MASK, 0x02},
{LED_TYPE_LOC, LED_MODE_RED_BLINK, LED_TYPE_LOC_REG_MASK, 0x0f},
{LED_TYPE_LOC, LED_MODE_GREEN_BLINK, LED_TYPE_LOC_REG_MASK, 0x17},
{LED_TYPE_LOC, LED_MODE_BLUE_BLINK, LED_TYPE_LOC_REG_MASK, 0x27},
{LED_TYPE_LOC, LED_MODE_AMBER_BLINK, LED_TYPE_LOC_REG_MASK, 0x1f},
{LED_TYPE_LOC, LED_MODE_PURPLE_BLINK, LED_TYPE_LOC_REG_MASK, 0x2f},
};
@@ -122,7 +141,7 @@ static int accton_getLedReg(enum led_type type, u8 *reg)
{
int i;
for (i = 0; i < ARRAY_SIZE(led_reg_map); i++) {
if(led_reg_map[i].types & (type<<1)) {
if(led_reg_map[i].types & (1 << type)) {
*reg = led_reg_map[i].reg_addr;
return 0;
}
@@ -218,6 +237,7 @@ static void accton_as7326_56x_led_set(struct led_classdev *led_cdev,
{
int reg_val;
u8 reg ;
mutex_lock(&ledctl->update_lock);
if( !accton_getLedReg(type, &reg))
@@ -283,7 +303,7 @@ static struct led_classdev accton_as7326_56x_leds[] = {
.brightness_set = accton_as7326_56x_led_diag_set,
.brightness_get = accton_as7326_56x_led_diag_get,
.flags = LED_CORE_SUSPENDRESUME,
.max_brightness = LED_MODE_RED,
.max_brightness = LED_MODE_PURPLE_BLINK,
},
[LED_TYPE_LOC] = {
.name = "accton_as7326_56x_led::loc",
@@ -291,7 +311,7 @@ static struct led_classdev accton_as7326_56x_leds[] = {
.brightness_set = accton_as7326_56x_led_loc_set,
.brightness_get = accton_as7326_56x_led_loc_get,
.flags = LED_CORE_SUSPENDRESUME,
.max_brightness = LED_MODE_BLUE,
.max_brightness = LED_MODE_PURPLE_BLINK,
},
[LED_TYPE_FAN] = {
.name = "accton_as7326_56x_led::fan",

View File

@@ -53,19 +53,21 @@ enum onlp_led_id
LED_PSU1,
LED_PSU2
};
enum led_light_mode {
LED_MODE_OFF = 0,
LED_MODE_GREEN,
LED_MODE_AMBER,
LED_MODE_RED,
LED_MODE_BLUE,
LED_MODE_GREEN_BLINK,
LED_MODE_AMBER_BLINK,
LED_MODE_RED_BLINK,
LED_MODE_BLUE_BLINK,
LED_MODE_AUTO,
LED_MODE_UNKNOWN
LED_MODE_OFF = 0,
LED_MODE_RED,
LED_MODE_GREEN,
LED_MODE_BLUE,
LED_MODE_AMBER,
LED_MODE_PURPLE,
LED_MODE_RED_BLINK,
LED_MODE_GREEN_BLINK,
LED_MODE_BLUE_BLINK,
LED_MODE_AMBER_BLINK,
LED_MODE_PURPLE_BLINK,
LED_MODE_AUTO,
LED_MODE_UNKNOWN
};
typedef struct led_light_mode_map {
@@ -75,12 +77,28 @@ typedef struct led_light_mode_map {
} led_light_mode_map_t;
led_light_mode_map_t led_map[] = {
{LED_DIAG, LED_MODE_OFF, ONLP_LED_MODE_OFF},
{LED_DIAG, LED_MODE_GREEN, ONLP_LED_MODE_GREEN},
{LED_DIAG, LED_MODE_AMBER, ONLP_LED_MODE_ORANGE},
{LED_DIAG, LED_MODE_RED, ONLP_LED_MODE_RED},
{LED_LOC, LED_MODE_OFF, ONLP_LED_MODE_OFF},
{LED_LOC, LED_MODE_BLUE, ONLP_LED_MODE_BLUE},
{LED_DIAG, LED_MODE_OFF, ONLP_LED_MODE_OFF},
{LED_DIAG, LED_MODE_GREEN, ONLP_LED_MODE_GREEN},
{LED_DIAG, LED_MODE_AMBER, ONLP_LED_MODE_ORANGE},
{LED_DIAG, LED_MODE_RED, ONLP_LED_MODE_RED},
{LED_DIAG, LED_MODE_BLUE, ONLP_LED_MODE_BLUE},
{LED_DIAG, LED_MODE_PURPLE, ONLP_LED_MODE_PURPLE},
{LED_DIAG, LED_MODE_GREEN_BLINK, ONLP_LED_MODE_GREEN_BLINKING},
{LED_DIAG, LED_MODE_AMBER_BLINK, ONLP_LED_MODE_ORANGE_BLINKING},
{LED_DIAG, LED_MODE_RED_BLINK, ONLP_LED_MODE_RED_BLINKING},
{LED_DIAG, LED_MODE_BLUE_BLINK, ONLP_LED_MODE_BLUE_BLINKING},
{LED_DIAG, LED_MODE_PURPLE_BLINK, ONLP_LED_MODE_PURPLE_BLINKING},
{LED_LOC, LED_MODE_OFF, ONLP_LED_MODE_OFF},
{LED_LOC, LED_MODE_GREEN, ONLP_LED_MODE_GREEN},
{LED_LOC, LED_MODE_AMBER, ONLP_LED_MODE_ORANGE},
{LED_LOC, LED_MODE_RED, ONLP_LED_MODE_RED},
{LED_LOC, LED_MODE_BLUE, ONLP_LED_MODE_BLUE},
{LED_LOC, LED_MODE_PURPLE, ONLP_LED_MODE_PURPLE},
{LED_LOC, LED_MODE_GREEN_BLINK, ONLP_LED_MODE_GREEN_BLINKING},
{LED_LOC, LED_MODE_AMBER_BLINK, ONLP_LED_MODE_ORANGE_BLINKING},
{LED_LOC, LED_MODE_RED_BLINK, ONLP_LED_MODE_RED_BLINKING},
{LED_LOC, LED_MODE_BLUE_BLINK, ONLP_LED_MODE_BLUE_BLINKING},
{LED_LOC, LED_MODE_PURPLE_BLINK, ONLP_LED_MODE_PURPLE_BLINKING},
{LED_FAN, LED_MODE_AUTO, ONLP_LED_MODE_AUTO},
{LED_PSU1, LED_MODE_AUTO, ONLP_LED_MODE_AUTO},
{LED_PSU2, LED_MODE_AUTO, ONLP_LED_MODE_AUTO}
@@ -105,12 +123,20 @@ static onlp_led_info_t linfo[] =
{
{ ONLP_LED_ID_CREATE(LED_DIAG), "Chassis LED 1 (DIAG LED)", 0 },
ONLP_LED_STATUS_PRESENT,
ONLP_LED_CAPS_ON_OFF | ONLP_LED_CAPS_GREEN | ONLP_LED_CAPS_RED | ONLP_LED_CAPS_ORANGE,
ONLP_LED_CAPS_ON_OFF | ONLP_LED_CAPS_GREEN | ONLP_LED_CAPS_RED |
ONLP_LED_CAPS_ORANGE | ONLP_LED_CAPS_BLUE | ONLP_LED_CAPS_PURPLE|
ONLP_LED_CAPS_GREEN_BLINKING | ONLP_LED_CAPS_RED_BLINKING |
ONLP_LED_CAPS_ORANGE_BLINKING | ONLP_LED_CAPS_BLUE_BLINKING |
ONLP_LED_CAPS_PURPLE_BLINKING,
},
{
{ ONLP_LED_ID_CREATE(LED_LOC), "Chassis LED 2 (LOC LED)", 0 },
ONLP_LED_STATUS_PRESENT,
ONLP_LED_CAPS_ON_OFF | ONLP_LED_CAPS_ORANGE,
ONLP_LED_CAPS_ON_OFF | ONLP_LED_CAPS_GREEN | ONLP_LED_CAPS_RED |
ONLP_LED_CAPS_ORANGE | ONLP_LED_CAPS_BLUE | ONLP_LED_CAPS_PURPLE|
ONLP_LED_CAPS_GREEN_BLINKING | ONLP_LED_CAPS_RED_BLINKING |
ONLP_LED_CAPS_ORANGE_BLINKING | ONLP_LED_CAPS_BLUE_BLINKING |
ONLP_LED_CAPS_PURPLE_BLINKING,
},
{
{ ONLP_LED_ID_CREATE(LED_FAN), "Chassis LED 3 (FAN LED)", 0 },