From add465f1be5d092ef049306ea2a211ff3f82b146 Mon Sep 17 00:00:00 2001
From: David Woodhouse <dwmw2@infradead.org>
Date: Mon, 13 Feb 2017 13:38:33 +0000
Subject: [PATCH] x86: Enable DIAG LED on Geos

Based on a patch from Chris Blake <chrisrblake93@gmail.com>, except let's
do it by using the LED configuration instead of hard-coding it for each
board type. And try using /bin/board_detect to do the default behaviour,
on the first boot where the config hasn't yet been generated.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
 .../linux/x86/base-files/etc/board.d/01_leds  |  2 +-
 target/linux/x86/base-files/etc/diag.sh       | 78 +++++++++++++++++++
 2 files changed, 79 insertions(+), 1 deletion(-)
 create mode 100644 target/linux/x86/base-files/etc/diag.sh

diff --git a/target/linux/x86/base-files/etc/board.d/01_leds b/target/linux/x86/base-files/etc/board.d/01_leds
index 8a1a1e0125..824c652d10 100755
--- a/target/linux/x86/base-files/etc/board.d/01_leds
+++ b/target/linux/x86/base-files/etc/board.d/01_leds
@@ -13,7 +13,7 @@ case "$board" in
 traverse-technologies-geos)
 	ucidef_set_led_netdev "lan" "LAN" "geos:1" "br-lan" "tx rx"
 	ucidef_set_led_netdev "wlan" "WiFi" "geos:2" "phy0tpt"
-	ucidef_set_led_default "diag" "DIAG" "geos:3" "0"
+	ucidef_set_led_default "diag" "DIAG" "geos:3" "1"
 	;;
 esac
 board_config_flush
diff --git a/target/linux/x86/base-files/etc/diag.sh b/target/linux/x86/base-files/etc/diag.sh
new file mode 100644
index 0000000000..3af4b23583
--- /dev/null
+++ b/target/linux/x86/base-files/etc/diag.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+#
+# Copyright © 2017 OpenWrt.org
+#
+
+. /lib/functions.sh
+. /lib/functions/leds.sh
+. /usr/share/libubox/jshn.sh
+
+preinit_match_diag_led() {
+	local CFG keys key cfg name sysfs default
+
+	CFG=/etc/board.json
+	if [ ! -s $CFG ]; then
+		CFG=/tmp/board.json
+		[ -s /tmp/sysinfo/model ] || return
+		/bin/board_detect $CFG || return
+	fi
+
+	json_init
+	json_load "$(cat $CFG)"
+	json_get_keys keys led
+	json_select led
+	for key in $keys; do
+		json_select "$key"
+		json_get_vars name sysfs default
+
+		if [ "$name" = "DIAG" -a "$default" = "1" ]; then
+			status_led="$sysfs"
+			return
+		fi
+		json_select ..
+	done
+}
+
+match_diag_led() {
+	local name
+	local default
+	local sysfs
+	config_get name "$1" name
+	config_get default "$1" default
+	config_get sysfs "$1" sysfs
+
+	if [ "$name" = "DIAG" -a "$default" = "1" ]; then
+		status_led="$sysfs"
+	fi
+}
+
+get_status_led() {
+	if [ -s /etc/config/system ]; then
+		config_load system
+		config_foreach match_diag_led led
+	else
+		preinit_match_diag_led
+	fi
+}
+
+set_state() {
+	get_status_led
+
+	case "$1" in
+	preinit)
+		status_led_blink_preinit
+		;;
+
+	failsafe)
+		status_led_blink_failsafe
+		;;
+
+	preinit_regular)
+		status_led_blink_preinit_regular
+		;;
+
+	done)
+		status_led_on
+		;;
+	esac
+}
-- 
2.30.2