* [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1)
@ 2025-04-18 19:58 David Lechner
2025-04-18 19:58 ` [PATCH 01/10] iio: accel: sca3300: use struct with aligned_s64 timestamp David Lechner
` (10 more replies)
0 siblings, 11 replies; 18+ messages in thread
From: David Lechner @ 2025-04-18 19:58 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32,
David Lechner
While reviewing the recent conversion to iio_push_to_buffers_with_ts(),
I found it very time-consuming to check the correctness of the buffers
passed to that function when they used an array with extra room at the
end for a timestamp. And we still managed find a few that were wrongly
sized or not properly aligned despite several efforts in the past to
audit these for correctness already.
Even though these ones look to be correct, it will still be easier for
future readers of the code if we follow the pattern of using a struct
with the array and timestamp instead.
For example, it is much easier to see that:
struct {
__be32 data[3];
aligned_s64 timestamp;
} buffer;
Is an array of 3 32-bit, big-endian raw values plus an aligned 64-bit
timestamp than:
/*
* 3 words for actual data, 1 word for padding for correct alignment
* of timestamp and 2 words for actual timestamp.
*/
__be32 buffer[6] __aligned(8);
There are plenty more drivers where we could make similar changes, but
this is enough for one week of reviews.
---
David Lechner (10):
iio: accel: sca3300: use struct with aligned_s64 timestamp
iio: adc: at91-sama5d2_adc: use struct with aligned_s64 timestamp
iio: adc: hx711: use struct with aligned_s64 timestamp
iio: adc: mxs-lradc-adc: use struct with aligned_s64 timestamp
iio: adc: stm32-adc: use struct with aligned_s64 timestamp
iio: adc: ti-adc0832: use struct with aligned_s64 timestamp
iio: adc: ti-adc12138: use struct with aligned_s64 timestamp
iio: adc: ti-ads124s08: use struct with aligned_s64 timestamp
iio: adc: ti-ads8688: use struct with aligned_s64 timestamp
iio: chemical: atlas-sensor: use struct with aligned_s64 timestamp
drivers/iio/accel/sca3300.c | 18 ++++++------------
drivers/iio/adc/at91-sama5d2_adc.c | 25 ++++++++++---------------
drivers/iio/adc/hx711.c | 11 +++++++----
drivers/iio/adc/mxs-lradc-adc.c | 13 ++++++++-----
drivers/iio/adc/stm32-adc.c | 12 ++++++++----
drivers/iio/adc/ti-adc0832.c | 15 +++++++--------
drivers/iio/adc/ti-adc12138.c | 12 ++++++++----
drivers/iio/adc/ti-ads124s08.c | 18 +++++++-----------
drivers/iio/adc/ti-ads8688.c | 12 ++++++++----
drivers/iio/chemical/atlas-sensor.c | 11 +++++++----
10 files changed, 76 insertions(+), 71 deletions(-)
---
base-commit: aff301f37e220970c2f301b5c65a8bfedf52058e
change-id: 20250418-iio-prefer-aligned_s64-timestamp-fee64ec55405
Best regards,
--
David Lechner <dlechner@baylibre.com>
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 01/10] iio: accel: sca3300: use struct with aligned_s64 timestamp
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
@ 2025-04-18 19:58 ` David Lechner
2025-04-18 19:58 ` [PATCH 02/10] iio: adc: at91-sama5d2_adc: " David Lechner
` (9 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: David Lechner @ 2025-04-18 19:58 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32,
David Lechner
Use a struct with aligned_s64 timestamp instead of a padded array for
the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
to see the correctness of the size and alignment of the buffer.
Changing the array part to s16 insted of u8 also lets us drop the cast
when it is used.
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
drivers/iio/accel/sca3300.c | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/drivers/iio/accel/sca3300.c b/drivers/iio/accel/sca3300.c
index 1132bbaba75bcca525fac2f3e19f63546380fd4f..f04ad523f48abd598b1b2df37c51da894c0ce796 100644
--- a/drivers/iio/accel/sca3300.c
+++ b/drivers/iio/accel/sca3300.c
@@ -58,15 +58,6 @@ enum sca3300_scan_indexes {
SCA3300_SCAN_MAX
};
-/*
- * Buffer size max case:
- * Three accel channels, two bytes per channel.
- * Temperature channel, two bytes.
- * Three incli channels, two bytes per channel.
- * Timestamp channel, eight bytes.
- */
-#define SCA3300_MAX_BUFFER_SIZE (ALIGN(sizeof(s16) * SCA3300_SCAN_MAX, sizeof(s64)) + sizeof(s64))
-
#define SCA3300_ACCEL_CHANNEL(index, reg, axis) { \
.type = IIO_ACCEL, \
.address = reg, \
@@ -203,7 +194,10 @@ struct sca3300_data {
struct spi_device *spi;
struct mutex lock;
const struct sca3300_chip_info *chip;
- u8 buffer[SCA3300_MAX_BUFFER_SIZE] __aligned(sizeof(s64));
+ struct {
+ s16 channels[SCA3300_SCAN_MAX];
+ aligned_s64 timestamp;
+ } buffer;
u8 txbuf[4] __aligned(IIO_DMA_MINALIGN);
u8 rxbuf[4];
};
@@ -492,7 +486,7 @@ static irqreturn_t sca3300_trigger_handler(int irq, void *p)
struct iio_dev *indio_dev = pf->indio_dev;
struct sca3300_data *data = iio_priv(indio_dev);
int bit, ret, val, i = 0;
- s16 *channels = (s16 *)data->buffer;
+ s16 *channels = data->buffer.channels;
iio_for_each_active_channel(indio_dev, bit) {
ret = sca3300_read_reg(data, indio_dev->channels[bit].address, &val);
@@ -505,7 +499,7 @@ static irqreturn_t sca3300_trigger_handler(int irq, void *p)
channels[i++] = val;
}
- iio_push_to_buffers_with_ts(indio_dev, data->buffer,
+ iio_push_to_buffers_with_ts(indio_dev, &data->buffer,
sizeof(data->buffer),
iio_get_time_ns(indio_dev));
out:
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 02/10] iio: adc: at91-sama5d2_adc: use struct with aligned_s64 timestamp
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
2025-04-18 19:58 ` [PATCH 01/10] iio: accel: sca3300: use struct with aligned_s64 timestamp David Lechner
@ 2025-04-18 19:58 ` David Lechner
2025-04-21 11:10 ` Jonathan Cameron
2025-04-18 19:58 ` [PATCH 03/10] iio: adc: hx711: " David Lechner
` (8 subsequent siblings)
10 siblings, 1 reply; 18+ messages in thread
From: David Lechner @ 2025-04-18 19:58 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32,
David Lechner
Use a struct with aligned s64 timestamp_instead of a padded array for
the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
to see the correctness of the size and alignment of the buffer.
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
drivers/iio/adc/at91-sama5d2_adc.c | 25 ++++++++++---------------
1 file changed, 10 insertions(+), 15 deletions(-)
diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
index 414610afcb2c4128a63cf76767803c32cb01ac5e..07ced924f7a6ae36fe538021a45adbf7d76c2e69 100644
--- a/drivers/iio/adc/at91-sama5d2_adc.c
+++ b/drivers/iio/adc/at91-sama5d2_adc.c
@@ -21,6 +21,7 @@
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/sched.h>
+#include <linux/types.h>
#include <linux/units.h>
#include <linux/wait.h>
#include <linux/iio/iio.h>
@@ -586,15 +587,6 @@ struct at91_adc_temp {
u16 saved_oversampling;
};
-/*
- * Buffer size requirements:
- * No channels * bytes_per_channel(2) + timestamp bytes (8)
- * Divided by 2 because we need half words.
- * We assume 32 channels for now, has to be increased if needed.
- * Nobody minds a buffer being too big.
- */
-#define AT91_BUFFER_MAX_HWORDS ((32 * 2 + 8) / 2)
-
struct at91_adc_state {
void __iomem *base;
int irq;
@@ -617,7 +609,10 @@ struct at91_adc_state {
struct iio_dev *indio_dev;
struct device *dev;
/* Ensure naturally aligned timestamp */
- u16 buffer[AT91_BUFFER_MAX_HWORDS] __aligned(8);
+ struct {
+ u16 data[32];
+ aligned_s64 timestamp;
+ } buffer;
/*
* lock to prevent concurrent 'single conversion' requests through
* sysfs.
@@ -1481,14 +1476,14 @@ static void at91_adc_trigger_handler_nodma(struct iio_dev *indio_dev,
if (chan->type == IIO_VOLTAGE) {
val = at91_adc_read_chan(st, chan->address);
at91_adc_adjust_val_osr(st, &val);
- st->buffer[i] = val;
+ st->buffer.data[i] = val;
} else {
- st->buffer[i] = 0;
+ st->buffer.data[i] = 0;
WARN(true, "This trigger cannot handle this type of channel");
}
i++;
}
- iio_push_to_buffers_with_timestamp(indio_dev, st->buffer,
+ iio_push_to_buffers_with_timestamp(indio_dev, &st->buffer,
pf->timestamp);
}
@@ -1643,7 +1638,7 @@ static void at91_adc_touch_data_handler(struct iio_dev *indio_dev)
at91_adc_read_pressure(st, chan->channel, &val);
else
continue;
- st->buffer[i] = val;
+ st->buffer.data[i] = val;
i++;
}
/*
@@ -1691,7 +1686,7 @@ static void at91_adc_workq_handler(struct work_struct *workq)
struct at91_adc_state, touch_st);
struct iio_dev *indio_dev = st->indio_dev;
- iio_push_to_buffers(indio_dev, st->buffer);
+ iio_push_to_buffers(indio_dev, st->buffer.data);
}
static irqreturn_t at91_adc_interrupt(int irq, void *private)
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 03/10] iio: adc: hx711: use struct with aligned_s64 timestamp
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
2025-04-18 19:58 ` [PATCH 01/10] iio: accel: sca3300: use struct with aligned_s64 timestamp David Lechner
2025-04-18 19:58 ` [PATCH 02/10] iio: adc: at91-sama5d2_adc: " David Lechner
@ 2025-04-18 19:58 ` David Lechner
2025-04-21 11:11 ` Jonathan Cameron
2025-04-18 19:58 ` [PATCH 04/10] iio: adc: mxs-lradc-adc: " David Lechner
` (7 subsequent siblings)
10 siblings, 1 reply; 18+ messages in thread
From: David Lechner @ 2025-04-18 19:58 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32,
David Lechner
Use a struct with aligned s64_timestamp instead of a padded array for
the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
to see the correctness of the size and alignment of the buffer.
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
drivers/iio/adc/hx711.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/hx711.c b/drivers/iio/adc/hx711.c
index 8da0419ecfa3575aa54a93707c681ec8ced28be8..7235fa9e13d57c693751757c5d40e8a799622f17 100644
--- a/drivers/iio/adc/hx711.c
+++ b/drivers/iio/adc/hx711.c
@@ -87,7 +87,10 @@ struct hx711_data {
* triggered buffer
* 2x32-bit channel + 64-bit naturally aligned timestamp
*/
- u32 buffer[4] __aligned(8);
+ struct {
+ u32 channel[2];
+ aligned_s64 timestamp;
+ } buffer;
/*
* delay after a rising edge on SCK until the data is ready DOUT
* this is dependent on the hx711 where the datasheet tells a
@@ -361,15 +364,15 @@ static irqreturn_t hx711_trigger(int irq, void *p)
mutex_lock(&hx711_data->lock);
- memset(hx711_data->buffer, 0, sizeof(hx711_data->buffer));
+ memset(&hx711_data->buffer, 0, sizeof(hx711_data->buffer));
iio_for_each_active_channel(indio_dev, i) {
- hx711_data->buffer[j] = hx711_reset_read(hx711_data,
+ hx711_data->buffer.channel[j] = hx711_reset_read(hx711_data,
indio_dev->channels[i].channel);
j++;
}
- iio_push_to_buffers_with_timestamp(indio_dev, hx711_data->buffer,
+ iio_push_to_buffers_with_timestamp(indio_dev, &hx711_data->buffer,
pf->timestamp);
mutex_unlock(&hx711_data->lock);
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 04/10] iio: adc: mxs-lradc-adc: use struct with aligned_s64 timestamp
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
` (2 preceding siblings ...)
2025-04-18 19:58 ` [PATCH 03/10] iio: adc: hx711: " David Lechner
@ 2025-04-18 19:58 ` David Lechner
2025-04-21 11:13 ` Jonathan Cameron
2025-04-18 19:58 ` [PATCH 05/10] iio: adc: stm32-adc: " David Lechner
` (6 subsequent siblings)
10 siblings, 1 reply; 18+ messages in thread
From: David Lechner @ 2025-04-18 19:58 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32,
David Lechner
Use a struct with aligned s64_timestamp instead of a padded array for
the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
to see the correctness of the size and alignment of the buffer.
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
drivers/iio/adc/mxs-lradc-adc.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/drivers/iio/adc/mxs-lradc-adc.c b/drivers/iio/adc/mxs-lradc-adc.c
index 92baf3f5f5601b863c694eb03b6d8f287e4fe6ab..73e42f0ebcaeaaa437ba5c64ecdd7759a1191e6c 100644
--- a/drivers/iio/adc/mxs-lradc-adc.c
+++ b/drivers/iio/adc/mxs-lradc-adc.c
@@ -116,7 +116,10 @@ struct mxs_lradc_adc {
void __iomem *base;
/* Maximum of 8 channels + 8 byte ts */
- u32 buffer[10] __aligned(8);
+ struct {
+ u32 data[8];
+ aligned_u64 ts;
+ } buffer;
struct iio_trigger *trig;
struct completion completion;
spinlock_t lock;
@@ -418,14 +421,14 @@ static irqreturn_t mxs_lradc_adc_trigger_handler(int irq, void *p)
unsigned int i, j = 0;
for_each_set_bit(i, iio->active_scan_mask, LRADC_MAX_TOTAL_CHANS) {
- adc->buffer[j] = readl(adc->base + LRADC_CH(j));
+ adc->buffer.data[j] = readl(adc->base + LRADC_CH(j));
writel(chan_value, adc->base + LRADC_CH(j));
- adc->buffer[j] &= LRADC_CH_VALUE_MASK;
- adc->buffer[j] /= LRADC_DELAY_TIMER_LOOP;
+ adc->buffer.data[j] &= LRADC_CH_VALUE_MASK;
+ adc->buffer.data[j] /= LRADC_DELAY_TIMER_LOOP;
j++;
}
- iio_push_to_buffers_with_ts(iio, adc->buffer, sizeof(adc->buffer),
+ iio_push_to_buffers_with_ts(iio, &adc->buffer, sizeof(adc->buffer),
pf->timestamp);
iio_trigger_notify_done(iio->trig);
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 05/10] iio: adc: stm32-adc: use struct with aligned_s64 timestamp
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
` (3 preceding siblings ...)
2025-04-18 19:58 ` [PATCH 04/10] iio: adc: mxs-lradc-adc: " David Lechner
@ 2025-04-18 19:58 ` David Lechner
2025-04-18 19:58 ` [PATCH 06/10] iio: adc: ti-adc0832: " David Lechner
` (5 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: David Lechner @ 2025-04-18 19:58 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32,
David Lechner
Use a struct with aligned s64_timestamp instead of a padded array for
the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
to see the correctness of the size and alignment of the buffer.
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
drivers/iio/adc/stm32-adc.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c
index 5159908a2a6100b62e5e64b2b469378ad778c35d..81df0d45784553c87c92995934884138939ac899 100644
--- a/drivers/iio/adc/stm32-adc.c
+++ b/drivers/iio/adc/stm32-adc.c
@@ -27,6 +27,7 @@
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/property.h>
+#include <linux/types.h>
#include "stm32-adc-core.h"
@@ -261,7 +262,10 @@ struct stm32_adc {
u32 offset;
const struct stm32_adc_cfg *cfg;
struct completion completion;
- u16 buffer[STM32_ADC_MAX_SQ + 4] __aligned(8);
+ struct {
+ u16 data[STM32_ADC_MAX_SQ];
+ aligned_s64 timestamp;
+ } buffer;
struct clk *clk;
int irq;
spinlock_t lock; /* interrupt lock */
@@ -1447,7 +1451,7 @@ static int stm32_adc_single_conv(struct iio_dev *indio_dev,
} else if (time_left < 0) {
ret = time_left;
} else {
- *res = adc->buffer[0];
+ *res = adc->buffer.data[0];
ret = IIO_VAL_INT;
}
@@ -1559,7 +1563,7 @@ static irqreturn_t stm32_adc_isr(int irq, void *data)
if (status & regs->isr_eoc.mask) {
/* Reading DR also clears EOC status flag */
- adc->buffer[adc->bufi] = stm32_adc_readw(adc, regs->dr);
+ adc->buffer.data[adc->bufi] = stm32_adc_readw(adc, regs->dr);
if (iio_buffer_enabled(indio_dev)) {
adc->bufi++;
if (adc->bufi >= adc->num_conv) {
@@ -1858,7 +1862,7 @@ static irqreturn_t stm32_adc_trigger_handler(int irq, void *p)
/* reset buffer index */
adc->bufi = 0;
- iio_push_to_buffers_with_ts(indio_dev, adc->buffer, sizeof(adc->buffer),
+ iio_push_to_buffers_with_ts(indio_dev, &adc->buffer, sizeof(adc->buffer),
pf->timestamp);
iio_trigger_notify_done(indio_dev->trig);
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 06/10] iio: adc: ti-adc0832: use struct with aligned_s64 timestamp
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
` (4 preceding siblings ...)
2025-04-18 19:58 ` [PATCH 05/10] iio: adc: stm32-adc: " David Lechner
@ 2025-04-18 19:58 ` David Lechner
2025-04-21 11:15 ` Jonathan Cameron
2025-04-18 19:58 ` [PATCH 07/10] iio: adc: ti-adc12138: " David Lechner
` (4 subsequent siblings)
10 siblings, 1 reply; 18+ messages in thread
From: David Lechner @ 2025-04-18 19:58 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32,
David Lechner
Use a struct with aligned s64_timestamp instead of a padded array for
the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
to see the correctness of the size and alignment of the buffer.
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
drivers/iio/adc/ti-adc0832.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/drivers/iio/adc/ti-adc0832.c b/drivers/iio/adc/ti-adc0832.c
index cfcdafbe284b103a069857028886411bc72dea4f..f508f7113faa2610a2889f3c36c5a679fa72264d 100644
--- a/drivers/iio/adc/ti-adc0832.c
+++ b/drivers/iio/adc/ti-adc0832.c
@@ -10,6 +10,7 @@
#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/spi/spi.h>
+#include <linux/types.h>
#include <linux/iio/iio.h>
#include <linux/regulator/consumer.h>
#include <linux/iio/buffer.h>
@@ -29,12 +30,10 @@ struct adc0832 {
struct regulator *reg;
struct mutex lock;
u8 mux_bits;
- /*
- * Max size needed: 16x 1 byte ADC data + 8 bytes timestamp
- * May be shorter if not all channels are enabled subject
- * to the timestamp remaining 8 byte aligned.
- */
- u8 data[24] __aligned(8);
+ struct {
+ u8 data[16];
+ aligned_s64 timestamp;
+ } buffer;
u8 tx_buf[2] __aligned(IIO_DMA_MINALIGN);
u8 rx_buf[2];
@@ -222,10 +221,10 @@ static irqreturn_t adc0832_trigger_handler(int irq, void *p)
goto out;
}
- adc->data[i] = ret;
+ adc->buffer.data[i] = ret;
i++;
}
- iio_push_to_buffers_with_ts(indio_dev, adc->data, sizeof(adc->data),
+ iio_push_to_buffers_with_ts(indio_dev, &adc->buffer, sizeof(adc->buffer),
iio_get_time_ns(indio_dev));
out:
mutex_unlock(&adc->lock);
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 07/10] iio: adc: ti-adc12138: use struct with aligned_s64 timestamp
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
` (5 preceding siblings ...)
2025-04-18 19:58 ` [PATCH 06/10] iio: adc: ti-adc0832: " David Lechner
@ 2025-04-18 19:58 ` David Lechner
2025-04-18 19:58 ` [PATCH 08/10] iio: adc: ti-ads124s08: " David Lechner
` (3 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: David Lechner @ 2025-04-18 19:58 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32,
David Lechner
Use a struct with aligned s64_timestamp instead of a padded array for
the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
to see the correctness of the size and alignment of the buffer.
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
drivers/iio/adc/ti-adc12138.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/ti-adc12138.c b/drivers/iio/adc/ti-adc12138.c
index 9dc465a10ffc8d9f596e34215af685999235d690..27cafc2954e8956fbd674eb2bc32c59980ffb746 100644
--- a/drivers/iio/adc/ti-adc12138.c
+++ b/drivers/iio/adc/ti-adc12138.c
@@ -19,6 +19,7 @@
#include <linux/iio/triggered_buffer.h>
#include <linux/iio/trigger_consumer.h>
#include <linux/regulator/consumer.h>
+#include <linux/types.h>
#define ADC12138_MODE_AUTO_CAL 0x08
#define ADC12138_MODE_READ_STATUS 0x0c
@@ -53,7 +54,10 @@ struct adc12138 {
* Less may be need if not all channels are enabled, as long as
* the 8 byte alignment of the timestamp is maintained.
*/
- __be16 data[20] __aligned(8);
+ struct {
+ __be16 data[16];
+ aligned_s64 timestamp;
+ } buffer;
u8 tx_buf[2] __aligned(IIO_DMA_MINALIGN);
u8 rx_buf[2];
@@ -351,7 +355,7 @@ static irqreturn_t adc12138_trigger_handler(int irq, void *p)
reinit_completion(&adc->complete);
ret = adc12138_start_and_read_conv(adc, scan_chan,
- i ? &adc->data[i - 1] : &trash);
+ i ? &adc->buffer.data[i - 1] : &trash);
if (ret) {
dev_warn(&adc->spi->dev,
"failed to start conversion\n");
@@ -368,7 +372,7 @@ static irqreturn_t adc12138_trigger_handler(int irq, void *p)
}
if (i) {
- ret = adc12138_read_conv_data(adc, &adc->data[i - 1]);
+ ret = adc12138_read_conv_data(adc, &adc->buffer.data[i - 1]);
if (ret) {
dev_warn(&adc->spi->dev,
"failed to get conversion data\n");
@@ -376,7 +380,7 @@ static irqreturn_t adc12138_trigger_handler(int irq, void *p)
}
}
- iio_push_to_buffers_with_ts(indio_dev, adc->data, sizeof(adc->data),
+ iio_push_to_buffers_with_ts(indio_dev, &adc->buffer, sizeof(adc->buffer),
iio_get_time_ns(indio_dev));
out:
mutex_unlock(&adc->lock);
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 08/10] iio: adc: ti-ads124s08: use struct with aligned_s64 timestamp
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
` (6 preceding siblings ...)
2025-04-18 19:58 ` [PATCH 07/10] iio: adc: ti-adc12138: " David Lechner
@ 2025-04-18 19:58 ` David Lechner
2025-04-18 19:58 ` [PATCH 09/10] iio: adc: ti-ads8688: " David Lechner
` (2 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: David Lechner @ 2025-04-18 19:58 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32,
David Lechner
Use a struct with aligned s64_timestamp instead of a padded array for
the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
to see the correctness of the size and alignment of the buffer.
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
drivers/iio/adc/ti-ads124s08.c | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/drivers/iio/adc/ti-ads124s08.c b/drivers/iio/adc/ti-ads124s08.c
index 8ea1269f74db09427a4a8d434ba1d63e7c63d038..ecaffe83fcc911f99afbeae7ef51440d150bef73 100644
--- a/drivers/iio/adc/ti-ads124s08.c
+++ b/drivers/iio/adc/ti-ads124s08.c
@@ -98,14 +98,10 @@ struct ads124s_private {
struct gpio_desc *reset_gpio;
struct spi_device *spi;
struct mutex lock;
- /*
- * Used to correctly align data.
- * Ensure timestamp is naturally aligned.
- * Note that the full buffer length may not be needed if not
- * all channels are enabled, as long as the alignment of the
- * timestamp is maintained.
- */
- u32 buffer[ADS124S08_MAX_CHANNELS + sizeof(s64)/sizeof(u32)] __aligned(8);
+ struct {
+ u32 data[ADS124S08_MAX_CHANNELS];
+ aligned_s64 timestamp;
+ } buffer;
u8 data[5] __aligned(IIO_DMA_MINALIGN);
};
@@ -289,7 +285,7 @@ static irqreturn_t ads124s_trigger_handler(int irq, void *p)
if (ret)
dev_err(&priv->spi->dev, "Start ADC conversions failed\n");
- priv->buffer[j] = ads124s_read(indio_dev);
+ priv->buffer.data[j] = ads124s_read(indio_dev);
ret = ads124s_write_cmd(indio_dev, ADS124S08_STOP_CONV);
if (ret)
dev_err(&priv->spi->dev, "Stop ADC conversions failed\n");
@@ -297,8 +293,8 @@ static irqreturn_t ads124s_trigger_handler(int irq, void *p)
j++;
}
- iio_push_to_buffers_with_ts(indio_dev, priv->buffer, sizeof(priv->buffer),
- pf->timestamp);
+ iio_push_to_buffers_with_ts(indio_dev, &priv->buffer,
+ sizeof(priv->buffer), pf->timestamp);
iio_trigger_notify_done(indio_dev->trig);
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 09/10] iio: adc: ti-ads8688: use struct with aligned_s64 timestamp
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
` (7 preceding siblings ...)
2025-04-18 19:58 ` [PATCH 08/10] iio: adc: ti-ads124s08: " David Lechner
@ 2025-04-18 19:58 ` David Lechner
2025-04-18 19:58 ` [PATCH 10/10] iio: chemical: atlas-sensor: " David Lechner
2025-04-18 23:05 ` [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
10 siblings, 0 replies; 18+ messages in thread
From: David Lechner @ 2025-04-18 19:58 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32,
David Lechner
Use a struct with aligned s64_timestamp instead of a padded array for
the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
to see the correctness of the size and alignment of the buffer.
Changed from struct initializer to memset() in case the size ever
changes and there could be holes in the struct. The compiler generally
optimizes calls to memset() anyway.
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
drivers/iio/adc/ti-ads8688.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/ti-ads8688.c b/drivers/iio/adc/ti-ads8688.c
index b0bf46cae0b69eb1fe8d7734c8a32ac642c5d0cd..2a9cb7d9bbfae4b282682d755992acd47fb88b99 100644
--- a/drivers/iio/adc/ti-ads8688.c
+++ b/drivers/iio/adc/ti-ads8688.c
@@ -380,16 +380,20 @@ static irqreturn_t ads8688_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev;
- /* Ensure naturally aligned timestamp */
- u16 buffer[ADS8688_MAX_CHANNELS + sizeof(s64)/sizeof(u16)] __aligned(8) = { };
+ struct {
+ u16 data[ADS8688_MAX_CHANNELS];
+ aligned_s64 timestamp;
+ } buffer;
int i, j = 0;
+ memset(&buffer, 0, sizeof(buffer));
+
iio_for_each_active_channel(indio_dev, i) {
- buffer[j] = ads8688_read(indio_dev, i);
+ buffer.data[j] = ads8688_read(indio_dev, i);
j++;
}
- iio_push_to_buffers_with_ts(indio_dev, buffer, sizeof(buffer),
+ iio_push_to_buffers_with_ts(indio_dev, &buffer, sizeof(buffer),
iio_get_time_ns(indio_dev));
iio_trigger_notify_done(indio_dev->trig);
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 10/10] iio: chemical: atlas-sensor: use struct with aligned_s64 timestamp
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
` (8 preceding siblings ...)
2025-04-18 19:58 ` [PATCH 09/10] iio: adc: ti-ads8688: " David Lechner
@ 2025-04-18 19:58 ` David Lechner
2025-04-18 23:05 ` [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
10 siblings, 0 replies; 18+ messages in thread
From: David Lechner @ 2025-04-18 19:58 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32,
David Lechner
Use a struct with aligned s64_timestamp instead of a padded array for
the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
to see the correctness of the size and alignment of the buffer.
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
drivers/iio/chemical/atlas-sensor.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/chemical/atlas-sensor.c b/drivers/iio/chemical/atlas-sensor.c
index cb6662b9213740f4a88b8412e6a0f01bc5a314d6..a67783ce7f1b68135e05d3afc05533d400d4a052 100644
--- a/drivers/iio/chemical/atlas-sensor.c
+++ b/drivers/iio/chemical/atlas-sensor.c
@@ -17,6 +17,7 @@
#include <linux/i2c.h>
#include <linux/mod_devicetable.h>
#include <linux/regmap.h>
+#include <linux/types.h>
#include <linux/iio/iio.h>
#include <linux/iio/buffer.h>
#include <linux/iio/trigger.h>
@@ -91,8 +92,10 @@ struct atlas_data {
struct regmap *regmap;
struct irq_work work;
unsigned int interrupt_enabled;
- /* 96-bit data + 32-bit pad + 64-bit timestamp */
- __be32 buffer[6] __aligned(8);
+ struct {
+ __be32 data[3];
+ aligned_s64 timestamp;
+ } buffer;
};
static const struct regmap_config atlas_regmap_config = {
@@ -455,10 +458,10 @@ static irqreturn_t atlas_trigger_handler(int irq, void *private)
int ret;
ret = regmap_bulk_read(data->regmap, data->chip->data_reg,
- &data->buffer, sizeof(__be32) * channels);
+ data->buffer.data, sizeof(__be32) * channels);
if (!ret)
- iio_push_to_buffers_with_ts(indio_dev, data->buffer,
+ iio_push_to_buffers_with_ts(indio_dev, &data->buffer,
sizeof(data->buffer),
iio_get_time_ns(indio_dev));
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1)
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
` (9 preceding siblings ...)
2025-04-18 19:58 ` [PATCH 10/10] iio: chemical: atlas-sensor: " David Lechner
@ 2025-04-18 23:05 ` David Lechner
2025-04-21 11:17 ` Jonathan Cameron
10 siblings, 1 reply; 18+ messages in thread
From: David Lechner @ 2025-04-18 23:05 UTC (permalink / raw)
To: Jonathan Cameron, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue
Cc: linux-iio, linux-kernel, linux-arm-kernel, imx, linux-stm32
On 4/18/25 2:58 PM, David Lechner wrote:
> While reviewing the recent conversion to iio_push_to_buffers_with_ts(),
> I found it very time-consuming to check the correctness of the buffers
> passed to that function when they used an array with extra room at the
> end for a timestamp. And we still managed find a few that were wrongly
> sized or not properly aligned despite several efforts in the past to
> audit these for correctness already.
>
> Even though these ones look to be correct, it will still be easier for
> future readers of the code if we follow the pattern of using a struct
> with the array and timestamp instead.
>
> For example, it is much easier to see that:
>
> struct {
> __be32 data[3];
> aligned_s64 timestamp;
> } buffer;
>
After sending [1], I realized that some (perhaps many) of these would actually
be a better candidate for the proposed IIO_DECLARE_BUFFER_WITH_TS macro rather
that converting to the struct style as above.
Case in point: if the driver using that struct allows reading only one channel,
then the offset of the timestamp when doing iio_push_to_buffers_with_ts() would
be 8 bytes, not 16, so the struct would not always be the correct layout.
As long as the driver doesn't access the timestamp member of the struct, it
doesn't really matter, but this could be a bit misleading to anyone who might
unknowing try to use it in the future.
[1]: https://lore.kernel.org/linux-iio/20250418-iio-introduce-iio_declare_buffer_with_ts-v1-0-ee0c62a33a0f@baylibre.com/
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 02/10] iio: adc: at91-sama5d2_adc: use struct with aligned_s64 timestamp
2025-04-18 19:58 ` [PATCH 02/10] iio: adc: at91-sama5d2_adc: " David Lechner
@ 2025-04-21 11:10 ` Jonathan Cameron
0 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2025-04-21 11:10 UTC (permalink / raw)
To: David Lechner
Cc: Nuno Sá, Andy Shevchenko, Eugen Hristev, Nicolas Ferre,
Alexandre Belloni, Claudiu Beznea, Andreas Klinger, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue, linux-iio, linux-kernel,
linux-arm-kernel, imx, linux-stm32
On Fri, 18 Apr 2025 14:58:21 -0500
David Lechner <dlechner@baylibre.com> wrote:
> Use a struct with aligned s64 timestamp_instead of a padded array for
> the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
> to see the correctness of the size and alignment of the buffer.
>
> Signed-off-by: David Lechner <dlechner@baylibre.com>
> ---
> drivers/iio/adc/at91-sama5d2_adc.c | 25 ++++++++++---------------
> 1 file changed, 10 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
> index 414610afcb2c4128a63cf76767803c32cb01ac5e..07ced924f7a6ae36fe538021a45adbf7d76c2e69 100644
> --- a/drivers/iio/adc/at91-sama5d2_adc.c
> +++ b/drivers/iio/adc/at91-sama5d2_adc.c
> @@ -21,6 +21,7 @@
> #include <linux/platform_device.h>
> #include <linux/property.h>
> #include <linux/sched.h>
> +#include <linux/types.h>
> #include <linux/units.h>
> #include <linux/wait.h>
> #include <linux/iio/iio.h>
> @@ -586,15 +587,6 @@ struct at91_adc_temp {
> u16 saved_oversampling;
> };
>
> -/*
> - * Buffer size requirements:
> - * No channels * bytes_per_channel(2) + timestamp bytes (8)
> - * Divided by 2 because we need half words.
> - * We assume 32 channels for now, has to be increased if needed.
> - * Nobody minds a buffer being too big.
> - */
> -#define AT91_BUFFER_MAX_HWORDS ((32 * 2 + 8) / 2)
> -
> struct at91_adc_state {
> void __iomem *base;
> int irq;
> @@ -617,7 +609,10 @@ struct at91_adc_state {
> struct iio_dev *indio_dev;
> struct device *dev;
> /* Ensure naturally aligned timestamp */
> - u16 buffer[AT91_BUFFER_MAX_HWORDS] __aligned(8);
> + struct {
> + u16 data[32];
When you rework this into the large buffer scheme, can you add a define
or some other means to establish where that 32 comes from!
We've lost the comment as a result of this refactor so need to put that
info back somehow.
> + aligned_s64 timestamp;
> + } buffer;
> /*
> * lock to prevent concurrent 'single conversion' requests through
> * sysfs.
> @@ -1481,14 +1476,14 @@ static void at91_adc_trigger_handler_nodma(struct iio_dev *indio_dev,
> if (chan->type == IIO_VOLTAGE) {
> val = at91_adc_read_chan(st, chan->address);
> at91_adc_adjust_val_osr(st, &val);
> - st->buffer[i] = val;
> + st->buffer.data[i] = val;
> } else {
> - st->buffer[i] = 0;
> + st->buffer.data[i] = 0;
> WARN(true, "This trigger cannot handle this type of channel");
> }
> i++;
> }
> - iio_push_to_buffers_with_timestamp(indio_dev, st->buffer,
> + iio_push_to_buffers_with_timestamp(indio_dev, &st->buffer,
> pf->timestamp);
> }
>
> @@ -1643,7 +1638,7 @@ static void at91_adc_touch_data_handler(struct iio_dev *indio_dev)
> at91_adc_read_pressure(st, chan->channel, &val);
> else
> continue;
> - st->buffer[i] = val;
> + st->buffer.data[i] = val;
> i++;
> }
> /*
> @@ -1691,7 +1686,7 @@ static void at91_adc_workq_handler(struct work_struct *workq)
> struct at91_adc_state, touch_st);
> struct iio_dev *indio_dev = st->indio_dev;
>
> - iio_push_to_buffers(indio_dev, st->buffer);
> + iio_push_to_buffers(indio_dev, st->buffer.data);
> }
>
> static irqreturn_t at91_adc_interrupt(int irq, void *private)
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 03/10] iio: adc: hx711: use struct with aligned_s64 timestamp
2025-04-18 19:58 ` [PATCH 03/10] iio: adc: hx711: " David Lechner
@ 2025-04-21 11:11 ` Jonathan Cameron
0 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2025-04-21 11:11 UTC (permalink / raw)
To: David Lechner
Cc: Nuno Sá, Andy Shevchenko, Eugen Hristev, Nicolas Ferre,
Alexandre Belloni, Claudiu Beznea, Andreas Klinger, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue, linux-iio, linux-kernel,
linux-arm-kernel, imx, linux-stm32
On Fri, 18 Apr 2025 14:58:22 -0500
David Lechner <dlechner@baylibre.com> wrote:
> Use a struct with aligned s64_timestamp instead of a padded array for
> the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
> to see the correctness of the size and alignment of the buffer.
>
> Signed-off-by: David Lechner <dlechner@baylibre.com>
This one is good and doesn't have the issue with moving timestamps.
Applied.
> ---
> drivers/iio/adc/hx711.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/iio/adc/hx711.c b/drivers/iio/adc/hx711.c
> index 8da0419ecfa3575aa54a93707c681ec8ced28be8..7235fa9e13d57c693751757c5d40e8a799622f17 100644
> --- a/drivers/iio/adc/hx711.c
> +++ b/drivers/iio/adc/hx711.c
> @@ -87,7 +87,10 @@ struct hx711_data {
> * triggered buffer
> * 2x32-bit channel + 64-bit naturally aligned timestamp
> */
> - u32 buffer[4] __aligned(8);
> + struct {
> + u32 channel[2];
> + aligned_s64 timestamp;
> + } buffer;
> /*
> * delay after a rising edge on SCK until the data is ready DOUT
> * this is dependent on the hx711 where the datasheet tells a
> @@ -361,15 +364,15 @@ static irqreturn_t hx711_trigger(int irq, void *p)
>
> mutex_lock(&hx711_data->lock);
>
> - memset(hx711_data->buffer, 0, sizeof(hx711_data->buffer));
> + memset(&hx711_data->buffer, 0, sizeof(hx711_data->buffer));
>
> iio_for_each_active_channel(indio_dev, i) {
> - hx711_data->buffer[j] = hx711_reset_read(hx711_data,
> + hx711_data->buffer.channel[j] = hx711_reset_read(hx711_data,
> indio_dev->channels[i].channel);
> j++;
> }
>
> - iio_push_to_buffers_with_timestamp(indio_dev, hx711_data->buffer,
> + iio_push_to_buffers_with_timestamp(indio_dev, &hx711_data->buffer,
> pf->timestamp);
>
> mutex_unlock(&hx711_data->lock);
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 04/10] iio: adc: mxs-lradc-adc: use struct with aligned_s64 timestamp
2025-04-18 19:58 ` [PATCH 04/10] iio: adc: mxs-lradc-adc: " David Lechner
@ 2025-04-21 11:13 ` Jonathan Cameron
2025-04-21 16:41 ` Andy Shevchenko
0 siblings, 1 reply; 18+ messages in thread
From: Jonathan Cameron @ 2025-04-21 11:13 UTC (permalink / raw)
To: David Lechner
Cc: Nuno Sá, Andy Shevchenko, Eugen Hristev, Nicolas Ferre,
Alexandre Belloni, Claudiu Beznea, Andreas Klinger, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue, linux-iio, linux-kernel,
linux-arm-kernel, imx, linux-stm32
On Fri, 18 Apr 2025 14:58:23 -0500
David Lechner <dlechner@baylibre.com> wrote:
> Use a struct with aligned s64_timestamp instead of a padded array for
> the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
> to see the correctness of the size and alignment of the buffer.
>
> Signed-off-by: David Lechner <dlechner@baylibre.com>
> ---
> drivers/iio/adc/mxs-lradc-adc.c | 13 ++++++++-----
> 1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/iio/adc/mxs-lradc-adc.c b/drivers/iio/adc/mxs-lradc-adc.c
> index 92baf3f5f5601b863c694eb03b6d8f287e4fe6ab..73e42f0ebcaeaaa437ba5c64ecdd7759a1191e6c 100644
> --- a/drivers/iio/adc/mxs-lradc-adc.c
> +++ b/drivers/iio/adc/mxs-lradc-adc.c
> @@ -116,7 +116,10 @@ struct mxs_lradc_adc {
>
> void __iomem *base;
> /* Maximum of 8 channels + 8 byte ts */
If we were keeping this (I think the buffer solution is better)
then we could drop that coment as to me this just became self describing code.
That's why I like these structures where we can use them with out confusion!
> - u32 buffer[10] __aligned(8);
> + struct {
> + u32 data[8];
> + aligned_u64 ts;
aligned_s64
I've not idea why timestamps are signed, but they always have been!
> + } buffer;
> struct iio_trigger *trig;
> struct completion completion;
> spinlock_t lock;
> @@ -418,14 +421,14 @@ static irqreturn_t mxs_lradc_adc_trigger_handler(int irq, void *p)
> unsigned int i, j = 0;
>
> for_each_set_bit(i, iio->active_scan_mask, LRADC_MAX_TOTAL_CHANS) {
> - adc->buffer[j] = readl(adc->base + LRADC_CH(j));
> + adc->buffer.data[j] = readl(adc->base + LRADC_CH(j));
> writel(chan_value, adc->base + LRADC_CH(j));
> - adc->buffer[j] &= LRADC_CH_VALUE_MASK;
> - adc->buffer[j] /= LRADC_DELAY_TIMER_LOOP;
> + adc->buffer.data[j] &= LRADC_CH_VALUE_MASK;
> + adc->buffer.data[j] /= LRADC_DELAY_TIMER_LOOP;
> j++;
> }
>
> - iio_push_to_buffers_with_ts(iio, adc->buffer, sizeof(adc->buffer),
> + iio_push_to_buffers_with_ts(iio, &adc->buffer, sizeof(adc->buffer),
> pf->timestamp);
>
> iio_trigger_notify_done(iio->trig);
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 06/10] iio: adc: ti-adc0832: use struct with aligned_s64 timestamp
2025-04-18 19:58 ` [PATCH 06/10] iio: adc: ti-adc0832: " David Lechner
@ 2025-04-21 11:15 ` Jonathan Cameron
0 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2025-04-21 11:15 UTC (permalink / raw)
To: David Lechner
Cc: Nuno Sá, Andy Shevchenko, Eugen Hristev, Nicolas Ferre,
Alexandre Belloni, Claudiu Beznea, Andreas Klinger, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue, linux-iio, linux-kernel,
linux-arm-kernel, imx, linux-stm32
On Fri, 18 Apr 2025 14:58:25 -0500
David Lechner <dlechner@baylibre.com> wrote:
> Use a struct with aligned s64_timestamp instead of a padded array for
> the buffer used for iio_push_to_buffers_with_ts(). This makes it easier
> to see the correctness of the size and alignment of the buffer.
>
> Signed-off-by: David Lechner <dlechner@baylibre.com>
> ---
> drivers/iio/adc/ti-adc0832.c | 15 +++++++--------
> 1 file changed, 7 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/iio/adc/ti-adc0832.c b/drivers/iio/adc/ti-adc0832.c
> index cfcdafbe284b103a069857028886411bc72dea4f..f508f7113faa2610a2889f3c36c5a679fa72264d 100644
> --- a/drivers/iio/adc/ti-adc0832.c
> +++ b/drivers/iio/adc/ti-adc0832.c
> @@ -10,6 +10,7 @@
> #include <linux/module.h>
> #include <linux/mod_devicetable.h>
> #include <linux/spi/spi.h>
> +#include <linux/types.h>
> #include <linux/iio/iio.h>
> #include <linux/regulator/consumer.h>
> #include <linux/iio/buffer.h>
> @@ -29,12 +30,10 @@ struct adc0832 {
> struct regulator *reg;
> struct mutex lock;
> u8 mux_bits;
> - /*
> - * Max size needed: 16x 1 byte ADC data + 8 bytes timestamp
> - * May be shorter if not all channels are enabled subject
> - * to the timestamp remaining 8 byte aligned.
If the comment is going, we need to capture that there are 16 channels
via a define or a comment.
This one probably wants to stay as a buffer but the same will apply to a new
patch doing that.
> - */
> - u8 data[24] __aligned(8);
> + struct {
> + u8 data[16];
> + aligned_s64 timestamp;
> + } buffer;
>
> u8 tx_buf[2] __aligned(IIO_DMA_MINALIGN);
> u8 rx_buf[2];
> @@ -222,10 +221,10 @@ static irqreturn_t adc0832_trigger_handler(int irq, void *p)
> goto out;
> }
>
> - adc->data[i] = ret;
> + adc->buffer.data[i] = ret;
> i++;
> }
> - iio_push_to_buffers_with_ts(indio_dev, adc->data, sizeof(adc->data),
> + iio_push_to_buffers_with_ts(indio_dev, &adc->buffer, sizeof(adc->buffer),
> iio_get_time_ns(indio_dev));
> out:
> mutex_unlock(&adc->lock);
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1)
2025-04-18 23:05 ` [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
@ 2025-04-21 11:17 ` Jonathan Cameron
0 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2025-04-21 11:17 UTC (permalink / raw)
To: David Lechner
Cc: Nuno Sá, Andy Shevchenko, Eugen Hristev, Nicolas Ferre,
Alexandre Belloni, Claudiu Beznea, Andreas Klinger, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue, linux-iio, linux-kernel,
linux-arm-kernel, imx, linux-stm32
On Fri, 18 Apr 2025 18:05:42 -0500
David Lechner <dlechner@baylibre.com> wrote:
> On 4/18/25 2:58 PM, David Lechner wrote:
> > While reviewing the recent conversion to iio_push_to_buffers_with_ts(),
> > I found it very time-consuming to check the correctness of the buffers
> > passed to that function when they used an array with extra room at the
> > end for a timestamp. And we still managed find a few that were wrongly
> > sized or not properly aligned despite several efforts in the past to
> > audit these for correctness already.
> >
> > Even though these ones look to be correct, it will still be easier for
> > future readers of the code if we follow the pattern of using a struct
> > with the array and timestamp instead.
> >
> > For example, it is much easier to see that:
> >
> > struct {
> > __be32 data[3];
> > aligned_s64 timestamp;
> > } buffer;
> >
> After sending [1], I realized that some (perhaps many) of these would actually
> be a better candidate for the proposed IIO_DECLARE_BUFFER_WITH_TS macro rather
> that converting to the struct style as above.
>
> Case in point: if the driver using that struct allows reading only one channel,
> then the offset of the timestamp when doing iio_push_to_buffers_with_ts() would
> be 8 bytes, not 16, so the struct would not always be the correct layout.
>
> As long as the driver doesn't access the timestamp member of the struct, it
> doesn't really matter, but this could be a bit misleading to anyone who might
> unknowing try to use it in the future.
Agreed.
These timestamp inserting functions have always been a bit weird. I kind
of regret not just leaving it as a per driver thing to do, but that ship
long sailed. I definitely want to keep the layout apparent in the drivers
though so this approach only applied to 1 of the ones in this series.
Jonathan
>
> [1]: https://lore.kernel.org/linux-iio/20250418-iio-introduce-iio_declare_buffer_with_ts-v1-0-ee0c62a33a0f@baylibre.com/
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 04/10] iio: adc: mxs-lradc-adc: use struct with aligned_s64 timestamp
2025-04-21 11:13 ` Jonathan Cameron
@ 2025-04-21 16:41 ` Andy Shevchenko
0 siblings, 0 replies; 18+ messages in thread
From: Andy Shevchenko @ 2025-04-21 16:41 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá, Andy Shevchenko, Eugen Hristev,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Andreas Klinger,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Maxime Coquelin, Alexandre Torgue, linux-iio, linux-kernel,
linux-arm-kernel, imx, linux-stm32
On Mon, Apr 21, 2025 at 2:13 PM Jonathan Cameron <jic23@kernel.org> wrote:
> On Fri, 18 Apr 2025 14:58:23 -0500
> David Lechner <dlechner@baylibre.com> wrote:
...
> > + aligned_u64 ts;
> aligned_s64
>
> I've not idea why timestamps are signed, but they always have been!
Because 0 (center point) was chosen as 1970-01-01?
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2025-04-21 16:44 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-18 19:58 [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
2025-04-18 19:58 ` [PATCH 01/10] iio: accel: sca3300: use struct with aligned_s64 timestamp David Lechner
2025-04-18 19:58 ` [PATCH 02/10] iio: adc: at91-sama5d2_adc: " David Lechner
2025-04-21 11:10 ` Jonathan Cameron
2025-04-18 19:58 ` [PATCH 03/10] iio: adc: hx711: " David Lechner
2025-04-21 11:11 ` Jonathan Cameron
2025-04-18 19:58 ` [PATCH 04/10] iio: adc: mxs-lradc-adc: " David Lechner
2025-04-21 11:13 ` Jonathan Cameron
2025-04-21 16:41 ` Andy Shevchenko
2025-04-18 19:58 ` [PATCH 05/10] iio: adc: stm32-adc: " David Lechner
2025-04-18 19:58 ` [PATCH 06/10] iio: adc: ti-adc0832: " David Lechner
2025-04-21 11:15 ` Jonathan Cameron
2025-04-18 19:58 ` [PATCH 07/10] iio: adc: ti-adc12138: " David Lechner
2025-04-18 19:58 ` [PATCH 08/10] iio: adc: ti-ads124s08: " David Lechner
2025-04-18 19:58 ` [PATCH 09/10] iio: adc: ti-ads8688: " David Lechner
2025-04-18 19:58 ` [PATCH 10/10] iio: chemical: atlas-sensor: " David Lechner
2025-04-18 23:05 ` [PATCH 00/10] iio: prefer aligned_s64 timestamp (round 1) David Lechner
2025-04-21 11:17 ` Jonathan Cameron
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).