Bug#1109919: unblock: iio-sensor-proxy/3.7-3
Package: release.debian.org
Severity: normal
X-Debbugs-Cc: iio-sensor-proxy@packages.debian.org
Control: affects -1 + src:iio-sensor-proxy
User: release.debian.org@packages.debian.org
Usertags: unblock
Please unblock package iio-sensor-proxy
[ Reason ]
Fix buffer mode discovery on several devices like chromebooks
and Framework 12" laptops. Without these iio-sensor-proxy will
not read sensible values on these devices as buffer mode does
not provide any data although announced by the kernel.
[ Impact ]
iio-sensor-proxy will not work on these devices.
[ Tests ]
Patches have been tested upstream
https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/merge_requests/400
on the affected devices and I've tested on some devices availble to me
that the package doesn't break currently working ones. We also have
tests upstream (that run during package build).
[ Risks ]
Not very high as the code changes were confined (see attached debdiff).
[ Checklist ]
[x] all changes are documented in the d/changelog
[x] I reviewed all changes and I approve them
[x] attach debdiff against the package in testing
[ Other info ]
I've not yet uploaded the package yet as I wanted to check first if we
can fix this before release.
unblock iio-sensor-proxy/3.7-3
diff --git a/debian/changelog b/debian/changelog
index 46e5332..733426f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+iio-sensor-proxy (3.7-3) unstable; urgency=medium
+
+ * Backport upstream fixes to check not accidentaly use buffer
+ driver.
+
+ -- Guido Günther <agx@sigxcpu.org> Sat, 26 Jul 2025 10:08:39 +0200
+
iio-sensor-proxy (3.7-2) unstable; urgency=medium
* Upload to unstable
diff --git a/debian/patches/buffer_drv_data_new-rework-trigger_name-handling.patch b/debian/patches/buffer_drv_data_new-rework-trigger_name-handling.patch
new file mode 100644
index 0000000..ebcd81d
--- /dev/null
+++ b/debian/patches/buffer_drv_data_new-rework-trigger_name-handling.patch
@@ -0,0 +1,128 @@
+From: "Sicelo A. Mhlongo" <absicsz@gmail.com>
+Date: Sun, 25 May 2025 19:17:51 +0200
+Subject: buffer_drv_data_new: rework trigger_name handling
+
+In each buffer driver, the get_trigger_name() call is always immediately
+followed by a call to buffer_drv_data_new(). To simplify the code,
+buffer_drv_data_new() now calls get_trigger_name(). Incidentally,
+iio-sensor-proxy does not actually use the buffer sensor's trigger for
+anything.
+---
+ src/drv-iio-buffer-accel.c | 6 +-----
+ src/drv-iio-buffer-compass.c | 10 +---------
+ src/drv-iio-buffer-light.c | 9 +--------
+ src/iio-buffer-utils.c | 9 ++++-----
+ src/iio-buffer-utils.h | 3 +--
+ 5 files changed, 8 insertions(+), 29 deletions(-)
+
+diff --git a/src/drv-iio-buffer-accel.c b/src/drv-iio-buffer-accel.c
+index 931d5cb..06db1aa 100644
+--- a/src/drv-iio-buffer-accel.c
++++ b/src/drv-iio-buffer-accel.c
+@@ -151,13 +151,9 @@ iio_buffer_accel_open (GUdevDevice *device)
+ {
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+- g_autofree char *trigger_name = NULL;
+ BufferDrvData *buffer_data;
+
+- /* Get the trigger name, and build the channels from that */
+- trigger_name = get_trigger_name (device);
+-
+- buffer_data = buffer_drv_data_new (device, trigger_name);
++ buffer_data = buffer_drv_data_new (device);
+ if (!buffer_data)
+ return NULL;
+
+diff --git a/src/drv-iio-buffer-compass.c b/src/drv-iio-buffer-compass.c
+index cfe8f4f..2ae0ccd 100644
+--- a/src/drv-iio-buffer-compass.c
++++ b/src/drv-iio-buffer-compass.c
+@@ -108,17 +108,9 @@ iio_buffer_compass_open (GUdevDevice *device)
+ {
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+- g_autofree char *trigger_name = NULL;
+ BufferDrvData *buffer_data;
+
+- /* Get the trigger name, and build the channels from that */
+- trigger_name = get_trigger_name (device);
+- if (!trigger_name) {
+- g_debug ("Could not find trigger for %s", g_udev_device_get_sysfs_path (device));
+- return NULL;
+- }
+-
+- buffer_data = buffer_drv_data_new (device, trigger_name);
++ buffer_data = buffer_drv_data_new (device);
+ if (!buffer_data)
+ return NULL;
+
+diff --git a/src/drv-iio-buffer-light.c b/src/drv-iio-buffer-light.c
+index 6046dc3..2a524c6 100644
+--- a/src/drv-iio-buffer-light.c
++++ b/src/drv-iio-buffer-light.c
+@@ -139,16 +139,9 @@ iio_buffer_light_open (GUdevDevice *device)
+ {
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+- g_autofree char *trigger_name = NULL;
+ BufferDrvData *buffer_data;
+
+- /* Get the trigger name, and build the channels from that */
+- trigger_name = get_trigger_name (device);
+- if (!trigger_name) {
+- g_debug ("Could not find trigger for %s", g_udev_device_get_sysfs_path (device));
+- return NULL;
+- }
+- buffer_data = buffer_drv_data_new (device, trigger_name);
++ buffer_data = buffer_drv_data_new (device);
+ if (!buffer_data)
+ return NULL;
+
+diff --git a/src/iio-buffer-utils.c b/src/iio-buffer-utils.c
+index 7a627d3..bc74e4c 100644
+--- a/src/iio-buffer-utils.c
++++ b/src/iio-buffer-utils.c
+@@ -880,13 +880,14 @@ buffer_drv_data_free (BufferDrvData *buffer_data)
+ }
+
+ BufferDrvData *
+-buffer_drv_data_new (GUdevDevice *device,
+- const char *trigger_name)
++buffer_drv_data_new (GUdevDevice *device)
+ {
+ BufferDrvData *buffer_data;
++ g_autofree char *trigger_name = NULL;
+
+ buffer_data = g_new0 (BufferDrvData, 1);
+ buffer_data->dev_dir_name = g_udev_device_get_sysfs_path (device);
++ trigger_name = get_trigger_name (device);
+ if (trigger_name)
+ buffer_data->trigger_name = g_strdup (trigger_name);
+ buffer_data->device = g_object_ref (device);
+@@ -909,10 +910,8 @@ is_buffer_usable (GUdevDevice *device)
+ g_autofree char *trigger_name = NULL;
+ BufferDrvData *buffer_data;
+
+- trigger_name = get_trigger_name (device);
+-
+ /* Temporarily enable the buffer to ensure the kernel driver is buffer-capable */
+- buffer_data = buffer_drv_data_new (device, trigger_name);
++ buffer_data = buffer_drv_data_new (device);
+ if (!buffer_data)
+ return FALSE;
+
+diff --git a/src/iio-buffer-utils.h b/src/iio-buffer-utils.h
+index 597177a..9c5e6db 100644
+--- a/src/iio-buffer-utils.h
++++ b/src/iio-buffer-utils.h
+@@ -43,8 +43,7 @@ gboolean iio_fixup_sampling_frequency (GUdevDevice *dev);
+ char *get_trigger_name (GUdevDevice *device);
+
+ void buffer_drv_data_free (BufferDrvData *buffer_data);
+-BufferDrvData *buffer_drv_data_new (GUdevDevice *device,
+- const char *trigger_name);
++BufferDrvData *buffer_drv_data_new (GUdevDevice *device);
+ void disable_ring_buffer (BufferDrvData *data);
+ gboolean enable_ring_buffer (BufferDrvData *data);
+ gboolean is_buffer_usable (GUdevDevice *device);
diff --git a/debian/patches/drv-iio-buffer-relocate-the-.discover-method-to-bring-the.patch b/debian/patches/drv-iio-buffer-relocate-the-.discover-method-to-bring-the.patch
new file mode 100644
index 0000000..6c38c59
--- /dev/null
+++ b/debian/patches/drv-iio-buffer-relocate-the-.discover-method-to-bring-the.patch
@@ -0,0 +1,149 @@
+From: "Sicelo A. Mhlongo" <absicsz@gmail.com>
+Date: Sun, 25 May 2025 17:44:29 +0200
+Subject: drv-iio-buffer-*: relocate the .discover method to bring the .open
+ and .close methods into scope
+
+To fix #411 [0], the .discover method will now attempt to read from the sensor
+buffer. Therefore, it will need to call .open and .close. Relocate the method
+to ensure the former are within scope. There is no functional change in the
+.discover method.
+
+[0] https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/issues/411
+---
+ src/drv-iio-buffer-accel.c | 26 +++++++++++++-------------
+ src/drv-iio-buffer-compass.c | 26 +++++++++++++-------------
+ src/drv-iio-buffer-light.c | 26 +++++++++++++-------------
+ 3 files changed, 39 insertions(+), 39 deletions(-)
+
+diff --git a/src/drv-iio-buffer-accel.c b/src/drv-iio-buffer-accel.c
+index 90747a6..931d5cb 100644
+--- a/src/drv-iio-buffer-accel.c
++++ b/src/drv-iio-buffer-accel.c
+@@ -120,19 +120,6 @@ read_orientation (gpointer user_data)
+ return G_SOURCE_CONTINUE;
+ }
+
+-static gboolean
+-iio_buffer_accel_discover (GUdevDevice *device)
+-{
+- if (!drv_check_udev_sensor_type (device, "iio-buffer-accel", NULL))
+- return FALSE;
+-
+- if (!is_buffer_usable (device))
+- return FALSE;
+-
+- g_debug ("Found IIO buffer accelerometer at %s", g_udev_device_get_sysfs_path (device));
+- return TRUE;
+-}
+-
+ static void
+ iio_buffer_accel_set_polling (SensorDevice *sensor_device,
+ gboolean state)
+@@ -205,6 +192,19 @@ iio_buffer_accel_close (SensorDevice *sensor_device)
+ g_free (sensor_device);
+ }
+
++static gboolean
++iio_buffer_accel_discover (GUdevDevice *device)
++{
++ if (!drv_check_udev_sensor_type (device, "iio-buffer-accel", NULL))
++ return FALSE;
++
++ if (!is_buffer_usable (device))
++ return FALSE;
++
++ g_debug ("Found IIO buffer accelerometer at %s", g_udev_device_get_sysfs_path (device));
++ return TRUE;
++}
++
+ SensorDriver iio_buffer_accel = {
+ .driver_name = "IIO Buffer accelerometer",
+ .type = DRIVER_TYPE_ACCEL,
+diff --git a/src/drv-iio-buffer-compass.c b/src/drv-iio-buffer-compass.c
+index f0399f4..cfe8f4f 100644
+--- a/src/drv-iio-buffer-compass.c
++++ b/src/drv-iio-buffer-compass.c
+@@ -103,19 +103,6 @@ read_heading (gpointer user_data)
+ return G_SOURCE_CONTINUE;
+ }
+
+-static gboolean
+-iio_buffer_compass_discover (GUdevDevice *device)
+-{
+- if (!drv_check_udev_sensor_type (device, "iio-buffer-compass", NULL))
+- return FALSE;
+-
+- if (!is_buffer_usable (device))
+- return FALSE;
+-
+- g_debug ("Found IIO buffer compass at %s", g_udev_device_get_sysfs_path (device));
+- return TRUE;
+-}
+-
+ static SensorDevice *
+ iio_buffer_compass_open (GUdevDevice *device)
+ {
+@@ -188,6 +175,19 @@ iio_buffer_compass_close (SensorDevice *sensor_device)
+ g_free (sensor_device);
+ }
+
++static gboolean
++iio_buffer_compass_discover (GUdevDevice *device)
++{
++ if (!drv_check_udev_sensor_type (device, "iio-buffer-compass", NULL))
++ return FALSE;
++
++ if (!is_buffer_usable (device))
++ return FALSE;
++
++ g_debug ("Found IIO buffer compass at %s", g_udev_device_get_sysfs_path (device));
++ return TRUE;
++}
++
+ SensorDriver iio_buffer_compass = {
+ .driver_name = "IIO Buffer Compass",
+ .type = DRIVER_TYPE_COMPASS,
+diff --git a/src/drv-iio-buffer-light.c b/src/drv-iio-buffer-light.c
+index 4be2398..6046dc3 100644
+--- a/src/drv-iio-buffer-light.c
++++ b/src/drv-iio-buffer-light.c
+@@ -108,19 +108,6 @@ read_light (gpointer user_data)
+ return G_SOURCE_CONTINUE;
+ }
+
+-static gboolean
+-iio_buffer_light_discover (GUdevDevice *device)
+-{
+- if (!drv_check_udev_sensor_type (device, "iio-buffer-als", NULL))
+- return FALSE;
+-
+- if (!is_buffer_usable (device))
+- return FALSE;
+-
+- g_debug ("Found IIO buffer ALS at %s", g_udev_device_get_sysfs_path (device));
+- return TRUE;
+-}
+-
+ static void
+ iio_buffer_light_set_polling (SensorDevice *sensor_device,
+ gboolean state)
+@@ -192,6 +179,19 @@ iio_buffer_light_close (SensorDevice *sensor_device)
+ g_free (sensor_device);
+ }
+
++static gboolean
++iio_buffer_light_discover (GUdevDevice *device)
++{
++ if (!drv_check_udev_sensor_type (device, "iio-buffer-als", NULL))
++ return FALSE;
++
++ if (!is_buffer_usable (device))
++ return FALSE;
++
++ g_debug ("Found IIO buffer ALS at %s", g_udev_device_get_sysfs_path (device));
++ return TRUE;
++}
++
+ SensorDriver iio_buffer_light = {
+ .driver_name = "IIO Buffer Light sensor",
+ .type = DRIVER_TYPE_LIGHT,
diff --git a/debian/patches/iio-buffer-attempt-to-read-from-buffer-during-sensor-disc.patch b/debian/patches/iio-buffer-attempt-to-read-from-buffer-during-sensor-disc.patch
new file mode 100644
index 0000000..3c98134
--- /dev/null
+++ b/debian/patches/iio-buffer-attempt-to-read-from-buffer-during-sensor-disc.patch
@@ -0,0 +1,292 @@
+From: "Sicelo A. Mhlongo" <absicsz@gmail.com>
+Date: Mon, 26 May 2025 09:11:59 +0200
+Subject: iio-buffer: attempt to read from buffer during sensor discovery
+
+The kernel drivers for some sensors report support for buffer mode, and allow
+the buffer to be enabled, but never return any data in the buffer. Since
+59c29aca616f ("drivers: accel: Remove trigger requirement on
+iio-buffer-accel"), these sensors fail silently. iio-sensor-proxy must use the
+polling method on these sensors.
+
+To achieve this, during sensor discovery, enable the sensor in buffer mode,
+then attempt to read data off the buffer. Modify tests in order for the data
+file to be opened before startDaemon() is called, since this is now necessary
+for sensor discovery.
+
+Fixes: #411 [0]
+[0] https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/issues/411
+---
+ src/drv-iio-buffer-accel.c | 20 +++++++++++++++++++-
+ src/drv-iio-buffer-compass.c | 24 +++++++++++++++++++++---
+ src/drv-iio-buffer-light.c | 24 +++++++++++++++++++++---
+ src/iio-buffer-utils.c | 30 ++++++++++++++++++++----------
+ src/iio-buffer-utils.h | 2 +-
+ tests/integration-test.py | 16 ++++++++++++++--
+ 6 files changed, 96 insertions(+), 20 deletions(-)
+
+diff --git a/src/drv-iio-buffer-accel.c b/src/drv-iio-buffer-accel.c
+index 06db1aa..5900ac5 100644
+--- a/src/drv-iio-buffer-accel.c
++++ b/src/drv-iio-buffer-accel.c
+@@ -191,12 +191,30 @@ iio_buffer_accel_close (SensorDevice *sensor_device)
+ static gboolean
+ iio_buffer_accel_discover (GUdevDevice *device)
+ {
++ SensorDevice *sensor_device;
++ DrvData *drv_data;
++ gboolean buffer_usable = FALSE;
++
+ if (!drv_check_udev_sensor_type (device, "iio-buffer-accel", NULL))
+ return FALSE;
+
+- if (!is_buffer_usable (device))
++ sensor_device = iio_buffer_accel_open (device);
++ if (!sensor_device)
+ return FALSE;
+
++ /* Attempt to read from the sensor */
++ drv_data = (DrvData *) sensor_device->priv;
++ enable_ring_buffer (drv_data->buffer_data);
++
++ buffer_usable = is_buffer_usable(drv_data->dev_path);
++
++ /* Close the sensor until it has been claimed */
++ disable_ring_buffer (drv_data->buffer_data);
++ iio_buffer_accel_close (sensor_device);
++
++ if (!buffer_usable)
++ return FALSE;
++
+ g_debug ("Found IIO buffer accelerometer at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
+ }
+diff --git a/src/drv-iio-buffer-compass.c b/src/drv-iio-buffer-compass.c
+index 2ae0ccd..4638134 100644
+--- a/src/drv-iio-buffer-compass.c
++++ b/src/drv-iio-buffer-compass.c
+@@ -20,7 +20,7 @@ typedef struct {
+ guint timeout_id;
+
+ GUdevDevice *dev;
+- const char *dev_path;
++ char *dev_path;
+ int device_id;
+ BufferDrvData *buffer_data;
+ } DrvData;
+@@ -125,7 +125,7 @@ iio_buffer_compass_open (GUdevDevice *device)
+ drv_data = (DrvData *) sensor_device->priv;
+ drv_data->dev = g_object_ref (device);
+ drv_data->buffer_data = buffer_data;
+- drv_data->dev_path = g_udev_device_get_device_file (device);
++ drv_data->dev_path = get_device_file (device);
+
+ return sensor_device;
+ }
+@@ -170,10 +170,28 @@ iio_buffer_compass_close (SensorDevice *sensor_device)
+ static gboolean
+ iio_buffer_compass_discover (GUdevDevice *device)
+ {
++ SensorDevice *sensor_device;
++ DrvData *drv_data;
++ gboolean buffer_usable = FALSE;
++
+ if (!drv_check_udev_sensor_type (device, "iio-buffer-compass", NULL))
+ return FALSE;
+
+- if (!is_buffer_usable (device))
++ sensor_device = iio_buffer_compass_open (device);
++ if (!sensor_device)
++ return FALSE;
++
++ /* Attempt to read from the sensor */
++ drv_data = (DrvData *) sensor_device->priv;
++ enable_ring_buffer (drv_data->buffer_data);
++
++ buffer_usable = is_buffer_usable(drv_data->dev_path);
++
++ /* Close the sensor until it has been claimed */
++ disable_ring_buffer (drv_data->buffer_data);
++ iio_buffer_compass_close (sensor_device);
++
++ if (!buffer_usable)
+ return FALSE;
+
+ g_debug ("Found IIO buffer compass at %s", g_udev_device_get_sysfs_path (device));
+diff --git a/src/drv-iio-buffer-light.c b/src/drv-iio-buffer-light.c
+index 2a524c6..7a423c5 100644
+--- a/src/drv-iio-buffer-light.c
++++ b/src/drv-iio-buffer-light.c
+@@ -20,7 +20,7 @@ typedef struct {
+ guint timeout_id;
+
+ GUdevDevice *dev;
+- const char *dev_path;
++ char *dev_path;
+ int device_id;
+ BufferDrvData *buffer_data;
+ } DrvData;
+@@ -156,7 +156,7 @@ iio_buffer_light_open (GUdevDevice *device)
+ drv_data = (DrvData *) sensor_device->priv;
+ drv_data->dev = g_object_ref (device);
+ drv_data->buffer_data = buffer_data;
+- drv_data->dev_path = g_udev_device_get_device_file (device);
++ drv_data->dev_path = get_device_file (device);
+
+ return sensor_device;
+ }
+@@ -175,10 +175,28 @@ iio_buffer_light_close (SensorDevice *sensor_device)
+ static gboolean
+ iio_buffer_light_discover (GUdevDevice *device)
+ {
++ SensorDevice *sensor_device;
++ DrvData *drv_data;
++ gboolean buffer_usable = FALSE;
++
+ if (!drv_check_udev_sensor_type (device, "iio-buffer-als", NULL))
+ return FALSE;
+
+- if (!is_buffer_usable (device))
++ sensor_device = iio_buffer_light_open (device);
++ if (!sensor_device)
++ return FALSE;
++
++ /* Attempt to read from the sensor */
++ drv_data = (DrvData *) sensor_device->priv;
++ enable_ring_buffer (drv_data->buffer_data);
++
++ buffer_usable = is_buffer_usable(drv_data->dev_path);
++
++ /* Close the sensor until it has been claimed */
++ disable_ring_buffer (drv_data->buffer_data);
++ iio_buffer_light_close (sensor_device);
++
++ if (!buffer_usable)
+ return FALSE;
+
+ g_debug ("Found IIO buffer ALS at %s", g_udev_device_get_sysfs_path (device));
+diff --git a/src/iio-buffer-utils.c b/src/iio-buffer-utils.c
+index bc74e4c..29163ee 100644
+--- a/src/iio-buffer-utils.c
++++ b/src/iio-buffer-utils.c
+@@ -20,6 +20,7 @@
+ #include <string.h>
+ #include <errno.h>
+ #include <stdio.h>
++#include <glib/gstdio.h>
+
+ #define IIO_MIN_SAMPLING_FREQUENCY 10 /* Hz */
+
+@@ -905,19 +906,28 @@ buffer_drv_data_new (GUdevDevice *device)
+ }
+
+ gboolean
+-is_buffer_usable (GUdevDevice *device)
++is_buffer_usable (char *path)
+ {
+- g_autofree char *trigger_name = NULL;
+- BufferDrvData *buffer_data;
++ gboolean buffer_usable = FALSE;
++ g_autofd int fp = -1;
++ GPollFD fds;
+
+- /* Temporarily enable the buffer to ensure the kernel driver is buffer-capable */
+- buffer_data = buffer_drv_data_new (device);
+- if (!buffer_data)
+- return FALSE;
++ /* Attempt to read from the sensor buffer */
++ fp = g_open (path, O_RDONLY | O_NONBLOCK);
++ if (fp == -1) {
++ g_warning ("Failed to open '%s': %s", path, g_strerror (errno));
++ } else {
++ fds.fd = fp;
++ fds.events = G_IO_IN | G_IO_ERR;
++ g_poll (&fds, 1, 500);
+
+- /* Destroy buffer information until actually needed (in the .open call) */
+- g_clear_pointer (&buffer_data, buffer_drv_data_free);
+- return TRUE;
++ if (fds.revents & G_IO_IN)
++ buffer_usable = TRUE;
++ else
++ g_warning ("Buffer '%s' did not have data within 0.5s", path);
++ }
++
++ return buffer_usable;
+ }
+
+ IIOSensorData *
+diff --git a/src/iio-buffer-utils.h b/src/iio-buffer-utils.h
+index 9c5e6db..2b95625 100644
+--- a/src/iio-buffer-utils.h
++++ b/src/iio-buffer-utils.h
+@@ -46,4 +46,4 @@ void buffer_drv_data_free (BufferDrvData *buffer_data);
+ BufferDrvData *buffer_drv_data_new (GUdevDevice *device);
+ void disable_ring_buffer (BufferDrvData *data);
+ gboolean enable_ring_buffer (BufferDrvData *data);
+-gboolean is_buffer_usable (GUdevDevice *device);
++gboolean is_buffer_usable (char *path);
+diff --git a/tests/integration-test.py b/tests/integration-test.py
+index 8910539..b596eaa 100755
+--- a/tests/integration-test.py
++++ b/tests/integration-test.py
+@@ -555,6 +555,9 @@ class Tests(dbusmock.DBusTestCase):
+ ['name', 'accel_3d-dev0'],
+ []
+ )
++ data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
++ with open(mock_dev_data,'wb') as mock_file:
++ mock_file.write(data)
+ self.start_daemon()
+ self.assertEqual(self.get_dbus_property('HasAmbientLight'), False)
+ self.assertEqual(self.get_dbus_property('HasAccelerometer'), True)
+@@ -566,7 +569,6 @@ class Tests(dbusmock.DBusTestCase):
+ self.assertEqual(self.read_sysfs_attr(accel, 'scan_elements/in_accel_y_en'), b'1')
+ self.assertEqual(self.read_sysfs_attr(accel, 'scan_elements/in_accel_z_en'), b'1')
+
+- data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
+ with open(mock_dev_data,'wb') as mock_file:
+ mock_file.write(data)
+ self.proxy.ClaimAccelerometer()
+@@ -595,6 +597,8 @@ class Tests(dbusmock.DBusTestCase):
+
+ def test_driver_buffer_without_trigger(self):
+ '''buffer driver picking without trigger'''
++ top_srcdir = os.getenv('top_srcdir', '.')
++ mock_dev_data = self.testbed.get_root_dir() + '/iio-dev-data.bin'
+ accel = self.testbed.add_device('iio', 'iio-buffer-accel0', None,
+ ['name', 'IIO Test Accelerometer',
+ 'buffer/enable', '0',
+@@ -615,6 +619,9 @@ class Tests(dbusmock.DBusTestCase):
+ 'IIO_SENSOR_PROXY_TYPE', 'iio-buffer-accel']
+ )
+
++ data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
++ with open(mock_dev_data,'wb') as mock_file:
++ mock_file.write(data)
+ self.start_daemon()
+
+ self.assertEqual(self.get_dbus_property('HasAmbientLight'), False)
+@@ -696,10 +703,12 @@ class Tests(dbusmock.DBusTestCase):
+ )
+ env = os.environ.copy()
+ env['LC_NUMERIC'] = 'fr_FR.UTF-8'
++ data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
++ with open(mock_dev_data,'wb') as mock_file:
++ mock_file.write(data)
+ self.start_daemon(env=env)
+
+ self.assertEqual(self.get_dbus_property('HasAccelerometer'), True)
+- data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
+ with open(mock_dev_data,'wb') as mock_file:
+ mock_file.write(data)
+ self.proxy.ClaimAccelerometer()
+@@ -742,6 +751,9 @@ class Tests(dbusmock.DBusTestCase):
+ )
+ env = os.environ.copy()
+ env['LC_NUMERIC'] = 'fr_FR.UTF-8'
++ data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
++ with open(mock_dev_data,'wb') as mock_file:
++ mock_file.write(data)
+ self.start_daemon(env=env)
+
+ self.assertEqual(self.get_dbus_property('HasAccelerometer'), True)
diff --git a/debian/patches/integration-test-add-test-for-sensors-that-report-non-wor.patch b/debian/patches/integration-test-add-test-for-sensors-that-report-non-wor.patch
new file mode 100644
index 0000000..76d6242
--- /dev/null
+++ b/debian/patches/integration-test-add-test-for-sensors-that-report-non-wor.patch
@@ -0,0 +1,59 @@
+From: "Sicelo A. Mhlongo" <absicsz@gmail.com>
+Date: Mon, 26 May 2025 18:05:38 +0200
+Subject: integration-test: add test for sensors that report non-working
+ buffers
+
+Confirm that when a sensor reports support for buffer operation, and the mode
+can actually be enabled, but no data is returned, iio-sensor-proxy will detect
+this and switch to polling mode.
+---
+ tests/integration-test.py | 36 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 36 insertions(+)
+
+diff --git a/tests/integration-test.py b/tests/integration-test.py
+index b596eaa..95b9da3 100755
+--- a/tests/integration-test.py
++++ b/tests/integration-test.py
+@@ -630,6 +630,42 @@ class Tests(dbusmock.DBusTestCase):
+
+ self.stop_daemon()
+
++ def test_iio_broken_buffer_accel(self):
++ '''iio sensor reporting broken buffer support'''
++ top_srcdir = os.getenv('top_srcdir', '.')
++ mock_dev_data = self.testbed.get_root_dir() + '/iio-dev-data.bin'
++ accel = self.testbed.add_device('iio', 'iio-buffer-accel0', None,
++ ['name', 'IIO Test Accelerometer',
++ 'buffer/enable', '0',
++ 'trigger/current_trigger', '',
++ 'scan_elements/in_accel_x_en', '0',
++ 'scan_elements/in_accel_x_index', '0',
++ 'scan_elements/in_accel_x_type', 'le:s16/32>>0',
++ 'scan_elements/in_accel_y_en', '0',
++ 'scan_elements/in_accel_y_index', '1',
++ 'scan_elements/in_accel_y_type', 'le:s16/32>>0',
++ 'scan_elements/in_accel_z_en', '0',
++ 'scan_elements/in_accel_z_index', '2',
++ 'scan_elements/in_accel_z_type', 'le:s16/32>>0',
++ 'scan_elements/in_timestamp_en', '1',
++ 'scan_elements/in_timestamp_index', '3',
++ 'scan_elements/in_timestamp_type', 'le:s64/64>>0'],
++ ['NAME', '"IIO Accelerometer"',
++ 'DEVNAME', '/dev/iio-buffer-accel-test',
++ 'IIO_SENSOR_PROXY_TYPE', 'iio-buffer-accel iio-poll-accel']
++ )
++ trigger = self.testbed.add_device('iio', 'trigger0', None,
++ ['name', 'accel_3d-dev0'],
++ []
++ )
++ self.start_daemon()
++ self.assertEqual(self.have_text_in_log('Built channel array'), True)
++ self.assertEqual(self.have_text_in_log('Disabled sensor'), True)
++ self.assertEqual(self.have_text_in_log('Found IIO poll accelerometer'), True)
++ self.assertEqual(self.get_dbus_property('HasAccelerometer'), True)
++
++ self.stop_daemon()
++
+ def test_unrequested_readings(self):
+ '''unrequested property updates'''
+ self.testbed.add_device('input', 'fake-light', None,
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..8e5285e
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,4 @@
+drv-iio-buffer-relocate-the-.discover-method-to-bring-the.patch
+buffer_drv_data_new-rework-trigger_name-handling.patch
+iio-buffer-attempt-to-read-from-buffer-during-sensor-disc.patch
+integration-test-add-test-for-sensors-that-report-non-wor.patch
Reply to: