Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: phy: broadcom: Add support for setting LED brightness

Broadcom PHYs have two LEDs selector registers which allow us to control
the LED assignment, including how to turn them on/off.

Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Florian Fainelli and committed by
David S. Miller
bd5736e1 57fd7d59

+48
+27
drivers/net/phy/bcm-phy-lib.c
··· 1039 1039 } 1040 1040 EXPORT_SYMBOL_GPL(bcm_phy_wol_isr); 1041 1041 1042 + int bcm_phy_led_brightness_set(struct phy_device *phydev, 1043 + u8 index, enum led_brightness value) 1044 + { 1045 + u8 led_num; 1046 + int ret; 1047 + u16 reg; 1048 + 1049 + if (index >= 4) 1050 + return -EINVAL; 1051 + 1052 + /* Two LEDS per register */ 1053 + led_num = index % 2; 1054 + reg = index >= 2 ? BCM54XX_SHD_LEDS2 : BCM54XX_SHD_LEDS1; 1055 + 1056 + ret = bcm_phy_read_shadow(phydev, reg); 1057 + if (ret < 0) 1058 + return ret; 1059 + 1060 + ret &= ~(BCM_LED_SRC_MASK << BCM54XX_SHD_LEDS_SHIFT(led_num)); 1061 + if (value == LED_OFF) 1062 + ret |= BCM_LED_SRC_OFF << BCM54XX_SHD_LEDS_SHIFT(led_num); 1063 + else 1064 + ret |= BCM_LED_SRC_ON << BCM54XX_SHD_LEDS_SHIFT(led_num); 1065 + return bcm_phy_write_shadow(phydev, reg, ret); 1066 + } 1067 + EXPORT_SYMBOL_GPL(bcm_phy_led_brightness_set); 1068 + 1042 1069 MODULE_DESCRIPTION("Broadcom PHY Library"); 1043 1070 MODULE_LICENSE("GPL v2"); 1044 1071 MODULE_AUTHOR("Broadcom Corporation");
+3
drivers/net/phy/bcm-phy-lib.h
··· 118 118 void bcm_phy_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol); 119 119 irqreturn_t bcm_phy_wol_isr(int irq, void *dev_id); 120 120 121 + int bcm_phy_led_brightness_set(struct phy_device *phydev, 122 + u8 index, enum led_brightness value); 123 + 121 124 #endif /* _LINUX_BCM_PHY_LIB_H */
+15
drivers/net/phy/broadcom.c
··· 1031 1031 .resume = bcm54xx_resume, 1032 1032 .get_wol = bcm54xx_phy_get_wol, 1033 1033 .set_wol = bcm54xx_phy_set_wol, 1034 + .led_brightness_set = bcm_phy_led_brightness_set, 1034 1035 }, { 1035 1036 .phy_id = PHY_ID_BCM5461, 1036 1037 .phy_id_mask = 0xfffffff0, ··· 1045 1044 .config_intr = bcm_phy_config_intr, 1046 1045 .handle_interrupt = bcm_phy_handle_interrupt, 1047 1046 .link_change_notify = bcm54xx_link_change_notify, 1047 + .led_brightness_set = bcm_phy_led_brightness_set, 1048 1048 }, { 1049 1049 .phy_id = PHY_ID_BCM54612E, 1050 1050 .phy_id_mask = 0xfffffff0, ··· 1059 1057 .config_intr = bcm_phy_config_intr, 1060 1058 .handle_interrupt = bcm_phy_handle_interrupt, 1061 1059 .link_change_notify = bcm54xx_link_change_notify, 1060 + .led_brightness_set = bcm_phy_led_brightness_set, 1062 1061 }, { 1063 1062 .phy_id = PHY_ID_BCM54616S, 1064 1063 .phy_id_mask = 0xfffffff0, ··· 1073 1070 .read_status = bcm54616s_read_status, 1074 1071 .probe = bcm54616s_probe, 1075 1072 .link_change_notify = bcm54xx_link_change_notify, 1073 + .led_brightness_set = bcm_phy_led_brightness_set, 1076 1074 }, { 1077 1075 .phy_id = PHY_ID_BCM5464, 1078 1076 .phy_id_mask = 0xfffffff0, ··· 1089 1085 .suspend = genphy_suspend, 1090 1086 .resume = genphy_resume, 1091 1087 .link_change_notify = bcm54xx_link_change_notify, 1088 + .led_brightness_set = bcm_phy_led_brightness_set, 1092 1089 }, { 1093 1090 .phy_id = PHY_ID_BCM5481, 1094 1091 .phy_id_mask = 0xfffffff0, ··· 1104 1099 .config_intr = bcm_phy_config_intr, 1105 1100 .handle_interrupt = bcm_phy_handle_interrupt, 1106 1101 .link_change_notify = bcm54xx_link_change_notify, 1102 + .led_brightness_set = bcm_phy_led_brightness_set, 1107 1103 }, { 1108 1104 .phy_id = PHY_ID_BCM54810, 1109 1105 .phy_id_mask = 0xfffffff0, ··· 1121 1115 .suspend = bcm54xx_suspend, 1122 1116 .resume = bcm54xx_resume, 1123 1117 .link_change_notify = bcm54xx_link_change_notify, 1118 + .led_brightness_set = bcm_phy_led_brightness_set, 1124 1119 }, { 1125 1120 .phy_id = PHY_ID_BCM54811, 1126 1121 .phy_id_mask = 0xfffffff0, ··· 1138 1131 .suspend = bcm54xx_suspend, 1139 1132 .resume = bcm54xx_resume, 1140 1133 .link_change_notify = bcm54xx_link_change_notify, 1134 + .led_brightness_set = bcm_phy_led_brightness_set, 1141 1135 }, { 1142 1136 .phy_id = PHY_ID_BCM5482, 1143 1137 .phy_id_mask = 0xfffffff0, ··· 1152 1144 .config_intr = bcm_phy_config_intr, 1153 1145 .handle_interrupt = bcm_phy_handle_interrupt, 1154 1146 .link_change_notify = bcm54xx_link_change_notify, 1147 + .led_brightness_set = bcm_phy_led_brightness_set, 1155 1148 }, { 1156 1149 .phy_id = PHY_ID_BCM50610, 1157 1150 .phy_id_mask = 0xfffffff0, ··· 1168 1159 .link_change_notify = bcm54xx_link_change_notify, 1169 1160 .suspend = bcm54xx_suspend, 1170 1161 .resume = bcm54xx_resume, 1162 + .led_brightness_set = bcm_phy_led_brightness_set, 1171 1163 }, { 1172 1164 .phy_id = PHY_ID_BCM50610M, 1173 1165 .phy_id_mask = 0xfffffff0, ··· 1184 1174 .link_change_notify = bcm54xx_link_change_notify, 1185 1175 .suspend = bcm54xx_suspend, 1186 1176 .resume = bcm54xx_resume, 1177 + .led_brightness_set = bcm_phy_led_brightness_set, 1187 1178 }, { 1188 1179 .phy_id = PHY_ID_BCM57780, 1189 1180 .phy_id_mask = 0xfffffff0, ··· 1198 1187 .config_intr = bcm_phy_config_intr, 1199 1188 .handle_interrupt = bcm_phy_handle_interrupt, 1200 1189 .link_change_notify = bcm54xx_link_change_notify, 1190 + .led_brightness_set = bcm_phy_led_brightness_set, 1201 1191 }, { 1202 1192 .phy_id = PHY_ID_BCMAC131, 1203 1193 .phy_id_mask = 0xfffffff0, ··· 1230 1218 .get_stats = bcm54xx_get_stats, 1231 1219 .probe = bcm54xx_phy_probe, 1232 1220 .link_change_notify = bcm54xx_link_change_notify, 1221 + .led_brightness_set = bcm_phy_led_brightness_set, 1233 1222 }, { 1234 1223 .phy_id = PHY_ID_BCM53125, 1235 1224 .phy_id_mask = 0xfffffff0, ··· 1245 1232 .config_intr = bcm_phy_config_intr, 1246 1233 .handle_interrupt = bcm_phy_handle_interrupt, 1247 1234 .link_change_notify = bcm54xx_link_change_notify, 1235 + .led_brightness_set = bcm_phy_led_brightness_set, 1248 1236 }, { 1249 1237 .phy_id = PHY_ID_BCM53128, 1250 1238 .phy_id_mask = 0xfffffff0, ··· 1260 1246 .config_intr = bcm_phy_config_intr, 1261 1247 .handle_interrupt = bcm_phy_handle_interrupt, 1262 1248 .link_change_notify = bcm54xx_link_change_notify, 1249 + .led_brightness_set = bcm_phy_led_brightness_set, 1263 1250 }, { 1264 1251 .phy_id = PHY_ID_BCM89610, 1265 1252 .phy_id_mask = 0xfffffff0,
+3
include/linux/brcmphy.h
··· 161 161 #define BCM_LED_SRC_OPENSHORT 0xb 162 162 #define BCM_LED_SRC_OFF 0xe /* Tied high */ 163 163 #define BCM_LED_SRC_ON 0xf /* Tied low */ 164 + #define BCM_LED_SRC_MASK GENMASK(3, 0) 164 165 165 166 /* 166 167 * Broadcom Multicolor LED configurations (expansion register 4) ··· 209 208 210 209 #define BCM54XX_SHD_LEDS1 0x0d /* 01101: LED Selector 1 */ 211 210 /* LED3 / ~LINKSPD[2] selector */ 211 + #define BCM54XX_SHD_LEDS_SHIFT(led) (4 * (led)) 212 212 #define BCM54XX_SHD_LEDS1_LED3(src) ((src & 0xf) << 4) 213 213 /* LED1 / ~LINKSPD[1] selector */ 214 214 #define BCM54XX_SHD_LEDS1_LED1(src) ((src & 0xf) << 0) 215 + #define BCM54XX_SHD_LEDS2 0x0e /* 01110: LED Selector 2 */ 215 216 #define BCM54XX_SHD_RGMII_MODE 0x0b /* 01011: RGMII Mode Selector */ 216 217 #define BCM5482_SHD_SSD 0x14 /* 10100: Secondary SerDes control */ 217 218 #define BCM5482_SHD_SSD_LEDM 0x0008 /* SSD LED Mode enable */