xref: /linux/drivers/net/dsa/realtek/rtl8366rb.h (revision 1e15510b71c99c6e49134d756df91069f7d18141)
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 
3 #ifndef _RTL8366RB_H
4 #define _RTL8366RB_H
5 
6 #include "realtek.h"
7 
8 #define RTL8366RB_PORT_NUM_CPU		5
9 #define RTL8366RB_NUM_PORTS		6
10 #define RTL8366RB_PHY_NO_MAX		4
11 #define RTL8366RB_NUM_LEDGROUPS		4
12 #define RTL8366RB_PHY_ADDR_MAX		31
13 
14 /* LED control registers */
15 /* The LED blink rate is global; it is used by all triggers in all groups. */
16 #define RTL8366RB_LED_BLINKRATE_REG		0x0430
17 #define RTL8366RB_LED_BLINKRATE_MASK		0x0007
18 #define RTL8366RB_LED_BLINKRATE_28MS		0x0000
19 #define RTL8366RB_LED_BLINKRATE_56MS		0x0001
20 #define RTL8366RB_LED_BLINKRATE_84MS		0x0002
21 #define RTL8366RB_LED_BLINKRATE_111MS		0x0003
22 #define RTL8366RB_LED_BLINKRATE_222MS		0x0004
23 #define RTL8366RB_LED_BLINKRATE_446MS		0x0005
24 
25 /* LED trigger event for each group */
26 #define RTL8366RB_LED_CTRL_REG			0x0431
27 #define RTL8366RB_LED_CTRL_OFFSET(led_group)	\
28 	(4 * (led_group))
29 #define RTL8366RB_LED_CTRL_MASK(led_group)	\
30 	(0xf << RTL8366RB_LED_CTRL_OFFSET(led_group))
31 
32 /* The RTL8366RB_LED_X_X registers are used to manually set the LED state only
33  * when the corresponding LED group in RTL8366RB_LED_CTRL_REG is
34  * RTL8366RB_LEDGROUP_FORCE. Otherwise, it is ignored.
35  */
36 #define RTL8366RB_LED_0_1_CTRL_REG		0x0432
37 #define RTL8366RB_LED_2_3_CTRL_REG		0x0433
38 #define RTL8366RB_LED_X_X_CTRL_REG(led_group)	\
39 	((led_group) <= 1 ? \
40 		RTL8366RB_LED_0_1_CTRL_REG : \
41 		RTL8366RB_LED_2_3_CTRL_REG)
42 #define RTL8366RB_LED_0_X_CTRL_MASK		GENMASK(5, 0)
43 #define RTL8366RB_LED_X_1_CTRL_MASK		GENMASK(11, 6)
44 #define RTL8366RB_LED_2_X_CTRL_MASK		GENMASK(5, 0)
45 #define RTL8366RB_LED_X_3_CTRL_MASK		GENMASK(11, 6)
46 
47 enum rtl8366_ledgroup_mode {
48 	RTL8366RB_LEDGROUP_OFF			= 0x0,
49 	RTL8366RB_LEDGROUP_DUP_COL		= 0x1,
50 	RTL8366RB_LEDGROUP_LINK_ACT		= 0x2,
51 	RTL8366RB_LEDGROUP_SPD1000		= 0x3,
52 	RTL8366RB_LEDGROUP_SPD100		= 0x4,
53 	RTL8366RB_LEDGROUP_SPD10		= 0x5,
54 	RTL8366RB_LEDGROUP_SPD1000_ACT		= 0x6,
55 	RTL8366RB_LEDGROUP_SPD100_ACT		= 0x7,
56 	RTL8366RB_LEDGROUP_SPD10_ACT		= 0x8,
57 	RTL8366RB_LEDGROUP_SPD100_10_ACT	= 0x9,
58 	RTL8366RB_LEDGROUP_FIBER		= 0xa,
59 	RTL8366RB_LEDGROUP_AN_FAULT		= 0xb,
60 	RTL8366RB_LEDGROUP_LINK_RX		= 0xc,
61 	RTL8366RB_LEDGROUP_LINK_TX		= 0xd,
62 	RTL8366RB_LEDGROUP_MASTER		= 0xe,
63 	RTL8366RB_LEDGROUP_FORCE		= 0xf,
64 
65 	__RTL8366RB_LEDGROUP_MODE_MAX
66 };
67 
68 #if IS_ENABLED(CONFIG_NET_DSA_REALTEK_RTL8366RB_LEDS)
69 
70 struct rtl8366rb_led {
71 	u8 port_num;
72 	u8 led_group;
73 	struct realtek_priv *priv;
74 	struct led_classdev cdev;
75 };
76 
77 int rtl8366rb_setup_leds(struct realtek_priv *priv);
78 
79 #else
80 
rtl8366rb_setup_leds(struct realtek_priv * priv)81 static inline int rtl8366rb_setup_leds(struct realtek_priv *priv)
82 {
83 	return 0;
84 }
85 
86 #endif /* IS_ENABLED(CONFIG_LEDS_CLASS) */
87 
88 /**
89  * struct rtl8366rb - RTL8366RB-specific data
90  * @max_mtu: per-port max MTU setting
91  * @pvid_enabled: if PVID is set for respective port
92  * @leds: per-port and per-ledgroup led info
93  */
94 struct rtl8366rb {
95 	unsigned int max_mtu[RTL8366RB_NUM_PORTS];
96 	bool pvid_enabled[RTL8366RB_NUM_PORTS];
97 #if IS_ENABLED(CONFIG_NET_DSA_REALTEK_RTL8366RB_LEDS)
98 	struct rtl8366rb_led leds[RTL8366RB_NUM_PORTS][RTL8366RB_NUM_LEDGROUPS];
99 #endif
100 };
101 
102 /* This code is used also with LEDs disabled */
103 int rb8366rb_set_ledgroup_mode(struct realtek_priv *priv,
104 			       u8 led_group,
105 			       enum rtl8366_ledgroup_mode mode);
106 
107 #endif /* _RTL8366RB_H */
108