From nobody Tue Nov 26 22:22:22 2024 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (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 7E4091AF0BB for ; Tue, 15 Oct 2024 13:56:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000598; cv=none; b=UK0tQp6VDUQpM1mVThLoS2J2mFRqkBnuOYuhHWBvi7tnS9Ydg7jmUnp/Nijk3gura8vWMHPau2htYFrqPCujQ9APblKn0G5Xq84ZsT3Arc8hQyaYh1QAQwzVM8pgTiHpLvYZsvLhv3wFlKUs1tWUw61JcmD5xKkjhJs4pTHrbBM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000598; c=relaxed/simple; bh=i5ddTg9UYKxycz6OdhvhiiZOyT6VwY+Z1+h88aZcdf0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iCHOqV++fI21bgicyPg7RgQiRIP9mFWj1yMHAyU2jswDGmAFR4yozOCDCj7JyrWyaPMi3JMoRYpuwK77FgFO0HssiwizdXo70xzuII5q7V8HRgGS423hOiSzAj7zSnXT8p5UBbnc7m9iRWZpSKOJZTKV4m4h0Ndt1F0kz28rrr4= 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=bkwCbjO2; arc=none smtp.client-ip=209.85.128.46 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="bkwCbjO2" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-4311ae6426aso36224965e9.2 for ; Tue, 15 Oct 2024 06:56:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1729000594; x=1729605394; 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=h90tf0LvnuADZLFwaf8lb54SaNEZPrEuE8XroohvsMM=; b=bkwCbjO22u16KPEhUyXuD5Ti6+jDiCI14G213A3xPUH5RSEYU4RdBF5XO47JYPQweJ 4vxHfGP10jmGV9L4kH77d6SnXVIecg+VRRlKXX5Z4x02/N2R0xQ6kBPy8bb8H7Y8ovkP 6/WSpcV436FO4ZEfe995ypH//abPAJOIK9asyyF6h36Ju+6d2lNW8hwb717kAfeXceYL t+iDG7l0/0VS3tNImaPim7XNXh5Jw2QbiiBBPeLJw6rB05mDal72yKkM5PJ7FrfsUHGG zhK9fK/JCOvLqfBbQ5WjmqSV8AOqFMICjvkUuFl1s2J4K0KRPvFB8qmrPbrB6PcPnveI 7U9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729000594; x=1729605394; 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=h90tf0LvnuADZLFwaf8lb54SaNEZPrEuE8XroohvsMM=; b=lb8dSmhJyAANxYMPEwVcP7oVFlqSsllcNBkLAp2k84dpJI0YCJxlQnizSmHrCS2EOb GqqkzXAgs01nz7FWZ09FmjGuVYg5XKkfbYrPnHP41LiF92vJY8/5kQDb7xpNpXxhhff1 5fYPzV8ms0PTilbex2tTMjYTFDl8ejvATS6CjSNY5Nj7dB9E5U1pZ/U2bZvuLuoJtmLD u1XNY5xgpNLAlW6KULnVohOJ/IYAnkR31PmZJlivLXO9dz6Cet5DkSZI6CIB1LNdEURR E+W/qM6l5Gg9sgvH8ZTDKwIIEs5M5VRypbfZWx5XaoVt2XpdUPVyY5KPHaFEiWa3uRb/ fRwg== X-Forwarded-Encrypted: i=1; AJvYcCXidnugxLlHtI74zrIMLCQlY6xc4j9m8fjHXtEDK9sI0BluXTTmkKL5lIhRwNKv1FUU2CshSLhFJ3OpNwc=@vger.kernel.org X-Gm-Message-State: AOJu0YzmdfOWI1R/xZqtWqHU3zyaZ3xd83eMB/tymD+c0a8jxZXj6eKk 0ocUbaqDhGWDHvDtQ3s4mfKoc4W5NSuCV2x1IPT7+zBDZHOayrUdsGu3TrlaQ0c= X-Google-Smtp-Source: AGHT+IHhf+9ITq2oLXri+liuyT6Hpb/e08PVQU+OeunYvA4yXrRxB3L9+6EuNBga9KUv0f7mcCsjBw== X-Received: by 2002:a05:600c:a55:b0:426:5e91:3920 with SMTP id 5b1f17b1804b1-4314a38454cmr5238565e9.29.1729000593672; Tue, 15 Oct 2024 06:56:33 -0700 (PDT) Received: from [127.0.1.1] (frhb82016ds.ikexpress.com. [185.246.87.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4313f56f241sm18848295e9.22.2024.10.15.06.56.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2024 06:56:33 -0700 (PDT) From: Guillaume Stols Date: Tue, 15 Oct 2024 13:56:14 +0000 Subject: [PATCH v5 1/8] dt-bindings: iio: adc: ad7606: Remove spi-cpha from required 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: <20241015-ad7606_add_iio_backend_support-v5-1-654faf1ae08c@baylibre.com> References: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> In-Reply-To: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Greg Kroah-Hartman , "Rafael J. Wysocki" , Jonathan Corbet Cc: linux-pwm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Hennerich , linux-fbdev@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, aardelean@baylibre.com, dlechner@baylibre.com, jstephan@baylibre.com, nuno.sa@analog.com, Jonathan Cameron , Guillaume Stols X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1729000592; l=2087; i=gstols@baylibre.com; s=20240417; h=from:subject:message-id; bh=i5ddTg9UYKxycz6OdhvhiiZOyT6VwY+Z1+h88aZcdf0=; b=llTDacqfiNiCfSV52+gxL6/KFEr/5JuV2k/zG3dq92qjaNDLxjZdNcY8PXfrKtsnYXPOlGj9J ACXaSkeJvUyCc2TpHBuXbitb1XHdWP2ebfTQRuoxa50grZfa4nvyjqv X-Developer-Key: i=gstols@baylibre.com; a=ed25519; pk=XvMm5WHuV67sGYOJZqIYzXndbaJOlNd8Q6li6vnb4Cs= The documentation is erroneously stating that spi-cpha is required, and the example is erroneously setting both spi-cpol and spi-cpha. According to the datasheet, only cpol should be set. On zedboard for instance, setting the devicetree as in the example will simply not work. Fixes: 416f882c3b40 ("dt-bindings: iio: adc: Migrate AD7606 documentation t= o yaml") Fixes: 6e33a125df66 ("dt-bindings: iio: adc: Add docs for AD7606 ADC") Reviewed-by: Rob Herring (Arm) Signed-off-by: Guillaume Stols --- Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml b/Do= cumentation/devicetree/bindings/iio/adc/adi,ad7606.yaml index bec7cfba52a7..47081c79a1cf 100644 --- a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml +++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml @@ -39,6 +39,11 @@ properties: "#size-cells": const: 0 =20 + # According to the datasheet, "Data is clocked in from SDI on the falling + # edge of SCLK, while data is clocked out on DOUTA on the rising edge of + # SCLK". Also, even if not stated textually in the datasheet, it is made + # clear on the diagrams that sclk idles at high. Subsequently, in case = SPI + # interface is used, the correct way is to only set spi-cpol. spi-cpha: true =20 spi-cpol: true @@ -168,7 +173,6 @@ patternProperties: required: - compatible - reg - - spi-cpha - avcc-supply - vdrive-supply - interrupts @@ -255,7 +259,6 @@ examples: reg =3D <0>; spi-max-frequency =3D <1000000>; spi-cpol; - spi-cpha; =20 avcc-supply =3D <&adc_vref>; vdrive-supply =3D <&vdd_supply>; @@ -288,7 +291,6 @@ examples: =20 spi-max-frequency =3D <1000000>; spi-cpol; - spi-cpha; =20 avcc-supply =3D <&adc_vref>; vdrive-supply =3D <&vdd_supply>; --=20 2.34.1 From nobody Tue Nov 26 22:22:22 2024 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (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 722081AF0C9 for ; Tue, 15 Oct 2024 13:56:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000598; cv=none; b=HZ8q3c8G+kObYY7OTVguCdQZyKklCB0BpgDyO2Oo3FjD1LELsdwTA+0a4Edb2t4XYXHEoLRXFbhPe5Yg0RvnPEbTcG6aF+y4vP/jw7SYE3uD6ySCmO2A1lYmfzrXGd4j4yDasghS3yJ6cQahUq78WcpogmV0Al/5wg7ExLWIBwk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000598; c=relaxed/simple; bh=cnL3eq0CvnDwIBAYvPykYoJ3Fx17pk9WK/iph6l0pIg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eT2RWk4vmPXq+ncMZaNxS5FN99lTujKp/ttK9NMOJU5Ho6EIbHoTWsuH6y6100XOV1/QMTuPO5SlkknQBmGc52Hi/wIrxumnsxOYXgWryZAR5CsFwOZOoah859Y18VVRhDtWj8t89l/JMcrYlEhH8Twcfa3A8J+1O4u4MpyerRU= 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=B5rwtgea; arc=none smtp.client-ip=209.85.128.48 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="B5rwtgea" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-43124843b04so30108335e9.2 for ; Tue, 15 Oct 2024 06:56:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1729000595; x=1729605395; 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=55EhiFz0eoHIW1OIthep7nNdg0DTxW/ypPJriA4rZJE=; b=B5rwtgearxZ/TLOBIiBcp81qCEVZGRm2xgfHccIM6cTHH3FpyqlTiHcG34JfAeK9Rm odLsQcxJUSzOtCuNMe5lRUNRwq6rgiZl8qG1LQozPA3VGRTItO34G00wqPrF6X5OE33Q Nz9ZOPnrO6ar8Ou6Low0gXmb0Yo7AxLknkv3+WVTTc71PAq1T4ftsyW9k4aHDYYyuA/X /1QuNG8Qeb+RYbYnra06NDqBionBUSjzWx6IG/j4Xz/LqqXzgwf7Vl3HHw1K8yxGTwW5 HZGKMt9yXWDRaeSOSm3wJ/EZtqgLGkwJLhAThzJYHKnM92NxiQG/axV1I8VCkOu6YxTK PoOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729000595; x=1729605395; 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=55EhiFz0eoHIW1OIthep7nNdg0DTxW/ypPJriA4rZJE=; b=mb2633TeNgyXi4Gnuit8lM85bc8tPV8e0tGbmPug72CSsVTBgxEh0G1p0e7xpZZzK4 hkAyi0kNuf6QVDqJKRNhJB/deVnYHQKJs9rcs4fC9OiISCJw3JHg7A/05sAG5bXShQwf Bb8sd9pU5ptdYp0XjNvB5y3Jv9Awn1Y291yyhqhb0VOVr6ifpz0SGEcrE1lx9Y6ypk7X NIvaEyPB8qH81wI4ZjVKweIvR2/voIseTPEklz/dYSG+eF7XymnznzLtiCGKK3GkUMH5 KQje6l2hY08htkvb3MQug8BuzNtIPN5ZLfSFEmW/Q5imxbAnb7fhXgP9UILIigj20ONF vh+g== X-Forwarded-Encrypted: i=1; AJvYcCUEZLzkMKJniWDHF8bxZLpLUQbP/8oHGIlDj8CWuFDZcIO6tz5bt9DUFqn0fHt2mfyroAe2oSszK1T/a1w=@vger.kernel.org X-Gm-Message-State: AOJu0YzscgcKUaOHf6afLAiSc8cnXxEPGB0WBtkcM+cMHiTM7nPh0A5k MMuib/o0AZ97cwEwcWikOIE0F6ER/lgr2PuqsJ4ckA8TvqjzS8nS/IhGq8Gzehg= X-Google-Smtp-Source: AGHT+IGFMDKNEZfRxjTgqBnidg/6QFPy8mj1gXNoC+c98Fc+Fn4B8+8Oa85J417KHNm+8nmGN9G1/A== X-Received: by 2002:a05:600c:1e07:b0:42c:b7e2:3bc3 with SMTP id 5b1f17b1804b1-4311deec1c6mr140344865e9.19.1729000594442; Tue, 15 Oct 2024 06:56:34 -0700 (PDT) Received: from [127.0.1.1] (frhb82016ds.ikexpress.com. [185.246.87.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4313f56f241sm18848295e9.22.2024.10.15.06.56.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2024 06:56:34 -0700 (PDT) From: Guillaume Stols Date: Tue, 15 Oct 2024 13:56:15 +0000 Subject: [PATCH v5 2/8] dt-bindings: iio: adc: ad7606: Add iio backend bindings 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: <20241015-ad7606_add_iio_backend_support-v5-2-654faf1ae08c@baylibre.com> References: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> In-Reply-To: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Greg Kroah-Hartman , "Rafael J. Wysocki" , Jonathan Corbet Cc: linux-pwm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Hennerich , linux-fbdev@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, aardelean@baylibre.com, dlechner@baylibre.com, jstephan@baylibre.com, nuno.sa@analog.com, Jonathan Cameron , Guillaume Stols X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1729000592; l=3731; i=gstols@baylibre.com; s=20240417; h=from:subject:message-id; bh=cnL3eq0CvnDwIBAYvPykYoJ3Fx17pk9WK/iph6l0pIg=; b=PJxGnQFCqsmZCxZJEICUrQtpGVcY7GNVmBguDsX09XW0o1CbFQHwQ6tO6N3Rrw4meySd4x+Kp nUo+B2XDDfSA9jOlj0PMXl1Nl6n0dFhgK/G3KWGFZL+Szc8pCSnqRLb X-Developer-Key: i=gstols@baylibre.com; a=ed25519; pk=XvMm5WHuV67sGYOJZqIYzXndbaJOlNd8Q6li6vnb4Cs= Add the required properties for iio-backend support, as well as an example and the conditions to mutually exclude interruption and conversion trigger with iio-backend. The iio-backend's function is to controls the communication, and thus the interruption pin won't be available anymore. As a consequence, the conversion pin must be controlled externally since we will miss information about when every single conversion cycle (i.e conversion + data transfer) ends, hence a PWM is introduced to trigger the conversions. Reviewed-by: Rob Herring (Arm) Signed-off-by: Guillaume Stols --- .../devicetree/bindings/iio/adc/adi,ad7606.yaml | 64 ++++++++++++++++++= +++- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml b/Do= cumentation/devicetree/bindings/iio/adc/adi,ad7606.yaml index 47081c79a1cf..0a612844029a 100644 --- a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml +++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml @@ -129,6 +129,29 @@ properties: assumed that the pins are hardwired to VDD. type: boolean =20 + pwms: + description: + In case the conversion is triggered by a PWM instead of a GPIO plugg= ed to + the CONVST pin, the PWM must be referenced. + The first is the PWM connected to CONVST or CONVST1 for the chips wi= th the + 2nd PWM connected to CONVST2, if CONVST2 is available and not shorte= d to + CONVST1. + minItems: 1 + maxItems: 2 + + pwm-names: + items: + - const: convst1 + - const: convst2 + + io-backends: + description: + A reference to the iio-backend, which is responsible handling the BU= SY + pin's falling edge and communication. + An example of backend can be found at + http://analogdevicesinc.github.io/hdl/library/axi_ad7606x/index.html + + patternProperties: "^channel@[1-8]$": type: object @@ -175,12 +198,22 @@ required: - reg - avcc-supply - vdrive-supply - - interrupts - - adi,conversion-start-gpios =20 allOf: - $ref: /schemas/spi/spi-peripheral-props.yaml# =20 + - oneOf: + - required: + - adi,conversion-start-gpios + - required: + - pwms + + - oneOf: + - required: + - interrupts + - required: + - io-backends + - if: properties: compatible: @@ -222,6 +255,10 @@ allOf: adi,sw-mode: false else: properties: + pwms: + maxItems: 1 + pwm-names: + maxItems: 1 adi,conversion-start-gpios: maxItems: 1 =20 @@ -247,6 +284,29 @@ allOf: unevaluatedProperties: false =20 examples: + - | + #include + iio-backend { + #address-cells =3D <1>; + #size-cells =3D <0>; + adi_adc@0 { + compatible =3D "adi,ad7606b"; + reg =3D <0>; + pwms =3D <&axi_pwm_gen 0 0>; + + avcc-supply =3D <&adc_vref>; + vdrive-supply =3D <&vdd_supply>; + + reset-gpios =3D <&gpio0 91 GPIO_ACTIVE_HIGH>; + standby-gpios =3D <&gpio0 90 GPIO_ACTIVE_LOW>; + adi,range-gpios =3D <&gpio0 89 GPIO_ACTIVE_HIGH>; + adi,oversampling-ratio-gpios =3D <&gpio0 88 GPIO_ACTIVE_HIGH + &gpio0 87 GPIO_ACTIVE_HIGH + &gpio0 86 GPIO_ACTIVE_HIGH>; + io-backends =3D <&iio_backend>; + }; + }; + - | #include #include --=20 2.34.1 From nobody Tue Nov 26 22:22:22 2024 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (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 797FF1B2181 for ; Tue, 15 Oct 2024 13:56:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000601; cv=none; b=NHEgYCq2VN9Yjf2rrOvrL98CsjWCV5JG01YFlYjAfUwno5WtpI2MXvdADUZoUUZwVWI9J6feMKVYbz/LrEZViTU0px9nhvcWhvgzQh1IIaAGdENV0jihvQo+lC6BEpBdxcwt8iVn+80iXlQLSE/GD/hIX/OYZU3s+UdhkI0GlW0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000601; c=relaxed/simple; bh=gYRorQljls7gnt12GddZsLRjR3XCK4N21cRs97XBdSo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=f2LUJyU/F/RrQPnzEQ0h/ITFQL9j/rewhXgOEmpKDASxA6TUbzn8dhxXhPakMUZRNnf8FK0p2aUiflIBIzZU6E6gz5UrQiYbV/9cCeMbH4oKQoIJ3hLhhtEFKt/24VvvdyPOzxaZEh0nPKRdbfOlToB9hQDvht49Q/Y8BA1qc74= 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=Irb1BO8+; arc=none smtp.client-ip=209.85.128.53 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="Irb1BO8+" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-43144f656f0so4589325e9.0 for ; Tue, 15 Oct 2024 06:56:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1729000596; x=1729605396; 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=sk/w3JDfBS2L8TPVXoFuYtPWj8vcuMKf6135lmNzEF8=; b=Irb1BO8+TczeyOpA1Ch0D2JSZ+s3zG4r7icI+W2fzn8boS+AgW/GHGje9L4VmRqgMw rISH67CzXFcuj5C4bljgTdsxLeiKDr9YiOuR07rZoqB7iNBHJNxZzv6giHNEkBGcNSEn b+8MxgvQkhycbYDCMfYpVc9rO1ZSt8f3dTXQVuOB8CiqtiVsF1ise3ulw8ipNKgq0AtY dXl8VuxwEqTZK1xTVxYUM3FzDCHMFiLvEy/mVVN+qRAgPMBMN0LCvIrRquo4mPb5nsxo svAUoS2EhpMjEjewVngQl7G1vLPONirxCVPBbdrH1wyWYRSmWpbSJtxuCxWWKbdVgI+X lL9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729000596; x=1729605396; 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=sk/w3JDfBS2L8TPVXoFuYtPWj8vcuMKf6135lmNzEF8=; b=liz6Grs01QBjM95NW8QE1K1aheJ1uh7pk6256phV0jruCw5MB+UtaigJD07bUwj9Aj V8HeB5/LmQ1KqDeWXCymReSxgkq1jGTDeVagTJD8zOklsNorITa7aVPRW6F/fWUxwxa/ pVetoDAlNbXihky4ckH9Bm3VOwG26ttYGM/GTUj8mDZg5C0iy093OiFNXZ8PzhnhsKPs R9U/Knhw4sGYGyNww7eLb4sNZsjo+ruqIDFy/WO/560F8WamF2yRh4xbEUDqtK7oNtCV Y7qf1CzAz94jCOMMU1kFz91hNG4HYFFdXJt1u8r9JyT3ANE1fg539DGNA3uERJ3PopUC lWPg== X-Forwarded-Encrypted: i=1; AJvYcCVZ3OPb0w3Ev7ZUKqh5AhRxOzXTmkualLQRL/DHerfCUiEJ12Mpm6p8CsMrW/6hmkPxX5qwAy0pRnTjmsA=@vger.kernel.org X-Gm-Message-State: AOJu0Yw3A7M8yX1wuGXMo/kWCqfJYLWdSRCiP7A62oWSk7L/LhtAnzEA AYLpyZoRr0MoSOCSMMSAl97+uXC6BolUytDIrEaIk8hFXgLZFTUZC3LOoU16BtM= X-Google-Smtp-Source: AGHT+IHH3ayd9kjunKCi0fcv1oW7BSHl+Fqgjznie8H85E156jTz9ETEojZnazg/dV1kxTApadLXbw== X-Received: by 2002:a05:600c:3b0d:b0:428:10d7:a4b1 with SMTP id 5b1f17b1804b1-4311df56e7bmr135747445e9.25.1729000595270; Tue, 15 Oct 2024 06:56:35 -0700 (PDT) Received: from [127.0.1.1] (frhb82016ds.ikexpress.com. [185.246.87.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4313f56f241sm18848295e9.22.2024.10.15.06.56.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2024 06:56:34 -0700 (PDT) From: Guillaume Stols Date: Tue, 15 Oct 2024 13:56:16 +0000 Subject: [PATCH v5 3/8] Documentation: iio: Document ad7606 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: <20241015-ad7606_add_iio_backend_support-v5-3-654faf1ae08c@baylibre.com> References: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> In-Reply-To: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Greg Kroah-Hartman , "Rafael J. Wysocki" , Jonathan Corbet Cc: linux-pwm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Hennerich , linux-fbdev@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, aardelean@baylibre.com, dlechner@baylibre.com, jstephan@baylibre.com, nuno.sa@analog.com, Jonathan Cameron , Guillaume Stols X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1729000592; l=6859; i=gstols@baylibre.com; s=20240417; h=from:subject:message-id; bh=gYRorQljls7gnt12GddZsLRjR3XCK4N21cRs97XBdSo=; b=Oup2lEs68aPov+l9kBPkGocBP+fxR3rFBu8pSGtAEJLWbIMWOT+Kpkk5kuVkBzWEMTWbaAZ0l 5f0/2Ahg83UDGW2sF9wHT3PA6FcSPErEglRPaNC5risPwwgSSN1foNF X-Developer-Key: i=gstols@baylibre.com; a=ed25519; pk=XvMm5WHuV67sGYOJZqIYzXndbaJOlNd8Q6li6vnb4Cs= The Analog Devices Inc. AD7606 (and similar chips) are complex ADCs that will benefit from a detailed driver documentation. This documents the current features supported by the driver. Signed-off-by: Guillaume Stols --- Documentation/iio/ad7606.rst | 145 +++++++++++++++++++++++++++++++++++++++= ++++ Documentation/iio/index.rst | 1 + MAINTAINERS | 1 + 3 files changed, 147 insertions(+) diff --git a/Documentation/iio/ad7606.rst b/Documentation/iio/ad7606.rst new file mode 100644 index 000000000000..a1173708b489 --- /dev/null +++ b/Documentation/iio/ad7606.rst @@ -0,0 +1,145 @@ +.. SPDX-License-Identifier: GPL-2.0-only + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +AD7606 driver +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +ADC driver for Analog Devices Inc. AD7606 and similar devices. The module = name +is ``ad7606``. + +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: + +* `AD7605 `_ +* `AD7606 `_ +* `AD7606B `_ +* `AD7616 `_ + +Supported features +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +SPI wiring modes +---------------- + +These ADCs can output data on several SDO lines (1/2/4/8). The driver +currently supports only 1 SDO line. + +Parallel wiring mode +-------------------- + +There is also a parallel interface, with 16 lines (that can be reduced to = 8 in +byte mode). The parallel interface is selected by declaring the device as +platform in the device tree (with no io-backends node defined, see below). + +IIO-backend mode +---------------- + +This mode allows to reach the best sample rates, but it requires an extern= al +hardware (eg HDL or APU) to handle the low level communication. +The backend mode is enabled when through the definition of the "io-backend= s" +property in the device tree. + +The reference configuration for the current implementation of IIO-backend = mode +is the HDL reference provided by ADI: +https://wiki.analog.com/resources/eval/user-guides/ad7606x-fmc/hdl + +This implementation embeds an IIO-backend compatible IP (adi-axi-adc) and = a PWM +connected to the conversion trigger pin. + +.. code-block:: + + +---+ +-------------------------= --- + | | +-------+ |AD76xx + | A | controls | | | + | D |-------------->| PWM |-------------->| cnvst + | 7 | | | | + | 6 | +-------+ | + | 0 | controls +-----------+-----------+ | + | 6 |---------->| | |<--| frstdata + | | | Backend | Backend |<--| busy + | D | | Driver | | | + | R | | | |-->| clk + | I | requests |+---------+| DMA | | + | V |----------->| Buffer ||<---- |<=3D>| DATA + | E | |+---------+| | | + | R | +-----------+-----------+ | + | |-------------------------------------->| reset/configuration gpios + +---+ +-------------------------= ---- + + +Software and hardware modes +--------------------------- + +While all the AD7606/AD7616 series parts can be configured using GPIOs, so= me of +them can be configured using register. + +The chips that support software mode have more values available for config= uring +the device, as well as more settings, and allow to control the range and +calibration per channel. + +The following settings are available per channel in software mode: + - Scale + +Also, there is a broader choice of oversampling ratios in software mode. + +Conversion triggering +--------------------- + +The conversion can be triggered by two distinct ways: + + - A GPIO is connected to the conversion trigger pin, and this GPIO is con= trolled + by the driver directly. In this configuration, the driver sets back the + conversion trigger pin to high as soon as it has read all the conversio= ns. + + - An external source is connected to the conversion trigger pin. In the + current implementation, it must be a PWM. In this configuration, the dr= iver + does not control directly the conversion trigger pin. Instead, it can + control the PWM's frequency. This trigger is enabled only for iio-backe= nd. + +Reference voltage +----------------- + +2 possible reference voltage sources are supported: + + - Internal reference (2.5V) + - External reference (2.5V) + +The source is determined by the device tree. If ``refin-supply`` is presen= t, +then the external reference is used, otherwise the internal reference is u= sed. + +Oversampling +------------ + +This family supports oversampling to improve SNR. +In software mode, the following ratios are available: +1 (oversampling disabled)/2/4/8/16/32/64/128/256. + +Unimplemented features +---------------------- + +- 2/4/8 SDO lines +- CRC indication +- Calibration + +Device buffers +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +IIO triggered buffer +-------------------- + +This driver supports IIO triggered buffers, with a "built in" trigger, i.e= the +trigger is allocated and linked by the driver, and a new conversion is tri= ggered +as soon as the samples are transferred, and a timestamp channel is added t= o make +up for the potential jitter induced by the delays in the interrupt handlin= g. + +IIO backend buffer +------------------ + +When IIO backend is used, the trigger is not needed, and the sample rate is +considered as stable. There is no timestamp channel. The communication is +delegated to an external logic, called a backend, and the backend's driver +handles the buffer. When this mode is enabled, the driver cannot control t= he +conversion pin, because the busy pin is bound to the backend. + diff --git a/Documentation/iio/index.rst b/Documentation/iio/index.rst index dfcf9618568a..88bc36326b74 100644 --- a/Documentation/iio/index.rst +++ b/Documentation/iio/index.rst @@ -21,6 +21,7 @@ Industrial I/O Kernel Drivers ad4000 ad4695 ad7380 + ad7606 ad7944 adis16475 adis16480 diff --git a/MAINTAINERS b/MAINTAINERS index 32719c014888..2793a5765fa8 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1572,6 +1572,7 @@ F: Documentation/ABI/testing/sysfs-bus-iio-frequency-= adf4350 F: Documentation/devicetree/bindings/iio/*/adi,* F: Documentation/devicetree/bindings/iio/adc/lltc,ltc2496.yaml F: Documentation/devicetree/bindings/iio/adc/lltc,ltc2497.yaml +F: Documentation/iio/ad7606.rst F: drivers/iio/*/ad* F: drivers/iio/adc/ltc249* F: drivers/iio/amplifiers/hmc425a.c --=20 2.34.1 From nobody Tue Nov 26 22:22:22 2024 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (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 2A9511B2189 for ; Tue, 15 Oct 2024 13:56:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000601; cv=none; b=W801CSU7TOwpC3PL/SAvY5JcERmtFmX6TzgIFs2QzuEnDXSUoLDPJ/H/mjLjwki0cP2Sda0/YEblYHGFgOlwgg7Ca/g2So+zEjSKI++Pk6Lx9u0tVnOcS7rmqHGOzb7PaG2GbJQsLTfPCFUfkydamCXMQKqsx71X2UtgwZV/iPs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000601; c=relaxed/simple; bh=bd+nWTyfJcwbii4A58CUizm8w3dMDkWk2+CdLjB+yGU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=u3b/tUmtxrDcD/grPb1JtQC5tNtTUXpunn6mTkhZFeMa6YFJ+6s65XJyGZ6Er0qO9vxEUKW1Y+AMejMFBToDgNsywGxvNMPh5eKWsEfVk17f1PcEQ62XbduxFU+cC4EjClarWB+z7D5E3QUVbdJHbA0STQ4qU07gW26z/t5Ilq8= 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=Pcxor0aQ; arc=none smtp.client-ip=209.85.128.50 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="Pcxor0aQ" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-4314c452180so204085e9.0 for ; Tue, 15 Oct 2024 06:56:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1729000596; x=1729605396; 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=KKS7B10FNwBsSHhexRWQdA1j1LuMEJVL7bASAbjk2ME=; b=Pcxor0aQVY5bPpHsZ1ObIx7AweYHoaeG+FpF94lg3JBo5ax6nYZNBeShkSlA1I3mCl 6O533/dimHCYRlw7jYBHHnsqwLQ4UO13vIMPPerXMDhfxJlg6FkPnLfYRGmmC15QKfox qxY9DEjhrIOy9FPevprZjvkG+Lu/upv/ne0JRwkcvkiN4NwVKdrsGi1c+Lr1uSA/2KyF IDl3k6AylZxPZtwiVXaiGHPvNyUy0SZ5NIIeKstbhdw65DCvwZXNLSALm4lgOg/0MmBe aN73+Pq4odSwtZmeYCvK4BHTC1nHVXvyEGu74HVbia0PanaX7pDD1UCbD2RAjqFdyssn AQmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729000596; x=1729605396; 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=KKS7B10FNwBsSHhexRWQdA1j1LuMEJVL7bASAbjk2ME=; b=sB/yL1NI09wrNqCdN0Erd5b6PnXhn2g19VkvflsFdIhbLCuRUMGbo+c4/5/LEF75hP VIHmiUglbhB+/X/BuJCHoq+1aGjws21eDSbbSd1nF2Uufkgxw6YcXqf2sOaSLGKpAlvl +b74U6mgqhGshhGizHXvG3GCB5zuzgISrP7OM/A9oXCNXbD/NOrqj7pNK6UrqFWOSavS YNSfxjQsQot8a0yzQ+XlaZDiVgmi/lBxcQ6oNph0ZZ5fJb3ow5ScPpvTcG3vqCGyaJxf W8Y5Ps4lQ6vcLw8y3GGFzWUGMX8Li4Nd9KtdF1fJdbkFa2s7KsKDVrsPh+2beRG/vvQV qAhA== X-Forwarded-Encrypted: i=1; AJvYcCUX9df8fILsqUGQ+tdTHO9EcOkYkBu/TQGMrIkPmRE5otPzaytrlwXb2QYKJEQeCTZ3wfHBdXshoHw2SKs=@vger.kernel.org X-Gm-Message-State: AOJu0Yyqgp9bOJIZM73XNQIRVa5WGRaFxUzkgr4FRX1lRUJNBtcMqW/C DUEZM5TOwzT1l6lt4gwSdFiv4aZ9BmBZ8HPRQayR0Xhbn/9aDrMPAAbk5CquuYg= X-Google-Smtp-Source: AGHT+IEBRPWh4WaHUL1fzOUqJq2sNAoGnCnbVu5ytpPYpIo+QrCHM8Zr1G2TyYRjysHdnE9r7I7YNQ== X-Received: by 2002:a5d:5103:0:b0:37d:5251:e5ad with SMTP id ffacd0b85a97d-37d862663f8mr589851f8f.2.1729000596040; Tue, 15 Oct 2024 06:56:36 -0700 (PDT) Received: from [127.0.1.1] (frhb82016ds.ikexpress.com. [185.246.87.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4313f56f241sm18848295e9.22.2024.10.15.06.56.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2024 06:56:35 -0700 (PDT) From: Guillaume Stols Date: Tue, 15 Oct 2024 13:56:17 +0000 Subject: [PATCH v5 4/8] iio: adc: ad7606: Add PWM support for conversion trigger 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: <20241015-ad7606_add_iio_backend_support-v5-4-654faf1ae08c@baylibre.com> References: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> In-Reply-To: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Greg Kroah-Hartman , "Rafael J. Wysocki" , Jonathan Corbet Cc: linux-pwm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Hennerich , linux-fbdev@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, aardelean@baylibre.com, dlechner@baylibre.com, jstephan@baylibre.com, nuno.sa@analog.com, Jonathan Cameron , Guillaume Stols X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1729000592; l=8616; i=gstols@baylibre.com; s=20240417; h=from:subject:message-id; bh=bd+nWTyfJcwbii4A58CUizm8w3dMDkWk2+CdLjB+yGU=; b=PvXMUBVdGsZy045vMiACl3bL1rju7K2bDU3f4FQ2Q9dsFs5BGOOOeQHqRJKxDvnWZyacO3udq WDfbrDfJoMzC/TbjvV3Z7evxYSlx+PVwOj/nRfHiAiBazkg6aZtlfM0 X-Developer-Key: i=gstols@baylibre.com; a=ed25519; pk=XvMm5WHuV67sGYOJZqIYzXndbaJOlNd8Q6li6vnb4Cs= Until now, the conversion were triggered by setting high the GPIO connected to the convst pin. This commit gives the possibility to connect the convst pin to a PWM. Connecting a PWM allows to have a better control on the samplerate, but it must be handled with care, as it is completely decorrelated of the driver's busy pin handling. Hence it is not recommended to be used "as is" but must be exploited in conjunction with IIO backend, and for now only a mock functionality is enabled, i.e PWM never swings, but is used as a GPIO, i.e duty_cycle =3D=3D period equals high state, duty_cycle =3D=3D 0 equals low state. This mock functionality will be disabled after the IIO backend usecase is introduced. Signed-off-by: Guillaume Stols --- drivers/iio/adc/ad7606.c | 147 +++++++++++++++++++++++++++++++++++++++++++= +--- drivers/iio/adc/ad7606.h | 2 + 2 files changed, 142 insertions(+), 7 deletions(-) diff --git a/drivers/iio/adc/ad7606.c b/drivers/iio/adc/ad7606.c index 71362eafe838..dd4e0c6fce3e 100644 --- a/drivers/iio/adc/ad7606.c +++ b/drivers/iio/adc/ad7606.c @@ -13,10 +13,12 @@ #include #include #include +#include #include #include #include #include +#include #include =20 #include @@ -299,6 +301,73 @@ static int ad7606_reg_access(struct iio_dev *indio_dev, } } =20 +static int ad7606_pwm_set_high(struct ad7606_state *st) +{ + struct pwm_state cnvst_pwm_state; + int ret; + + pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); + cnvst_pwm_state.enabled =3D true; + cnvst_pwm_state.duty_cycle =3D cnvst_pwm_state.period; + + ret =3D pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); + /* sleep 2 =C2=B5S to let finish the current pulse */ + fsleep(2); + + return ret; +} + +static int ad7606_pwm_set_low(struct ad7606_state *st) +{ + struct pwm_state cnvst_pwm_state; + int ret; + + pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); + cnvst_pwm_state.enabled =3D true; + cnvst_pwm_state.duty_cycle =3D 0; + + ret =3D pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); + /* sleep 2 =C2=B5S to let finish the current pulse */ + fsleep(2); + + return ret; +} + +static bool ad7606_pwm_is_swinging(struct ad7606_state *st) +{ + struct pwm_state cnvst_pwm_state; + + pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); + + return cnvst_pwm_state.duty_cycle !=3D cnvst_pwm_state.period && + cnvst_pwm_state.duty_cycle !=3D 0; +} + +static int ad7606_set_sampling_freq(struct ad7606_state *st, unsigned long= freq) +{ + struct pwm_state cnvst_pwm_state; + bool is_swinging =3D ad7606_pwm_is_swinging(st); + bool is_high; + + if (freq =3D=3D 0) + return -EINVAL; + + /* Retrieve the previous state. */ + pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); + is_high =3D cnvst_pwm_state.duty_cycle =3D=3D cnvst_pwm_state.period; + + cnvst_pwm_state.period =3D DIV_ROUND_UP_ULL(NSEC_PER_SEC, freq); + cnvst_pwm_state.polarity =3D PWM_POLARITY_NORMAL; + if (is_high) + cnvst_pwm_state.duty_cycle =3D cnvst_pwm_state.period; + else if (is_swinging) + cnvst_pwm_state.duty_cycle =3D cnvst_pwm_state.period / 2; + else + cnvst_pwm_state.duty_cycle =3D 0; + + return pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); +} + static int ad7606_read_samples(struct ad7606_state *st) { unsigned int num =3D st->chip_info->num_channels - 1; @@ -324,7 +393,13 @@ static irqreturn_t ad7606_trigger_handler(int irq, voi= d *p) error_ret: iio_trigger_notify_done(indio_dev->trig); /* The rising edge of the CONVST signal starts a new conversion. */ - gpiod_set_value(st->gpio_convst, 1); + if (st->gpio_convst) { + gpiod_set_value(st->gpio_convst, 1); + } else { + ret =3D ad7606_pwm_set_high(st) + if (ret < 0) + dev_err(st->dev, "Could not set PWM to high."); + } =20 return IRQ_HANDLED; } @@ -337,7 +412,13 @@ static int ad7606_scan_direct(struct iio_dev *indio_de= v, unsigned int ch, const struct iio_chan_spec *chan; int ret; =20 - gpiod_set_value(st->gpio_convst, 1); + if (st->gpio_convst) { + gpiod_set_value(st->gpio_convst, 1); + } else { + ret =3D ad7606_pwm_set_high(st); + if (ret < 0) + return ret; + } ret =3D wait_for_completion_timeout(&st->completion, msecs_to_jiffies(1000)); if (!ret) { @@ -363,6 +444,11 @@ static int ad7606_scan_direct(struct iio_dev *indio_de= v, unsigned int ch, } =20 error_ret: + if (!st->gpio_convst) { + ret =3D ad7606_pwm_set_low(st); + if (ret < 0) + return ret; + } gpiod_set_value(st->gpio_convst, 0); =20 return ret; @@ -662,8 +748,9 @@ static int ad7606_request_gpios(struct ad7606_state *st) { struct device *dev =3D st->dev; =20 - st->gpio_convst =3D devm_gpiod_get(dev, "adi,conversion-start", - GPIOD_OUT_LOW); + st->gpio_convst =3D devm_gpiod_get_optional(dev, "adi,conversion-start", + GPIOD_OUT_LOW); + if (IS_ERR(st->gpio_convst)) return PTR_ERR(st->gpio_convst); =20 @@ -705,14 +792,24 @@ static irqreturn_t ad7606_interrupt(int irq, void *de= v_id) { struct iio_dev *indio_dev =3D dev_id; struct ad7606_state *st =3D iio_priv(indio_dev); + int ret; =20 if (iio_buffer_enabled(indio_dev)) { - gpiod_set_value(st->gpio_convst, 0); + if (st->gpio_convst) { + gpiod_set_value(st->gpio_convst, 0); + } else { + ret =3D ad7606_pwm_set_low(st); + if (ret < 0) { + dev_err(st->dev, "PWM set low failed"); + goto done; + } + } iio_trigger_poll_nested(st->trig); } else { complete(&st->completion); } =20 +done: return IRQ_HANDLED; }; =20 @@ -731,7 +828,10 @@ static int ad7606_buffer_postenable(struct iio_dev *in= dio_dev) { struct ad7606_state *st =3D iio_priv(indio_dev); =20 - gpiod_set_value(st->gpio_convst, 1); + if (st->gpio_convst) + gpiod_set_value(st->gpio_convst, 1); + else + return ad7606_pwm_set_high(st); =20 return 0; } @@ -740,7 +840,10 @@ static int ad7606_buffer_predisable(struct iio_dev *in= dio_dev) { struct ad7606_state *st =3D iio_priv(indio_dev); =20 - gpiod_set_value(st->gpio_convst, 0); + if (st->gpio_convst) + gpiod_set_value(st->gpio_convst, 0); + else + return ad7606_pwm_set_low(st); =20 return 0; } @@ -874,6 +977,11 @@ static int ad7606_chan_scales_setup(struct iio_dev *in= dio_dev) return 0; } =20 +static void ad7606_pwm_disable(void *data) +{ + pwm_disable(data); +} + int ad7606_probe(struct device *dev, int irq, void __iomem *base_address, const char *name, unsigned int id, const struct ad7606_bus_ops *bops) @@ -950,6 +1058,31 @@ int ad7606_probe(struct device *dev, int irq, void __= iomem *base_address, if (ret) return ret; =20 + /* If convst pin is not defined, setup PWM. */ + if (!st->gpio_convst) { + st->cnvst_pwm =3D devm_pwm_get(dev, NULL); + if (IS_ERR(st->cnvst_pwm)) + return PTR_ERR(st->cnvst_pwm); + + /* The PWM is initialized at 1MHz to have a fast enough GPIO emulation. = */ + ret =3D ad7606_set_sampling_freq(st, 1 * MEGA); + if (ret) + return ret; + + ret =3D ad7606_pwm_set_low(st); + if (ret) + return ret; + + /* + * PWM is not disabled when sampling stops, but instead its duty cycle i= s set + * to 0% to be sure we have a "low" state. After we unload the driver, l= et's + * disable the PWM. + */ + ret =3D devm_add_action_or_reset(dev, ad7606_pwm_disable, + st->cnvst_pwm); + if (ret) + return ret; + } st->trig =3D devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name, iio_device_id(indio_dev)); diff --git a/drivers/iio/adc/ad7606.h b/drivers/iio/adc/ad7606.h index fc05a4afa3b8..760cf5e2ecb6 100644 --- a/drivers/iio/adc/ad7606.h +++ b/drivers/iio/adc/ad7606.h @@ -115,6 +115,7 @@ struct ad7606_chan_scale { * @bops bus operations (SPI or parallel) * @chan_scales scale configuration for channels * @oversampling oversampling selection + * @cnvst_pwm pointer to the PWM device connected to the cnvst pin * @base_address address from where to read data in parallel operation * @sw_mode_en software mode enabled * @oversampling_avail pointer to the array which stores the available @@ -142,6 +143,7 @@ struct ad7606_state { const struct ad7606_bus_ops *bops; struct ad7606_chan_scale chan_scales[AD760X_MAX_CHANNELS]; unsigned int oversampling; + struct pwm_device *cnvst_pwm; void __iomem *base_address; bool sw_mode_en; const unsigned int *oversampling_avail; --=20 2.34.1 From nobody Tue Nov 26 22:22:22 2024 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.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 244C61B21A9 for ; Tue, 15 Oct 2024 13:56:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000603; cv=none; b=pXuaWBjxPpNI44lbM8Ca2OrFtVJqL4fkaCDcDGWq2jFu7se3rp6xcgS3uwOuRC2R4gNwzi68YUYISGRZCwMxmCW0Id5HNsbKmF2+Hn6Vcfy+BNiiEZ/Li2rSGG1IDdpvqVR2LPDWptQ9DmhVgraaQ/xjzmiBMFQzhtUh26ZIv0o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000603; c=relaxed/simple; bh=p5W7C9eFQDZ97zIyZZtTH6VbXAEzZrNsKQ8f3gAiwNE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b3+XZICRn7Sn8wOr2JtSuNimM9Hh1Z5MTavbvmdOVvsxrGg11ygCfg6M3DboAFZjXzerictgD0dOnRNiS9zeGJqguAkeA7PMEldjX3XObgeTwvx8BMsVplbp8py3dPV0dlcDYCqbx2rYxjQ0ll3h7t/1krcdby7cy2RhZp/MVyk= 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=R5+Labys; arc=none smtp.client-ip=209.85.128.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="R5+Labys" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-4311420b63fso41243415e9.2 for ; Tue, 15 Oct 2024 06:56:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1729000597; x=1729605397; 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=5dNGaz3l6gqVCoOrgRrKVESyDKob5nGVERM1ufe0iOM=; b=R5+LabysKiKfn7fDQ3Wx6grx74ZhmyMzgIUZT/3a9eXn9zPEDdr/G8qneh+whrHkjF 446YmHjiHvmObrxB9K4b+cPYPcX3foDH8BTlBoSxYWc+R1jaaGGaGaDjbNE+Dcu42EMy aFQIaCIMJe+ACH+xXIlCfsG2v/AlMGIQqi/WmUQyqGh+0wZEDz+kRoAGSIv1z+wP8lwx Gtucf9UqgS1lA/Gmj02eK/NAtMhAFa1rfpnyyBj/aal9bqPeLoOk4GrEJoVQsMP8/GP9 GPhErANBPRv0XqxM8mG4JdMVGNDNIbklv/ZPYpX82l7jdGkLF65Q1hnpSx+d2DhiDXo1 dwOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729000597; x=1729605397; 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=5dNGaz3l6gqVCoOrgRrKVESyDKob5nGVERM1ufe0iOM=; b=NoOYEhFb+cu0E+jZ4U11h+pn/FbvXQ1nk20TpHxHv7v/mfDcVNKLzWoJ5X1K6VkYG+ 77JQ/KZyppA92gh4jHM8e3pz7Ql3mS7VW8aPF5diBVYdbOVFfxjK40zaxgdU2tzaewvu pfY5kEZ9BeI8R5jB13FGPpq3g62biaey75InoLVXXDrTSO5ux1nGK5UBOUbT0ALkdh3I p+gIis/HAnvmlhjwfmymDgFc3A7yToduEHFiVwrRW3fO9Q8FWRcQy0LcVi2fcJlzArtM MeWrE3Y7FZGSN8ElU1xedyjTky6ZkcbbvFvCjQ4fFrgiiZXbtKMnBbU5F2Zhlgdwo3Ds 6jRw== X-Forwarded-Encrypted: i=1; AJvYcCUn3eoW5sagydMIUH24UnUSUF0l7e8+B9FqmgvGuaKxVPzULhueKvoN8QdVoU4uMYZnvtfwY1eky7b5yQo=@vger.kernel.org X-Gm-Message-State: AOJu0YxYdl1Lybr5FqeDU0ZXzZe7N2DKXvG0vfeB2X013zqK0E50OMvN 0Q1Wkz02bkpEznp1TmO1kFDs/cg30lsafJnQGylTCxXZbspDzCzFDaP7i/SC6m8= X-Google-Smtp-Source: AGHT+IFIkh6dlqRoSYKOkKuRFQJg4MaUz3gdRyhlx7GycNkyrdUgLUu3pcYOyJBkdac3H/TC5zEe2w== X-Received: by 2002:a05:600c:3b8a:b0:426:6edf:6597 with SMTP id 5b1f17b1804b1-431255e485dmr107437955e9.19.1729000596915; Tue, 15 Oct 2024 06:56:36 -0700 (PDT) Received: from [127.0.1.1] (frhb82016ds.ikexpress.com. [185.246.87.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4313f56f241sm18848295e9.22.2024.10.15.06.56.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2024 06:56:36 -0700 (PDT) From: Guillaume Stols Date: Tue, 15 Oct 2024 13:56:18 +0000 Subject: [PATCH v5 5/8] iio: adc: ad7606: Add compatibility to fw_nodes 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: <20241015-ad7606_add_iio_backend_support-v5-5-654faf1ae08c@baylibre.com> References: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> In-Reply-To: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Greg Kroah-Hartman , "Rafael J. Wysocki" , Jonathan Corbet Cc: linux-pwm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Hennerich , linux-fbdev@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, aardelean@baylibre.com, dlechner@baylibre.com, jstephan@baylibre.com, nuno.sa@analog.com, Jonathan Cameron , Guillaume Stols X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1729000592; l=20772; i=gstols@baylibre.com; s=20240417; h=from:subject:message-id; bh=p5W7C9eFQDZ97zIyZZtTH6VbXAEzZrNsKQ8f3gAiwNE=; b=jEWYPIumcW14EL7S3zdjULrVgwT+Dc6SVyQkhidG17sm5Dsd6l/RZ4m2VS0CBNGPBtjdWTxct F28NtKYqmKaBN77fFNNpXu2JxPV7/B5mxiIS/9Soe3Z4hWNIGk+MsoK X-Developer-Key: i=gstols@baylibre.com; a=ed25519; pk=XvMm5WHuV67sGYOJZqIYzXndbaJOlNd8Q6li6vnb4Cs= On the parallel version, the current implementation is only compatible with id tables and won't work with fw_nodes, this commit intends to fix it. Doing so required to declare ad7606_chip_info structures in the .h file so to make them accessible to all the driver files that can set a pointer to the corresponding chip as the driver data. Signed-off-by: Guillaume Stols --- drivers/iio/adc/ad7606.c | 283 ++++++++++++++++++++++++---------------= ---- drivers/iio/adc/ad7606.h | 32 +++-- drivers/iio/adc/ad7606_par.c | 30 +++-- drivers/iio/adc/ad7606_spi.c | 96 +++++++++------ 4 files changed, 254 insertions(+), 187 deletions(-) diff --git a/drivers/iio/adc/ad7606.c b/drivers/iio/adc/ad7606.c index dd4e0c6fce3e..72e0864ba9e4 100644 --- a/drivers/iio/adc/ad7606.c +++ b/drivers/iio/adc/ad7606.c @@ -78,6 +78,155 @@ static const unsigned int ad7616_oversampling_avail[8] = =3D { 1, 2, 4, 8, 16, 32, 64, 128, }; =20 +static const struct iio_chan_spec ad7605_channels[] =3D { + IIO_CHAN_SOFT_TIMESTAMP(4), + AD7605_CHANNEL(0), + AD7605_CHANNEL(1), + AD7605_CHANNEL(2), + AD7605_CHANNEL(3), +}; + +static const struct iio_chan_spec ad7606_channels_16bit[] =3D { + IIO_CHAN_SOFT_TIMESTAMP(8), + AD7606_CHANNEL(0, 16), + AD7606_CHANNEL(1, 16), + AD7606_CHANNEL(2, 16), + AD7606_CHANNEL(3, 16), + AD7606_CHANNEL(4, 16), + AD7606_CHANNEL(5, 16), + AD7606_CHANNEL(6, 16), + AD7606_CHANNEL(7, 16), +}; + +static const struct iio_chan_spec ad7606_channels_18bit[] =3D { + IIO_CHAN_SOFT_TIMESTAMP(8), + AD7606_CHANNEL(0, 18), + AD7606_CHANNEL(1, 18), + AD7606_CHANNEL(2, 18), + AD7606_CHANNEL(3, 18), + AD7606_CHANNEL(4, 18), + AD7606_CHANNEL(5, 18), + AD7606_CHANNEL(6, 18), + AD7606_CHANNEL(7, 18), +}; + +/* + * The current assumption that this driver makes for AD7616, is that it's + * working in Hardware Mode with Serial, Burst and Sequencer modes activat= ed. + * To activate them, following pins must be pulled high: + * -SER/PAR + * -SEQEN + * And following pins must be pulled low: + * -WR/BURST + * -DB4/SER1W + */ +static const struct iio_chan_spec ad7616_channels[] =3D { + IIO_CHAN_SOFT_TIMESTAMP(16), + AD7606_CHANNEL(0, 16), + AD7606_CHANNEL(1, 16), + AD7606_CHANNEL(2, 16), + AD7606_CHANNEL(3, 16), + AD7606_CHANNEL(4, 16), + AD7606_CHANNEL(5, 16), + AD7606_CHANNEL(6, 16), + AD7606_CHANNEL(7, 16), + AD7606_CHANNEL(8, 16), + AD7606_CHANNEL(9, 16), + AD7606_CHANNEL(10, 16), + AD7606_CHANNEL(11, 16), + AD7606_CHANNEL(12, 16), + AD7606_CHANNEL(13, 16), + AD7606_CHANNEL(14, 16), + AD7606_CHANNEL(15, 16), +}; + +static int ad7606c_18bit_chan_scale_setup(struct ad7606_state *st, + struct iio_chan_spec *chan, int ch); +static int ad7606c_16bit_chan_scale_setup(struct ad7606_state *st, + struct iio_chan_spec *chan, int ch); +static int ad7606_16bit_chan_scale_setup(struct ad7606_state *st, + struct iio_chan_spec *chan, int ch); + +const struct ad7606_chip_info ad7605_4_info =3D { + .channels =3D ad7605_channels, + .name =3D "ad7605-4", + .num_channels =3D 5, + .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, +}; +EXPORT_SYMBOL_NS_GPL(ad7605_4_info, IIO_AD7606); + +const struct ad7606_chip_info ad7606_8_info =3D { + .channels =3D ad7606_channels_16bit, + .name =3D "ad7606-8", + .num_channels =3D 9, + .oversampling_avail =3D ad7606_oversampling_avail, + .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), + .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, +}; +EXPORT_SYMBOL_NS_GPL(ad7606_8_info, IIO_AD7606); + +const struct ad7606_chip_info ad7606_6_info =3D { + .channels =3D ad7606_channels_16bit, + .name =3D "ad7606-6", + .num_channels =3D 7, + .oversampling_avail =3D ad7606_oversampling_avail, + .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), + .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, +}; +EXPORT_SYMBOL_NS_GPL(ad7606_6_info, IIO_AD7606); + +const struct ad7606_chip_info ad7606_4_info =3D { + .channels =3D ad7606_channels_16bit, + .name =3D "ad7606-4", + .num_channels =3D 5, + .oversampling_avail =3D ad7606_oversampling_avail, + .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), + .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, +}; +EXPORT_SYMBOL_NS_GPL(ad7606_4_info, IIO_AD7606); + +const struct ad7606_chip_info ad7606b_info =3D { + .channels =3D ad7606_channels_16bit, + .name =3D "ad7606b", + .num_channels =3D 9, + .oversampling_avail =3D ad7606_oversampling_avail, + .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), + .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, +}; +EXPORT_SYMBOL_NS_GPL(ad7606b_info, IIO_AD7606); + +const struct ad7606_chip_info ad7606c_16_info =3D { + .channels =3D ad7606_channels_16bit, + .name =3D "ad7606c16", + .num_channels =3D 9, + .oversampling_avail =3D ad7606_oversampling_avail, + .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), + .scale_setup_cb =3D ad7606c_16bit_chan_scale_setup, +}; +EXPORT_SYMBOL_NS_GPL(ad7606c_16_info, IIO_AD7606); + +const struct ad7606_chip_info ad7606c_18_info =3D { + .channels =3D ad7606_channels_18bit, + .name =3D "ad7606c18", + .num_channels =3D 9, + .oversampling_avail =3D ad7606_oversampling_avail, + .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), + .scale_setup_cb =3D ad7606c_18bit_chan_scale_setup, +}; +EXPORT_SYMBOL_NS_GPL(ad7606c_18_info, IIO_AD7606); + +const struct ad7606_chip_info ad7616_info =3D { + .channels =3D ad7616_channels, + .init_delay_ms =3D 15, + .name =3D "ad7616", + .num_channels =3D 17, + .oversampling_avail =3D ad7616_oversampling_avail, + .oversampling_num =3D ARRAY_SIZE(ad7616_oversampling_avail), + .os_req_reset =3D true, + .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, +}; +EXPORT_SYMBOL_NS_GPL(ad7616_info, IIO_AD7606); + int ad7606_reset(struct ad7606_state *st) { if (st->gpio_reset) { @@ -622,128 +771,6 @@ static const struct attribute_group ad7606_attribute_= group_range =3D { .attrs =3D ad7606_attributes_range, }; =20 -static const struct iio_chan_spec ad7605_channels[] =3D { - IIO_CHAN_SOFT_TIMESTAMP(4), - AD7605_CHANNEL(0), - AD7605_CHANNEL(1), - AD7605_CHANNEL(2), - AD7605_CHANNEL(3), -}; - -static const struct iio_chan_spec ad7606_channels_16bit[] =3D { - IIO_CHAN_SOFT_TIMESTAMP(8), - AD7606_CHANNEL(0, 16), - AD7606_CHANNEL(1, 16), - AD7606_CHANNEL(2, 16), - AD7606_CHANNEL(3, 16), - AD7606_CHANNEL(4, 16), - AD7606_CHANNEL(5, 16), - AD7606_CHANNEL(6, 16), - AD7606_CHANNEL(7, 16), -}; - -static const struct iio_chan_spec ad7606_channels_18bit[] =3D { - IIO_CHAN_SOFT_TIMESTAMP(8), - AD7606_CHANNEL(0, 18), - AD7606_CHANNEL(1, 18), - AD7606_CHANNEL(2, 18), - AD7606_CHANNEL(3, 18), - AD7606_CHANNEL(4, 18), - AD7606_CHANNEL(5, 18), - AD7606_CHANNEL(6, 18), - AD7606_CHANNEL(7, 18), -}; - -/* - * The current assumption that this driver makes for AD7616, is that it's - * working in Hardware Mode with Serial, Burst and Sequencer modes activat= ed. - * To activate them, following pins must be pulled high: - * -SER/PAR - * -SEQEN - * And following pins must be pulled low: - * -WR/BURST - * -DB4/SER1W - */ -static const struct iio_chan_spec ad7616_channels[] =3D { - IIO_CHAN_SOFT_TIMESTAMP(16), - AD7606_CHANNEL(0, 16), - AD7606_CHANNEL(1, 16), - AD7606_CHANNEL(2, 16), - AD7606_CHANNEL(3, 16), - AD7606_CHANNEL(4, 16), - AD7606_CHANNEL(5, 16), - AD7606_CHANNEL(6, 16), - AD7606_CHANNEL(7, 16), - AD7606_CHANNEL(8, 16), - AD7606_CHANNEL(9, 16), - AD7606_CHANNEL(10, 16), - AD7606_CHANNEL(11, 16), - AD7606_CHANNEL(12, 16), - AD7606_CHANNEL(13, 16), - AD7606_CHANNEL(14, 16), - AD7606_CHANNEL(15, 16), -}; - -static const struct ad7606_chip_info ad7606_chip_info_tbl[] =3D { - /* More devices added in future */ - [ID_AD7605_4] =3D { - .channels =3D ad7605_channels, - .num_channels =3D 5, - .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, - }, - [ID_AD7606_8] =3D { - .channels =3D ad7606_channels_16bit, - .num_channels =3D 9, - .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, - .oversampling_avail =3D ad7606_oversampling_avail, - .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), - }, - [ID_AD7606_6] =3D { - .channels =3D ad7606_channels_16bit, - .num_channels =3D 7, - .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, - .oversampling_avail =3D ad7606_oversampling_avail, - .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), - }, - [ID_AD7606_4] =3D { - .channels =3D ad7606_channels_16bit, - .num_channels =3D 5, - .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, - .oversampling_avail =3D ad7606_oversampling_avail, - .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), - }, - [ID_AD7606B] =3D { - .channels =3D ad7606_channels_16bit, - .num_channels =3D 9, - .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, - .oversampling_avail =3D ad7606_oversampling_avail, - .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), - }, - [ID_AD7606C_16] =3D { - .channels =3D ad7606_channels_16bit, - .num_channels =3D 9, - .scale_setup_cb =3D ad7606c_16bit_chan_scale_setup, - .oversampling_avail =3D ad7606_oversampling_avail, - .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), - }, - [ID_AD7606C_18] =3D { - .channels =3D ad7606_channels_18bit, - .num_channels =3D 9, - .scale_setup_cb =3D ad7606c_18bit_chan_scale_setup, - .oversampling_avail =3D ad7606_oversampling_avail, - .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), - }, - [ID_AD7616] =3D { - .channels =3D ad7616_channels, - .num_channels =3D 17, - .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, - .oversampling_avail =3D ad7616_oversampling_avail, - .oversampling_num =3D ARRAY_SIZE(ad7616_oversampling_avail), - .os_req_reset =3D true, - .init_delay_ms =3D 15, - }, -}; - static int ad7606_request_gpios(struct ad7606_state *st) { struct device *dev =3D st->dev; @@ -922,7 +949,7 @@ static const struct iio_trigger_ops ad7606_trigger_ops = =3D { .validate_device =3D iio_trigger_validate_own_device, }; =20 -static int ad7606_sw_mode_setup(struct iio_dev *indio_dev, unsigned int id) +static int ad7606_sw_mode_setup(struct iio_dev *indio_dev) { struct ad7606_state *st =3D iio_priv(indio_dev); =20 @@ -983,7 +1010,7 @@ static void ad7606_pwm_disable(void *data) } =20 int ad7606_probe(struct device *dev, int irq, void __iomem *base_address, - const char *name, unsigned int id, + const struct ad7606_chip_info *chip_info, const struct ad7606_bus_ops *bops) { struct ad7606_state *st; @@ -1008,7 +1035,7 @@ int ad7606_probe(struct device *dev, int irq, void __= iomem *base_address, return dev_err_probe(dev, ret, "Failed to enable specified AVcc supply\n"); =20 - st->chip_info =3D &ad7606_chip_info_tbl[id]; + st->chip_info =3D chip_info; =20 if (st->chip_info->oversampling_num) { st->oversampling_avail =3D st->chip_info->oversampling_avail; @@ -1031,7 +1058,7 @@ int ad7606_probe(struct device *dev, int irq, void __= iomem *base_address, indio_dev->info =3D &ad7606_info_no_os_or_range; } indio_dev->modes =3D INDIO_DIRECT_MODE; - indio_dev->name =3D name; + indio_dev->name =3D chip_info->name; indio_dev->channels =3D st->chip_info->channels; indio_dev->num_channels =3D st->chip_info->num_channels; =20 @@ -1050,7 +1077,7 @@ int ad7606_probe(struct device *dev, int irq, void __= iomem *base_address, st->write_scale =3D ad7606_write_scale_hw; st->write_os =3D ad7606_write_os_hw; =20 - ret =3D ad7606_sw_mode_setup(indio_dev, id); + ret =3D ad7606_sw_mode_setup(indio_dev); if (ret) return ret; =20 @@ -1101,7 +1128,7 @@ int ad7606_probe(struct device *dev, int irq, void __= iomem *base_address, NULL, &ad7606_interrupt, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, - name, indio_dev); + chip_info->name, indio_dev); if (ret) return ret; =20 diff --git a/drivers/iio/adc/ad7606.h b/drivers/iio/adc/ad7606.h index 760cf5e2ecb6..d401d3ab37e0 100644 --- a/drivers/iio/adc/ad7606.h +++ b/drivers/iio/adc/ad7606.h @@ -69,6 +69,7 @@ typedef int (*ad7606_scale_setup_cb_t)(struct ad7606_stat= e *st, /** * struct ad7606_chip_info - chip specific information * @channels: channel specification + * @name device name * @num_channels: number of channels * @scale_setup_cb: callback to setup the scales for each channel * @oversampling_avail pointer to the array which stores the available @@ -80,6 +81,7 @@ typedef int (*ad7606_scale_setup_cb_t)(struct ad7606_stat= e *st, */ struct ad7606_chip_info { const struct iio_chan_spec *channels; + const char *name; unsigned int num_channels; ad7606_scale_setup_cb_t scale_setup_cb; const unsigned int *oversampling_avail; @@ -199,22 +201,30 @@ struct ad7606_bus_ops { u16 (*rd_wr_cmd)(int addr, char isWriteOp); }; =20 +/** + * struct ad7606_bus_info - agregate ad7606_chip_info and ad7606_bus_ops + * @chip_info entry in the table of chips that describes this device + * @bops bus operations (SPI or parallel) + */ +struct ad7606_bus_info { + const struct ad7606_chip_info *chip_info; + const struct ad7606_bus_ops *bops; +}; + int ad7606_probe(struct device *dev, int irq, void __iomem *base_address, - const char *name, unsigned int id, + const struct ad7606_chip_info *info, const struct ad7606_bus_ops *bops); =20 int ad7606_reset(struct ad7606_state *st); =20 -enum ad7606_supported_device_ids { - ID_AD7605_4, - ID_AD7606_8, - ID_AD7606_6, - ID_AD7606_4, - ID_AD7606B, - ID_AD7606C_16, - ID_AD7606C_18, - ID_AD7616, -}; +extern const struct ad7606_chip_info ad7605_4_info; +extern const struct ad7606_chip_info ad7606_8_info; +extern const struct ad7606_chip_info ad7606_6_info; +extern const struct ad7606_chip_info ad7606_4_info; +extern const struct ad7606_chip_info ad7606b_info; +extern const struct ad7606_chip_info ad7606c_16_info; +extern const struct ad7606_chip_info ad7606c_18_info; +extern const struct ad7606_chip_info ad7616_info; =20 #ifdef CONFIG_PM_SLEEP extern const struct dev_pm_ops ad7606_pm_ops; diff --git a/drivers/iio/adc/ad7606_par.c b/drivers/iio/adc/ad7606_par.c index d651639c45eb..b87be2f1ca04 100644 --- a/drivers/iio/adc/ad7606_par.c +++ b/drivers/iio/adc/ad7606_par.c @@ -11,6 +11,7 @@ #include #include #include +#include #include =20 #include @@ -89,12 +90,20 @@ static const struct ad7606_bus_ops ad7606_par8_bops =3D= { =20 static int ad7606_par_probe(struct platform_device *pdev) { - const struct platform_device_id *id =3D platform_get_device_id(pdev); + const struct ad7606_chip_info *chip_info; + const struct platform_device_id *id; struct resource *res; void __iomem *addr; resource_size_t remap_size; int irq; =20 + if (dev_fwnode(&pdev->dev)) { + chip_info =3D device_get_match_data(&pdev->dev); + } else { + id =3D platform_get_device_id(pdev); + chip_info =3D (const struct ad7606_chip_info *)id->driver_data; + } + irq =3D platform_get_irq(pdev, 0); if (irq < 0) return irq; @@ -105,26 +114,25 @@ static int ad7606_par_probe(struct platform_device *p= dev) =20 remap_size =3D resource_size(res); =20 - return ad7606_probe(&pdev->dev, irq, addr, - id->name, id->driver_data, + return ad7606_probe(&pdev->dev, irq, addr, chip_info, remap_size > 1 ? &ad7606_par16_bops : &ad7606_par8_bops); } =20 static const struct platform_device_id ad7606_driver_ids[] =3D { - { .name =3D "ad7605-4", .driver_data =3D ID_AD7605_4, }, - { .name =3D "ad7606-4", .driver_data =3D ID_AD7606_4, }, - { .name =3D "ad7606-6", .driver_data =3D ID_AD7606_6, }, - { .name =3D "ad7606-8", .driver_data =3D ID_AD7606_8, }, + { .name =3D "ad7605-4", .driver_data =3D (kernel_ulong_t)&ad7605_4_info, = }, + { .name =3D "ad7606-4", .driver_data =3D (kernel_ulong_t)&ad7606_4_info, = }, + { .name =3D "ad7606-6", .driver_data =3D (kernel_ulong_t)&ad7606_6_info, = }, + { .name =3D "ad7606-8", .driver_data =3D (kernel_ulong_t)&ad7606_8_info, = }, { } }; MODULE_DEVICE_TABLE(platform, ad7606_driver_ids); =20 static const struct of_device_id ad7606_of_match[] =3D { - { .compatible =3D "adi,ad7605-4" }, - { .compatible =3D "adi,ad7606-4" }, - { .compatible =3D "adi,ad7606-6" }, - { .compatible =3D "adi,ad7606-8" }, + { .compatible =3D "adi,ad7605-4", .data =3D &ad7605_4_info }, + { .compatible =3D "adi,ad7606-4", .data =3D &ad7606_4_info }, + { .compatible =3D "adi,ad7606-6", .data =3D &ad7606_6_info }, + { .compatible =3D "adi,ad7606-8", .data =3D &ad7606_8_info }, { } }; MODULE_DEVICE_TABLE(of, ad7606_of_match); diff --git a/drivers/iio/adc/ad7606_spi.c b/drivers/iio/adc/ad7606_spi.c index d12e55123888..44c6031e9e9a 100644 --- a/drivers/iio/adc/ad7606_spi.c +++ b/drivers/iio/adc/ad7606_spi.c @@ -334,7 +334,7 @@ static const struct ad7606_bus_ops ad7616_spi_bops =3D { .sw_mode_config =3D ad7616_sw_mode_config, }; =20 -static const struct ad7606_bus_ops ad7606B_spi_bops =3D { +static const struct ad7606_bus_ops ad7606b_spi_bops =3D { .read_block =3D ad7606_spi_read_block, .reg_read =3D ad7606_spi_reg_read, .reg_write =3D ad7606_spi_reg_write, @@ -352,54 +352,76 @@ static const struct ad7606_bus_ops ad7606c_18_spi_bop= s =3D { .sw_mode_config =3D ad7606c_18_sw_mode_config, }; =20 +static const struct ad7606_bus_info ad7605_4_bus_info =3D { + .chip_info =3D &ad7605_4_info, + .bops =3D &ad7606_spi_bops, +}; + +static const struct ad7606_bus_info ad7606_8_bus_info =3D { + .chip_info =3D &ad7606_8_info, + .bops =3D &ad7606_spi_bops, +}; + +static const struct ad7606_bus_info ad7606_6_bus_info =3D { + .chip_info =3D &ad7606_6_info, + .bops =3D &ad7606_spi_bops, +}; + +static const struct ad7606_bus_info ad7606_4_bus_info =3D { + .chip_info =3D &ad7606_4_info, + .bops =3D &ad7606_spi_bops, +}; + +static const struct ad7606_bus_info ad7606b_bus_info =3D { + .chip_info =3D &ad7606b_info, + .bops =3D &ad7606b_spi_bops, +}; + +static const struct ad7606_bus_info ad7606c_16_bus_info =3D { + .chip_info =3D &ad7606c_16_info, + .bops =3D &ad7606b_spi_bops, +}; + +static const struct ad7606_bus_info ad7606c_18_bus_info =3D { + .chip_info =3D &ad7606c_18_info, + .bops =3D &ad7606c_18_spi_bops, +}; + +static const struct ad7606_bus_info ad7616_bus_info =3D { + .chip_info =3D &ad7616_info, + .bops =3D &ad7616_spi_bops, +}; + static int ad7606_spi_probe(struct spi_device *spi) { - const struct spi_device_id *id =3D spi_get_device_id(spi); - const struct ad7606_bus_ops *bops; - - switch (id->driver_data) { - case ID_AD7616: - bops =3D &ad7616_spi_bops; - break; - case ID_AD7606B: - case ID_AD7606C_16: - bops =3D &ad7606B_spi_bops; - break; - case ID_AD7606C_18: - bops =3D &ad7606c_18_spi_bops; - break; - default: - bops =3D &ad7606_spi_bops; - break; - } + const struct ad7606_bus_info *bus_info =3D spi_get_device_match_data(spi); =20 return ad7606_probe(&spi->dev, spi->irq, NULL, - id->name, id->driver_data, - bops); + bus_info->chip_info, bus_info->bops); } =20 static const struct spi_device_id ad7606_id_table[] =3D { - { "ad7605-4", ID_AD7605_4 }, - { "ad7606-4", ID_AD7606_4 }, - { "ad7606-6", ID_AD7606_6 }, - { "ad7606-8", ID_AD7606_8 }, - { "ad7606b", ID_AD7606B }, - { "ad7606c-16", ID_AD7606C_16 }, - { "ad7606c-18", ID_AD7606C_18 }, - { "ad7616", ID_AD7616 }, + { "ad7605-4", (kernel_ulong_t)&ad7605_4_bus_info }, + { "ad7606-4", (kernel_ulong_t)&ad7606_4_bus_info }, + { "ad7606-6", (kernel_ulong_t)&ad7606_6_bus_info }, + { "ad7606-8", (kernel_ulong_t)&ad7606_8_bus_info }, + { "ad7606b", (kernel_ulong_t)&ad7606b_bus_info }, + { "ad7606c-16", (kernel_ulong_t)&ad7606c_16_bus_info }, + { "ad7606c-18", (kernel_ulong_t)&ad7606c_18_bus_info }, + { "ad7616", (kernel_ulong_t)&ad7616_bus_info }, { } }; MODULE_DEVICE_TABLE(spi, ad7606_id_table); =20 static const struct of_device_id ad7606_of_match[] =3D { - { .compatible =3D "adi,ad7605-4" }, - { .compatible =3D "adi,ad7606-4" }, - { .compatible =3D "adi,ad7606-6" }, - { .compatible =3D "adi,ad7606-8" }, - { .compatible =3D "adi,ad7606b" }, - { .compatible =3D "adi,ad7606c-16" }, - { .compatible =3D "adi,ad7606c-18" }, - { .compatible =3D "adi,ad7616" }, + { .compatible =3D "adi,ad7605-4", .data =3D &ad7605_4_bus_info }, + { .compatible =3D "adi,ad7606-4", .data =3D &ad7606_4_bus_info }, + { .compatible =3D "adi,ad7606-6", .data =3D &ad7606_6_bus_info }, + { .compatible =3D "adi,ad7606-8", .data =3D &ad7606_8_bus_info }, + { .compatible =3D "adi,ad7606b", .data =3D &ad7606b_bus_info }, + { .compatible =3D "adi,ad7606c-16", .data =3D &ad7606c_16_bus_info }, + { .compatible =3D "adi,ad7606c-18", .data =3D &ad7606c_18_bus_info }, + { .compatible =3D "adi,ad7616", .data =3D &ad7616_bus_info }, { } }; MODULE_DEVICE_TABLE(of, ad7606_of_match); --=20 2.34.1 From nobody Tue Nov 26 22:22:22 2024 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (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 2A6991C07CC for ; Tue, 15 Oct 2024 13:56:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000603; cv=none; b=JYVDvcdClsgKkkRd2RWW25OlZtx+9F8o9b/lUtMbP8VyLbzQFpSZM5fLf7VQFuUdbhBIIzPtpcfJBFjFjFuc8eltY1tU5xUU/N9UC+9hsBhfODaCtrAN/CdSpQEHPmdUEKT4X2iLWrJ4ewBAXawpDTjiORKw4kPCoCM6EOmGw/8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000603; c=relaxed/simple; bh=uZ2pSOh9N6nTo2PEopWYoEeymPnCeCw1H9WWOEjHy2g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nD2jUour3/tDNjgwr2poRnNiTXQa+mBmrCcg09R32L5Ek9bvDHPaBaLn7YH0rc7cf3qysMe63KMlkyEDIALZ//b01yZH4A33/G7XwgKxhI6q3hKg47mU8FSFu0O7LCpBwox4ckWjxVaIREiEZuW29wUMSRLmay5oyFV978NnodA= 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=Tg5f/99k; arc=none smtp.client-ip=209.85.128.44 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="Tg5f/99k" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-431137d12a5so51047035e9.1 for ; Tue, 15 Oct 2024 06:56:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1729000598; x=1729605398; 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=FJkoc7szlimqyMQJgePkSS4lTZknGS38dNO7gXkpUxw=; b=Tg5f/99kNkVyXfRHUjF2JhNAV+sfP0rjxu9OjyHaIKCqMNuiobZ8wdeFuh6lJpt7HU mozgA3uQrE7nK9Ex7Umw61s6ZRrOAxoOA43/n8TT0LzT9U5JRrC774PWxSBogakOmsgD MDYYfX7fitZiI2YsU7P+ZeeeWk0AWpb5g5WpkhtBrPBTZlyHdDvBTnl1+UVMdsdfjP2x M9BY8ZUQgPIy9AWksAlnn8nm25TvijcQMWWCpo3oSKe0RIKqfXKrL497QbAKz8hm7ezR 60XhKTL6KoI0yfAKSH6yCIgam1j1WTfdCQbTUoBAT6yuPiXbivmhSvAlQg8We2Pey1nY RWHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729000598; x=1729605398; 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=FJkoc7szlimqyMQJgePkSS4lTZknGS38dNO7gXkpUxw=; b=SJJkVnsecjijOcUeHwmq8Ag0yDbpR4lF+MioiwiG5yvBQH2rAAjzYgS4BQ5Ey24zwF zT5rP2xqlmA2CoehyVNAh23UvDazvuEKcIKVZyE8+RdaebmYZn5v/BfOMKaUXBfkRLUz JWGiHQRjoB7nK7JUrTAaWBCb2uq2FFBcW1VSv+84r++DaEfVD8FTRIrul9pFe0mSwDZh E+H95pgxxEnNGddcQT3u2te2PN9ySs6Rl76aVjrfh50MHx2fuVwlQYkjD12EY4TAPIKM uGxRm1vPla3532qJklktfUGdXuhBt6yjIaRw3at8auaD0+lLOUocysjhAlfUeWLejvBx hbGg== X-Forwarded-Encrypted: i=1; AJvYcCUavA5cmx6bWjTFLRLZNlv3UZc2hTiCysqLAT3vJWQvCs2aiDEsbvt5T3o/NJ5d7rUm63UE3phVsSszGUk=@vger.kernel.org X-Gm-Message-State: AOJu0YymluVDsiWuQ6L89b2ZGLoEwYKpkgwuabq+tXKML16bWKjbyzRt djpc7JI62L3CUEaLfxeH4hwjorJF/pTURBg0YVHo7RDZNnXz5U+KEPAExu16Iyo= X-Google-Smtp-Source: AGHT+IFwOCTrywXB0QcFfLY+XmaKsVWO+N4uVfWKhbTeRvLtRpMFfy9+T2dkUs0peGyWd4u8tgUFeQ== X-Received: by 2002:a05:600c:470e:b0:42c:acb0:dda5 with SMTP id 5b1f17b1804b1-4311dea3c39mr140415695e9.1.1729000597711; Tue, 15 Oct 2024 06:56:37 -0700 (PDT) Received: from [127.0.1.1] (frhb82016ds.ikexpress.com. [185.246.87.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4313f56f241sm18848295e9.22.2024.10.15.06.56.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2024 06:56:37 -0700 (PDT) From: Guillaume Stols Date: Tue, 15 Oct 2024 13:56:19 +0000 Subject: [PATCH v5 6/8] iio: adc: ad7606: Introduce num_adc_channels 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: <20241015-ad7606_add_iio_backend_support-v5-6-654faf1ae08c@baylibre.com> References: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> In-Reply-To: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Greg Kroah-Hartman , "Rafael J. Wysocki" , Jonathan Corbet Cc: linux-pwm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Hennerich , linux-fbdev@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, aardelean@baylibre.com, dlechner@baylibre.com, jstephan@baylibre.com, nuno.sa@analog.com, Jonathan Cameron , Guillaume Stols X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1729000592; l=4668; i=gstols@baylibre.com; s=20240417; h=from:subject:message-id; bh=uZ2pSOh9N6nTo2PEopWYoEeymPnCeCw1H9WWOEjHy2g=; b=pEAYRdFvNOGUcjukNeAiOazcKbbUJKD1EV/IyNMmcyetlet1IX2S25VhmWxsV5eq8ocW407kN aDx558QbhtqDpu5sBbH9q0GtaZBFdXv5XxKm9TsM7Nm4BXqcTkXCfmL X-Developer-Key: i=gstols@baylibre.com; a=ed25519; pk=XvMm5WHuV67sGYOJZqIYzXndbaJOlNd8Q6li6vnb4Cs= This variable determines how many hardware channels has the chip, oppositely to the num_channels that can contain more channels, e.g a timestamp channel in our case. Introducing this variable avoids decreasing the former num_channels variable when reading the ADC's channels, and clarifies a bit the code. Reviewed-by: Nuno Sa Signed-off-by: Guillaume Stols --- drivers/iio/adc/ad7606.c | 10 +++++++++- drivers/iio/adc/ad7606.h | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/iio/adc/ad7606.c b/drivers/iio/adc/ad7606.c index 72e0864ba9e4..34d377e9ac79 100644 --- a/drivers/iio/adc/ad7606.c +++ b/drivers/iio/adc/ad7606.c @@ -150,6 +150,7 @@ static int ad7606_16bit_chan_scale_setup(struct ad7606_= state *st, const struct ad7606_chip_info ad7605_4_info =3D { .channels =3D ad7605_channels, .name =3D "ad7605-4", + .num_adc_channels =3D 4, .num_channels =3D 5, .scale_setup_cb =3D ad7606_16bit_chan_scale_setup, }; @@ -158,6 +159,7 @@ EXPORT_SYMBOL_NS_GPL(ad7605_4_info, IIO_AD7606); const struct ad7606_chip_info ad7606_8_info =3D { .channels =3D ad7606_channels_16bit, .name =3D "ad7606-8", + .num_adc_channels =3D 8, .num_channels =3D 9, .oversampling_avail =3D ad7606_oversampling_avail, .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), @@ -168,6 +170,7 @@ EXPORT_SYMBOL_NS_GPL(ad7606_8_info, IIO_AD7606); const struct ad7606_chip_info ad7606_6_info =3D { .channels =3D ad7606_channels_16bit, .name =3D "ad7606-6", + .num_adc_channels =3D 6, .num_channels =3D 7, .oversampling_avail =3D ad7606_oversampling_avail, .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), @@ -178,6 +181,7 @@ EXPORT_SYMBOL_NS_GPL(ad7606_6_info, IIO_AD7606); const struct ad7606_chip_info ad7606_4_info =3D { .channels =3D ad7606_channels_16bit, .name =3D "ad7606-4", + .num_adc_channels =3D 4, .num_channels =3D 5, .oversampling_avail =3D ad7606_oversampling_avail, .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), @@ -188,6 +192,7 @@ EXPORT_SYMBOL_NS_GPL(ad7606_4_info, IIO_AD7606); const struct ad7606_chip_info ad7606b_info =3D { .channels =3D ad7606_channels_16bit, .name =3D "ad7606b", + .num_adc_channels =3D 8, .num_channels =3D 9, .oversampling_avail =3D ad7606_oversampling_avail, .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), @@ -198,6 +203,7 @@ EXPORT_SYMBOL_NS_GPL(ad7606b_info, IIO_AD7606); const struct ad7606_chip_info ad7606c_16_info =3D { .channels =3D ad7606_channels_16bit, .name =3D "ad7606c16", + .num_adc_channels =3D 8, .num_channels =3D 9, .oversampling_avail =3D ad7606_oversampling_avail, .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), @@ -208,6 +214,7 @@ EXPORT_SYMBOL_NS_GPL(ad7606c_16_info, IIO_AD7606); const struct ad7606_chip_info ad7606c_18_info =3D { .channels =3D ad7606_channels_18bit, .name =3D "ad7606c18", + .num_adc_channels =3D 8, .num_channels =3D 9, .oversampling_avail =3D ad7606_oversampling_avail, .oversampling_num =3D ARRAY_SIZE(ad7606_oversampling_avail), @@ -219,6 +226,7 @@ const struct ad7606_chip_info ad7616_info =3D { .channels =3D ad7616_channels, .init_delay_ms =3D 15, .name =3D "ad7616", + .num_adc_channels =3D 16, .num_channels =3D 17, .oversampling_avail =3D ad7616_oversampling_avail, .oversampling_num =3D ARRAY_SIZE(ad7616_oversampling_avail), @@ -519,7 +527,7 @@ static int ad7606_set_sampling_freq(struct ad7606_state= *st, unsigned long freq) =20 static int ad7606_read_samples(struct ad7606_state *st) { - unsigned int num =3D st->chip_info->num_channels - 1; + unsigned int num =3D st->chip_info->num_adc_channels; =20 return st->bops->read_block(st->dev, num, &st->data); } diff --git a/drivers/iio/adc/ad7606.h b/drivers/iio/adc/ad7606.h index d401d3ab37e0..b26a11b2eba1 100644 --- a/drivers/iio/adc/ad7606.h +++ b/drivers/iio/adc/ad7606.h @@ -71,6 +71,7 @@ typedef int (*ad7606_scale_setup_cb_t)(struct ad7606_stat= e *st, * @channels: channel specification * @name device name * @num_channels: number of channels + * @num_adc_channels the number of channels the ADC actually inputs. * @scale_setup_cb: callback to setup the scales for each channel * @oversampling_avail pointer to the array which stores the available * oversampling ratios. @@ -82,6 +83,7 @@ typedef int (*ad7606_scale_setup_cb_t)(struct ad7606_stat= e *st, struct ad7606_chip_info { const struct iio_chan_spec *channels; const char *name; + unsigned int num_adc_channels; unsigned int num_channels; ad7606_scale_setup_cb_t scale_setup_cb; const unsigned int *oversampling_avail; --=20 2.34.1 From nobody Tue Nov 26 22:22:22 2024 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.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 0235B1C07C7 for ; Tue, 15 Oct 2024 13:56:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000605; cv=none; b=koX4laeTmbmjZvCmoac+O+Ya5jaJ2Rc550U3lh1DlgY1ID96AywKByWO8XHVVFAyX/S1f4jxo20dGudWNaaV6+46vDqNuZDBclZw46Ew2i6oQamIZj3iAAGNikOueSTEj3zGqBsZL/xwIxyat/xUFqaNTksMT9lfWATn0/NEq2A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000605; c=relaxed/simple; bh=knvF5aKMvqbmI6xU45rnHDO+4jl4aWSRuRnTBvrdC14=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fXt/j8J8yIUwJHPmQnpv+rDdnFemYjjmzILqUh5PpeCN4kBcEIN0QZNbuba6ovhlrhRtuovcGB8xeTLOBBeO1PkRxnbWWDCwhM2UyEr/OipDC4C8zlsAvwv8AuRll7udG5CZGTBAfVrErVZMpJps4BYFXRSfEEd3pQRVyGVZLtU= 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=lVVDQXgc; arc=none smtp.client-ip=209.85.128.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="lVVDQXgc" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-4311420b63fso41243715e9.2 for ; Tue, 15 Oct 2024 06:56:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1729000599; x=1729605399; 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=DHsNSKa4NzWLb/5F9UDh7Kih8Y7W7IvCdbO7qkDG4QU=; b=lVVDQXgcN+SijH9DtfXcrCGU3IyLuN0ZaClc/gAP1U9W8nRqEg7EGNizbrCZaO5s3+ xg8mXAy35AXUFSbnCGuOIUo/eRrMBCQxaUMMnlbjwWIEDCg+0bbFe/vP+6yAFe6qvoIu BTZQI5/m1buhEqJHw1ZMAs/XZzVKEaPc3lTfZWd1rSDyVPWw6UogeG1lOn3OJeSdfYjq 51aBsaRmT3VpLltDS3EMgAWw0bNaW8BQbYKeVNZwn/RG85ZjbQr0AzADR1F+5bmHf92x NP6empElRFTrAxqMdgiMfZFKJnKvpmrd4tdQ6F/OpvOeDlbA+k+1ePVOl170JngWPnJi Jyhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729000599; x=1729605399; 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=DHsNSKa4NzWLb/5F9UDh7Kih8Y7W7IvCdbO7qkDG4QU=; b=vIVgh9PcK+Qzkz2OMDhrj5zV7qXoSQHrAxymbU/B2349bx9SsvCtPNyuWj9FMjF+cH lHTjvmeOa2S8mZQMBI0nS0JdtsruG2ti5jdQw5Ik3l+u7zb/WPBpAQgKxwXVH33OoAGT Njoty914UclN5hiu5qaAhRJotsrW7WxVeMgpSFrXco5i0aVtPRjbdMw+KjXDCoA27att 7rlPMT8FvNDr0Nmba24kbjlDFWmCs5V5pdDWLj5UNZ64yeYXDixqmkGhlrt7gJA8OiO2 FvSfEY3h6nVLDfqAnJeMbWnCmqy2el373Pu62OpXT3/54Oob1X2xlUUzLJsXj7wLAOf0 uphA== X-Forwarded-Encrypted: i=1; AJvYcCXJ4p36KrmO03hUw29ZCI5Zsj+NPlW6a8uTSRfoJaeKI4IrzrK5A8d+btj52HVxJPPQnRgNRyPli0FRbRM=@vger.kernel.org X-Gm-Message-State: AOJu0YzQ4CrVjYSciNERGg3+iVhpEMEPgSA0S5GTvQ8CP42yOPh3XVjg 8j1SEhI+P3R586dMrkjM3ErIBGws0W1nj/D7C4XpgKYejXeoQIxOsczCC1Py/4c= X-Google-Smtp-Source: AGHT+IEtOCxl98BOx97qmInh3XU9AWy/piuphXBOEDTC50/Q49BYrM5/J5YaRnvQ9PDEroX0GG7IUA== X-Received: by 2002:a05:600c:468a:b0:431:47d4:19c7 with SMTP id 5b1f17b1804b1-43147d41ba6mr9248425e9.3.1729000598507; Tue, 15 Oct 2024 06:56:38 -0700 (PDT) Received: from [127.0.1.1] (frhb82016ds.ikexpress.com. [185.246.87.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4313f56f241sm18848295e9.22.2024.10.15.06.56.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2024 06:56:38 -0700 (PDT) From: Guillaume Stols Date: Tue, 15 Oct 2024 13:56:20 +0000 Subject: [PATCH v5 7/8] iio: adc: ad7606: Add iio-backend support 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: <20241015-ad7606_add_iio_backend_support-v5-7-654faf1ae08c@baylibre.com> References: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> In-Reply-To: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Greg Kroah-Hartman , "Rafael J. Wysocki" , Jonathan Corbet Cc: linux-pwm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Hennerich , linux-fbdev@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, aardelean@baylibre.com, dlechner@baylibre.com, jstephan@baylibre.com, nuno.sa@analog.com, Jonathan Cameron , Guillaume Stols X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1729000592; l=16895; i=gstols@baylibre.com; s=20240417; h=from:subject:message-id; bh=knvF5aKMvqbmI6xU45rnHDO+4jl4aWSRuRnTBvrdC14=; b=IOsLO5n2Bydup55KdpPSTpzhpAjfsK8lS+gFZsD4gucoIgzxOmdRrDPTv4Alx/RGsRfxL/Jc8 +hBPimg+o80BqA8eW4I/nvNLMFDAZiuOClkEM4S65ILzEJj6txUOqsQ X-Developer-Key: i=gstols@baylibre.com; a=ed25519; pk=XvMm5WHuV67sGYOJZqIYzXndbaJOlNd8Q6li6vnb4Cs= - Basic support for iio backend. - Supports IIO_CHAN_INFO_SAMP_FREQ R/W. - Only hardware mode is available, and that IIO_CHAN_INFO_RAW is not supported if iio-backend mode is selected. Signed-off-by: Guillaume Stols --- drivers/iio/adc/Kconfig | 2 + drivers/iio/adc/ad7606.c | 154 ++++++++++++++++++++++++++++++++++-----= ---- drivers/iio/adc/ad7606.h | 15 +++++ drivers/iio/adc/ad7606_par.c | 92 +++++++++++++++++++++++++- 4 files changed, 231 insertions(+), 32 deletions(-) diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 91873f60322d..a57b5f0bc070 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -224,9 +224,11 @@ config AD7606_IFACE_PARALLEL tristate "Analog Devices AD7606 ADC driver with parallel interface suppor= t" depends on HAS_IOPORT select AD7606 + select IIO_BACKEND help Say yes here to build parallel interface support for Analog Devices: ad7605-4, ad7606, ad7606-6, ad7606-4 analog to digital converters (ADC). + It also support iio_backended devices for AD7606B. =20 To compile this driver as a module, choose M here: the module will be called ad7606_par. diff --git a/drivers/iio/adc/ad7606.c b/drivers/iio/adc/ad7606.c index 34d377e9ac79..7871552ce5ac 100644 --- a/drivers/iio/adc/ad7606.c +++ b/drivers/iio/adc/ad7606.c @@ -21,6 +21,7 @@ #include #include =20 +#include #include #include #include @@ -191,6 +192,7 @@ EXPORT_SYMBOL_NS_GPL(ad7606_4_info, IIO_AD7606); =20 const struct ad7606_chip_info ad7606b_info =3D { .channels =3D ad7606_channels_16bit, + .max_samplerate =3D 800 * KILO, .name =3D "ad7606b", .num_adc_channels =3D 8, .num_channels =3D 9, @@ -490,6 +492,17 @@ static int ad7606_pwm_set_low(struct ad7606_state *st) return ret; } =20 +static int ad7606_pwm_set_swing(struct ad7606_state *st) +{ + struct pwm_state cnvst_pwm_state; + + pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); + cnvst_pwm_state.enabled =3D true; + cnvst_pwm_state.duty_cycle =3D cnvst_pwm_state.period / 2; + + return pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); +} + static bool ad7606_pwm_is_swinging(struct ad7606_state *st) { struct pwm_state cnvst_pwm_state; @@ -576,11 +589,22 @@ static int ad7606_scan_direct(struct iio_dev *indio_d= ev, unsigned int ch, if (ret < 0) return ret; } - ret =3D wait_for_completion_timeout(&st->completion, - msecs_to_jiffies(1000)); - if (!ret) { - ret =3D -ETIMEDOUT; - goto error_ret; + + /* + * If no backend, wait for the interruption on busy pin, otherwise just a= dd + * a delay to leave time for the data to be available. For now, the latter + * will not happen because IIO_CHAN_INFO_RAW is not supported for the bac= kend. + * TODO: Add support for reading a single value when the backend is used. + */ + if (!st->back) { + ret =3D wait_for_completion_timeout(&st->completion, + msecs_to_jiffies(1000)); + if (!ret) { + ret =3D -ETIMEDOUT; + goto error_ret; + } + } else { + fsleep(1); } =20 ret =3D ad7606_read_samples(st); @@ -620,6 +644,7 @@ static int ad7606_read_raw(struct iio_dev *indio_dev, int ret, ch =3D 0; struct ad7606_state *st =3D iio_priv(indio_dev); struct ad7606_chan_scale *cs; + struct pwm_state cnvst_pwm_state; =20 switch (m) { case IIO_CHAN_INFO_RAW: @@ -640,6 +665,14 @@ static int ad7606_read_raw(struct iio_dev *indio_dev, case IIO_CHAN_INFO_OVERSAMPLING_RATIO: *val =3D st->oversampling; return IIO_VAL_INT; + case IIO_CHAN_INFO_SAMP_FREQ: + /* + * TODO: return the real frequency intead of the requested one once + * pwm_get_state_hw comes upstream. + */ + pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); + *val =3D DIV_ROUND_CLOSEST_ULL(NSEC_PER_SEC, cnvst_pwm_state.period); + return IIO_VAL_INT; } return -EINVAL; } @@ -732,6 +765,10 @@ static int ad7606_write_raw(struct iio_dev *indio_dev, return ret; =20 return 0; + case IIO_CHAN_INFO_SAMP_FREQ: + if (val < 0 && val2 !=3D 0) + return -EINVAL; + return ad7606_set_sampling_freq(st, val); default: return -EINVAL; } @@ -914,14 +951,50 @@ static int ad7606_read_avail(struct iio_dev *indio_de= v, return -EINVAL; } =20 +static int ad7606_backend_buffer_postenable(struct iio_dev *indio_dev) +{ + struct ad7606_state *st =3D iio_priv(indio_dev); + + return ad7606_pwm_set_swing(st); +} + +static int ad7606_backend_buffer_predisable(struct iio_dev *indio_dev) +{ + struct ad7606_state *st =3D iio_priv(indio_dev); + + return ad7606_pwm_set_low(st); +} + +static int ad7606_update_scan_mode(struct iio_dev *indio_dev, + const unsigned long *scan_mask) +{ + struct ad7606_state *st =3D iio_priv(indio_dev); + + /* + * The update scan mode is only for iio backend compatible drivers. + * If the specific update_scan_mode is not defined in the bus ops, + * just do nothing and return 0. + */ + if (!st->bops->update_scan_mode) + return 0; + + return st->bops->update_scan_mode(indio_dev, scan_mask); +} + static const struct iio_buffer_setup_ops ad7606_buffer_ops =3D { .postenable =3D &ad7606_buffer_postenable, .predisable =3D &ad7606_buffer_predisable, }; =20 +static const struct iio_buffer_setup_ops ad7606_backend_buffer_ops =3D { + .postenable =3D &ad7606_backend_buffer_postenable, + .predisable =3D &ad7606_backend_buffer_predisable, +}; + static const struct iio_info ad7606_info_no_os_or_range =3D { .read_raw =3D &ad7606_read_raw, .validate_trigger =3D &ad7606_validate_trigger, + .update_scan_mode =3D &ad7606_update_scan_mode, }; =20 static const struct iio_info ad7606_info_os_and_range =3D { @@ -929,6 +1002,7 @@ static const struct iio_info ad7606_info_os_and_range = =3D { .write_raw =3D &ad7606_write_raw, .attrs =3D &ad7606_attribute_group_os_and_range, .validate_trigger =3D &ad7606_validate_trigger, + .update_scan_mode =3D &ad7606_update_scan_mode, }; =20 static const struct iio_info ad7606_info_sw_mode =3D { @@ -937,6 +1011,7 @@ static const struct iio_info ad7606_info_sw_mode =3D { .read_avail =3D &ad7606_read_avail, .debugfs_reg_access =3D &ad7606_reg_access, .validate_trigger =3D &ad7606_validate_trigger, + .update_scan_mode =3D &ad7606_update_scan_mode, }; =20 static const struct iio_info ad7606_info_os =3D { @@ -944,6 +1019,7 @@ static const struct iio_info ad7606_info_os =3D { .write_raw =3D &ad7606_write_raw, .attrs =3D &ad7606_attribute_group_os, .validate_trigger =3D &ad7606_validate_trigger, + .update_scan_mode =3D &ad7606_update_scan_mode, }; =20 static const struct iio_info ad7606_info_range =3D { @@ -951,6 +1027,7 @@ static const struct iio_info ad7606_info_range =3D { .write_raw =3D &ad7606_write_raw, .attrs =3D &ad7606_attribute_group_range, .validate_trigger =3D &ad7606_validate_trigger, + .update_scan_mode =3D &ad7606_update_scan_mode, }; =20 static const struct iio_trigger_ops ad7606_trigger_ops =3D { @@ -1070,8 +1147,6 @@ int ad7606_probe(struct device *dev, int irq, void __= iomem *base_address, indio_dev->channels =3D st->chip_info->channels; indio_dev->num_channels =3D st->chip_info->num_channels; =20 - init_completion(&st->completion); - ret =3D ad7606_reset(st); if (ret) dev_warn(st->dev, "failed to RESET: no RESET GPIO specified\n"); @@ -1118,34 +1193,51 @@ int ad7606_probe(struct device *dev, int irq, void = __iomem *base_address, if (ret) return ret; } - st->trig =3D devm_iio_trigger_alloc(dev, "%s-dev%d", - indio_dev->name, - iio_device_id(indio_dev)); - if (!st->trig) - return -ENOMEM; =20 - st->trig->ops =3D &ad7606_trigger_ops; - iio_trigger_set_drvdata(st->trig, indio_dev); - ret =3D devm_iio_trigger_register(dev, st->trig); - if (ret) - return ret; + if (st->bops->iio_backend_config) { + /* + * If there is a backend, the PWM should not overpass the maximum sampli= ng + * frequency the chip supports. + */ + ret =3D ad7606_set_sampling_freq(st, + chip_info->max_samplerate ? : 2 * KILO); + if (ret) + return ret; + + ret =3D st->bops->iio_backend_config(dev, indio_dev); + if (ret) + return ret; =20 - indio_dev->trig =3D iio_trigger_get(st->trig); + indio_dev->setup_ops =3D &ad7606_backend_buffer_ops; + } else { + init_completion(&st->completion); + st->trig =3D devm_iio_trigger_alloc(dev, "%s-dev%d", + indio_dev->name, + iio_device_id(indio_dev)); + if (!st->trig) + return -ENOMEM; + + st->trig->ops =3D &ad7606_trigger_ops; + iio_trigger_set_drvdata(st->trig, indio_dev); + ret =3D devm_iio_trigger_register(dev, st->trig); + if (ret) + return ret; =20 - ret =3D devm_request_threaded_irq(dev, irq, - NULL, - &ad7606_interrupt, - IRQF_TRIGGER_FALLING | IRQF_ONESHOT, - chip_info->name, indio_dev); - if (ret) - return ret; + indio_dev->trig =3D iio_trigger_get(st->trig); =20 - ret =3D devm_iio_triggered_buffer_setup(dev, indio_dev, - &iio_pollfunc_store_time, - &ad7606_trigger_handler, - &ad7606_buffer_ops); - if (ret) - return ret; + ret =3D devm_request_threaded_irq(dev, irq, NULL, &ad7606_interrupt, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + chip_info->name, indio_dev); + if (ret) + return ret; + + ret =3D devm_iio_triggered_buffer_setup(dev, indio_dev, + &iio_pollfunc_store_time, + &ad7606_trigger_handler, + &ad7606_buffer_ops); + if (ret) + return ret; + } =20 return devm_iio_device_register(dev, indio_dev); } diff --git a/drivers/iio/adc/ad7606.h b/drivers/iio/adc/ad7606.h index b26a11b2eba1..2c629a15cc33 100644 --- a/drivers/iio/adc/ad7606.h +++ b/drivers/iio/adc/ad7606.h @@ -61,6 +61,12 @@ =20 #define AD7616_CHANNEL(num) AD7606_SW_CHANNEL(num, 16) =20 +#define AD7606_BI_CHANNEL(num) \ + AD760X_CHANNEL(num, 0, \ + BIT(IIO_CHAN_INFO_SCALE), \ + BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), 16) + struct ad7606_state; =20 typedef int (*ad7606_scale_setup_cb_t)(struct ad7606_state *st, @@ -69,6 +75,7 @@ typedef int (*ad7606_scale_setup_cb_t)(struct ad7606_stat= e *st, /** * struct ad7606_chip_info - chip specific information * @channels: channel specification + * @max_samplerate: maximum supported samplerate * @name device name * @num_channels: number of channels * @num_adc_channels the number of channels the ADC actually inputs. @@ -82,6 +89,7 @@ typedef int (*ad7606_scale_setup_cb_t)(struct ad7606_stat= e *st, */ struct ad7606_chip_info { const struct iio_chan_spec *channels; + unsigned int max_samplerate; const char *name; unsigned int num_adc_channels; unsigned int num_channels; @@ -152,6 +160,7 @@ struct ad7606_state { bool sw_mode_en; const unsigned int *oversampling_avail; unsigned int num_os_ratios; + struct iio_backend *back; int (*write_scale)(struct iio_dev *indio_dev, int ch, int val); int (*write_os)(struct iio_dev *indio_dev, int val); =20 @@ -180,16 +189,21 @@ struct ad7606_state { =20 /** * struct ad7606_bus_ops - driver bus operations + * @iio_backend_config function pointer for configuring the iio_backend for + * the compatibles that use it * @read_block function pointer for reading blocks of data * @sw_mode_config: pointer to a function which configured the device * for software mode * @reg_read function pointer for reading spi register * @reg_write function pointer for writing spi register * @write_mask function pointer for write spi register with mask + * @update_scan_mode function pointer for handling the calls to iio_info's= update_scan + * mode when enabling/disabling channels. * @rd_wr_cmd pointer to the function which calculates the spi address */ struct ad7606_bus_ops { /* more methods added in future? */ + int (*iio_backend_config)(struct device *dev, struct iio_dev *indio_dev); int (*read_block)(struct device *dev, int num, void *data); int (*sw_mode_config)(struct iio_dev *indio_dev); int (*reg_read)(struct ad7606_state *st, unsigned int addr); @@ -200,6 +214,7 @@ struct ad7606_bus_ops { unsigned int addr, unsigned long mask, unsigned int val); + int (*update_scan_mode)(struct iio_dev *indio_dev, const unsigned long *s= can_mask); u16 (*rd_wr_cmd)(int addr, char isWriteOp); }; =20 diff --git a/drivers/iio/adc/ad7606_par.c b/drivers/iio/adc/ad7606_par.c index b87be2f1ca04..6946ff00e4cb 100644 --- a/drivers/iio/adc/ad7606_par.c +++ b/drivers/iio/adc/ad7606_par.c @@ -2,7 +2,8 @@ /* * AD7606 Parallel Interface ADC driver * - * Copyright 2011 Analog Devices Inc. + * Copyright 2011 - 2024 Analog Devices Inc. + * Copyright 2024 BayLibre SAS. */ =20 #include @@ -14,9 +15,82 @@ #include #include =20 +#include #include + #include "ad7606.h" =20 +static const struct iio_chan_spec ad7606b_bi_channels[] =3D { + AD7606_BI_CHANNEL(0), + AD7606_BI_CHANNEL(1), + AD7606_BI_CHANNEL(2), + AD7606_BI_CHANNEL(3), + AD7606_BI_CHANNEL(4), + AD7606_BI_CHANNEL(5), + AD7606_BI_CHANNEL(6), + AD7606_BI_CHANNEL(7), +}; + +static int ad7606_bi_update_scan_mode(struct iio_dev *indio_dev, const uns= igned long *scan_mask) +{ + struct ad7606_state *st =3D iio_priv(indio_dev); + unsigned int c, ret; + + for (c =3D 0; c < indio_dev->num_channels; c++) { + if (test_bit(c, scan_mask)) + ret =3D iio_backend_chan_enable(st->back, c); + else + ret =3D iio_backend_chan_disable(st->back, c); + if (ret) + return ret; + } + + return 0; +} + +static int ad7606_bi_setup_iio_backend(struct device *dev, struct iio_dev = *indio_dev) +{ + struct ad7606_state *st =3D iio_priv(indio_dev); + unsigned int ret, c; + struct iio_backend_data_fmt data =3D { + .sign_extend =3D true, + .enable =3D true, + }; + + st->back =3D devm_iio_backend_get(dev, NULL); + if (IS_ERR(st->back)) + return PTR_ERR(st->back); + + /* If the device is iio_backend powered the PWM is mandatory */ + if (!st->cnvst_pwm) + return dev_err_probe(st->dev, -EINVAL, + "A PWM is mandatory when using backend.\n"); + + 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; + + for (c =3D 0; c < indio_dev->num_channels; c++) { + ret =3D iio_backend_data_format_set(st->back, c, &data); + if (ret) + return ret; + } + + indio_dev->channels =3D ad7606b_bi_channels; + indio_dev->num_channels =3D 8; + + return 0; +} + +static const struct ad7606_bus_ops ad7606_bi_bops =3D { + .iio_backend_config =3D ad7606_bi_setup_iio_backend, + .update_scan_mode =3D ad7606_bi_update_scan_mode, +}; + static int ad7606_par16_read_block(struct device *dev, int count, void *buf) { @@ -96,9 +170,22 @@ static int ad7606_par_probe(struct platform_device *pde= v) void __iomem *addr; resource_size_t remap_size; int irq; + struct iio_backend *back; =20 + /* + * If a firmware node is available (ACPI or DT), platform_device_id is nu= ll + * and we must use get_match_data. + */ if (dev_fwnode(&pdev->dev)) { chip_info =3D device_get_match_data(&pdev->dev); + if (device_property_present(&pdev->dev, "io-backends")) + /* + * If a backend is available ,call the core probe with backend + * bops, otherwise use the former bops. + */ + return ad7606_probe(&pdev->dev, 0, NULL, + chip_info, + &ad7606_bi_bops); } else { id =3D platform_get_device_id(pdev); chip_info =3D (const struct ad7606_chip_info *)id->driver_data; @@ -124,6 +211,7 @@ static const struct platform_device_id ad7606_driver_id= s[] =3D { { .name =3D "ad7606-4", .driver_data =3D (kernel_ulong_t)&ad7606_4_info, = }, { .name =3D "ad7606-6", .driver_data =3D (kernel_ulong_t)&ad7606_6_info, = }, { .name =3D "ad7606-8", .driver_data =3D (kernel_ulong_t)&ad7606_8_info, = }, + { .name =3D "ad7606b", .driver_data =3D (kernel_ulong_t)&ad7606b_info, }, { } }; MODULE_DEVICE_TABLE(platform, ad7606_driver_ids); @@ -133,6 +221,7 @@ static const struct of_device_id ad7606_of_match[] =3D { { .compatible =3D "adi,ad7606-4", .data =3D &ad7606_4_info }, { .compatible =3D "adi,ad7606-6", .data =3D &ad7606_6_info }, { .compatible =3D "adi,ad7606-8", .data =3D &ad7606_8_info }, + { .compatible =3D "adi,ad7606b", .data =3D &ad7606b_info }, { } }; MODULE_DEVICE_TABLE(of, ad7606_of_match); @@ -152,3 +241,4 @@ MODULE_AUTHOR("Michael Hennerich "); MODULE_DESCRIPTION("Analog Devices AD7606 ADC"); MODULE_LICENSE("GPL v2"); MODULE_IMPORT_NS(IIO_AD7606); +MODULE_IMPORT_NS(IIO_BACKEND); --=20 2.34.1 From nobody Tue Nov 26 22:22:22 2024 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.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 55BCF1AF0D3 for ; Tue, 15 Oct 2024 13:56:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000606; cv=none; b=bkRXyBIDrfJWR7zZ8hJ3mlfzI9atJ5TMQIo9tmJNOHyUw6gklpUZCY1PqCXqtq+zM8aMpDL0Wp5iEk6Pl7ffHvh/5pWx5Lr2LDgs9Gvmi4XVmHHd1/24Bx9PiX6E+LENQZqJWFkH+lrdW5dTm835a6Ni1iQY9ftXur+Nh3mWPJ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729000606; c=relaxed/simple; bh=8sj2ik6YIhgGPpUYAJWB3DqY/rpxFFg132670LOYgCg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=el1W1C0K2eW6zmni8Qsd2RuGnhdc0QS3Oh6SIPLUlim0zZlFMB0Rh+WYeR7hyvF5BqW+S/LA0K/ahFA/F2bpOygWaDWrF1aZBilnPo6DZ1Kg6g32iU3dNEmcCscPXNMg/JKAuCOIgMMMCHWv+O3NKL2RRsZ6DDVpy+iL6P4GBJM= 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=k86ZN16M; arc=none smtp.client-ip=209.85.128.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="k86ZN16M" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-430576ff251so47361255e9.0 for ; Tue, 15 Oct 2024 06:56:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1729000599; x=1729605399; 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=wfimGBiPs/xd5kQ6SFTwCIGnDDLl5cZX78W/oQcH5gw=; b=k86ZN16MyOFbYo+4JwKQ1xYBdHCj8NQ7vdKdaNWoDZEWrBO8ejFRucdjROOoFkC/gl pmk11MKPXInSGbNBzM/cf0FMne9YQ0uFHNv7kLEY9TQQ7rajZwRjfJZnN+GdykPHkyD0 3ID4vhIk9+Uafm4PRoohApwNV9HkEcm8OXvKXVP1a4xDRzXj/8nDzr33ZMZUa0r4SFd9 dSmB937849lTZ5BGX/XvveaKx6MUMZv1xbgP+R0y6X+4kR8r/ufrEylPIAyCRlU0znwO QIh1ZD5Y/es7U7z0fi110oiW1GVTjjz/yWL6zAKchw51P3mxfaVOkJX27AIjqnTq7S9r ZYeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729000599; x=1729605399; 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=wfimGBiPs/xd5kQ6SFTwCIGnDDLl5cZX78W/oQcH5gw=; b=rqH8DoBZly2OiacGD6WQRonH908nwFg8DcYOMuLmFsWTQDoBksAcMMnbX2CCCGfDnj sNnXBgUyVpZRYF69AtVYC2DBvSfA0utORZLWEc6YhCzl5BMu5ILga/q2KJRUzeQ54ZJz roqs0kI+ud5rXmkY2r6PvixR0g9+2eBBoHbhxMe1o71ndW1ZPyRht/1zmbPjDkXJcN4i LiOsjC3Bd6JBlO5jwWPVqGSwKmVQobLsQsHDwf7g0RRS0jJy5JCU78y9ZrjN/uWRvBOz vvzJLPtg05vQVkLCZWfMmpSSY9mlp/5w024Og8j7XxTmGIICgt9e4aY/T/+tvWkrUqMT bTdw== X-Forwarded-Encrypted: i=1; AJvYcCVHILJTQ/XkaxQOK5kyfYeXNddJAeNqL1qlzA61ltO117xsiPRZ40ryJvyv4Zlp2hYRsvO6A2i9cYy3I+k=@vger.kernel.org X-Gm-Message-State: AOJu0YzcZIrkbjSBric3MfUFgEKQF7y36uqUPxeR2sLxflFgHo7/1jf8 MNi3dyOsl+qMf0nXNF+eO4LjImg6HL6hrk3u2Ayexh0x4Zd2XIPVUqncDouzmCw= X-Google-Smtp-Source: AGHT+IEKh3xWTi5hf4sbT5P8PdIbNsnQOa5kUn7o9v8bR0uMH7vd17OSHnnAv62Xz75tzpQ58/ip5g== X-Received: by 2002:a05:600c:1e18:b0:431:166b:fc1e with SMTP id 5b1f17b1804b1-4311df42cdamr131676955e9.25.1729000599280; Tue, 15 Oct 2024 06:56:39 -0700 (PDT) Received: from [127.0.1.1] (frhb82016ds.ikexpress.com. [185.246.87.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4313f56f241sm18848295e9.22.2024.10.15.06.56.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2024 06:56:38 -0700 (PDT) From: Guillaume Stols Date: Tue, 15 Oct 2024 13:56:21 +0000 Subject: [PATCH v5 8/8] iio: adc: ad7606: Disable PWM usage for non backend version 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: <20241015-ad7606_add_iio_backend_support-v5-8-654faf1ae08c@baylibre.com> References: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> In-Reply-To: <20241015-ad7606_add_iio_backend_support-v5-0-654faf1ae08c@baylibre.com> To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Greg Kroah-Hartman , "Rafael J. Wysocki" , Jonathan Corbet Cc: linux-pwm@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Hennerich , linux-fbdev@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, aardelean@baylibre.com, dlechner@baylibre.com, jstephan@baylibre.com, nuno.sa@analog.com, Jonathan Cameron , Guillaume Stols X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1729000592; l=2658; i=gstols@baylibre.com; s=20240417; h=from:subject:message-id; bh=8sj2ik6YIhgGPpUYAJWB3DqY/rpxFFg132670LOYgCg=; b=1u2rG+kjJiMqYohGDsnjVlDj3sIi34d9AcBG26SyutZ8VN80TTEQ0g/9rRT0jd/zVf+8HUkLX 24VBapyaxS3BkB8VGn298idC036IGXhLHEHFHfCi9s6y6b7XT1p5QNF X-Developer-Key: i=gstols@baylibre.com; a=ed25519; pk=XvMm5WHuV67sGYOJZqIYzXndbaJOlNd8Q6li6vnb4Cs= Since the pwm was introduced before backend, there was a mock use, with a GPIO emulation. Now that iio backend is introduced, the mock use can be removed. Signed-off-by: Guillaume Stols --- drivers/iio/adc/ad7606.c | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/drivers/iio/adc/ad7606.c b/drivers/iio/adc/ad7606.c index 7871552ce5ac..0e830a17fc19 100644 --- a/drivers/iio/adc/ad7606.c +++ b/drivers/iio/adc/ad7606.c @@ -470,8 +470,6 @@ static int ad7606_pwm_set_high(struct ad7606_state *st) cnvst_pwm_state.duty_cycle =3D cnvst_pwm_state.period; =20 ret =3D pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); - /* sleep 2 =C2=B5S to let finish the current pulse */ - fsleep(2); =20 return ret; } @@ -486,8 +484,6 @@ static int ad7606_pwm_set_low(struct ad7606_state *st) cnvst_pwm_state.duty_cycle =3D 0; =20 ret =3D pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); - /* sleep 2 =C2=B5S to let finish the current pulse */ - fsleep(2); =20 return ret; } @@ -563,13 +559,7 @@ static irqreturn_t ad7606_trigger_handler(int irq, voi= d *p) error_ret: iio_trigger_notify_done(indio_dev->trig); /* The rising edge of the CONVST signal starts a new conversion. */ - if (st->gpio_convst) { - gpiod_set_value(st->gpio_convst, 1); - } else { - ret =3D ad7606_pwm_set_high(st) - if (ret < 0) - dev_err(st->dev, "Could not set PWM to high."); - } + gpiod_set_value(st->gpio_convst, 1); =20 return IRQ_HANDLED; } @@ -900,10 +890,7 @@ static int ad7606_buffer_postenable(struct iio_dev *in= dio_dev) { struct ad7606_state *st =3D iio_priv(indio_dev); =20 - if (st->gpio_convst) - gpiod_set_value(st->gpio_convst, 1); - else - return ad7606_pwm_set_high(st); + gpiod_set_value(st->gpio_convst, 1); =20 return 0; } @@ -912,10 +899,7 @@ static int ad7606_buffer_predisable(struct iio_dev *in= dio_dev) { struct ad7606_state *st =3D iio_priv(indio_dev); =20 - if (st->gpio_convst) - gpiod_set_value(st->gpio_convst, 0); - else - return ad7606_pwm_set_low(st); + gpiod_set_value(st->gpio_convst, 0); =20 return 0; } @@ -1210,6 +1194,12 @@ int ad7606_probe(struct device *dev, int irq, void _= _iomem *base_address, =20 indio_dev->setup_ops =3D &ad7606_backend_buffer_ops; } else { + + /* Reserve the PWM use only for backend (force gpio_convst definition) */ + if (!st->gpio_convst) + return dev_err_probe(dev, -EINVAL, + "No backend, connect convst to a GPIO"); + init_completion(&st->completion); st->trig =3D devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name, --=20 2.34.1