From 3c588fdb8f36973fb8fd1cdbb60b44d11af67451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 10 Jun 2024 09:51:38 +0200 Subject: [PATCH] led-qcom: Check for LED driver The hw_pattern attribute is driver specific. Ensure we don't apply the LED pattern to unknown drivers. Closes: https://source.puri.sm/Librem5/feedbackd/-/issues/77 --- src/fbd-dev-led-qcom.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/fbd-dev-led-qcom.c b/src/fbd-dev-led-qcom.c index 1b2f521..c1abf24 100644 --- a/src/fbd-dev-led-qcom.c +++ b/src/fbd-dev-led-qcom.c @@ -18,6 +18,8 @@ #define LED_REPEAT_ATTR "repeat" #define LED_REPEAT_INFINITY "-1" #define QCOM_LPG_MAX_PAUSE_MS 511 +#define LED_DRIVER_PROP "DRIVER" +#define QCOM_LED_DRIVER "qcom-spmi-lpg" typedef struct _FbdDevLedQcom { FbdDevLed parent; @@ -27,6 +29,30 @@ typedef struct _FbdDevLedQcom { G_DEFINE_TYPE (FbdDevLedQcom, fbd_dev_led_qcom, FBD_TYPE_DEV_LED) +static gboolean +fbd_dev_led_qcom_check_driver (FbdDevLedQcom *self, const char *name) +{ + g_autoptr (GUdevDevice) dev = NULL; + gboolean found = FALSE; + + dev = g_object_ref (fbd_dev_led_get_device (FBD_DEV_LED (self))); + do { + g_autoptr (GUdevDevice) parent = NULL; + const char *driver = g_udev_device_get_property (dev, LED_DRIVER_PROP); + + if (g_strcmp0 (driver, QCOM_LED_DRIVER) == 0) { + found = TRUE; + break; + } + + parent = g_udev_device_get_parent (dev); + g_set_object (&dev, parent); + } while (dev); + + return found; +} + + static gboolean fbd_dev_led_qcom_probe (FbdDevLed *led, GError **error) { @@ -40,7 +66,14 @@ fbd_dev_led_qcom_probe (FbdDevLed *led, GError **error) if (index == NULL) { g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, - "%s is no QCOM LED with HW support", name); + "%s is no LED with HW support", name); + return FALSE; + } + + if (!fbd_dev_led_qcom_check_driver (FBD_DEV_LED_QCOM (led), QCOM_LED_DRIVER)) { + g_set_error (error, + G_FILE_ERROR, G_FILE_ERROR_FAILED, + "%s is no QCOM LED with HW support", name); return FALSE; }