From nobody Tue Feb 10 01:23:07 2026 Received: from mail-oa1-f45.google.com (mail-oa1-f45.google.com [209.85.160.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 132BD2F5319 for ; Fri, 23 Jan 2026 20:38:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769200737; cv=none; b=fhpwZRqCSngINlex4yHkauj+y/8dw8aOnlIhfNT8sO9M6WB34LLx8dkXMzW/SHngFylVFFbctfQqZKy+zwOSbgDB5fCL3GfkKTkIqNvJKa27kAwfVfqRZqFaQgtNcPvUPWW/BEetNXf6igLVcjYEKon5V/3MNvdoHfPfYdh3X28= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769200737; c=relaxed/simple; bh=2C6i3NBXyh26o+VI6Lld/UbaveXiw02diDxZ2kfzhPE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SXeqR+3HCT01zeLKg+PlHLW16KFXA9UVMqxHAg6U9bvWjgu6UVV8Y+Mt16nxvqxWTG9wR/a1kKY0SnjlYMoRG1nqAOwErM7epkedwVqCrkrYpA2IXVbxX4HlNNRc5udA2FqqLMIYQcvy64liQP+A78bsPrsj1XkpLe/WvVA2vLI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=GHR802oR; arc=none smtp.client-ip=209.85.160.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="GHR802oR" Received: by mail-oa1-f45.google.com with SMTP id 586e51a60fabf-408778a8ec4so1729907fac.0 for ; Fri, 23 Jan 2026 12:38:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1769200732; x=1769805532; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=CbdZS75AKMVh8QDM0w0436GKbW8GMgnOih9TIeXC38A=; b=GHR802oRGTmGP+m43X+o8HB2AzxUHzwkDazDTfrFrS3vTnksz/JVttuD1a4352kNyL f0vf0rJdN0y1qHe1xIZTqhW07hOPnI+a03eZMMTekTeaYeOUGHF8Ro5m6JJYtSBpEswP zIiVJd/zABTNwIoEQjEVrnuFielorme7Rj0sJmkuom7a3jRnqPRnfGRxXTWuV+X92xph PL/kqxBrY404t8O5vy7lnAkdP8z+UEaQ3KBFZz35Ue/VKA2KcQSevGa3RGk3Y2qBgR3Q iAHF/Y7007/wNHya0U/yh/Gvs/jNaLySDRVI3+V4jT5jis/qRlPdjSaE92jxZ2aMcUWA I0sQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769200732; x=1769805532; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=CbdZS75AKMVh8QDM0w0436GKbW8GMgnOih9TIeXC38A=; b=AuHqea1JQ45kb052K/Q/wiu6WWl6WvKZbfUuWNhvrc4dQnJpsaPhawk0Th1YW9a5F0 BgATzO8np+jTYKwqd6ataX43qLCBrSJTNZx9UimIu/OcNr7R2LQTzR3ByjRxppVwjy66 idl/14kwdGKH8c482SGz6Ufqdsmpeajpiy9v3r0f3CZ9InxdgLXdTZ2LQgIgjlI9Qtw1 uBUNOQm81vwcmI5CiaU+QhOLDwQv9qGH+xRirdIaKPbN0VsFe+lqIv0WtAWWm8x5XLy4 4p4pZfEdQ2EForsBxTdVRYOewmLVT2wasCrsZZk42DY2ZjGZ8bkQg4kiqDm/btyuGvHg njUw== X-Forwarded-Encrypted: i=1; AJvYcCVsFug00WaOM/JLdljPuTYkbrTaOgn/LXY5lBiXgbv1FMw01w+W+YpwmkbPKUHIXGBxbkvZEy3pjUFyN+U=@vger.kernel.org X-Gm-Message-State: AOJu0YwAtnfwfpmMZwnKB5kqFEWGJ8HvKrhyGsuHLvkgeIL9s6lJRvSi mQwVlfFpLDxmB8CMtCxPiqoMIcToCt3jVRGG7KoamJsW/urCbVrFZNfnEag+WZSSNl8= X-Gm-Gg: AZuq6aIoWZMq6se+Zu95CJ6AZws6C7S9WIacQSPvfYbUVYkOHMTXLxTRsYzQ/T7bwTH G31vj7gDNqjd7X6xmndrfx9s85NDsFlVaaKukfTmP7EvPlN+hkk4cIK0uzwUoa43fUGt+NW6I8W +WQVDUmgiVpXk19mZqAKkZpiocYWBcXn/5B6UxHwAErwrEWp8coRtPPCPmKsJxDUlF1ew+g60Iv 3VLXBeWSiX/LSxOX1sacS3i60NYyVt5vksAFweVnWQDX0kk1Ba7Vrk2a8LaKyf9y40YfgDrYm2Z JT/mgQuWEBtcoC3LwlNzdLsi3RTXVQZ7ze3zWjc+Lh6GPNjA4IuINuvbzMJB1JfnJXoCQCyJtBB UHw/u3JG58AZuCkpX4iZHuzMeHMI8yK05dA+qMiVCr+VLJkIgnq/znw4JruAohPEUP3BnRm2ukO 4nOpbFo3ldk8XMAQ== X-Received: by 2002:a05:6870:f215:b0:3f5:5d85:80d2 with SMTP id 586e51a60fabf-408ab7e291bmr2111309fac.43.1769200732405; Fri, 23 Jan 2026 12:38:52 -0800 (PST) Received: from [127.0.1.1] ([2600:8803:e7e4:500:198f:2b50:c48:1875]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-408af888da1sm2167805fac.6.2026.01.23.12.38.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 Jan 2026 12:38:51 -0800 (PST) From: David Lechner Date: Fri, 23 Jan 2026 14:37:32 -0600 Subject: [PATCH v6 9/9] iio: adc: ad7380: add support for multiple SPI lanes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260123-spi-add-multi-bus-support-v6-9-12af183c06eb@baylibre.com> References: <20260123-spi-add-multi-bus-support-v6-0-12af183c06eb@baylibre.com> In-Reply-To: <20260123-spi-add-multi-bus-support-v6-0-12af183c06eb@baylibre.com> To: Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Marcelo Schmitt , Michael Hennerich , =?utf-8?q?Nuno_S=C3=A1?= , Jonathan Cameron , Andy Shevchenko Cc: Sean Anderson , linux-spi@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, David Lechner X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6262; i=dlechner@baylibre.com; h=from:subject:message-id; bh=2C6i3NBXyh26o+VI6Lld/UbaveXiw02diDxZ2kfzhPE=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBpc9xEN+k0R7Bic+VA3HmpepXcuhZgilXf5ajsv oYVQbn21oeJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaXPcRAAKCRDCzCAB/wGP wNFoB/9VGW1yDYrM8DKEAfnpAkhTWzsoBaVaQHqlbzdkgE3UKW+5yKu2LwOHodIbKhFEot94REK 9+PQGVW2urhNn7geTxRmFFLrHP4x8tLzvJLnspiTwGVqZthwKxQdtyUv2wt9KrEZrbCF9ISQQ13 FxRKgWfYbAvKvwQ07qHvxrOb35V8/8LhL1B8X3PUFYZIz5pjQC6DQQI360SBMeJHavSxgJwzk9J AksPUKILzD6DgmBNzuDK3Y2C1e0xpUSuJ3X39RhtahkzBwPZKRJDRk7+SbvUpwQMKJAGsID1ilO WaglwEThPxE3LipUhfMt7MT8CS85j8SGxxHNwihy9LTExgLS X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Add support for multiple SPI lanes to increase throughput. The AD7380 family of ADCs have multiple SDO lines on the chip that can be used to read each channel on a separate SPI lane. If wired up to a SPI controller that supports it, the driver will now take advantage of this feature. This allows reaching the maximum sample rate advertised in the datasheet when combined with SPI offloading. Reviewed-by: Nuno S=C3=A1 Reviewed-by: Marcelo Schmitt Signed-off-by: David Lechner --- v6 changes: none v5 changes: * Include the number of SDO lines in the error message. v4 changes: * Update for core SPI API changes. v3 changes: * Renamed "buses" to "lanes" to reflect devicetree property name change. v2 changes: * Move st->seq_xfer[3].multi_lane_mode =3D SPI_MULTI_BUS_MODE_STRIPE; to probe(). --- drivers/iio/adc/ad7380.c | 51 ++++++++++++++++++++++++++++++++++++--------= ---- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/drivers/iio/adc/ad7380.c b/drivers/iio/adc/ad7380.c index bfd908deefc0..ca411371816f 100644 --- a/drivers/iio/adc/ad7380.c +++ b/drivers/iio/adc/ad7380.c @@ -77,8 +77,7 @@ #define AD7380_CONFIG1_REFSEL BIT(1) #define AD7380_CONFIG1_PMODE BIT(0) =20 -#define AD7380_CONFIG2_SDO2 GENMASK(9, 8) -#define AD7380_CONFIG2_SDO BIT(8) +#define AD7380_CONFIG2_SDO GENMASK(9, 8) #define AD7380_CONFIG2_RESET GENMASK(7, 0) =20 #define AD7380_CONFIG2_RESET_SOFT 0x3C @@ -92,11 +91,6 @@ #define T_CONVERT_X_NS 500 /* xth conversion start time (oversampling) */ #define T_POWERUP_US 5000 /* Power up */ =20 -/* - * AD738x support several SDO lines to increase throughput, but driver cur= rently - * supports only 1 SDO line (standard SPI transaction) - */ -#define AD7380_NUM_SDO_LINES 1 #define AD7380_DEFAULT_GAIN_MILLI 1000 =20 /* @@ -888,6 +882,8 @@ struct ad7380_state { bool resolution_boost_enabled; unsigned int ch; bool seq; + /* How many SDO lines are wired up. */ + u8 num_sdo_lines; unsigned int vref_mv; unsigned int vcm_mv[MAX_NUM_CHANNELS]; unsigned int gain_milli[MAX_NUM_CHANNELS]; @@ -1084,7 +1080,7 @@ static int ad7380_set_ch(struct ad7380_state *st, uns= igned int ch) if (oversampling_ratio > 1) xfer.delay.value =3D T_CONVERT_0_NS + T_CONVERT_X_NS * (oversampling_ratio - 1) * - st->chip_info->num_simult_channels / AD7380_NUM_SDO_LINES; + st->chip_info->num_simult_channels / st->num_sdo_lines; =20 return spi_sync_transfer(st->spi, &xfer, 1); } @@ -1113,7 +1109,7 @@ static int ad7380_update_xfers(struct ad7380_state *s= t, if (oversampling_ratio > 1) t_convert =3D T_CONVERT_0_NS + T_CONVERT_X_NS * (oversampling_ratio - 1) * - st->chip_info->num_simult_channels / AD7380_NUM_SDO_LINES; + st->chip_info->num_simult_channels / st->num_sdo_lines; =20 if (st->seq) { xfer[0].delay.value =3D xfer[1].delay.value =3D t_convert; @@ -1198,6 +1194,8 @@ static int ad7380_init_offload_msg(struct ad7380_stat= e *st, xfer->bits_per_word =3D scan_type->realbits; xfer->offload_flags =3D SPI_OFFLOAD_XFER_RX_STREAM; xfer->len =3D AD7380_SPI_BYTES(scan_type) * st->chip_info->num_simult_cha= nnels; + if (st->num_sdo_lines > 1) + xfer->multi_lane_mode =3D SPI_MULTI_LANE_MODE_STRIPE; =20 spi_message_init_with_transfers(&st->offload_msg, xfer, 1); st->offload_msg.offload =3D st->offload; @@ -1793,6 +1791,7 @@ static const struct iio_info ad7380_info =3D { =20 static int ad7380_init(struct ad7380_state *st, bool external_ref_en) { + u32 sdo; int ret; =20 /* perform hard reset */ @@ -1815,11 +1814,24 @@ static int ad7380_init(struct ad7380_state *st, boo= l external_ref_en) st->ch =3D 0; st->seq =3D false; =20 - /* SPI 1-wire mode */ + /* SDO field has an irregular mapping. */ + switch (st->num_sdo_lines) { + case 1: + sdo =3D 1; + break; + case 2: + sdo =3D 0; + break; + case 4: + sdo =3D 2; + break; + default: + return -EINVAL; + } + return regmap_update_bits(st->regmap, AD7380_REG_ADDR_CONFIG2, AD7380_CONFIG2_SDO, - FIELD_PREP(AD7380_CONFIG2_SDO, - AD7380_NUM_SDO_LINES)); + FIELD_PREP(AD7380_CONFIG2_SDO, sdo)); } =20 static int ad7380_probe_spi_offload(struct iio_dev *indio_dev, @@ -1842,7 +1854,7 @@ static int ad7380_probe_spi_offload(struct iio_dev *i= ndio_dev, "failed to get offload trigger\n"); =20 sample_rate =3D st->chip_info->max_conversion_rate_hz * - AD7380_NUM_SDO_LINES / st->chip_info->num_simult_channels; + st->num_sdo_lines / st->chip_info->num_simult_channels; =20 st->sample_freq_range[0] =3D 1; /* min */ st->sample_freq_range[1] =3D 1; /* step */ @@ -1887,6 +1899,13 @@ static int ad7380_probe(struct spi_device *spi) if (!st->chip_info) return dev_err_probe(dev, -EINVAL, "missing match data\n"); =20 + st->num_sdo_lines =3D spi->num_rx_lanes; + + if (st->num_sdo_lines < 1 || st->num_sdo_lines > st->chip_info->num_simul= t_channels) + return dev_err_probe(dev, -EINVAL, + "invalid number of SDO lines (%d)\n", + st->num_sdo_lines); + ret =3D devm_regulator_bulk_get_enable(dev, st->chip_info->num_supplies, st->chip_info->supplies); =20 @@ -2010,6 +2029,8 @@ static int ad7380_probe(struct spi_device *spi) st->normal_xfer[0].cs_change_delay.value =3D st->chip_info->timing_specs-= >t_csh_ns; st->normal_xfer[0].cs_change_delay.unit =3D SPI_DELAY_UNIT_NSECS; st->normal_xfer[1].rx_buf =3D st->scan_data; + if (st->num_sdo_lines > 1) + st->normal_xfer[1].multi_lane_mode =3D SPI_MULTI_LANE_MODE_STRIPE; =20 spi_message_init_with_transfers(&st->normal_msg, st->normal_xfer, ARRAY_SIZE(st->normal_xfer)); @@ -2031,6 +2052,10 @@ static int ad7380_probe(struct spi_device *spi) st->seq_xfer[2].cs_change =3D 1; st->seq_xfer[2].cs_change_delay.value =3D st->chip_info->timing_specs->t_= csh_ns; st->seq_xfer[2].cs_change_delay.unit =3D SPI_DELAY_UNIT_NSECS; + if (st->num_sdo_lines > 1) { + st->seq_xfer[2].multi_lane_mode =3D SPI_MULTI_LANE_MODE_STRIPE; + st->seq_xfer[3].multi_lane_mode =3D SPI_MULTI_LANE_MODE_STRIPE; + } =20 spi_message_init_with_transfers(&st->seq_msg, st->seq_xfer, ARRAY_SIZE(st->seq_xfer)); --=20 2.43.0