From: Ahmad Fatoum <[email protected]>

Not meant for merge, just to show how a mechanical transformation of
poller to bthread would look like.

Note that this changes behavior slightly: The heartbeat duration was
not affected by the time needed to toggle the LED, but now it is.

Signed-off-by: Ahmad Fatoum <[email protected]>
---
 drivers/led/core.c | 52 ++++++++++++++++++++++++----------------------
 1 file changed, 27 insertions(+), 25 deletions(-)

diff --git a/drivers/led/core.c b/drivers/led/core.c
index ab171c61845b..cfdc6c894f74 100644
--- a/drivers/led/core.c
+++ b/drivers/led/core.c
@@ -21,7 +21,7 @@
 #include <errno.h>
 #include <led.h>
 #include <init.h>
-#include <poller.h>
+#include <bthread.h>
 #include <clock.h>
 #include <linux/ctype.h>
 
@@ -119,35 +119,34 @@ int led_set(struct led *led, unsigned int value)
        return __led_set(led, value);
 }
 
-static void led_blink_func(struct poller_struct *poller)
+static int led_blink_func(void *data)
 {
        struct led *led;
 
-       list_for_each_entry(led, &leds, list) {
-               const uint64_t now = get_time_ns();
-               int on;
+       while (!bthread_should_stop()) {
+               list_for_each_entry(led, &leds, list) {
+                       int on;
 
-               if (!led->blink && !led->flash)
-                       continue;
+                       if (!led->blink && !led->flash)
+                               continue;
 
-               if (led->blink_next_event > now) {
-                       continue;
-               }
+                       on = !(led->blink_next_state % 2);
+                       if (on)
+                               on = led->max_value;
 
-               on = !(led->blink_next_state % 2);
-               if (on)
-                       on = led->max_value;
+                       if (led->flash && !on)
+                               led->flash = 0;
 
-               led->blink_next_event = now +
-                       (led->blink_states[led->blink_next_state] * MSECOND);
-               led->blink_next_state = (led->blink_next_state + 1) %
-                                       led->blink_nr_states;
+                       __led_set(led, on);
 
-               if (led->flash && !on)
-                       led->flash = 0;
+                       led->blink_next_state = (led->blink_next_state + 1) %
+                               led->blink_nr_states;
 
-               __led_set(led, on);
+                       mdelay(led->blink_states[led->blink_next_state]);
+               }
        }
+
+       return 0;
 }
 
 /**
@@ -203,13 +202,16 @@ int led_flash(struct led *led, unsigned int duration_ms)
        return 0;
 }
 
-static struct poller_struct led_poller = {
-       .func = led_blink_func,
-};
-
 static int led_blink_init(void)
 {
-       return poller_register(&led_poller, "led");
+       struct bthread *led_bthread;
+
+       led_bthread = bthread_create(led_blink_func, NULL, "led");
+       if (!led_bthread)
+               return -ENOMEM;
+
+       bthread_wake(led_bthread);
+       return 0;
 }
 late_initcall(led_blink_init);
 
-- 
2.29.2


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to