Tom Rini | 53633a8 | 2024-02-29 12:33:36 -0500 | [diff] [blame] | 1 | # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause |
| 2 | %YAML 1.2 |
| 3 | --- |
| 4 | $id: http://devicetree.org/schemas/leds/leds-bcm6328.yaml# |
| 5 | $schema: http://devicetree.org/meta-schemas/core.yaml# |
| 6 | |
| 7 | title: LEDs connected to Broadcom BCM6328 controller |
| 8 | |
| 9 | maintainers: |
| 10 | - Álvaro Fernández Rojas <noltari@gmail.com> |
| 11 | |
| 12 | description: | |
| 13 | This controller is present on BCM6318, BCM6328, BCM6362 and BCM63268. |
| 14 | In these SoCs it's possible to control LEDs both as GPIOs or by hardware. |
| 15 | However, on some devices there are Serial LEDs (LEDs connected to a 74x164 |
| 16 | controller), which can either be controlled by software (exporting the 74x164 |
| 17 | as spi-gpio. See |
| 18 | Documentation/devicetree/bindings/gpio/fairchild,74hc595.yaml), or by hardware |
| 19 | using this driver. |
| 20 | Some of these Serial LEDs are hardware controlled (e.g. ethernet LEDs) and |
| 21 | exporting the 74x164 as spi-gpio prevents those LEDs to be hardware |
| 22 | controlled, so the only chance to keep them working is by using this driver. |
| 23 | |
| 24 | BCM6328 LED controller has a HWDIS register, which controls whether a LED |
| 25 | should be controlled by a hardware signal instead of the MODE register value, |
| 26 | with 0 meaning hardware control enabled and 1 hardware control disabled. This |
| 27 | is usually 1:1 for hardware to LED signals, but through the activity/link |
| 28 | registers you have some limited control over rerouting the LEDs (as |
| 29 | explained later in brcm,link-signal-sources). Even if a LED is hardware |
| 30 | controlled you are still able to make it blink or light it up if it isn't, |
| 31 | but you can't turn it off if the hardware decides to light it up. For this |
| 32 | reason, hardware controlled LEDs aren't registered as LED class devices. |
| 33 | |
| 34 | Each LED is represented as a sub-node of the brcm,bcm6328-leds device. |
| 35 | |
| 36 | properties: |
| 37 | compatible: |
| 38 | const: brcm,bcm6328-leds |
| 39 | |
| 40 | reg: |
| 41 | maxItems: 1 |
| 42 | |
| 43 | brcm,serial-leds: |
| 44 | type: boolean |
| 45 | description: Enables Serial LEDs. |
| 46 | |
| 47 | brcm,serial-mux: |
| 48 | type: boolean |
| 49 | description: Enables Serial LEDs multiplexing. |
| 50 | |
| 51 | brcm,serial-clk-low: |
| 52 | type: boolean |
| 53 | description: Makes clock signal active low. |
| 54 | |
| 55 | brcm,serial-dat-low: |
| 56 | type: boolean |
| 57 | description: Makes data signal active low. |
| 58 | |
| 59 | brcm,serial-shift-inv: |
| 60 | type: boolean |
| 61 | description: Inverts Serial LEDs shift direction. |
| 62 | |
| 63 | "#address-cells": |
| 64 | const: 1 |
| 65 | |
| 66 | "#size-cells": |
| 67 | const: 0 |
| 68 | |
| 69 | patternProperties: |
| 70 | "@[a-f0-9]+$": |
| 71 | type: object |
| 72 | |
| 73 | $ref: common.yaml# |
| 74 | |
| 75 | properties: |
| 76 | reg: |
| 77 | items: |
| 78 | - maximum: 23 |
| 79 | description: LED pin number (only LEDs 0 to 23 are valid). |
| 80 | |
| 81 | active-low: |
| 82 | type: boolean |
| 83 | description: Makes LED active low. |
| 84 | |
| 85 | brcm,hardware-controlled: |
| 86 | type: boolean |
| 87 | description: Makes this LED hardware controlled. |
| 88 | |
| 89 | brcm,link-signal-sources: |
| 90 | $ref: /schemas/types.yaml#/definitions/uint32-array |
| 91 | minItems: 1 |
| 92 | maxItems: 4 |
| 93 | description: > |
| 94 | An array of hardware link signal sources. Up to four link hardware |
| 95 | signals can get muxed into these LEDs. Only valid for LEDs 0 to 7, |
| 96 | where LED signals 0 to 3 may be muxed to LEDs 0 to 3, and signals 4 to |
| 97 | 7 may be muxed to LEDs 4 to 7. A signal can be muxed to more than one |
| 98 | LED, and one LED can have more than one source signal. |
| 99 | |
| 100 | brcm,activity-signal-sources: |
| 101 | $ref: /schemas/types.yaml#/definitions/uint32-array |
| 102 | minItems: 1 |
| 103 | maxItems: 4 |
| 104 | description: > |
| 105 | An array of hardware activity signal sources. Up to four activity |
| 106 | hardware signals can get muxed into these LEDs. Only valid for LEDs 0 |
| 107 | to 7, where LED signals 0 to 3 may be muxed to LEDs 0 to 3, and |
| 108 | signals 4 to 7 may be muxed to LEDs 4 to 7. A signal can be muxed to |
| 109 | more than one LED, and one LED can have more than one source signal. |
| 110 | |
| 111 | required: |
| 112 | - reg |
| 113 | |
| 114 | unevaluatedProperties: false |
| 115 | |
| 116 | required: |
| 117 | - reg |
| 118 | - "#address-cells" |
| 119 | - "#size-cells" |
| 120 | |
| 121 | additionalProperties: false |
| 122 | |
| 123 | examples: |
| 124 | - | |
| 125 | /* BCM6328 with 4 EPHY LEDs */ |
| 126 | led-controller@10000800 { |
| 127 | compatible = "brcm,bcm6328-leds"; |
| 128 | #address-cells = <1>; |
| 129 | #size-cells = <0>; |
| 130 | reg = <0x10000800 0x24>; |
| 131 | |
| 132 | alarm_red@2 { |
| 133 | reg = <2>; |
| 134 | active-low; |
| 135 | label = "red:alarm"; |
| 136 | }; |
| 137 | |
| 138 | inet_green@3 { |
| 139 | reg = <3>; |
| 140 | active-low; |
| 141 | label = "green:inet"; |
| 142 | }; |
| 143 | |
| 144 | power_green@4 { |
| 145 | reg = <4>; |
| 146 | active-low; |
| 147 | label = "green:power"; |
| 148 | default-state = "on"; |
| 149 | }; |
| 150 | |
| 151 | ephy0_spd@17 { |
| 152 | reg = <17>; |
| 153 | brcm,hardware-controlled; |
| 154 | }; |
| 155 | |
| 156 | ephy1_spd@18 { |
| 157 | reg = <18>; |
| 158 | brcm,hardware-controlled; |
| 159 | }; |
| 160 | |
| 161 | ephy2_spd@19 { |
| 162 | reg = <19>; |
| 163 | brcm,hardware-controlled; |
| 164 | }; |
| 165 | |
| 166 | ephy3_spd@20 { |
| 167 | reg = <20>; |
| 168 | brcm,hardware-controlled; |
| 169 | }; |
| 170 | }; |
| 171 | - | |
| 172 | /* BCM63268 with Serial/GPHY0 LEDs */ |
| 173 | led-controller@10001900 { |
| 174 | compatible = "brcm,bcm6328-leds"; |
| 175 | #address-cells = <1>; |
| 176 | #size-cells = <0>; |
| 177 | reg = <0x10001900 0x24>; |
| 178 | brcm,serial-leds; |
| 179 | brcm,serial-dat-low; |
| 180 | brcm,serial-shift-inv; |
| 181 | |
| 182 | gphy0_spd0@0 { |
| 183 | reg = <0>; |
| 184 | brcm,hardware-controlled; |
| 185 | brcm,link-signal-sources = <0>; |
| 186 | }; |
| 187 | |
| 188 | gphy0_spd1@1 { |
| 189 | reg = <1>; |
| 190 | brcm,hardware-controlled; |
| 191 | brcm,link-signal-sources = <1>; |
| 192 | }; |
| 193 | |
| 194 | inet_red@2 { |
| 195 | reg = <2>; |
| 196 | active-low; |
| 197 | label = "red:inet"; |
| 198 | }; |
| 199 | |
| 200 | dsl_green@3 { |
| 201 | reg = <3>; |
| 202 | active-low; |
| 203 | label = "green:dsl"; |
| 204 | }; |
| 205 | |
| 206 | usb_green@4 { |
| 207 | reg = <4>; |
| 208 | active-low; |
| 209 | label = "green:usb"; |
| 210 | }; |
| 211 | |
| 212 | wps_green@7 { |
| 213 | reg = <7>; |
| 214 | active-low; |
| 215 | label = "green:wps"; |
| 216 | }; |
| 217 | |
| 218 | inet_green@8 { |
| 219 | reg = <8>; |
| 220 | active-low; |
| 221 | label = "green:inet"; |
| 222 | }; |
| 223 | |
| 224 | ephy0_act@9 { |
| 225 | reg = <9>; |
| 226 | brcm,hardware-controlled; |
| 227 | }; |
| 228 | |
| 229 | ephy1_act@10 { |
| 230 | reg = <10>; |
| 231 | brcm,hardware-controlled; |
| 232 | }; |
| 233 | |
| 234 | ephy2_act@11 { |
| 235 | reg = <11>; |
| 236 | brcm,hardware-controlled; |
| 237 | }; |
| 238 | |
| 239 | gphy0_act@12 { |
| 240 | reg = <12>; |
| 241 | brcm,hardware-controlled; |
| 242 | }; |
| 243 | |
| 244 | ephy0_spd@13 { |
| 245 | reg = <13>; |
| 246 | brcm,hardware-controlled; |
| 247 | }; |
| 248 | |
| 249 | ephy1_spd@14 { |
| 250 | reg = <14>; |
| 251 | brcm,hardware-controlled; |
| 252 | }; |
| 253 | |
| 254 | ephy2_spd@15 { |
| 255 | reg = <15>; |
| 256 | brcm,hardware-controlled; |
| 257 | }; |
| 258 | |
| 259 | power_green@20 { |
| 260 | reg = <20>; |
| 261 | active-low; |
| 262 | label = "green:power"; |
| 263 | default-state = "on"; |
| 264 | }; |
| 265 | }; |
| 266 | - | |
| 267 | /* BCM6362 with 1 LED for each EPHY */ |
| 268 | led-controller@10001900 { |
| 269 | compatible = "brcm,bcm6328-leds"; |
| 270 | #address-cells = <1>; |
| 271 | #size-cells = <0>; |
| 272 | reg = <0x10001900 0x24>; |
| 273 | |
| 274 | usb@0 { |
| 275 | reg = <0>; |
| 276 | brcm,hardware-controlled; |
| 277 | brcm,link-signal-sources = <0>; |
| 278 | brcm,activity-signal-sources = <0>; |
| 279 | /* USB link/activity routed to USB LED */ |
| 280 | }; |
| 281 | |
| 282 | inet@1 { |
| 283 | reg = <1>; |
| 284 | brcm,hardware-controlled; |
| 285 | brcm,activity-signal-sources = <1>; |
| 286 | /* INET activity routed to INET LED */ |
| 287 | }; |
| 288 | |
| 289 | ephy0@4 { |
| 290 | reg = <4>; |
| 291 | brcm,hardware-controlled; |
| 292 | brcm,link-signal-sources = <4>; |
| 293 | /* EPHY0 link routed to EPHY0 LED */ |
| 294 | }; |
| 295 | |
| 296 | ephy1@5 { |
| 297 | reg = <5>; |
| 298 | brcm,hardware-controlled; |
| 299 | brcm,link-signal-sources = <5>; |
| 300 | /* EPHY1 link routed to EPHY1 LED */ |
| 301 | }; |
| 302 | |
| 303 | ephy2@6 { |
| 304 | reg = <6>; |
| 305 | brcm,hardware-controlled; |
| 306 | brcm,link-signal-sources = <6>; |
| 307 | /* EPHY2 link routed to EPHY2 LED */ |
| 308 | }; |
| 309 | |
| 310 | ephy3@7 { |
| 311 | reg = <7>; |
| 312 | brcm,hardware-controlled; |
| 313 | brcm,link-signal-sources = <7>; |
| 314 | /* EPHY3 link routed to EPHY3 LED */ |
| 315 | }; |
| 316 | |
| 317 | power_green@20 { |
| 318 | reg = <20>; |
| 319 | active-low; |
| 320 | label = "green:power"; |
| 321 | default-state = "on"; |
| 322 | }; |
| 323 | }; |
| 324 | - | |
| 325 | /* BCM6362 with 1 LED for all EPHYs */ |
| 326 | led-controller@10001900 { |
| 327 | compatible = "brcm,bcm6328-leds"; |
| 328 | #address-cells = <1>; |
| 329 | #size-cells = <0>; |
| 330 | reg = <0x10001900 0x24>; |
| 331 | |
| 332 | usb@0 { |
| 333 | reg = <0>; |
| 334 | brcm,hardware-controlled; |
| 335 | brcm,link-signal-sources = <0 1>; |
| 336 | brcm,activity-signal-sources = <0 1>; |
| 337 | /* USB/INET link/activity routed to USB LED */ |
| 338 | }; |
| 339 | |
| 340 | ephy@4 { |
| 341 | reg = <4>; |
| 342 | brcm,hardware-controlled; |
| 343 | brcm,link-signal-sources = <4 5 6 7>; |
| 344 | /* EPHY0/1/2/3 link routed to EPHY0 LED */ |
| 345 | }; |
| 346 | |
| 347 | power_green@20 { |
| 348 | reg = <20>; |
| 349 | active-low; |
| 350 | label = "green:power"; |
| 351 | default-state = "on"; |
| 352 | }; |
| 353 | }; |
| 354 | - | |
| 355 | /* BCM6362 with EPHY LEDs swapped */ |
| 356 | led-controller@10001900 { |
| 357 | compatible = "brcm,bcm6328-leds"; |
| 358 | #address-cells = <1>; |
| 359 | #size-cells = <0>; |
| 360 | reg = <0x10001900 0x24>; |
| 361 | |
| 362 | usb@0 { |
| 363 | reg = <0>; |
| 364 | brcm,hardware-controlled; |
| 365 | brcm,link-signal-sources = <0>; |
| 366 | brcm,activity-signal-sources = <0 1>; |
| 367 | /* USB link/act and INET act routed to USB LED */ |
| 368 | }; |
| 369 | |
| 370 | ephy0@4 { |
| 371 | reg = <4>; |
| 372 | brcm,hardware-controlled; |
| 373 | brcm,link-signal-sources = <7>; |
| 374 | /* EPHY3 link routed to EPHY0 LED */ |
| 375 | }; |
| 376 | |
| 377 | ephy1@5 { |
| 378 | reg = <5>; |
| 379 | brcm,hardware-controlled; |
| 380 | brcm,link-signal-sources = <6>; |
| 381 | /* EPHY2 link routed to EPHY1 LED */ |
| 382 | }; |
| 383 | |
| 384 | ephy2@6 { |
| 385 | reg = <6>; |
| 386 | brcm,hardware-controlled; |
| 387 | brcm,link-signal-sources = <5>; |
| 388 | /* EPHY1 link routed to EPHY2 LED */ |
| 389 | }; |
| 390 | |
| 391 | ephy3@7 { |
| 392 | reg = <7>; |
| 393 | brcm,hardware-controlled; |
| 394 | brcm,link-signal-sources = <4>; |
| 395 | /* EPHY0 link routed to EPHY3 LED */ |
| 396 | }; |
| 397 | |
| 398 | power_green@20 { |
| 399 | reg = <20>; |
| 400 | active-low; |
| 401 | label = "green:power"; |
| 402 | default-state = "on"; |
| 403 | }; |
| 404 | }; |