From: Sasha Levin <sashal@kernel.org>
To: patches@lists.linux.dev, stable@vger.kernel.org
Cc: Jonathan Santos <Jonathan.Santos@analog.com>,
David Lechner <dlechner@baylibre.com>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Sasha Levin <sashal@kernel.org>,
Michael.Hennerich@analog.com, lars@metafoo.de,
linux-iio@vger.kernel.org
Subject: [PATCH AUTOSEL 6.6 57/59] iio: adc: ad7768-1: Ensure SYNC_IN pulse minimum timing requirement
Date: Sun, 3 Aug 2025 20:34:11 -0400 [thread overview]
Message-ID: <20250804003413.3622950-57-sashal@kernel.org> (raw)
In-Reply-To: <20250804003413.3622950-1-sashal@kernel.org>
From: Jonathan Santos <Jonathan.Santos@analog.com>
[ Upstream commit 7e54d932873d91a55d1b89b7389876d78aeeab32 ]
The SYNC_IN pulse width must be at least 1.5 x Tmclk, corresponding to
~2.5 µs at the lowest supported MCLK frequency. Add a 3 µs delay to
ensure reliable synchronization timing even for the worst-case scenario.
Signed-off-by: Jonathan Santos <Jonathan.Santos@analog.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://patch.msgid.link/d3ee92a533cd1207cf5c5cc4d7bdbb5c6c267f68.1749063024.git.Jonathan.Santos@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
LLM Generated explanations, may be completely bogus:
**Backport Status: YES**
This commit should be backported to stable kernel trees. Here's my
extensive analysis:
**1. Bug Fix Nature:**
The commit fixes a timing violation bug where the SYNC_IN pulse width
was not meeting the hardware's minimum timing requirement. According to
the datasheet (as noted in the commit), the SYNC_IN pulse must be at
least 1.5 × Tmclk (MCLK period). Without the proper delay, the
synchronization pulse may be too short, especially at lower MCLK
frequencies, causing unreliable synchronization.
**2. Specific Code Analysis:**
The original code had a critical timing issue:
```c
gpiod_set_value(st->gpio_sync_in, 1);
gpiod_set_value(st->gpio_sync_in, 0);
```
This creates a pulse with essentially zero width (just the GPIO toggle
time), which violates the hardware specification. The fix adds:
- A new dedicated function `ad7768_send_sync_pulse()` that ensures
proper timing
- Uses `gpiod_set_value_cansleep()` instead of `gpiod_set_value()` for
better reliability
- Adds a 3 µs delay using `fsleep(3)` to guarantee the minimum pulse
width
**3. Impact Analysis:**
- **User Impact**: Without this fix, users may experience unreliable ADC
synchronization, particularly when changing filter decimation rates or
when operating at lower MCLK frequencies (0.6 MHz)
- **Worst Case**: At 0.6 MHz, Tmclk = 1.67 µs, requiring a minimum pulse
width of 2.5 µs. The original code provides essentially 0 µs
- **Data Integrity**: Improper synchronization can lead to incorrect ADC
readings or timing issues in multi-device setups
**4. Risk Assessment:**
- **Low Risk**: The change is minimal and contained - it only adds a 3
µs delay and switches to the cansleep GPIO variant
- **No API Changes**: The fix is internal to the driver with no external
interface changes
- **Conservative Fix**: The 3 µs delay provides margin above the 2.5 µs
worst-case requirement
**5. Stable Kernel Criteria:**
✓ Fixes a real bug that affects users (timing violation)
✓ Small, contained change (adds one function, modifies one call site)
✓ No new features or architectural changes
✓ Minimal risk of regression
✓ Clear hardware specification violation being fixed
**6. Supporting Evidence:**
- The driver has had multiple previous fixes backported (as seen in git
log with "Fixes:" tags)
- Similar timing-related fixes are commonly backported for hardware
drivers
- The AD7768-1 is an active production part used in data acquisition
systems where reliability is critical
The commit meets all stable kernel criteria for backporting - it's a
clear bug fix for a hardware timing violation that could cause
unreliable operation, implemented with minimal changes and low
regression risk.
drivers/iio/adc/ad7768-1.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/ad7768-1.c b/drivers/iio/adc/ad7768-1.c
index 967f06cd3f94..e147eaf1a3b1 100644
--- a/drivers/iio/adc/ad7768-1.c
+++ b/drivers/iio/adc/ad7768-1.c
@@ -203,6 +203,24 @@ static int ad7768_spi_reg_write(struct ad7768_state *st,
return spi_write(st->spi, st->data.d8, 2);
}
+static int ad7768_send_sync_pulse(struct ad7768_state *st)
+{
+ /*
+ * The datasheet specifies a minimum SYNC_IN pulse width of 1.5 × Tmclk,
+ * where Tmclk is the MCLK period. The supported MCLK frequencies range
+ * from 0.6 MHz to 17 MHz, which corresponds to a minimum SYNC_IN pulse
+ * width of approximately 2.5 µs in the worst-case scenario (0.6 MHz).
+ *
+ * Add a delay to ensure the pulse width is always sufficient to
+ * trigger synchronization.
+ */
+ gpiod_set_value_cansleep(st->gpio_sync_in, 1);
+ fsleep(3);
+ gpiod_set_value_cansleep(st->gpio_sync_in, 0);
+
+ return 0;
+}
+
static int ad7768_set_mode(struct ad7768_state *st,
enum ad7768_conv_mode mode)
{
@@ -288,10 +306,7 @@ static int ad7768_set_dig_fil(struct ad7768_state *st,
return ret;
/* A sync-in pulse is required every time the filter dec rate changes */
- gpiod_set_value(st->gpio_sync_in, 1);
- gpiod_set_value(st->gpio_sync_in, 0);
-
- return 0;
+ return ad7768_send_sync_pulse(st);
}
static int ad7768_set_freq(struct ad7768_state *st,
--
2.39.5
next prev parent reply other threads:[~2025-08-04 0:36 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-04 0:33 [PATCH AUTOSEL 6.6 01/59] usb: xhci: print xhci->xhc_state when queue_command failed Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 02/59] platform/x86/amd: pmc: Add Lenovo Yoga 6 13ALC6 to pmc quirk list Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 03/59] cpufreq: CPPC: Mark driver with NEED_UPDATE_LIMITS flag Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 04/59] selftests/futex: Define SYS_futex on 32-bit architectures with 64-bit time_t Sasha Levin
2025-08-04 0:33 ` Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 05/59] usb: typec: ucsi: psy: Set current max to 100mA for BC 1.2 and Default Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 06/59] regulator: core: repeat voltage setting request for stepped regulators Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 07/59] usb: xhci: Avoid showing warnings for dying controller Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 08/59] usb: xhci: Set avg_trb_len = 8 for EP0 during Address Device Command Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 09/59] usb: xhci: Avoid showing errors during surprise removal Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 10/59] soc: qcom: rpmh-rsc: Add RSC version 4 support Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 11/59] ACPI: APEI: send SIGBUS to current task if synchronous memory error not recovered Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 12/59] remoteproc: imx_rproc: skip clock enable when M-core is managed by the SCU Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 13/59] gpio: wcd934x: check the return value of regmap_update_bits() Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 14/59] cpufreq: Exit governor when failed to start old governor Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 15/59] ARM: rockchip: fix kernel hang during smp initialization Sasha Levin
2025-08-04 0:33 ` Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 16/59] PM / devfreq: governor: Replace sscanf() with kstrtoul() in set_freq_store() Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 17/59] EDAC/synopsys: Clear the ECC counters on init Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 18/59] ASoC: soc-dapm: set bias_level if snd_soc_dapm_set_bias_level() was successed Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 19/59] thermal/drivers/qcom-spmi-temp-alarm: Enable stage 2 shutdown when required Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 20/59] tools/nolibc: define time_t in terms of __kernel_old_time_t Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 21/59] iio: adc: ad_sigma_delta: don't overallocate scan buffer Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 22/59] gpio: tps65912: check the return value of regmap_update_bits() Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 23/59] ARM: tegra: Use I/O memcpy to write to IRAM Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 24/59] tools/build: Fix s390(x) cross-compilation with clang Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 25/59] selftests: tracing: Use mutex_unlock for testing glob filter Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 26/59] ACPI: PRM: Reduce unnecessary printing to avoid user confusion Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 27/59] firmware: tegra: Fix IVC dependency problems Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 28/59] pwm: sifive: Fix PWM algorithm and clarify inverted compare behavior Sasha Levin
2025-08-04 0:33 ` Sasha Levin
2025-08-04 10:45 ` Uwe Kleine-König
2025-08-04 10:45 ` Uwe Kleine-König
2025-08-04 13:27 ` Sasha Levin
2025-08-04 13:27 ` Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 29/59] PM: runtime: Clear power.needs_force_resume in pm_runtime_reinit() Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 30/59] thermal: sysfs: Return ENODATA instead of EAGAIN for reads Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 31/59] PM: sleep: console: Fix the black screen issue Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 32/59] ACPI: processor: fix acpi_object initialization Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 33/59] mmc: sdhci-msm: Ensure SD card power isn't ON when card removed Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 34/59] ACPI: APEI: GHES: add TAINT_MACHINE_CHECK on GHES panic path Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 35/59] pps: clients: gpio: fix interrupt handling order in remove path Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 36/59] reset: brcmstb: Enable reset drivers for ARCH_BCM2835 Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 37/59] char: misc: Fix improper and inaccurate error code returned by misc_init() Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 38/59] mei: bus: Check for still connected devices in mei_cl_bus_dev_release() Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 39/59] mmc: rtsx_usb_sdmmc: Fix error-path in sd_set_power_mode() Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 40/59] ALSA: hda: Handle the jack polling always via a work Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 41/59] ALSA: hda: Disable jack polling at shutdown Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 42/59] x86/bugs: Avoid warning when overriding return thunk Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 43/59] ASoC: hdac_hdmi: Rate limit logging on connection and disconnection Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 44/59] ALSA: intel8x0: Fix incorrect codec index usage in mixer for ICH4 Sasha Levin
2025-08-04 0:33 ` [PATCH AUTOSEL 6.6 45/59] ASoC: core: Check for rtd == NULL in snd_soc_remove_pcm_runtime() Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 46/59] usb: typec: intel_pmc_mux: Defer probe if SCU IPC isn't present Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 47/59] usb: core: usb_submit_urb: downgrade type check Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 48/59] usb: typec: fusb302: fix scheduling while atomic when using virtio-gpio Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 49/59] pm: cpupower: Fix the snapshot-order of tsc,mperf, clock in mperf_stop() Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 50/59] imx8m-blk-ctrl: set ISI panic write hurry level Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 51/59] soc: qcom: mdt_loader: Actually use the e_phoff Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 52/59] platform/x86: thinkpad_acpi: Handle KCOV __init vs inline mismatches Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 53/59] platform/chrome: cros_ec_typec: Defer probe on missing EC parent Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 54/59] ALSA: hda/ca0132: Fix buffer overflow in add_tuning_control Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 55/59] ALSA: pcm: Rewrite recalculate_boundary() to avoid costly loop Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 56/59] ALSA: usb-audio: Avoid precedence issues in mixer_quirks macros Sasha Levin
2025-08-04 0:34 ` Sasha Levin [this message]
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 58/59] ASoC: codecs: rt5640: Retry DEVICE_ID verification Sasha Levin
2025-08-04 0:34 ` [PATCH AUTOSEL 6.6 59/59] ASoC: qcom: use drvdata instead of component to keep id Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250804003413.3622950-57-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=Jonathan.Cameron@huawei.com \
--cc=Jonathan.Santos@analog.com \
--cc=Michael.Hennerich@analog.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=dlechner@baylibre.com \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=patches@lists.linux.dev \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.