| /* SPDX-License-Identifier: GPL-2.0+ */ |
| |
| #ifndef _RTL8366RB_H |
| #define _RTL8366RB_H |
| |
| #include "realtek.h" |
| |
| #define RTL8366RB_PORT_NUM_CPU 5 |
| #define RTL8366RB_NUM_PORTS 6 |
| #define RTL8366RB_PHY_NO_MAX 4 |
| #define RTL8366RB_NUM_LEDGROUPS 4 |
| #define RTL8366RB_PHY_ADDR_MAX 31 |
| |
| /* LED control registers */ |
| /* The LED blink rate is global; it is used by all triggers in all groups. */ |
| #define RTL8366RB_LED_BLINKRATE_REG 0x0430 |
| #define RTL8366RB_LED_BLINKRATE_MASK 0x0007 |
| #define RTL8366RB_LED_BLINKRATE_28MS 0x0000 |
| #define RTL8366RB_LED_BLINKRATE_56MS 0x0001 |
| #define RTL8366RB_LED_BLINKRATE_84MS 0x0002 |
| #define RTL8366RB_LED_BLINKRATE_111MS 0x0003 |
| #define RTL8366RB_LED_BLINKRATE_222MS 0x0004 |
| #define RTL8366RB_LED_BLINKRATE_446MS 0x0005 |
| |
| /* LED trigger event for each group */ |
| #define RTL8366RB_LED_CTRL_REG 0x0431 |
| #define RTL8366RB_LED_CTRL_OFFSET(led_group) \ |
| (4 * (led_group)) |
| #define RTL8366RB_LED_CTRL_MASK(led_group) \ |
| (0xf << RTL8366RB_LED_CTRL_OFFSET(led_group)) |
| |
| /* The RTL8366RB_LED_X_X registers are used to manually set the LED state only |
| * when the corresponding LED group in RTL8366RB_LED_CTRL_REG is |
| * RTL8366RB_LEDGROUP_FORCE. Otherwise, it is ignored. |
| */ |
| #define RTL8366RB_LED_0_1_CTRL_REG 0x0432 |
| #define RTL8366RB_LED_2_3_CTRL_REG 0x0433 |
| #define RTL8366RB_LED_X_X_CTRL_REG(led_group) \ |
| ((led_group) <= 1 ? \ |
| RTL8366RB_LED_0_1_CTRL_REG : \ |
| RTL8366RB_LED_2_3_CTRL_REG) |
| #define RTL8366RB_LED_0_X_CTRL_MASK GENMASK(5, 0) |
| #define RTL8366RB_LED_X_1_CTRL_MASK GENMASK(11, 6) |
| #define RTL8366RB_LED_2_X_CTRL_MASK GENMASK(5, 0) |
| #define RTL8366RB_LED_X_3_CTRL_MASK GENMASK(11, 6) |
| |
| enum rtl8366_ledgroup_mode { |
| RTL8366RB_LEDGROUP_OFF = 0x0, |
| RTL8366RB_LEDGROUP_DUP_COL = 0x1, |
| RTL8366RB_LEDGROUP_LINK_ACT = 0x2, |
| RTL8366RB_LEDGROUP_SPD1000 = 0x3, |
| RTL8366RB_LEDGROUP_SPD100 = 0x4, |
| RTL8366RB_LEDGROUP_SPD10 = 0x5, |
| RTL8366RB_LEDGROUP_SPD1000_ACT = 0x6, |
| RTL8366RB_LEDGROUP_SPD100_ACT = 0x7, |
| RTL8366RB_LEDGROUP_SPD10_ACT = 0x8, |
| RTL8366RB_LEDGROUP_SPD100_10_ACT = 0x9, |
| RTL8366RB_LEDGROUP_FIBER = 0xa, |
| RTL8366RB_LEDGROUP_AN_FAULT = 0xb, |
| RTL8366RB_LEDGROUP_LINK_RX = 0xc, |
| RTL8366RB_LEDGROUP_LINK_TX = 0xd, |
| RTL8366RB_LEDGROUP_MASTER = 0xe, |
| RTL8366RB_LEDGROUP_FORCE = 0xf, |
| |
| __RTL8366RB_LEDGROUP_MODE_MAX |
| }; |
| |
| #if IS_ENABLED(CONFIG_NET_DSA_REALTEK_RTL8366RB_LEDS) |
| |
| struct rtl8366rb_led { |
| u8 port_num; |
| u8 led_group; |
| struct realtek_priv *priv; |
| struct led_classdev cdev; |
| }; |
| |
| int rtl8366rb_setup_leds(struct realtek_priv *priv); |
| |
| #else |
| |
| static inline int rtl8366rb_setup_leds(struct realtek_priv *priv) |
| { |
| return 0; |
| } |
| |
| #endif /* IS_ENABLED(CONFIG_LEDS_CLASS) */ |
| |
| /** |
| * struct rtl8366rb - RTL8366RB-specific data |
| * @max_mtu: per-port max MTU setting |
| * @pvid_enabled: if PVID is set for respective port |
| * @leds: per-port and per-ledgroup led info |
| */ |
| struct rtl8366rb { |
| unsigned int max_mtu[RTL8366RB_NUM_PORTS]; |
| bool pvid_enabled[RTL8366RB_NUM_PORTS]; |
| #if IS_ENABLED(CONFIG_NET_DSA_REALTEK_RTL8366RB_LEDS) |
| struct rtl8366rb_led leds[RTL8366RB_NUM_PORTS][RTL8366RB_NUM_LEDGROUPS]; |
| #endif |
| }; |
| |
| /* This code is used also with LEDs disabled */ |
| int rb8366rb_set_ledgroup_mode(struct realtek_priv *priv, |
| u8 led_group, |
| enum rtl8366_ledgroup_mode mode); |
| |
| #endif /* _RTL8366RB_H */ |