From 6b1eb92b7ac993d884c5779ff1d857128e221dff Mon Sep 17 00:00:00 2001 From: Dylan Van Assche Date: Fri, 10 Feb 2023 09:22:28 +0100 Subject: [PATCH] fbd-dev-leds: Probe QCOM HW LED types Try first the QCOM hardware LED types which require the most features of LED drivers. Try until we have a single color GPIO LED which is the minimal LED driver support we require. If the LED does not meet that expectation either, we ignore the LED. --- src/fbd-dev-leds.c | 48 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/src/fbd-dev-leds.c b/src/fbd-dev-leds.c index a1e77c0..418cf44 100644 --- a/src/fbd-dev-leds.c +++ b/src/fbd-dev-leds.c @@ -12,6 +12,8 @@ #include "fbd-enums.h" #include "fbd-dev-led.h" #include "fbd-dev-led-multicolor.h" +#include "fbd-dev-led-qcom.h" +#include "fbd-dev-led-qcom-multicolor.h" #include "fbd-dev-leds.h" #include "fbd-feedback-led.h" #include "fbd-udev.h" @@ -55,6 +57,43 @@ find_led_by_color (FbdDevLeds *self, FbdFeedbackLedColor color) return self->leds->data; } + +static FbdDevLed* +probe_led (GUdevDevice *dev, GError **error) { + FbdDevLed *led = NULL; + + led = fbd_dev_led_qcom_multicolor_new (dev, error); + if (led != NULL) { + g_debug ("Discovered QCOM multicolor LED"); + return led; + } + g_clear_error (error); + + led = fbd_dev_led_qcom_new (dev, error); + if (led != NULL) { + g_debug ("Discovered QCOM single color LED"); + return led; + } + g_clear_error (error); + + led = fbd_dev_led_multicolor_new (dev, error); + if (led != NULL) { + g_debug ("Discovered multicolor LED"); + return led; + } + g_clear_error (error); + + led = fbd_dev_led_new (dev, error); + if (led != NULL) { + g_debug ("Discovered single color LED"); + return led; + } + + g_debug ("Unable to determine LED driver"); + return NULL; +} + + static gboolean initable_init (GInitable *initable, GCancellable *cancellable, @@ -79,14 +118,7 @@ initable_init (GInitable *initable, continue; } - /* Try multicolor first, fall back to single color */ - led = fbd_dev_led_multicolor_new (dev, &err); - if (led == NULL) { - g_debug ("Led not usable as multicolor: '%s'", err->message); - led = fbd_dev_led_new (dev, &err); - if (led == NULL) - g_debug ("Led not usable as single color: '%s'", err->message); - } + led = probe_led (dev, &err); if (led) { self->leds = g_slist_append (self->leds, led);