From nobody Mon Feb 9 12:47:59 2026 Received: from mail-qk1-f172.google.com (mail-qk1-f172.google.com [209.85.222.172]) (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 407081B3731 for ; Wed, 31 Jul 2024 13:48:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722433692; cv=none; b=m7FJ7yy6jo3Hyjq8eSzxC5FMe2STuAEzFF1HMOQTSnIIQrnYu1aDytcSSG82BcSd7zSozDNN3Rqtw2SmgXko1h3iG47tTV9uICiIkDgygEKYLYF/vGJkberzwpoxvXwWcNYIdthZPmq9bpQ+DPak1S8i5eNu0DWy2ScvUUbygiw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722433692; c=relaxed/simple; bh=NzNtXoBNYB0etLBt7Aj0LPqIWAdcXavnH6zDU74kAYQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dDCCvuEGcfyOJ1kKcGBhcxlm2RZk42szPkrLruFCUeqPb6iFAw2MD/rzG8pIfbGcjXO/rQV88Q6/rDB1HFpdl5NXD6tCC39HOIMXsHOJkgrEDFyuEt968dzIx2HljzWrZbuSFbbfh4YtXkvGe+wro+Nr75HOb4BFraWDWhWblqk= 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=sWWkQ1+/; arc=none smtp.client-ip=209.85.222.172 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="sWWkQ1+/" Received: by mail-qk1-f172.google.com with SMTP id af79cd13be357-7a1d6f4714bso84272185a.1 for ; Wed, 31 Jul 2024 06:48:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1722433688; x=1723038488; 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=mDSy5i+PWIQbuPyffd+oom3wrRaBv+Tc62xGQ8pPdBU=; b=sWWkQ1+/QIZD0kbd26+3dAQr4D7qYhb5a9pMKX8kDGxj9/wYnSnd57q4Y/AxpS3hkl HsfF7fa0gwDh875NNQil9DX3TWysU0bvAru72qM8dho7170MWm0Fr1q/l3AV/7wOw7a+ hBEd8GThI/juiTE4WIZOchVLk3APnWj3Q9v8zrDfQhhtCJtPoB8HB7oAve3uZxDL/H83 m3fSzgQs8F89tFYv8AdJ711BAbA370yBm6yjVdlARSK+03V0+usmnkS7tYVdV28UEffF 2XK+LUTnbIxOgQBxqxPZ6hCmn9kbFD8ocNz7zDMKMs11kOd0MTCqShcIUOqb7lHpl5AA Lkbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722433688; x=1723038488; 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=mDSy5i+PWIQbuPyffd+oom3wrRaBv+Tc62xGQ8pPdBU=; b=oa31SFYj1BLFgpS+7tgG7l1GJQ4eK1IUQWuy5cXpzdfXPAO8z2uRQh0Qrsxo6cyCHB fQaHAsUJVN1yMZv4LfHhcRHw0EgegZz1VrSk6jbbUmVgI+wIQDOW0T9LwqHO37ZpOBfH Hs1+9gvjTj+VNLZvq9Gcao8a3DUWd7tLBMV3p0w5PKg9/el9OVariBJH0DNnqUtx5vAn Go3v1UIfHiXtWX6HWEaSeJdftoccwV+wuH2DzXMWiiRBRj3JkjGnchMFJz/dtAX+82kB h2TlsKILQDbWcp3cB2TqgpoGwoj6W45A1ogGM+WLjkffCoXiFurQy8oWowCCH83kyQ0i 5X7w== X-Forwarded-Encrypted: i=1; AJvYcCVYrDRsbyNFuyEmeNl+e/PKx7cmECkK9iZT6q6OuoLnruKIvltELwNg6p7Ar0tkzAIB1XKyC2BJeQPBJ8ygCCPQS5Igmf/sVR5OVfao X-Gm-Message-State: AOJu0YxK86Hlf7ziU/LY+OVHaHkNbU1adYs9Ci/i3YhYquvyNwmf3rWw IW7jACZAbBmvzrm9hHT4ZdY9pv7NPa1K+LtM7dpYz2mXVGwys5Bs9758gBsaFuE= X-Google-Smtp-Source: AGHT+IF0uk+GAWLTeYgzWMtpSJHPiGxYF+WUq8rmU/ZgGJOZAHOY3lzLw1QTuS7lRUaVaOh0j1UqcA== X-Received: by 2002:a05:620a:408b:b0:79e:fd1e:6fc4 with SMTP id af79cd13be357-7a200d119f3mr973827385a.34.1722433688046; Wed, 31 Jul 2024 06:48:08 -0700 (PDT) Received: from [127.0.1.1] (d24-150-219-207.home.cgocable.net. [24.150.219.207]) by smtp.gmail.com with ESMTPSA id af79cd13be357-7a1d73955ccsm746209985a.11.2024.07.31.06.48.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 31 Jul 2024 06:48:06 -0700 (PDT) From: Trevor Gamblin Date: Wed, 31 Jul 2024 09:48:03 -0400 Subject: [PATCH RFC 1/3] dt-bindings: iio: adc: add AD762x/AD796x ADCs 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: <20240731-ad7625_r1-v1-1-a1efef5a2ab9@baylibre.com> References: <20240731-ad7625_r1-v1-0-a1efef5a2ab9@baylibre.com> In-Reply-To: <20240731-ad7625_r1-v1-0-a1efef5a2ab9@baylibre.com> To: Lars-Peter Clausen , Michael Hennerich , =?utf-8?q?Nuno_S=C3=A1?= , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jonathan Corbet , David Lechner , Uwe Kleine-Konig Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Trevor Gamblin X-Mailer: b4 0.14.1 This adds a binding specification for the Analog Devices Inc. AD7625, AD7626, AD7960, and AD7961 ADCs. Signed-off-by: Trevor Gamblin --- .../devicetree/bindings/iio/adc/adi,ad7625.yaml | 176 +++++++++++++++++= ++++ MAINTAINERS | 9 ++ 2 files changed, 185 insertions(+) diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7625.yaml b/Do= cumentation/devicetree/bindings/iio/adc/adi,ad7625.yaml new file mode 100644 index 000000000000..e88db0ac2534 --- /dev/null +++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7625.yaml @@ -0,0 +1,176 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/adc/adi,ad7625.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Analog Devices Fast PulSAR Analog to Digital Converters + +maintainers: + - Michael Hennerich + - Nuno S=C3=A1 + +description: | + A family of single channel differential analog to digital converters + in a LFCSP package. Note that these bindings are for the device when + used with the PulSAR LVDS project: + http://analogdevicesinc.github.io/hdl/projects/pulsar_lvds/index.html. + + * https://www.analog.com/en/products/ad7625.html + * https://www.analog.com/en/products/ad7626.html + * https://www.analog.com/en/products/ad7960.html + * https://www.analog.com/en/products/ad7961.html + +properties: + compatible: + enum: + - adi,ad7625 + - adi,ad7626 + - adi,ad7960 + - adi,ad7961 + + vdd1-supply: + description: A supply that powers the analog and digital circuitry. + + vdd2-supply: + description: A supply that powers the analog and digital circuitry. + + vio-supply: + description: A supply for the inputs and outputs. + + ref-supply: + description: + Voltage regulator for the external reference voltage (REF). + + refin-supply: + description: + Voltage regulator for the reference buffer input (REFIN). + + clocks: + description: + The clock connected to the CLK pins, gated by the clk_gate PWM. + maxItems: 1 + + pwms: + maxItems: 2 + + pwm-names: + maxItems: 2 + items: + - const: cnv + description: PWM connected to the CNV input on the ADC. + - const: clk_gate + description: PWM that gates the clock connected to the ADC's CLK i= nput. + + io-backends: + description: + The AXI ADC IP block connected to the D+/- and DCO+/- lines of the A= DC. + maxItems: 1 + + adi,en0-always-on: + $ref: /schemas/types.yaml#/definitions/flag + description: + Indicates if EN0 is hard-wired to the high state. If neither this + nor en0-gpios are present, then EN0 is hard-wired low. + + adi,en1-always-on: + $ref: /schemas/types.yaml#/definitions/flag + description: + Indicates if EN1 is hard-wired to the high state. If neither this + nor en1-gpios are present, then EN1 is hard-wired low. + + adi,en2-always-on: + $ref: /schemas/types.yaml#/definitions/flag + description: + Indicates if EN2 is hard-wired to the high state. If neither this + nor en2-gpios are present, then EN2 is hard-wired low. + + adi,en3-always-on: + $ref: /schemas/types.yaml#/definitions/flag + description: + Indicates if EN3 is hard-wired to the high state. If neither this + nor en3-gpios are present, then EN3 is hard-wired low. + + en0-gpios: + description: + Configurable EN0 pin. + + en1-gpios: + description: + Configurable EN1 pin. + + en2-gpios: + description: + Configurable EN2 pin. + + en3-gpios: + description: + Configurable EN3 pin. + +required: + - compatible + - vdd1-supply + - vdd2-supply + - vio-supply + - clocks + - pwms + - pwm-names + - io-backends + +- if: + properties: + compatible: + contains: + enum: + - adi,ad7625 + - adi,ad7626 + then: + properties: + en2-gpios: false + en3-gpios: false + adi,en2-always-on: false + adi,en3-always-on: false + allOf: + # ref-supply and refin-supply are mutually-exclusive (neither is also + # valid) + - if: + required: + - ref-supply + then: + properties: + refin-supply: false + - if: + required: + - refin-supply + then: + properties: + ref-supply: false + +- if: + properties: + compatible: + contains: + enum: + - adi,ad7960 + - adi,ad7961 + then: + oneOf: + required: + - ref-supply + required: + - refin-supply + +additionalProperties: false + +examples: + - | + adc { + compatible =3D "adi,ad7625"; + vdd1-supply =3D <&supply_5V>; + vdd2-supply =3D <&supply_2_5V>; + vio-supply =3D <&supply_2_5V>; + io-backends =3D <&axi_adc>; + clock =3D <&ref_clk>; + pwms =3D <&axi_pwm_gen 0 0>, <&axi_pwm_gen 1 0>; + pwm-names =3D "cnv", "clk_gate"; + }; diff --git a/MAINTAINERS b/MAINTAINERS index 42decde38320..2361f92751dd 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1260,6 +1260,15 @@ F: Documentation/devicetree/bindings/iio/addac/adi,a= d74413r.yaml F: drivers/iio/addac/ad74413r.c F: include/dt-bindings/iio/addac/adi,ad74413r.h =20 +ANALOG DEVICES INC AD7625 DRIVER +M: Michael Hennerich +M: Nuno S=C3=A1 +R: Trevor Gamblin +S: Supported +W: https://ez.analog.com/linux-software-drivers +W: http://analogdevicesinc.github.io/hdl/projects/pulsar_lvds/index.html +F: Documentation/devicetree/bindings/iio/adc/adi,ad7625.yaml + ANALOG DEVICES INC AD7768-1 DRIVER M: Michael Hennerich L: linux-iio@vger.kernel.org --=20 2.39.2 From nobody Mon Feb 9 12:47:59 2026 Received: from mail-ot1-f49.google.com (mail-ot1-f49.google.com [209.85.210.49]) (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 5F3FD1B3744 for ; Wed, 31 Jul 2024 13:48:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722433692; cv=none; b=NmiJ1UG9DPjr81EVGT97P3B+Pp0uc+X9oEo8YSq5xt5VSvLzEnTSTMn6XQKw6j7qV0rV+XREh7NiqEkYr0L+xFld26wyDPW1AQe7M8+B3patgufQnPMYskMRTF1wWix/F3eBdYxTV5qlmycb+N0nDCcs8Umjynq8kWtfABbJASY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722433692; c=relaxed/simple; bh=KmSGIKQZSeNafXsD7q5641e2e3PYC4QxC9JqJq9CPcY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=muQM6rFslOnb2wxRg1RsFNJ1dxT/TS/stLPEMyqEOmVKH6g/nN7gEDol1fjk3orwlzFQe4O5VlxvLorQJ0bBh4XgKhgUEVl4aprZ3ouFk0yLhELvsMcTD7hYZyK08WN3UcakJ58dUrmb8m5/M3KciifzDZaV71mChSHtBtwrI9w= 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=rj8PlHRb; arc=none smtp.client-ip=209.85.210.49 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="rj8PlHRb" Received: by mail-ot1-f49.google.com with SMTP id 46e09a7af769-70949118d26so3316438a34.0 for ; Wed, 31 Jul 2024 06:48:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1722433689; x=1723038489; 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=5VjiyCfgwjK02//6GoHdg64d2wASOuLzZfqUWJQCUHI=; b=rj8PlHRb905u1k/Vy2zyWs4RCN5+GQ9hxyTGldHKlrzxbP7vPZooTlAz/O7rpgYdoS x0Q2sYMaPaEFvPglTu9ut8v7+ZT6JfLBvRooK6E1NunbK7FSYgye5XzZ7X4DxE/q6NXa wbH7M2/kWkTmXWtEgAGUQE+n2FgMljm0hDHXCfSUrACYycW0cuJ7Dn9QLZ3+8wypBlGP rNsHCYGCfEhrs2TocsMP/BAkXgnCNt68hOSIvnnfwXR9iyrAvWwQI2GQftQ9RtFeYfGL BTQJmnb4TdWCIkrTtk5e0YlEwx8bR5zCUGHdcfO0+Ww39Rp2vTgC9xNYsYbCQKpnR2rK YKFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722433689; x=1723038489; 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=5VjiyCfgwjK02//6GoHdg64d2wASOuLzZfqUWJQCUHI=; b=Ao5G/5VXb/Of3xjKbCzuuSwG+pkqyd4+ETbCTbmyeMUPgE0N77Eeva8kawSkS4TF65 SgU1INq6hz7iCvjiqBqIw1AhZfNIFhtyUvPT1EqO/I8rZ+kn5pyF+K7WnIbJhg7P4utG raeJESNV+PciP7jiF5mGPUEQj0MmncCvgw3evvOH2y2/JNwX7s9D31g14tZL0j8QHLsV coHYQqVOwDfT5OqmbVIhMYZ6DhOIKNXhmOZKlKDKJyhnGtSQVl6xQGl3vGcESwjvfGLM c9HE/U8TPp8Z91uUaRhIOFa2+4gl0K9zTRrHsjJCs1VMRT3qwXxJprDah0FmxIYXkGNr +Jpw== X-Forwarded-Encrypted: i=1; AJvYcCVdI90gmhYu3pQWxohF/IKmcqjneC1sghiFdFXBTSHoF9wq/zVY1GWxigCptbXym5kHukQ915AqW5YPTMVnKCWecTdPb7wcj6CJht8P X-Gm-Message-State: AOJu0YzQd1bG3lvUtufFZMgFzq19/biuDE6RryyL//51VPOj46A/iSq0 JfMSDlmBlPlKy3/jhuo9klccJG83CI0nOm2G1x778pDD+6WWp127EoGHVGGYp1A= X-Google-Smtp-Source: AGHT+IEtiQvqWZP5/6OSJH8ScvsJwmeiiFgcMu7COZ+lmQFDIO4pjwnRRIsWA8WCGAzdIri2t2WJDQ== X-Received: by 2002:a05:6830:4708:b0:709:4065:63e6 with SMTP id 46e09a7af769-70940c156b4mr17249312a34.12.1722433689274; Wed, 31 Jul 2024 06:48:09 -0700 (PDT) Received: from [127.0.1.1] (d24-150-219-207.home.cgocable.net. [24.150.219.207]) by smtp.gmail.com with ESMTPSA id af79cd13be357-7a1d73955ccsm746209985a.11.2024.07.31.06.48.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 31 Jul 2024 06:48:08 -0700 (PDT) From: Trevor Gamblin Date: Wed, 31 Jul 2024 09:48:04 -0400 Subject: [PATCH RFC 2/3] iio: adc: ad7625: add driver 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: <20240731-ad7625_r1-v1-2-a1efef5a2ab9@baylibre.com> References: <20240731-ad7625_r1-v1-0-a1efef5a2ab9@baylibre.com> In-Reply-To: <20240731-ad7625_r1-v1-0-a1efef5a2ab9@baylibre.com> To: Lars-Peter Clausen , Michael Hennerich , =?utf-8?q?Nuno_S=C3=A1?= , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jonathan Corbet , David Lechner , Uwe Kleine-Konig Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Trevor Gamblin X-Mailer: b4 0.14.1 This adds a driver for the ad762x and ad796x family of ADCs. These are pin-compatible devices using an LVDS interface for data transfer, capable of sampling at rates of 6 and 10 MSPS, respectively. They also feature multiple voltage reference options based on the configuration of the EN1/EN0 pins, which can be set in the devicetree. Signed-off-by: Trevor Gamblin --- MAINTAINERS | 1 + drivers/iio/adc/Kconfig | 15 ++ drivers/iio/adc/Makefile | 1 + drivers/iio/adc/ad7625.c | 626 +++++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 643 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 2361f92751dd..a90972e1c5c5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1268,6 +1268,7 @@ S: Supported W: https://ez.analog.com/linux-software-drivers W: http://analogdevicesinc.github.io/hdl/projects/pulsar_lvds/index.html F: Documentation/devicetree/bindings/iio/adc/adi,ad7625.yaml +F: drivers/iio/adc/ad7625.c =20 ANALOG DEVICES INC AD7768-1 DRIVER M: Michael Hennerich diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index f60fe85a30d5..e25fb505f545 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -219,6 +219,21 @@ config AD7606_IFACE_SPI To compile this driver as a module, choose M here: the module will be called ad7606_spi. =20 +config AD7625 + tristate "Analog Devices AD7625/AD7626 High Speed ADC driver" + select IIO_BACKEND + help + Say yes here to build support for Analog Devices: + * AD7625 16-Bit, 6 MSPS PulSAR Analog-to-Digital Converter + * AD7626 16-Bit, 10 MSPS PulSAR Analog-to-Digital Converter + * AD7960 18-Bit, 5 MSPS PulSAR Analog-to-Digital Converter + * AD7961 16-Bit, 5 MSPS PulSAR Analog-to-Digital Converter + + The driver requires the assistance of the AXI ADC IP core to ope= rate. + + To compile this driver as a module, choose M here: the module wi= ll be + called ad7625. + config AD7766 tristate "Analog Devices AD7766/AD7767 ADC driver" depends on SPI_MASTER diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile index d370e066544e..6bf429ca24ea 100644 --- a/drivers/iio/adc/Makefile +++ b/drivers/iio/adc/Makefile @@ -23,6 +23,7 @@ obj-$(CONFIG_AD7476) +=3D ad7476.o obj-$(CONFIG_AD7606_IFACE_PARALLEL) +=3D ad7606_par.o obj-$(CONFIG_AD7606_IFACE_SPI) +=3D ad7606_spi.o obj-$(CONFIG_AD7606) +=3D ad7606.o +obj-$(CONFIG_AD7625) +=3D ad7625.o obj-$(CONFIG_AD7766) +=3D ad7766.o obj-$(CONFIG_AD7768_1) +=3D ad7768-1.o obj-$(CONFIG_AD7780) +=3D ad7780.o diff --git a/drivers/iio/adc/ad7625.c b/drivers/iio/adc/ad7625.c new file mode 100644 index 000000000000..b74760c2fee2 --- /dev/null +++ b/drivers/iio/adc/ad7625.c @@ -0,0 +1,626 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) +/* + * Analog Devices Inc. AD7625 ADC driver + * + * Copyright 2024 Analog Devices Inc. + * Copyright 2024 BayLibre, SAS + * + * Note that this driver requires the AXI ADC IP block configured for + * LVDS to function. See Documentation/iio/ad7625.rst for more information. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define AD7625_INTERNAL_REF_MV 4096 +#define AD7960_MAX_NBW_FREQ (2 * MEGA) + +struct ad7625_timing_spec { + /* Max conversion high time (t_{CNVH}). */ + unsigned int conv_high_ns; + /* Max conversion to MSB delay (t_{MSB}). */ + unsigned int conv_msb_ns; +}; + +struct ad7625_chip_info { + const char *name; + const unsigned int max_sample_rate_hz; + const struct ad7625_timing_spec *timing_spec; + const struct iio_chan_spec chan_spec; + const bool has_power_down_state; + const bool has_bandwidth_control; + const bool has_internal_vref; +}; + +/* AD7625_CHAN_SPEC - Define a chan spec structure for a specific chip */ +#define AD7625_CHAN_SPEC(_bits) { \ + .type =3D IIO_VOLTAGE, \ + .indexed =3D 1, \ + .differential =3D 1, \ + .channel =3D 0, \ + .channel2 =3D 1, \ + .info_mask_separate =3D BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_all =3D BIT(IIO_CHAN_INFO_SAMP_FREQ), \ + .scan_index =3D 0, \ + .scan_type.sign =3D 's', \ + .scan_type.storagebits =3D _bits > 16 ? 32 : 16, \ + .scan_type.realbits =3D _bits, \ +} + +struct ad7625_state { + const struct ad7625_chip_info *info; + struct iio_backend *back; + /* rate of the clock gated by the "clk_gate" PWM */ + unsigned long ref_clk_rate_hz; + /* PWM burst signal for transferring acquired data to the host */ + struct pwm_device *clk_gate_pwm; + /* + * PWM control signal for initiating data conversion. Analog + * inputs are sampled beginning on this signal's rising edge. + */ + struct pwm_device *cnv_pwm; + unsigned int vref_mv; + int sampling_freq_hz; + /* + * Optional GPIOs for controlling device state. EN0 and EN1 + * determine voltage reference configuration and on/off state. + * EN2 controls the device -3dB bandwidth (and by extension, max + * sample rate). EN3 controls the VCM reference output. EN2 and + * EN3 are only present for the AD796x devices. + */ + struct gpio_desc *en_gpios[4]; + bool can_power_down; + bool can_refin; + bool can_ref_4v096; + /* + * Indicate whether the bandwidth can be narrow (9MHz). + * When true, device sample rate must also be < 2MSPS. + */ + bool can_narrow_bandwidth; + /* Indicate whether the bandwidth can be wide (28MHz). */ + bool can_wide_bandwidth; + bool can_ref_5v; + bool can_snooze; + bool can_test_pattern; +}; + +static const struct ad7625_timing_spec ad7625_timing_spec =3D { + .conv_high_ns =3D 40, + .conv_msb_ns =3D 145, +}; + +static const struct ad7625_timing_spec ad7626_timing_spec =3D { + .conv_high_ns =3D 40, + .conv_msb_ns =3D 80, +}; + +/* + * conv_msb_ns is set to 0 instead of the datasheet maximum of 200ns to + * avoid exceeding the minimum conversion time, i.e. it is effectively + * modulo 200 and offset by a full period. Values greater than or equal + * to the period would be rejected by the PWM API. + */ +static const struct ad7625_timing_spec ad7960_timing_spec =3D { + .conv_high_ns =3D 80, + .conv_msb_ns =3D 0, +}; + +static const struct ad7625_chip_info ad7625_chip_info =3D { + .name =3D "ad7625", + .max_sample_rate_hz =3D 6 * MEGA, + .timing_spec =3D &ad7625_timing_spec, + .chan_spec =3D AD7625_CHAN_SPEC(16), + .has_power_down_state =3D false, + .has_bandwidth_control =3D false, + .has_internal_vref =3D true, +}; + +static const struct ad7625_chip_info ad7626_chip_info =3D { + .name =3D "ad7626", + .max_sample_rate_hz =3D 10 * MEGA, + .timing_spec =3D &ad7626_timing_spec, + .chan_spec =3D AD7625_CHAN_SPEC(16), + .has_power_down_state =3D true, + .has_bandwidth_control =3D false, + .has_internal_vref =3D true, +}; + +static const struct ad7625_chip_info ad7960_chip_info =3D { + .name =3D "ad7960", + .max_sample_rate_hz =3D 5 * MEGA, + .timing_spec =3D &ad7960_timing_spec, + .chan_spec =3D AD7625_CHAN_SPEC(18), + .has_power_down_state =3D true, + .has_bandwidth_control =3D true, + .has_internal_vref =3D false, +}; + +static const struct ad7625_chip_info ad7961_chip_info =3D { + .name =3D "ad7961", + .max_sample_rate_hz =3D 5 * MEGA, + .timing_spec =3D &ad7960_timing_spec, + .chan_spec =3D AD7625_CHAN_SPEC(16), + .has_power_down_state =3D true, + .has_bandwidth_control =3D true, + .has_internal_vref =3D false, +}; + +enum ad7960_mode { + AD7960_MODE_POWER_DOWN, + AD7960_MODE_SNOOZE, + AD7960_MODE_NARROW_BANDWIDTH, + AD7960_MODE_WIDE_BANDWIDTH, + AD7960_MODE_TEST_PATTERN, +}; + +static void ad7625_pwm_disable(void *data) +{ + pwm_disable(data); +} + +static int ad7625_set_sampling_freq(struct ad7625_state *st, int freq) +{ + u64 target; + struct pwm_waveform clk_gate_wf =3D { }, cnv_wf =3D { }; + int ret; + + cnv_wf.period_length_ns =3D DIV_ROUND_UP_ULL(NSEC_PER_SEC, freq); + + /* + * Make sure that the CNV period doesn't exceed the datasheet + * maximum + */ + cnv_wf.period_length_ns =3D clamp(cnv_wf.period_length_ns, 100, 10 * KILO= ); + + /* + * Use the maximum conversion time t_CNVH from the datasheet as + * the duty_cycle for ref_clk, cnv, and clk_gate + */ + cnv_wf.duty_length_ns =3D st->info->timing_spec->conv_high_ns; + + ret =3D pwm_set_waveform_might_sleep(st->cnv_pwm, &cnv_wf, false); + if (ret < 0) + return ret; + + /* + * Set up the burst signal for transferring data. period and + * offset should mirror the CNV signal + */ + clk_gate_wf.period_length_ns =3D cnv_wf.period_length_ns; + + clk_gate_wf.duty_length_ns =3D DIV_ROUND_UP_ULL((u64)NSEC_PER_SEC * + st->info->chan_spec.scan_type.realbits, + st->ref_clk_rate_hz); + + /* max t_MSB from datasheet */ + clk_gate_wf.duty_offset_ns =3D st->info->timing_spec->conv_msb_ns; + + ret =3D pwm_set_waveform_might_sleep(st->clk_gate_pwm, &clk_gate_wf, fals= e); + if (ret < 0) + return ret; + + /* TODO: Add a rounding API for PWMs that can simplify this */ + target =3D DIV_ROUND_CLOSEST_ULL(st->ref_clk_rate_hz, freq); + st->sampling_freq_hz =3D DIV_ROUND_CLOSEST_ULL(st->ref_clk_rate_hz, targe= t); + + return 0; +} + +static int devm_ad7625_pwm_get(struct device *dev, struct clk *ref_clk, + struct ad7625_state *st) +{ + unsigned long ref_clk_rate_hz; + int ret; + + st->cnv_pwm =3D devm_pwm_get(dev, "cnv"); + if (IS_ERR(st->cnv_pwm)) + return dev_err_probe(dev, PTR_ERR(st->cnv_pwm), + "failed to get cnv pwm\n"); + + ret =3D devm_add_action_or_reset(dev, ad7625_pwm_disable, st->cnv_pwm); + if (ret) + return ret; + + st->clk_gate_pwm =3D devm_pwm_get(dev, "clk_gate"); + if (IS_ERR(st->clk_gate_pwm)) + return dev_err_probe(dev, PTR_ERR(st->clk_gate_pwm), + "failed to get clk_gate pwm\n"); + + ret =3D devm_add_action_or_reset(dev, ad7625_pwm_disable, + st->clk_gate_pwm); + if (ret) + return ret; + + ref_clk =3D devm_clk_get_enabled(dev, NULL); + if (IS_ERR(ref_clk)) + return dev_err_probe(dev, PTR_ERR(ref_clk), + "failed to get ref_clk"); + + ref_clk_rate_hz =3D clk_get_rate(ref_clk); + if (!ref_clk_rate_hz) + return dev_err_probe(dev, -EINVAL, + "failed to get ref_clk rate"); + + st->ref_clk_rate_hz =3D ref_clk_rate_hz; + + return 0; +} + +static int ad7625_read_raw(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + int *val, int *val2, long info) +{ + struct ad7625_state *st =3D iio_priv(indio_dev); + + switch (info) { + case IIO_CHAN_INFO_SAMP_FREQ: + *val =3D st->sampling_freq_hz; + + return IIO_VAL_INT; + + case IIO_CHAN_INFO_SCALE: + *val =3D st->vref_mv; + *val2 =3D chan->scan_type.realbits - 1; + + return IIO_VAL_FRACTIONAL_LOG2; + + default: + return -EINVAL; + } +} + +static int ad7625_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int val, int val2, long info) +{ + struct ad7625_state *st =3D iio_priv(indio_dev); + + switch (info) { + case IIO_CHAN_INFO_SAMP_FREQ: + iio_device_claim_direct_scoped(return -EBUSY, indio_dev) + return ad7625_set_sampling_freq(st, val); + unreachable(); + default: + return -EINVAL; + } +} + +static const struct iio_info ad7625_info =3D { + .read_raw =3D ad7625_read_raw, + .write_raw =3D ad7625_write_raw, +}; + +static int ad7625_parse_mode(struct device *dev, struct ad7625_state *st, = int num_gpios) +{ + bool en_always_on[4], en_always_off[4], + en_may_be_on[4], en_may_be_off[4]; + char en_gpio_buf[4]; + char always_on_buf[18]; + int i; + + for (i =3D 0; i < num_gpios; i++) { + snprintf(en_gpio_buf, sizeof(en_gpio_buf), "en%d", i); + snprintf(always_on_buf, sizeof(always_on_buf), + "adi,en%d-always-on", i); + /* Set the device to 0b0000 (power-down mode) by default */ + st->en_gpios[i] =3D devm_gpiod_get_optional(dev, en_gpio_buf, + GPIOD_OUT_LOW); + if (IS_ERR(st->en_gpios[i])) + return dev_err_probe(dev, PTR_ERR(st->en_gpios[i]), + "failed to get EN%d GPIO\n", i); + + en_always_on[i] =3D device_property_present(dev, always_on_buf); + if (st->en_gpios[i] && en_always_on[i]) + return dev_err_probe(dev, -EINVAL, + "cannot have both adi,en%d-always-on and en%d-gpios\n", i, i); + + en_may_be_off[i] =3D !en_always_on[i]; + en_may_be_on[i] =3D en_always_on[i] || st->en_gpios[i]; + en_always_off[i] =3D !en_always_on[i] && !st->en_gpios[i]; + } + + /* + * Power down is mode 0bXX00, but not all devices have a valid + * power down state. + */ + st->can_power_down =3D en_may_be_off[1] && en_may_be_off[0] && + st->info->has_power_down_state; + /* + * The REFIN pin can take a 1.2V (AD762x) or 2.048V (AD796x) + * external reference when the mode is 0bXX01. + */ + st->can_refin =3D en_may_be_off[1] && en_may_be_on[0]; + /* 4.096V can be applied to REF when the EN mode is 0bXX10. */ + st->can_ref_4v096 =3D en_may_be_on[1] && en_may_be_off[0]; + + /* Avoid AD796x-specific setup if the part is an AD762x */ + if (num_gpios =3D=3D 2) + return 0; + + /* mode 0b1100 (AD796x) is invalid */ + if (en_always_on[3] && en_always_on[2] && en_always_off[1] && en_always_o= ff[0]) + return dev_err_probe(dev, -EINVAL, + "EN GPIOs set to invalid mode 0b1100\n"); + /* + * 5V can be applied to the AD796x REF pin when the EN mode is + * the same (0bX001 or 0bX101) as for can_refin, and REFIN is + * 0V. + */ + st->can_ref_5v =3D st->can_refin; + /* + * Bandwidth (AD796x) is controlled solely by EN2. If it's + * specified and not hard-wired, then we can configure it to + * change the bandwidth between 28MHz and 9MHz. + */ + st->can_narrow_bandwidth =3D en_may_be_on[2]; + /* Wide bandwidth mode is possible if EN2 can be 0. */ + st->can_wide_bandwidth =3D en_may_be_off[2]; + /* Snooze mode (AD796x) is 0bXX11 when REFIN =3D 0V. */ + st->can_snooze =3D en_may_be_on[1] && en_may_be_on[0]; + /* Test pattern mode (AD796x) is 0b0100. */ + st->can_test_pattern =3D en_may_be_off[3] && en_may_be_on[2] && + en_may_be_off[1] && en_may_be_off[0]; + + return 0; +} + +/* Set EN1 and EN0 based on reference voltage source */ +static void ad7625_set_en_gpios_for_vref(struct ad7625_state *st, bool hav= e_refin, int ref_mv) +{ + if (have_refin || ref_mv =3D=3D 5000) { + gpiod_set_value_cansleep(st->en_gpios[1], 0); + gpiod_set_value_cansleep(st->en_gpios[0], 1); + } else if (ref_mv =3D=3D 4096) { + gpiod_set_value_cansleep(st->en_gpios[1], 1); + gpiod_set_value_cansleep(st->en_gpios[0], 0); + /* + * Unreachable by AD796x, since the driver will error if neither + * REF nor REFIN is provided + */ + } else { + gpiod_set_value_cansleep(st->en_gpios[1], 1); + gpiod_set_value_cansleep(st->en_gpios[0], 1); + } +} + +static int ad7960_set_mode(struct ad7625_state *st, enum ad7960_mode mode, + bool have_refin, int ref_mv) +{ + switch (mode) { + case AD7960_MODE_POWER_DOWN: + if (!st->can_power_down) + return -EINVAL; + + gpiod_set_value_cansleep(st->en_gpios[2], 0); + gpiod_set_value_cansleep(st->en_gpios[1], 0); + gpiod_set_value_cansleep(st->en_gpios[0], 0); + return 0; + + case AD7960_MODE_SNOOZE: + if (!st->can_snooze) + return -EINVAL; + + gpiod_set_value_cansleep(st->en_gpios[1], 1); + gpiod_set_value_cansleep(st->en_gpios[0], 1); + return 0; + + case AD7960_MODE_NARROW_BANDWIDTH: + if (!st->can_narrow_bandwidth) + return -EINVAL; + + gpiod_set_value_cansleep(st->en_gpios[2], 1); + ad7625_set_en_gpios_for_vref(st, have_refin, ref_mv); + return 0; + + case AD7960_MODE_WIDE_BANDWIDTH: + if (!st->can_wide_bandwidth) + return -EINVAL; + + gpiod_set_value_cansleep(st->en_gpios[2], 0); + ad7625_set_en_gpios_for_vref(st, have_refin, ref_mv); + return 0; + + case AD7960_MODE_TEST_PATTERN: + if (!st->can_test_pattern) + return -EINVAL; + + gpiod_set_value_cansleep(st->en_gpios[3], 0); + gpiod_set_value_cansleep(st->en_gpios[2], 1); + gpiod_set_value_cansleep(st->en_gpios[1], 0); + gpiod_set_value_cansleep(st->en_gpios[0], 0); + return 0; + + default: + return -EINVAL; + } +} + +static int ad7625_probe(struct platform_device *pdev) +{ + /* + * Power-up info for the device says to bring up vio, then + * vdd2, then vdd1 + */ + static const char * const regulator_names[] =3D { "vio", "vdd2", "vdd1" }; + struct device *dev =3D &pdev->dev; + struct iio_dev *indio_dev; + struct ad7625_state *st; + struct clk *ref_clk; + int ret, ref_mv; + int default_sample_freq; + bool have_refin; + + indio_dev =3D devm_iio_device_alloc(dev, sizeof(*st)); + if (!indio_dev) + return -ENOMEM; + + st =3D iio_priv(indio_dev); + + st->info =3D device_get_match_data(dev); + if (!st->info) + return dev_err_probe(dev, -EINVAL, "no chip info\n"); + + ret =3D devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(regulator_names), + regulator_names); + if (ret) + return ret; + + if (st->info->has_bandwidth_control) + ret =3D ad7625_parse_mode(dev, st, 4); + else + ret =3D ad7625_parse_mode(dev, st, 2); + + if (ret) + return ret; + + /* + * Determine the source of the reference voltage: + * - internal reference: neither REF or REFIN is connected + * (invalid for AD796x) + * - internal buffer, external reference: REF not connected, + * is REFIN connected + * - external reference: REF connected, REFIN not connected + */ + ret =3D devm_regulator_get_enable_read_voltage(dev, "ref"); + if (ret < 0 && ret !=3D -ENODEV) + return dev_err_probe(dev, ret, "failed to get REF voltage\n"); + + ref_mv =3D ret =3D=3D -ENODEV ? 0 : ret / 1000; + + ret =3D devm_regulator_get_enable_optional(dev, "refin"); + if (ret < 0 && ret !=3D -ENODEV) + return dev_err_probe(dev, ret, "failed to get REFIN voltage\n"); + + have_refin =3D ret !=3D -ENODEV; + + if (have_refin && !st->can_refin) + return dev_err_probe(dev, -EINVAL, + "REFIN provided in unsupported mode\n"); + + if (!st->info->has_internal_vref && !have_refin && !ref_mv) + return dev_err_probe(dev, -EINVAL, + "Need either REFIN or REF"); + + if (have_refin && ref_mv) + return dev_err_probe(dev, -EINVAL, + "cannot have both REFIN and REF supplies\n"); + + st->vref_mv =3D ref_mv ?: AD7625_INTERNAL_REF_MV; + + if (ref_mv =3D=3D 4096 && !st->can_ref_4v096) + return dev_err_probe(dev, -EINVAL, + "REF is 4.096V in unsupported mode\n"); + + if (ref_mv =3D=3D 5000 && !st->can_ref_5v) + return dev_err_probe(dev, -EINVAL, + "REF is 5V in unsupported mode\n"); + + /* Set the device mode based on detected EN configuration. */ + if (!st->info->has_bandwidth_control) { + ad7625_set_en_gpios_for_vref(st, have_refin, ref_mv); + } else { + /* + * If neither sampling mode is available, then report an error, + * since the other modes are not useful defaults. + */ + if (st->can_wide_bandwidth) { + ret =3D ad7960_set_mode(st, AD7960_MODE_WIDE_BANDWIDTH, + have_refin, ref_mv); + } else if (st->can_narrow_bandwidth) { + ret =3D ad7960_set_mode(st, AD7960_MODE_NARROW_BANDWIDTH, + have_refin, ref_mv); + } else { + return dev_err_probe(dev, -EINVAL, + "couldn't set device to wide or narrow bandwidth modes\n"); + } + + if (ret) + return dev_err_probe(dev, -EINVAL, + "failed to set EN pins\n"); + } + + ret =3D devm_ad7625_pwm_get(dev, ref_clk, st); + if (ret) + return dev_err_probe(dev, -EINVAL, + "failed to set ref_clk_rate_hz\n"); + + indio_dev->channels =3D &st->info->chan_spec; + indio_dev->num_channels =3D 1; + indio_dev->name =3D st->info->name; + indio_dev->info =3D &ad7625_info; + + st->back =3D devm_iio_backend_get(dev, NULL); + if (IS_ERR(st->back)) + return dev_err_probe(dev, PTR_ERR(st->back), + "failed to get IIO backend"); + + ret =3D devm_iio_backend_request_buffer(dev, st->back, indio_dev); + if (ret) + return ret; + + ret =3D devm_iio_backend_enable(dev, st->back); + if (ret) + return ret; + + /* + * Set the initial sampling frequency to the maximum, unless the + * AD796x device is limited to narrow bandwidth, in which case + * the sampling frequency should be limited to 2MSPS + */ + if (!st->info->has_bandwidth_control) { + default_sample_freq =3D st->info->max_sample_rate_hz; + } else { + default_sample_freq =3D !st->can_wide_bandwidth ? AD7960_MAX_NBW_FREQ : + st->info->max_sample_rate_hz; + } + + ret =3D ad7625_set_sampling_freq(st, default_sample_freq); + if (ret < 0) + dev_err_probe(dev, ret, "failed to set sampling frequency\n"); + + return devm_iio_device_register(dev, indio_dev); +} + +static const struct of_device_id ad7625_of_match[] =3D { + { .compatible =3D "adi,ad7625", .data =3D &ad7625_chip_info, }, + { .compatible =3D "adi,ad7626", .data =3D &ad7626_chip_info, }, + { .compatible =3D "adi,ad7960", .data =3D &ad7960_chip_info, }, + { .compatible =3D "adi,ad7961", .data =3D &ad7961_chip_info, }, + { } +}; +MODULE_DEVICE_TABLE(of, ad7625_of_match); + +static const struct platform_device_id ad7625_device_ids[] =3D { + { .name =3D "ad7625", .driver_data =3D (kernel_ulong_t)&ad7625_chip_info = }, + { .name =3D "ad7626", .driver_data =3D (kernel_ulong_t)&ad7626_chip_info = }, + { .name =3D "ad7960", .driver_data =3D (kernel_ulong_t)&ad7960_chip_info = }, + { .name =3D "ad7961", .driver_data =3D (kernel_ulong_t)&ad7961_chip_info = }, + { } +}; +MODULE_DEVICE_TABLE(platform, ad7625_device_ids); + +static struct platform_driver ad7625_driver =3D { + .probe =3D ad7625_probe, + .driver =3D { + .name =3D "ad7625", + .of_match_table =3D ad7625_of_match, + }, + .id_table =3D ad7625_device_ids, +}; +module_platform_driver(ad7625_driver); + +MODULE_AUTHOR("Trevor Gamblin "); +MODULE_DESCRIPTION("Analog Devices AD7625 ADC"); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_IMPORT_NS(IIO_BACKEND); --=20 2.39.2 From nobody Mon Feb 9 12:47:59 2026 Received: from mail-qv1-f43.google.com (mail-qv1-f43.google.com [209.85.219.43]) (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 815701B3758 for ; Wed, 31 Jul 2024 13:48:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722433693; cv=none; b=th+xif7VKgGsvNc0z+bK8GfOLToFiW1+Lnl9II7gZMzl8gvjFan9iiKGlMvDWuaqmwnzniLxeVGr5lP+5wB6vbF0K3y2YhMgoe8h7G0beh9kMUjkvOSk2RY5MqG6mgBUX3BgoS7RG9Pg+XTfIeZyI7eLo9iRmqEv6yUHUjvqnfk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722433693; c=relaxed/simple; bh=GKmFo3bmFk2IVwRE7ksCrTnyul2s0DsTqMziI0uIR6M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gPZecJ3zYvlhzvQblXkYSJBQ1gZvm14LhBV3ZT49v2xZ5Yz4DfA1AY+bWp/4Q5kfdBKgDTHY+mrw5dxmxlUeifKBl9F0V5V03sR74V0Y2rZoqLlBCKgk0sIM6AW8OIhgm0ADyG5Xw2CGq+yh7QU+vbySxJbIsw7PgBYtNwN0Pmc= 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=mC9XmqHH; arc=none smtp.client-ip=209.85.219.43 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="mC9XmqHH" Received: by mail-qv1-f43.google.com with SMTP id 6a1803df08f44-6b797fb1c4aso39107776d6.2 for ; Wed, 31 Jul 2024 06:48:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1722433690; x=1723038490; 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=/5uzNUVmRh9vWTdDmOIKmWFbEDxFk4bBzY+xGs2C1kM=; b=mC9XmqHHRWIaRkAua6YWY2ANHgKWx+/6VgwLB51HgTCKWkw7pA2J5OnfWPgAnzmKsE A+FPnPTHTPVY/7fzz28XeBd8nCGzU5m7fTDYNDPVHcK/OXiTWLjYu8rNvxkzmiOV0DtJ 0qvqZNBVhTG5a4B/pTUfOR8CtSc30XIif0d9CMQjN2kjBFuIfJQiH6+TIUDSzX/p85E5 US/bfBcN2SvhoM5Kot8LmM8w8Db5luvbne1CfNqI0VPt+OSApRdPFr7kVW3epVgApLke 8kCwSC+TaN+rqtuGKAAIlaBKpmJgQIOhJPv53VBYtLbCGCelHy59D74IN49SAhL/T05S E9pQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722433690; x=1723038490; 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=/5uzNUVmRh9vWTdDmOIKmWFbEDxFk4bBzY+xGs2C1kM=; b=P2ljPXOXqw//o7KSzwIcNvVOcTjhH58iek9WmtzPQVeUsBRkjc/PQ/Kstd9m5ZNhuT I6zY2uEBAd8vSnkYg/RgwxFpT/Yt349t1Wo1MpMliXBB8pZms8edlJTsSW8C7ss6a1+X Wg4mY1PhsgW63n8ixZDb1eyW2gMJ3umGGBmwjXe8GPCaHN3zwawRGRoMVW5JzpOG2NR0 LNckuIXkYCdHX9rl5ManE6mt2QMblRKOhKFEsRnAW8OKgQNERAndJx/Zba4xjteAuhgj OGhK/omxR2j9m/lz9YkUJAzgiA6ZgMtWjT4OruaFr6SN9dxugliIrZETiZ9Fe6VjebJo wTtw== X-Forwarded-Encrypted: i=1; AJvYcCUAYxkRhZZ6F7Kjb8LFVvicN8/GuRO6jLcYczNVQf6zLcLGLlDcYgkd418FAV6gzJeA54fV4ja0LCyD/0wNQ0wG04Ng/hbihGaqqzn/ X-Gm-Message-State: AOJu0Yx2IBcwU0nWIMdy2/QuRb/CtyUh3JWxeoMudQjb2JpcuZje3YrZ WPve5iaf1ORkvoJJTor6t74DCGK+MHCOsZAplC/0GdR4ICWv669yvmtCc7iRjN+5+lStkU2MaZx 2 X-Google-Smtp-Source: AGHT+IENXE7gMX9n7xlozfsQwOgjRSJ79Q6Ieiz5vXJp14uZDTYVPDecol5LPvAzsx31osMEowdNBg== X-Received: by 2002:a05:620a:c4c:b0:79d:a265:cc95 with SMTP id af79cd13be357-7a1e52fbd12mr1534556885a.65.1722433690459; Wed, 31 Jul 2024 06:48:10 -0700 (PDT) Received: from [127.0.1.1] (d24-150-219-207.home.cgocable.net. [24.150.219.207]) by smtp.gmail.com with ESMTPSA id af79cd13be357-7a1d73955ccsm746209985a.11.2024.07.31.06.48.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 31 Jul 2024 06:48:10 -0700 (PDT) From: Trevor Gamblin Date: Wed, 31 Jul 2024 09:48:05 -0400 Subject: [PATCH RFC 3/3] docs: iio: new docs for ad7625 driver 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: <20240731-ad7625_r1-v1-3-a1efef5a2ab9@baylibre.com> References: <20240731-ad7625_r1-v1-0-a1efef5a2ab9@baylibre.com> In-Reply-To: <20240731-ad7625_r1-v1-0-a1efef5a2ab9@baylibre.com> To: Lars-Peter Clausen , Michael Hennerich , =?utf-8?q?Nuno_S=C3=A1?= , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jonathan Corbet , David Lechner , Uwe Kleine-Konig Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Trevor Gamblin X-Mailer: b4 0.14.1 Add documentation for the AD7625/AD7626/AD7960/AD7961 ADCs. Signed-off-by: Trevor Gamblin --- Documentation/iio/ad7625.rst | 91 ++++++++++++++++++++++++++++++++++++++++= ++++ MAINTAINERS | 1 + 2 files changed, 92 insertions(+) diff --git a/Documentation/iio/ad7625.rst b/Documentation/iio/ad7625.rst new file mode 100644 index 000000000000..61761e3b75c3 --- /dev/null +++ b/Documentation/iio/ad7625.rst @@ -0,0 +1,91 @@ +.. SPDX-License-Identifier: GPL-2.0-only + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +AD7625 driver +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +ADC driver for Analog Devices Inc. AD7625, AD7626, AD7960, and AD7961 +devices. The module name is ``ad7625``. + +Supported devices +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The following chips are supported by this driver: + +* `AD7625 `_ +* `AD7626 `_ +* `AD7960 `_ +* `AD7961 `_ + +The driver requires use of the Pulsar LVDS HDL project: + +* `Pulsar LVDS HDL `_ + +To trigger conversions and enable subsequent data transfer, the devices +require coupled PWM signals with a phase offset. + +Supported features +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Conversion control modes +------------------------ + +The driver currently supports one of two possible LVDS conversion control = methods. + +Echoed-Clock interface mode +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: + + +----------------+ + +xxxxxxxxxxxxxxxxxxxxxxxxxx| CNV | + X | | + v | HOST | + +----------------------------+ | | + | CNV+/CNV- DCO+/DCO- |xxxxxxx>| CLK_IN | + | | | | + | | | | + | AD7625 D+/D- |xxxxxxx>| DATA_IN | + | | | | + | | | | + | CLK+/CLK- |