summaryrefslogtreecommitdiffstats
path: root/arch/sandbox
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2021-03-23 12:15:22 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2021-03-23 12:15:22 +0100
commitbb2873db3ef11e7b1299b1cca129f5d002e47f59 (patch)
treee53a1697f6ffb81d8f866ddadf3862ab0c04ceef /arch/sandbox
parent31343957ea42a9340345c17288e56cfa07304bb8 (diff)
parent176bd2605edfd7d64370736abe8c44833068788b (diff)
downloadbarebox-bb2873db3ef11e7b1299b1cca129f5d002e47f59.tar.gz
barebox-bb2873db3ef11e7b1299b1cca129f5d002e47f59.tar.xz
Merge branch 'for-next/misc'
Diffstat (limited to 'arch/sandbox')
-rw-r--r--arch/sandbox/board/Makefile1
-rw-r--r--arch/sandbox/board/led.c67
-rw-r--r--arch/sandbox/dts/sandbox.dts4
3 files changed, 72 insertions, 0 deletions
diff --git a/arch/sandbox/board/Makefile b/arch/sandbox/board/Makefile
index c504c967de..ffb1dbc21e 100644
--- a/arch/sandbox/board/Makefile
+++ b/arch/sandbox/board/Makefile
@@ -7,5 +7,6 @@ obj-y += dtb.o
obj-y += power.o
obj-y += dev-random.o
obj-y += watchdog.o
+obj-$(CONFIG_LED) += led.o
extra-y += barebox.lds
diff --git a/arch/sandbox/board/led.c b/arch/sandbox/board/led.c
new file mode 100644
index 0000000000..b7ab81112b
--- /dev/null
+++ b/arch/sandbox/board/led.c
@@ -0,0 +1,67 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#include <common.h>
+#include <init.h>
+#include <led.h>
+#include <mach/linux.h>
+#include <of.h>
+
+static struct sandbox_led {
+ struct led led;
+ bool active;
+} sandbox_led;
+
+static inline void terminal_puts(const char *s)
+{
+ linux_write(1, s, strlen(s));
+}
+
+static void sandbox_led_set(struct led *led, unsigned int brightness)
+{
+ terminal_puts("\x1b]2;barebox ");
+ while (brightness--)
+ terminal_puts(".");
+ terminal_puts("\a");
+
+ sandbox_led.active = true;
+}
+
+static int sandbox_led_of_probe(struct device_d *dev)
+{
+ struct device_node *np = dev->device_node;
+ int ret;
+
+ if (sandbox_led.led.set)
+ return -EBUSY;
+
+ sandbox_led.led.name = xstrdup(np->name);
+ sandbox_led.led.max_value = 5;
+ sandbox_led.led.set = sandbox_led_set;
+
+ ret = led_register(&sandbox_led.led);
+ if (ret)
+ return ret;
+
+ led_of_parse_trigger(&sandbox_led.led, np);
+
+ return 0;
+}
+
+static void sandbox_led_of_remove(struct device_d *dev)
+{
+ if (sandbox_led.active)
+ sandbox_led_set(NULL, 0);
+}
+
+static struct of_device_id sandbox_led_of_ids[] = {
+ { .compatible = "barebox,sandbox-led", },
+ { }
+};
+
+static struct driver_d sandbox_led_of_driver = {
+ .name = "sandbox-led",
+ .probe = sandbox_led_of_probe,
+ .remove = sandbox_led_of_remove,
+ .of_compatible = sandbox_led_of_ids,
+};
+device_platform_driver(sandbox_led_of_driver);
diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
index ef1fa7b866..e99986bb90 100644
--- a/arch/sandbox/dts/sandbox.dts
+++ b/arch/sandbox/dts/sandbox.dts
@@ -98,4 +98,8 @@
sound {
compatible = "barebox,sandbox-sound";
};
+
+ led {
+ compatible = "barebox,sandbox-led";
+ };
};