1LEDs connected to Broadcom BCM6328 controller 2 3This controller is present on BCM6318, BCM6328, BCM6362 and BCM63268. 4In these SoCs it's possible to control LEDs both as GPIOs or by hardware. 5However, on some devices there are Serial LEDs (LEDs connected to a 74x164 6controller), which can either be controlled by software (exporting the 74x164 7as spi-gpio. See Documentation/devicetree/bindings/gpio/fairchild,74hc595.yaml), 8or by hardware using this driver. 9Some of these Serial LEDs are hardware controlled (e.g. ethernet LEDs) and 10exporting the 74x164 as spi-gpio prevents those LEDs to be hardware 11controlled, so the only chance to keep them working is by using this driver. 12 13BCM6328 LED controller has a HWDIS register, which controls whether a LED 14should be controlled by a hardware signal instead of the MODE register value, 15with 0 meaning hardware control enabled and 1 hardware control disabled. This 16is usually 1:1 for hardware to LED signals, but through the activity/link 17registers you have some limited control over rerouting the LEDs (as 18explained later in brcm,link-signal-sources). Even if a LED is hardware 19controlled you are still able to make it blink or light it up if it isn't, 20but you can't turn it off if the hardware decides to light it up. For this 21reason, hardware controlled LEDs aren't registered as LED class devices. 22 23Required properties: 24 - compatible : should be "brcm,bcm6328-leds". 25 - #address-cells : must be 1. 26 - #size-cells : must be 0. 27 - reg : BCM6328 LED controller address and size. 28 29Optional properties: 30 - brcm,serial-leds : Boolean, enables Serial LEDs. 31 Default : false 32 - brcm,serial-mux : Boolean, enables Serial LEDs multiplexing. 33 Default : false 34 - brcm,serial-clk-low : Boolean, makes clock signal active low. 35 Default : false 36 - brcm,serial-dat-low : Boolean, makes data signal active low. 37 Default : false 38 - brcm,serial-shift-inv : Boolean, inverts Serial LEDs shift direction. 39 Default : false 40 41Each LED is represented as a sub-node of the brcm,bcm6328-leds device. 42 43LED sub-node required properties: 44 - reg : LED pin number (only LEDs 0 to 23 are valid). 45 46LED sub-node optional properties: 47 a) Optional properties for sub-nodes related to software controlled LEDs: 48 - label : see Documentation/devicetree/bindings/leds/common.txt 49 - active-low : Boolean, makes LED active low. 50 Default : false 51 - default-state : see 52 Documentation/devicetree/bindings/leds/common.txt 53 - linux,default-trigger : see 54 Documentation/devicetree/bindings/leds/common.txt 55 56 b) Optional properties for sub-nodes related to hardware controlled LEDs: 57 - brcm,hardware-controlled : Boolean, makes this LED hardware controlled. 58 Default : false 59 - brcm,link-signal-sources : An array of hardware link 60 signal sources. Up to four link hardware signals can get muxed into 61 these LEDs. Only valid for LEDs 0 to 7, where LED signals 0 to 3 may 62 be muxed to LEDs 0 to 3, and signals 4 to 7 may be muxed to LEDs 63 4 to 7. A signal can be muxed to more than one LED, and one LED can 64 have more than one source signal. 65 - brcm,activity-signal-sources : An array of hardware activity 66 signal sources. Up to four activity hardware signals can get muxed into 67 these LEDs. Only valid for LEDs 0 to 7, where LED signals 0 to 3 may 68 be muxed to LEDs 0 to 3, and signals 4 to 7 may be muxed to LEDs 69 4 to 7. A signal can be muxed to more than one LED, and one LED can 70 have more than one source signal. 71 72Examples: 73Scenario 1 : BCM6328 with 4 EPHY LEDs 74 leds0: led-controller@10000800 { 75 compatible = "brcm,bcm6328-leds"; 76 #address-cells = <1>; 77 #size-cells = <0>; 78 reg = <0x10000800 0x24>; 79 80 alarm_red@2 { 81 reg = <2>; 82 active-low; 83 label = "red:alarm"; 84 }; 85 inet_green@3 { 86 reg = <3>; 87 active-low; 88 label = "green:inet"; 89 }; 90 power_green@4 { 91 reg = <4>; 92 active-low; 93 label = "green:power"; 94 default-state = "on"; 95 }; 96 ephy0_spd@17 { 97 reg = <17>; 98 brcm,hardware-controlled; 99 }; 100 ephy1_spd@18 { 101 reg = <18>; 102 brcm,hardware-controlled; 103 }; 104 ephy2_spd@19 { 105 reg = <19>; 106 brcm,hardware-controlled; 107 }; 108 ephy3_spd@20 { 109 reg = <20>; 110 brcm,hardware-controlled; 111 }; 112 }; 113 114Scenario 2 : BCM63268 with Serial/GPHY0 LEDs 115 leds0: led-controller@10001900 { 116 compatible = "brcm,bcm6328-leds"; 117 #address-cells = <1>; 118 #size-cells = <0>; 119 reg = <0x10001900 0x24>; 120 brcm,serial-leds; 121 brcm,serial-dat-low; 122 brcm,serial-shift-inv; 123 124 gphy0_spd0@0 { 125 reg = <0>; 126 brcm,hardware-controlled; 127 brcm,link-signal-sources = <0>; 128 }; 129 gphy0_spd1@1 { 130 reg = <1>; 131 brcm,hardware-controlled; 132 brcm,link-signal-sources = <1>; 133 }; 134 inet_red@2 { 135 reg = <2>; 136 active-low; 137 label = "red:inet"; 138 }; 139 dsl_green@3 { 140 reg = <3>; 141 active-low; 142 label = "green:dsl"; 143 }; 144 usb_green@4 { 145 reg = <4>; 146 active-low; 147 label = "green:usb"; 148 }; 149 wps_green@7 { 150 reg = <7>; 151 active-low; 152 label = "green:wps"; 153 }; 154 inet_green@8 { 155 reg = <8>; 156 active-low; 157 label = "green:inet"; 158 }; 159 ephy0_act@9 { 160 reg = <9>; 161 brcm,hardware-controlled; 162 }; 163 ephy1_act@10 { 164 reg = <10>; 165 brcm,hardware-controlled; 166 }; 167 ephy2_act@11 { 168 reg = <11>; 169 brcm,hardware-controlled; 170 }; 171 gphy0_act@12 { 172 reg = <12>; 173 brcm,hardware-controlled; 174 }; 175 ephy0_spd@13 { 176 reg = <13>; 177 brcm,hardware-controlled; 178 }; 179 ephy1_spd@14 { 180 reg = <14>; 181 brcm,hardware-controlled; 182 }; 183 ephy2_spd@15 { 184 reg = <15>; 185 brcm,hardware-controlled; 186 }; 187 power_green@20 { 188 reg = <20>; 189 active-low; 190 label = "green:power"; 191 default-state = "on"; 192 }; 193 }; 194 195Scenario 3 : BCM6362 with 1 LED for each EPHY 196 leds0: led-controller@10001900 { 197 compatible = "brcm,bcm6328-leds"; 198 #address-cells = <1>; 199 #size-cells = <0>; 200 reg = <0x10001900 0x24>; 201 202 usb@0 { 203 reg = <0>; 204 brcm,hardware-controlled; 205 brcm,link-signal-sources = <0>; 206 brcm,activity-signal-sources = <0>; 207 /* USB link/activity routed to USB LED */ 208 }; 209 inet@1 { 210 reg = <1>; 211 brcm,hardware-controlled; 212 brcm,activity-signal-sources = <1>; 213 /* INET activity routed to INET LED */ 214 }; 215 ephy0@4 { 216 reg = <4>; 217 brcm,hardware-controlled; 218 brcm,link-signal-sources = <4>; 219 /* EPHY0 link routed to EPHY0 LED */ 220 }; 221 ephy1@5 { 222 reg = <5>; 223 brcm,hardware-controlled; 224 brcm,link-signal-sources = <5>; 225 /* EPHY1 link routed to EPHY1 LED */ 226 }; 227 ephy2@6 { 228 reg = <6>; 229 brcm,hardware-controlled; 230 brcm,link-signal-sources = <6>; 231 /* EPHY2 link routed to EPHY2 LED */ 232 }; 233 ephy3@7 { 234 reg = <7>; 235 brcm,hardware-controlled; 236 brcm,link-signal-sources = <7>; 237 /* EPHY3 link routed to EPHY3 LED */ 238 }; 239 power_green@20 { 240 reg = <20>; 241 active-low; 242 label = "green:power"; 243 default-state = "on"; 244 }; 245 }; 246 247Scenario 4 : BCM6362 with 1 LED for all EPHYs 248 leds0: led-controller@10001900 { 249 compatible = "brcm,bcm6328-leds"; 250 #address-cells = <1>; 251 #size-cells = <0>; 252 reg = <0x10001900 0x24>; 253 254 usb@0 { 255 reg = <0>; 256 brcm,hardware-controlled; 257 brcm,link-signal-sources = <0 1>; 258 brcm,activity-signal-sources = <0 1>; 259 /* USB/INET link/activity routed to USB LED */ 260 }; 261 ephy@4 { 262 reg = <4>; 263 brcm,hardware-controlled; 264 brcm,link-signal-sources = <4 5 6 7>; 265 /* EPHY0/1/2/3 link routed to EPHY0 LED */ 266 }; 267 power_green@20 { 268 reg = <20>; 269 active-low; 270 label = "green:power"; 271 default-state = "on"; 272 }; 273 }; 274 275Scenario 5 : BCM6362 with EPHY LEDs swapped 276 leds0: led-controller@10001900 { 277 compatible = "brcm,bcm6328-leds"; 278 #address-cells = <1>; 279 #size-cells = <0>; 280 reg = <0x10001900 0x24>; 281 282 usb@0 { 283 reg = <0>; 284 brcm,hardware-controlled; 285 brcm,link-signal-sources = <0>; 286 brcm,activity-signal-sources = <0 1>; 287 /* USB link/act and INET act routed to USB LED */ 288 }; 289 ephy0@4 { 290 reg = <4>; 291 brcm,hardware-controlled; 292 brcm,link-signal-sources = <7>; 293 /* EPHY3 link routed to EPHY0 LED */ 294 }; 295 ephy1@5 { 296 reg = <5>; 297 brcm,hardware-controlled; 298 brcm,link-signal-sources = <6>; 299 /* EPHY2 link routed to EPHY1 LED */ 300 }; 301 ephy2@6 { 302 reg = <6>; 303 brcm,hardware-controlled; 304 brcm,link-signal-sources = <5>; 305 /* EPHY1 link routed to EPHY2 LED */ 306 }; 307 ephy3@7 { 308 reg = <7>; 309 brcm,hardware-controlled; 310 brcm,link-signal-sources = <4>; 311 /* EPHY0 link routed to EPHY3 LED */ 312 }; 313 power_green@20 { 314 reg = <20>; 315 active-low; 316 label = "green:power"; 317 default-state = "on"; 318 }; 319 }; 320