base-files: gpio switch: add named GPIO support
[oweals/openwrt.git] / package / base-files / files / etc / init.d / gpio_switch
index 6b2dcdce41833f8dcbec97f0074a705b41d534f8..24d790b065c1656bbd03ca34d963b4dda1990d63 100755 (executable)
@@ -16,21 +16,39 @@ load_gpio_switch()
        config_get name "$1" name
        config_get value "$1" value 0
 
-       local gpio_path="/sys/class/gpio/gpio${gpio_pin}"
-       # export GPIO pin for access
-       [ -d "$gpio_path" ] || {
-               echo "$gpio_pin" >/sys/class/gpio/export
-               # we need to wait a bit until the GPIO appears
-               [ -d "$gpio_path" ] || sleep 1
+       [ -z "$gpio_pin" ] && {
+               echo >&2 "Skipping gpio_switch '$name' due to missing gpio_pin"
+               return 1
        }
 
-       # direction attribute only exists if the kernel supports changing the
-       # direction of a GPIO
-       if [ -e "${gpio_path}/direction" ]; then
-               # set the pin to output with high or low pin value
-               { [ "$value" = "0" ] && echo "low" || echo "high"; } >"$gpio_path/direction"
+       local gpio_path
+       if [ -n "$(echo "$gpio_pin" | grep -E "^[0-9]+$")" ]; then
+               gpio_path="/sys/class/gpio/gpio${gpio_pin}"
+
+               # export GPIO pin for access
+               [ -d "$gpio_path" ] || {
+                       echo "$gpio_pin" >/sys/class/gpio/export
+                       # we need to wait a bit until the GPIO appears
+                       [ -d "$gpio_path" ] || sleep 1
+               }
+
+               # direction attribute only exists if the kernel supports changing the
+               # direction of a GPIO
+               if [ -e "${gpio_path}/direction" ]; then
+                       # set the pin to output with high or low pin value
+                       { [ "$value" = "0" ] && echo "low" || echo "high"; } \
+                               >"$gpio_path/direction"
+               else
+                       { [ "$value" = "0" ] && echo "0" || echo "1"; } \
+                               >"$gpio_path/value"
+               fi
        else
-               { [ "$value" = "0" ] && echo "0" || echo "1"; } >"$gpio_path/value"
+               gpio_path="/sys/class/gpio/${gpio_pin}"
+
+               [ -d "$gpio_path" ] && {
+                       { [ "$value" = "0" ] && echo "0" || echo "1"; } \
+                               >"$gpio_path/value"
+               }
        fi
 }