From patchwork Mon Nov 11 15:59:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trevor Gamblin X-Patchwork-Id: 13870947 Received: from mail-il1-f171.google.com (mail-il1-f171.google.com [209.85.166.171]) (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 318D719D093 for ; Mon, 11 Nov 2024 15:59:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731340788; cv=none; b=neweLDBJ8DiKfkgm3p/9WlReXxrK6c9g4mHIGcJ0e7KTO0W1kd7MySY3pwBwrEHb29iYrJ2dRlNKlGYzCfpBW9h9nxxYi5vwk59GiPfNO/GonjaTRs9l/eFONr9085DptHZa0yc1dbWxmsiSN6n5zcvae6pHcMEotDRN4lhY+68= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731340788; c=relaxed/simple; bh=3qLdsjraVnTkvcU62JKbOxXoJGmNXkgXinDn+n0JttA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aWT08/z6UtB+76urXoKZcp+QfZB+0oyZsINMp8Ja5nylDBYK8P0xJAIs9eDWwO1Hil/BAtw/THvv6gVPMkvrQJhYdvnD+mleEMij7/qfhCreD7RBjeTrxuorhR7eNBqSnLIZJHPUGpTG2hZWxvw/+RIlsX4K6jQupLJzguJ7n/U= 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=1JXKbmer; arc=none smtp.client-ip=209.85.166.171 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="1JXKbmer" Received: by mail-il1-f171.google.com with SMTP id e9e14a558f8ab-3a6bfc1dc8eso17701585ab.1 for ; Mon, 11 Nov 2024 07:59:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1731340785; x=1731945585; 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=oH65ZqjoIUQdyQOhxA5UJjXuUFw9k+5Mbc5ny89egoI=; b=1JXKbmerkTf9z93jDfu47CGaP6VnFx+TOQ5ZjfvVW+Q0f/BFAmCQHINr6P9ABPRnri aAxTnDdN1i5rLHhaDw8N5r+kkoOAmOeO1SBveBhRS6gUmM7RRj/Q447P6macKSLhUo8v SnXVXKHnwNkUi/Kck2RQkrQsH3qdjWxMPKY+xZmqsBmOxXhQ2H1VRCHdke0fAjb2nVmi 7XJulnA0A0Np3OLafBxch5l/VycvaRPqb55chL14kirOqbbDcxL1c7V97WQ4dXfkH7wR TP6KtyLhn7UBfSY3gyfWZUDe1RkP3AiYG1mpUfcB2hkSZKu2GwA+O2wNHIUz4rWtc82f UZZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1731340785; x=1731945585; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oH65ZqjoIUQdyQOhxA5UJjXuUFw9k+5Mbc5ny89egoI=; b=gQpXB0Mwu+72CE4lFrtRCz2/aPcbgM3dsglQqi6TqiTvkjquy0jbQ7ER7VYBpGFLxs uKQRuTWw1CnYJoYMCcIW3ehCQGKiEiKDJ0mxsq5LUchMh22T1vFdE5sqNd7Fn0gXKXJJ HFOD1q/yJLY5D+L7Dxnd6Ug9MO5TOdSgNmTM8X/oKbpmIxrESAeC9b3qKvgOyAVaJ+PZ WXAmaBQDsf6Drl1pRDfv8sV7l7sMidf7R8a1/2m+kfXDvGA0o4vbhIZbB9w9ZKlB1CpU +fyhJ0Easfot+sauJZS7Yx90hp/e10vUQxek1iGSgUyU3cw6JK8gUo9V9a1ebZXgFlML rQFA== X-Forwarded-Encrypted: i=1; AJvYcCUEGJdePSUf0bZLv6HSQPTOIbjo2zPet3Va5GSzqt8Fm/c9UBhVE9cPK4pO97oPqYupHwMo5CMSTUI=@vger.kernel.org X-Gm-Message-State: AOJu0Yyv/Fm9B48xQZ3em82o2bvx+0C/1GfIJYBpfXf/S29AH/fE07N8 YhY7eok0vZH41IHASfFEAhQAYDYtzOPHSGWd/dD6IO9/GLQDhRzfkb2xB99hRkg= X-Google-Smtp-Source: AGHT+IFdQtHgzeLQ5tHnnidCC/p7SSDtP0oKLa2pFiTuSqodXEo1Um6QA0LITpJU3QlHvh6nIzxteA== X-Received: by 2002:a05:6e02:2164:b0:3a2:7592:2c5 with SMTP id e9e14a558f8ab-3a6f1a37439mr153211505ab.17.1731340784990; Mon, 11 Nov 2024 07:59:44 -0800 (PST) Received: from [127.0.1.1] (d24-150-219-207.home.cgocable.net. [24.150.219.207]) by smtp.gmail.com with ESMTPSA id 8926c6da1cb9f-4de787d62c6sm1410986173.81.2024.11.11.07.59.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Nov 2024 07:59:44 -0800 (PST) From: Trevor Gamblin Date: Mon, 11 Nov 2024 10:59:42 -0500 Subject: [PATCH 1/3] iio: adc: ad4695: fix buffered read timing in ad4695_buffer_preenable() Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20241111-tgamblin-ad4695_improvements-v1-1-698af4512635@baylibre.com> References: <20241111-tgamblin-ad4695_improvements-v1-0-698af4512635@baylibre.com> In-Reply-To: <20241111-tgamblin-ad4695_improvements-v1-0-698af4512635@baylibre.com> To: Lars-Peter Clausen , Michael Hennerich , =?utf-8?q?Nuno_S=C3=A1?= , David Lechner , Jonathan Cameron Cc: Jonathan Cameron , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Trevor Gamblin X-Mailer: b4 0.14.1 Modify ad4695_buffer_preenable() by adding an extra SPI transfer after each data read to help ensure that the timing requirement between the last SCLK rising edge and the next CNV rising edge is met. This requires a restructure of the buf_read_xfer array in ad4695_state. Also define AD4695_T_SCK_CNV_DELAY_NS to use for each added transfer. Without this change it is possible for the data to become corrupted on sequential buffered reads due to the device not properly exiting conversion mode. Fixes: 6cc7e4bf2e08 ("iio: adc: ad4695: implement triggered buffer") Signed-off-by: Trevor Gamblin --- drivers/iio/adc/ad4695.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/drivers/iio/adc/ad4695.c b/drivers/iio/adc/ad4695.c index 595ec4158e73..82e930b21c69 100644 --- a/drivers/iio/adc/ad4695.c +++ b/drivers/iio/adc/ad4695.c @@ -91,6 +91,7 @@ #define AD4695_T_WAKEUP_SW_MS 3 #define AD4695_T_REFBUF_MS 100 #define AD4695_T_REGCONFIG_NS 20 +#define AD4695_T_SCK_CNV_DELAY_NS 80 #define AD4695_REG_ACCESS_SCLK_HZ (10 * MEGA) /* Max number of voltage input channels. */ @@ -132,8 +133,13 @@ struct ad4695_state { unsigned int vref_mv; /* Common mode input pin voltage. */ unsigned int com_mv; - /* 1 per voltage and temperature chan plus 1 xfer to trigger 1st CNV */ - struct spi_transfer buf_read_xfer[AD4695_MAX_CHANNELS + 2]; + /* + * 2 per voltage and temperature chan plus 1 xfer to trigger 1st + * CNV. Excluding the trigger xfer, every 2nd xfer only serves + * to control CS and add a delay between the last SCLK and next + * CNV rising edges. + */ + struct spi_transfer buf_read_xfer[AD4695_MAX_CHANNELS * 2 + 3]; struct spi_message buf_read_msg; /* Raw conversion data received. */ u8 buf[ALIGN((AD4695_MAX_CHANNELS + 2) * AD4695_MAX_CHANNEL_SIZE, @@ -451,9 +457,6 @@ static int ad4695_buffer_preenable(struct iio_dev *indio_dev) xfer->bits_per_word = 16; xfer->rx_buf = &st->buf[(num_xfer - 1) * 2]; xfer->len = 2; - xfer->cs_change = 1; - xfer->cs_change_delay.value = AD4695_T_CONVERT_NS; - xfer->cs_change_delay.unit = SPI_DELAY_UNIT_NSECS; if (bit == temp_chan_bit) { temp_en = 1; @@ -468,6 +471,20 @@ static int ad4695_buffer_preenable(struct iio_dev *indio_dev) } num_xfer++; + + /* + * We need to add a blank xfer in data reads, to meet + * the timing requirement of a minimum delay between the + * last SCLK rising edge and the CS deassert. + */ + xfer = &st->buf_read_xfer[num_xfer]; + xfer->delay.value = AD4695_T_SCK_CNV_DELAY_NS; + xfer->delay.unit = SPI_DELAY_UNIT_NSECS; + xfer->cs_change = 1; + xfer->cs_change_delay.value = AD4695_T_CONVERT_NS; + xfer->cs_change_delay.unit = SPI_DELAY_UNIT_NSECS; + + num_xfer++; } /* From patchwork Mon Nov 11 15:59:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trevor Gamblin X-Patchwork-Id: 13870948 Received: from mail-io1-f42.google.com (mail-io1-f42.google.com [209.85.166.42]) (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 0A10C19E7F3 for ; Mon, 11 Nov 2024 15:59:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731340788; cv=none; b=GY6ipxCgTUJjMd+qYfcZDmBi2m5GW7/LXRBSj6u6U4I+EImSvv1N7xGZ8PQCZC4r9BKSvmWq7l8flbH3s5SRqntqqripl4Z7AvOIHLH1zc1/qmNnTDZT/FHEtZdhv9A7XJ2zSL+QCh0vDg91wSpc7/V8/0N+D+GC+SpO3/hTvPs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731340788; c=relaxed/simple; bh=ybmm1a8R24BhiHQwe8H9ZffGuu8x5YyWkcizJljXbj8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HUeBvgho2DlM8hgsHDYFgsfIlh+cix74vRTPEA8i1NCD0bHioIpSi7ipfzex4p9jeCkM3qR5U0gShKQ6JsoqrkDrVmU99FCdNy9CrAuBgEo6Ium11B1RAyp0RnQwfLQGv7t5TR0TzzFbBNWgyrdsMxgDousGlXjJ5HGm4XwdNNc= 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=Bg/UBwFh; arc=none smtp.client-ip=209.85.166.42 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="Bg/UBwFh" Received: by mail-io1-f42.google.com with SMTP id ca18e2360f4ac-83ab694ebe5so183479739f.0 for ; Mon, 11 Nov 2024 07:59:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1731340786; x=1731945586; 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=4z/hm6lPFwMecvVOX0An3KkhvxsEEmh2g07oQ0/eJcE=; b=Bg/UBwFhbVqMuvx8G5xOpSEdNFl6IVN2tqrquuA43FSc9Msec1TsEunAGH56V3qG3C 3FUeY+R4LzALy1xq8A/Yiv2sJBa16j0izXshSQ/m7oVHg1077KBYCVwdzGcGWCGPvLnp e+v7x/tRYjUhf1z5wT0X8sDKOfgsiKPYKH3QejDxWDo2u19D3TrdsTGJkIWFqQ0yQFYq nOq7ZDZqkf4MRV7any0z8DGfIHwSO8skbdtWO8GWdgU8qMxgs4ndggmo7R3z4PYkGKPz zs2ezc8j4AW2+VpxH7z4FVpmZLJ0z1bT5b5Zq9MybXejg7pFIiOg5JBTzluBcpBGbYPG KogQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1731340786; x=1731945586; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4z/hm6lPFwMecvVOX0An3KkhvxsEEmh2g07oQ0/eJcE=; b=xFaTv7QWHKvtVQr51rGP7YjANm6qBz2kAS4Kg8rgpqajscpJbXKBBqUO37sMSFSJhc DCPERjJnefsPo/1JUfsDN42a/B8xYT2HnfFSCPC+eBOlCDF5Di58I03ud+xP9Lb6cgwx Top/OJHXznxAvfWbotqPaGliv8AGlOeQd35tbQ6aRED6k+Q/3L/VZcH2TIFyAEiGu1uC XOhIsyOAB33PI2Pb5XmIcFfiyYQo93T6aKQJpEfbUdcrQlojo8scMSQo7FEaB+2ac+P+ cFtoVyBzPNXMAg2czaKP5Jb2AyT8Ie7Sxp3U+P02hSM/iZw2hR/fi442/SFGepvXUKgK k7Mg== X-Forwarded-Encrypted: i=1; AJvYcCVi0TUay6bZ6i3ZqAy1+WYbJbsyZGoY0rqbFSak5yQCI9T0qYPl4FtJxI4kRso1p5xib1OFgJCo988=@vger.kernel.org X-Gm-Message-State: AOJu0Yycsfylm+QoolwU2a0cGHgNrutKi051SBise1QNu1Cm7PxGZMGE c8+XQ+KEryeP+3DyepI7lTd8Zk2p9hGLPjXCiSo6wU9KjrC73w4ETCDTP5NPDYQ= X-Google-Smtp-Source: AGHT+IEHnj+MWyk1ZmKPzxL9cAQzdLRvcMpPU088PJBjUDzedvuV9E7InGRr6iUlI3S0dqTIqSA4ew== X-Received: by 2002:a05:6602:2cc5:b0:835:4278:f130 with SMTP id ca18e2360f4ac-83e0336f6e2mr1395046239f.13.1731340785863; Mon, 11 Nov 2024 07:59:45 -0800 (PST) Received: from [127.0.1.1] (d24-150-219-207.home.cgocable.net. [24.150.219.207]) by smtp.gmail.com with ESMTPSA id 8926c6da1cb9f-4de787d62c6sm1410986173.81.2024.11.11.07.59.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Nov 2024 07:59:45 -0800 (PST) From: Trevor Gamblin Date: Mon, 11 Nov 2024 10:59:43 -0500 Subject: [PATCH 2/3] iio: adc: ad4695: make ad4695_exit_conversion_mode() more robust Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20241111-tgamblin-ad4695_improvements-v1-2-698af4512635@baylibre.com> References: <20241111-tgamblin-ad4695_improvements-v1-0-698af4512635@baylibre.com> In-Reply-To: <20241111-tgamblin-ad4695_improvements-v1-0-698af4512635@baylibre.com> To: Lars-Peter Clausen , Michael Hennerich , =?utf-8?q?Nuno_S=C3=A1?= , David Lechner , Jonathan Cameron Cc: Jonathan Cameron , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Trevor Gamblin X-Mailer: b4 0.14.1 Ensure that conversion mode is successfully exited when the command is issued by adding an extra transfer beforehand, matching the minimum CNV high and low times from the AD4695 datasheet. The AD4695 has a quirk where the exit command only works during a conversion, so guarantee this happens by triggering a conversion in ad4695_exit_conversion_mode(). Then make this even more robust by ensuring that the exit command is run at AD4695_REG_ACCESS_SCLK_HZ rather than the bus maximum. Signed-off-by: Trevor Gamblin --- drivers/iio/adc/ad4695.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/drivers/iio/adc/ad4695.c b/drivers/iio/adc/ad4695.c index 82e930b21c69..f36c1a1db886 100644 --- a/drivers/iio/adc/ad4695.c +++ b/drivers/iio/adc/ad4695.c @@ -92,6 +92,8 @@ #define AD4695_T_REFBUF_MS 100 #define AD4695_T_REGCONFIG_NS 20 #define AD4695_T_SCK_CNV_DELAY_NS 80 +#define AD4695_T_CNVL_NS 80 +#define AD4695_T_CNVH_NS 10 #define AD4695_REG_ACCESS_SCLK_HZ (10 * MEGA) /* Max number of voltage input channels. */ @@ -364,11 +366,31 @@ static int ad4695_enter_advanced_sequencer_mode(struct ad4695_state *st, u32 n) */ static int ad4695_exit_conversion_mode(struct ad4695_state *st) { - struct spi_transfer xfer = { - .tx_buf = &st->cnv_cmd2, - .len = 1, - .delay.value = AD4695_T_REGCONFIG_NS, - .delay.unit = SPI_DELAY_UNIT_NSECS, + /* + * An extra transfer is needed to trigger a conversion here so + * that we can be 100% sure the command will be processed by the + * ADC, rather than relying on it to be in the correct state + * when this function is called (this chip has a quirk where the + * command only works when reading a conversion, and if the + * previous conversion was already read then it won't work). The + * actual conversion command is then run at the slower + * AD4695_REG_ACCESS_SCLK_HZ speed to guarantee this works. + */ + struct spi_transfer xfers[] = { + { + .delay.value = AD4695_T_CNVL_NS, + .delay.unit = SPI_DELAY_UNIT_NSECS, + .cs_change = 1, + .cs_change_delay.value = AD4695_T_CNVH_NS, + .cs_change_delay.unit = SPI_DELAY_UNIT_NSECS, + }, + { + .speed_hz = AD4695_REG_ACCESS_SCLK_HZ, + .tx_buf = &st->cnv_cmd2, + .len = 1, + .delay.value = AD4695_T_REGCONFIG_NS, + .delay.unit = SPI_DELAY_UNIT_NSECS, + }, }; /* @@ -377,7 +399,7 @@ static int ad4695_exit_conversion_mode(struct ad4695_state *st) */ st->cnv_cmd2 = AD4695_CMD_EXIT_CNV_MODE << 3; - return spi_sync_transfer(st->spi, &xfer, 1); + return spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers)); } static int ad4695_set_ref_voltage(struct ad4695_state *st, int vref_mv) From patchwork Mon Nov 11 15:59:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trevor Gamblin X-Patchwork-Id: 13870949 Received: from mail-io1-f42.google.com (mail-io1-f42.google.com [209.85.166.42]) (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 992AB19F430 for ; Mon, 11 Nov 2024 15:59:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731340789; cv=none; b=GPUxANQx3nQDWSlOsWDsb+1MDKKe9i2b9wQ8GMhz7VHILdn3PjhqCOMxMGrbDJrFA6ybaOsWLj+bk/irAAho+hZQdlBMyMslWB5/RSsfavHPIVi90+muN3l261AlUgDwmtqZA6prV7DQ/GJUF48sLcQXJXG1BH8yI3dZD3Y8WC4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731340789; c=relaxed/simple; bh=HDcW1VcFC6TUobbEsvgtNwj7T/A2DfMJi7G65Cb9CEw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RNn8YoMr9RNz1nvtDWwkMhN2pjI04bglNy/6ZKZWgMgaO+ACt+zGMnSb4g8SYEhBTAmFyIrwTlJnHiuLg0u3twHbiintX4pVnw03BxlPEKSutLeydprPAG2RTqC0jhpRYGGCU6IxVG+r2TjhzngmL1pvfXokbICiNHv8z55m9D4= 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=kn3gIP/i; arc=none smtp.client-ip=209.85.166.42 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="kn3gIP/i" Received: by mail-io1-f42.google.com with SMTP id ca18e2360f4ac-83abcfb9fd4so179654339f.3 for ; Mon, 11 Nov 2024 07:59:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1731340787; x=1731945587; 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=MRx61QutqkHqE8LsifHeDvLFt2mQ7Pk/J2Li4P0J5EU=; b=kn3gIP/iAqIFjThhhJdpY5p+TfBzmvYJuz+/2qolTlJII5mEKK3j7U07QJoL3wSF3p jPelUIGdgnhYM50ecJrK8+Pv/8/tuFnv0h+pHKanUQPIUaFsxKSJYnOobzeTkdpSdXq6 WAKSIhzw7pwP8nbNXiPfqzfsFfhhDfaLwWj1Q6jMhDdebiz1BuEU9tH4WTQcklwnQqee FUZdV+8Xq32DcT044rA3HqOe6V3qjYo9jQPTC+AvVdZWPBLqnfpc4HkD1QMtV6Lmzv/F Z7Me14w4U3UoVW3VSlUTDO1j9LyDLyk2/3KGSwdfzcEod4P4uVqBHRZbBIuaRLNpJNfT mCYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1731340787; x=1731945587; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MRx61QutqkHqE8LsifHeDvLFt2mQ7Pk/J2Li4P0J5EU=; b=EzvJgFLYyt9aU9nVkBsG31HX0YkfFH+649w/pDwnIGHGOUREIVc+ryXCsjerMkzL+Y 0+Y2lkD4ZuO5Kz5Kshkyd/b8c2lfvlca+YYXUhM146Fbbau5yiY9o/EDeNq/VUN0JC6v UXl2y4uslzd5SVu82GbxNEWROkgZaawpaH07UsgVJoEzuOSdF8MZj+fiTU7dzJFsZyOr 99T4POzYaL8DcDDy5fXqNO5fkOfEautm0TnHaFhGp4COfzUa7jamewmndM9oGp08QWxa gLREVQOanNlL1LKdQ7wp+QrYamnD2sFMvV7+u5F8QH3nZvWYGwmHS5sfjL4qTqvoaKek WHfA== X-Forwarded-Encrypted: i=1; AJvYcCVUJDQFre1MvcAiC/bx2qozPmJ/ZEIlIaeAC6k+DLNSP4GY9BdKSodb5eDiA+NCJsP7iJUev4IM/T4=@vger.kernel.org X-Gm-Message-State: AOJu0Yw5s/yBz/y2pc1Q6k/0N5qSouAk2mXpcfucNUg0ejTyMGS9Pr+x HaUSzc8dtpFikWbVUUadJKP7/UUg4IVNGnTcW6SbPuLTFUGEll92qANiZTk24Jw= X-Google-Smtp-Source: AGHT+IFz5onGePgbNMaG6Xw/7Xs9ETfUP+zGO0bMsWlJBZyv1Ip2qkVxHrYh9z77fz9YgW2JWKoJmg== X-Received: by 2002:a05:6602:13d3:b0:83a:acfa:b0ba with SMTP id ca18e2360f4ac-83e032a171dmr1370582039f.1.1731340786793; Mon, 11 Nov 2024 07:59:46 -0800 (PST) Received: from [127.0.1.1] (d24-150-219-207.home.cgocable.net. [24.150.219.207]) by smtp.gmail.com with ESMTPSA id 8926c6da1cb9f-4de787d62c6sm1410986173.81.2024.11.11.07.59.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Nov 2024 07:59:46 -0800 (PST) From: Trevor Gamblin Date: Mon, 11 Nov 2024 10:59:44 -0500 Subject: [PATCH 3/3] iio: adc: ad4695: add custom regmap bus callbacks Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20241111-tgamblin-ad4695_improvements-v1-3-698af4512635@baylibre.com> References: <20241111-tgamblin-ad4695_improvements-v1-0-698af4512635@baylibre.com> In-Reply-To: <20241111-tgamblin-ad4695_improvements-v1-0-698af4512635@baylibre.com> To: Lars-Peter Clausen , Michael Hennerich , =?utf-8?q?Nuno_S=C3=A1?= , David Lechner , Jonathan Cameron Cc: Jonathan Cameron , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Trevor Gamblin X-Mailer: b4 0.14.1 Add a custom implementation of regmap read/write callbacks using the SPI bus. This allows them to be performed at a lower SCLK rate than data reads. Previously, all SPI transfers were being performed at a lower speed, but with this change sample data is read at the max bus speed while the register reads/writes remain at the lower rate. Also remove .can_multi_write from the AD4695 driver's regmap_configs, as this isn't implemented or needed. For some background context, see: https://lore.kernel.org/linux-iio/20241028163907.00007e12@Huawei.com/ Suggested-by: David Lechner Signed-off-by: Trevor Gamblin --- drivers/iio/adc/Kconfig | 2 +- drivers/iio/adc/ad4695.c | 74 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 68 insertions(+), 8 deletions(-) diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 6c4e74420fd2..e0f9d01ce37d 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -51,9 +51,9 @@ config AD4130 config AD4695 tristate "Analog Device AD4695 ADC Driver" depends on SPI - select REGMAP_SPI select IIO_BUFFER select IIO_TRIGGERED_BUFFER + select REGMAP help Say yes here to build support for Analog Devices AD4695 and similar analog to digital converters (ADC). diff --git a/drivers/iio/adc/ad4695.c b/drivers/iio/adc/ad4695.c index f36c1a1db886..180a0fd4f03c 100644 --- a/drivers/iio/adc/ad4695.c +++ b/drivers/iio/adc/ad4695.c @@ -150,6 +150,8 @@ struct ad4695_state { /* Commands to send for single conversion. */ u16 cnv_cmd; u8 cnv_cmd2; + /* Buffer for storing data from regmap bus reads/writes */ + u8 regmap_bus_data[4]; }; static const struct regmap_range ad4695_regmap_rd_ranges[] = { @@ -194,7 +196,6 @@ static const struct regmap_config ad4695_regmap_config = { .max_register = AD4695_REG_AS_SLOT(127), .rd_table = &ad4695_regmap_rd_table, .wr_table = &ad4695_regmap_wr_table, - .can_multi_write = true, }; static const struct regmap_range ad4695_regmap16_rd_ranges[] = { @@ -226,7 +227,67 @@ static const struct regmap_config ad4695_regmap16_config = { .max_register = AD4695_REG_GAIN_IN(15), .rd_table = &ad4695_regmap16_rd_table, .wr_table = &ad4695_regmap16_wr_table, - .can_multi_write = true, +}; + +static int ad4695_regmap_bus_reg_write(void *context, const void *data, + size_t count) +{ + struct ad4695_state *st = context; + struct spi_transfer xfer = { + .speed_hz = AD4695_REG_ACCESS_SCLK_HZ, + .len = count, + .tx_buf = st->regmap_bus_data, + }; + + if (count > ARRAY_SIZE(st->regmap_bus_data)) + return -EINVAL; + + memcpy(st->regmap_bus_data, data, count); + + return spi_sync_transfer(st->spi, &xfer, 1); +} + +static int ad4695_regmap_bus_reg_read(void *context, const void *reg, + size_t reg_size, void *val, + size_t val_size) +{ + struct ad4695_state *st = context; + struct spi_transfer xfers[] = { + { + .speed_hz = AD4695_REG_ACCESS_SCLK_HZ, + .len = reg_size, + .tx_buf = &st->regmap_bus_data[0], + }, { + .speed_hz = AD4695_REG_ACCESS_SCLK_HZ, + .len = val_size, + .rx_buf = &st->regmap_bus_data[2], + }, + }; + int ret; + + if (reg_size > 2) + return -EINVAL; + + if (val_size > 2) + return -EINVAL; + + memcpy(&st->regmap_bus_data[0], reg, reg_size); + + ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers)); + if (ret) + return ret; + + memcpy(val, &st->regmap_bus_data[2], val_size); + + return 0; +} + +static const struct regmap_bus ad4695_regmap_bus = { + .write = ad4695_regmap_bus_reg_write, + .read = ad4695_regmap_bus_reg_read, + .read_flag_mask = 0x80, + .reg_format_endian_default = REGMAP_ENDIAN_BIG, + .val_format_endian_default = REGMAP_ENDIAN_BIG, }; static const struct iio_chan_spec ad4695_channel_template = { @@ -1040,15 +1101,14 @@ static int ad4695_probe(struct spi_device *spi) if (!st->chip_info) return -EINVAL; - /* Registers cannot be read at the max allowable speed */ - spi->max_speed_hz = AD4695_REG_ACCESS_SCLK_HZ; - - st->regmap = devm_regmap_init_spi(spi, &ad4695_regmap_config); + st->regmap = devm_regmap_init(dev, &ad4695_regmap_bus, st, + &ad4695_regmap_config); if (IS_ERR(st->regmap)) return dev_err_probe(dev, PTR_ERR(st->regmap), "Failed to initialize regmap\n"); - st->regmap16 = devm_regmap_init_spi(spi, &ad4695_regmap16_config); + st->regmap16 = devm_regmap_init(dev, &ad4695_regmap_bus, st, + &ad4695_regmap_config); if (IS_ERR(st->regmap16)) return dev_err_probe(dev, PTR_ERR(st->regmap16), "Failed to initialize regmap16\n");