xref: /linux/drivers/net/dsa/motorcomm/leds.h (revision 9af9a816821365e57736307bfdfcf06d89065556)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Copyright (c) 2026 David Yang
4  */
5 
6 #ifndef _YT_LEDS_H
7 #define _YT_LEDS_H
8 
9 #include <linux/bitfield.h>
10 #include <linux/bits.h>
11 #include <linux/kconfig.h>
12 #include <linux/leds.h>
13 
14 #define YT921X_LED_CTRL			0xd0000
15 #define  YT921X_LED_CTRL_UNK			BIT(21)
16 #define  YT921X_LED_CTRL_LOOPDETECT_BLINK_M	GENMASK(20, 19)	/* cycle = 512 * x ms */
17 #define   YT921X_LED_CTRL_LOOPDETECT_BLINK(x)		FIELD_PREP(YT921X_LED_CTRL_LOOPDETECT_BLINK_M, (x))
18 #define  YT921X_LED_CTRL_PORT_NUM_M		GENMASK(16, 13)
19 #define   YT921X_LED_CTRL_PORT_NUM(x)			FIELD_PREP(YT921X_LED_CTRL_PORT_NUM_M, (x))
20 #define  YT921X_LED_CTRL_MODE_M			GENMASK(1, 0)
21 #define   YT921X_LED_CTRL_MODE(x)			FIELD_PREP(YT921X_LED_CTRL_MODE_M, (x))
22 #define   YT921X_LED_CTRL_MODE_PARALLEL			YT921X_LED_CTRL_MODE(0)
23 #define   YT921X_LED_CTRL_MODE_SERIAL			YT921X_LED_CTRL_MODE(2)
24 #define YT921X_LED0_PORTn(port)		(0xd0004 + 4 * (port))
25 #define  YT921X_LED0_PORT_ACT_M			GENMASK(17, 0)
26 #define  YT921X_LED0_PORT_ACT_LINK_TRY_DIS	BIT(17)
27 #define  YT921X_LED0_PORT_ACT_COLLISION_BLINK_INDI	BIT(16)
28 #define YT921X_LED1_PORTn(port)		(0xd0040 + 4 * (port))
29 #define  YT921X_LED1_PORT_OTHER_BLINK_M		GENMASK(31, 30)	/* cycle = 512 >> x ms */
30 #define   YT921X_LED1_PORT_OTHER_BLINK(x)		FIELD_PREP(YT921X_LED1_PORT_OTHER_BLINK_M, (x))
31 #define  YT921X_LED1_PORT_EEE_BLINK_M		GENMASK(29, 28)	/* cycle = 512 >> x ms */
32 #define   YT921X_LED1_PORT_EEE_BLINK(x)			FIELD_PREP(YT921X_LED1_PORT_EEE_BLINK_M, (x))
33 #define  YT921X_LED1_PORT_BLINK_DUTY_COMP	BIT(27)
34 #define  YT921X_LED1_PORT_BLINK_DUTY_M		GENMASK(26, 25)
35 #define   YT921X_LED1_PORT_BLINK_DUTY(x)		FIELD_PREP(YT921X_LED1_PORT_BLINK_DUTY_M, (x))
36 #define   YT921X_LED1_PORT_BLINK_DUTY_1_2		YT921X_LED1_PORT_BLINK_DUTY(0)
37 #define   YT921X_LED1_PORT_BLINK_DUTY_2_3		YT921X_LED1_PORT_BLINK_DUTY(1)
38 #define   YT921X_LED1_PORT_BLINK_DUTY_3_4		YT921X_LED1_PORT_BLINK_DUTY(2)
39 #define   YT921X_LED1_PORT_BLINK_DUTY_5_6		YT921X_LED1_PORT_BLINK_DUTY(3)
40 #define YT921X_LED2_PORTn(port)		(0xd0080 + 4 * (port))
41 #define  YT921X_LED2_PORT_FORCEn_M(grp)		GENMASK(4 * (grp) + 19, 4 * (grp) + 18)
42 #define   YT921X_LED2_PORT_FORCEn(grp, x)		((x) << (4 * (grp) + 18))
43 #define   YT921X_LED2_PORT_FORCEn_DONTCARE(grp)		YT921X_LED2_PORT_FORCEn(grp, 0)
44 #define   YT921X_LED2_PORT_FORCEn_BLINK(grp)		YT921X_LED2_PORT_FORCEn(grp, 1)
45 #define   YT921X_LED2_PORT_FORCEn_ON(grp)		YT921X_LED2_PORT_FORCEn(grp, 2)
46 #define   YT921X_LED2_PORT_FORCEn_OFF(grp)		YT921X_LED2_PORT_FORCEn(grp, 3)
47 #define  YT921X_LED2_PORT_FORCE_BLINKn_M(grp)	GENMASK(4 * (grp) + 17, 4 * (grp) + 16)	/* cycle = 512 << x ms */
48 #define   YT921X_LED2_PORT_FORCE_BLINKn(grp, x)		((x) << (4 * (grp) + 16))
49 #define   YT921X_LED2_PORT_FORCE_BLINKn_OTHER(grp)	YT921X_LED2_PORT_FORCE_BLINKn(grp, 3)
50 #define  YT921X_LEDx_PORT_ACT_M			GENMASK(15, 0)
51 #define  YT921X_LEDx_PORT_ACT_EEE_BLINK		BIT(15)
52 #define  YT921X_LEDx_PORT_ACT_LOOPDETECT_BLINK	BIT(14)
53 #define  YT921X_LEDx_PORT_ACT_ACTIVE_BLINK	BIT(13)
54 #define  YT921X_LEDx_PORT_ACT_DUPLEX_FULL	BIT(12)
55 #define  YT921X_LEDx_PORT_ACT_DUPLEX_HALF	BIT(11)
56 #define  YT921X_LEDx_PORT_ACT_TX_BLINK		BIT(10)
57 #define  YT921X_LEDx_PORT_ACT_RX_BLINK		BIT(9)
58 #define  YT921X_LEDx_PORT_ACT_TX		BIT(8)
59 #define  YT921X_LEDx_PORT_ACT_RX		BIT(7)
60 #define  YT921X_LEDx_PORT_ACT_1000M		BIT(6)
61 #define  YT921X_LEDx_PORT_ACT_100M		BIT(5)
62 #define  YT921X_LEDx_PORT_ACT_10M		BIT(4)
63 #define  YT921X_LEDx_PORT_ACT_COLLISION_BLINK	BIT(3)
64 #define  YT921X_LEDx_PORT_ACT_1000M_BLINK	BIT(2)
65 #define  YT921X_LEDx_PORT_ACT_100M_BLINK	BIT(1)
66 #define  YT921X_LEDx_PORT_ACT_10M_BLINK		BIT(0)
67 #define YT921X_LED_SER_CTRL		0xd0100
68 #define  YT921X_LED_SER_CTRL_UNK		GENMASK(25, 24)	/* delay? */
69 #define  YT921X_LED_SER_CTRL_ACTIVE_LOW		BIT(4)
70 #define  YT921X_LED_SER_CTRL_GRP_NUM_M		GENMASK(1, 0)	/* #grp - 1 */
71 #define   YT921X_LED_SER_CTRL_GRP_NUM(x)		FIELD_PREP(YT921X_LED_SER_CTRL_GRP_NUM_M, (x))
72 #define YT921X_LED_SER_MAPnm(grp, port)	(0xd0104 + 8 * (2 - (grp)) + 4 * ((port) / 5))
73 #define  YT921X_LED_SER_MAP_DSTn_PORT_M(port)	GENMASK(6 * ((port) % 5) + 5, 6 * ((port) % 5) + 2)
74 #define   YT921X_LED_SER_MAP_DSTn_PORT(port, x)		((x) << (6 * ((port) % 5) + 2))
75 #define  YT921X_LED_SER_MAP_DSTn_LED_M(port)	GENMASK(6 * ((port) % 5) + 1, 6 * ((port) % 5))
76 #define   YT921X_LED_SER_MAP_DSTn_LED(port, x)		((x) << (6 * ((port) % 5)))
77 #define YT921X_LED_PAR_PORTS		0xd01c4
78 #define YT921X_LED_PAR_INV		0xd01c8
79 #define  YT921X_LED_PAR_INV_INVnm(grp, port)	BIT(10 * (grp) + (port))
80 #define YT921X_LED_PAR_MAPn(port)	(0xd01d0 + 4 * (port))
81 #define  YT921X_LED_PAR_MAP_DSTn_PORT_M(grp)	GENMASK(6 * (grp) + 5, 6 * (grp) + 2)
82 #define   YT921X_LED_PAR_MAP_DSTn_PORT(grp, x)		((x) << (6 * (grp) + 2))
83 #define  YT921X_LED_PAR_MAP_DSTn_LED_M(grp)	GENMASK(6 * (grp) + 1, 6 * (grp))
84 #define   YT921X_LED_PAR_MAP_DSTn_LED(grp, x)		((x) << (6 * (grp)))
85 
86 #define YT921X_LED_BLINK_MIN	64
87 #define YT921X_LED_BLINK_DEF	512
88 #define YT921X_LED_BLINK_MAX	2048
89 
90 /* 2 * lcm(2, 3, 4, 6) */
91 #define YT921X_LED_DUTY_DENOM		24
92 #define YT921X_LED_DUTY(nom, denom)	(YT921X_LED_DUTY_DENOM * (nom) / (denom))
93 
94 struct yt921x_priv;
95 
96 struct yt921x_led {
97 	struct led_classdev cdev;
98 	struct yt921x_port *port;
99 	unsigned char group;
100 };
101 
102 #if IS_ENABLED(CONFIG_NET_DSA_YT921X_LEDS)
103 
104 void yt921x_leds_remove(struct yt921x_priv *priv);
105 int yt921x_leds_setup(struct yt921x_priv *priv);
106 
107 #else
108 
109 static inline void yt921x_leds_remove(struct yt921x_priv *priv) {}
110 
111 static inline int yt921x_leds_setup(struct yt921x_priv *priv)
112 {
113 	return 0;
114 }
115 
116 #endif
117 
118 #endif
119