From 7473770bd11d6b456d2a4a7222881bfd9063d52c Mon Sep 17 00:00:00 2001 From: brandonchuang Date: Thu, 19 Jan 2017 16:07:22 +0800 Subject: [PATCH] [as4610] Support new model as4610-54t-b --- ...latform-accton-as4610-device-drivers.patch | 280 +++++++++--------- .../src/arm_accton_as4610/module/src/fani.c | 5 + .../src/arm_accton_as4610/module/src/ledi.c | 54 +++- .../module/src/platform_lib.c | 12 +- .../module/src/platform_lib.h | 2 + 5 files changed, 195 insertions(+), 158 deletions(-) diff --git a/packages/base/any/kernels/3.2.71-1+deb7/patches/platform-accton-as4610-device-drivers.patch b/packages/base/any/kernels/3.2.71-1+deb7/patches/platform-accton-as4610-device-drivers.patch index 027d3693..55ef6dee 100644 --- a/packages/base/any/kernels/3.2.71-1+deb7/patches/platform-accton-as4610-device-drivers.patch +++ b/packages/base/any/kernels/3.2.71-1+deb7/patches/platform-accton-as4610-device-drivers.patch @@ -277,8 +277,8 @@ index 0000000..3934bcd + */ +static const u8 fan_reg[] = { + 0x2B, /* fan PWM(for all fan) */ -+ 0x2C, /* fan 1 speed(rpm) */ -+ 0x2D, /* fan 2 speed(rpm) */ ++ 0x2D, /* fan 1 speed(rpm) */ ++ 0x2C, /* fan 2 speed(rpm) */ + 0x11, /* fan1-2 operating status */ +}; + @@ -382,7 +382,7 @@ index 0000000..3934bcd + +static u8 is_fan_fault(struct as4610_fan_data *data, enum fan_id id) +{ -+ u8 mask = (id == FAN1_ID) ? 0x10 : 0x20; ++ u8 mask = (id == FAN1_ID) ? 0x20 : 0x10; + + return !(data->reg_val[FAN_FAULT] & mask); +} @@ -1862,10 +1862,10 @@ index e4f6bf5..db2dab8 100644 obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o diff --git a/drivers/leds/leds-accton_as4610.c b/drivers/leds/leds-accton_as4610.c new file mode 100644 -index 0000000..6f20735 +index 0000000..0c4b535 --- /dev/null +++ b/drivers/leds/leds-accton_as4610.c -@@ -0,0 +1,719 @@ +@@ -0,0 +1,678 @@ +/* + * A LED driver for the accton_as4610_led + * @@ -1896,6 +1896,7 @@ index 0000000..6f20735 +#include +#include +#include ++#include +#include + +extern int accton_i2c_cpld_read (unsigned short cpld_addr, u8 reg); @@ -1903,8 +1904,6 @@ index 0000000..6f20735 + +extern void led_classdev_unregister(struct led_classdev *led_cdev); +extern int led_classdev_register(struct device *parent, struct led_classdev *led_cdev); -+extern void led_classdev_resume(struct led_classdev *led_cdev); -+extern void led_classdev_suspend(struct led_classdev *led_cdev); + +#define DRVNAME "as4610_led" + @@ -1913,12 +1912,12 @@ index 0000000..6f20735 + struct mutex update_lock; + char valid; /* != 0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ -+ u8 num_of_led; ++ int led_map; + u8 reg_val[5]; /* Register value, 0 = (0x1A) Blinking function + 1 = (0x30) 7-seg 2 + 2 = (0x31) 7-seg 1 + 3 = (0x32) SYS/PRI/PSU1-2 LED -+ 4 = (0x33) STK1-2/Fan/PoE LED */ ++ 4 = (0x33) STK1-2/Fan/PoE/Alarm LED */ +}; + +static struct as4610_led_data *ledctl = NULL; @@ -1934,50 +1933,35 @@ index 0000000..6f20735 +#define LED_NORMAL_OFF_VALUE 0x00 + +#define LED_TYPE_SYS_REG_MASK 0xC0 -+#define LED_MODE_SYS_GREEN_MASK 0x80 -+#define LED_MODE_SYS_AMBER_MASK 0x40 -+#define LED_MODE_SYS_OFF_MASK 0x00 -+#define LED_MODE_SYS_BLINK_MASK 0x80 ++#define LED_MODE_SYS_BLINK_MASK 0x80 + -+#define LED_TYPE_PRI_REG_MASK 0x30 -+#define LED_MODE_PRI_GREEN_MASK 0x20 -+#define LED_MODE_PRI_AMBER_MASK 0x10 -+#define LED_MODE_PRI_OFF_MASK 0x00 -+#define LED_MODE_PRI_BLINK_MASK 0x40 ++#define LED_TYPE_PRI_REG_MASK 0x30 ++#define LED_MODE_PRI_BLINK_MASK 0x40 + -+#define LED_TYPE_PSU1_REG_MASK 0x0C ++#define LED_TYPE_PSU1_REG_MASK 0x0C +#define LED_MODE_PSU1_BLINK_MASK 0x20 + -+#define LED_TYPE_PSU2_REG_MASK 0x03 ++#define LED_TYPE_PSU2_REG_MASK 0x03 +#define LED_MODE_PSU2_BLINK_MASK 0x10 + -+#define LED_TYPE_STK1_REG_MASK 0xC0 -+#define LED_MODE_STK1_GREEN_MASK 0x80 -+#define LED_MODE_STK1_AMBER_MASK 0x40 -+#define LED_MODE_STK1_OFF_MASK 0x00 ++#define LED_TYPE_STK1_REG_MASK 0xC0 +#define LED_MODE_STK1_BLINK_MASK 0x08 + -+#define LED_TYPE_STK2_REG_MASK 0x30 -+#define LED_MODE_STK2_GREEN_MASK 0x20 -+#define LED_MODE_STK2_AMBER_MASK 0x10 -+#define LED_MODE_STK2_OFF_MASK 0x00 ++#define LED_TYPE_STK2_REG_MASK 0x30 +#define LED_MODE_STK2_BLINK_MASK 0x04 + -+#define LED_TYPE_FAN_REG_MASK 0x0C -+#define LED_MODE_FAN_BLINK_MASK 0x02 ++#define LED_TYPE_FAN_REG_MASK 0x0C ++#define LED_MODE_FAN_BLINK_MASK 0x02 + -+#define LED_TYPE_POE_REG_MASK 0x03 -+#define LED_MODE_POE_GREEN_MASK 0x02 -+#define LED_MODE_POE_AMBER_MASK 0x01 -+#define LED_MODE_POE_OFF_MASK 0x00 -+#define LED_MODE_POE_BLINK_MASK 0x01 ++#define LED_TYPE_POE_ALARM_REG_MASK 0x03 ++#define LED_MODE_POE_ALARM_BLINK_MASK 0x01 + +static const u8 led_reg[] = { + 0x1A, /* Blinking function */ + 0x30, /* 7-seg 1 */ + 0x31, /* 7-seg 2 */ + 0x32, /* SYS/PRI/PSU1-2 LED */ -+ 0x33, /* STK1-2/Fan/PoE LED */ ++ 0x33, /* STK1-2/Fan/PoE/Alarm LED */ +}; + +enum led_type { @@ -1992,7 +1976,26 @@ index 0000000..6f20735 + LED_TYPE_7SEG_DIGITS, + LED_TYPE_7SEG_DIGITS_POINT, + LED_TYPE_FAN, -+ LED_TYPE_POE ++ LED_TYPE_POE, ++ LED_TYPE_ALARM, ++ NUM_OF_LED ++}; ++ ++#define AS4610_COMMON_LED_MAP (BIT(LED_TYPE_SYS) | BIT(LED_TYPE_PRI) | BIT(LED_TYPE_PSU1) | \ ++ BIT(LED_TYPE_PSU2)| BIT(LED_TYPE_STK1)| BIT(LED_TYPE_STK2)) ++#define AS4610_NPOE_LED_MAP (AS4610_COMMON_LED_MAP | BIT(LED_TYPE_7SEG_TENS) | \ ++ BIT(LED_TYPE_7SEG_TENS_POINT) | BIT(LED_TYPE_7SEG_DIGITS) | \ ++ BIT(LED_TYPE_7SEG_DIGITS_POINT)) ++#define AS4610_POE_LED_MAP (AS4610_NPOE_LED_MAP | BIT(LED_TYPE_FAN) | BIT(LED_TYPE_POE)) ++#define AS4610_54T_B_LED_MAP (AS4610_COMMON_LED_MAP | BIT(LED_TYPE_FAN) | BIT(LED_TYPE_ALARM)) ++ ++static int as4610_ledmaps[] = { ++ [PID_AS4610_30T] = AS4610_NPOE_LED_MAP, ++ [PID_AS4610_30P] = AS4610_POE_LED_MAP, ++ [PID_AS4610_54T] = AS4610_NPOE_LED_MAP, ++ [PID_AS4610_54P] = AS4610_POE_LED_MAP, ++ [PID_AS4610_54T_B] = AS4610_54T_B_LED_MAP, ++ [PID_RESERVED] = 0, +}; + +enum led_light_mode { @@ -2059,12 +2062,6 @@ index 0000000..6f20735 +{ + as4610_led_update(); + return (ledctl->reg_val[reg_id] & LED_7SEG_REG_MASK); -+#if 0 -+ as4610_led_update(); -+ -+ return (ledctl->reg_val[2] & LED_7SEG_REG_MASK) * 10 + -+ (ledctl->reg_val[1] & LED_7SEG_REG_MASK); -+#endif +} + +static void seven_segment_set(struct led_classdev *cdev, enum led_brightness mode, u8 reg_id) @@ -2076,23 +2073,6 @@ index 0000000..6f20735 + ledctl->reg_val[reg_id] &= 0xF0; + ledctl->reg_val[reg_id] |= mode; + as4610_led_write_value(led_reg[reg_id], ledctl->reg_val[reg_id]); -+ -+#if 0 -+ u8 digits, tens; -+ -+ if (mode > LED_MODE_SEVEN_SEGMENT_MAX) { -+ return; -+ } -+ -+ digits = mode % 10; -+ tens = mode / 10; -+ ledctl->reg_val[1] &= 0xF0; -+ ledctl->reg_val[1] |= digits; -+ ledctl->reg_val[2] &= 0xF0; -+ ledctl->reg_val[2] |= tens; -+ as4610_led_write_value(led_reg[1], ledctl->reg_val[1]); -+ as4610_led_write_value(led_reg[2], ledctl->reg_val[2]); -+#endif +} + +static enum led_brightness seven_segment_digits_get(struct led_classdev *cdev) @@ -2322,16 +2302,16 @@ index 0000000..6f20735 + return as4610_led_normal_get(3, LED_MODE_PRI_BLINK_MASK, 4); +} + -+static void as4610_led_poe_set(struct led_classdev *cdev, ++static void as4610_led_poe_alarm_set(struct led_classdev *cdev, + enum led_brightness mode) +{ -+ as4610_led_normal_set(cdev, mode, LED_MODE_POE_BLINK_MASK, -+ 4, LED_TYPE_POE_REG_MASK, 0); ++ as4610_led_normal_set(cdev, mode, LED_MODE_POE_ALARM_BLINK_MASK, ++ 4, LED_TYPE_POE_ALARM_REG_MASK, 0); +} + -+static enum led_brightness as4610_led_poe_get(struct led_classdev *cdev) ++static enum led_brightness as4610_led_poe_alarm_get(struct led_classdev *cdev) +{ -+ return as4610_led_normal_get(4, LED_MODE_POE_BLINK_MASK, 0); ++ return as4610_led_normal_get(4, LED_MODE_POE_ALARM_BLINK_MASK, 0); +} + +static void as4610_led_stk1_set(struct led_classdev *cdev, @@ -2364,7 +2344,6 @@ index 0000000..6f20735 + .default_trigger = "unused", + .brightness_set = as4610_led_sys_set, + .brightness_get = as4610_led_sys_get, -+ .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER_BLINK, + }, + [LED_TYPE_PRI] = { @@ -2372,7 +2351,6 @@ index 0000000..6f20735 + .default_trigger = "unused", + .brightness_set = as4610_led_pri_set, + .brightness_get = as4610_led_pri_get, -+ .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER_BLINK, + }, + [LED_TYPE_PSU1] = { @@ -2380,7 +2358,6 @@ index 0000000..6f20735 + .default_trigger = "unused", + .brightness_set = as4610_led_psu1_set, + .brightness_get = as4610_led_psu1_get, -+ .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AUTO_BLINKING, + }, + [LED_TYPE_PSU2] = { @@ -2388,7 +2365,6 @@ index 0000000..6f20735 + .default_trigger = "unused", + .brightness_set = as4610_led_psu2_set, + .brightness_get = as4610_led_psu2_get, -+ .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AUTO_BLINKING, + }, + [LED_TYPE_STK1] = { @@ -2396,7 +2372,6 @@ index 0000000..6f20735 + .default_trigger = "unused", + .brightness_set = as4610_led_stk1_set, + .brightness_get = as4610_led_stk1_get, -+ .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER_BLINK, + }, + [LED_TYPE_STK2] = { @@ -2404,7 +2379,6 @@ index 0000000..6f20735 + .default_trigger = "unused", + .brightness_set = as4610_led_stk2_set, + .brightness_get = as4610_led_stk2_get, -+ .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER_BLINK, + }, + [LED_TYPE_7SEG_TENS] = { @@ -2412,7 +2386,6 @@ index 0000000..6f20735 + .default_trigger = "unused", + .brightness_set = seven_segment_tens_set, + .brightness_get = seven_segment_tens_get, -+ .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_SEVEN_SEGMENT_MAX, + }, + [LED_TYPE_7SEG_TENS_POINT] = { @@ -2420,7 +2393,6 @@ index 0000000..6f20735 + .default_trigger = "unused", + .brightness_set = seven_segment_tens_point_set, + .brightness_get = seven_segment_tens_point_get, -+ .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_GREEN, + }, + [LED_TYPE_7SEG_DIGITS] = { @@ -2428,7 +2400,6 @@ index 0000000..6f20735 + .default_trigger = "unused", + .brightness_set = seven_segment_digits_set, + .brightness_get = seven_segment_digits_get, -+ .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_SEVEN_SEGMENT_MAX, + }, + [LED_TYPE_7SEG_DIGITS_POINT] = { @@ -2436,7 +2407,6 @@ index 0000000..6f20735 + .default_trigger = "unused", + .brightness_set = seven_segment_digits_point_set, + .brightness_get = seven_segment_digits_point_get, -+ .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_GREEN, + }, + [LED_TYPE_FAN] = { @@ -2444,61 +2414,49 @@ index 0000000..6f20735 + .default_trigger = "unused", + .brightness_set = as4610_led_fan_set, + .brightness_get = as4610_led_fan_get, -+ .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AUTO_BLINKING, + }, + [LED_TYPE_POE] = { + .name = "as4610::poe", + .default_trigger = "unused", -+ .brightness_set = as4610_led_poe_set, -+ .brightness_get = as4610_led_poe_get, -+ .flags = LED_CORE_SUSPENDRESUME, ++ .brightness_set = as4610_led_poe_alarm_set, ++ .brightness_get = as4610_led_poe_alarm_get, ++ .max_brightness = LED_MODE_AMBER_BLINK, ++ }, ++ [LED_TYPE_ALARM] = { ++ .name = "as4610::alarm", ++ .default_trigger = "unused", ++ .brightness_set = as4610_led_poe_alarm_set, ++ .brightness_get = as4610_led_poe_alarm_get, + .max_brightness = LED_MODE_AMBER_BLINK, + }, +}; + -+static int as4610_led_suspend(struct platform_device *dev, -+ pm_message_t state) -+{ -+ int i = 0; -+ -+ for (i = 0; i < ledctl->num_of_led; i++) { -+ led_classdev_suspend(&as4610_leds[i]); -+ } -+ -+ return 0; -+} -+ -+static int as4610_led_resume(struct platform_device *dev) -+{ -+ int i = 0; -+ -+ for (i = 0; i < ledctl->num_of_led; i++) { -+ led_classdev_resume(&as4610_leds[i]); -+ } -+ -+ return 0; -+} -+ +static int as4610_led_probe(struct platform_device *pdev) +{ + int ret = 0, i; + -+ for (i = 0; i < ledctl->num_of_led; i++) { ++ for (i = 0; i < NUM_OF_LED; i++) { ++ if (!(ledctl->led_map & BIT(i))) { ++ continue; ++ } ++ + ret = led_classdev_register(&pdev->dev, &as4610_leds[i]); -+ -+ if (ret < 0) -+ break; ++ if (ret < 0) { ++ goto error; ++ } + } + -+ /* Check if all LEDs were successfully registered */ -+ if (i != ledctl->num_of_led){ -+ int j; ++ return 0; + ++error: ++ for (i = i-1; i >= 0; i--) { + /* only unregister the LEDs that were successfully registered */ -+ for (j = 0; j < i; j++) { -+ led_classdev_unregister(&as4610_leds[i]); ++ if (!(ledctl->led_map & BIT(i))) { ++ continue; + } ++ ++ led_classdev_unregister(&as4610_leds[i]); + } + + return ret; @@ -2508,7 +2466,11 @@ index 0000000..6f20735 +{ + int i; + -+ for (i = 0; i < ledctl->num_of_led; i++) { ++ for (i = 0; i < NUM_OF_LED; i++) { ++ if (!(ledctl->led_map & BIT(i))) { ++ continue; ++ } ++ + led_classdev_unregister(&as4610_leds[i]); + } + @@ -2518,8 +2480,6 @@ index 0000000..6f20735 +static struct platform_driver as4610_led_driver = { + .probe = as4610_led_probe, + .remove = as4610_led_remove, -+ .suspend = as4610_led_suspend, -+ .resume = as4610_led_resume, + .driver = { + .name = DRVNAME, + .owner = THIS_MODULE, @@ -2528,7 +2488,7 @@ index 0000000..6f20735 + +static int __init as4610_led_init(void) +{ -+ int ret; ++ int ret, pid; + + if (as4610_product_id() == PID_UNKNOWN) { + return -ENODEV; @@ -2546,13 +2506,12 @@ index 0000000..6f20735 + goto exit; + } + -+ if (as4610_is_poe_system()) { -+ ledctl->num_of_led = LED_TYPE_POE - LED_TYPE_SYS + 1; -+ } -+ else { -+ ledctl->num_of_led = LED_TYPE_7SEG_DIGITS_POINT - LED_TYPE_SYS + 1; ++ pid = as4610_product_id(); ++ if (pid == PID_UNKNOWN) { ++ return -ENODEV; + } + ++ ledctl->led_map = as4610_ledmaps[pid]; + mutex_init(&ledctl->update_lock); + + ledctl->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); @@ -2615,10 +2574,10 @@ index 9edd559..12f7cae 100644 +obj-$(CONFIG_EEPROM_ACCTON_AS4610_SFP) += accton_as4610_sfp.o diff --git a/drivers/misc/eeprom/accton_as4610_sfp.c b/drivers/misc/eeprom/accton_as4610_sfp.c new file mode 100644 -index 0000000..51488b4 +index 0000000..39c17ec --- /dev/null +++ b/drivers/misc/eeprom/accton_as4610_sfp.c -@@ -0,0 +1,1265 @@ +@@ -0,0 +1,1269 @@ +/* + * SFP driver for accton as4610 sfp + * @@ -2941,7 +2900,7 @@ index 0000000..51488b4 + DEBUG_PRINT("Present status = 0x%lx", data->present); +exit: + mutex_unlock(&data->update_lock); -+ return data; ++ return (status < 0) ? ERR_PTR(status) : data; +} + +static struct sfp_port_data *sfp_update_tx_rx_status(struct device *dev) @@ -3168,7 +3127,6 @@ index 0000000..51488b4 + for (i = 0; i < ARRAY_SIZE(reg); i++) { + status = sfp_eeprom_read(client, reg[i], &buf, sizeof(buf)); + if (unlikely(status < 0)) { -+ data = ERR_PTR(status); + goto exit; + } + } @@ -3178,7 +3136,6 @@ index 0000000..51488b4 + for (i = 0; i < ARRAY_SIZE(reg); i++) { + status = sfp_eeprom_read(client, reg[i], &buf, sizeof(buf)); + if (unlikely(status < 0)) { -+ data = ERR_PTR(status); + goto exit; + } + @@ -3191,7 +3148,7 @@ index 0000000..51488b4 + +exit: + mutex_unlock(&data->update_lock); -+ return data; ++ return (status < 0) ? ERR_PTR(status) : data; +} + +static ssize_t qsfp_show_tx_rx_status(struct device *dev, struct device_attribute *da, @@ -3210,7 +3167,7 @@ index 0000000..51488b4 + + if (present == 0) { + /* port is not present */ -+ return -ENODEV; ++ return -ENXIO; + } + + data = qsfp_update_tx_rx_status(dev); @@ -3220,31 +3177,31 @@ index 0000000..51488b4 + + switch (attr->index) { + case TX_FAULT: -+ val = (data->qsfp->status[2] & 0xF) ? 1 : 0; ++ val = !!(data->qsfp->status[2] & 0xF); + break; + case TX_FAULT1: + case TX_FAULT2: + case TX_FAULT3: + case TX_FAULT4: -+ val = (data->qsfp->status[2] & BIT_INDEX(attr->index - TX_FAULT1)) ? 1 : 0; ++ val = !!(data->qsfp->status[2] & BIT_INDEX(attr->index - TX_FAULT1)); + break; + case TX_DISABLE: -+ val = (data->qsfp->status[1] & 0xF) ? 1 : 0; ++ val = data->qsfp->status[1] & 0xF; + break; + case TX_DISABLE1: + case TX_DISABLE2: + case TX_DISABLE3: + case TX_DISABLE4: -+ val = (data->qsfp->status[1] & BIT_INDEX(attr->index - TX_DISABLE1)) ? 1 : 0; ++ val = !!(data->qsfp->status[1] & BIT_INDEX(attr->index - TX_DISABLE1)); + break; + case RX_LOS: -+ val = (data->qsfp->status[0] & 0xF) ? 1 : 0; ++ val = !!(data->qsfp->status[0] & 0xF); + break; + case RX_LOS1: + case RX_LOS2: + case RX_LOS3: + case RX_LOS4: -+ val = (data->qsfp->status[0] & BIT_INDEX(attr->index - RX_LOS1)) ? 1 : 0; ++ val = !!(data->qsfp->status[0] & BIT_INDEX(attr->index - RX_LOS1)); + break; + default: + break; @@ -3259,7 +3216,18 @@ index 0000000..51488b4 + long disable; + int status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); -+ struct sfp_port_data *data = NULL; ++ struct i2c_client *client = to_i2c_client(dev); ++ struct sfp_port_data *data = i2c_get_clientdata(client); ++ ++ status = sfp_is_port_present(client, data->port); ++ if (IS_ERR_VALUE(status)) { ++ return status; ++ } ++ ++ if (!status) { ++ /* port is not present */ ++ return -ENXIO; ++ } + + status = kstrtol(buf, 10, &disable); + if (status) { @@ -3274,12 +3242,7 @@ index 0000000..51488b4 + mutex_lock(&data->update_lock); + + if (attr->index == TX_DISABLE) { -+ if (disable) { -+ data->qsfp->status[1] |= 0xF; -+ } -+ else { -+ data->qsfp->status[1] &= ~0xF; -+ } ++ data->qsfp->status[1] = disable & 0xF; + } + else {/* TX_DISABLE1 ~ TX_DISABLE4*/ + if (disable) { @@ -3323,7 +3286,7 @@ index 0000000..51488b4 + return status; + } + -+ return sprintf(buf, "%d\n", (ddm & SFF8472_DIAG_MON_TYPE_DDM_MASK) ? 1 : 0); ++ return sprintf(buf, "%d\n", !!(ddm & SFF8472_DIAG_MON_TYPE_DDM_MASK)); +} + +/* Platform dependent +++ */ @@ -3855,7 +3818,7 @@ index 0000000..51488b4 + +/* Addresses scanned + */ -+static const unsigned short normal_i2c[] = { SFP_EEPROM_A0_I2C_ADDR, SFP_EEPROM_A2_I2C_ADDR, I2C_CLIENT_END }; ++static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +static struct i2c_driver sfp_driver = { + .driver = { @@ -3881,15 +3844,15 @@ index 0000000..51488b4 +MODULE_DESCRIPTION("accton as4610_sfp driver"); +MODULE_LICENSE("GPL"); + -+module_init(sfp_init); ++late_initcall(sfp_init); +module_exit(sfp_exit); + diff --git a/include/linux/accton_i2c_cpld.h b/include/linux/accton_i2c_cpld.h new file mode 100644 -index 0000000..3f13209 +index 0000000..9b75abd --- /dev/null +++ b/include/linux/accton_i2c_cpld.h -@@ -0,0 +1,53 @@ +@@ -0,0 +1,76 @@ +/* + * A hwmon driver for the accton_i2c_cpld + * @@ -3922,6 +3885,8 @@ index 0000000..3f13209 + PID_AS4610_30P, + PID_AS4610_54T, + PID_AS4610_54P, ++ PID_RESERVED, ++ PID_AS4610_54T_B, + PID_UNKNOWN +}; + @@ -3929,7 +3894,12 @@ index 0000000..3f13209 +{ + int pid = accton_i2c_cpld_read(AS4610_CPLD_SLAVE_ADDR, AS4610_CPLD_PID_OFFSET); + pid &= 0xF; -+ return (pid < PID_AS4610_30T || pid > PID_AS4610_54P) ? PID_UNKNOWN : pid; ++ ++ if (pid < PID_AS4610_30T || pid > PID_AS4610_54T_B || pid == PID_RESERVED) { ++ return PID_UNKNOWN; ++ } ++ ++ return pid; +} + +static inline int as4610_is_poe_system(void) @@ -3940,7 +3910,23 @@ index 0000000..3f13209 + +static inline int as4610_number_of_system_fan(void) +{ -+ return as4610_is_poe_system() ? 1 : 0; ++ int nFan = 0; ++ int pid = as4610_product_id(); ++ ++ switch (pid) { ++ case PID_AS4610_30P: ++ case PID_AS4610_54P: ++ nFan = 1; ++ break; ++ case PID_AS4610_54T_B: ++ nFan = 2; ++ break; ++ default: ++ nFan = 0; ++ break; ++ } ++ ++ return nFan; +} + diff --git a/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/fani.c b/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/fani.c index e6b63b14..06772562 100644 --- a/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/fani.c +++ b/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/fani.c @@ -41,6 +41,7 @@ enum onlp_fan_id { FAN_RESERVED = 0, FAN_1_ON_MAIN_BOARD, + FAN_2_ON_MAIN_BOARD, FAN_1_ON_PSU1, FAN_1_ON_PSU2 }; @@ -64,6 +65,7 @@ typedef struct fan_path_S static fan_path_T fan_path[] = /* must map with onlp_fan_id */ { { }, /* Not used */ + MAKE_FAN_PATH_ON_MAIN_BOARD(1), MAKE_FAN_PATH_ON_MAIN_BOARD(2), MAKE_FAN_PATH_ON_PSU(8-0058), MAKE_FAN_PATH_ON_PSU(8-0059) @@ -93,6 +95,7 @@ static fan_path_T fan_path[] = /* must map with onlp_fan_id */ onlp_fan_info_t linfo[] = { { }, /* Not used */ MAKE_FAN_INFO_NODE_ON_MAIN_BOARD(1), + MAKE_FAN_INFO_NODE_ON_MAIN_BOARD(2), MAKE_FAN_INFO_NODE_ON_PSU(1,1), MAKE_FAN_INFO_NODE_ON_PSU(2,1), }; @@ -222,6 +225,7 @@ onlp_fani_info_get(onlp_oid_t id, onlp_fan_info_t* info) rc = _onlp_fani_info_get_fan_on_psu(local_id, info); break; case FAN_1_ON_MAIN_BOARD: + case FAN_2_ON_MAIN_BOARD: rc =_onlp_fani_info_get_fan(local_id, info); break; default: @@ -282,6 +286,7 @@ onlp_fani_percentage_set(onlp_oid_t id, int p) sprintf(fullpath, "%s%s", PREFIX_PATH_ON_PSU, fan_path[local_id].ctrl_speed); break; case FAN_1_ON_MAIN_BOARD: + case FAN_2_ON_MAIN_BOARD: sprintf(fullpath, "%s%s", PREFIX_PATH_ON_MAIN_BOARD, fan_path[local_id].ctrl_speed); break; default: diff --git a/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/ledi.c b/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/ledi.c index b63722c2..d165e960 100644 --- a/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/ledi.c +++ b/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/ledi.c @@ -76,10 +76,11 @@ typedef enum onlp_led_id LED_STK1, LED_STK2, LED_FAN, - LED_POE + LED_POE, + LED_ALARM } onlp_led_id_t; -static char onlp_led_node_subname[][20] = /* must map with onlp_led_id */ +static char* onlp_led_node_subname[] = /* must map with onlp_led_id */ { "reserved", "7seg_tens", @@ -93,7 +94,8 @@ static char onlp_led_node_subname[][20] = /* must map with onlp_led_id */ "stk1", "stk2", "fan", - "poe" + "poe", + "alarm" }; /* @@ -162,6 +164,12 @@ static onlp_led_info_t linfo[] = ONLP_LED_CAPS_ON_OFF | ONLP_LED_CAPS_GREEN_BLINKING | ONLP_LED_CAPS_GREEN | ONLP_LED_CAPS_ORANGE | ONLP_LED_CAPS_ORANGE_BLINKING, }, + { + { ONLP_LED_ID_CREATE(LED_ALARM), "alarm", 0 }, + ONLP_LED_STATUS_PRESENT, + ONLP_LED_CAPS_ON_OFF | ONLP_LED_CAPS_GREEN_BLINKING | + ONLP_LED_CAPS_GREEN | ONLP_LED_CAPS_ORANGE | ONLP_LED_CAPS_ORANGE_BLINKING, + }, }; static int conver_led_light_mode_to_onl(uint32_t id, int led_ligth_mode) @@ -172,6 +180,7 @@ static int conver_led_light_mode_to_onl(uint32_t id, int led_ligth_mode) case LED_STK1: case LED_STK2: case LED_POE: + case LED_ALARM: case LED_7SEG_DP1: case LED_7SEG_DP2: switch (led_ligth_mode) { @@ -203,6 +212,7 @@ static int conver_onlp_led_light_mode_to_driver(uint32_t id, int led_ligth_mode) case LED_STK1: case LED_STK2: case LED_POE: + case LED_ALARM: case LED_7SEG_DP1: case LED_7SEG_DP2: switch (led_ligth_mode) { @@ -304,24 +314,48 @@ int onlp_ledi_char_get(onlp_oid_t id, char* c) return ONLP_STATUS_OK; } +static int +onlp_ledi_oid_to_internal_id(onlp_oid_t id) +{ + enum as4610_product_id pid = get_product_id(); + int lid = ONLP_OID_ID_GET(id); + + if (pid != PID_AS4610T_B) { + return lid; + } + + switch (lid) { + case 1: return LED_SYS; + case 2: return LED_PRI; + case 3: return LED_PSU1; + case 4: return LED_PSU2; + case 5: return LED_STK1; + case 6: return LED_STK2; + case 7: return LED_FAN; + case 8: return LED_ALARM; + } + + return lid; +} + int onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info) { int fd, len, nbytes=1; char data[2] = {0}; char fullpath[50] = {0}; - int lid = ONLP_OID_ID_GET(id); + int lid = onlp_ledi_oid_to_internal_id(id); VALIDATE(id); /* Set the onlp_oid_hdr_t and capabilities */ - *info = linfo[ONLP_OID_ID_GET(id)]; + *info = linfo[lid]; if (linfo[lid].caps & ONLP_LED_CAPS_CHAR) { return onlp_ledi_char_get(id, &info->character); } else { - sprintf(fullpath, "%s%s/%s", led_prefix_path, onlp_led_node_subname[ONLP_OID_ID_GET(id)], led_filename); + sprintf(fullpath, "%s%s/%s", led_prefix_path, onlp_led_node_subname[lid], led_filename); /* Set current mode */ if ((fd = open(fullpath, O_RDONLY)) == -1) { @@ -338,7 +372,7 @@ onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info) return ONLP_STATUS_E_INTERNAL; } - info->mode = conver_led_light_mode_to_onl(ONLP_OID_ID_GET(id),atoi(data)); + info->mode = conver_led_light_mode_to_onl(lid, atoi(data)); /* Set the on/off status */ if (info->mode != ONLP_LED_MODE_OFF) { @@ -382,7 +416,7 @@ onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t mode) int fd, len, driver_mode, nbytes=1; char data[2] = {0}; char fullpath[50] = {0}; - int lid = ONLP_OID_ID_GET(id); + int lid = onlp_ledi_oid_to_internal_id(id); VALIDATE(id); @@ -390,9 +424,9 @@ onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t mode) return ONLP_STATUS_E_UNSUPPORTED; } - sprintf(fullpath, "%s%s/%s", led_prefix_path, onlp_led_node_subname[ONLP_OID_ID_GET(id)], led_filename); + sprintf(fullpath, "%s%s/%s", led_prefix_path, onlp_led_node_subname[lid], led_filename); - driver_mode = conver_onlp_led_light_mode_to_driver(ONLP_OID_ID_GET(id),mode); + driver_mode = conver_onlp_led_light_mode_to_driver(lid, mode); sprintf(data, "%d", driver_mode); /* Create output file descriptor */ diff --git a/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/platform_lib.c b/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/platform_lib.c index 5d0909bb..8746297e 100644 --- a/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/platform_lib.c +++ b/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/platform_lib.c @@ -150,7 +150,7 @@ enum as4610_product_id get_product_id(void) } pid = atoi(buf); - if (pid >= PID_UNKNOWN || pid < PID_AS4610_30T) { + if (pid >= PID_UNKNOWN || pid < PID_AS4610_30T || pid == PID_RESERVED) { return PID_UNKNOWN; } @@ -160,11 +160,21 @@ enum as4610_product_id get_product_id(void) int chassis_fan_count(void) { enum as4610_product_id pid = get_product_id(); + + if (pid == PID_AS4610T_B) { + return 2; + } + return (pid == PID_AS4610_30P || pid == PID_AS4610P) ? 1 : 0; } int chassis_led_count(void) { enum as4610_product_id pid = get_product_id(); + + if (pid == PID_AS4610T_B) { + return 8; + } + return (pid == PID_AS4610_30P || pid == PID_AS4610P) ? 12 : 10; } diff --git a/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/platform_lib.h b/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/platform_lib.h index 0beab750..873e74ad 100644 --- a/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/platform_lib.h +++ b/packages/platforms/accton/armel/arm-accton-as4610/src/arm_accton_as4610/module/src/platform_lib.h @@ -79,6 +79,8 @@ enum as4610_product_id { PID_AS4610_30P, PID_AS4610T, PID_AS4610P, + PID_RESERVED, + PID_AS4610T_B, PID_UNKNOWN };