Merge branch 'qcom-lpg' into 'main'

led-qcom: Check for LED driver

Closes #77

See merge request Librem5/feedbackd!124
This commit is contained in:
Guido Günther
2024-06-11 07:48:49 +00:00
2 changed files with 50 additions and 6 deletions
+13 -2
View File
@@ -15,8 +15,6 @@
#include <gio/gio.h> #include <gio/gio.h>
#define LED_HW_PATTERN_ATTR "hw_pattern"
#define LED_REPEAT_ATTR "repeat"
typedef struct _FbdDevLedQcomMulticolor { typedef struct _FbdDevLedQcomMulticolor {
FbdDevLedMulticolor parent; FbdDevLedMulticolor parent;
@@ -51,11 +49,24 @@ fbd_dev_led_qcom_multicolor_start_periodic (FbdDevLed *led,
return fbd_dev_led_start_periodic (FBD_DEV_LED (self->qcom_led), max_brightness_percentage, freq); return fbd_dev_led_start_periodic (FBD_DEV_LED (self->qcom_led), max_brightness_percentage, freq);
} }
static void
fbd_dev_led_qcom_multicolor_finalize (GObject *object)
{
FbdDevLedQcomMulticolor *self = FBD_DEV_LED_QCOM_MULTICOLOR (object);
g_clear_object (&self->qcom_led);
G_OBJECT_CLASS (fbd_dev_led_qcom_multicolor_parent_class)->finalize (object);
}
static void static void
fbd_dev_led_qcom_multicolor_class_init (FbdDevLedQcomMulticolorClass *klass) fbd_dev_led_qcom_multicolor_class_init (FbdDevLedQcomMulticolorClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass);
FbdDevLedClass *fbd_dev_led_class = FBD_DEV_LED_CLASS (klass); FbdDevLedClass *fbd_dev_led_class = FBD_DEV_LED_CLASS (klass);
object_class->finalize = fbd_dev_led_qcom_multicolor_finalize;
fbd_dev_led_class->probe = fbd_dev_led_qcom_multicolor_probe; fbd_dev_led_class->probe = fbd_dev_led_qcom_multicolor_probe;
fbd_dev_led_class->start_periodic = fbd_dev_led_qcom_multicolor_start_periodic; fbd_dev_led_class->start_periodic = fbd_dev_led_qcom_multicolor_start_periodic;
} }
+36 -3
View File
@@ -18,6 +18,8 @@
#define LED_REPEAT_ATTR "repeat" #define LED_REPEAT_ATTR "repeat"
#define LED_REPEAT_INFINITY "-1" #define LED_REPEAT_INFINITY "-1"
#define QCOM_LPG_MAX_PAUSE_MS 511 #define QCOM_LPG_MAX_PAUSE_MS 511
#define LED_DRIVER_PROP "DRIVER"
#define QCOM_LED_DRIVER "qcom-spmi-lpg"
typedef struct _FbdDevLedQcom { typedef struct _FbdDevLedQcom {
FbdDevLed parent; FbdDevLed parent;
@@ -27,17 +29,48 @@ typedef struct _FbdDevLedQcom {
G_DEFINE_TYPE (FbdDevLedQcom, fbd_dev_led_qcom, FBD_TYPE_DEV_LED) 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 static gboolean
fbd_dev_led_qcom_probe (FbdDevLed *led, GError **error) fbd_dev_led_qcom_probe (FbdDevLed *led, GError **error)
{ {
GUdevDevice *dev = fbd_dev_led_get_device (led); GUdevDevice *dev = fbd_dev_led_get_device (led);
const gchar *name; const char *name;
const gchar * const *index; const char * const *index;
name = g_udev_device_get_name (dev); name = g_udev_device_get_name (dev);
index = g_udev_device_get_sysfs_attr_as_strv (dev, LED_HW_PATTERN_ATTR); index = g_udev_device_get_sysfs_attr_as_strv (dev, LED_HW_PATTERN_ATTR);
if (index == NULL) { if (index == NULL) {
g_set_error (error,
G_FILE_ERROR, G_FILE_ERROR_FAILED,
"%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_set_error (error,
G_FILE_ERROR, G_FILE_ERROR_FAILED, G_FILE_ERROR, G_FILE_ERROR_FAILED,
"%s is no QCOM LED with HW support", name); "%s is no QCOM LED with HW support", name);
@@ -56,7 +89,7 @@ fbd_dev_led_qcom_start_periodic (FbdDevLed *led,
GUdevDevice *dev = fbd_dev_led_get_device (led); GUdevDevice *dev = fbd_dev_led_get_device (led);
gdouble max; gdouble max;
gdouble t; gdouble t;
g_autofree gchar *str = NULL; g_autofree char *str = NULL;
g_autoptr (GError) err = NULL; g_autoptr (GError) err = NULL;
gboolean success; gboolean success;