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