bcm27xx: switch to 5.15
[openwrt/staging/chunkeey.git] / target / linux / bcm27xx / patches-5.10 / 950-0507-overlays-gpio-led-new-overlay.patch
1 From 095bad7f310809a951735d03be9d06938524a6bc Mon Sep 17 00:00:00 2001
2 From: Assaf Gordon <assafgordon@gmail.com>
3 Date: Fri, 12 Mar 2021 00:13:07 -0700
4 Subject: [PATCH] overlays: gpio-led: new overlay
5
6 Add generic connection between the kernel's LED framework and
7 RPI's GPIO pins.
8
9 Signed-off-by: Assaf Gordon <assafgordon@gmail.com>
10 ---
11 arch/arm/boot/dts/overlays/Makefile | 1 +
12 arch/arm/boot/dts/overlays/README | 56 +++++++++++
13 .../boot/dts/overlays/gpio-led-overlay.dts | 97 +++++++++++++++++++
14 3 files changed, 154 insertions(+)
15 create mode 100755 arch/arm/boot/dts/overlays/gpio-led-overlay.dts
16
17 --- a/arch/arm/boot/dts/overlays/Makefile
18 +++ b/arch/arm/boot/dts/overlays/Makefile
19 @@ -54,6 +54,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
20 gpio-ir.dtbo \
21 gpio-ir-tx.dtbo \
22 gpio-key.dtbo \
23 + gpio-led.dtbo \
24 gpio-no-bank0-irq.dtbo \
25 gpio-no-irq.dtbo \
26 gpio-poweroff.dtbo \
27 --- a/arch/arm/boot/dts/overlays/README
28 +++ b/arch/arm/boot/dts/overlays/README
29 @@ -914,6 +914,62 @@ Params: gpio GPIO pin
30 keycode Set the key code for the button
31
32
33 +
34 +Name: gpio-led
35 +Info: This is a generic overlay for activating LEDs (or any other component)
36 + by a GPIO pin. Multiple LEDs can be set up using multiple calls to the
37 + overlay. While there are many existing methods to activate LEDs on the
38 + RPi, this method offers some advantages:
39 + 1) Does not require any userspace programs.
40 + 2) LEDs can be connected to the kernel's led-trigger framework,
41 + and drive the LED based on triggers such as cpu load, heartbeat,
42 + kernel panic, key input, timers and others.
43 + 3) LED can be tied to the input state of another GPIO pin.
44 + 4) The LED is setup early during the kernel boot process (useful
45 + for cpu/heartbeat/panic triggers).
46 +
47 + Typical electrical connection is:
48 + RPI-GPIO.19 -> LED -> 300ohm resister -> RPI-GND
49 + The GPIO pin number can be changed with the 'gpio=' parameter.
50 +
51 + To control an LED from userspace, write a 0 or 1 value:
52 + echo 1 > /sys/class/leds/myled1/brightness
53 + The 'myled1' name can be changed with the 'label=' parameter.
54 +
55 + To connect the LED to a kernel trigger from userspace:
56 + echo cpu > /sys/class/leds/myled1/trigger
57 + echo heartbeat > /sys/class/leds/myled1/trigger
58 + echo none > /sys/class/leds/myled1/trigger
59 + To connect the LED to GPIO.26 pin (physical pin 37):
60 + echo gpio > /sys/class/leds/myled1/trigger
61 + echo 26 > /sys/class/leds/myled1/gpio
62 + Available triggers:
63 + cat /sys/class/leds/myled1/trigger
64 +
65 + More information about the Linux kernel LED/Trigger system:
66 + https://www.kernel.org/doc/Documentation/leds/leds-class.rst
67 + https://www.kernel.org/doc/Documentation/leds/ledtrig-oneshot.rst
68 +Load: dtoverlay=gpio-led,<param>=<val>
69 +Params: gpio GPIO pin connected to the LED (default 19)
70 + label The label for this LED. It will appear under
71 + /sys/class/leds/<label> . Default 'myled1'.
72 + trigger Set the led-trigger to connect to this LED.
73 + default 'none' (LED is user-controlled).
74 + Some possible triggers:
75 + cpu - CPU load (all CPUs)
76 + cpu0 - CPU load of first CPU.
77 + mmc - disk activity (all disks)
78 + panic - turn on on kernel panic
79 + heartbeat - indicate system health
80 + gpio - connect to a GPIO input pin (note:
81 + currently the GPIO PIN can not be set
82 + using overlay parameters, must be
83 + done in userspace, see examples above.
84 + active_low Set to 1 to turn invert the LED control
85 + (writing 0 to /sys/class/leds/XXX/brightness
86 + will turn on the GPIO/LED). Default '0'.
87 +
88 +
89 Name: gpio-no-bank0-irq
90 Info: Use this overlay to disable GPIO interrupts for GPIOs in bank 0 (0-27),
91 which can be useful for UIO drivers.
92 --- /dev/null
93 +++ b/arch/arm/boot/dts/overlays/gpio-led-overlay.dts
94 @@ -0,0 +1,97 @@
95 +// SPDX-License-Identifier: GPL-2.0-or-later
96 +/*
97 + * gpio-led - generic connection of kernel's LED framework to the RPI's GPIO.
98 + * Copyright (C) 2021 House Gordon Software Company Ltd. <assafgordon@gmail.com>
99 + *
100 + * Based on information from:
101 + * https://mjoldfield.com/atelier/2017/03/rpi-devicetree.html
102 + * https://www.raspberrypi.org/documentation/configuration/device-tree.md
103 + * https://www.kernel.org/doc/html/latest/leds/index.html
104 + *
105 + * compile with:
106 + * dtc -@ -Hepapr -I dts -O dtb -o gpio-led.dtbo gpio-led-overlay.dts
107 + *
108 + * There will be some warnings (can be ignored):
109 + * Warning (label_is_string): /__overrides__:label: property is not a string
110 + * Warning (unit_address_vs_reg): /fragment@0/__overlay__/led_pins@0:
111 + * node has a unit name, but no reg property
112 + * Warning (unit_address_vs_reg): /fragment@1/__overlay__/leds@0:
113 + * node has a unit name, but no reg property
114 + * Warning (gpios_property): /__overrides__: Missing property
115 + * '#gpio-cells' in node /fragment@1/__overlay__/leds@0/led
116 + * or bad phandle (referred from gpio[0])
117 + *
118 + * Typical electrical connection is:
119 + * RPI-GPIO.19 -> LED -> 300ohm resister -> RPI-GND
120 + * The GPIO pin number can be changed with the 'gpio=' parameter.
121 + *
122 + * Test from user-space with:
123 + * # if nothing is shown, the overlay file isn't found in /boot/overlays
124 + * dtoverlay -a | grep gpio-led
125 + *
126 + * # Load the overlay
127 + * dtoverlay gpio-led label=moo gpio=19
128 + *
129 + * # if nothing is shown, the overlay wasn't loaded successfully
130 + * dtoverlay -l | grep gpio-led
131 + *
132 + * echo 1 > /sys/class/leds/moo/brightness
133 + * echo 0 > /sys/class/leds/moo/brightness
134 + * echo cpu > /sys/class/leds/moo/trigger
135 + * echo heartbeat > /sys/class/leds/moo/trigger
136 + *
137 + * # unload the overlay
138 + * dtoverlay -r gpio-led
139 + *
140 + * To load in /boot/config.txt add lines such as:
141 + * dtoverlay=gpio-led,gpio=19,label=heart,trigger=heartbeat
142 + * dtoverlay=gpio-led,gpio=26,label=brain,trigger=cpu
143 + */
144 +
145 +/dts-v1/;
146 +/plugin/;
147 +
148 +/ {
149 + compatible = "brcm,bcm2835";
150 +
151 + fragment@0 {
152 + // Configure the gpio pin controller
153 + target = <&gpio>;
154 + __overlay__ {
155 + led_pin: led_pins@19 {
156 + brcm,pins = <19>; // gpio number
157 + brcm,function = <1>; // 0 = input, 1 = output
158 + brcm,pull = <0>; // 0 = none, 1 = pull down, 2 = pull up
159 + };
160 + };
161 + };
162 + fragment@1 {
163 + target-path = "/";
164 + __overlay__ {
165 + leds: leds@0 {
166 + compatible = "gpio-leds";
167 + pinctrl-names = "default";
168 + pinctrl-0 = <&led_pin>;
169 + status = "okay";
170 +
171 + led: led {
172 + label = "myled1";
173 + gpios = <&gpio 19 0>;
174 + linux,default-trigger = "none";
175 + };
176 + };
177 + };
178 + };
179 +
180 + __overrides__ {
181 + gpio = <&led>,"gpios:4",
182 + <&leds>,"reg:0",
183 + <&led_pin>,"brcm,pins:0",
184 + <&led_pin>,"reg:0";
185 + label = <&led>,"label";
186 + active_low = <&led>,"gpios:8";
187 + trigger = <&led>,"linux,default-trigger";
188 + };
189 +
190 +};
191 +